mattermost__docs METASEP

source/images/desktop/msi_gpo/msi_gpo_installation_test_00018.png METASEP

source/images/desktop/msi_gpo/msi_gpo_installation_test_00017.png METASEP

source/images/desktop/msi_gpo/msi_gpo_installation_test_00016.png METASEP

source/images/desktop/msi_gpo/msi_gpo_installation_test_00015.png METASEP

source/images/desktop/msi_gpo/msi_gpo_installation_test_00014.png METASEP

source/images/desktop/msi_gpo/msi_gpo_installation_test_00013.png METASEP

source/images/desktop/msi_gpo/msi_gpo_installation_test_00012.png METASEP

source/images/desktop/msi_gpo/msi_gpo_installation_test_00011.png METASEP

source/images/desktop/msi_gpo/msi_gpo_installation_test_00010.png METASEP

source/images/desktop/msi_gpo/msi_gpo_installation_test_00009.png METASEP

source/images/desktop/msi_gpo/msi_gpo_installation_test_00008.png METASEP

source/images/desktop/msi_gpo/msi_gpo_installation_test_00007.png METASEP

source/images/desktop/msi_gpo/msi_gpo_installation_test_00006.png METASEP

source/images/desktop/msi_gpo/msi_gpo_installation_test_00005.png METASEP

source/images/desktop/msi_gpo/msi_gpo_installation_test_00004.png METASEP

source/images/desktop/msi_gpo/msi_gpo_installation_test_00003.png METASEP

source/images/desktop/msi_gpo/msi_gpo_installation_test_00002.png METASEP

source/images/desktop/msi_gpo/msi_gpo_installation_test_00001.png METASEP

source/_static/images/notification-bar/leaf-icon.svg METASEP
<svg width="39" height="39" viewBox="0 0 39 39" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0)">
<path d="M32.8772 20.2673C32.3341 20.026 32.3118 19.5367 32.3761 19.1968L33.6925 14.6005L29.3043 15.4987C29.1521 15.5173 28.734 15.4835 28.5228 14.6175L28.1429 13.0477L25.0922 16.5446C25.0922 16.5446 23.1121 18.6867 23.7449 15.4079L25.0974 8.41378L22.6517 9.62609C22.5122 9.68025 22.0329 9.74749 21.401 8.53201L19.1929 4.27711L16.9438 8.51575C16.2999 9.72801 15.815 9.66441 15.68 9.60336L13.249 8.37656L14.5318 15.3871C15.1321 18.669 13.174 16.5146 13.174 16.5146L10.1561 12.9956L9.75946 14.5632C9.54115 15.4267 9.12442 15.4569 8.96941 15.4357L4.59258 14.5063L5.87307 19.1118C5.92399 19.4474 5.90227 19.9353 5.35452 20.1704L3.98158 20.7703C3.98158 20.7703 8.98731 24.828 10.6288 26.2133C10.9486 26.479 11.7217 27.2635 11.4493 28.1014L10.8534 29.9308L17.7363 28.9026C18.0919 28.8739 20.0659 28.8808 20.4186 28.9118L27.2956 29.9927L26.7182 28.1571C26.4516 27.3211 27.2358 26.5396 27.5575 26.2748C29.2126 24.9039 34.2563 20.8777 34.2563 20.8777L32.8772 20.2673Z" fill="#B53A25"/>
<path d="M31.5958 21.2319C30.7054 21.2981 29.8136 21.3429 28.9233 21.3778C27.4484 21.4316 25.9792 21.4627 24.5058 21.4781C25.1476 21.004 25.788 20.5341 26.4327 20.0657L30.1099 17.3974L31.9385 16.0463C32.5538 15.6027 33.1395 15.1196 33.6919 14.5998C33.114 15.0878 32.504 15.5363 31.8661 15.9425L29.9749 17.1828L26.3279 19.531C26.5719 18.5481 26.8173 17.5665 27.0812 16.5836L27.5733 14.7983C27.7347 14.2022 27.9294 13.6157 28.1565 13.0414C27.8851 13.6049 27.6462 14.1834 27.4411 14.7742L26.8267 16.5255C26.4403 17.6593 26.0696 18.7974 25.7046 19.9383C24.5804 20.6674 23.462 21.3965 22.3463 22.1597C21.7188 22.5883 21.0941 23.0226 20.4793 23.4811C20.1762 23.7046 19.8773 23.9352 19.5813 24.1801L19.4277 17.1943C20.1355 15.6381 20.9671 14.1412 21.9146 12.7179C22.8917 11.2294 23.9542 9.79873 25.0968 8.43302C23.8887 9.74729 22.7574 11.1301 21.7085 12.5745C20.8678 13.7265 20.1006 14.9304 19.4115 16.1788L19.1885 5.43414L18.8583 16.1551C18.1807 14.9027 17.4255 13.694 16.5971 12.536C15.5634 11.0838 14.4457 9.69328 13.2497 8.37162C14.3789 9.74505 15.4272 11.1831 16.3893 12.6784C17.3211 14.1099 18.1356 15.6146 18.8247 17.1777L18.6085 24.1695C18.3143 23.9237 18.0173 23.6921 17.7174 23.4634C17.1062 23.0031 16.485 22.5641 15.8624 22.1295C14.7594 21.3652 13.6436 20.6251 12.5263 19.8894C12.1727 18.7443 11.81 17.6035 11.4383 16.467L10.841 14.711C10.645 14.125 10.4171 13.5502 10.1583 12.9893C10.378 13.5657 10.566 14.1538 10.7215 14.7509L11.2021 16.544C11.4531 17.5237 11.6884 18.5076 11.9236 19.4916L8.29892 17.1195L6.41409 15.8609C5.77987 15.4502 5.17397 14.9975 4.60045 14.5056C5.14846 15.0284 5.73004 15.5149 6.34147 15.962L8.14942 17.3258L11.7995 20.0194C12.4377 20.4924 13.0773 20.9669 13.7112 21.4443C12.2392 21.4185 10.7672 21.3813 9.2953 21.3128C8.40218 21.2737 7.51191 21.2232 6.61882 21.1472C5.72689 21.0963 4.84079 20.9719 3.96953 20.7753C4.83065 21.0131 5.71007 21.1794 6.59881 21.2723C7.4876 21.3868 8.37926 21.4814 9.26665 21.5631C10.9609 21.7182 12.6589 21.8457 14.3607 21.9458C14.7075 22.21 15.0586 22.4729 15.4011 22.7414C15.964 23.179 16.5226 23.6237 17.064 24.0798C16.0905 25.0221 15.1638 25.9942 14.2059 26.9379C13.6735 27.4703 13.1341 27.9955 12.5818 28.5051C12.0369 29.0246 11.4536 29.5024 10.837 29.9345C11.4777 29.5353 12.0884 29.0898 12.6643 28.6018C13.2463 28.122 13.8156 27.6238 14.3793 27.1227C15.4011 26.2173 16.4003 25.2807 17.4265 24.3966C17.6141 24.5586 17.8059 24.722 17.9836 24.8882C18.1878 25.0775 18.3791 25.2802 18.5562 25.4951L18.2757 34.5406L19.789 34.5451L19.6001 25.4971C19.7779 25.2831 19.9706 25.0819 20.1766 24.895C20.3574 24.7284 20.5495 24.5676 20.7402 24.4053C21.7564 25.2962 22.7469 26.2411 23.7659 27.1463C24.3244 27.6507 24.8872 28.1537 25.4656 28.6354C26.0374 29.1318 26.6456 29.5849 27.285 29.9907C26.674 29.5528 26.0964 29.0703 25.5567 28.5471C25.011 28.0327 24.4767 27.5041 23.9481 26.9698C22.9988 26.0205 22.0851 25.0385 21.1202 24.0907C21.6667 23.6379 22.2246 23.2023 22.7953 22.7624C23.1425 22.4975 23.494 22.237 23.8455 21.9736C25.5484 21.8831 27.2476 21.7669 28.943 21.6252C29.8334 21.5477 30.7238 21.4616 31.6127 21.3542C32.5054 21.2633 33.3893 21.0999 34.2556 20.8657C33.3807 21.0621 32.491 21.1846 31.5958 21.2319Z" fill="#F74700"/>
</g>
<defs>
<clipPath id="clip0">
<rect width="27" height="27" fill="white" transform="translate(38.1838 19.0918) rotate(135)"/>
</clipPath>
</defs>
</svg>

source/_static/images/notification-bar/globe.svg METASEP
<?xml version="1.0" encoding="UTF-8"?>
<svg width="26" height="25" viewBox="0 0 26 25" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M25.0012 12.4997C25.0012 19.4038 19.4054 24.9997 12.5012 24.9997C5.59707 24.9997 0.0012207 19.4038 0.0012207 12.4997C0.0012207 6.50112 4.2287 1.48822 9.86461 0.277824L10.2184 0.284499L10.472 0.16435C10.6767 0.130975 10.8814 0.10205 11.0884 0.0798001L11.5267 0.09315L11.8315 0.0175003C11.8916 0.0152753 11.9494 0.0108254 12.0095 0.00860037L12.5012 0.0775751L12.8261 0.00415039C12.8884 0.00637538 12.9507 0.00860037 13.013 0.0108254L13.6983 0.184375L14.5082 0.162125C14.6038 0.1777 14.6995 0.193275 14.7952 0.211075L17.7611 2.10009L20.9962 3.33051C23.4593 5.61113 25.0012 8.87519 25.0012 12.4997Z" fill="#1C58D9"/>
<path d="M13.1086 3.94525C13.923 4.20558 13.8896 3.6916 14.4036 4.29013C14.6995 4.63278 15.2335 5.26245 15.8676 5.4182C15.9566 5.44045 16.1547 5.25132 16.1547 5.0978C16.1547 4.9465 15.7163 4.6261 15.4649 4.55935C15.2113 4.49038 15.565 4.0209 15.2291 3.8785C14.8931 3.73388 14.5215 3.19766 14.388 2.77713C14.2523 2.35661 13.6627 2.71038 13.4624 2.62583C13.2599 2.54128 13.0085 2.59246 12.7905 2.91286C12.5702 3.23103 12.8995 3.8785 13.1086 3.94525Z" fill="#C9D81F"/>
<path d="M17.5187 15.7198C17.5098 15.5441 15.9078 14.6674 15.712 14.6563C15.3916 14.6385 14.9556 14.4761 14.6619 14.6474C14.535 14.7186 14.4327 14.8165 14.3526 14.9366C14.297 15.0412 13.9855 14.8454 13.8631 14.9099C13.5738 15.0635 13.4092 14.5628 13.4915 14.3715C13.6918 13.902 12.9798 14.2002 12.9063 14.0711C12.9931 14.2224 12.8819 12.7339 12.6327 13.5749C12.4435 14.2113 11.7026 13.4815 11.7916 13.0187C11.9296 12.3045 13.0065 12.1999 13.2423 12.3267C13.3625 12.389 13.7986 13.0254 13.8542 13.0076C13.9743 12.9697 13.783 12.26 13.7585 12.1643C13.6717 11.8194 14.337 11.7015 14.3837 11.341C14.4238 11.034 14.6307 11.1408 14.8376 10.9762C15.138 10.7381 14.9044 10.2953 15.2893 10.0661C15.4206 9.98826 15.9101 9.93263 15.9746 9.79468C16.0347 9.67008 15.5607 9.32521 15.9679 9.22731C16.3328 9.13831 16.7066 9.29628 16.8045 8.76896C16.8935 8.29059 16.3662 8.18156 16.206 7.80999C16.157 7.69874 16.097 7.05794 15.87 7.17587C15.5897 7.32272 15.4161 7.67649 15.1892 7.25597C14.7776 6.49724 13.7585 6.17017 14.2369 7.36276C14.4839 7.97909 13.5627 9.85253 13.4292 8.11926C13.3825 7.51851 11.5825 7.33606 12.1877 6.67079C12.8018 5.9944 13.6406 5.96992 13.8675 4.93307C14.1835 3.49351 13.1867 4.71725 12.6772 4.43913C11.9162 4.02305 12.5615 4.24778 12.1676 4.78845C12.0186 4.99315 11.5291 4.6594 11.311 4.69055C11.1085 4.7217 10.5901 5.1667 10.4522 4.88857C10.1963 4.37905 8.41185 4.06533 7.9268 4.24555C6.92111 4.6238 6.56956 4.11205 5.56386 3.91403C5.21454 3.84505 3.5013 3.7961 3.61255 4.39018C3.65705 4.6238 3.8217 4.80625 3.89289 5.02652C3.99969 5.3536 3.50797 5.10217 3.39672 5.18227C3.3678 5.20452 3.97522 5.63172 4.02417 5.6829C4.18882 5.84977 3.39227 6.05447 3.3144 6.33482C3.1542 6.90664 4.40464 6.74199 4.17547 7.42729C4.10649 7.63644 3.39005 7.97686 3.32107 8.67551C3.30772 8.80901 4.21107 7.80776 4.79402 8.01914C5.31021 8.20604 5.26349 6.80652 5.90429 6.80652C7.09688 6.80652 7.32606 7.96796 7.95573 8.74671C8.24943 9.10938 8.48528 9.26068 8.53645 9.73461C8.5854 10.1774 8.48973 10.7136 8.64993 11.1341C8.80345 11.5368 9.11495 11.5635 9.31965 11.8884C9.5644 12.2711 9.70235 12.6427 10.0339 12.972C10.5145 13.4548 11.3355 14.1935 12.0898 14.08C12.2388 14.0578 12.8018 14.3782 12.9286 14.4738C13.1266 14.6229 13.2267 14.8476 13.3691 15.039C13.5026 15.217 13.9232 15.1057 14.1101 15.1903C14.2747 15.2659 13.6806 16.5164 13.9031 16.8457C14.1457 17.2084 14.1457 17.6133 14.5106 17.8981C14.8554 18.1673 14.9578 18.1896 15.0023 18.6568C15.0712 19.4178 14.8488 20.1876 14.6663 20.8974C14.5706 21.2623 14.762 21.665 14.6218 22.0121C14.4438 22.4482 14.3237 22.8198 14.4794 23.3026C14.7486 24.1414 16.2594 24.2794 15.3627 23.5473C14.9823 23.2359 15.7743 22.4838 15.5274 22.4104C15.1024 22.2324 15.6052 22.0722 15.6609 21.8875C15.7721 21.5204 17.4587 20.0007 17.5833 19.7493C17.6878 19.5379 17.6211 19.3199 17.7924 19.1374C17.9815 18.9349 18.2441 19.0061 18.4577 18.8637C18.9027 18.5656 18.7425 18.0605 18.9249 17.6489C19.2898 16.8323 19.4434 17.155 18.945 16.5186C18.7625 16.2939 17.5521 16.3784 17.5187 15.7198Z" fill="#C9D81F"/>
<path d="M8.50742 3.36448C8.81447 3.68488 9.11707 3.19538 9.16824 3.36448C9.21942 3.53358 9.22609 3.85175 9.59321 3.87623C9.96034 3.90293 9.25279 4.13655 9.48864 4.2389C9.72449 4.33903 10.2296 4.65943 10.4142 4.52593C10.5989 4.3902 10.8192 4.29008 10.9015 4.3902C10.9861 4.49255 11.4911 4.37463 11.3465 4.20553C11.2041 4.03643 10.817 3.63816 10.8325 3.40898C10.8503 3.17981 11.2887 2.59018 10.7992 2.64136C10.481 2.67473 10.412 2.96176 10.412 3.13086C10.412 3.29996 9.95811 2.87943 9.87356 2.88611C9.78901 2.89501 9.46861 2.37436 9.35291 2.37436C9.23499 2.37436 8.44289 2.12071 8.51187 2.37436C8.58084 2.62578 8.20037 3.04631 8.50742 3.36448Z" fill="#C9D81F"/>
<path d="M15.565 5.77189C15.3269 5.63616 14.8752 5.01539 14.6728 5.21564C14.4703 5.41811 14.7239 5.87201 14.8908 6.07449C15.0599 6.27696 15.7675 6.71528 15.6651 6.51281C15.565 6.31256 16.0367 6.04111 15.565 5.77189Z" fill="#C9D81F"/>
<path d="M8.97256 1.49095C9.09716 1.47983 9.28628 1.9048 9.46651 1.95152C9.64673 1.99602 9.73573 2.20962 9.80248 2.2608C9.87146 2.31197 10.6213 2.0205 10.8015 1.95152C11.0107 1.87365 10.5768 1.4687 10.4322 1.17723C10.2853 0.885752 10.3988 1.66005 10.1852 1.53322C9.97158 1.4064 10.005 1.23285 9.74686 1.23285C9.48876 1.23285 9.66898 0.705528 9.34191 0.816778C9.01483 0.930252 8.85019 1.50208 8.97256 1.49095Z" fill="#C9D81F"/>
<path d="M11.6757 2.50119C11.4554 2.54569 11.4954 2.69254 11.3731 2.81491C11.2507 2.93951 11.2618 3.10639 11.3731 3.25324C11.4865 3.40009 11.6645 3.65596 11.8003 3.40899C11.936 3.16201 11.8003 2.96176 11.8003 2.80379C11.8003 2.64804 11.7847 2.47894 11.6757 2.50119Z" fill="#C9D81F"/>
<path d="M12.125 3.28667C12.1806 3.4224 12.283 3.05082 12.501 2.85947C12.7191 2.66813 12.3942 2.18753 12.1918 2.43228C12.056 2.60138 12.0694 3.15095 12.125 3.28667Z" fill="#C9D81F"/>
<path d="M12.0852 3.45572C11.9672 3.62037 11.876 4.06092 12.0852 4.09429C12.2943 4.12989 12.4211 3.89182 12.3299 3.72272C12.2365 3.55585 12.1341 3.38675 12.0852 3.45572Z" fill="#C9D81F"/>
<path d="M12.9328 0.616522C12.7303 0.707747 13.2242 0.874622 12.8883 0.965846C12.5501 1.05485 12.5389 1.33742 12.2475 1.09935C11.956 0.863497 11.6378 1.17722 11.8581 1.32407C12.0784 1.47092 12.4499 1.81802 12.4388 2.00937C12.4277 2.20072 12.7859 2.28972 13.1241 2.26747C13.4601 2.24522 13.865 2.34534 13.8762 2.20072C13.8873 2.05387 13.9273 1.99379 13.8873 1.88699C13.8294 1.72902 13.6848 1.57327 13.3377 1.70677C12.9884 1.84249 12.7637 1.77352 12.7147 1.60664C12.6635 1.43532 13.3956 1.10825 13.7182 1.33519C14.043 1.55992 14.3479 1.2106 14.112 1.05485C13.8762 0.896871 14.0341 0.729997 14.1966 0.707747C14.3145 0.692172 14.4213 0.394023 14.5081 0.162624C14.0186 0.0847495 13.5202 0.0335747 13.0129 0.0135498C13.0151 0.327274 13.133 0.527523 12.9328 0.616522Z" fill="#C9D81F"/>
<path d="M9.94927 0.336241C10.174 0.431916 10.5411 0.334016 10.4721 0.164917C10.2697 0.198292 10.0672 0.236117 9.86694 0.278392C9.88474 0.300641 9.91144 0.320666 9.94927 0.336241Z" fill="#C9D81F"/>
<path d="M10.0873 0.514248C9.77135 0.351824 9.78915 0.750097 9.93377 0.908071C10.0806 1.06382 10.4967 0.725622 10.0873 0.514248Z" fill="#C9D81F"/>
<path d="M12.0095 0.00917462C12.2454 0.0536744 12.4011 0.236124 12.4389 0.371848C12.4812 0.514248 12.8216 0.204974 12.8261 0.00249965C12.7193 0.00249965 12.6103 0.000274658 12.5012 0.000274658C12.3366 0.000274658 12.1742 0.00249965 12.0095 0.00917462Z" fill="#C9D81F"/>
<path d="M11.3488 0.476476C11.2064 0.672275 11.3288 0.910349 11.4979 0.712325C11.667 0.5143 11.5312 0.0203524 11.667 0.233952C11.8005 0.447551 12.0497 0.785749 12.2165 0.801324C12.3834 0.816899 12.2388 0.6033 12.2165 0.425301C12.1987 0.276226 11.796 0.0782022 11.8316 0.0181274C11.5824 0.0314774 11.3354 0.0515023 11.0907 0.0782022C11.2665 0.193902 11.4511 0.336301 11.3488 0.476476Z" fill="#C9D81F"/>
<path d="M12.0853 2.16295C12.2833 2.24082 12.0853 1.76022 12.0853 1.76022C11.8783 1.88482 11.8895 2.08507 12.0853 2.16295Z" fill="#C9D81F"/>
<path d="M11.3733 1.8493C11.4067 1.98502 11.6203 2.02952 11.7337 1.8493C11.845 1.66907 11.7271 1.01492 11.5735 1.21962C11.4133 1.43322 11.2287 1.3331 10.9038 1.21962C10.5767 1.10837 11.3399 1.7158 11.3733 1.8493Z" fill="#C9D81F"/>
<path d="M13.5714 13.3213C13.8495 13.2879 14.0097 13.6239 14.3279 13.6083C14.6483 13.5928 15.1111 14.0645 15.3803 13.7863C15.5984 13.5594 14.4213 13.3747 14.0342 13.1722C13.647 12.9698 13.2933 13.3547 13.5714 13.3213Z" fill="#C9D81F"/>
<path d="M14.942 0.672271C15.3291 0.856945 15.2624 0.852495 15.0265 1.03049C14.7907 1.21072 14.8752 1.60454 15.3981 1.57562C15.9188 1.54892 16.2392 1.03049 16.475 1.76029C16.7108 2.49009 16.5417 3.28886 16.8466 3.51136C17.1492 3.73608 16.8977 3.88738 16.8466 4.09876C16.7954 4.30791 16.9311 4.45921 17.167 4.39246C17.4028 4.32571 17.3361 4.76403 17.167 4.9487C16.9979 5.13338 16.7976 5.48715 17.3183 6.12572C17.8389 6.7643 17.9057 6.68197 18.0748 6.90002C18.2439 7.11807 18.3774 6.81992 18.4285 6.56405C18.4797 6.3104 18.3106 5.4204 18.9002 5.4204C19.4899 5.41818 19.6567 4.94648 19.7257 4.79518C19.7925 4.64388 20.2642 4.66168 20.5156 4.44141C20.7403 4.24783 20.9895 4.08318 20.9962 3.32891C19.2985 1.75584 17.1625 0.647796 14.7951 0.209473C14.7484 0.385247 14.7506 0.581046 14.942 0.672271Z" fill="#C9D81F"/>
</svg>

source/_static/images/nav/support.svg METASEP
<svg width="46" height="47" viewBox="0 0 46 47" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12.8113 35.2862C10.3077 34.4671 7.74976 35.5265 7.10755 37.6342C6.45445 39.7529 7.96746 42.1228 10.471 42.9419C12.9745 43.761 15.5325 42.7017 16.1747 40.5939C16.8169 38.4861 15.3148 36.1053 12.8113 35.2862Z" fill="#1E325C"/>
<path d="M3.58105 42.1775C2.73202 42.8437 2.63406 44.1979 3.37424 45.2027C4.11441 46.1965 5.39884 46.4695 6.24787 45.7924C7.09689 45.1262 7.19485 43.772 6.45467 42.7673C5.72538 41.7735 4.43007 41.5113 3.58105 42.1775Z" fill="#1E325C"/>
<path d="M45.9999 15.8903C45.9999 13.8262 45.0312 11.9914 43.5399 10.8447C43.5508 10.7027 43.5617 10.5498 43.5617 10.3969C43.5617 7.14244 41.0037 4.51044 37.858 4.51044C37.662 4.51044 37.4661 4.52136 37.2702 4.5432C36.0728 2.44634 33.8632 1.03751 31.327 1.03751C29.8357 1.03751 28.4533 1.52896 27.3213 2.35897C25.8845 0.906456 23.9252 0 21.7591 0C18.2323 0 15.239 2.39173 14.2267 5.68992C13.0402 4.84899 11.6034 4.34662 10.0577 4.34662C6.00851 4.34662 2.72125 7.73218 2.72125 11.915C2.72125 13.1491 3.00425 14.3176 3.51584 15.3442C1.38239 16.9059 0 19.4615 0 22.3556C0 27.0954 3.72266 30.9506 8.327 30.9506C10.0142 30.9506 11.5925 30.4263 12.9096 29.5308C13.6171 33.1675 16.7302 35.9088 20.4638 35.9088C23.2394 35.9088 25.6777 34.3907 27.0383 32.1191C27.9744 33.0802 29.2588 33.6699 30.6848 33.6699C33.3842 33.6699 35.6048 31.5294 35.8334 28.7991C36.4647 29.0393 37.1504 29.1595 37.858 29.1595C41.1561 29.1595 43.8338 26.3964 43.8338 22.989C43.8338 22.2792 43.7141 21.5911 43.4964 20.9577C45.0094 19.8328 45.9999 17.9762 45.9999 15.8903Z" fill="#1E325C"/>
</svg>

source/_static/images/nav/playbooks.svg METASEP
<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0)">
<path d="M17.7 31.45L29.67 24.54C30.39 24.13 30.39 23.09 29.67 22.68L17.7 15.76" stroke="#1B1D22" stroke-width="3.7983" stroke-miterlimit="10" stroke-linejoin="round"/>
<path d="M32.6801 1.82C29.7101 0.58 26.6401 0 23.6201 0C14.3701 0 5.59007 5.47 1.82007 14.54C-3.18993 26.57 2.50007 40.39 14.5401 45.4C17.5001 46.63 20.5801 47.22 23.6001 47.22C32.8501 47.22 41.6201 41.75 45.4001 32.68C50.4101 20.64 44.7101 6.83 32.6801 1.82ZM40.2501 30.54C37.4401 37.29 30.9001 41.65 23.5901 41.65C21.2201 41.65 18.8901 41.18 16.6701 40.26C12.2201 38.41 8.76007 34.94 6.93007 30.48C5.09007 26.03 5.10007 21.13 6.95007 16.68C9.77007 9.93 16.3101 5.57 23.6201 5.57C25.9901 5.57 28.3201 6.04 30.5401 6.96C34.9901 8.81 38.4501 12.28 40.2801 16.74C42.1101 21.19 42.1101 26.09 40.2501 30.54Z" fill="#1B1D22"/>
</g>
<defs>
<clipPath id="clip0">
<rect width="47.22" height="47.22" fill="white"/>
</clipPath>
</defs>
</svg>

source/_static/images/nav/playbooks-icon.svg METASEP
<svg width="53" height="53" viewBox="0 0 53 53" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0)">
<path d="M29.5599 51.5211C28.4319 53.2487 25.8783 53.4974 23.8975 52.0985L1.51442 36.337C0.784571 35.8444 0.273194 35.089 0.087004 34.2284C-0.0991861 33.3678 0.0542004 32.4685 0.515175 31.7183L20.2025 1.63876C21.1751 0.159878 23.3468 -0.430788 25.0877 0.33308L50.4819 11.5157C52.7291 12.5061 53.6706 14.7222 52.5381 16.4498L29.5599 51.5211Z" fill="#FFBC1F"/>
<path d="M25.998 49.4826L2.92651 33.7123L23.2223 2.7135L48.9318 14.4513L25.998 49.4826Z" fill="white"/>
<path d="M40.605 12.2352C40.4084 12.4846 40.1314 12.6581 39.8213 12.7261C39.5111 12.7941 39.1869 12.7525 38.904 12.6083L29.1958 8.05169C29.0679 8.00682 28.9519 7.93329 28.8568 7.83669C28.7617 7.7401 28.69 7.62301 28.6471 7.49441C28.6043 7.36581 28.5914 7.22909 28.6095 7.09475C28.6277 6.96041 28.6763 6.832 28.7517 6.71936L30.275 4.39223C30.4533 4.15764 30.7063 3.991 30.9922 3.91992C31.2782 3.84884 31.5798 3.87759 31.8471 4.00141L41.6797 8.36257C41.8177 8.40515 41.9442 8.47831 42.0499 8.5766C42.1557 8.67489 42.2379 8.79578 42.2904 8.93026C42.3429 9.06473 42.3644 9.20932 42.3532 9.35325C42.3421 9.49718 42.2986 9.63673 42.226 9.76151L40.605 12.2352Z" fill="#818698"/>
<path d="M38.7487 9.22859L32.4956 6.39073L34.0367 4.03251C34.2204 3.79319 34.4799 3.62332 34.7728 3.55071C35.0657 3.4781 35.3745 3.50705 35.6488 3.63281L39.8101 5.4359C39.9444 5.47746 40.0677 5.54887 40.1705 5.64479C40.2734 5.74071 40.3532 5.85866 40.4041 5.9898C40.4549 6.12094 40.4754 6.26187 40.4641 6.40206C40.4527 6.54225 40.4098 6.67805 40.3386 6.79932L38.7487 9.22859Z" fill="#1E325C"/>
<path d="M39.2059 22.0101L26.2246 15.3529L26.9041 14.3092L39.9298 20.8998L39.2059 22.0101Z" fill="#F4BC49"/>
<path d="M22.1301 14.6689C22.1002 14.6884 22.0662 14.7009 22.0307 14.7053C21.9953 14.7097 21.9593 14.706 21.9255 14.6945C21.8917 14.6829 21.8609 14.6638 21.8356 14.6386C21.8103 14.6134 21.791 14.5828 21.7793 14.549L20.9799 12.1952C20.97 12.1598 20.9679 12.1227 20.9736 12.0864C20.9792 12.0501 20.9926 12.0154 21.0128 11.9847C21.033 11.954 21.0595 11.928 21.0906 11.9084C21.1217 11.8888 21.1566 11.876 21.193 11.871L21.495 11.8089C21.5739 11.7899 21.657 11.7995 21.7294 11.8362C21.8018 11.8728 21.8588 11.9339 21.8903 12.0087L22.3344 13.2389C22.3461 13.2727 22.3654 13.3033 22.3907 13.3285C22.4161 13.3537 22.4468 13.3728 22.4806 13.3843C22.5144 13.3959 22.5504 13.3996 22.5859 13.3952C22.6213 13.3908 22.6553 13.3783 22.6852 13.3588L25.0923 11.9998C25.1657 11.9648 25.2483 11.9541 25.3282 11.9693C25.4081 11.9844 25.481 12.0247 25.5364 12.0842L25.7318 12.3151C25.7571 12.343 25.7755 12.3764 25.7857 12.4125C25.796 12.4487 25.7977 12.4867 25.7909 12.5237C25.784 12.5607 25.7687 12.5955 25.7461 12.6256C25.7235 12.6557 25.6943 12.6801 25.6608 12.6971L22.1301 14.6689Z" fill="#F4BC49"/>
<path d="M34.9603 28.4941L22.2366 21.4416L22.9161 20.4024L35.6886 27.3882L34.9603 28.4941Z" fill="#818698"/>
<path d="M19.7984 21.6903L16.0413 19.5763L18.2085 16.2677L22.0101 18.3106L19.7984 21.6903Z" fill="#818698"/>
<path d="M30.7144 34.9825L18.2483 27.5348L18.9278 26.4911L31.4383 33.8722L30.7144 34.9825Z" fill="#818698"/>
<path d="M15.8415 27.7302L12.1643 25.5008L14.3316 22.1877L18.0576 24.3505L15.8415 27.7302Z" fill="#818698"/>
<path d="M26.4691 41.4665L14.2605 33.6279L14.94 32.5843L27.193 40.3562L26.4691 41.4665Z" fill="#818698"/>
<path d="M11.8888 33.7701L8.28711 31.4207L10.4544 28.1121L14.1005 30.3904L11.8888 33.7701Z" fill="#818698"/>
</g>
<defs>
<clipPath id="clip0">
<rect width="53" height="53" fill="white"/>
</clipPath>
</defs>
</svg>

source/_static/images/nav/my-workspace.svg METASEP
<svg width="54" height="54" viewBox="0 0 54 54" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<mask id="mask0" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="54" height="54">
<circle cx="27" cy="27" r="27" fill="#C4C4C4"/>
</mask>
<g mask="url(#mask0)">
<rect width="54" height="54" fill="url(#pattern0)"/>
</g>
<defs>
<pattern id="pattern0" patternContentUnits="objectBoundingBox" width="1" height="1">
<use xlink:href="#image0" transform="scale(0.00125)"/>
</pattern>
<image id="image0" width="800" height="800" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAMgCAMAAADsrvZaAAAAM1BMVEX///8eMlzx8vWOmK1WZYTHzNYrPmZHWHpyfpnV2ODj5euqssI5S3C4v8yAi6Ocpbdkco7b/tBtAAAkQ0lEQVR42uzaW1LjMBRFUV1LfltO5j/abviFgKESINZaczhleddNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8SV3f95ec815ebPGOMUFT/q/idRJbHDB0CZow95d8LUN8xTAnOLm55qkM8R01wXn1ay5bfN8lwSnN9eY0jpsSnM687iXuoSQ4laXuJe5lFLA4kT5fh/iYgEWTuppL3Jt9cAZd3cd4gDXBs+vzGI+xJ3hqy+UaNwm8NK1OW7wlYMHrp+OxNvvgSc03/joEXpj3Lb7GhSKtqNMQtwm8tKz/eB0CFg07+rJyoUh7lvzZOgReWtWtY/yoYUnwJOoUh7hQpD1Hn1YCFg1aS/yCnODvW/YhjhJ4aUy9xmECFm35x969YDcKw1AAtQz+hU/Y/2pnaJlO06RtKAU9mXdX0FPOC7YkbH/tZQVOKNKZXLKswwlFOo+hlXU4oUin4bteVmOBl87BN1FWq6KAFQKXdgS89dCcUFy6PTFzvoWQ46FU4PWTLCIXePSJ0Io6nQnFIXILRAbioTShGAD+BsKGEQ+dX+8SIXZBhAskHjoTij5CvMYIFko8dAq8PvGsU7IQD6UCVoapNBMggMKu7oRiI/eiIwKLh9KE4iCPOCKAoRL9CcUS5R4DQrMrUjx0Crw+yUOcN6GhFyTZaZjkseDo3ApM6UqzbnQVBoQe8EB7c8UCbxAGhB6A2pvrTSj6yIDQvYC1+dAb7UjCgNBHl0ngdE7DKAwIwa+u1M5QHIQBIfzVlVaBt0QGhG55wNWV2ie2CXDRRz9RaeNc+QzFjLjqo9Xq7QzqnqHYQW6LSE8jmAanoUQGhN4JSSDFzmnwCbOwRjr8KHj6qQne6ciglWdaoeLabmznbOjpUFsz9JSqXx997orTVWB7l/SMel8ffe4APkTykQEhuOJVhAjHLOFOv9DBCkjxKjXFocjA42F0rKsAiLlDum+wQ56fpCNdAFrn/Qg29VegB4zpQIP65FU/4iysFpfIgBBEcRcwHc75BPCJygVpxXlW63bn50jHXxnhG64QwZadJ6Q62B4z6iXOV4iPHAMPj/+hKr6LaqFqVjcCxlfAQUQSSE/olEovWvoR+MFfIkZAnPwVUd+y9etEywT90H1COUeCd/T8jO0jEyPyy2M2wRy0Iq9a2LVoxbSqVwn+kIMG5yQiWUTMUl/NlJqDGb9uOQAd1SVvro6ONMpzzrW2mpUIFJBW3mQus47jWzle31h4xD4hHfbYyoL13qcYru728FuPVxPUaaitvMO2+ldsbz+sxMONWMcFvwSEG5GnGP5ysDXz09eBnRfcQpxNfCo+yzfOGw9XItiNcA3G6cQn4pMcq7cTD+d7tCsTG/moZ0fkA/2fyDPsPV60cHeKNnKDo1k766J85dzxcCPepbsN71t4gtGTGaKJvsd/HeCt1A3QNUL1y7I/u53fgnht+yAPTcb+tyb4SQ7UWmv7+ogYkAB11VbVvitfnbZ0tUhiKSAsZr0xOF0SDTZ8s9gKCAfgZzbLu9Y2H5u/rXT7CbJgufcRi9NXyd7qyrkiW7j9eJnxet07QL+Pq0STxwxeomzhdiQvmJBbZvNhrnb1C/WLgwLChsgHEPvPz9S1Ks6yxVEBYUIWaI//kaq6V1fZ5MCAMCEzo/kw2Pp4FWQrt6Mk71X0s4QiyzFGq8/pEmUrt6NWbrGpPoPZfn6ljq+lt/+HDg4IEwL29O9V9ZqfZLvi9tMKE/KOyXxYLV792vf5we2nFSbkP5P5sNn7eNUJekBGYULemMyHydb5okT4gDTChPxjMR+mp659L7UEhAnBzIfh3fkf9s5GMVEYCMI78qMUpL7/056td1e0iCBGdib7vYGBCTO7m3hmDx2BhEI86oPw3MeAA5QEEgpxpw9qe2XWgkEgR4RCviDUB7e9sgoUAqkQCjlDqA/m6tXVhMl6jpaOCqGQL3yaa83m4GUPIdkrKoRCjE8fe+74YXZi+ZhOCiSm353qgzx+mPU0bnOHUAidPsjjh1lLtB4IhZxxdDzuITX9VQFNLSwQ9Ba8bW+E4oVluxrKAom7Tt6vD62/Wt1DWyChkLs0SE3JHs+/QxqTQDpnnUtmlnvrDBPgJwAmgZRZ2uABjr21Yv6r8HpOdsX2AkHNb4R/cNkcVvW2ST6ypV3hQCDRUp+1kqGPO5uIvkCwt2BG9ozy7uiECZNADvnGxb84up5DXR89LjAJpHBZOqCjxTWhj6lFykIgCpaYpgFCfnjwdpHyEAgUHpq/0z+yNZFBFTwTgUSx915tJvTx1kXq7Bo3vlDiwbmtzYgt8wHpsF846WyeLDDrkRAVfXwiGY4FojD74LY2842KPo5Ih2eBRCkr7YSiij6SLpJrgUjU533WZs6o6CN1FcMS8oF11BJP0NHpnwEyhcISabGUYBW5T2X1SIfM97lHUpwLJOug3iIdMvpokZrKhngTSMZB/SZ7hj7mTpjkJRCRB7mcXYeUkN8uOjWGwySQDqvpMg3qJ9wnPsxTBSwmgZRYS64d9U+kg/3PcR5MmOQmEJWnufn1A/+QOZBWYJTsBJLh6PtNhzD0sWTCJD+B5BdDSiRDpYE+UeUjsqMHABFDfAUQke1m1+E9FHaFT5XnFUMa3BANkCUfWSaB2BGIGOJqb9RogEx5EyqBWBu+wFUHRORb3OI+XAKxIiovjp69yDI2mIBMIHaI3q+b6QmR6ejpKjibQGyP9cicXtjwDIjM+ZpFEyYEA+Uv+j2l5UCBMaLU8ZQnYXnvmprkW7c9DX4RE4oLu0R8ArEqNkAHFV6RgF7hAYQCsTZmJDY/Pyqyeo+LGIwCsQNJXloMzeYo0kGfEWgpBWJ7/5OVm/PLYEUAeWan5RTIro6G+tKHHwHkqYDOKRBrwmQtm1uLALJ9QP/G7uMwqOuarHQGSyaAfNTYAJvCnYPQNVk9UqEyorjbYwvsDk5/n6rJqpAKmQNnB2yCTeOuo65pstIZLJkRrALbYI9wFkM1TVaPVKhsKUdshE3g8jVQnMlqkAoVU9rU2Ah7hLsYolGSec+Qu8oX98k3h+51e8E+IHPs5y32WsVgnTAX8gVssRqVquU76vsqBqvAAqgF8oKtQO90YYkhYbD8BPS5AvFWzxQp7I88fvKn+4M7Y06zhBVWI3O708iWEQbLU0CfLxBntV4N5zDir8NguQroCwTirKap0wz5wH8Enu0Flg3EqVtp8AJkcnqJcSKqOQjos/dif3uCyi1ARyRCZAbriYDOLxDbU375fuBI6ArtomfWR0AgDdbTmQIFxomBgwslNmeeQBy+Fwo5/aaHHgn9hh7bU9hsfJkshX76AYnQuKahhQOWCMRXu5D/FahwRSR0bwF9kUD8fTzpTUSJIZHQ3QX0+fVSl7+evdTbYpwoYXgJ6EvfMm8NAPLrAjsMiYTuL6D/Ye9ckNSGgSCqtsE24nv/06aWqiTYga14jYrXI70bINSa6ZmxtFogsBEb73Oy1x/C/KkW4dVkLfNga6BAt7FGHcRhGPS1AsGdoM61ml4zWokXaNB/JhBSDu4bQrKe0764/GIUhtUCYbUBbPfCpCXulXuPxXESSLrVm01kzWg9QqRB/2JIKwDuEtMQctOMFkAeOAhFWgvLqHp+FdSGTF7TYQpYd9YIBLkWlj2xnQph3z1FGfQ7aTWsbNOxKbZXIdybpzCDfieth1XqNQwhLYB4GPQ7aS20s9QvhLQA4mLQv0iroR2mdiGkBRAXgy59XCAVhpAWQGwMuvRxgWw3ZXYhZKdC2PdAcAZd+rxAsjbiFkJaD8THoEuAVnRtIaQFkBfsheTjm6uyENICyAsy0KAjBFJZCLmpEL6Tm4RXDsh7qxsqCiFZjwTLlsMZdIZAts8sGj192+6Ke85VVAAC6YZqNkd7DsTKoFOWdaomvZhUCO/bqqkGnSKQXEt+UW6UwnrKBGvQKQJ5x8FqUeLsVYwh+YI16BiB5EqaZIPmtCYh26BLlKeapiq6ZEf9Q6vxkg065+TJVeTgJy1oNV7SJYpkgWyeUHIY9d7rkYCZcjiDDhLIPkqy+KMpkwpOh9eLAgcikDSGnzfJKoXxgzm96FAEcgw/bzJpQbPo6Sw8FIGkU3CjWq5J6Hp9Ht+gowTSB28WHjUnXq0+nkFHCaQL9Fv+I0K2LrqBQWdtqil0LWevclySJXyDzhLIIXSq8Vr+4asTvgYdVhyNXOnNWlB9E8TBoMP21DFwubPXgtqbIBYGHSaQboibjZ80p/omiIVBhwkkTWHrOWctqP1TwotcIAnkEHamdyH96jMs5iWKeIGEtemdZlSfYbkYdNyOimrTr3qk+gyrO8kHlECidtPnG6L6DGsnI1ACCdpNP2hO5RmWj0HnCeQcsps+l33tGZZJBx1aGA059D5oTtUZFvmSuCd8/gWdN4df4ND7UcUwnMOyMiASTSARWyE3lYJpuQKM8P6FJpDNORYvK+9UDPBsjc87z9+DE0ivjeDqOlcVw++6H5cRxT/gBBLvFtJRpcCVWAImWDiBbN5PtLw8qxh2tzXYVbAknkCu2gissnNVMYAFiWAVLIknkKyNwJzrqGLg7FasFuEdnkCC5VgHvSbUDw02o/gb4CHUayOo2s5FxYCFypAOnbWZ3nTmosZNTioGcu4smEMnCmTzniJVPw8qB3CqxvahNSuBXAIdrRcVgzcz8C1ZpvAEcg6UY41aUK0FsSzxMgWShjA5VtaCai0I/CVCL4HctBFMr/CqJbVaENsAQhTIMUz2MWpOtRbEN4AQBZKjtNCyltRqQXwDCFEgaQySY11VDqtBLOMAgnR6F20EMvN+05LQMxAhAwhjJy04x0jQO31DmErdx1PNJRUIJMU4X88qB+3CppBNdK5AdtoI4j6cSY9U8cc9pZMzyHXutRHEx3aDFoSvroQa4yULZK+tAD50Oeit+LYJPb8DQQskaTW88lyvNwLt9Hz84rwnVCGQndbC66ONeiPGHt25xosVSO9/xHaaUcf/Fq3Gi13oX+ydC3KjMBBEuw04wf/7n3Zra1OVihcBKiZ296B3Aix4Zn4SA6tRK/SeWSZDBKkRaU6wC0HAatQKvZ8s46//XlJ02Vj2g7WoFXov/EUEinQ7GMMiKSvIjdtBPTaht+htS9ZFF17pM7czoBabSV6dTcVLmJ5lIi/IyO10qMVmklc1dUxymqKBIDia/7Qjy7i/HfcUYckK0nM7B1Sg9wYsI7Ih7P3/E1PsRJCO27miCqMUxKWIZV/D0hXkyu3cUINTCqKwH+ztB+cV2IkgJ+/H6Mgf7OWuJfjkms1SM4ADajBKQd4+iSnRDHoBwlube25nQAVOKYhJldd80v0vuunejdvpUIFRCuJS5fUv8lJXkDu306MKmxTERRD3QUWSuoIMxj/uxJ/s5qblS0F01/rAAAasxSv2hgUpUhDdtT5yO3esRi1/KmPTBkmRgugK0nM7D1TgU/6Xrc2n64JQWJAbt3NBBVo9nDI2w+5MAVTpGMAJa1GrL5RxaYMkGMQihQUZGMAVa1BUu4yLIDlydN3d/6Pto/Tgr+LSBkkwqai92Aygx1qc+mO69yzRiXH6i31hAFiHXAfnBz73LF0fXXmxewYwYhVyydMMwnljwiKWsCCfDOCMdTjl6B6CjMyBriAdA7hhFVY5uocgSaq8woKcGUCPFZjF3hc4cGcOdAUZGAFWYRV7e0yauJ9arS/IyAhOWETRa39BcowqKgsCRnDFMmahhYcgSdog6QXpsAarBnITZI4dCfLBAB5Ywu7B8DjTpAnyjOYSX7CM3ntP66Uoug7TNEEqwSqcNmI3QV6H8DRvVKFwwCJeRawmyAuR7srGCHLGHKIXPUMT5JXsQJAOi5iV/5sgL0P46NGwzxP1WEYucWqCqKBcUx8YwQeWETutqAmiQ35BiCW8dks1QV6IdtMpSJARZVSvuQmigvJiHxjCgGW0ZvSN71k6Qa4QxvB56jhBE8QX4UY6YBhFPjjFHgXJcfCochskSpAeC5hVeU0EyTGsqNwGiRLkgjKil9wEUUG5ygswBpRRveT/8BMkx45C5SpvWBg7Yha3Kq+JIDn2pN+hTM8QBpRpgnzTBHlGvIiF3u5foOMkexQkx7lYkCZIkA4zNEGe0DqU5q3If+wuSJBPlFC94gyCpOgUin/Lq2cIPUqoXnEKQTKc7q6do0c9bhfM4zXsrl6bT9UIGSFNzxgwh19YYSJIhjIWtIkS5IB5nI40oY0gCb5RqL7SUYIMKGNY2lS/bXnKWOrZXhNkApfPH2QoY2m3CeMEuWMGw7AbHvhn6RCnZwwdSjRBvnFdjd/jAXHsBLnxBdgIcqU54l2QOEF6TCN7wbPoh8ZfHGiO8LG8/2ATxFkQ9123+sUQBvGBAqZPhIsg5kmI9mapSEGIaXQveA798nySToj4nEkT5Ak/QXCkMfoRVhNkEvkh7CT70vUjrAOjGFDEr5FuM2tiXujVj7CGJoi5IM4xlkGE1QSZxqZTaB1jGSR6A6O4YhrXiAIuGMdY8l3CyNXtUMKz7u/SCDHed+sQxnZNEHtBbHuFZ+jTBJnGIj7+4kRPtA+tboL8Ye8MsNyEYSCqAUMgYRPuf9q+dtt0d1+NaWuMv+J/guDnsaWRrNTxPZT/g8gOoQiStfVvtTi8bndGgMwesAhI0c0CbUMFFaH6gX/8NJ3Rq3BpAvkzIJ8XOtyE4YIoEw4FgogAuFcIJITFfXBQlJc84bBXCGN55yaQCCgbC3iFQFK8QdlYLAJVIAgXEnuFEIqEmdfVotTpKsSABcnMK4SyuL3yYTEqTZq2gRR6qS2LjAwkZ6u0P4GgbCzYjEXKBZJxVR0KhHLKAac3YJZ2US4cCgRlY5ndhYFRRM+73RwKpPqxsZ/pMHn6iAleZ2XDoUAgVj0vT+dczYOy4VAgpG4sUts76ODplQ2PAsGkkqwgC7Ssd2XDo0CqH82PfBhC6lAIyoZHgcCydMbz9KUzDqOy4VEggLlmvH9DAAVY1ikfHgUi0mH3Tlf7nEVSgJU1ZHUpkDfDUXkaAnKwzOyhfLgUCMewhzS+j/VPqz6qVdGlQDA9dZRZvZBXIEeYWC4FgisVVl4v5PRg5d9sPgVCslyedLVaWawEJHuDtEWo+dbbhpmEVKuQkWYK3pQRnwLhlQrrVQgsQc/daOJTIKxnt3WXQ3ieeVAu4gFm5T96C24SYmZzdXcIzMDKne86nIsFTkIqjLJwjZ9mcxNINV/1A88KoRm833kgt1JQSaCVkOoUQtRH7oprsCgVOwsJiKllhTV1pD5sQQqkV0lg3adW5/MQpj465ir0KgnyTcgHbjXYvVCj4425DIUFQpuv+JX5/GfqQH/3B/cmkB0g/cmPdKtOZaTqwy5MgQwqCrbb5DcPnQaxv+RDCtIEsgPiu9t6quoXboD6pswMFoEuELLR+0531zlM4MPlLjWB1GTPHcqwaC8tfXumIEiBmMrC7eg9+xJZsOnHISmI4ssBF4iDGOs7c1BRVnB4dcjsC4tCF4iHGKts1ZDs7h7WpmObVBwbJqAX0z/Q9SpE4LpXPxmVG9sG284rCR1Mf+I6qQAjPyidlZtgUfACQTcsfuEadDR3dvbxbNiACuSuwjjxsZ4Mq44kuLhvL8rNanEq13YKLz5WiUBr8bFUnbLTWwwHAvHiYz259qMOYKF7V59MXqhABu2ixVjbdLdLk0fJ6a0bi8MXCPZNwybzNCofwUdw9Y7yM1ghrtoNMMMqzG1VFsbJRWr+qZOXKhBTeRz0vMfoMmgk3Jwtz6T8WIKaa5xJ4I2pSY38T6x1eeCr5kW2mCVAVwp5k/v/lrkP+gfWmz91vEdY4A0UVB5P7SZRhn4dtZ/QUwcXnxFhBUvALoQ4LIX8mevQrxelCPeb5wNjlMj75wyBAP/95f9k8uinEPSVEKb+MXiMqo6OsNJ1QnghxGkpJM3wi9c5ICZJ5O0zaDfQLKvxD9Tch6UdZRB6IeQl0vTGYX80f7UNfAjkRdL0lyfoCCwO5AsSvFia/rpcdQQXS1B5q+UOfFfTG8eapMHiQD4hhaPhDY0NFuUn7fICsqgk7h4WNjY8UnL0MegvwN6Tjf3UXgTZ5/JWblSnaU6vfzodw9WSVN4rs4Pm9PrnoWOwNHyfV/T/Y2uclKIrWApCnJgE+3+UjZPT29V2wPd5W7HQO5N+gT5Y9+uc/qWNJPVX0ZUqEHC+o10hr02vg5htD/h2xW/s3WuO4jAQBOCukARIhsf9T7tCuz9GEIiD5HV1pb4bzAjb/bID7PZayD6MqCQKaJSxPG8ibEYlxyiS+oX3f3yECDuiklOsS9HO8RGyZwNqOcRnif4UHyH71aOWIQqoZOk+QkRNqKaLIvwTAT5CduyEWsYoonCp0EeIrAnV9FEmQ0eHM+eyJVkOkNLfi0yW7na6oG5ENZcoxH+vhXdLsGd5YpIpCqlk6T5C5DwfIMlz9K+y9NStUXuR5gC5RymRXjrgq4ViXg6Q9AH5gO2SV+7stzwHCIYop9FLf1D9utIuLRwgqfvoX09eZp5gtt8SHSDHKCcy8e6BEy0TnigUdGZ8xaVeW2uia+ykE1q7hkmYUNU5yum0CgE/RKqix4vsbUKCVqFLvSoGvEjfJmRoFTpPF9Gjqls0ckZzztMFzFgg0TAb0Zzz9PS6H9QVW4glIe6n53dAXX1soZaEuJ+e3TSirkNsIpaE+OpUdne80IkxCJIQjJ57z2xAZWNskW31k8eYxt9tvsdWYkkIcAvL6oAnWr+O9uNYDrJSm0bUdo6Nch2QDrKk3bFEJgWJOIGCg6ycLqis+eMeF1BwkJVSN6Ky5tN6HTg4yMroivq6+EqWQUy3C4UNeENp0IKj0Nu8WGGEQ4oUGyfFtMnDsQtL5YolcvsmR6G3fbnCCAMsjNEcSaEXwCUsj3cBltyuSVLoda03mSveESryUrxASlSxMK4Aq32Rl2ai98H3b/P42CIUa481f2DRaUg+d7ynNoLE0kx3GpLHjP+B5RsyR/BwGpLBecQS1V8DTTOdpK5nLFsqRYTFcmuKqbBnBBVeijY6X4yFkeW/Yq07Zz9BgirGwg9D7du+vGUrWfXnirE4it/WPt7giSWoYiwn6tRO+EQywmKLsZyoE5vxiWaERRdj+UVrWisdENEIiy7GcimL1NqMu2iExRdj+X4hpx4r9LqEpDEWy5SBbesQys1hEc68u5TFasZH0jsk08w7y3sWtvF9D90Ii2vm3cVeSmUddKm7hJxvN/j6FKXuiHUiXwXhfrvBxV5KPdaIhw8072N5hTA6oYTSe1jPriDkK7gkbiigXcPka4W4YUhjRgnRMRPWcROvEBoDioiOmRC3QrxCKBROKOo2Qf7qGD6a7hXCp3R9CDdBeFshhEMHe1O4cUo3Qcg+FZKgpLEfxQ3CHXSIOdN0r5BNBNYHZYpOnKZ7hWwgsD54x1RZ03SvkFIS64PsJkiGNB3AnbOwoa10fexmM6RN013tLSKxPqhf7GD5arpXyB/2zgRLbRgIoiNr8YKxuf9p83gTkjADAYEZ+pf6H8F67eql1DJARXw0UaLbLtM9Qm6iER8Gje7WTe8eIXchEh/F9iHHYJnZoslTk6r4aKREt3o33W9Q3UYmPgz3eM13eo8Uyy0OHWrjQ96Gxej0Amo4Dca6+Gilx2u/02v3roAUlf72Znq8dteboMo4PJXx0Vx+YLrT67aTl7Orjw/lZSawYaEPRL6gdfxmfbxn2PX0erv3KhLbn4wPCRnDwk8KIVnl0Q3hIfQeXYNeC8GpMYuHxh8NDQlJEuKl+vaMc6inxfakcb/Jid4LkU3Zl1BLmwJi3m9yoljdfoHk7e9UmneZWN/T64XIN2TKc4bLBCchISQvRDZhev/Kp/QBAiMhfkVkE3IJb4ckICAJcfOiQvlBExCShHi/91k6E2+AswQEJSGeZqGnH0gBYUmId7Pg6RVQQFgSEkLiDJlMYSO9AgoITUJ8aAhOr5ACQpMQr9XJpjuggOAkJISZ+Bt6I5Od9QPMkzPzf7mbxUWEcbWWauMl3gtxEUFX5zAbL11CXEQo1nYBAUFKiIsITj5CoQoIYsGJt7Pg8sGe8lppk9dR3L+IkQ/MKhPqmsXLJHdnXWO1JR90N7adVnklkfxfeh2juQMFbOP9HzlQmd178o3OYF+Sfkw0w4nnWdfZGywpkSaTf5mspaw+FOE7S/AmE/q00PtZiOyKPCP8S2dQl70UARuvRGaE/FbvicRX8WfJ71/qozcjFGj1njgo/KfUig+BFi/mXc/bDO2GyGS4D6mS/i6BT6MNrS7aLD40WrxoV+9XSoOzddPhwb0GouLqbT1EjIeHSIUuUqefQkTnp0UPjzAr/a4E6vS2ynXz4aEwQ5eZp58z6Fu0AOFBei6ngXl6U6PDabEfHhozdA3f+yVm3VekLc89ZK5JXcLYRU2v1y+SIe2U/kMOiWHIGYNaptXtMImwYh2oMQw5o98JtRoRpYfgCERuGHJGUelp7UmnIzUCEblcKC0jU8TkVoIjEHOPEW3PgLaV7kjicWT5UIV2EvczL9Cm1jjgdF00wRJOsj7pV1yM0FIr7QRLOskCxsi0Wr1I22qCpZ1ksWKEGh3SCZZ8kkWJEW50iCdYDSRZf2p2s+c4LuDoUE+wmkiyflMGe/ORbs/rWcl7sPQ9WdfpLQnJGAX+TSK+BelFcpWkaCBIxvUg8V/S9GAJLXwnBolKcCjt+WnoduHdpGX/882tHGWCQ/EWof4Kh0rmQ8w/VbnndUC3q4QXKTa1wuGhKHmtlnSCsSHy1IH3eu8mDTGP24fGLibVBLY31zX/hvd6t6ZPcc3jNpExJO2P2kKHV3XJybOUlGLc51ztGcl5jUNSzKcaWGOiv/H9BZSU0hKP0XLka1Ix5iNrjPGQ2ggL1T1xd9DW+Tru4XVfr/OLvXtBShiGogCaVCzyU/a/WnVgACkJRceQNufs4U77PkkuKUCUISQpQExDyDIBMQ0hzQTEUhZF9C0WII0vZWEFq9X7ejlyBsTZEJKcATEvJMmE0NoitynQQ1Cok6ZADwp1khTo3yz2kmCCfuJ9T66ZoP+HTiuLoV4+rL6jgTXGSkLQwNLKYrRNoL1nEdDAspWFfBxo9nKmwTuk2csX+bhJQjjT4E3Q7EU+EiSEH7xje4vddwxAcgwMkY8ECSFGdyimSQgGhHc5P4V85Fg6QT4SJAT5yJEQ5CNHQvizZUBCsKAoIcjHgIQgHzkSgnzkSAjykSMh/MpePiQE848QJAT5yJEQ5CNHQpCPe1y5yEjvASeocL72goQgH0W9ug1ojnr5cF8W7ocrYbWNzIt8hODeXqxfFdItIvMhHwdGhhgPlvISmYeXwJGBCMYfWdq9aF+VstLMmrqlfFzTzOJkoX01pJmF9lWGUh3leZ7dRWLv9cEy1kr1KVquA2V0CpHpeVOe5zmI2zSPD96lEGmX6eA4FuDbZHl3LK99tsjdJc+x8Zs1Bf0u8AirWU3R3X2Ufm9L/F49185vVs38Xj2dsXrFFn6vKqCbVStHa+tgaFilrd3EWnT7SG08rFaTDx+RuqjOK7N2FrcmqvNP9u5Ft00YCgDogm1CeP//165TNymqwpq2AWw45x+u7hOTH89mZaN2upsje/VM2J3nShLJgeFuviSR3Xn3Km+SyK5q6SN3ksjXGF6djp3I0wyvTslOZBez9FEMR/Cb663OS1I58d3W6PKqMEmzvp1otlsgzfpGam9Sl8kX64+prlBnLVNd4e2sjfSqq9JVjk9WUwfV1QG0PshdR2MzeBDJav31ojcZDqTrL1icsyzo1m0++I9KiOjNsTh8xGKQp7RCxOgKIfKP8ECILBIeCJFFwgMhskh4IEQWCQ9+rLUXeVIdhMcpWR1aC+JGywcf/MDg0ndZdJLIr5t+/bHG17T8bUZUWh/1Wg/udCqte1HrwQdtY6b1rlZb8UjVeSXocrl2aiuW3E6eRiQPPlGduBuRPHhGe8qhVj86KOFZ6WylVmMlyNd053lvblZaoR1ZcJ2UVnxXOx178is6ECOig3VVB+xHRAevjZEjzbV05awgjUfYj/QmuqymncoutuLklISVDWOZXXs/DgorNlF1TVnVVj13enI21ZYSJPWsrmIfbdfkXW71jeBgX9UQ8rxIieOgrCIPt7xSybWZ/GKT3KSp2T+X/IkNwyqydetC3Kd5r+PYyRuUoEqbhkkdR2mD8tyGMK4aJ3VswiBrULZbmkITX9nE93EOUzLA5VhS6kKYY6y/mS7iHEKXZAyOr0opDeHNGN9dL/eu8V0T3nQpJRsNAAAAAAAAAAAAAAB+twcHAgAAAACC/K0HuQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuAhaj6ecXsagoAAAAABJRU5ErkJggg=="/>
</defs>
</svg>

source/_static/images/nav/my-account.svg METASEP
<svg width="57" height="57" viewBox="0 0 57 57" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0)">
<path d="M55.636 19.8945C57.1407 21.3992 57.4531 23.6764 56.3183 24.9952L30.0121 55.5778C28.4154 57.4352 25.6207 57.4946 23.7978 55.6621L1.34057 33.2029C-0.482312 31.3801 -0.432477 28.5853 1.42299 26.9886L32.0075 0.684345C33.3244 -0.450403 35.6015 -0.13987 37.1062 1.36674L55.636 19.8945Z" fill="#AABBC1"/>
<path d="M45.2806 9.53993L11.2458 43.1108L3.31982 35.1848L38.7385 3.00171L45.2806 9.53993Z" fill="#202427"/>
<path d="M44.0251 16.3293L20.0842 40.7628L26.4998 47.1784L49.6126 21.9149L44.0251 16.3293Z" fill="white"/>
<path d="M30.3603 38.5796C29.0185 37.3375 29.814 35.0066 30.3028 33.7358C31.0695 31.7691 31.865 35.5452 31.9052 36.1299C32.0339 38.049 31.8645 39.9766 31.403 41.8439C31.1442 42.8876 30.7673 43.8986 30.2798 44.8571C29.9847 45.453 29.5619 45.9765 29.0415 46.3905C27.7496 47.1707 26.9331 46.4116 26.5957 44.121C26.7265 43.4209 27.0597 42.7744 27.5541 42.2617C29.2409 40.1686 31.9091 39.1086 33.8623 37.4812C34.054 37.3202 33.7454 37.0173 33.5556 37.1745C31.221 39.1162 26.4213 40.7187 26.1242 44.5561C25.9325 47.094 28.501 47.6383 29.8811 46.2257C31.6752 44.3894 32.1333 41.0503 32.2886 38.5412C32.3787 37.0825 32.7486 33.0457 30.6057 32.555C30.5643 32.5422 30.5198 32.5437 30.4794 32.5594C30.4391 32.575 30.4052 32.6039 30.3833 32.6413C29.5342 34.1325 28.3208 37.2608 30.0766 38.8805C30.0964 38.8991 30.1196 38.9137 30.145 38.9233C30.1704 38.9329 30.1974 38.9375 30.2246 38.9367C30.2517 38.9359 30.2784 38.9298 30.3032 38.9186C30.328 38.9075 30.3503 38.8916 30.3689 38.8718C30.3876 38.8521 30.4021 38.8289 30.4118 38.8035C30.4214 38.7781 30.426 38.7511 30.4252 38.7239C30.4244 38.6968 30.4182 38.6701 30.4071 38.6453C30.396 38.6205 30.3801 38.5982 30.3603 38.5796Z" fill="#4F5B60"/>
<path d="M33.2681 37.1342C35.1849 38.1961 35.666 33.9753 35.4149 32.8213C35.4059 32.7872 35.3885 32.7559 35.3642 32.7303C35.34 32.7047 35.3096 32.6856 35.2761 32.6747C35.2425 32.6638 35.2067 32.6615 35.1721 32.6681C35.1374 32.6746 35.1049 32.6897 35.0776 32.7121C34.0694 33.519 33.8911 35.6391 34.7479 36.8735C34.7642 36.9053 34.7887 36.9322 34.8188 36.9514C34.8489 36.9706 34.8836 36.9815 34.9194 36.9829C34.9551 36.9842 34.9905 36.9761 35.022 36.9592C35.0536 36.9423 35.08 36.9174 35.0987 36.8869C35.651 35.7426 36.1187 34.5593 36.4979 33.3465C36.6685 32.8348 37.1094 32.9632 37.4563 32.599C38.1675 31.8802 38.8575 31.148 39.5514 30.433C40.4293 29.5283 40.7322 28.3245 41.5411 27.4236C42.5742 26.262 43.569 25.6985 44.0847 24.1056C44.2035 23.7414 44.2131 22.8942 43.5844 22.8463C42.3729 22.7524 41.311 25.3132 42.9269 25.0679C44.9031 24.7669 46.6743 22.4687 47.9547 21.2343C48.108 21.0886 47.8263 20.8087 47.6768 20.9544C47.0365 21.562 46.3829 22.1658 45.7024 22.7504C45.1632 23.2186 44.5989 23.6569 44.0118 24.0635C43.7128 24.2686 41.4529 25.2672 42.8886 23.59L43.6553 24.1842C43.5726 24.3962 43.4773 24.6029 43.3697 24.8034C43.1759 25.1743 42.9501 25.5277 42.695 25.8595C42.2215 26.5016 41.4721 26.8793 40.9354 27.4792C40.253 28.2459 39.9885 29.3328 39.2582 30.1301C38.9361 30.4828 37.1784 32.7293 36.5535 32.4648C36.5137 32.4495 36.4695 32.4496 36.4298 32.4652C36.39 32.4808 36.3576 32.5108 36.3388 32.5492C36.1472 33.1242 35.9402 33.7165 35.7408 34.303C35.668 34.5177 34.8322 36.1911 34.8572 36.2486C34.4911 35.3745 34.6157 34.2609 34.9223 33.4941C35.04 33.7094 35.1105 33.9472 35.129 34.1918C35.1475 34.4364 35.1137 34.6821 35.0297 34.9126C34.8898 35.9534 34.3607 36.5764 33.4445 36.77C33.203 36.653 33.0266 37.0019 33.2681 37.1342Z" fill="#4F5B60"/>
</g>
<defs>
<clipPath id="clip0">
<rect width="57" height="57" fill="white"/>
</clipPath>
</defs>
</svg>

source/_static/images/nav/mattermost-logo.svg METASEP
<svg width="170" height="28" viewBox="0 0 170 28" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<rect width="170" height="28" fill="url(#pattern0)"/>
<defs>
<pattern id="pattern0" patternContentUnits="objectBoundingBox" width="1" height="1">
<use xlink:href="#image0" transform="translate(-0.000625885) scale(0.000250313 0.00151976)"/>
</pattern>
<image id="image0" width="4000" height="658" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAD6AAAAKSCAYAAADGGiRkAAAACXBIWXMAACxKAAAsSgF3enRNAAAgAElEQVR4nOzd4VEcSbo27JyJ+Q8ewBuPAeABrAXiWABjgVgLpLFAjAVqWbCMBYss+MCAJwJ5ABboi5pNFCyr0SDU3ZWVeV0RhM6cH+dUPdlUN1115/3T58+fC8DSRMTxo0M+LKXsfuO/S/3vgw2c5j8y88oLCAAAAAAAAAAAAAAAAADowS9WEWhFRDwEx3drqLw8CZcfNbZYvwqfAwAAAAAAAAAAAAAAAAA9EUAHtuZRwPzh34cW8+m/dxa2Eh8yc9XAcQAAAAAAAAAAAAAAAAAArM1Pnz9/Nk1gbSJiv5SyX8PlD2Hz6b/3OpryH5l50sBxAAAAAAAAAAAAAAAAAACslQZ04EWeBM0f/uejAaZ5U0o5a+A4AAAAAAAAAAAAAAAAAADWTgM68Lci4iFkflh/Rgiaf839dP6ZedveoQEAAAAAAAAAAAAAAAAA/DgN6MB/iYjD2mr+EDY/MKE/TeHzY+FzAAAAAAAAAAAAAAAAAKBnAugwsIh4aDU/HrzZ/DnOM/O6/cMEAAAAAAAAAAAAAAAAAHg5AXQYyJN28+nfPev/LL9l5moBxwkAAAAAAAAAAAAAAAAA8EN++vz5swlCpx4Fzh9+dqz1d/uQmWcLO2YAAAAAAAAAAAAAAAAAgBcRQIeOCJyv3U1mHnZ2TgAAAAAAAAAAAAAAAAAAf+kXo4HliojdUsrJo8D5nuVcm091pgAAAAAAAAAAAAAAAAAAwxBAh4WpLecn9efA+m3E/TTfzLzr8NwAAAAAAAAAAAAAAAAAAP6SADo07knL+fTvjjXbuCl8ft35OQIAAAAAAAAAAAAAAAAA/A8BdGhQROw/Cp2/skZb9WtmXg10vgAAAAAAAAAAAAAAAAAAXwigQyMehc7PSikH1mUWHzJzNeB5AwAAAAAAAAAAAAAAAAD86afPnz+bBMwkIg5r4HwKnu9Zh1n9kZknA58/AAAAAAAAAAAAAAAAAIAGdNi22nR+Vn+EzttwU9cDAAAAAAAAAAAAAAAAAGBoGtBhC2ro/KSGnA/MvCn3pZTDzLwdfRAAAAAAAAAAAAAAAAAAABrQYUMiYvdR6PzInJs0hc+Phc8BAAAAAAAAAAAAAAAAAP5DAB3WLCJOavD81Gybd56Z16MPAQAAAAAAAAAAAAAAAADggQA6rEFE7E9h5ho83zPTRfgtM1ejDwEAAAAAAAAAAAAAAAAA4LGfPn/+bCDwQhFxVkqZfo7McFE+ZObZ6EMAAAAAAAAAAAAAAAAAAHhKAB2+06O28ynAvGN+i3OTmYejDwEAAAAAAAAAAAAAAAAA4Gt+MRV4Hm3nXfhUSjkefQgAAAAAAAAAAAAAAAAAAH9FAB2+obadn9XGc23ny3ZfSjnJzLvRBwEAAAAAAAAAAAAAAAAA8FcE0OErIuK4Bs9PzacbU/j8evQhAAAAAAAAAAAAAAAAAAB8iwA6PBIRD23nB+bSlV8z82r0IQAAAAAAAAAAAAAAAAAA/B0BdIYXEbs1dD797Iw+jw59yMzV6EMAAAAAAAAAAAAAAAAAAHiOnz5//mxQDCki9kspb0spJ4Ln3fojM09GH8LSRcRhKWVXiz0AAAAAAAAAAAAAAAAAbJ4AOsOJiONSylkp5dTqd+2mlHKcmXejD2KJIuKk/p6+enL407peaLUHAAAAAAAAAAAAAAAAgM0QQGcYNXg+NZ4fWfXu3ZdSDjPzdvRBLE1E7JZSVl8Jnj9lgwEAAAAAAAAAAAAAAAAA2AABdLpXm5TPBc+HcV+DydejD2JpIuKwlHJVStl55qELoQMAAAAAAAAAAAAAAADAmv1ioPQqIs5q4/meRR7KufD58rwgfD45qG3pJ6PPDwAAAAAAAAAAAAAAAADWRQM63RE8H9pvmfl29CEszQvD54/9IzOvRp8jAAAAAAAAAAAAAAAAAKyDBnS6IXg+vA/C58sTEbu1xfyl4fPJWQ2wAwAAAAAAAAAAAAAAAAA/SACdxYuI4xpgFTwf101mno0+hIW6LKUc/OChnww7PQAAAAAAAAAAAAAAAABYs58NlKWagucRMbUe/1v4fGifSinHow9hiSLiopRytIZD34mI/fEmCAAAAAAAAAAAAAAAAADrpwGdxamN52/XFFxl2e6n9uvMvLOOyxIRU2P96zUe9BRAvx1hdgAAAAAAAAAAAAAAAACwSQLoLEZtOJ6C56dWjWoKn18bxrJExGEp5f3ocwAAAAAAAAAAAAAAAACAFgmg07yI2K3B83W2JbN8v2bmlXVclvr7vIl12+95bgAAAAAAAAAAAAAAAACwLQLoNC0ipuD5eSllx0rxyIfMXBnIIl1u6PdZAB0AAAAAAAAAAAAAAAAA1kAAnSZFxFltPd+zQjzxR2aeGcryRMRFKeVo9DkAAAAAAAAAAAAAAAAAQMsE0GlKRBzX4LmQKl9zU0oRPl+guqnE69HnAAAAAAAAAAAAAAAAAACtE0CnCRGxW0qZ2pFPrQh/4b6UcpKZdwa0LBFxWH+/AQAAAAAAAAAAAAAAAIDG/WyBmFtETI3nt8LnfMMUPj/OzFtDWpa6ucSqlLIz+iwAAAAAAAAAAAAAAAAAYAk0oDObiDiuwdQ9q8DfOM/Ma0NapKn5/GD0IQAAAAAAAAAAAAAAAADAUgigs3URsV9Dqa9Mn2f4Z2auDGp5IuK8lHI6+hwAAAAAAAAAAAAAAAAAYEl+tlpsU0S8LaVcC5/zTB8y88KwliciDksp70afAwAAAAAAAAAAAAAAAAAsjQZ0tiIijmvr+YGJ80w3mXlmWMsTEbullMstH/hhD7MDAAAAAAAAAAAAAAAAgLkJoLNRNYg6tZ6/Nmm+w00p5djAFmtVStnb8sHvdjQ/AAAAAAAAAAAAAAAAAJiNADobExEnNYi6Y8p8h/tSyllm3hna8kTEtOHEq9HnAAAAAAAAAAAAAAAAAABLJYDO2tXW85UQKi90kpnXhrc8ETG11r8ZfQ4AAAAAAAAAAAAAAAAAsGQC6KxVRJyXUt5qPec7TI3nU+D8avo3M68Mb3nqxhOXo88BAAAAAAAAAAAAAAAAAJZOAJ21iIj92np+ZKJ8w3+FzWvg/NbAunBp4wkAAAAAAAAAAAAAAAAAWD4BdH6Y1nO+4eZJu/m1YfUnIt7afAIAAAAAAAAAAAAAAAAA+iCAzotpPecrbmrY/M+fzLwzpL5FxEkp5c3ocwAAAAAAAAAAAAAAAACAXgig8yIRcVZKudB6PjyB84FFxGHdhAIAAAAAAAAAAAAAAAAA6IQAOt8lInZr4PSVyQ3pvobNL2vg/Hb0gYzq0bXAJhQAAAAAAAAAAAAAAAAA0BEBdJ4tIk4ETof00HJ+mZlXow+DL6ZNCA6MAwAAAAAAAAAAAAAAAAD6IoDO36pNx29LKa9Naxgfa8D4Uss5T0XERSnlyGAAAAAAAAAAAAAAAAAAoD8C6HxTRBzW1nNNx/3741Ho/G70YfB1EXFmMwoAAAAAAAAAAAAAAAAA6JcAOn8pIs5LKe9MqGtC5zxb3ZDiwsTGUdf81vUBAAAAAAAAAAAAAAAAYBwC6PyPiNitreevTKdLH+v6Cp3zbPW6MG1WsGNqQzmZfqbm+8y8Hn0YAAAAAAAAAAAAAAAAACMQQOe/RMSxkGmXPtXm6il0fjv6MHiR6bqwZ3RDOiilXEXE28zUgA8AAAAAAAAAAAAAAADQOQF0vpjChaWUNybSjfsaGr7QXMyPiIipMf/IEId0Vd8Xpk1J3tVNSqY29LvRBwMAAAAAAAAAAAAAAADQKwF0pnDpbg0qC5j24WMpZVXbzoVE+SERcVZKOTVFqlellOuIOLGxBQAAAAAAAAAAAAAAAECfBNAHV9tsL2u7Lct1X0PnU9v5rXVkHSLisJTy3jB5Ym9qRo+I88xcGQ4AAAAAAAAAAAAAAABAXwTQBzaFB0sp70afw8LdTKFzbeesW0TsTiFjg+UvTJuWvK+bmJy7/gAAAAAAAAAAAAAAAAD0QwB9QDVYOrXWvhp9Fgv2YVrDzBQQZlOuasgYvuW0lHIYESeZeWtSAAAAAAAAAAAAAAAAAMv3szUcS0Qc1mCp8Pny3JdSfiul/L/MPBM+Z1MiYtqg4sCAeeZ1ZnqtXE8h9OEHBgAAAAAAAAAAAAAAANABAfSB1HDglWDp4nwqpfyzlLKfmW+1DLNJEXFWW63he0xt+f+KiLemBgAAAAAAAAAAAAAAALBsv1i/MdRQ4JvR57AwU/B8CpyvRh8E2xERx6WU98bND3gTEYellLPMvDNIAAAAAAAAAAAAAAAAgOURQO9cROyWUqYA86vRZ7EgH2vw/Gr0QbA9EbFfSrk0ctZger+5ioiTzLw1UAAAAAAAAAAAAAAAAIBl+dl69au20F4Jny/GFDz/R2YeC5+zTXWjiil8vmPwrMlBKeW6tuoDAAAAAAAAAAAAAAAAsCAC6J2qob+rGgKkbYLnzO2ig2vFUQPH0KubF57XtKHBvyPibPQBAgAAAAAAAAAAAAAAACyJAHqHatjv39qMmyd4zuwi4ryUcmol+Ia7HxzO+4hYGTAAAAAAAAAAAAAAAADAMvxinfpSQ37CpG2bgudvhc6ZW0Qcl1LeWQi24DQi9kspJ5n5o4F2AAAAAAAAAAAAAAAAADZIAL0TEbFbSrkspRyNPouGfarBc03AzC4iDus1A7Zlen+6iogphH5r6gAAAAAAAAAAAAAAAABt+tm6LF9tlb0SPm/WfSnl18zcFz6nBXXDium1uGNB2LKDUsp13QABAAAAAAAAAAAAAAAAgAYJoC9cDfFd11AfbZmC57+VUgTPac3KNYPvcL3mYe3UJvQziwAAAAAAAAAAAAAAAADQHgH0BYuIk9p8rsW4PR9KKYeZ+TYz70YfBu2IiLellFeWhO+wiWvY9L71XggdAAAAAAAAAAAAAAAAoD0C6AtVQ3v/Ej5vzk0p5R+ZeZaZt6MPg7bUTSveWBYaMoXQVxYEAAAAAAAAAAAAAAAAoB0C6AtUG4zfjz6HxtyXUn7NzKn1/Gr0YdCeiDgspQj60qJTIXQAAAAAAAAAAAAAAACAdgigL0wN6WkwbsvvpZT9zBSgpEkRsVvD5zs9r1BE7DdwGLzMFEK/rq9VAAAAAAAAAAAAAAAAAGb0i+EvQw3lXUwhvdFn0ZCbUspZZl6PPgiad1lKORhgmaYA+m0Dx9GbbV3jptfoVUQcZ+bdOOMFAAAAAAAAAAAAAAAAaIsG9AWo4fMr4fNm3JdS/pmZh8LntC4ipo0rjiwUP2CbYfCHEPqhBQMAAAAAAAAAAAAAAACYhwB64x6Fz0doL16CP0opU/D8YvRB0L6IOCulvLZULIwQOgAAAAAAAAAAAAAAAMCMBNAbVsN3wudtmFrP/y8zTzLzdvRh0L56/bBRAku1I4QOAAAAAAAAAAAAAAAAMA8B9EYJnzflQyllPzMvRx8EyxARu6WUyxrihaUSQgcAAAAAAAAAAAAAAACYgQB6gx6Fz4VH5/WplPKPzDzLzLuRB8HiTOHzPcvGmlzPOMiHEPqZxQQAAAAAAAAAAAAAAADYDgH0xgifN+OPUsphZl6NPgiWJSJWpZQjy8a6NLABx/R++F4IHQAAAAAAAAAAAAAAAGA7fjHndgifN+G+lDI1nl+OPgiWpwZ0Ty0dnZpC6FMgfmWBAQAAAAAAAAAAAAAAADZHA3ojhM+bMLWe7wufs0T1GvLe4tE5TegAAAAAAAAAAAAAAAAAGyaA3oCIOBE+n9XUev7PzDzJzLuB58BCRcR+vYaM7nj0AQxCCB0AAAAAAAAAAAAAAABggwTQZ1ZDdP8SPp/NzRRazcyLQc+fhYuI3VLKpWsIG3bT2ICF0AEAAAAAAAAAAAAAAAA2RAB9RjU8937YAczv98w8zMzr0QfBok2bJxxYQjbsrsEBC6EDAAAAAAAAAAAAAAAAbIAA+kyEz2d1X0r5v8w8H3gGdCAi3pZSTq0lAxNCBwAAAAAAAAAAAAAAAFgzAfQZRMSh8PlsbkopU+v55aDnTyci4qSU8sZ6ghA6AAAAAAAAAAAAAAAAwDoJoG9ZDZ9fDXXS7fg9M6fw+e3og2DZ6nVkZRnhCyF0AAAAAAAAAAAAAAAAgDURQN+iR+HznWFOug33pZRfM/N89EGwfBGxW0q5dB1hy64XMHAhdAAAAAAAAAAAAAAAAIA1EEDfEuHz2XwqpRxnprZoejGFz/esJlt2t5CBTyH0kwaOAwAAAAAAAAAAAAAAAGCxBNC3QPh8Nn+UUg4zcwnNvfC3ImLaSOHIpOCbVvV9FwAAAAAAAAAAAAAAAIAXEEDfMOHz2fyemSeZuZTWXvimiDgrpZya0jcJHVPq++2VEDoAAAAAAAAAAAAAAADAywigb1BE7JZSLoXPt+q+lPJrZp4PdM50rgZp31vnv7Xb+PGxPULoAAAAAAAAAAAAAAAAAC8kgL4hNXw+NZ/vdXmCbZrC58eZuRp9EPQjIvbrtQTmdLvA6T+E0PcbOBYAAAAAAAAAAAAAAACAxRBA34BH4fOD7k6uXTellP3MvB59EPSjXksua5AW5rTEAHqpvzuX9XcJAAAAAAAAAAAAAAAAgGcQQN+MS+HzrfpQm8/vBjpnxrByLYEfdlCb0IXQAQAAAAAAAAAAAAAAAJ7hF0Nar4iYAqNHPZ1T4z5k5tnoQ6A/EfG2lPLK0sJaHNTNYY6NEwAAAAAAAAAAAAAAAODbNKCvUQ2fn3ZzQu37VficHkXE9Lp+Y3FhrY7q+zQAAAAAAAAAAAAAAAAA3yCAviY1MCp8vh33NXwuSEh3IuKwlHJhZWnMbScLchoRfr8AAAAAAAAAAAAAAAAAvkEAfQ1q+Pz94k9kGabw+bHwOT2KiN1SymUpZccC05LM7CWAPnld37cBAAAAAAAAAAAAAAAA+AoB9B+krXirHsLn1wOdM2O5KqXsWfMX213ocbN97yPixNwBAAAAAAAAAAAAAAAA/pcA+g+o4fMrbcVbcVNKORQ+p1cRMbX6H1jgH2J+fI9VfR8HAAAAAAAAAAAAAAAA4BEB9BeKiKlpdyV8vhU3tfn8doBzZUARcVZKObX2sFXT+/dVfT8HAAAAAAAAAAAAAAAAoBJAf7krbbtb8RA+vxvgXBlQRByXUt5bexbgU4eLJIQOAAAAAAAAAAAAAAAA8IQA+gtExEr4fCuEz+laROyXUi6tMgtx2+lCTe/nqwaOAwAAAAAAAAAAAAAAAKAJAujfKSLOSymnizroZRI+p2u1cfmyNjAD83oVERfWAAAAAAAAAAAAAAAAAEAA/btExEkp5d2CDnmpPmTmofA5nVvV5mWgDa8j4sxaAAAAAAAAAAAAAAAAAKMTQH+miDisgVE2awqfCwDStdq0/MoqQ3Pe1/d7AAAAAAAAAAAAAAAAgGEJoD9DROyWUi5LKTvNH+yyCZ/Tvdqw/NpKb0ZE7Pd4Xo24HeQ8r7yOAAAAAAAAAAAAAAAAgJEJoD/PFD7fW8KBLtgfwuf0rjYrX1jojRIc3pxRAujTZjOXdfMZAAAAAAAAAAAAAAAAgOEIoP+NiFiVUo6aPsjluymlCJ/TtRpmvarhVqBtBzaLAAAAAAAAAAAAAAAAAEYlgP4NETGFok+bPcA+TOHz48y8G30QdE/4HJblNCLOrRkAAAAAAAAAAAAAAAAwGgH0vxARh6WU900eXD+EzxlCRKxqozKwLO8i4tiaAQAAAAAAAAAAAAAAACP5xWr/r4jYLaVctnZcnRE+Zwi1QfnUatOB20EX8XLalCYzRz1/gL+05k06rv1tACzdOq+LmXnlBQEAAAAAAAAAAADAXATQv24Kn++1eGCduBc+ZwQ1fPDOYtOJUQPYO/VzwWEDxwLww6ZNNUopu/X/zu6T69t+/XnssF4LNy4i/ur/xbR51dO/HZ4GMx//tzA78F3qRoQP18On18bH181Sr5Mb/87oG9fE6TuV6yf/u+sn10nXRAAAAAAAAAAAAAB+yE+fP382wUci4m0p5U0zB9Sfh/D504eloSs13HW1rcAWX/xfZl4ax/rVDRX+3dt5fYffM/N8MUcLDCUiHgfHH9p3H//vthYib9Dj8PpDIPP2YWMVDcPQv0fXyIefxwHzo8FeAh/rv7ePNph6uA4KqgMAAAAAAAAAAADwhQD6IxFxUkr5VzMH1B/hc4ZQ2/Omh/gPrPjW/ZaZbwc7560QQP/Tr5m5auA4gMHUa3B5FC5/+HfkYPm6PYQyH1qEv/wrkAntexQyP34UMN9KU3mHbp5cB6e/be98lwMAAAAAAAAAAAAwFgH0qj6sfC3AsVGaiRlCREyv81dWexYC6BsigP4nG6kAGxcRZ6WUkxqgHK2Zt2UfH4KYmXkx+jBgbvWz6VkNmbtWbs+n2pw+fR6+yMzbVg4MAAAAAAAAAAAAgPX6xTy/uBQ+36hfhc8ZQURcCJ/TKeGS/3xOWE2BJ224wAa9N9wmPQRcX0XE1Ip+NfpAYGYr7eaz2Ks/R/V7NH8jAAAAAAAAAAAAAHTqZwv7JTB60MCh9GpqJF6NPgT6VxtLX1tqeqTd8Ivp84LmW4CxvR19ADCn+neX8DkAAAAAAAAAAAAAbNDwAfSIOBEY3agPmSmgQfci4lBjKQO4t8h/Oq3BJwDGdBQRx9YeZuM7BgAAAAAAAAAAAADYsKED6BGxX0rRzL05N5kpoEf3ImK3lHJlpRnAsRD6Fxd14wkAxiQACzPQft4Un4UBAAAAAAAAAAAAOvbL4It7WUrZaeA4evSpBhWha4/C564ldC8zryPiXNv/n3bqJjaCNwBj+rMFPTNtQgTbZZO7duyOPgAA+Jq6YeH/98LhfMxM91VgC+rmVi/9nvu3zLQxHQAAAAAAAMAPqJm865cWE2XmT+a/ecM2oEfE9GDAQQOH0qOpHfckM+9GHwRDuHAtaYow8IZl5hS6/rXrk3y+g4i4WMrBAu2LiH3LtCiCsLBF06YP0+YPZg4AtKreGL20QNC2ulGETVYBAAAAAAAA5nX50vA52zNkAL0+tPymgUPp1dnUkjv6EOhfbYI+tdRN0cK3BTWE/nv3J/o8ryPiZAkHCiyCAPqynNo0ALZKwyAA0Do3RqFxNooAAAAAAAAAmF8tl1ZKtADDBdDrgwWrBg6lV//MTA9u0L26kcU7K82oMnPagOGDF8CfVvXzBQDjEYiFLdB+3iSffwHgkYi48HkFFsFGEQAAAAAAAAAzqiWQyqUXYsQG9JUHCzbmQ2ZedHpu8EVturTRApQyhdBvzKHsuCYADEsLOmyHzR7aczj6AADgQb0x+tpAoG120AcAAAAAAACYV0QcKpdelqEC6BFxVkp51cCh9OimBhGha7Xl+LIGTmFomXlXSpnaKO9Hn8X04GJEeB8EGJNgLGyQ9nMAoGVujMIy2EEfAAAAAAAAYF41k7eSyVuWYQLotZVOO/dmTMHDkxpEhN5Nb3QHVhn+Qwj9v7ytDx0DMBYt6LBZNnkAAJrkxigsg40iAAAAAAAAAJpwIZO3PCM1oHsIaHPOMvO215ODBxExBR9eGQj8t8y8LqVo//7P5wwPMgI/wiYWyyUgCxug/RwAaJwbo9A4G0UAAAAAAAAAzC8ipszRqaVYniEC6PUF6oHlzfgtMy97PDF4LCJOSilvDKV52kdnkpnTQ3y/DXny/+2gblYB8BK7prZYJ/WhdmC9fK5ql7+9ABiaG6OwGDaKAAAAAAAAAJhRREwlbe+swTJ1H0D3At2oj5npYXC6V68jWo2XYW/0Acypvif8Me4EvnhTrxsAjGNqUju33rA+2s+b528vAIZVP6e47wSNs1EEAAAAAAAAwLxqwdeVZViuERrQhUY3435q+evxxOCx+ka3qqEi4O+dlVJuzMnnD4ABnWtBh7Wy4R0A0Jz6mf/SykDbbFAOAAAAAAAA0IRLmbxl6zqAHhHTw8oHDRxKj04y8270ITCElesIPF99bzirG5WM7KB+DgFgHFrQYU20nwMADbtyYxTaZgd9AAAAAAAAgPlFxIVnQZev2wB63dn+TQOH0qPfMtODG3SvhkdfWWn4Ppl5XUPoo3tTP48APJf27OXTgg7rYSMfAKA59caozUqhfTaKAAAAAAAAAJhRREyZotfWYPl6bkBfNXAMPfqYmR4Ep3sRcWITC3i5zLwspfxuhD6PAN/FphXLpwUdfpD28+WoawUAo7zvuTEKC2CjCAAAAAAAAIB51SLHC8vQhy4D6LW12MMF63ev0ZYR1Dc6oVH4QZk5BfA+Dj7Hg/q5BIBxCKDDj/HZCQBoihujsAw2igAAAAAAAACYV0Ts1kzejqXoQ3cB9IjY98D/xpxl5m2n5wZ/8kYHa3dSNzAZ2Zv6oDIAY9ipD70D30n7OQDQGt8XwzLYKAIAAAAAAACgCSvF0n3psQHdg0Cb8UdmXvZ4YvCEN7qFq6EVGpGZdzWEPrrV6AMAGIwGZ3gZvzsAQGt8XwyNs1EEAAAAAAAAwPwiYiqVfmUp+tJVAL2+SDVlrd+nqf28t5OCpyLiwhsdrF9mXpVSfht8tAf1cwoAY9jTgg7fR/v5Iu2OPgAA+hYRb31fDItgowgAAAAAAACAGdVnQN9Zg/50E0Cvu9trytqMs9pgC92qAaHXVhg2IzOn9+ibwcf7NiL2GzgOoF2uEX3x9yl8H78zy3M4+gAA6Fe9MfrGEkPbbBQBAAAAAAAAMK+ak7m0DH3qqQF92t1+p4Hj6M3vtbkWuhUR00PzF1YYNu6klHI/8Jh36ucVgL+yZzJd0YIOz6T9HABoiRujsAw2igAAAAAAAABowqVcb7+6CKDXBwzsbr9+nzSQ0buI2PVGB9uRmbellNGDeEcRcdLAcQCwHf6egufxuwIAtMT3xdA4G0UAAAAAAAAAzC8ippLGA0vRr8UH0Gt4VJvoZpxl5l2PJwaPXGobhe3JzOl37sPgI1/Vzy8A9E8LOvwN7ecAQCpMDckAACAASURBVEvcGIXFsFEEAAAAAAAAwIzqM9Kn1qBvPTSgnwuPbsTvmXnV4XnBFxFxIegAs5jeuz8NPPodLZ8AQxFAh2/zuWi5DkcfAAB9cWMUlsFGEQAAAAAAAADziojp+cELy9C/RQfQI2K/lPKmgUPpzScPgNO7+jDhawvdJSGIxmXmnTBeeV0/cAPQv6Pa8Aw8of188XZHHwAA/ajf07y3pNA2G0UAAAAAAAAAzCsipmcHL2s5I51begP6qoFj6NFZDQdCl+yy0j0hiAXIzKtSym+Dj8HnGOALAeXu2eALvs7vBgAwu0c3RoGG2SgCAAAAAAAAoAnTMxZ7lmIMiw2gR8SJlqyN+KOGAqFLdlmBdmTmFDi6GXhJDiLivIHjAGDztKDDE9rPAYCGuDEKjbNRBAAAAAAAAMD8IuKtZz/HssgAen3IQHvx+t1P7ee9nRQ84WFCaMvo7ztv6+caAPqn6Rn+m98JAGB2bozCYri3AwAAAAAAADCjWij9xhqMZakN6OceMtiIt5l51+F5wZ8i4sLDhNCWzLwupfw28LLsCF8BDEMLOlTaz7thDQFYNDdGYRlsFAEAAAAAAAAwr4jYL6WsLMN4FhdAry9WDwSt38fM1CpPtyJiall+bYWhPZk5PUB4M/DSvI6IwwaOA4DNOzdj+JMNeACAWdXvYtwYhcbZKAIAAAAAAABgXhGxW0q5rAWMDGaJDegeCNoMQQi6VR8mtMECtO1s8PVxjQJ2h5/AGF7VTdVgWNrPAYC51RujKzdGoW02igAAAAAAAABowpR3ObAUY1pUAN1Dyhvze2Zed3puDK4+THjlYcKhCHUtUH0f+m3gERzVNh9gXIfWfhianxmd3wEAYG5ujELjbBQBAAAAAAAAML+ImEqPTy3FuJbWgG6X+/W79/A3nRM+H48A+nJND/9+Gvz8AejfqRZ0RmVjwf64ngGwNG6MwmLYKAIAAAAAAABgRhExFay9swZjW0wAvT4UtNfAofTmPDPvRh8CfYqIlQeUYDnq+9HZwEu2FxE2hQEYg+s9o/La748AOgCL4cYoLIONIgAAAAAAAADmFRG7tRSWwS0igF5fsB5SXr+bzNQqT5ci4swDSrA8mTl9QP0w8NKd1889APRNCzrD0X4OAMzJjVFYBhtFAAAAAAAAADThspSyYylYSgP6uRfsRpx3eE7w8IDSe5OAxZren+4HXb7p885FA8cBwObZZI3R+A4CAJjTlftM0DYbRQAAAAAAAADMLyIuFA7xoPkAem2Fe9PAofTmj9oyC13xgBIsX2beDR5Q0ooLYzq07sM5rZ9doXv1s80rKw0AzKHeGD0wfGiejSIAAAAAAAAAZhQRZ6WU19aAB0toQNcKtxmax+iVB5SgA5m5KqV8HHgtVw0cA7Bdgshj8ncZo/DdTr9soAJA09wYhWWwUQQAAAAAAADAvCJieh7wwjLwWNMB9PqiPW3gUHrze2bejj4E+hMRKw8oQVdGDuUdRcRxA8cBwGada0Gnd7X93Hc7/XINA6BZbozCMtgoAgAAAAAAAGBe9XnmlVJYnmq9Ad2DQet3r3mMHtUHlIQamOybQh8y83raNGXgEXi/BujfjhZ0BuAzDQCwdW6MwjLYKAIAAAAAAACgCUph+apmA+i19fOogUPpzUVm3o0+BPpSH1B6b1mp9gyiK2/r5ikjOqqbawDQNy3odEv7OQAwIzdGoXE2igAAAAAAAACYX0RMZVqvLAVf03IDuoas9bvXIkBv6gNKVxYW+lQ3TRn5M4HPQwD904JOz3yW6Z8NNABoTkS8dWMUFsFGEQAAAAAAAAAzqiXS76wBf6XJAHpEnGg/34hz7ef05FH4XDsGdCwzp81TPg26xnta0GEY/v4ZmxZ0uqP9fBiHow8AgLbUG6NvLAu0zUYRAAAAAAAAAPOqz3leWga+pdUGdC3d6/cpM1e9nRTDu9COAcMYOYStORSgf9OGSifWmc74DAMAbJUbo7AMNooAAAAAAAAAaMKlUlj+TnMB9NryudfAofTGg990JSLOtenBODLzqpTycdAl36vXPAD65m82uqH9HACYiRuj0DgbRQAAAAAAAADMLyJWSmF5jhYb0D10v37az+lKbcd4Z1VhOEO3oEfEbgPHAcDm7NUN2aAHvtsBALbKjVFYDBtFAAAAAAAAAMyoPq+sZIhnaSqArv18Yzz4TTe0Y8C4MvO2lPJh0AFMD2VqQQfon7/dWDzt58PZH30AAMzPjVFYBhtFAAAAAAAAAMwrIg5LKReWgedqrQHdw/brp/2cbtT2X+0YMLYphH0/6ATOtaBDn2pYE4oWdDrhu52x2EgSgFnVG6PvrQK0zUYRAAAAAAAAAPOSy+Mlmgmgaz/fGA9+05ML7Rgwtsy8G3i3JS3o0C8BdB7zNxyLpf0cANimRzdGgYbZQR8AAAAAAACgCZfyu3yvlhrQPWS/ftrP6UZEnAsy8Fxaort3oQUdgI5pQWfJfLcDAGyTG6PQODvoAwAAAAAAAMwvIqbnO48sBd+riQC69vON8eA3XYiI41LKO6vJdzg0rH5pQdeCDjAA13oWR/s5ALBNbozCYtgoAgAAAAAAAGBGEXFSSnljDXiJVhrQBaXX774+1AGLVkMMXsvAU1MA/dOgU9GCDtC/g7oJEyyJ73YG5XoFwLa5MQrLYKMIAAAAAAAAgHnVXN7KMvBSswfQtZ9vzEVtiIXFqgHLy9r4C/BFfY8bNeQ0XRPPGjgOADZLmJfF0H4OAGxLRBy6MQrts1EEAAAAAAAAwLzk8liHFhrQPVS/fve1GRaWbnodH1hF4GsyczVyC3oDxwCsz6FZ8hVHWoVZEN/tAAAbV2+MrtwYhbbZQR8AAAAAAACgCXJ5/LBZA+j1YXrt5+u30n7O0kXEuQY94BlGDTvtRYQWdOjHrrXkLwj10jzt5wDAFrkxCo2zgz4AAAAAAADA/OTyWJe5G9A9TL8Z2s9ZtIg4KaW8s4rA3xm8Bd3nKID+aUFnCXwmwUYqAGycG6OwGDaKAAAAAAAAAJhRRBzK5bEuswXQ60P0R1Zy7T5k5m1n58RA6pvcypoD30ELOgA9E+6lWdrPqQ4NAoBNcmMUlsFGEQAAAAAAAADzioipUObKMrAuczage4h+MwR3Waz6Jje9hnesIvBcg7egnzdwDABs1lEN+UKLfLcDAGyUG6OwDDaKAAAAAAAAAGjCpVwe6zRLAL0+PK/9fP1uMtODWCzZFCI9sILAC1wMOrSDiDhu4DiAH7NrfvwNIV+ao/0cANiSKzdGoW02igAAAAAAAACYX0RcyOyybnM1oHt4fjNGDd/RgYiYrguvrCVrIsg3nmkDi/tBz93nKli+Q2vI3zjVgk6DfAYBADaq3hi1YSm0zw76AAAAAAAAADOKiLNSymtrwLptPYBed8HXkLV+95m56u2kGENEnJRS3lhu1kiQbzCZeTfwRixHQokAQxD2pRnaz3nC318ArJ0bo7AMdtAHAAAAAAAAmFdEHCo2ZlPmaEA/t5obIXzOItU3Oa9fYB0utKAD0DEt6LTEZw8e2zUNANbJjVFYBhtFAAAAAAAAAMyrlkVPubwdS8EmCKD3w8NYLI43OWCdagv65aBDPa3XVAD6JvTL7LSfAwCb5DtjWAYbRQAAAAAAAAA0YXrG4sBSsClbDaDXnfA9NLR+HzPztreTYgje5IB1GzmYZ5MfgP5pQacFNkIAADbJd8bQOBtFAAAAAAAAAMwvIqYMyStLwSZtuwHdQ8qbserxpOhbRLz1JgesW92Q5cOggxVAh+USKOZ7nJkWc9F+DgBsku+MYTFsFAEAAAAAAAAwo4g4LqW8swZs2tYC6PVFvWdF1+4+MwXQWZSIOCmlvLFqwIaM+r64ExFCibBM/k7ie5zXtjmYg40F+ZojUwHgR9V7SL4zhsbZQR8AAAAAAABgXrVM6NIysA3bbEDXyrkZwucsSkQcet0Cm5SZV6WUm0GH7PMWQP92XO+Zg/ZzAGBT3BiFZbCDPsD/z96dHsd1nQkD7k/l/9BEAE6dAMCJgJwICEdAOALCEYiOgHAEBCMwGIGBCAwEcMpEBBYimK+u/LbcBLF0N+5yluepYkn2jKXbdz3LuwAAAAAAABThIuKJYXKzJKBH8JBq+NM4a/FH0abo1OgjB8yh1+/jUQSCAtA2XdBZgu7nAMBUrBlD4RSKAAAAAAAAAFheSmloCnvkUjCXuTqg6842jZuc87cWfxjNGoKTDl1eYGo552FQfdfpiT4p4BgAmJYu6MxK93MAYCo2RqEaCkUAAAAAAAAALCildCKWk7nNlYAuEWoaup9TjZTScL++ccWAGfX6nXyvKy5AF3RBZ066n/OkKFIAADuxMQp1UCgCAAAAAAAAYFkppddySVnC5AnoEUCkIv40Llr8UbQn3gMfXFpm9NbJZrVanXd8EnTFhUqklHyz2NeBYm/MIQodSAzjORLQAdhJbIx+dtagbApFAAAAAAAAACwr4jgv5OiyhDk6oAuIn8bXnPOvLf4w2qLCCrCUnPO34XvZ6QUw/gLog4IjzMF9BgCMamNjFCiY/R0AAAAAAACAIgzNGQ9dCpYwaQJ6BCa8cWUn0XNXVyqhwgpQgF6/l4cppeMCjgOAaR1GNzqYRMzpJKADAGO7sDEKZbO/AwAAAAAAALC8lNLH1Wr1zqVgKVN3QBekPI27nLPuINRAICGwqPhe3nZ6FSQkAvTho+vMhE4lnAAAY4qNUYWLoXz2dwAAAAAAAAAWFE0Jf3ENWNLUCeg6b05D8jnFSymdCSQECtFrF/R3KaVXBRwHANPSBZ1J6H7Ojl47YQA8x8Yo1EGhCAAAAAAAAIBlRS5Ir7kwFGSyBPQIgNclaxoS0ClaPP8fXCWgED0PuiUkQvl+do0YgS7oTEH3c3bhewbAk1JKr22MQvkUigAAAAAAAABYVjQQuhDDSQmm7IAu4WkadzlnCegUKwIJz1whoBQ552+r1eprpxfEeAzKp2MsY9AFnVHpfg4AjCnGFuc2RqFsKugDAAAAAAAAFGHIyztyKSjBJAnoEaDwxhWehORziqXCClCwXr+fh9G1CID26YLOmHQ/BwDGZGMUCmd/BwAAAAAAAGB50ZDqvUtBKabqgK5L1nQkoFOy4f48dIWA0uSch849d51eGAnoAH0Yio68da15Kd3P2dPPThwAD0kpndoYhSooFAEAAAAAAACwoJTS69Vq9dk1oCRTJaBLdJrGXc5ZAjpFSikNwUlvXB2gYL1+Q99HIhkA7dMFnTHofs4+XjtrANwXG6OfnBgom0IRAAAAAAAAAMuKnI9Ll4HSjJ6AnlI61gF5MpLPKVI89x9cHQoi+YGHnHV8VhQHAujDG13QeQndzwGAsdgYhTooFAEAAAAAAABQhAvNgyjRFB3QJThNR7AWxUkpvVqtVueuDIUx6OIHOefr1Wp12+mZkUgG5VI0hbHpgs5L6H4OAIzl0rgCyqZQBAAAAAAAAMDyUkpDs8U3LgUlGjUBPQIV3rvSk9EBnRKdCyQEKtLrt/QoCoYA5fnZNWFkuqCzF93PAYCxxMbokRMKxVNBHwAAAAAAAGBBKaWhGfQH14BSjd0BXffz6XzNOf/a6o+jTimlUxVWgMqcdXzBJJQB9EMXdPah+zkvodgRAL9JKZ3YGIXyqaAPAAAAAAAAsKyU0utoDAvFkoBej8veTwBliU66EluAquScv61Wq5tOr5pxGkA/3sSiFGxF93NGcOgkAhBj0J6L/0EVFIoAAAAAAAAAWFbEbZ5rHETpRktAj2TUd674ZC4a/V3Uy0cOqFWvFaIOJSMCdEUyMbvQ/RwAeBEbo1AHhSIAAAAAAAAAijDEWBy5FJRuzA7oumpO5zY6tkIRojvGG1cDqFTPRV0kIwL0430UioMn6X4OAIzExigUTqEIAAAAAAAAgOWllE41gqYWYyagn7jqk9H9nGJEgJLuGEC1oqjLTadXUMEgKI+iPkzpo7PLFnQ/BwBeJKX00cYoVEGhCAAAAAAAAIAFpZTerlarT64BtfjDGMcZXdUELEznstUfRpXOJCcADTjvdNB+kFI6zjkrbgPQh6EL+scovgI/0P2cMQ0L4zlna1gsJtaoX238+9/eO5bhnff6ieMb/reHWxz/7Wq1eurbev85uF6tVr/G3/+ac752l9CS2Bj9xUWFsqmgD/C0lNLrmDOsYt7w88b/4P5/3rRNgdGrR/77zbnCamMuYd4AABQp9pXWa6yb66/312JXW4yTbu6Nhda+3Vt//X291R4ES9iYK2ze/4/tN7x+Jrb2sfv+15gfrG3OFa5zzg/9b4DGxH7L5vtkzLWJu3vvmU3330Gb/9kaBTCLe3ON1QNzjKfeg8+Nwdaei/W4v177wxjNuIwxxP0ul4OqjJKArpvmtCSJUYpYTHvvggAN6HlT6tikBaArQzfKE5ecR+h+DhRtI6l8c7NxM9F8243EMR0+k6j+ZJBHSmn9t5ubm+s56npD08YlVYhn1BoDFE4FfaB3G/OK+39+nqnRwmNzhPv//e9FfTbmDTcbgY6//1XyFQAwpYgRfB1jp7cTjZse++ftO0b6JkGOfW3MGd5uzBmm2H946jl6tHBg3Pu3GwUaNv/YT4AKbCSX3//rXHudB8/sYT73DlptvIc2EzIvJakDz3lgfXYz/mObIhpjeVGsx+rhOcnqgXiPbxoG8YxLMZvU5v/93//934sPOaV0rQP6ZK5yzg9ViITZpZQuZx7kwUv8t8E7T0kpfduyu11r7nLOj1WBA2aWUnr5hAyeZ1zED6KS5jeLmYzofwXAs6sngi2sP/3b1WYAZWxUes4ohr2h0dkPYnQR1HNt3D+qv+ScPzb0e6AZkSi1ThRZ/33LY5V14Pfl6j+JJwK+AYCdxLzx7cYYqva12c0x0nWMkeyT8ru4519v3Pct7EesOxtfb9z35gYws3vFLH7e+Lb2sja7/gZfb/xVkQzoSMR/3H8X9ryXfL+AkOKiDM/Juaaw48o5/7+Wfk+pXtwBPQbLAoym4+NCEVJKJ4J/qcyrjU5i8JChQ9eHDs/MQUrpOOesQxlAP07jD2zS/RyYXBS7eH2vY8jP1pi2tj5Pv3cduNfpRBAli4mNUXtDUL4L436gRRHM+HrjT4/jknXHnt/nVzFfuNpIPLk0V6AWG2sIj9E9qiMbRQvv012xIE9cp02SjgoT79vh2h3HX1tr3PDQGGmdnHsZ4yMxuR3ZKLLwttF7frXR2fixucH63vc+hpFsvFs2C7n0vg77wzd49eN32L4mNGCjoM/rjXdhjw3hnvPYe3G1UUDo22aRUe/HtkVOnuRzqvTiDugppSFg+ZPLPxndoyhCx52CqZf3J0+KThj/6PQsfck5nxRwHNC1WIj7Z+/ngVkMC5avbCizpvs5E/mjIkf9ulfRfzPZ3HtmPt8FUQruZUqxMfrZSR6dDuiMSgX9yeiADjPbSJJqqUPhnO425gmXEjeZ0sb6wGYy+fq/Wxt7veBq4+9/6yQVf36718UMlGEjUfn+X1cjvdfX6yJr3zYaFvz+9+6H721cl83ndF1Acm2q7+79a7Z+flcbDXusb40kxlPH8efdLP/S8t1E0TYJ6Q2KmLCT+O4oovkft+v7XkI67CbGTW8lm4/mbiMh3bcYCrfxDlwnnHsHTuduo7jodSSle0c2IOYol56f8emAPo8xEtCvTdCn40GgBApNUCkJ6DwrpfRrpwP5u5zzz1v8/wETioW5vzvHzESAPL9LKQ33wi/OCCPznunARjey1xudzSV/lOvmXvCGatm8mI3RSUlAZzQKRUzKuBcmdi/hXMLI+O42kk4uJJ2wq5gTvNpYF3hVQaer+12lrqOTtniCkVXUBe1q4164bvVeuLeW9/NGAYDa1vNuIjn9cqPAhOT0Z0g639nXjYR066gV2kg6P9ZoaWtXcd9fuO/he/cSzu2FzuNqo0CGuRosyDuwSDcbSemKjFYm5ufX5inTkHc7jxcloOvYNznBRixOZzwqJgGdZ3XeBUiHSliYBHRmpgs6vzHHY0IScRqzEaD6diNQ1WZI3W42AjfMB9mZjdHJ2RNiFApFTM64FyYQ7663kSwiqHFewzzhXOAi991LNC85kfilbmO99HKjs5RnYUsb7++3lXdBG/ZQPuaczwo4lr3EvuPmc9tDZ877neGuPb+/3wsnHcfCjGE9PpKUW7iIYT+JP9YsX2bdHf3cu5QexfvkOMa0CreU4etG8TzfY5iQd2C1rtYJ6TEf9q4sVErpwrM1HQno83hpArquyNMSwMDidMajYhLQeVbnnYC+5JxPCjgO6JYEdBZgjok5HlPyjqncRpDqW8nm3RC4wU5SSpcSwiZ1G8HNbEcXlAcoFDGLdScetnNunMFjdCgskqSTjsW6wHGsCRj3/yeIV1Lrhhhvvt3oqtxSgnNVRcE2koyHZ/aogEMqyfr57eZ7Fs/mcD+cGleN7mojGV2h70LEO/BUEsdkFGGgC9YlqmK9Aka2sQ7kHdiO23VDAmtZ5RCrOYu/dPAbxzIUX90rJuWlCejXFjAnJXmSRemMR+W8Q3lWvOf+1emZuss5/1zAcUC3JKCzAF3QO2eOx8QkoFckKlhvdqiyxstNBG5c2IjkITZGKdDXnPOxC/M9hSIokHkC34ng7tMGkxZbJOmkM8b8W+nyuxbryuug9KYT/WrqmOSZ3cpNzvl1Bce5t1jn/ajb+SzuYv30zPrpcqLRyEdJUrP6GgmfFx39Zhom6bwJktFhTyml40YLyvGwu42E9EvvzPnFM/e33n43Rds7f2jvBPRYvPqn+2I6NS1q0yabFVROAjpb6bygjucEFiQBnYUI/O6YOR4TkwRWsFjLfbvxR0AFTxkCN84kmrBmY5RC3eacX7k4/2G8T6HME1jPR04Fd1dN0kkHjCW29t+9zJU7LRpSzfX1zG7tjy1+v2Kf+aMCZIu5irHRXl3D2I0O/8VY7xucK3hPbaxLNE0yOjxjo/DGiaTz7t3eS0gXCzKhGH9ce+4o0F7rn394we946y6Y1FXDv40KxMLdqWsFdOCi4wT045hIAsswp2IJ66rwdMYcjxnsVR2TaUg454WG++XT8CeldLORjC6orEPxPhFMS4kOhzGud9O/RaEIySeUSKGITm10yz3teA+mJUPH43cppdsYG54LUKRjH2OdvVnRXbbX9/cwdvF+a8tpxIQ0QeJ5MYbz/yYKQUjInVB8k84kbRRhvW/wMaV0Zk5A6axLdGN4N30Y/sSe5rnvMijgw6OGe+F9/FnFe3OdjK7w6IjiGbwwj6FQe61//vSC36JS+bRUYWJppz54QCd6TsA2ngPoz2Fs1NMfczxo2LB5MSSepZTOU0rDIvE/V6vV59g4sqHISxzFvfSvuL8UUeqIjVEq8NpFUiiC4gnw7czwThrGjRG88tk90JzDKHjyT/MDOnYcc6WmxNrSkFD2a+fvb++19ryJOVPVhm9uSmmIbfm75POirBNyv8U7VKHekcR+x3pOYW2yLAf35gQKz1GUodOvdYluHcV32Z4m3Yp5w/AO/Fc8D2JFeMpRFPH4W0rp/1JKF0NcqfHdKM6MQSjYXmOkvRLQY6HknbthUrqRsjRJKdTOoj5byTkP39y7Ts/WkIQoUBegPzqgd0b3c2hTbB4OQW3XsYH4NwnnTGy4v/4+BP6llE4FVHbBxiil635dS6EIaiDYsw8bSVH/jHGj91L71vODS885nTloqcj3OvE8EnR+8f4WZ9KoamPgJJ5XY52Q+y3eqewpEkcvY7/DXkf53kciugIMLC4S5ob3xz+sS7CxZnGtSQc9iHfgt5g3vHfR2dO7KN7yz3h/fpRjsLv47ngOKdlez/W+HdBtHk1PB3QWEx89C3jUzoCXXfRc+MW4DqA/uqD3R/dzaEAEBJ9E1eFfY/PwF8mhLGCzs48OJ40aigzYGKUC3j8KRVAHz2rD7gU3Sorq05uNQlXWHOlFEwnoMe+TeP49cSZtqu77NKy3RedCY6y6/JaIbly0u9j/OIvEUfd8fRRgYBEbe6frbufeH9w3rJ1/HvbWFcugNeuCchE78lnuDyM7ijHeP2J+c5ZSaqYg41QiYf9zm7+Ohuy1b7tvAroXx7Tucs7fWv6BFM9CENCbnhPQbXoB9MmYvxO6nzMjG/oTiG4fpxtdzj9H1WFBwZTgYKPDybmuh+2IjdFPvZ8HqtB1cohCEVREAnpjIrjxdCPAW3Ajq7gPPku4ohPvak5ciI7K32LeZ43pexJS2nRYUwHFSOC8Nt+r2npcdKlj4PNiXXm45z+Ufqw8abMAg70CJrVOuoxiStYl2MbBRrEMxbWp2r13oIJyzOEwxup/i4Ie55LRfxRrhT3no1CPvYrbS0Avk+7nLCYWf0zGgd70POA/UtkRFuPZY0m6oPdD93OoTCSdn0Ug8D8iGFhnU0r3ProeXgouq5uNUSrTbRC3QhFUxtigEfeCGz/ZU+YREtHpRXWxc/Eev4iOyt7hD7MG167in9mN4hCSSNrxJjoGnonL+dFG13PfpbYcxl7BhfuesUm6ZAT3i2tLRKcaG2Onf3kHsqD1e1Qy+o8uPJfUYp8x0M4J6BHQ4KGYluAulqQzHtCdnPNQ/OWu4ytv8gfLUO2cpemC3gdzPKjAsCETGzO/RtL5BwFXVOqNRPTq2RilJl3eqwpFUCEB5w0Q4M0eNjt/mhvQoqru6wgGHt7j7wo4HFhCsc+sJNwuDOv918ZE/xFx6Je6njftXXQatlfNi0k8ZyIS0anCvXegsRMleSgZvcs5T8zp3xRwKLCt6RPQJSjNQgd0FhETKJtNQK96Dtq0yQXQp0MVKNsWXaZsvkKh7iWd/y02ZjyztGIzEV3hpUrYGKVGnQYyKBRBbXQSrdiwtqATJy+0OTcQ0E1LqhiHbnQ9/5v3+HasYzSryHi4mNNeSyTpwrordPfdv2MB9AAAIABJREFU0GP/8tJcsQvD2OOTbujsS+I5M5GITrGikIt3IDVYJ6MPc55vEXfQhYi/NaenNjuvbUtAL5MEdJZy4swDHes5Ad34DqBfKo63TZd7ZmVDdnuSzunIkGzyD0Eb5YvATxuj1Kir4FWFIqiVcUB9omDWENz4WSdORvImArq7T7qiGYelJypHYquu57vzjmpUSQXMdD3v2robenfFLuK+P485hn2Rvqy7oWuQwtZiz+Ja0iUzeh/f6I/WLVja8M2MtdlP3oFUaJjjdjHfiXndeQGHArvaeayzUwJ6DKZUnZvWXc75W8s/kKJJQAd61nMBmAOV3AG69cZGb5tiQ1bQEnOTVLI9m4T0RtBGwWJNoJsq5DSnmzUthSKonLlCJYZxwdCpOgpmWVdgCh8i+URsAi0odm09OkX+3RoUfKeIZzbWYS7N77p2GEU7uykUHkXJLmOdmD4dREdMBdR5UiRdXiuIx0IOoujBt56+05RjGDPF2qxCVVC4iHs5t/ZGpXaOsdi1A7qg9Onpfs4iIunEQBXoVs655w7oK13QAbpmk7dNrisApVkHbQyJ6OaghbAxSgO6KGqhUAQNkIBeuI1uhP+ITtUwpWHs+XkIqFUgmcoVF0cX7/OLmH+zH/GR7Vr82kYBlktNoAifhjF46wU7Iy712n1P+CXmAQrV8p1IuryIpEvvC5Z2EN/pb5p6MJco0nJtbRaqcW7MQsWm7YAuMWkWEtBZigrjAKvVVcfnwEIZzE9gHaXQBb0xup8DULjhG/W3CDKTjLY8G6PUrvm5tUIRNMI3v2DR0embboQs4E10//woAYVKFTUW3eiq/K6Aw4ESLfbMbhT7+Wxuxz3DGLzZddLYs/y7+5573kShWjEz/GYj6dI4ltIMe5p/H4oj2NNkKsP3MKV0HYXkjJloRdNNAWNPxbiFmu0cI6QDenkkoDO72MxVYAKg7+/wG8E9MDsLhpREt+y2uJ4A1GAdZHbqai3DxihUQ6EIWmDtuUAR3DgEgn2yVsnCfom5gZgkanNYShJCSulYV2V41sESyY7xnrhU7IcnHLWYjLtRdAEechjFF8wBOjZc/6HDtKRLKvAuvtVicRhV3FP/MJeHesT49ZNLRm+2TkCPhTDds6b3rfUfSJGOTd5pkMVJ9tF0xa0teG6AGt26aqPQBb0Rup+zMJ0KgF0Na5KfdEOfn41RGvKm5YupUAQNMVcoSHTgXAc3Nv0epSrrrmJnCiZTmcXX1WPM+DdxP6MxbmnbrM9sJBRfSyhhCweRjFt9E6GYb1wousAWDmIOcOJk9SXeE0ORir+LbaAiwzvrl6FTtfgqXupe13NoUZMNAWPd+qKAQ4EX27UI3i4d0HVHnkHOuffEN5bh+Qb4t547oK8koAOVGuZQX128UdjYbYOKyyxJgDiwL93QZxTJ/jZGoXAKRQBTiHeL4EZK9iGSrySAUotF79VI3DFmHJc1zrbN9sxGQuU/FIdgB8O98reak3EjIeNSMT129FkSej+i0MY3RSqo2JECerxE7IdfKlJF435t9OddmuPTkJ3GMbskoEtImp7OfcwuJj8W/AD+XQhmWNy86/hcGO8BNRre3Weu3Cje6zxaN93PoSo3Lhf8YLMbuoCNaV3YGIWyqaBPg6w3LCy6i53pLkYlhgDcf0SnfijdIvur8V6/lrgDO5slAT2SSj67POypymRcHf95IUnojYvx67De+Tf7EzTiQxTXFnPLVjbeg5+8B+lAcw0BowikuQ7dkoBelm+9nwAWofs5wPd67oJ+JMgfqFHO+VJBr9EI6qyb6wf1aLXaL4xh6Ib+TcDGNGyM0qJG3xcq6NMaCc8LikSQywiMhZr8okAVFZh9frXxXje3g91N/tzE2ssn14YXqioZd+PbZO7HS0hCb1Ss315rlkaDDtfd0F1cnrIxVvIepAs556ZiomKMqggkrdmpSONWCejxwRPkML2eE95YjkBOgO9ddn4+fBdgBpJpJiHxdhy6oFdK9/Nn3RV+fK0QEA6M5SACNozxRmRjFOqgUAQwphhP/cN7hYopUEXx5rw/JZ/Dy035zMZ8ztoLY6kiGXfj2yTGnDFIQm9MJOb+XSwDjfuQUrqObyJ8J75r5vH05Kal3xrvdoVGaNFOcZ7bdkC3kTMPnY9Ygg7oAN/rvSCMcR9QqwsJpqOR6FUn1+1xw7vhvNSDa4wNVWBsOh6OxMYo1EGhCGAsw/hpGEcN4yknlQYoUEXpZlkTi6RZCX7Te9P6D2SaZ1byORMpOhlX8jkTkYTegKHxwZCQOyTm9n4u6MaQXDzsaZ665KzFWtZnYyU600xeZMSpXHiGQQJ6aXrvuMrMYnPKxxDgexLQASqUc/41Fnt4OV3QK6P7+bPOvR8okEKUsL0h8FvXgBewMQp1UCiC1vmWzyf2gL9JoKNBQ4GqCwWqKNDk37hYA/67eR2MYvRnVvI5E/s8Zef+fUk+Z2LDfa+5VqXi2l3r9kuHhm/iJ2sXRHHQc8VB6VRLeZHnYjLh3ySgl0XgKXOzQANwT875W+cddI8sfgEV0wFnPM5lXVyvp0nioUS9F76CXR1G1wBdT/ZzYWOUxlW/j6lQBJ2w7jyD6KojQZGWvYu5gaIWlGTSgq4xF/7sisNoRv2GSD5nJhcljX8knzOTc+P++qSUhr35v3k/0Ll3imv3K/Z7Ls0R6Ni3Fn567LW8K+BQYCo7jVOeTUCPgY9JwAxyzgJPmZviEgAP6/2b7PsAVCmKiFy5eqM4VpCkDrqfP+tLvBsAqN9BdD05dS23Fxujup9C+VTQB14kuupc6qpDJ44iCd1+FqWYbM4l+RwmMVo3VsnnzOggktAX37+VfM6MDmLcL26hAhvrEh96PxcQFNfuUErpVYyTRptzQIWqj9NLKR3ba6EDO82ztumArvLOPHrutMoCYlHG4BbgYRLQgalN2g2jM/cXrHQ6HsewmSu5qw66nz/N+ZmX79v2fq3lQKFAnyK4l2fYGIU6qKAPvFQkgFwrOkNnhvXLvwvkphRTdLaTfA7TGeOZlXzOAg4joWkxks9ZwMHS9z3Psy4Bj1oX1xbL1oGNd6H8HLqWc6567BaFJMSjwD3bJKBLQJpH74luzM+zTesUUOEleu+S6fmB6UnQG8937+yc88Vqtbqt/DeV4lQ18bLpfv6sK93PZ+d+3J61QHiZ95LQn2ZjFOqgUATwUvEeuTQfo2MCuSnFqPs+ks9hci+KiYhnVPI5Szhaal1U8jkLOjLmL5d1CdjKh5TSpRisdhknwe+qjtuN9/SFZxl+JAG9HLoeMTfPNq0z8OMlek8GUY0UqJ3Nx3Hogl4+3b2f5vwAtG1IQr8WrPEjG6NQB4UigJdKKQ3rNn/zzYffArl9U1naaAW+JZ/DLPYuGuEZpQDv4z6cTaxhSKpiSR8i0ZmCxLvIugRsZ4jJvYxEZRoi+Ry+U3v+xRB3fFTAcUBxnkxAjyAlFanm0XuiG/MzgQF4XPff5ZSSQiVAzYZgwztXcBS6oBdK9/NnDd3PLzf+n7of31Ec9ySM4yiCNYxXvmdjFAqnUATwUpFs+8mJhN+9102MhY2ytyqxFWaz1zMbySUKYVOCs0gKn5w1DApyPtd9z/NiXcK4FXZzJAm9LZLP4QfVxkLFmtz7Ag4FivRcB3SJR9Au3W0BHpFz/lXionEgUK94j1+4hKPQBb1cuns/7bsAsHgvQDHckzAqSegbohOqjVEon0IR9Mia8wiGMU9K6cL3Hh70xtyABb04GUryOcxq52c2vi+SSyjFwYz74ZfWMCjEQTQjYGGRfG5dAvZzEGsXJ85f3SSfw4OqTECP59maHDzhuQR01XXmc1nKgdA+XW0BttJ7R0LjQKB2ug+MRwJ6YXQ/f9ZtzlkRioVYc9jJTUXHCqWThP6fjVGdUKFwKugD+9pIenrnJMKjzA1YyovWayWfw+z2eWYll1Cao5TSpAWrI8lU8jkleTP1fc/joijetbVNeLFhTPlZEnq9Yt3pwvwAflBd7sXGvgvwBB3QoU+SCgGe963zc+RbAdPyjE0s5zwsZl01/SPnc2DTozg21Z/m/FALXdBhXEc9dz+xMQp1UEEf2NfGt17yBzxPEjqL2Lcwo+RzWMYuz6wkXAr2S6w1jC6SfCWZUqLJ7nseZ10CJjEkoWsKUpmN96HGIfC9oWFMjbkXiknAFp5LQH/jJM6m9yQ35vXK+QZ4Vu/f5sOUku8FTEfg2zy6TUCagITeQuh+/qxhMduzTy2qq/wLFXgXAcE9sjFKz6oIOFUoAthXBNZ/E+QNO5GEzhJ2vt8UKIJFbRUPEfsyknAp2ejroSml4yHJ11WnYGcuznwkn8OkPnW8t1mrC+9DeFCN3c/P5M3Cdh5NQFcdbF6VVvqgXp5vgOdJBvG9AOrwaPfYSEK9dR1HcagLejEUA3iajTlqYj0QpvE+Ngq7YWMUqinyplAEsLOI27j0/oC9SEJnbjvtrW6844FlPJuAHs+pJEdKdxTdykcR9739Nkr3RtfgeUg+h1m8l4Reh7hO9mThYVXlXUTRrQ8FHApU4akO6BKOoF0GvgDPezShsSPGg0Dxcs7PLVxZoB+PxOeF6X7+rLtnAsEUpJiHoO7tKXoF0/nQS/Gc+J02Ruld8d9UhSKAfUg+h1FIQmdOW++tppReecfD4t4+dQDx7Tj3nFKJ0/i2vIj7nsp8NM6fluRzmJUk9MLFnuz73s8DPKGaIouKbsHuJKCX4ab3E8B8LLgAbCfnrNr8MxuuAJXQlWA8uqAvTxGAp53lnJ8qIqTb9DysKW5PAjpM63NsHDZLFy74XdGFJFXQB/Yh+RxGJQmduWx1j8W9eOEdD4t77pn9KOGOihyMtE547r6nImPd9zxA8jksQhJ6oWKt9nPv5wGeUkvehaJbsB8J6GXQYZU5ebbpxhiVXaFzvhkwHYFuM4lk1C9d/Nh5SIBeiO7nWxFgQFXiG3XnqsGkLltdH7IxCnVQQR/Yh+RzmMSRbzIzeLPlv+JCIg8U4dHnUCExKvUupbR3o4mU0unwz3Dxqcz7l9z3PEzyOSxKEnphNorIAY+7qujcnBnjwO6eSkDfdlEcqIuEXHrifuelapoQTeFAIQeYjAWMeVmYH48u6MuR/P+0L890P4dS6YIO0zpoOCBANyIonEIRwD4kn8Ok3gniZmrPddqPe1BMHhTioXiIjbkc1GivYs0xD7EXSa3cuyOSfA5FGJLQvdvKca5hCDyrlu7nQ9Gt9wUcClTnwQT0WExgPt+ca2YkkRCAXRgXAtXLOQ8LXDeu5GgkoM9M9/Ot2HyjVlVswkDljlJKewVelko3IqiGQhHwPWPfZ2wEeUs+h+kI4mZqj+6txjqvIFcoy0NxdAqJUbOjXYuJK6BHA97ogj4qXUGhDL9oELI8e7KwteL3f2K8+KmAQ4EqPdYBXaLRvCSgMycJ6ADb043QuBBoR1NJRwuzgTs/QbFPG7qfW1sph/Hjbsw5YB4fUkrHLZxrG6NQB0FJwK4kn8OsBHEzpQdjcqIZzGdnHorz3X5XrB+Zy1G7XfcVP0o2pQHnLuLLpZTOFUyCony2frGclNIr8VqwnWgQVazYf7lwOWF/EtChPxLQAbb3q3O1kmAINCHnPGyU3bmao7HAPhPdz7cioKAsP/d+AnakCyTM5zwCBaoVx29jFAqnUASwq43kc0kfMJ/PimwykR/mnRvveaA8P997VhW0pgWH2yarxXjog6tOA7a+73lYFNSUfA7l+RwFzZjfhWKhsJWrCk6T4r/wQhLQAQAep5OmwiVAWwSNjEcX9PlI9n/a1Q5VVAV5Upyc81D06saVgVkcNFC0RKADFE4FfWBP55LPYREXtRepokgPxdwJcq1LDYHTjGfzmf2oIDANeXZ/MdYwFHmmJfbV9xTJ+wpqQrkuJaHPK4pyWK+F7ZTe/fzM8wwvJwG9DLqrMqc3zjbA1iSg/7tCrC6WMCIBbaPaNQjIBvq4bOBOTPfzrbgPaYHiCDCfNxEwUJ2UksQ0qIPkImAn8Y1/56zBIg4iCd0+GGP67n4S5ArF+23fNhJ6dIGmJdt0g1Z0gdbogr6H+AZq5gBls34xo4jtFIsE2yu2MHeMDc31YQQ/JKDHB1NgxLyue/qxAEB1FCeCcUlAX0jOeSgs8qXLHz8NXdCnZ0PjaTc7dD+HkrmPYV4faysKFRuj7ws4FOAJCkUAu/KNhyIcKVzKyH5vCpFSOhbkCsVbJ99KvKNFj+4zxh6vbxQtkoC+g0hmVVAT6nAormA2596LsLW7nHOR+ZCK7MC4HuqALhkCgFboXs2LSGj6nQR0oCWCCcdVZQfRGkRwoq4DT7NIXKY3NR70wsw7YF4HNY0JbYzCVhYPbJBECuwqEj4+O3FQhHcpJeucjGZI5InCZ/YjoALxDbCuTYsOY7/xIb5RtEoR/d1IPoe6HEUhXCYS3xBzA9hekfFOUWTnwjgHnrTT8/tQArqJFwBNiC6nwMspUAQ0I4qL3Lqio3lXWwfRigh6fdptztnGGk3IOf+6Wq2uXE2Y1ZtIFi2ajVHY2q9LniqFImA7Cr7+R7w3Lko5HuA3nySqMKLX5nJQlU8uFw37Yb8xpfRREWwaZ599C5HEelT8gQL3va9hj7Ni4pBgN6Xuc5yb88C4dECHjtgwBWBPOqADrfnoio7K+RyZirpbcd/RGsknML+zSPAu2YWNUSibQhHAruK9ce69AUW6qGCOQB3OJPNU7br3EwA05c1mMfH4e8m5tE4R/WdE8ur7og8SeMrnKHDJiFJKp/ZlYWfFxTpFwa13BRwKNEUCOgDA03QilAAHtGdY+LpzXUfz3gbu6CRXP+1uzwVsgYOUTAI6zO+g5G9ubIyaj0P5VNAHdqXDGJTrQKcrRuI9X7dfez8BQHM210DPFMOiEwotPCKSVs+KPDhgF5eK6I0nzqVYLdjNTc65qDWUaPrzSwGHAs15KAFdQBMALbhxFWE8FqtgVG+dzmXFwpdAwnFZhB+J7udbOdtzAVvg4EwUpdhdzvmbeSws4kOJ76yU0rGNUdjJIuM8FfSBXXlvQBXeRccrAIBWHA8xP7EHaT5CL05c6R9F/N+5QhTQhANF7kd16t0IOysq/jbiPrwXYXs7NXP6LgFdcCgADZFcAuN67XwCjVHReVy6oI9HMv/T7jy/VfA+2I/iKLCMEjdGvQ9gBznnnTZHx6BQBOys+2JLOm9AVT5FV0AAgBYMyVTH9iDpzEFKSRL6j4Z99qPSDgrY25soeMkLRHEOxQhhd5elnLN4ji8UkoCd7JRvd78DuuDQBeSci3nxAgA/+OaU/EagDVCivZMMotPsV1d1VDY1Xkj3862c79n9HGqgEi8s4018gxdnYxTqoFAE7KXredzGNx6oh2899Et8ANCiM3uQdEgC+oYoqPm+mAMCxvKLInovpvs57O52iQLhT1BkByZ2PwHd4AOAVijuwVhsMP+bQkVAiV4avKyL8rjeR0A1+5PE/zzPLc2K4ijdd4aEhZTyDbYxCru7m/OcKRQB7Ml7A+pzpIsYdEt8ANAi8xF69CYKSXZPQU1o3oV4rf3ofg57K6bgbkrpRJEd2IsO6AAAjE6hIqA5OeehYM2tKzsqi/J70v18K18iQRdapsgCLONNdP9YTErp1MYo7GXu6voKRcB+SuqEMav4xpvvQ510EQMAgLotuu5fkHOFKKBph+IM9nbi/Qh7KaKwTazdfi7gUKA6Oeed9m51QIe+vLRDJNREB3QYl0JFMB4VR8tiAX5cp6rq7k1Hpee99BxJXp+PNcb9FVMlGDq02LgwNkY/uemgbCrow4t0uUfpGw9N0CUQAADq1X0BfYXxoBvvly62XanuvxOwh9tdE1enEDGqYqxgJjqgQ0dK+NADUK1Dlw5GIymvLEMA4V3vJ2FEBxbnd6f7+Va+vrT7ue7ps1KIYk855yEx52uVBw/1O1wiMCM2RhVShP3Nsu+hgj68WHcJ6PGNl7gK9TtKKSkcCR3JOZujA0A7DmNdr0sppVcK4UNXzjUN2V7sC4uLht2VkvR94RmGvd3s+j+8n4Du4QOgCTYFGZHiHaHnBXmgXZHopxLiuHRB351N3+ct1pUWFiBJBZazRCGdiyjiA+xnrqRW683wMj2usw9z/aMCjgN4udNI3AAAAOpz0vE1O7f/AF05EGuwEw1WYD+Lv2dSSmea/cCL7Bxj8XsCuoQiABpy62Iyou46szxBMiHQKsm/49IFfQe6n2/lSoEpepJzvjCvhcW8iW8zUI9vrhVUoat19hhPfCjgUIBxCOAGAIB6Hfd47VJKp+IQoEvvorM3T4hCg96RsLvbnHMJBYfldsDL7Pwcb3ZAl1AEfbhznemAoEOYhoJFQJNyzsPY4crVHZUu6NtTAOF5up/Xx/P/cgLbYTlzf5sVWYGXmWst2LMKL1BIQNIsYj3EeB7a80YAN3TBXhEAtOcwEg27Eb9XHAL061zM1rNOCj8+KFUpex/2beFl9u+ALqFoObrPM7NuAjzomkElTMOiFFCaMRMNJLiO66DXSuK70P18K7fRDZq6WOt6OQkrsJw3MwejWceCl5GADuXrrTj2EOB9WMBxAOM7E8ANAABV6i124SxiNoA+HShC8SwJ6LCfImKZcs72beFldECvlHMPMC4d0GEab51XGIWkvPGM9s2PBNfbAn5TS2xmPM85et7Y56i3xAcqlXMevnFfXT9YzGzfaJuj8DLxzZyDZxX211P382EN/UMBhwJMYygucercQtPEmgBAm7pJNIy1iXcFHAqwrA/xPuCeaB6qgGj7rl7wRwzpw65m3Jfd6ngKOAao1c4d0P+w8feSIKAP1zrs0QGbggCUTJXhcg0VGn/p/SSM6DCldJJz1sX3Abqfb+V2gvvHnJianAkQgcUcD50Nc847b7rs6cr3CfZyM9dpyzlfp5TuzOlhLz3t2ZwVcAzAtE5TSueFBVsC4/FsA0CbjmZe81+S+Axg7UyO2IN0P6/bXcR+fbv359dhL2+KX5ZSerVarV7Ff9z8+3WRh172+UsbY1yKsYD97NMoYzMBXRdu6EMPCyh0TucomIyJGtC6Mwnoo/tog/NRup8/T+A+XRvmtimlW9W3YRFDgunxjOMYm6Own7mTQy4Vh4G9dJHIlVIa5vlHBRwKL3c/iPHXjU7+OwcybnSb+jmCftd/fa2wSZUOYl1PsDK0SUwVALRrzjX/RcTahH1FYG0ovnGacxZ7873jkg6GZ13F/tywJnu9RFHI+Hc++++NdeDNtd9XDe0ZDGvmFwUcx6ZLsb6wl7t9/kc6oEN/JqnsAwWZresNANCWodp1SunLarV679KORhf0B+h+vpU7xQuq9qrh3za3IVDkc18/GYpxOnMCus1R2N3c+x0S0GE/zRcNjg4opwUcCru7WQcvbgQxjpp8eK9w9ndBekMHvuiU8zr+ar2oDu+HxA5d0KFJYqoAoF1vW95/tjbRvZsniin9rGhi1z6mlM7HXu+qVUrptUIdxbuJNdTL2hoSbhzv/TXg1xtJ6a8rXQO+KO09Ek09CjgSqM5e65+bCegqK0MfTCBonQ1BmNAwEd61uwdAZc4koI9OF/Qf6X7+vDMbYFWzYTeSoYBHSunM2u1vru795+uR1rlePVA0QSdCVtEVYJY5sM1R2NsSHdCB3fUwtzNmr8ftOoAxghgXvT/j33+xGZSYUjqOxIhj8+uincd1AtpiTRoA2tX6+P2jtYkm3W0Uzft146/f9i2KFsUKXm106d3s1useas9BvB8UqPi3kxIOgh/cxFrbRYsFHyPe4LuYg0hKf7tRnLT0deCzAo7hIVeKusLO9k9Aj4Ek0AHBjHRAECBM62fnF2jZsOCXUrIwNS5d0Dfofr61UheuYQlnDXdGvrsXMLHa+M+/llD8aiMIY7URhLEZkKFjQNtOZgzIMAaF3c0ahBLzxTtBeLCb1guaxjz/XQGHwuOqCmDMOa8T0k8jEPE0ktF9f8ryZnj+a+vEBDxNIXYAaNoQt/CqxcS2WJvQaKENVxED/Vuy4hT3a/wz1//c+11613ug66RI+1Zt+DAUvW/x/bcHxQTL8iUalHQ3F99ISv8tPi7iUtZFSd8WthZ8U/A1uvStgp3tNR5Yd0CXgL4s55+53aqWTsNsCMK0jFvgBWLTh/KdW5ga3Yku6L/T/fx5X3Q/h++cRcJBrckG9yvzX5aSXL6Ne0EYDyYWbARjrJPV38Zfrb/Vb84EdJujsKOFEr4uJZrCTm46OF0KqJXpNtaizmsOro1500nMOY5jXck8oxwfBS5DU+5cTgBo3nGj83gxCPW6jTXniyhIt6iI07jc3BONWLfj+GNNol7nva9hRIKv4vJlGBLPPyqK8B9xLs7X8ZUbHdKPC4ghKHnsdNlwQw+Yyv4d0HWyXJxELuZ2bRJIo+5UpIbJGbcAJZkkQXXo1J1SEsw5Lh2BdD/fxZQb5NeuAbUZNvpTSheVdC64iufs20Zl/uYLSmwEY3wnkkTebvyxoV2fg5TS8UxBPzZHYTdLJbVKQIfdtN79/MQYrzhX0TVn8aDtMcWc47cAxFhf+mh9owjWPKEtYk0AoH2vW/uFYhCqdBedx6vo+htz3uHPaSTwnkpGr5I1DEUES/B1eIdIPH/eZof0jbiTdXf0Od+/Q25OsU2HhndaSqmAI4GqvCgBvbkJFfCkawFSNMrmPkxP4SKgGBNvxJxLABqdjkAqj2/jy8QbDTqrz8Tm5eg+FpiAfhXz8HWiuU3CeyJJ5CL+rO5tDB5X3NW+N8frazglm6Ows6W+O8Y3sJtmx4gxttP9vBxfagncfqmYa7+NJINzAd+Ls+YJ7bC2BQDta3HsXmxSGD+4ibWLaq9Z7AefRjL62/h7+Qj16H0Nw/rNcm5Xq9WJGKL9PBB3su6OPkeB3Br2QK4U44Gt3e3bSOYPW/z/AO3RTYdWmZjA9BQuAnoZV26dAAAgAElEQVQhAX18XVfTVXl8a4L34QHDZn5K6cuCSeg3kWh+GcnmOkLt4YGNwXUieg3d7Xt2PONv/9NqtXpV+Lk2Rp7OrWDBnSwyrxi+gSmlvyzx797BK9+WSV3Zi9hJy++1UwWFinAVXXO6m6PEGturlNJpBBC7H5ehgxi0QwI6ALTvcOjg3EpR5ZTSiaJkVRjWLj62Nm9cd0aPruglFlPnR72vYUhAX8bXSD7XMGQk97qjv9pogjBFQZAa4vhqKK5hzDat0vfuS7L3PEgH9DLoJMrcBAnTKhv7AMAoCkj0a1XP1XR1P3/elaRWeNKcG/c3Mcf+7Y/NwGnknH9LRo+EkZNIYrLpVJ6DoVhAXK9J1dD1IqUkAX0633LOxowVKP06RfErc9npXHpWie7np92fiGXpmhNyzkOg4UUEA+o6toxT+9TQBM8xAPThbUMF86xRla3JxPP7oqDDSUrpo0T0KnQZtxVJuvbh5/cl53zS24+eU7yDh3HNeexbHI+YjP6lhlihdUGUAg7lUbF36x00Efu28/gp/i0SoJelAACzioHArbNOY24lq8AsSu/EBqXzDNVF98HxvYkFta7ofr41i4HwhNg4+jLRORoSzv+6Wq3+uFqt/ivn/DrnPHQRvJB8Pr3hHA9JIznnV9EB27pdeebsgg4AlO9Mt+lF/WUYO0s+/49hvphzPo75xF0px9WRdxHIDNRNB3QA6EMTMfu6nxdt2Of7Y865q07TsTYx3Jf/Hcn3lOlNvD96I19rfpLPZxZxJ+exTvxfsVb89QVHIY4P+N0fnAro1qUqYzRGkAnMw8I1vIwgtIoMG0EppSEh76j3czGyHqvpWpB93o3A8eYoeDmNsarGDwkJFxsdzgXYFiI6YJ/Hxv9Hc7BiSEAHAH4TSab2WJdxE13PFaR+xDCfSCldR2FNa5rzGuZvgmqhYtbH6MCwJrw5jhr+/qHio6831vd/NqagAZtJkN8eKTjy6l4sh8LibWslCVEMQpn+Gl3Puy3wHePqtyml41ifUMSxPCcdNmWRgD4vyecLi+/QOvbkVcQ7nOwwv/tinQTYtE5AN1mG/khApzUXrigAMIGho9VnJ3ZUQzXdV70sUup+vrWzmf49Fsfn89o8bXzDuzOl9GXPNZ2buCYXEjbKt5GIPgQQnQrOWNzB8E1XLAUAEOC9mO4DuLc1zPdiPepMPMCs3qeUTt2jUC0dGmnFbeyDXG4k2l6/9PuUUvo51vw3/0hMpyRXUVTh27q4whj7IDGufrVx39vzbUP111H38yLdRtE8+0gh53wRSY/Dnue7Ig6KtTcd7nv21ihlSTeSz8sSMZrDWvFZSul1JKKfPBODYh8E+I4O6GWwKMESTHJpjXsaZjJMQCWsAL2IrkFnkr5G11NHIAuyz7uNRMs5SECnBbt0Qf+67nSuOnGdcs4fU0rnEZxhHXlZx9afAKBvup8vYujUeTrjukETIsnsJKU0/PVD7+djRqfWAqFa9r6p1VWsV13HGvAkhVDin3u5uTYWSelvY83s2F4qM7rduB+vp4xfeigxL5LS1/e9BOBKNRD7Zt5Rlq+RfK4g2T1xTo6jaILYq7J87CwpWwf0edzFGIlCxfhnWMM8TSmtu6LfLxKi+znwAwno0KnomHWjGimN+Grxhgm9cnJ/8HNhxwMwtWET5BdneVRDR6CPrS9W6n6+NRvksINnuqDfrbucTxlwyLzie/k2uqEbkyxHZXwAwPx1XsP85q2CuPvLOQ+BhMP5+1zrb6iMBHSol28NtbjdWPu9WPKYY+15vRa9eiJ5AcZwtb7flt5fjqT0y0jaeR1jQEUY6vO61u9/vG8VPyjHn3POZ72fhOdE84/rKLgtb6EM3XRBj6KivtPzOJO4XI+YU17EM7Luin5ofRN4yE8RDM3CoiIkzE3HHlqx6KYKzZOADlCmqxmPSoelafSwWGlB9nl3upjBXk4jGWMVfx0S0v+Yc/455zxU2L+QfN6eoRv6arX6341rz7yOrOMDQL90P5/dUEi99o50RYh1lz/1fh5mchBd3YD6+N5QsmEt8K+r1ep/cs6vhgIzSyefPyTWpIekyP+O9Wp4qZsYx/5XznlIkCsuoWmYrwx7MhFb9hdr91WpuRPuaQHHwL+f9z9KPt9erPG8jfc7ZejlfSIGfB63Ec9AZYYx9nDthvlmzDsVEQB+oAN6OV5LBmYBw2L0ByeeBkhAh3lZkIH91byJ1a3oNPtVxf7RNd0FXffzrdmQbZdv3oSG5PJ1UHuJwYZMZ6hCH9+YCx0uFnGsOBEAdEvw3HxuovO5olojiU5jK53QZ3FizgBbGzo5398fGJJSxnj/32/I8/qpjncKnlCo4Rn5WFsR39j3Oxn2AGMMrYgTu/oS3TOreTfH3OVjSukskvlOdVotXpX7mGIQinEX6xbGkDuK9+XrlNK5MUIR3g1FNztINtWwdR7ivxrg2wY8RgI6dCwCVu8sdlG5rwJQYHYS0GF/OibW60wC+iQ+RlBmiwSmP+/OBkTTfPMmJvG8X8OmX0ppXdD0qPfzMbO3kkkAoD8ppZ8Fxc5G8vlEJKHP5k0nwdvwnKv4v1/e++u3JZ+P+Ka/jrXL1/HH80ppqkw8v28jEf081tMU0+Q5X+Ler/a9vJGIvr7vJQqXq9ZC2q3GVtRE8vkIcs4nsUZhvW15LcdtrYldmYc9dICG/UE3omLogM5SLkzgqJyAewBgclG86VZwxOia7IKu8vjWzhYIKBfADjQhuuC/lYQ+OxXyAaBPp677LCSfTyyS0N+KD5jcqfcGnVh3ML+Mvw5/rkt+j8exrePzxJpQmiGh7bT2xPP7Yo/1dRQkNgbhIUPRkpOW9ovjt7xNKQ1jwk8FHBI/OhgK09Q0/xwKXXmPLk7y+YgkoRfjuLb34R7ky03vizVdgLb9pKJLMVwHlmJDhdq5h5maxQcA1nS0nkaLlXRVHt/O7EFUNoOBlsQm7nEEvDCPwwjyAgA6EZ1SJZJO7y6STgQqTmwI8F6tVl+b/pHLszZIq4ZCIX9ZrVZ/XK1W/5VzHrr9Dwk4v3VqHpJMvcdhb8O3+VVryedrw7shxiB/LuOIKMQwB/hjfEuaKla+lnMeCi/8rzX8YtUWE2htYlmSzycQ44Mvzf2wuhx0sI5hb3d6GrECNO4nF7gYBjYsIud8YYGLiqmYxRwUifmRpHygV8bO0ziNYO4mqDy+tS+tBpMAzGndScUYZVa6oANAX44jEJPpCOKe30kkkjKNoZuiJHRaMSTF/ikSzl9HsvmFOA0YzToB97iH5yqScf9UwKGwvHXRheYbzwwFWqzhF6u2+DdzjGVZt5hIJKFbo1hW6wUuDgs4htZpJgjQOAno5ZCAzpKarJ5KF0xYYBmS8mF/np+KReCHsfP4DhrbzNApfzvOU/ve9H4CYC4R8KLzxXwUZQOAvpi/Tu9UEPe8Yp3zRBLMpI4b/m207za6FP9XJMWeSziHSQyJVq97SMDdFF3eJaH37c+9FF1Yi/mOJPTyVBO/EwWuFMdbzp+sW0zurST0RR2mlJoswN1SQ5SC3VozAGjfTxKfi+E6sCRJNNTotrdNGBZjAQIY05GzWb2z3k/ARJrogq77+da+6n4OMK4I3PzitM5CB3QA6EQEXuqQM62/xliWmSlkNbl3gpyp0NVqtfrfnPPQkfZMADlM6kvO+XWveyWS0Ls1JF//T3TC744k9CLVtNZv7rYc6xYzUCivCK2+ZxQWn574L4AOSEAvh41rFhOLWyqHURuLOsxFsihAmRapLhyBIF/dE6NrpQu6rmjbUcgBYBqn0aWMaVknAIB+CPCe1k3O2TleUATRW+uczkmrP4zmDAXt/jvn/DbnfOnywuT+knPu/hsR45C/FnAozGOITX3Vewfh+P3dP/8FqaJgVErptX2JxVi3mJF35OIU0mNf1hEAOvCTi1yO6JQGS5EAQG0koMNyLDQBJViy84ZxyDSq7oKu+/nWrgQxAkxjozsAE4tuqABAw2Ke/841nszQ0eq40d9WGx3GpmN+RunWHc9Peu3CDAv4U85ZMeMQSX2a5rRvKHj0Ntavu5dzvlB8oRi1JHVLgF6GdYsFxDvyS3c/vBwtrmPIzwKAEUhAL4sBDouJqqI2lqnFFxugzEFFv0epqgp0LTY8dBcd30HlmxkChrZTwnm6KuAYuqDYIswvinwIzJje69Z/IAAgcXRiH+31lUEhq0kdWRuhUMP+xh91PIfZ/Sni8/jesZjFpg0xfseSz7+n+EI5KhmvS4Jexql1i8WcislaTIsFL6zLTM84D6ADEtDLImiNpemCTi1syDAX32YAHmPsPI0qNzN0P9/arYDG7tjMg2V8FLQ5OesFANA+CbnTuco5W1srSBTc/Nr7eZiIZBFKM3RcfR3PPTAfyeePiOQ+Y8M2Dcnn5lWP09W6DEXvZaaUTqKQP/P66ru9HIXyFnWYUrIHyq6unTGA9g0J6Dp7lsO1YGkWc6nBlaQVAGpkgbY55xK7JnEYm6i10f18O84TwAwEbc7C2B4AGpZSGhJGD13jSdwJIi7WqfXOSbjfKcXQQfB/ho6rutDC7P4sie1pOeePOp0256vk86dF/OOXko+xE6UX01bQan53CkQsL96Rf+39PCzE9xsA+MGQgH7ktBTjbe8ngGXFJpNFLUongJo5CSgHxqTgVENi7KxDyDSqSlLW/XxrtwKsAGZ1JnlkUvZVAKBtAi2ncxYFkyiMQlaTOYr1Q1jSl+h6risZzG/oAO37uh1FjNtxY061Nff98oodq6eUhhijdwUcSm+sW5Tjo73ORbT2DbcmMz3nGKADP7nIRZGQQgksalGyIWlFohdz8m0G4CnGztOorQu6+2A7AqwAZqRYzvRSSorWAUCDBHhP6ja6W1KuM91HJ6FrIUsZkjX+OHSg1fUcFnGjA/T2ooixcUj9hm/PW9+d7USSq4ZRyyo5NtA3ZH7WLQoS3xLd6Od3kFJqaR1DcvT0nGOADkhAL4uuKSzOohaFs7jD3EyMAXhUjJ2vnKFJVDHu0/18a0Owie7nfZKcCcuyjjItawYA0CYB3tNxbgsXwd3mEeN729oPogo3kQCoOB0s4877fy/GIfWTfL479/2ySt7LNIeen3NeGAVqFqOQHgDwHQnohdE1hUJ8jIVwKMltLCbAnASTP8KYBSjAt0IugvHJNGrpgi4gYDtnhQWblPL+6EHJXQOgeVEs58aVnox5MQC0SbDxNK5yzpct/rDWCO6exLuUkjUS5nQVCYDXzjos5kQS7u5iHCJmsV5/9u3ZXazjf63tuJlWFMLX1G5e1i3KZa1ufhLQ2YU1L4AOSEAvj0Q3FheLWmeuBIWR3MMSTIwf59wASysigVRA5qROSz443c+3dlfg/FICOtATa3zTkYAOAI0R4D0p+3x1cb3Gpwsuc/mSc9Z9Fpb115zzhWuwN+uZdRoSN127/Sl6v5xS1/klf87PPLhQURjgqvfzMLODlJL3ENuyZw7QAQno5fEBphRnKopSkBvdz1mIQDNgTALM2mWcMo2jlFLJz40NyO1cCHYEWJRg1+kozAYA7dFRaRq6iFVG0c1JCNxmDkPyuW8ZLOvW/tGL2Xetz5251MtE0Qrj72UcFHpcnql5Wbcon/HV/KxjsC35bwAdkIBeHh9gihAJAkV3HKQr7kVml1ISSA7AtlRzn06Rm0i6n+/ERmDfjKlhYbHGd+M6TOJNg78JAHonwHsa1gbqZM1zXArUMjXJ51CGU0V5Xybn/E2X0+p8jOvGyygmy28iFkHTnHlZtyicLuiLkIDOtg7i2wVAwySgl0cCOsWIyuYCVFma6oIsxTcZgK1EIMkXZ2sSbwrtgm4DcjtfBJx0z5gayiBwbSKK1wFAO1JKw/zl0CUdnX2+ep1HN0vGcRjvGZiC5HMow1V0MebldEGvx03OWeGicTiPCykwHkHS57ysW9RDnM68DqxjsAOFFwEaJwG9PDa1KY1NKpbmHmQpKrIBsAsbwtMpahNJ9/OdeC4AyiBwZjoCLwCgHfajpmFtoFJRdFMS3bgE4zKFr5LPoRiexfEYg9TjtPcTMJYo6q1ZFCsJ6LOzblGJKBRw2/t5mJnxLduy5gXQOAnoBSq0uxudyjlfr1arv7r+LOSvOiayIAnoAGwtxs1XztgkSuuCrqrydq7iuSjRr4WfO4BR6dwwKR3QAaAd9ujHd6sLaPUE4o/Le4ax3UgIgGJ8Ed80niiE87WV39OwL9aeR6f7f+dSSsOew5vez8OMrFvUR7zOvKxjsK3j+IYB0CgJ6GXSNYXSfFQ1jAXcWixgYb7HwNgUtmifDeHpFDEu1P18JyWP5UtNjAeYks4p07B2AAANiPn+kWs5OsnLlYviguYS4xG4zZjuhnsqkjSB5YlvGp/E5vK578fnvl9GSeN03c/n5T1WmZzzecyFmMdRrJvCcw58wwDaJgG9TILWKEpsWKmazNxObZayMNXYgLFZkB1XceMEGx2TGrqglzBXtgG5nSsdDwi+fVAOxTemYe0AANogOG4aijW2wXUcz0Eha5y04Vg8BRTjr7qfT0JH2rLp+j+BKAClUVTfFK2az51vTbWsU8zLe4ltiakDaJgE9DLZcKI4kTzwF1eGmXzNOVvcYWlvXAGAcsXma4l0dprO6ZL/ct3Pd2LDj7VDZwKKIRhwGtbyAaANCnGP74vEyGZY5xmXwG3G8BcFQKEo9gYnEMnNN839sHZIMJqOb3zfFMibz4V1i2oZe83Le4ltHaaUrLMDNEoCepmOej8BlCnn/NHCLjO4E+jD0iLBDAD2ISBzOu8X/kYLpNjObc7ZcwBQHh3QAQAekFL62f78JBSabkQE5H/t/TyMSAI6L3UVsTtAGXSBnpZE3DK576dlLtWplNJQ8Pag9/MwI0nMlYpv0FXv52FGta9j2COf11mstwPQGAnohUop2XSiVMeRIAxTOVFZkAJIQAdgL7HR8cXZm8wigXW6n+9E8CNAmay1TEMHdACony4+47vLOUuaaIvkr/GIBeIl7ny3oDj2RKZlDFIm9/203PfzK2WMbpw3n6GovqTUummKMJ+DyvOa7JHP68DzCdAmCejlsulEkSKhRndqpvJVQAqF8B0G4CUspE5nqS7oAim2c6f7OUCxBNJMQzcSAKif/YDx2etrj2s6noPobAj7UMwfynKlC/TkJOKW56v7flrxrb9p+TfyKAno89H9vH4XmunNyvopu3iXUhJnB9AYCejlsuFEsSJB+C+uECO7VdyAguiADkzBGL8TOedLm8KTmnWRWvfznVSxURvPKDOpvBo2NEOAOgDAowR4j0+ycmMiych653jsFbCPK8X8oTgK8k5MIm6RJG3Ow15mZ1JKP69Wq6Pez8OMjKsrF2ME13E+Yj7Y1S8ppVNnDaAdEtDLZaBG0XLOQ9LHF1eJEanWTUkEfgBT0B2xLzbfpzN3F3RVWbdz574HKJ5OABNQaAMA6hVdiK3ZjetOgmSzJMGMxz4ku7pTzB+KM4x5JKDPwxikHLeKPM/mupPfyX/YZ5jPTRRZo37Wn+bzpuJj97wv51NKyZwJoBES0Mt1MHNAPezjVJVRRvJnC9QURkVRAF4kgk4keU1nliqpup/v5ExBKYDiCVoDAPie7ufjE/zbLtd2PJJL2NWZJBkojkSK+VjTLIdC1PMRR9kfc4T5+IY3IgogisuaScUFuc2llzU0mbmOQrAAVEwCetlMKClaJBcM9+mtK8ULfM05W6CmGCa6AIzIxtV0TlJKP8/w79H9fHvudwAAAGpjP358EiUapZj4qBTCZhdDt1nr1FAeeyLzkYBeDvf9TKLwjKTK+ZTQLM76xHwUV2uL6zkf7yn2NayD/SOldDZTrB8AE5CAXjYDNYoXSejHFrzY09BB/8TJozAS0AHKd1XJNVJkZzoHU3dB1/18J1904OEJNpCA1lnHB4B6vXHtRifwt221rMsWr+LOYcxv0nVwYC83OWdJ0TNxrovxNeJEmY97fz6HS/7LIxlPkap53IhraI5iefOpdR3D97QcH4aO9CkleSMAFZKAXjYbTlQhFnrfSkJnR8P9cmxxmgJJQN+OZxd2oHpjn2Lj6mvv52FCpxM/W7rKbM+54inG1wAAQHEkf07ixr5f8wTtjsd6Cdu4yjkr7AHl0QV6forgLM/3aH6SKvthfWI+3mXtcU3nU2UhT2uVxRkaznxOKUlEB6iMBPSyHUbHNSieJHT28FY1QQol4GMLqkzDzrxb+qUL+nQm64Ku+/lOau1+flvAMQAAALAcAd7jkyDRPtd4PGKB2IbCn1AmiU7zE1+2rLucs8IL83Pf98P6xHx8wxsTycUK1cwkpVRr/KP4oPIcSkQHqIsE9PKZWFINSejs4E+SVylYlZX6AChTzvnSQvakpuqCLrBve7UGnAjaAAAA6Jt9+PFJTm6f/d3xKFrLc65ifwEoy41mG4twzpclYXMZ7vt+mBvM407McrN8p+ZT63qqb2q5vktEnygGEIARSEAvn41vqiIJnS38SVVUSlVxhT4AyiaZeTqjd0HX/XwngiABQHAYANRKMdrxWSNoXCTciQMYh3cQz7GvAGUy3lmG874s538B9mC7Ym4wD89Uu1zb+dS6JyoBvXy/JaIP1yqldBaxewAU5Ced2IonAZ3qSELnCX+VfE7hfHcBmMKFsfGkTkb+h4+a0N44QZBsQ2Im0DqV2AGgMiklewHju805/9raj+JBOsaNRDAtT1D4E8ol5mkZkoaWpbPscsT3N876xKy8yxoVOQtisuahAzpTGxrRfFitVv9MKV2klI6dcYAy/OSDWrxDm07UaCMJ3SIYa19yzpJ5KJ3kGABGF8G3NrOmM8ybR0lCTyn9PEFCe6tuBUGyJYmZAABAaQR4j88aQT8koI9HLBCPUfgTynQX8XDMLOcsxnk5VwpNLcq93z6xivOxbtE213cehxFXVRtj+Dq9W61Wf0sp/Rpd0X0zARb0k5NfBZVbqFIsug+DvRtXsHtD8rlEHmog6AyYikAyBIxNa6zzexrVVHmeexoAAIBaCVYbn0DOfkiCGY99SR5yo/AnFMuzuSzxh8tw3y/LPKt91ifmcauYSfN8r+ZT43vL81+3dVf0f6SUrlNKpxq8AsxPAnodbDpRraiAOdzDX13Fbkk+pwpRme/Q1dqKjT3YnUWvcVW30RqbWVcFHEqrXtwFPcYCp72fyC0NG7TnVRzp43RrAAAA6Jf99/FJjOiHaz2eGruGMb0z5xiKJbFpWfZ1luG+X5b7vn3WJ+ZhHts+36v5VPfeioaKtOFotVp9Wq1W/5SMDjCvPzjfVTDBpGqRhH6cUjqLCkT04885Zxuk1ML3dns2OICl1foeGsZFbwo4jlYNHblfkhSt+/n2Wuh+PmwwvSvgOICFROGRzQrtm3PC+/+3tdcjfStun6i0/usjgTD3AyeuY80NAIAdRECa+f/IdOvtiq5R49HtkPtaKPwJLTPeWda1fdb5GecvTsJcwzTLmZV3WeOGBOOUUu+nYS61rmXcRPIy7Vgno39KKd3Eu/5cwQGAafxBAlEVDlJKby3mULuc81Bl6DoSbwR2tO9PNkepjAR0ACaVc75IKd3aRJzMb13Q9xmD6n6+k7vVanVR0fGyPAFhzC6Sijb/bCaUl3BPHj4zHnioQMYv9/+Le4EUVxt//20jKWQzoV13PQAACZ9TuG3vJ/GYnPM3Qd2j0aGJ+8RXQLnuJDIsTpzz/K5KO6AOue/bZn1iPvIv+nAlNmEWta5lXEtAb9pR/PmQUlrHtQ1/LhX1BxjHH3R8qsaxCRAtGJJBIgn93EC+WcPA/VTyORWSgA7AHM6i+ibT2LcLuu7n2zuzOA+UYCPJ/O1Ggvmrjgu9vHnk75meIDEAqItv9/h0xO6PIpvjcA65T4wFlEvy+fKMOefnvl+e+75t1idmoohMNy4loM+i1tyP4T3wvoDjYHoHca1/u94ppat1QvpQWNP5B9jPH5y3ahzrxkYrhsn80NU/km8M5tsyJJ+/tWBDbaLrqaIYAMzhPJKkJTtPY+iCPoxHty7gpvv5Tu5iHgcwm0g0f73x55X5G4UxrgOAuihGOz6F9PvzTfL0OFJKr+2tE74KhIaiGe8szztyfu77hQ1jg5RS1+egcRLQ53HVw4/kN+bWM9k1LqsQ7o9+vYk/n1JKtxvJ6Ma6ADuQgF6PIYj+lc0GWhEd805SSheRhCNQs343kXyuGyI1EnC2GxNv2J33DL8ZxkoxBlaIaTofd3zmdD/f3oXxPjClIfD+XrK5KvUAAIxNgPf4rBXA/n527ggXTgQUTYwEPZKoBdOyPjEP77J+uNbzeVXbAQ/Jxoq6EAU1Pwx/Ukp3sRZzKR4O4Hk/2QysynHvJ4D25JwvYiFFlbm6fZF8TuUkhgIwJx2kp/VmqLa7zb9B9/OdfazseClEdLCG7wzv4JTScUrpY0pp2PD9v9Vq9Y/VavU5Nv0knwMAMKqYmyhCNz4Bvv2RhDceSScM7nLO584EFE3ToIXpUDg/zbKKIa62XUe9n4CZWLPoRHy37no/DzOpNf7DN5VNB9FAaIhP+VfErJyKbwJ42E8G1lU56f0E0KZh0pdzHhJE/mzyV6U/55xPJJ9TOQnoAMwm53xtUXty2yZK636+vS+NBZoIVJqXDRp+S/ZJKZ2klM5TSsP75F+r1epvq9XqF8nmAADMxNxkGhJTYH86oLPS/RyKdycRlw7Zy4YJpZQUopqPb3hf5EXNo9Z4a3FCPGWIWfm0Wq3+OcSzpJTOhoYKzhjAv/3kPFTlKLqzQZNyzmcR+PHVFa7C7Wq1+p+4blCtqFamouhuLMwCS2vhPaSbybSe7YKu+/nOdD8HdrLR4XydcP7PqB49VJE+dDYBAFiAYrQTkJAFLyLxhJUEdCieRCZ6ZIwP01IgbyY5ZwmnfXG951HrO8z9wbaGeJYPQydPc6oAACAASURBVEOFlNKvKaWLaLYglw/olgT0+qiiQtOGLto55+E+/99IcKZMfx02w6N7J9ROwNnubDQBS6v+PZRzPjfendxzCdO6n2/vSjA5sI3ocn6aUrrc6HAu4RwAgFJI9Byf9a0+Cdgdj8BVVp4pKJ7YqHLoyj0f+4LlME5ok/WJedz08CP5ju/XPKrc+4+CFHcFHAp1GWIL30WzhX+llK4jJsa3HOjKTxbIqiMBnS4Mg/yc81Ah6y8G+0UZrsUfc86nQ7GA3k8GzZCADsxBEBkP0QV9Wo92Qdf9fGe6nwOPGjbWUkpnG13OPw3vYGcMAIAC6TA2PoG98DL2Dvgq9gKK5xmlR5KeYVrWJ+ZhzaI/rvlMHovHqoAxDi91FDEx/xhiZCJWRo4f0Lw/DIvYKSVXuh7vhkB5mw/0Iuf8cRiYrVars+iYxXK+DEk63j80yMRvd94DsLsj54wHDGPcX5yYSZ08snmg+/n2rqIKMLzEaxt5bYlqzicxn9LdHACAWlijG9/PFQecsj8dfsbjvYQ1Myif55QeiQuCaUlAn4cmjZ0ZYlvkRc2m1oJ6F9HNGsYwxMp8GP6klO5i7jjcY0MjTgUxgKb8weWs0rFOefQkEp5PUkofo/OeRPR53Q7nX9IJLYqkCclnO8o5W5wFGEEUhPtifDup98M8YnNRV/fznVl/YAy6eTUgpfQq1iVPBMjz/9m7+6O4kqxf1PtMzP/otQAm0gAYC0RbIMYC0RaIsUC0BU1bILBgkAUNFjQYkDFgwQgL7o1sZbVKCKQC9kd+PE+EYuac9577VuWmqvbOXL+1AABqk+9nGV96NvjdugI8mzoMKJ8gbjlci5moC4LJvbbEsxD+69OdmuBZ7OWgbW3Sa/7Q9qVhIVu5ucGfDQ5CCNf57+3cvTXQgr/l93DtalbFpFa6lEIjMcZU5PyPPI2baaWH8F9ijDvC5zTMbyoASztxBSZ3fO9/gennm7uNMbYaQLe5DxsKIRyEENLB2H+HYfhV+BwAgEoJoANF0iCja7eKkKF8PqdFcS3okbrNxuSG+cxDAL1P7hfmUeVeRh6K+LGAl0L7Ul3N+2EY/ggh3IQQTlLtjesO1GoVQNcZsC5vPIDSM0H0WfyWHg5jjPfDOtAaD3NPd1vbCwYoWS5a0RRuWm9XRZymnz9Zs88D+VAJeET63gwhHIcQ0mflP6suzQAAULF9Fw8olAB6vwQjoHx3rhEdunTRYVJ7lnceBm91y3PWPGrey6hxcjt12x6G4V2qvUk1OCGEU2F0oDZ/c8Wqddj7AsC9IPpvNv1HkQL9/4gxHglk0LocRDO57+l0BgUYnyno01sFqU0/31zL08+Zn0aKlQgh7K9NO3/vOxMAgIZ4LgGgNAIxUD4BJgDGpgEVTEvt+zxqbqYhgM6SUg3O2xxGX01G15wGKN4qgG5Duz4C6JDlIPpR3pj52XTeZ1kFzw/Telb4+uE5dA8DZmGDaBJNHRbkkK9mStN6mz+Lpp9vTvicMfktLFwI4TCEkIopfzftHACARnkuAUqlQUa/1OsBUCKNF2BaAujzuOzhTfIgv2PzqLaRfR7Qd1bAS4HVZPQ/chj9KA/XAyiOCej12vXjAl9LDwQpvBNjTJ+Nn/LDgSDP4+7y5HjBc3q178o/iw06eDrFYyOLMbb4XWQK+vQuTPLd2J2/SehDDp6n/YAPab/RZQcAoGHO1oFSaZDRqUbPOqA1GkXQI5NjYVr2J+bhu6xfrv1MKh/KYygHpUlh9F+HYfhvCOE8hGDIHlCUv+cXI3RYpzQF/bj3RYCHxBjTAcBFCOFVnnJ8YILXX65zmOQ8d/GC7uTvBt8Jz+N7A2AaaWP7vbWdlPD55k48K0C78vPQUf7nuxEAgF5su9IAFMRERgCAPgmgz0Ozp3659vOpdihPypmEEG7tGVOolG94k/9GU03pqUGTwNJWE9B9GdXpsPcFgB9Zm4qeAuj/NwzDv4dh+Njhwt3lifD/jDHu5TURKKFnOoM9n/tGgAnkTcIza0shepl+flfAa4BZhRCO8z39e+FzAAB6EUJQ3A1AaYQioA7qI8riu3MeJv+Xxd99e6oNbEIN1MbPqvY9V4NAKd12ru1JU9FPQwj7rhiwlFUA3Y1Wnbb9iMDmchj9ZC2M/nMO+bQaOliFzv8VY3wVYzyMMdqQhM8E0J/PASvAdE6tLQU46+hAzvPRfIQ9FhZCOAwhCJ4DANArzyQAlMbeJNRBfURZ1DnTHUHKJu32vgAz0Uyjb9e9L8BMat9zPTe4goq8HYbh9xDCVar/ceGAuf19+PyAmr6ELH6dDj0kwdPljbnTVcgnhLCXA6mpqcPripf0On8nnMcYfTfAA0IIqYvoG2vzbA42ACaS7t9CCNcOHFmYDr9MYduqLiM3rzx1DQAA6JzpYkDJDJ7ok1ArAADANNS48kMpSxJCOMlN/KEWqa70Qwgh1felv99TDYuAOfzdKlfvIAXp/GjAy+TJ4H91mM6B9HTQu5f/lRoCusyvO4XNL3wXwEZMP3+B/H0JPI3iMZ4ibQx+sGIsJE0/V/gIDQgh7OTgec1N9gAAYCx7VhKAkhgoANVwZkKP1B/CRHLjaOahxrFvfsvm0cJ3WqrTOxqGYauA1wJPkYZQ/JoGzeRGCidyRMCU1gPolwoSq7SVg3SnvS8EjOl+IH34svmzk//t52kJcwXTb/Ohxup13TiQhGcTQAegZOd5c9vGNkuwtwCVS40q0wHTMAzvXEsAAACAIt26LFAHTXvpkcEUQAuE8LqXfsve9L4I/Jgp6DRgK//9HgmiA1MyAb0NR4rEYXqPBb5zcfdqcsJ6N6+9HFLf1NVa17Wb/O+TTV0YT/682lh6vstaXzhALfLG9qngIAu41OQK6hZCWDWp1MQEAAC+ZsIYACURaAUA6NOO6w40pJXvNFPQaYEgOjCp9QD6hQno1doNIewJqcIy8s3ZKqghsAFlM/0coH49NMM4EUBnAccWnSmFEPY1OZhGCGEnB8/t7QIAAACUzx4ZAECfBNDnYcgOmn7NY7uFN5GHxaQA+ocCXg681CqIfhhCOI4xGnQLjOJvlrEZR70vAABs4NAivYhiCIAZxBjTQchHa82MrjsNBru3oXr5IPRK+BwAAL5LgTcAJTGBCupw5zoBAFRJAJ0nySHda6tGQ1KDiA8hhKs0MMSFBV5qPYCu6LZuByGEV70vAgA8Jk8FFMp4GcUQ8DwKXHmOE6vGjPy9QWXS800IIe3n/po7GAMAAI9rYhoPAM24cimhCj6rAIxN/RDQlFyX3QoDQWnR7jAMv4cQTuUNgZdYD6ALFNUtFZoe9L4IAPAdfidfzgErPI8DJJ4sT6O+tXLM4DZ38gUqEUI4MPUcAAAAoFpq9AAA+qR+aB5qHPHMNZ9mvtdyrd5vBbwUmMLbYRhuQgiHVhd4jr8C6DFGN9v1O+59AQDgO3SnezkbcwDzMpWaOdhLYC466b5Q6kYcQki/Df8x9RwAADbT2BQeoE32TDqjRg+Agl26OEAD1Dh2zjMXL3BsYAwNS3VGH0IIF85NgKf6273/7++sYNW2Qwj7vS8CANyXfx+3LczL2JgDmN2p53Qmlv6+zi0yM9mz0M+XD39Sx+13tb4HAABYiEIqoHS7rhAAAADAsmKMqYGFCdG07vUwDFchhANXGtjU/QC6UFH9THcFgG/ZEHg5Xf0AZpY3tYWDmdJJ/jsDCpYbal0pSAcAAAConsmyAAD9eu3aA41pbhBBjDENBvilgJcCU0rT0P8TQjgNIbyy0sCP3A+g31ix6r3JE5EAgM9hjfRgpEvXy7lPBFjGsXVnImn6+Unni6sRI8ULIaRmk7/nwx8AAAAAAAAAHndhbcg1MUyvyeBqjPFYAzk68Tb9boYQmmsmAYxLAL1NAgoA8MWBsMYoBLTg+WzOjKur76MY440NbSZyavr50Pv7p3Cp0/AwDL+6TgAA8CL7lg+AgjhzBQAAmJ5nL14q1Z7fWkU6sJtD6IcuNvCY+wF0HZ/acJCnvQIAw3BkDUahURE8nyYY4+oxMNr7lGqm4e+KuWnIsqG0rxdCuMidhgEAAIC2aUDaF00xoR5qaQEAoFN5qMeBafp0ItU4fwghqCcEHnQ/gG6Tuw1bwnYA8GdwYy935uLldIQEWEiM8VxHVUZ2lqfrw5w0S9xAbiqZChtfF/9iAQAAAAAAgB/KdYwAVCTGmOqmTYWmJ+/SwAwDcYH7vgqg5x9I2iCADgB+D8fkPhFgWbpLMqZjqwnlyYUnF5poAQAAADTLmSsAQJ8EuYAW7bd+VfPgmJ8LeCkwlzQwQwgd+Mr9CejJtSVqwlYIQbcdALqVH3wO/AWMI8b4qYX3AVCxUxePkVyafg7lET4HAIDJKJICoCTOXAEAYFrqIYBRxRhPhdDpTKpdusq1TAAPBtDddLfDRDMAepYasWz5CxjFZQPvARahCyBjyY1AziwoI7BX8IU9MIqwFj73/AIAAONTIAUAAADQCQ35yTT/YlRC6HRoO09Cd8YCPBhAv7Iszdg2BR2Ajh25+KOxKQvPZ/OFMZ1YTV4oTT+/sIifOXie3evO3u9GhM8BAAAAuiIEAQAAMD2ZKEYnhE6HtoTQgUEAvQsmmwHQnRDCQe68xTjcHwIUIMaYvo8vXQteQBMDKIjwOQAAAEBf8j4/AAAAUKG1EPqd60cnhNABAfQOmIIOQI9MPx+X+0OgJL1PLD4t4DVQp9sY47lrB2UIIbzK3+nC5wAAAAAAAAAAFcgh9H0hdDoihA6d+yaAHmPsvZi/RaagA9CN/HDz2hUflQA6UJKun1nzBvZtAS+F+tgbgELk8HmafL7rmgAAAAAAAAAA1CPGeJVD6Or46MUqhL7jikN/HpqAnlz6W2hKmoK+3/siANAN08/HdRdj/NTSGwJogCnoPNVtbl4Ai3II8Zdz4XMAAAAAAADohnNSgMbkEHoamnbt2tKJFEI/z4M3gI48FkA3Bb09Cs0BaF4OtLx1pUdl+jm8jAMkpnBiVXkiewKUovvfxRBC+jy+LuClAAAAAGVwFtePu94XAACgY92fkwK0KA34ijGmEPqZC0wn0sCNCxcb+vJYAN3hRnvSFPTD3hcBgOaZfj4+D4nwMg6QGF3auLZpzRPcaVrwXZcFvzYaE0I40jALAAAAuOeTBemGejwAAABoUIwxZbV+1nyOTuzmARxAJwTQ+3Lc+wIA0K4QwqthGDRbGZ/7QoAy2cBjUye5aQGwoBDCwTAMv7oGAAAAAAAAAABtiTGmer79YRiuXVo68NaQXOjHgwH0GKNJl20yBR2AlqVpgluu8OgE0AEKlJ/bbVazCdPPYWEhhB2NQwAAAAAAAAAA2hVjvMoh9DOXmQ6chBD2XGho32MT0AeF7M0yBR2A5uTp50eu7OjuYow3jb0ngJYIFvMjZ6afU5juDh3ys8q5ZlkAAAAAAAAAAG1LtVoxxjQ49F+pDtvlpmGpFuo010YBDfteAN20yzaZgg5Ai0w/n4b7QaBEwrRZjPHUJjU/oAkdpenxwCE1C9kt4HUAAAAAZXIeBwAAANCYGGMaVrAzDMOla0vDdtUoQvsE0Pt0osMIAK0w/XxSFw2/N5jLvpUeV4zRs+rXTEHnMWn6+Y3VgeWEEA6GYXjrEgAAAADfoekqAAAAQIPyNPRUQ/qzQTM07F0IQa00NEwAvU9bgnoANMT08+m4HwQo36lrxCM0J9iM+x0mEULY8R0NAAAAAAAAOJcG6FuM8TRPQ//Y+1rQrFODcqFdjwbQY4wmXrbtKBfCAkC1TD+fnI1vgMLlCdc2prnvMsbod3wzJkzNq6eDhlONsgAAAAAAAADn0gDkaegHwzD8NAzDbfcLQmu2ZTqgXd+bgJ5cu/bNSgWwx70vAgDVM/18Onc51AhA+Uy65j7P+5Rqr4crE0JIzymvC3gpAAAAQOEMCAEAAADoR9oLijGmYaK/pFptl56GvDcoF9r0owC6Q462vQ0hdFH4C0B7TD+fnPtAgErkAkVdUVm5VrQKy8kHKb+6BAAAAAAAAAAAPCTGmAaMpBqTMwtEQ05dTGjPjwLoV65580zKA6BWpp9Py30gjEM3P+Zi4jUrnvNhWQ5SAAAAAAAAAAD4rhjjpxjj4TAM/xBEpxGvQwj7Lia0xQR00pf7QferAEBVTD+fhftAGMe2dWQm58Mw3Fns7t3GGIVfYSEhhPSM8tr6AwAAABu6tlAAAAAwOuFHqhJjvMlB9J+GYbh09aic+kVozN+/93bSj1gI4c500eadhBAuUvec3hcCgGqYfj6xGKMAOkBF0vNcCCFt3L1z3bpmEv7T3dT2giu30+oby02yfAbblvbJr/I7XH9eWv/vqTv51XNW4V4H6PT3tJf/+87aZ0eDAwAAgLao0wEAABhRCGHvued1AEvLtdv7uX7gWI0AldoOIRwapAPt+G4APUs/YG9c86Zt5yCfIlkAihdCSIX3712pSemeB5TK99P3nQigd+3Opu2zCKDPa7vh93aiSVYzLvN3w03eG392qPwpHmgCdv7Y//NUOJND6jsP/Gv5cwYAAAAAAADf88rqwGw01pvIWhB9L2e93jb5RmnZsUno0A4BdFaO0rS8NPXeigBQOA1TpqcDKECF0vNcCOGjZ/hunfS+ALCU3HnaYV+drvPzT9oDv6plGsKPXudaQH1/LaC+p0kCAABAce43IwMAANqkPh9okVrjieXagMMQwnGunz9w7k8lTEGHhmwaQKd9W7lY/cC1BqBUgh2zcf8HUK9TAfQu3Qmgw6I0yarHbZ4snp55LmKMTXZkXwuof/VsF0JI/+fXy7wqAIDFuAcCAAAAFpUHCrgIADxLHjSaguipEf1hnoq+bTUpnCno0Ii//eht1DL1hVG8CSEIoANQMsGOeQigwwjy5EmYVYzxPIfr6MtpqyFKKF1ukiXMUrY05fzfwzD8I8a4E2M8Sr+XvjcBAAAogGdTAAAAADaS6hxijCep9mEYhn8Nw/DRylGw7VxXBVTuhwH07NKF7sZJ7ooDAEXJTVIEO6Z3LYgBo3FfzVJMwu6Pa041GjxY0CSrTLdrofO9fAB70/uiAAAAUBxDQQAAAMalXotBrTE9yI33U239P4Zh+MXQGgqlrgoasGkA3RTMfmwPw3DU+yIAUCTBqnm47wOo3+kwDHeuYzfOhCpfROMdns308yKdDcPwU550LnQOAAAAAAAAfdlzvWE2zuMLkOoiYozHeSr6T7luQu0gpXgdQthxNaBuAug85H0IwcMXAMUIIRznJilMz30fQOVijClQe+46dkOX0BeIMZoyxUv4/JXhLnfzTtPOD2OMnmkAAFin8RhQLM+wAADQlUuXG2iMAHph0l5Trpt4NQzDz8MwfOx9TSiC+iqo3EYBdAceXTrtfQEAKEPuenXkcszGfR9AG2za9eGj6b6wDNPPi7AKnu/kbt6+DwEAeIjGYwAAAAAAdCXGeBpjPBiG4f+E0VnYgQsAddt0Avrgx6Y7uyEEYT8ASnAyDMOWKzGL6zw1FxjHK+s4OgXDG8ohPN2z23fS+wJQpVZ+Hw8LeA29uh889wwDAABAja5dNQAAgNGp1+pcCGGv9zWAdammYhVGjzH+v2EY/jUMw1muvYA5bIUQ1FlBxZ4SQDcNsz/HeeosACwiTxV8Y/Vn434PxmUze3wCZk8jnNy2yxij325qVP3vY94ve1vAS+lRapK6J3gOAABAAzzXAgBAXwxdmId6LTQhmI/vtQrFGM9jjIcxxvRZ+WceAKBRIlMzBR0qJoDO96Rps6dWCIAF+R2al/s9gIakzeJhGG5d02ZpMADL0ZV3fun37KfckfumtzcPAMCLuH8ESqVIGwAA+qIJFdAUTePrF2O8ygMAUvOOfwzD8HMeDGA6OmN7Y0Au1GvjAHr6YfEj0qXXIYSj3hcBgPmFEI6HYdi29LMSQAdoj2YubbrNDQaAZQigz2s19dzzCgAAT6aBEVAwRdoAAADjM/0aU/DhGdJeeozxNA8GSN+lPw3D8Jvp6IzIFHSo1FMmoA9CSd061mkEgDnl3x0NUOZ1qRshQJNMyW7Tce8LMDIHJWwshHCgUdasfs6Hm55VAAAAaI0aLAAA6MuV6z2L3Q7eI9+nCcE81No0Lg0JiDEerU1H/3ceIADPZeAHVOqpAXTTtfq0ZWoeADM7zb8/zEeRC0CDcmDvzLVtSpp+7hl9XIKt86q927huvPO4G4bhn77vAAAYya2FBApkTwoAAPriGQBoie+0juTp6Cd5gMD/G4bhX3k6ur13nmI3hKBJCFTIBHQ29TqEYBItAJPLEwVfW+nZaTQE49uxphTCFPS2uJ7UrvaDBAH06aXw+X6M0RQIAADGcmMlgdJ47gUAgO4Ia84khKBmq2/7vS/ATHyndSzGeJ6no++sTUe/7H1d2Ii6K6jQ35/yklPXkhDCdeo64WJ36TiEcOEQDICp5K5WJtzN787vO0zCYQZFSN/xIYRLDV6acOdeCZaTm2VtuQSTEj4HAIC6KCqE59EYAwAAOpNrN1z2eex47oLJOdPnTylnmAeqnOQcwH4OGaf/3LZK3LOv/hHq86QAenYhgN6trfxFv9f7QgAwmVOBjkWYfg7Uwsb1850KoDfhJMaogzAsRxfeaQmfAwAwlQv7ItOIMZooBQAAAJTmlSvSNUNjYCG5ru18VZceQtjLgeNDOUQytVdQob894yULKPVtN4Rw3PsiADC+PE3wjaVdxEWH7xmok+DtM8UYUwD9tsoXz8pd7hYLLMchyLSEzwEAoDIhBAW9AAAAsLlLazULw/b6ZuLyPJzt80OpBiTGmAaupO/l/xuG4edhGM5yHRx92sqNCYCKPDmAHmO88GXfvfchBJ3MARhNCOFVnszKMjQYAuiD39q6nZt+PpmbRt9XqaqcOpj3wrYKeCmt+ln4HACACXnum44AOgAAAABFyLXIzEMNE0+S6t7SEJ0Y42GMMX1W/zkMwy/DMFxbye7II0JlnjMBfTAlkxRccIMOwIhOhTkWcy3MBtANAfS6Hfe+ABMSRGATDj+mc5YOGVt9cwAAFMFzHwAAAFACDZnn4Wy3X6bqzsf3GS+Sp6Mf5+no/8jT0T8amNsFv9NQmecG0E3JZFt4AYAxhBAOhmF4YzEX4/ccplPlhFfaFWNMxdZnLnGVzvL1A5ZzYO0ncTsMw1GD7wsAgLJ4pp6OQjEAAADYnEExMC0DFmdi8BVjSnVxeTr6QZ6O/tMwDL+Zjt4szUKgMgLovMSbEIICUQCeLYTwSgB6cRedv3+A3vjdrdNJ7wsAS8rPLbsuwiQOHUwDADA1Td0AAACAQqjVm4ehIf0SapyHUDCTijFexBiP1qaj/9vfXVO2Qwg7vS8C1ORZAfRcFOjLm+TXEIIbdQCeKzW12bJ6i7mNMV51+t4BupQ2Zz3PV+fS7zWtqfAQwUS/aXzMv0sAADCHW6s8CbUCAAAAQHFyk3H6I9A4D03mmU2ejn4ijN4c39dQkedOQB9MTWPNuYc0AJ4qhHCk0+Tizjt//wC9Mk27Lse9LwBNqu0QQaBiGkctvikAAIplCvo01AkAAADAhjRnnpUz3j4JNM7DIA0WcS+M/s9hGH4bhuHO1aiSYSBQkZcE0AWWWNnWkACApwgh7AlTFcGGNlAbhcIjiDGe2nitxqUD6FnozMyPOPQY31k6GGztTQEAUDT3n9NQzA0AAABPo15jHoLIfbJXNQ91NiwuxngVYzyKMaYmqf9KdXauSlV8X0NFnh1AzwWCty422Zs8yRYAviuE8Co3LtmyUou6izFqKAQTyd91jExQbVSaiNXBdZqHzsz8yGsrNDoNyQAAmJt9pWls2QsFAACAJ3E+PQ8B9M7kPSp1yfMwTIOipHr4GGMaLvGPNBBBs5cq+J2GirxkAvpgCjr3/BpCMBEKgB9JQYNdq7Q493EwLd35KN2JK1S82zytHlhQCMFv+vg+aioDAFTM/WG9FHdPx+cCAAAANmePYh4yDf2xRzUfE9ApUqpFiTEe5nDzL4LoRZMlgYq8NICuEJr7znU4B+AxIYSDYRjeWaAiCKADdCwH/z76Gyia6cC0rKaDXx13x2dPGeBhzlagDj6r9dIEaTqKewEAAGBz9ijm4Zy3P/aoZhJj1EiDosUYP8UYjwXRy2YoCNTjRQH0fONw63qzZmsYhgsLAsB9IYQdQYNi3MUYBdABMAW9XHemn9O4mkI7DjvG5VkE4HG6vANMSFHkpBR0AwAAwObsUcxju4c3yVfsUc3juoc3SRsE0Yun6TMvppHBPF46AX0wPZMH7IYQFMoDcN95blTC8ty/AZA2WC80lSuW5gBQjn3XYlSeRQAAWJJ9kGko7gEAAIDNCaDPJITgrLcv9qjmcdPDm6Qt94Lov7m8xfC9zRg0MpjBGAF0QWMe8jaEcGhlABg+b+SdmOJUFKEPAFaOrURx7gTQoSg2qcflWQQAgCUpjpzG6xbfFAAAAEwhheBMYJ2NYFtf7FHNQxMNqpWD6EfDMPzTNP8iqMmCSrw4gB5jvNIpnEd80DkMgNyQ5F33C1GOuxij0AdMzwEGtTh3sFmck3zgzExijBfWenY1HSBopDUizyIAACzM899E1AUAAADAkwhwzkP9VidCCDu9r8GMfH9RvZSDjDGm34hfXM1F+Z2GSowxAX0wuYbvOHdDD9CvEMKeCZ7Fcd8G89CZb3xC0hPIQefT5t5Y3VwPelDFAYI9rdFdNvZ+AIA+uUesm+LI6SgUAwAAgM1pkjcP+xX90BxxPvZYaUaM8dg09EWps4ZKjBVAVxzNY7ZyCN0PA0Bn8nf/ef4toBwC6ECtbF5PR7OYcpzFGG96XwQoiHDRuBTSAPxAbuYIlG3b9amaZ+7pKPIFAACAzdmjmMduD2+SPzlfmYm6JlqTpqHn/W1DFeanLosx+DuawSgB9PyFe1v6m2Uxu8JuAF06O3ujGwAAIABJREFUV4xXnLsYo99kAL6SDwZsoJbhuPcFgMLYoB6XZjIAP6aZL8CEcl0D0xBABwAAgM3Zo5hJCMGeRR8E0OehvowmxRg/xRjT78WZKzwrORPGoL5vBmNNQB9MQecHXocQ/I0AdCKEkCapvna9iyN8DsBjTEFf3kddgqE4NqjHpZAGAIASKJKcxlYIQaEvAAAAbECTvFkJoPdBvfI8fHfRtBjj4TAM164ywNcE0JnT2xDCkRUHaFsIIT18vXOZiySADsCDYozpN+LW6ixKEwB6Ukuw2xTaEWmyAbARvz1QASHb6imSnI6CbgAAANicJnnzsJfXOFPuZ2VvlR6k75Q7V3oeIQTDQaACowXQcwGhTh/8yK85mAhAg3LhnfBUmW5zuBCYh41tauQ3fDmXMcaLXt98ITRgmNd2Ja9TMcJ4FNAAbMZvD9RBs4i6KZKcjjoAAAAA2Jw9inmo4Wqfazwf31s0L8b4aRiGA1d6NgLovJT7gBmMOQF9MAWdDZ2YDADQnhBCKrpLwaktl7dIwucA/Mip7p2LOe70fZfEZGYAAIA+KJKczm4+KwIAAAB+TJP6eWzJLTRP8GwmMUZ7q3QhD5I5c7UBPhNAZwkpmHjhYQ6gHcLnVXCfBsB35e6dGpbM79b0c6ADvucANuPcBOqgoLFiiiQnZzIMAAAAbMYexXzs57Xtde8LMJPLLt4lfGGgDNTBFP0ZjBpAz8XqH0t9sxRlFULXAR2gDSncvOtaFutaUR0AG7JxOj9rDuVyUA3A3JyZAMxDseR0BNABAABgAzHGm9Sw3lrNQgC9USEE13Y+ms7Tlfw7bQr69JyP81LbVnB6Y09AH0zX5AmE0AEaEEJIv/1vXMuiuT8DWmATewZ541QR9nzS9HO/03TJQTAAPEh3bqjDnutUPQ1bp/MmhOD3DAAAADajFmYe6lvbpe5gPvZU6dGJqz45Z268mFzq9EYPoMcYz4dhuCvwvVKmXSF0gHqFEI6GYXjrEhZPsA3mp8iSmvndmI9NaqAXN640wEZ054Y6ONesn+LuaZmCDgAAAJsR6JyJBunNsg81H3uqdCfGmH6nr115KJ5GBhObYgL6oFidJ9p1QwpQnxDC4TAMv7p0xfsYY/zU+yLAAoQGqFaeyH3rCk7uzv5JUdwvwbQE0AE2ZGosVOG1y1Q9Z9PTOmr5zQEAAMCI7FHMR1C5Mfk8Zbf3dZjJtTpkOnbu4kPx1FhMTACdUuyGEPzdAFQid4P84HpVwe8rAM/h92N6Jw5niqKzPABQCoejUIEQginoFcvP45rvTWfbVDEAAAD4sTxZ9c5SzUIAvT32n+ajpoaeCaBD+dRYTGySAHp+GLou6Y1ShbdC6ADlCyHseZiqxl2M0bUC4DlOrNqk7qwxDEUHdkyfBWBBCqagDnuuU/VMGJuWKegAAACwGXsU89jOta+0Q1OB+fieoluaxUAV3ONNbKoJ6INCap5JCB2gYHkDLm0kbLlOVfCbCsCz5ElgZ1ZvMuemn0PxG78C6AAsxW8Q1EEhQ/0UTU7rjcZeAAAAsBF7FPPRALYRIYTU8P5N7+swI99T9O6q9wWAwjmPmtiUAfRzXT54JiF0gALlDZtz4fOqaAgEwEv4HZnOcatvDACAF3M4CnXwWa2fosnp2f8AAACAHzu3RrM57OR99sD08/ncxhhvenmz8AgBdCjbruszrckC6HmSlwcinksIHaAgOXyeirG2XZdqXNr0gWWEEEzAogkxxrRxeu1qju7MbzTQIdMEADb32lpBFez/VC4/m9/2vg4Te2sKOgAAAHyfPYpZ7arraoYA+nxkwmAYPlkDKFsIQW3ahKacgD6YlsYLCaEDFGAtfK4zUF38hsJyXln7SegiuQzP9eMz/QsAgO9SAMcLKYKZh2YRbVA8OT37IAAAAPBjF9ZoNqagVy7XNL/pfR1m5PsJfA6gBmosJjRpAN20NEYghA6wIOHzat3FGP1+Aq1RQL+A/Hty190bn86l6efFclAwP5u+AHUyhWUeunPzbPl8lhloFtEEz4LTMwUdAAAAfkyTvPmYnF0/TQTmZQ8VgBo4t53Q1BPQB9PSGIEQOsAChM+r5ncTgDF5rh+PqV/wxStr0RWBE2iHZjrzEECHOvis1k/x5DzshwAAAMD32aOYz3YIQQi9bgLo80mDNgyNAXgZ93nzcG47oTkC6OempTECIXSAGQmfV09QEIAxeRYbRzqUsZkI9RCwHJcAOsDTOByFOvisVi4XT172vg4zSGf9Pi8AAADwiLxH8dH6zEYAvVIhhD11zbNS5wSff6d9FqB8qcmQ+rSJTB5Azw9EitUZgxA6wAyEz6v3McYoLAPLMtGVpuTflTNX9cU8z0JF3FOPzv0RwNNs5SIqoGwCtW04730BZqJxLgAAAHyfcNt83uY6Wepz5JrNyt4pADXRZGgic0xAHxwmMiIhdIAJCZ83we8kLE9IgBb5fXmZ2xijNQR65hkT4OkEW3mJW6s3iy1TnZuguHseuyGE4x7eKAAAADyToOe8BJkrk+ubBcvmk2qdrnp5s8BifM8wJue2E5klgJ4nBl0u8QZpUgqhX+k8BjAu4fMmpA0fG9EAjC7GmO4Rrq3ssymwhm+9tiZ9MckXmiGkN5/DXt4ok7ixrLNR8Fi5XESpacM8jjwXAAAAwMNy3kJdxnzswdcnXbOt3hdhRs4EIQsh7FiLyXxq9H2tc247nze9vNG5zTUBfTAFnZGlcOSFEDrAOITPm+F+C4Ap+Z15HtPP66CbKkxP0ATgaXYVM0AVBNDboLHrPFKBsD0SAAAAeJw9ivlshxCE0Otiav28fB/BF85seQkB9BmFEJzdTmC2AHqexqlzOGMSQgcYgfB5M+4UbgGNswmzvPP8e8PT+H2uQIyxh26qsDQBdICnczgK5ds20bkJiinnkxqsHPfyZgEAAOCJ7FHMyx5FJXKzgO3e12FGdzn/BTA1NXuMTY3FBOacgD64SWcCKSx5o7AD4HnyFCXh8zacC04BLYsxCqAvLP/OCFM/zZ3J8VA1TTfGtd/Sm4GOuS+fl+krPNeFlZuVz2rlYowX7v9n9d4ECgAAAPhWjPHKwL9ZpeaSzjDrIIc0L+Fz+Jq82kTyvU/r5Dvm9dag4/HNHUA3LY0pbOVJ6H7UAZ4gf29eCZ83wwYblGPHtaBVMcajYRj+bxiGn4Zh+GUYhrNhGC47v+CX+d9veU3+ldfn/2KMrzSIgcflhlgl6+GQY067NvihCQLo89qt4PcSEEBvhaLKeZ36jQMAAIAH2aOYl7rLwpl+vgjfQ/A1e9k8Wych+9Jogjyyv8/5vywVXYcQ0rS0d3P+76ULKYT+Rwjh5xijiXwAP5DD5xf5+5P6fTQZGIpis4mm5UD1xf2JerloeCd3/Hy1Nun2daXrcbcWPr3KnShv8r9PNgZhFDuCjN1JG/z27gCe5ij/g6fQCGteW6kI0hll9VJR5dveF2FG6XzqPE0Z07wPAAAAviJrMa/XIYSDGKPAbbk0CZjXnc8DfMOw1Glct/imKMKR+rRxzRpAz048FDGhD2mSUozxxCIDPCxtluUbKuHzdvjdA2BxuRnKzf1g+kpugLOafLv+34e1sPq6sYLrdw9MMb65F3r96zXHGB98/QCMQgAd6qcJz/wOQwjHwnk8kc/q/A7d59QtFVWGEO6cncxqNwf/H9oXAgAAgC6lZvghhOv83Mw8Tkx8LpPp54vwWYBv1TqAp3Q9nX/f+j2b1W5ugKwWeCSzB9BTQXoI4Uz3cCb0awo2xBgPLTLA1/JmzAfL0pRrN8cA1ODexHC/XZRI0ID7rhwije5Nbh4pRAmVSp/fEILLN6+tHGzVgBDK9lohQxNMQZ9f+uycOtsHAACAr6RGh79aktlsp9raGKMGkwVJ58qmny9CAB3W5MF/TKOnhto3AuizO1SnPJ6/LfS/V5EMU3sbQrjIDx4AfH4AOhY+b5L7KgCAcZgSyX1C0tMQLIH63bqGszvq7P3ycu5tl6EYsn7225eRzvYVeAMAAMAXAqDzO5E7KM6RsN7s7mKMvn/gawLo0+mpLksN2vzS2dNOb296KosE0PPUs8sl/nfTlTShKoXQ91x2oHe5cOd97+vQoFtdNwEAqFjpezY2/6chRAn1u3ENZ5emr/j+ZGMxRvcxy/hzCnqPb7wVuY5Bo5VlCKEDAABAFmNM+/AfrcestpxjliMHxlyP+Qmfw5rcmEQAfTo9TafWPHwZmoePZKkJ6IOLyEx2cwhdsQfQpfTgE0JIN+dv/QU0yf0UlOm16zK6u8beDwCfld5B3ub/NFKI0hR0qJtg6zKOTV/hiYRol2HPtn5C0MsRQgcAAIAvBEHn997gu2Kc5KYAzOvEesNXDnwXTaqnxvdqLJbxVp50HIsF0GOMF6agM5P0g/+7wlagN7kD4IUgZLPubDIDHREABIC2CGZB3dyfL2PL9ydP1FPRRknSFHTTMOomAL2sVAx0oekKAAAAvYsxnhrYsAh7QwvL+6tvul6EZdzGGJ0BwteczU4oxtjTWabv1+X4HI9gyQnogxt0ZvZBx3SgF7kLY7pR3XXRm3USY9QNCwAAJpIbaDKNNAXdBj/US6h1Oe9MX+EJFDIs51R4tl654Ekj/WWlxsoXfvMAAADAgJoF7DrHXE7eV5X3WIbp57Am/xZsW5PJ9HYOI/OxnNQ8/KjXNz+WRQPouTPX7ZKvge6kjulXij6AloUQDodh+CNPRaJNdzZ7AABogP2Zvh2FEHZ6XwSolAD6shResSmFDMvZ8lmtnuu3vN0cQj/ofSEAAADomhrBZbzXGG8x52qfF2NPFLJcyyKwOq2uGmnHGDUOX9axGrWXWXoC+mCUPQtIh9U3IYR9iw+0JoSQNgA+uLDNM/0cAGB8pl3Pr4ZDe5MPp7NlagNUy+HostL0FUWHbML97bLe5GaxVCg30r9z7RaXnhn+Y+oYAAAAvcphJeeVyzg38G5eeTrp657ec0HO1CTDVzTDmF6PNQcGOC9HjdoLLR5ANwWdhaQvj9/zgwpA9dJGVwghFRS+dTWbZ/o5FMzBAwA0xyHrtHZzIzWgIgpQivBOsJUN+Kwu78SkpKrZhy9Hmjp25fMEAABAp5ylLWPb2s8nDxb8tZf3WyB/65DlGpZd6zG5HgPoNwW8hp5p9P8CJUxAH0xBZ0G/hhB0KAOqlgtubnT+64bp51A2RZAA0BZTfqf3VogSqmTiyvIEW/muPB2JZW2ZlFQ1RZdlSQV/FxrM8xK5ofehRmgAAEBN8rC/OxdtEW9CCHIuEwsh7JhKuqjbGONFx+8f/pLDqYYBTu+u03NM37XL0+j/mYoIoJuCzsLepGJihVpAjfIN0B+5kI0+KIoBAID5CG7N44MNfqiO7tzL28pBPGcbfM+11Vncdv6sCqFXJsaYfus+9r4OhdnKDead7fMkIYSDNJhgGIb/pefP3Aht3yoCAAAVMa1xOe+dY04n75ueq4FelCYLX/aP7Dl2LH/Xv+t9HWbSaxBbjUUZ1Kg9QykT0Ac3LiwsFX/8oWM6UIvcof80F0nQj7Nc9AYAAC3YqeA9uP+ej0m+UBffj2UQQudHfFbLsCuEXi3F3WXazWf7Jz5XPCYXDZ+GED4Nw/CfPJhgnRolAACgJvYolvVBI7Px5X2di7zXwzLuTJ//y2nec0zNLw/tO/YlTz6XyZiPADpLE0J/omIC6KagU4jUMf3cDSNQslxQmm6837pQ3VEMA/Sq1w0ngNZtl/7+YowmoM9HiBLq4h69HKvvT8VvPMS9TDl23evUJ8aYfu+ue1+HgqVpNDeazLPyQOj87XcmqL12/wQAANQixpiec85csEWd29sbj/B5MU7y90vXcghxtYe0m4PI/8v7TAe9r0/r8kBAk8/n1WWtQT5zohxC6E9Q0gT0QaiKQrzJB9UOG4Hi5Jscmy59Mv0cAGBawjk8RuBkPqsQpQ1+KJ/fzbKk78/fBfB4gEKGsuxqGFElE8bKtpWbzN94juhPKlZ/Yuj8PjVKAABATTzDLEsz7ZEInxfltPcFyB77fk37TP/Je48nPv9tyXuLBgLO77bzYSBq0MryIZ8vGGL8A0UF0E1BpyCrYi0FBUAR8kPOae6qtmnRBO24G4ZBATHUwSYjQL267+rMo4Qs57WlyyyUL09DcJ5TnhTAO3dAyhr3MeX56wzSZ7UOahiqsZ2fIwTRGxdC2ElNd9I9T5pE9YzQ+TpT0AEAgGrk4TWXrtii0rPnH/Yenk/4vCiGYn3+m9zPe4vfs50nZKfP/1Xem9pZ9pXzEvm6pzO01xZydr03z+7+e7dAbzUZ+rHSJqAPunNRmHf5JtEXCbCY/B10pcNW105yYTdQPoXDANAewa1l6DIL5fP9WKY36eDaNHQGzSJKl4rVrgQfq6GGoR6C6A3KU85T445UnPff1HQn3/OMwecbAACoiWeYMmim/Qy5Flr4vBy+Tz576jrs5r2p/wqj1ymEkK757xs0HmAa552va+8B/FLt5iYjx+rUHlZcAF0HcQq0m7tZKNYCZpe/e/7wkNO1NP38pPdFAACgTZUEbmz+L0eXWSibAHq5tvI09O7Cd34zHuSzWq7tPA39oqcgeircqK0gTw1DlVZB9E+5YEgRaEXS73ku3k3fj/9fnnL+bqLzUlPQAQCAasQYL0xBL8afzbR7X4RNpeZywudF+Wj6+Z9/lzsvnIAtjF6RtAeYrtMwDO97X4uF9V6D5dy2bO9zs/+uguib1Fj8fZ6X8mSpo8iHQl8bfVoVa6WHn0M33MDU8gPo6QsfbGmD6ecAALCgGGM6KHQJlrPqMvtLjFEXdijLhQP64q3Cd8e5weFpK/tMef90b+3fzqpwLYTwf/bTvnI14pRYpvE6B9Ev8+e0mcLVXLCw+rzu5/+evpuu8/9dTdQw1Gkr36+8DyF8zJ+x3iesFCd/V+yv/dua+TUeKnwEAAAqsprcyvLe5mfaA9mCx+UzCudJZTEU67MxB1Suwugpc3SdMwDnvhuWl0OkJ3kAAsv62PsZbmompAateKtzpaPcbChleZr4Ls/fh+tntntrNRY/5WZXDyoygJ4O1fNEBqE7SpP+JlPR8XGM0Y03MInc7OJ0geIKymP6OQAAlOHSXuXi3ufn5aPvbXgD83E4WpXttaKXFL5LwbuLGg5K1w5BV/82mUax2l/lM80i6vE6T+I9yZ/T1We1+GKc3BRi56GChUfspv83NRVs5BqG44kmMDOP1IzjTQjhLv9OpDC6aSMzu1fgtF/Is/bbXAOiIBgAAChe3pt3dlmOXdmCh+Vw/qmp58W5dN7+1x7V4UT/v18Po9+u9vut+7zyNT7K/2QyyqA57GfXfhurkL433qV/a41FLmo5VwohrJ/Zrv5977vwu416S52APujORcFMQwcmkR90Tk2jYY3p51CfV64ZQLU83/M9F4o4irC7Nh302AEtFEGRW33erPYfc9HLRf53s/T36jMOQR8jgL5Gs4gqbeVJHH9O48hFDRd5mv3VkoUN95pCrD6vz/0dOBp5wswcTEFvw3rRkALQia1NN9/boDnFkmr8TgIAAPolZ1EW2YJ7TD0v2nHvC5AdzBRK3l7bi7zLe/3VNIqukeB50QTQP7sQQK/OqrHIsPZdfpHPbUuosbg/2fw5zbQPvvc/LDaArjsXFTANHRiNqec84DbGaKMH6rPnmk3CJCJgculgRzBnEbU0bzE5tCyvBdGhGFfOcaq2fS/kOuSO65/Wuluv/vPmJYUwOXy2+t3fz/+5t3YYOua+aJpu+0pjx684c63b7nohSv6sXubP6tXafw650OHZf/u5SGFY+2wOa5/Zsf+GDmoLe5qC3iQFoCPK3yHrTSpq+u05FEAHAABqIWdRrFW24KTX4UN5b+DU/lmxTD//Yol9oK17jaKv10KMF861XiafRR6tzj0pzpm/8b9c5HMJ6nT/uzz9x20efnR17/z200sai9+rsVj99521f2Peb22lTFuM8cFGESVPQB/yl/8fBbwOeMx6x7KjJScOAHUy9ZzvED4H+MLGE0C79mrocJuLOO40DSvOKoieNvJP8tRCIRGYl8PR9qxCrqvCxb8asDzQrOf6kee1sQPlz2EK+tcuFKM2Z3U9vzlbeOCzevnIm1/6b2I7FU5UeL5qCnq77hcN3d4rAPWskY04UaMkqbgqTalz/wAAANTCFPQybeV99cM85K6L58y8V3BsH7p4h70vwPAl0FfC9OFV89k/z1pzIP08BxcF0jeQcxirZrcmSpfN9PMvNAJpz3b+98190APntquw+n0lnLMcPPZZLTqAng6bQwhnOpBQgfQl8UcI4ZdeO5YBT5eKGHKBvAAD910rcAEAgOJcaB5WrLQB/2tuFPkxb4af26P768B1fQIhjM3haN9KLuQQQP/axXozAbpTctHnwdr09irkKeiK2fqwnWtV/qxXyU3JrvJ3avrPm5Yb1K9N1lgPm7cQNP+eI/cPAABALUxBL156fv6QQug5mN3k2aXgeVXONFj8yxLTzzexu77vvDYh/UqDzC/WQucHaniqcfvYVOUepfuB/Pl2ztSn7YLPWQ4e+x+UPgF9yDekAujUYtWxLHXGVngHPCiEsJOLF2y48JhSNzcAAKBn5w6vqrCaWPghF92c58PYZoMhK7nAYyf/2y9kAjGNy4ejCtwo0ZtUgKIZyWe5GPXO7wIFOsj1ALU5MmGsS1v5nuev+548ueI6T6u4yv95k8PpxRaE5rPKVYOq/fyfe2tB815/L3ZT8L6H50cAAKAZaQjSf13Oov0ZRE/DqkIIp3nQXdUh0hz+PMx7ZC03qmtNjfuwo1sLL9fgfiD9foPMq15C6bkWYj9fO6Hd+mj6+a0Lf8sUaCt93z6Uhy0+gJ5+EPNUaV35qUV6kPo9T1s60mkIWJe7GR4p9OM7LjUxAQCAIrlPr89f4ZB8GHuxfiBbaygxTyLcWZtsvqe4g4WdC6BTqP3898lnF5rpUKAU9typ7TzVhDHuWRWCfvUdm8Ppd2tT/lfh9OTTI9P/P/0o/Lw2mfwh9/9n6//n1qeXj+VQo2gAAKAWOWdxZthfFVLN8Lv0L+8rndY2FT2EcJCfm+0z1+cXmZa/HFRcw/9Yg8zLtb3Hi9KbY/7IWj3Equm+ffj6CaB/6zzfF0BpDh6qkaxhAnpyIqxHhdLD1X4IIXUq0zEKOpc7b53oVMQGFLVA3XZcPwB4kr1alisXcFx7rqvW1tp09D+bnYYQbtcmFX5a+8/FD2Rz5/W9tYnmq//u748SadBBqQ4E0L9yrjCQQu1XWnxkwhib2ForkNyoUDIXjbIcAXQAAKA2R5UHKnu0CpB+yGH0tHd78aOmdHNLjSPz39a+veWq3eX6dT47bHAd1kPpq1qI9B/X9+ogSqqH2FmrhVAP0bYzDTC+lRsd37l/o0D7D72kKgLoqbNTnhj7awEvB54i/Ri8DyGkG9VDE22hP7lg/ESHSTZ0VtomIvBkJsgA1M0Eu/k9NrWtVKf2KJuynf9987lfC33c3ZtMuDqUXfecPb+de82L9tf+791TUpW0l5EbOvjbpTQPHo52zBkVpTqoMYCeG1T9siroA5qxlSa6xRg1sQEAAKqQcxYn9iiq9VdwNAfRLvJ55J//OdeE9LXm2KuJw3vOfZpxVNOk/Snl0HNPNUGrMPf36iGu1+ofVlPU1z33bGn9jG69NmJP4LY7pp8/7lzGiALtpt/L+40japmAnh6OTkIIR25kqVT6u/09dyk71MEF+pB/t449KLGhOxMVAACgeOcC6N3Zuncg+9CBtIIe+Pz9+M46UJjthw5He5XDstemR1CgmptFnOSJOWoYoC2H+f4WAACgCjHG4zwszR5F3bbypPE3a1OMV82yb+79G54yxTiEsLfWHP6hycPqnNt0HWMU/vzioJQXUpD1MyO1EIzt0hDX77oQQKdQ+/ebR1QTQM/Sg9HvRbwSeJ50U/bfEMJvKZSqmxS0KYSwn4uOFPLxFCd+FwAeJSwAQBFycMukfIBvXQigU6iDvFfLZ6ea6VCgNG14L8Z4VdvFyRPGUmPZ/xTwcoDxvEmT35zbAQAAlbFH0aat9Snp961NMYaHGIr1NesB89IA4/tSE9QPJb9AuvVNAP1vNa1E7nzxsYCXAi+VCvFSwfKxlYR2pGk6IYTz3CxF+JynuE1dSK0YwMNMqwOgMA5IAO6JMaY9sTvrQoFqnqw8BdNcKVW1n9X8G3hZwEsBxmUiFgAAUJW8RyFnAaycmTz8RWqCOgzDdimvBzqQshHqq74jN0B170aJvjm3rSqAnuk6QytSR7L3IYQURD90VaFeqQN+CCFN0flv6ojvUvIM7m8AAOhVjZPEhSwBHibYSokE0NfkBm/Xxbwg+KL2z+qhZwRojgA6AABQoyN7FED+HlCX/DV5HZiXwXybUWNBibbTcNb111VdAD0XRvxSwEuBsaROSh9CCFchBIVQUJkQQro5Tr9N71w7nukydx8FKudeDgD6kDvQuocH+NaJNaFAW/cPRxlMG6BEVe+r5RoGxVTQljepCblrCgAA1CTvUdirB45yXQNfaDYI8zH9fHPqzyjVV2e3NU5AH/KD0W0BrwPGtDsMw+8hhAvhJShfCOEwhJA2696nIkaXjBfQVQ8AoBxXrgUbUrgBcE+M8crZDYVy5vI1hQyUKDWL2Kv5ysQY0zPCZQEvBRiPwmQAAKA6McbUJO/alYNuXQp+fi3vPW+X9JqgcRr2big3Czmr4sXSm/oD6PkDdlTAS4EpvBZEh3KFEA5y8PyDh1FG8EvuOgoAQBl0gGYjOWQpXALwLQUtlKjqUOvY8n7kx7beFY1o4bOaGs7eFfA6gHEIoAMAALUyFAf6dOfz/yBrAvPRBOPpNA+nRF+d29Y6AT0VR5wr8qRxguhQkPQ5TJ/HYRj+I3jOSG5NTQQAgD+ft3YqXQYHJgAbXoGSAAAgAElEQVTf8t1IiQTQv6WQgRJV/1nNDR5M9oB2vAkhvHI9AQCA2uRm2r+4cNCdY0OxHqTJIMzHGckT5XzsbVUvmh7srr/HagPomU409EAQHRa0Fjz/PX8eYSxHMUYTNgEAYBiqDKDnjr0OAADWmKxMoezr3pPvY0xppjRNNIuIMZ74LYSmKFAGAACqFGNMAbBrVw+6cZn3JlkTQtgzeA5m8zHGeGG5n0Wjf4qznmGtOoCeC5l056IXgugwI8FzJnaZu1UBbTEJZRoK4gEomc69AN9yOEpxcoERX1OIRmlaOos5tKcFzVCbAQAA1MywP+jDnc/7ozQXhPkcWetnU2NBif6qsah9AvqQiyNMGqIn60F0DwowsvS5EjxnBr6/oU2K2adx1eKbAqANpqADfCs33fPdSGk8s39LIQPFaaVZRIzxk8JGaIbPMgAAUK0Y45Vhf9CFozzck2/Z24F5/OJ76Pny2p3V+vpp1s7qjVUfQM+Ht0Jc9CgFYz+EEG4E0eHlcvA83bh9EDxnYh6wAADK5T6N5zAFHeBbJitTmh1X5GsKGShUM5/VGGNqdvxbAS8FeJmtEIIp6AAAQLVijOks89IVhGZ9zI3zuSeEkPabd60LTO4232/wMr7LKU1TE9BXh7cfC3gpsITtHET/FEI4DiG8chVgM+nzkj83q+D5tqVjYh6wAADKJoC+jKqnHJqCDvCg9N14Z2koiODYwxQyUJomJqCvxBiPFHhDE0zKAgAAandozx6adGuY53fZ04F5+B4aQc7GOlOiJH8Ndm0igJ55MKJ3W8MwvB+G4X8hhNMQQlMFGjCm1NEshHCSwyXvBc+ZkQcsAAD4VgvN9DSaAlgTY/xkCjqFMQH9AQoZKFCL55sH6higehrZAAAAVYsx3qhdhCYd5DM5HmZPB6b3Wz5vZBzqzyjKakhyMwH0fOPkgwafvR2G4Y8QwkUIwYYBZCGE/RDC+TAM/x2G4V1u3ABz8YAFAACNylPQr11fgK+cCNxREE1IH+d8lZK00JzqK7mOQaEj1G13VWQFAABQqxhjqp39zQWEZvw7xnjlcn7Xm4JfG7Tg1jnjuHLW5Lal90T1/mwe3tIE9PRBO9GlH77yehiGDyGETyGE4zT12fLQm1QMkBoxhBBSB8ffPUyykDsPWNCFFic0AQCbO7JWAF+Ygk5pQgie2x9gCjqFed3iBcmFoD8X8FKA5zuwdgAAQO1ijEeaakMTznJ2ikeEEOzlwPQOc00A45I5oSR/5lCbCqBnhyZqwDfSlOf3aepzmv7shpoepGLCEEKaQJeC5x9MuGFhHrCgDyagAMDzNPEbmsNbHwt4KQAlMQWdknhuf5xCBorR6pThGGM6szor4KUAz7Nv3QAAgEYc2LeHql1rjr8Rezkwrd9ynRQjy+dJmodTijYD6DHGGxM14LvS9Of/pGnQIYQTU9Fpydq08zRJ4o9hGN7mBgywpI8xxnNXAACgCpoGLaOlaaRHCjYAvjAFncIoNnqEKegUpqXng6/EGA991qBa7iMAAIAm5KyFQWZQpzsDsTZmLwemcx1j1AhjWpqHU4o/z21bnICeHoyOc2cf4HFpGvS7PBX9Kod2Tf+gSiGE/XvTznddSQrx52aPiwHwIrokArOJMV5ZbV4iF2w4BAD4minoUAeFIpSi9fPKA7UMUKVt9RQAAEArckPKf7ugUJ0DdS0/lgc0yhLANO40spme5uEU5M9zkSYD6JmwF2xuN4d2/5dCvCEENwQULz0chhCO0zT/YRh+N+2cQuk0CAAAnYkxngiUAHyR90YEWymBaRffkYvWzop9gfSk2Qnow5ffxUPNWaBK7iUAAIBm5DNN+4FQj59zIJEfs4cD0znMwzmYnhoLSvB6aDmAnoskfingpUBtUoj3PyGET8LolCZ1lQ8hHKWp/Wl6/zAM7/M0fyjRxxjjuSsDAABd0hwTYE2M8VRzDqjCkVAsBWh+wnCuZdj3eYPqKF4GAABac2TvHqpwls/a2Iw9HJjGb7IR88lnSb/18n4pW8sT0NOH7dhDETzbljA6Jcih88MQQrpZ/d8wDL/mqf1QsjuBE+jSa5cdAJ5lp7Vl0xwT4EE6dLM0z+0/kCczHxf9IulB0xPQV/Izg7NXqEsX308AAEA/8n5gCmreuuxQrDQMSz3y0wigw/guY4zO++d3rJkxSwsh7DUdQM8OfdjgxYTRmdUDofMPwzC8cRWoyGHenAUAAH5su8U1ys0xLwt4KQBFiDFe6NAN5YsxnmjwDfPIv40/W26ohmY2AABAc3Kd44G8BRTp2jCspwkh7LRagwILutZQdxn5Pk3wn6W9aj6AnjuH69QP43kojJ6Cwq+sMS+RHvhCCEchhCuhcyqXug2eu4gAAIDmmADfODZJhSWl7twuwEYUtLGkrgKeMcZTIXSoh3sJAACgRTlvYWIwlCUFPvcNw3oy32UwrjuD+ZaVz5EMQGFJOz1MQF916vdhg/GtwugpKPy/EMJFDhA7dGUjIYT9EMJJCOFmGIb/DsPw6zAMu1aPit0pzgQAqJ5pj4wmxnjjGQHgi3ww7XuRJWmmu4FccPpL8S8UGiGEDlVRCwEAADQp7wnan4AyCHw+n70bGM9dboRxZU0XZwAKS+ojgJ75sMH0XucA8R8pUJynox+Yjs5KnnKeJuafpwn6wzD8PgzDu2EYti0SjTiw4QMAUD33c4wqxng+DMNvVhXgsxjjhe9FKF+M8VhzJpaSzpN6W3whdKiGImYAAKBZ9iegCAKfL2MCOozn0HdRGfIAlKPe14HldBNA92GD2W3n6ej/ydPRr/Kka4H0jqRrna/5+pTzNDH/TZ6gDy35LRdQA33+5nVXFDsjG1gAHQghNH0IGGM8EuAC+EoKtt5aEhag8OhpNPhmKV3utSnyhioIoAMAAE2zPwGLEj5/ud3a3wAU4uc8cINC5Hu0j64HC9jraQK6DxssazdPuhZIb9i9wHl6+P1fvuamnNO661w4DfRLAH06JhED0Ip9YUuAz2KM6T7/wHJA2XKRmwbfMCNF3lA8AXQAAKB59idgEcLnL9T64AOY0c/5XoDyHKo9YwGvugqgZz5sUIaHAumnIYTDEIJD20qka5Wv2WmecL4eONdBjJ4c5sJpAACAB62FLU0RBfgSbFXABoXLBSZnrhMz67p5tSJvKNqWBvsAAEAP7AvCrITPxyGADi8nfF4wjf5ZSncB9PxhOyzgpQBfS2Hlt8MwfBiG4Y8QwqcQwkUI4ThP1DZVdGHpGuRrcZyvTfo+/SNfs7cmnNOxf9v0AQAANpGfHexNAmQK2FiABrjPk6agX9f4wqlW95/V/Bv5kwZWUKTuv6MAAIA+xBgPNcmDyQmfj8eeDbyM8HkFNPpnAa/+3uOqxxhTcPKXYRjeF/BygIdtDcPwOv/7Uwjh/2/v7m/jOLY+AZeN/V/cCMSLCkDjCDSO4FIRmIpgqQiuFMErR/BSESwVwZIRvGQABZAZkBFoUfZpu9QeUvyYmf56HoCgLcCwWMXu6a6q3zn1Bat+WJ6nlGq37et6PRu/7Ysu9PXrMKqBrWJOgO9dlFI+GxMAgFm5bt9F2ZvFdA8rpZzlnN9HQTeAxasH2GI98s3Sx4K90LH0GWqB75zzOp6V7RXAnsS5hnXsjbr2YDwUzwcAABajBtFyzsneJuyE8Pl2CaDD8wmfT0g8n62jkSjs2ptFBtDTnxfbH12VHWiCSdkUSk/RdeM6wumC6U8QDx2H8dUFzt0X4XHqws+RsQIAmJ1rUzqI+k56tpQfNjYCagDuv0bw1wEYg3Ws7742GzBOTQhdEBb2qB4+jUItZ/bwYDQE0AEAgEURQoeduKlnkIXPtyPOX9hnhOcRPp+gKPR/qNEO+7DYAHo4igNNDknAtL2Jr393P0UsdNy1ofT2q5SyiEBBPFBs+tLRHF6uLvzcGkcgqJ4JADxJKeVzBElUowUWL4KtR4KtMG4RhD1x0BT2q+5rRgGIMweJYBTWpgEAAFgaIXTYqqvofO4M8vY4vwlPV/NWJ8Lnk9adsVDAmJ1adAA9NmqPU0r/dwR/HWD7/tExvdMLqKf4fhtf3Z/djrWqWBMsT024PDWb3QLmsFufSinnxhhoHBgMAOCpohptEkIH+CvYqrsyjJyDpuyJtbaeOIy6zjmfen8AAAAAhhBrg9dRJM86PjzPhQZYOyGADk9zF4UwRpmX4nGi0P9aCJ1dW3oH9HqxneWcf08p/Z8R/HWA/XrVhNM3dguIQ1Sdqwiotx4TQO26r6deWPwhqw2Ha3Q0gHG4KKV8NBcAe3NtqAGYMyF0gL81IfT/MSwwXkLo7IHDgveI94dz1x8Myr49AACwWLVxj2Ky8Gxf6vqe4duJx+QzgD/dRCEM4fMZiBD6UTRi9WzGTiw+gJ7+vNhO4kVItQfgIZvuETaXYVlqta8jcw6wP6UUAXSAZVh0wEQIHeBvEUJ/L1jHjgi1bokQOgwnrr/L6Db22lQAAAAA+xTr+Ie6bcKTfCilfDZkO2P/Bx7nKjqf9xtzMmH1nLUCQezSz0b3L0cRKgMAuPd5wQsXAMDsed4bxsESf+hWVDp/P56/EcBwarAupfTOvg07YMN9i+Ja9fwCA4jOJPVQ5VfjD/sXh/kAAAAWK85R1nejL34L4EF1r+ud8PnOCaDDj30ppaxkIeYp9o3WzliwCwLoIbrqHY/iLwMAjNGnUsq5mQHusfjQHMCMXJpMhiLEBfC3UsqZDVIYP88vMJx6SKyUUgvtfzANAAAAwL7F2kTNX3wy+LBR12n4zPDsTs75QAFi+KH38ZnNjEUI/TA+f2BrBNAb8WD3+2j+QgDAWFyUUj6aDeABKmgCAFsRIa5fBS4BVOmGqWhC6K5VGEB0T/olpXRj/GFvDg01AADAn+Js5Tvrg/CdrxE+1wRh95zdhPvVfYNfYi+PBYgO92shdLZJAL2nlHJSQ2aj+ksBAEOqL15HZgAAANiXUsq5zQCAP6nSDdMQB1cUjICBxOflSsF92BsBdAAAgEY0AlxZy4c/fCilHEUIkN2zTgOb1UIYK4UwlqcJoX9Z+liwHQLomx05HAEABItAAACwe2+N8fearr+KZQKL12yQfl36WMCYNQFYh0xhAPXzMgru6zgGAAAA7F0p5TrW8hXIY6m6TsOf/QbslQA6/JNCGAsXe0bHKaVPSx8LXk4AfYPmIBMAsGzvVf0CAACGEpsBa5sBAH/dE4/cE3khhV12rDlkqmAEDCQ6jh26DmGnVoYXAADgnxTIY8F0Gh6OdRr425VCGLRKKR89l/FSAuj3iAe/96P8ywEA+/CllHJqpAEGZcEDAP7eDPjVZyOADVKYgqZgxAcTBsNorsNfo/MSsF0HxhMAAOB+USBvpSgoC1D3q97pNDwo6zTwp99rkWiFMOiL57J1FCiAJxNAf0CEzr6M9i8IAOzKVSnl2OgCT3BosHbCQhiwd6WUc6POGMXv5qFDGgAOrsFURHeFX4RfeQZrQlsS7xGrOHgGAAAAsM91ietSyjoKVSoqyxxdRNfzM7M7KB3QWbq6D/drKeVEIQzuE4UJ1nKyPIcA+g9E+EyFBwBYjrt4uAZ4itdGCwBeJuesoMsPRBdDhzQAvj+49sl4wHjFYYZ6+OuraeIJHJDaoniPOImCEIq3wHborAUAAPBIUahS103mpO7Vf6j7VHW/yswO7tXCf36W7VMUwtBwhR+K/aKak33n3BlPIYD+OGsXFgAswh/hc9W/AABgEALojxSHNHT+BfjznvgxAnUOrsFIxWGGI4cZYFi1IEQUb3kfHVGA53tj7AAAAB4v1iVWCm0zA7XY6mHs2TMwjQ5YsHpe6Je6Vy73wFOVUs7inJ5zZzyKAPojxM1YCB0A5u8kOvIAAACMWtP51yENYPGag2u6ocOINYcZdEOHAZVSTqOg1SfvEgAAAMA+KbTNhNWCju9qsVVhz1ERQGdp6pr++3peSOaBl4gC4l3RYntFPEgA/ZHixnwyib8sAPAcv8ehKwAAgMloDmkIcgGL13RDd3ANRqrphv6rDswwnLgWP8a7xBdTAQAAAOxLU2j7nTVCJqIWclxFkVXG5cB8sCC/16IL8g5sU/w+Hdor4iEC6E8QF5XuGQAwP19LKQrNAAAAkxSHNAS5AP7uhq5SN/e5NjLjUEo514EZhhfvEscppX8p4AIAAADsU4R5V/IZjFhdL/tXLeSo6/lorZY+ACzC17gXnbgXsQtRtPg4zp1dGWR6rgTQnyiqgKvqAADzUR+Sj80n8Fw557XBA5gdAd5h2Bh8oRrkKqXUqrQfBLlgL+7sF4xXU6nbwTVaAugjogMzDzg3OPvVdB77VRAdAAAA2JdmjfBfEbCDMahnRn6t62V13cyMAAO5iHvRkXsR+xDnzlaK/dNzK4D+PCcqOgDALNQH47VqYAAA9Fi0H8bBEn/oXSilfG5ClzYEYLvq3sDvKaVfSikHUQWakeodXBNuhZFqOjALvsLA4nCRIDo87GscwAMAAGBLYo3wyJoEA6vB8/e16HtdJzMZk+CcCXN00RTBcC9i73rF/p07IwmgP0OE1Na6YQHApAmfA4yfxTMAeCYdRWGrasDkQw0x12rPpZSTUsqlIZ6OJtwqiI61wBETfIXx6F2PPjvhz/NB3TvBURzAAwAAYMuaNYl3shrsUT1P/CmC5975p+Vcc1Fm5CKKYAieM7jm3JkgOjqgP1eE1Y5cQAAwWccOiwMAAHMndAnPchNdzt+VUn6KgMnnej0ZzmlzTySlZD1wAgTRca2OR1yPPjtZqu694Jc4gO6dAAAAYE9KKWf1XawG8QTR2aG7CNUdRsiOiYl7xSrWL393v2Ci2o7nimAwKoLo1H1bAfQXiNDa0WR/AABYrlod7Mz8AwDAqByYjt3phS5tCMD37qLL+fvoaHgYXc6tHcxU7574u3sijFMTRP9F8HVZohg8I9J8dv5v7xPM3F0vdH6ioDUAAMBwahBPEJ0d+C54bj1y+mL98iTuF+9iT8EaJmP3tQme63jOqPWC6B88ly2LAPoLxU3+/aR/CABYli+qgwFbJiwHANuxMo67FxuvNgTgzyriHyJYchBdzk91NFyW7jBK3BMdXlsG1/gE1eBfr5COa3XeHAocse6AUX1+is/Oq6WPCbPQdTr/Nd4NhM4BAABGphdEvzA/PNNN/A4Jns9YdEU/bvb/vi59TBiVuyiQ8K84oyB4zqTEPtHnpuCH57L5u/xfSx+BbagvNDnneuH8Z/o/DQDM2pdYVADYJmE5gPmxycjsxWb65/qVcz5KKdUA5lszz4zVTa+6eXtuE5e+uCfWgoV1v6d2W67rR/Xe+MpgzYsiE9MW81cL6XyM55d6rf576eMyQ0KfExHFfutn5yreJ3x2MiX1wPlZ/R0WNgcAAJiOZj1iHWuF9jd5jItYA9C8akF6+38HsX55ZF+BgdzEGZ1TxS+Yi1rwo66zR6b2JPZu7RPNz60A+pbUCkhxwfw2ix8IAObnSvgcAIBHurThxJJs2BCom66v/RIwcQLnPEv8vpw3B1GOHWCbDV2zZ6T3/NJdq2+WPi4z4eDVxER497j57DxxPTJSFxE6P1OUBgAAYNpiLX8d64MfFcbjHl8i7GmvcOGE0RmQ+xCzF+vtdW/oJIqIH8nXzsq1APoW1VBbPIx4CAGAcbmqi43mBAAA4H42BJiwuy5sXouI2LxlG3oHUQRc50HQbIbi+aV2jPgcXZiPFdOZPJ2IJ2rDZ6fiVgztJt4RzqIwlQIXAAAAMxPrg21hvI/WIhZPl2EedE8Yfa2QBVt01f2OuQ+xNE0R8RPFPuahPm8LoG/fcWxgOYAEAONQF5PWXuAAAGD0Dk3ReNgQYORueoFzQTV2qhdwPWwOobgvTsNFEz5jxuLzoCumo3DEtHTFZC7jUBYT1ytupTgE+9IWpjr3ngAAALAcvUDpqimMJ0y6DHexB6DLME/S3jvqfxeF+tfWMnmGm+Y+ZF2SxVPsY/Kumv2WJIC+ZfUCyTmvhdABYBTqotKR8DnAZFmIA1gWm3cjdM+GQLcpYEOAfbloQmk6FzKoCNRtOoiyti80Cldxr7gUPFu2XuGI9lDD2nPnKFw1n+2KycxcrziEMDrbdtEEzh0wBwAAoFuLqOsPdQ3/WEHZWfsagc8z+4dsQ1eov1fodu0ewj264hef7XPA/TYU+1g199e3hm5wN70zFv/YaxFA34EmhH7tECYADOYuOp97oQN2bWWEd8bGAACMiOrf7EkXHtXdnEloDqKkpjv6SiB9L9qweRdi9R7JP2x4hjlswugC6bt3EdfodVynAqILtiGMvo4D4T4zeYy2w7n7CQAAAD9UStlUaFuQdNqEztmLttBt+nNvod1XEJhcLp3O4YXi2vnj+olntHVzzsL9dbe+C5s/9oyFAPqO9DqhC6EDwH4JnwP7dGC0AYAl2lD9e607Ok9009vUECBh0pru6H+IzdJVs1m6EnR9lpsIrp7H92v3C16iuVbbQPqqd716lnm6qy5k3gXOrdHzkOaA0efmELjCELQUpwK4X/dOVD83D312bk37/um9c3zq3HyKd7ZDRYy25q5X4I/x+RS/84fCGFt10a01zuhn4gFtkcpeGN2+5vh1BemEzhlU7E399Z4gkL4oV809yDMzbFF8rv9V9D/9fX9dNV/e/5+ufdd/cZHwn759+zbgzzJ/UbVbCB0A9ut9VK4E2Lmc87kFxJ35VagAGEIsYv4/g79/pZSflvYzz1XTzXAlQEJ4VhVdmJteKN3B0b/dNZufXYD11jshQ4lQ+mHzPHPgWv3DTXuNxmf6rQNXbFtT4EogfTmu2uCTZ4BhxLt813HmoAn4uQaf7iI+Ky8927IvruFH6z/TKp40Yc27W//33+H071l3mZFmfbH/+2/d4p/aZ7LrJnhhb4Lv5Jzbong+Q8bhqgud+7xiKnqBdIVup+2mKUym8AWMQBNKbwuLu8/u6Z1HAH0PhNABYK+Ez4G9EkDfKQF0YBAC6INy75+pOBC11ll0MS56HVAd6IIf2HBwtP2aQ1jgIr53m563zWFnh/yZjA3hhvb71J9t7ppud10Yp7tmr6NzPAyiCaSvHAafhYttdd1gf5rPwO6r+/xLC3zHv+k906auA5rfZ8aquYbba3cd3+cUUr/rX5eeaZerWWtJze979w43t5B6t+7Sf5ez7rJAsc+Zmt/39jNgTr/3V/3f9+4zwDMZL6Eo3mCEPZmdyJGtrGlOQnsPOvfuCNMR7z/9Pdu5vPt07zyDr0MLoO9JPDz8zyJ+WAAYjvA5sHcC6DslhAgMQgB9UO79C7Khs+ihTdfJuWgOd507yAu70zs03d0/Uy880NlVAKg9yN/p7gGd7qBzUnyCJepdq90Bh9S7bju7Wk+66V2XacO1+tczt+dvpqrpdtF9eZcYH+8LC9QEntKGz79Nz65pgAD7xYY/u93wrNs+2/r9ZRF613D7PLvp+t1lcH3TM217TSbPtGxLnO29791t3fvf7PIQ+2PWXdrfdesuPFuzP5M23OPba6KzyzMx/Wez/nOZZzIGFddLW2DbGbHt6IrTdWFPn2ksQm9N89A9ZTAXcf/piul7voCZata6+u89/ff9Xa5z/eidp333H+U7jwD6HuWcj1NK/72YHxgA9kv4HBhEbEgfNouCFgafpztIovMNMLgmNNIdsFjPrAvMGNw19/y2A417P/3nq+469Hw1jLvmcFd7zTrcCADA6DRdhbpCV3Pr8DdG3cGp8+a9wfsCAAAAs9XraiyU/rBur/GyWTPoF1yBRdtwPkLh/u25aYpjXsa5JPcggCcSQN8zIXQA2Anhc2B0mvDi4YavpQYYb3pBwz/CTMKGwJQ0nTC6Kpjdd5vK3+vu+be98OqtzRyey/PVTnRhkev+NetaBQBgLnrv8gdNoSsHOR/WduE8730XMgcAAIAQndIPm+L2XZj01ULGqA2a38Y6wig7eMJUOJ/0JFftvUdRfYDtEkAfgBA6AGyV8DkwSU2AKjWLg90GRJrgQmEXNEzNYcS2o60NBWARcs7dPb3bCGrv93MIyV40/9zd72+bA+k2cBhM7/lq0zW4hIBJt7Gaetdm+8+ezQAAIDxinXZuh8Xv7nlP8G4PAAAAO9CcIeh/n9L5gW4P8rZXrE5RaxjIhvNJqbnPzOlsxKZzqX81wrCOCbB7AugDEUIHgK34VEr5aCiBuWuqWaZeiKrTHoh8SD/UfvGI/6bfnfyyDTXZRAB4nqYCeqe91z/0Z5v0D8O3my8PaTeHO/0/c69ntpoN2U7/39M91+Z9Nh0Sudtwnf3Ipmsz3fPnwuQAALAnvXXadM87xKY/22TT+8Nj3+c77Vpt5x/vDaWU/hovAAAAMCK9NYf+WYJNZ8X6NoVNX3ouzD4kzMSGdc37zps+5XxEesEa56azD86lAoyUAPqAhNAB4EW+lFKODSEAAAAAAAAAAAAAAADA9vxsLIdTSjlNKb1f6s8PAC8gfA4AAAAAAAAAAAAAAACwAwLoAxNCB4An+yB8DgAAAAAAAAAAAAAAALAbP3379s3QjkDOuQbp/nvp4wAAP/A+ircAAAAAAAAAAAAAAAAAsAM6oI+ETugA8EPC5wAAAAAAAAAAAAAAAAA7JoA+IkLoAHAv4XMAAAAAAAAAAAAAAACAPRBAH5kI171LKd0tfSwAIAifAwAAAAAAAAAAAAAAAOzJT9++fTPWI5RzXqWUzlNKr5Y+FgAsmvA5AAAAAAAAAAAAAAAAwB7pgD5SpZTLlNJaJ3QAFqp+/r0TPgcAAAAAAAAAAAAAAADYLx3QR04ndAAWqIbP11GMBQAAAAAAAAAAAAAAAIA90gF95CJ8V0PoV0sfCwAWQfgcAAAAAAAAAAAAAAAAYEAC6BNQSrmuYTwhdABm7kr4HAAAAAAAAAAAAAAAAGBYP3379s0UTETO+SCldJ5SeiYSCRgAAAw+SURBVLP0sQBgdrrw+a2pBQAAAAAAAAAAAAAAABiOAPoE5ZxPU0q/LX0cAJiNi5TSkfA5AAAAAAAAAAAAAAAAwPAE0CdKCB2AmfhSSjk2mQAAAAAAAAAAAAAAAADj8LN5mKYI671f+jgAMGmfhM8BAAAAAAAAAAAAAAAAxkUH9InLOdfg3ueU0quljwUAk/K+lHJqygAAAAAAAAAAAAAAAADGRQB9BnLOq5TSuRA6ABNwl1I6KqWcmywAAAAAAAAAAAAAAACA8fnZnExfKeUypVRD6FdLHwsARu0mpbQWPgcAAAAAAAAAAAAAAAAYLx3QZyTnfJBSOkspvV36WAAwOlcRPr81NQAAAAAAAAAAAAAAAADjJYA+Qznn05TSb0sfBwBG40sp5dh0AAAAAAAAAAAAAAAAAIzfz+ZofiLk937p4wDAKHwQPgcAAAAAAAAAAAAAAACYDh3QZyznvE4pnaWUXi19LADYu7uU0nEp5czQAwAAAAAAAAAAAAAAAEyHDugzVko5TynVEPrV0scCgL26qZ8/wucAAAAAAAAAAAAAAAAA0yOAPnOllMsIoX9d+lgAsBcXKaVVfP4AAAAAAAAAAAAAAAAAMDE/ffv2zZwtRM75Y0rpP0sfBwB25vdSyonhBQAAAAAAAAAAAAAAAJguAfSFyTkfpZROU0qvlj4WAGzNXUrpuJRyZkgBAAAAAAAAAAAAAAAApk0AfYFyzocppRoSfLP0sQDgxa4ifH5pKAEAAAAAAAAAAAAAAACm72dzuDyllOuU0jql9GXpYwHAi3ytnyfC5wAAAAAAAAAAAAAAAADzoQP6wuWcj1NK/730cQDgyT6UUj4bNgAAAAAAAAAAAAAAAIB5EUCnhtBXKaWzlNJrowHAD9yklI50PQcAAAAAAAAAAAAAAACYp5/NKxEirCH0r4sfDAAeUj8nVsLnAAAAAAAAAAAAAAAAAPOlAzrfyTmfpJT+y6gA0POhlPLZoAAAAAAAAAAAAAAAAADMmwA6/5Bzrt3Qz1JKr40OwOLdpJSOdD0HAAAAAAAAAAAAAAAAWIafzTN9ETKsIfQvBgdg0ernwEr4HAAAAAAAAAAAAAAAAGA5dEDnQTnno5TSaUrplZECWIy7lNJJKeXUlAMAAAAAAAAAAAAAAAAsiwA6P5RzPowQ+lujBTB7Vymlo1LKtakGAAAAAAAAAAAAAAAAWB4BdB4t5/wxpfQfIwYwW59KKR9NLwAAAAAAAAAAAAAAAMByCaDzJDnnVXRDf2PkAGbjJrqeX5pSAAAAAAAAAAAAAAAAgGX7eekDwNNEOHGdUvrd0AHMQr2fr4TPAQAAAAAAAAAAAAAAAEg6oPMSOed1dEN/bSABJqd2PT8upZybOgAAAAAAAAAAAAAAAAA6OqDzbBFaXOmGDjA5Xddz4XMAAAAAAAAAAAAAAAAAvqMDOluhGzrAJOh6DgAAAAAAAAAAAAAAAMCDdEBnK3RDBxg9Xc8BAAAAAAAAAAAAAAAA+CEd0Nk63dABRkXXcwAAAAAAAAAAAAAAAAAeTQCdnck5f0wp/ccIAwzmUynlo+EHAAAAAAAAAAAAAAAA4LEE0NmpnPMqpfQ5pfTWSAPszUVK6aSUcmnIAQAAAAAAAAAAAAAAAHgKAXT2Iud8klKqXXhfGXGAnbmr99pSymdDDAAAAAAAAAAAAAAAAMBzCKCzNznng+iG/ptRB9i6ryml41LKraEFAAAAAAAAAAAAAAAA4LkE0Nm7nPM6pXSaUnpt9AFe7CaC5+eGEgAAAAAAAAAAAAAAAICXEkBnMDnnjymlk5TSK7MA8GR3KaXPpZSPhg4AAAAAAAAAAAAAAACAbRFAZ1A558OUUg1P/mYmAB7tS713llKuDRkAAAAAAAAAAAAAAAAA2ySAzijknNe1k29K6Y0ZAbjXVUrppJRybogAAAAAAAAAAAAAAAAA2AUBdEYl53wcQfRXZgbgL3cRPD81JAAAAAAAAAAAAAAAAADs0s9GlzGJcOVhSumTiQH4Q70fHgqfAwAAAAAAAAAAAAAAALAPOqAzWjnnGkT/mFL6zSwBC/Sl3gNLKdcmHwAAAAAAAAAAAAAAAIB9EUBn9HLO6wiivzVbwAJcRPD83GQDAAAAAAAAAAAAAAAAsG8C6ExGBNFPU0qvzRowQzcppZNSypnJBQAAAAAAAAAAAAAAAGAoAuhMTs75ODqiC6IDc3ATHc9PzSYAAAAAAAAAAAAAAAAAQxNAZ7JyzicRRH9lFoEJukspfS6lfDR5AAAAAAAAAAAAAAAAAIyFADqTlnM+SCmdxJcgOjAFfwTPI3x+a8YAAAAAAAAAAAAAAAAAGBMBdGZBEB2YAMFzAAAAAAAAAAAAAAAAAEZPAJ1ZEUQHRkjwHAAAAAAAAAAAAAAAAIDJEEBnlgTRgREQPAcAAAAAAAAAAAAAAABgcgTQmTVBdGAAgucAAAAAAAAAAAAAAAAATJYAOouRcz5OKX1MKb0268AO3ETw/FTwHAAAAAAAAAAAAAAAAICpEkBncQTRgS2rwfOPpZRTAwsAAAAAAAAAAAAAAADA1Amgs1g553UE0d/6LQCe4aJ2PC+lnBk8AAAAAAAAAAAAAAAAAOZCAJ3FyzmvUkonKaXflj4WwKN8SSmdllLODRcAAAAAAAAAAAAAAAAAcyOADiHnfJhSOo4w+ivjAjTuaug8Op5fGxgAAAAAAAAAAAAAAAAA5koAHTbIOXdB9DfGBxbtJqX0MaV0Vkq5XfpgAAAAAAAAAAAAAAAAADB/AujwgJzzOrqi/2acYFG+Rrfzc9MOAAAAAAAAAAAAAAAAwJIIoMMj5JwPoiN6DaO/NmYwS3c1dJ5SOi2lXJtiAAAAAAAAAAAAAAAAAJZIAB2eKOd8FEH0fxs7mIWLCJ2fmk4AAAAAAAAAAAAAAAAAlk4AHZ4p53wYQXRd0WF6blJKZ7XjuW7nAAAAAAAAAAAAAAAAAPA3AXTYgpzzOoLovxlPGLWv0e38zDQBAAAAAAAAAAAAAAAAwD8JoMMW5ZwPUkpHKaWTlNIbYwujcFVD5xE8vzUlAAAAAAAAAAAAAAAAAHA/AXTYkZzzYXRFr1+vjTPs1U1K6SxC55eGHgAAAAAAAAAAAAAAAAAeRwAd9iDnvIog+pEwOuzMXYTOz0opZ4YZAAAAAAAAAAAAAAAAAJ5OAB32LOd8FEH0+vXK+MOLfRE6BwAAAAAAAAAAAAAAAIDtEECHAQmjw7N9bbqd3xpGAAAAAAAAAAAAAAAAANgOAXQYiQijryOM/tq8wHfumsC5TucAAAAAAAAAAAAAAAAAsCMC6DBCOedVSuk4AulvzBELdZNSOhc6BwAAAAAAAAAAAAAAAID9EUCHkcs5H0ZX9Pr11nwxc1dNp/NLkw0AAAAAAAAAAAAAAAAA+yWADhOScz6IruhH8f21+WPi7rou5/V7KeXahAIAAAAAAAAAAAAAAADAcATQYcJyzqsIotevf5tLJuKqCZyfmzQAAAAAAAAAAAAAAAAAGA8BdJiRnHPbHf2NuWUkbrrAeYTOb00MAAAAAAAAAAAAAAAAAIyTADrMVM75oOmOLpDOPt10YfMInF8bfQAAAAAAAAAAAAAAAACYBgF0WIgIpK+aQPpbc8+WXPUC5zqcAwAAAAAAAAAAAAAAAMBECaDDguWc20B6/efXfh/4gbsIml9G2PzcgAEAAAAAAAAAAAAAAADAfAigA3+JLunrplN6/f7KCC3aRRc2r99LKddLHxAAAAAAAAAAAAAAAAAAmDMBdOBBOefDCKK3Xzqlz89dGzRPKV2XUi6XPigAAAAAAAAAAAAAAAAAsDQC6MCz5Jy7DultQF239GmoXc2v46vrbH679EEBAAAAAAAAAAAAAAAAAATQgS3KOR80ofT6VUPq9c/eGOe9u4mA+WX7vZRyvbBxAAAAAAAAAAAAAAAAAACeQAAd2Iuc82HTLf2g913n9Oe5iP/qvPl+W0q5nNIPAQAAAAAAAAAAAAAAAACMhwA6MAo55y6Y3gXVU3RQT/Hvrxc0U1338hSdy2/j368FzAEAAAAAAAAAAAAAAACAXRJAByal6aSemk7qnS7E3no74M93FeHxzm0EyjvXTdBcsBwAAAAAAAAAAAAAAAAAGJwAOrBIvSD7S1yXUq79FgEAAAAAAAAAAAAAAAAAk5dS+v8THTwlWRRUrQAAAABJRU5ErkJggg=="/>
</defs>
</svg>

source/_static/images/nav/header-logo.svg METASEP
<svg width="170" height="28" viewBox="0 0 170 28" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<rect width="170" height="28" fill="url(#pattern0)"/>
<defs>
<pattern id="pattern0" patternContentUnits="objectBoundingBox" width="1" height="1">
<use xlink:href="#image0" transform="translate(-0.000625885) scale(0.000250313 0.00151976)"/>
</pattern>
<image id="image0" width="4000" height="658" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAD6AAAAKSCAYAAADGGiRkAAAACXBIWXMAACxKAAAsSgF3enRNAAAgAElEQVR4nOzd4VEcSbo27JyJ+Q8ewBuPAeABrAXiWABjgVgLpLFAjAVqWbCMBYss+MCAJwJ5ABboi5pNFCyr0SDU3ZWVeV0RhM6cH+dUPdlUN1115/3T58+fC8DSRMTxo0M+LKXsfuO/S/3vgw2c5j8y88oLCAAAAAAAAAAAAAAAAADowS9WEWhFRDwEx3drqLw8CZcfNbZYvwqfAwAAAAAAAAAAAAAAAAA9EUAHtuZRwPzh34cW8+m/dxa2Eh8yc9XAcQAAAAAAAAAAAAAAAAAArM1Pnz9/Nk1gbSJiv5SyX8PlD2Hz6b/3OpryH5l50sBxAAAAAAAAAAAAAAAAAACslQZ04EWeBM0f/uejAaZ5U0o5a+A4AAAAAAAAAAAAAAAAAADWTgM68Lci4iFkflh/Rgiaf839dP6ZedveoQEAAAAAAAAAAAAAAAAA/DgN6MB/iYjD2mr+EDY/MKE/TeHzY+FzAAAAAAAAAAAAAAAAAKBnAugwsIh4aDU/HrzZ/DnOM/O6/cMEAAAAAAAAAAAAAAAAAHg5AXQYyJN28+nfPev/LL9l5moBxwkAAAAAAAAAAAAAAAAA8EN++vz5swlCpx4Fzh9+dqz1d/uQmWcLO2YAAAAAAAAAAAAAAAAAgBcRQIeOCJyv3U1mHnZ2TgAAAAAAAAAAAAAAAAAAf+kXo4HliojdUsrJo8D5nuVcm091pgAAAAAAAAAAAAAAAAAAwxBAh4WpLecn9efA+m3E/TTfzLzr8NwAAAAAAAAAAAAAAAAAAP6SADo07knL+fTvjjXbuCl8ft35OQIAAAAAAAAAAAAAAAAA/A8BdGhQROw/Cp2/skZb9WtmXg10vgAAAAAAAAAAAAAAAAAAXwigQyMehc7PSikH1mUWHzJzNeB5AwAAAAAAAAAAAAAAAAD86afPnz+bBMwkIg5r4HwKnu9Zh1n9kZknA58/AAAAAAAAAAAAAAAAAIAGdNi22nR+Vn+EzttwU9cDAAAAAAAAAAAAAAAAAGBoGtBhC2ro/KSGnA/MvCn3pZTDzLwdfRAAAAAAAAAAAAAAAAAAABrQYUMiYvdR6PzInJs0hc+Phc8BAAAAAAAAAAAAAAAAAP5DAB3WLCJOavD81Gybd56Z16MPAQAAAAAAAAAAAAAAAADggQA6rEFE7E9h5ho83zPTRfgtM1ejDwEAAAAAAAAAAAAAAAAA4LGfPn/+bCDwQhFxVkqZfo7McFE+ZObZ6EMAAAAAAAAAAAAAAAAAAHhKAB2+06O28ynAvGN+i3OTmYejDwEAAAAAAAAAAAAAAAAA4Gt+MRV4Hm3nXfhUSjkefQgAAAAAAAAAAAAAAAAAAH9FAB2+obadn9XGc23ny3ZfSjnJzLvRBwEAAAAAAAAAAAAAAAAA8FcE0OErIuK4Bs9PzacbU/j8evQhAAAAAAAAAAAAAAAAAAB8iwA6PBIRD23nB+bSlV8z82r0IQAAAAAAAAAAAAAAAAAA/B0BdIYXEbs1dD797Iw+jw59yMzV6EMAAAAAAAAAAAAAAAAAAHiOnz5//mxQDCki9kspb0spJ4Ln3fojM09GH8LSRcRhKWVXiz0AAAAAAAAAAAAAAAAAbJ4AOsOJiONSylkp5dTqd+2mlHKcmXejD2KJIuKk/p6+enL407peaLUHAAAAAAAAAAAAAAAAgM0QQGcYNXg+NZ4fWfXu3ZdSDjPzdvRBLE1E7JZSVl8Jnj9lgwEAAAAAAAAAAAAAAAAA2AABdLpXm5TPBc+HcV+DydejD2JpIuKwlHJVStl55qELoQMAAAAAAAAAAAAAAADAmv1ioPQqIs5q4/meRR7KufD58rwgfD45qG3pJ6PPDwAAAAAAAAAAAAAAAADWRQM63RE8H9pvmfl29CEszQvD54/9IzOvRp8jAAAAAAAAAAAAAAAAAKyDBnS6IXg+vA/C58sTEbu1xfyl4fPJWQ2wAwAAAAAAAAAAAAAAAAA/SACdxYuI4xpgFTwf101mno0+hIW6LKUc/OChnww7PQAAAAAAAAAAAAAAAABYs58NlKWagucRMbUe/1v4fGifSinHow9hiSLiopRytIZD34mI/fEmCAAAAAAAAAAAAAAAAADrpwGdxamN52/XFFxl2e6n9uvMvLOOyxIRU2P96zUe9BRAvx1hdgAAAAAAAAAAAAAAAACwSQLoLEZtOJ6C56dWjWoKn18bxrJExGEp5f3ocwAAAAAAAAAAAAAAAACAFgmg07yI2K3B83W2JbN8v2bmlXVclvr7vIl12+95bgAAAAAAAAAAAAAAAACwLQLoNC0ipuD5eSllx0rxyIfMXBnIIl1u6PdZAB0AAAAAAAAAAAAAAAAA1kAAnSZFxFltPd+zQjzxR2aeGcryRMRFKeVo9DkAAAAAAAAAAAAAAAAAQMsE0GlKRBzX4LmQKl9zU0oRPl+guqnE69HnAAAAAAAAAAAAAAAAAACtE0CnCRGxW0qZ2pFPrQh/4b6UcpKZdwa0LBFxWH+/AQAAAAAAAAAAAAAAAIDG/WyBmFtETI3nt8LnfMMUPj/OzFtDWpa6ucSqlLIz+iwAAAAAAAAAAAAAAAAAYAk0oDObiDiuwdQ9q8DfOM/Ma0NapKn5/GD0IQAAAAAAAAAAAAAAAADAUgigs3URsV9Dqa9Mn2f4Z2auDGp5IuK8lHI6+hwAAAAAAAAAAAAAAAAAYEl+tlpsU0S8LaVcC5/zTB8y88KwliciDksp70afAwAAAAAAAAAAAAAAAAAsjQZ0tiIijmvr+YGJ80w3mXlmWMsTEbullMstH/hhD7MDAAAAAAAAAAAAAAAAgLkJoLNRNYg6tZ6/Nmm+w00p5djAFmtVStnb8sHvdjQ/AAAAAAAAAAAAAAAAAJiNADobExEnNYi6Y8p8h/tSyllm3hna8kTEtOHEq9HnAAAAAAAAAAAAAAAAAABLJYDO2tXW85UQKi90kpnXhrc8ETG11r8ZfQ4AAAAAAAAAAAAAAAAAsGQC6KxVRJyXUt5qPec7TI3nU+D8avo3M68Mb3nqxhOXo88BAAAAAAAAAAAAAAAAAJZOAJ21iIj92np+ZKJ8w3+FzWvg/NbAunBp4wkAAAAAAAAAAAAAAAAAWD4BdH6Y1nO+4eZJu/m1YfUnIt7afAIAAAAAAAAAAAAAAAAA+iCAzotpPecrbmrY/M+fzLwzpL5FxEkp5c3ocwAAAAAAAAAAAAAAAACAXgig8yIRcVZKudB6PjyB84FFxGHdhAIAAAAAAAAAAAAAAAAA6IQAOt8lInZr4PSVyQ3pvobNL2vg/Hb0gYzq0bXAJhQAAAAAAAAAAAAAAAAA0BEBdJ4tIk4ETof00HJ+mZlXow+DL6ZNCA6MAwAAAAAAAAAAAAAAAAD6IoDO36pNx29LKa9Naxgfa8D4Uss5T0XERSnlyGAAAAAAAAAAAAAAAAAAoD8C6HxTRBzW1nNNx/3741Ho/G70YfB1EXFmMwoAAAAAAAAAAAAAAAAA6JcAOn8pIs5LKe9MqGtC5zxb3ZDiwsTGUdf81vUBAAAAAAAAAAAAAAAAYBwC6PyPiNitreevTKdLH+v6Cp3zbPW6MG1WsGNqQzmZfqbm+8y8Hn0YAAAAAAAAAAAAAAAAACMQQOe/RMSxkGmXPtXm6il0fjv6MHiR6bqwZ3RDOiilXEXE28zUgA8AAAAAAAAAAAAAAADQOQF0vpjChaWUNybSjfsaGr7QXMyPiIipMf/IEId0Vd8Xpk1J3tVNSqY29LvRBwMAAAAAAAAAAAAAAADQKwF0pnDpbg0qC5j24WMpZVXbzoVE+SERcVZKOTVFqlellOuIOLGxBQAAAAAAAAAAAAAAAECfBNAHV9tsL2u7Lct1X0PnU9v5rXVkHSLisJTy3jB5Ym9qRo+I88xcGQ4AAAAAAAAAAAAAAABAXwTQBzaFB0sp70afw8LdTKFzbeesW0TsTiFjg+UvTJuWvK+bmJy7/gAAAAAAAAAAAAAAAAD0QwB9QDVYOrXWvhp9Fgv2YVrDzBQQZlOuasgYvuW0lHIYESeZeWtSAAAAAAAAAAAAAAAAAMv3szUcS0Qc1mCp8Pny3JdSfiul/L/MPBM+Z1MiYtqg4sCAeeZ1ZnqtXE8h9OEHBgAAAAAAAAAAAAAAANABAfSB1HDglWDp4nwqpfyzlLKfmW+1DLNJEXFWW63he0xt+f+KiLemBgAAAAAAAAAAAAAAALBsv1i/MdRQ4JvR57AwU/B8CpyvRh8E2xERx6WU98bND3gTEYellLPMvDNIAAAAAAAAAAAAAAAAgOURQO9cROyWUqYA86vRZ7EgH2vw/Gr0QbA9EbFfSrk0ctZger+5ioiTzLw1UAAAAAAAAAAAAAAAAIBl+dl69au20F4Jny/GFDz/R2YeC5+zTXWjiil8vmPwrMlBKeW6tuoDAAAAAAAAAAAAAAAAsCAC6J2qob+rGgKkbYLnzO2ig2vFUQPH0KubF57XtKHBvyPibPQBAgAAAAAAAAAAAAAAACyJAHqHatjv39qMmyd4zuwi4ryUcmol+Ia7HxzO+4hYGTAAAAAAAAAAAAAAAADAMvxinfpSQ37CpG2bgudvhc6ZW0Qcl1LeWQi24DQi9kspJ5n5o4F2AAAAAAAAAAAAAAAAADZIAL0TEbFbSrkspRyNPouGfarBc03AzC4iDus1A7Zlen+6iogphH5r6gAAAAAAAAAAAAAAAABt+tm6LF9tlb0SPm/WfSnl18zcFz6nBXXDium1uGNB2LKDUsp13QABAAAAAAAAAAAAAAAAgAYJoC9cDfFd11AfbZmC57+VUgTPac3KNYPvcL3mYe3UJvQziwAAAAAAAAAAAAAAAADQHgH0BYuIk9p8rsW4PR9KKYeZ+TYz70YfBu2IiLellFeWhO+wiWvY9L71XggdAAAAAAAAAAAAAAAAoD0C6AtVQ3v/Ej5vzk0p5R+ZeZaZt6MPg7bUTSveWBYaMoXQVxYEAAAAAAAAAAAAAAAAoB0C6AtUG4zfjz6HxtyXUn7NzKn1/Gr0YdCeiDgspQj60qJTIXQAAAAAAAAAAAAAAACAdgigL0wN6WkwbsvvpZT9zBSgpEkRsVvD5zs9r1BE7DdwGLzMFEK/rq9VAAAAAAAAAAAAAAAAAGb0i+EvQw3lXUwhvdFn0ZCbUspZZl6PPgiad1lKORhgmaYA+m0Dx9GbbV3jptfoVUQcZ+bdOOMFAAAAAAAAAAAAAAAAaIsG9AWo4fMr4fNm3JdS/pmZh8LntC4ipo0rjiwUP2CbYfCHEPqhBQMAAAAAAAAAAAAAAACYhwB64x6Fz0doL16CP0opU/D8YvRB0L6IOCulvLZULIwQOgAAAAAAAAAAAAAAAMCMBNAbVsN3wudtmFrP/y8zTzLzdvRh0L56/bBRAku1I4QOAAAAAAAAAAAAAAAAMA8B9EYJnzflQyllPzMvRx8EyxARu6WUyxrihaUSQgcAAAAAAAAAAAAAAACYgQB6gx6Fz4VH5/WplPKPzDzLzLuRB8HiTOHzPcvGmlzPOMiHEPqZxQQAAAAAAAAAAAAAAADYDgH0xgifN+OPUsphZl6NPgiWJSJWpZQjy8a6NLABx/R++F4IHQAAAAAAAAAAAAAAAGA7fjHndgifN+G+lDI1nl+OPgiWpwZ0Ty0dnZpC6FMgfmWBAQAAAAAAAAAAAAAAADZHA3ojhM+bMLWe7wufs0T1GvLe4tE5TegAAAAAAAAAAAAAAAAAGyaA3oCIOBE+n9XUev7PzDzJzLuB58BCRcR+vYaM7nj0AQxCCB0AAAAAAAAAAAAAAABggwTQZ1ZDdP8SPp/NzRRazcyLQc+fhYuI3VLKpWsIG3bT2ICF0AEAAAAAAAAAAAAAAAA2RAB9RjU8937YAczv98w8zMzr0QfBok2bJxxYQjbsrsEBC6EDAAAAAAAAAAAAAAAAbIAA+kyEz2d1X0r5v8w8H3gGdCAi3pZSTq0lAxNCBwAAAAAAAAAAAAAAAFgzAfQZRMSh8PlsbkopU+v55aDnTyci4qSU8sZ6ghA6AAAAAAAAAAAAAAAAwDoJoG9ZDZ9fDXXS7fg9M6fw+e3og2DZ6nVkZRnhCyF0AAAAAAAAAAAAAAAAgDURQN+iR+HznWFOug33pZRfM/N89EGwfBGxW0q5dB1hy64XMHAhdAAAAAAAAAAAAAAAAIA1EEDfEuHz2XwqpRxnprZoejGFz/esJlt2t5CBTyH0kwaOAwAAAAAAAAAAAAAAAGCxBNC3QPh8Nn+UUg4zcwnNvfC3ImLaSOHIpOCbVvV9FwAAAAAAAAAAAAAAAIAXEEDfMOHz2fyemSeZuZTWXvimiDgrpZya0jcJHVPq++2VEDoAAAAAAAAAAAAAAADAywigb1BE7JZSLoXPt+q+lPJrZp4PdM50rgZp31vnv7Xb+PGxPULoAAAAAAAAAAAAAAAAAC8kgL4hNXw+NZ/vdXmCbZrC58eZuRp9EPQjIvbrtQTmdLvA6T+E0PcbOBYAAAAAAAAAAAAAAACAxRBA34BH4fOD7k6uXTellP3MvB59EPSjXksua5AW5rTEAHqpvzuX9XcJAAAAAAAAAAAAAAAAgGcQQN+MS+HzrfpQm8/vBjpnxrByLYEfdlCb0IXQAQAAAAAAAAAAAAAAAJ7hF0Nar4iYAqNHPZ1T4z5k5tnoQ6A/EfG2lPLK0sJaHNTNYY6NEwAAAAAAAAAAAAAAAODbNKCvUQ2fn3ZzQu37VficHkXE9Lp+Y3FhrY7q+zQAAAAAAAAAAAAAAAAA3yCAviY1MCp8vh33NXwuSEh3IuKwlHJhZWnMbScLchoRfr8AAAAAAAAAAAAAAAAAvkEAfQ1q+Pz94k9kGabw+bHwOT2KiN1SymUpZccC05LM7CWAPnld37cBAAAAAAAAAAAAAAAA+AoB9B+krXirHsLn1wOdM2O5KqXsWfMX213ocbN97yPixNwBAAAAAAAAAAAAAAAA/pcA+g+o4fMrbcVbcVNKORQ+p1cRMbX6H1jgH2J+fI9VfR8HAAAAAAAAAAAAAAAA4BEB9BeKiKlpdyV8vhU3tfn8doBzZUARcVZKObX2sFXT+/dVfT8HAAAAAAAAAAAAAAAAoBJAf7krbbtb8RA+vxvgXBlQRByXUt5bexbgU4eLJIQOAAAAAAAAAAAAAAAA8IQA+gtExEr4fCuEz+laROyXUi6tMgtx2+lCTe/nqwaOAwAAAAAAAAAAAAAAAKAJAujfKSLOSymnizroZRI+p2u1cfmyNjAD83oVERfWAAAAAAAAAAAAAAAAAEAA/btExEkp5d2CDnmpPmTmofA5nVvV5mWgDa8j4sxaAAAAAAAAAAAAAAAAAKMTQH+miDisgVE2awqfCwDStdq0/MoqQ3Pe1/d7AAAAAAAAAAAAAAAAgGEJoD9DROyWUi5LKTvNH+yyCZ/Tvdqw/NpKb0ZE7Pd4Xo24HeQ8r7yOAAAAAAAAAAAAAAAAgJEJoD/PFD7fW8KBLtgfwuf0rjYrX1jojRIc3pxRAujTZjOXdfMZAAAAAAAAAAAAAAAAgOEIoP+NiFiVUo6aPsjluymlCJ/TtRpmvarhVqBtBzaLAAAAAAAAAAAAAAAAAEYlgP4NETGFok+bPcA+TOHz48y8G30QdE/4HJblNCLOrRkAAAAAAAAAAAAAAAAwGgH0vxARh6WU900eXD+EzxlCRKxqozKwLO8i4tiaAQAAAAAAAAAAAAAAACP5xWr/r4jYLaVctnZcnRE+Zwi1QfnUatOB20EX8XLalCYzRz1/gL+05k06rv1tACzdOq+LmXnlBQEAAAAAAAAAAADAXATQv24Kn++1eGCduBc+ZwQ1fPDOYtOJUQPYO/VzwWEDxwLww6ZNNUopu/X/zu6T69t+/XnssF4LNy4i/ur/xbR51dO/HZ4GMx//tzA78F3qRoQP18On18bH181Sr5Mb/87oG9fE6TuV6yf/u+sn10nXRAAAAAAAAAAAAAB+yE+fP382wUci4m0p5U0zB9Sfh/D504eloSs13HW1rcAWX/xfZl4ax/rVDRX+3dt5fYffM/N8MUcLDCUiHgfHH9p3H//vthYib9Dj8PpDIPP2YWMVDcPQv0fXyIefxwHzo8FeAh/rv7ePNph6uA4KqgMAAAAAAAAAAADwhQD6IxFxUkr5VzMH1B/hc4ZQ2/Omh/gPrPjW/ZaZbwc7560QQP/Tr5m5auA4gMHUa3B5FC5/+HfkYPm6PYQyH1qEv/wrkAntexQyP34UMN9KU3mHbp5cB6e/be98lwMAAAAAAAAAAAAwFgH0qj6sfC3AsVGaiRlCREyv81dWexYC6BsigP4nG6kAGxcRZ6WUkxqgHK2Zt2UfH4KYmXkx+jBgbvWz6VkNmbtWbs+n2pw+fR6+yMzbVg4MAAAAAAAAAAAAgPX6xTy/uBQ+36hfhc8ZQURcCJ/TKeGS/3xOWE2BJ224wAa9N9wmPQRcX0XE1Ip+NfpAYGYr7eaz2Ks/R/V7NH8jAAAAAAAAAAAAAHTqZwv7JTB60MCh9GpqJF6NPgT6VxtLX1tqeqTd8Ivp84LmW4CxvR19ADCn+neX8DkAAAAAAAAAAAAAbNDwAfSIOBEY3agPmSmgQfci4lBjKQO4t8h/Oq3BJwDGdBQRx9YeZuM7BgAAAAAAAAAAAADYsKED6BGxX0rRzL05N5kpoEf3ImK3lHJlpRnAsRD6Fxd14wkAxiQACzPQft4Un4UBAAAAAAAAAAAAOvbL4It7WUrZaeA4evSpBhWha4/C564ldC8zryPiXNv/n3bqJjaCNwBj+rMFPTNtQgTbZZO7duyOPgAA+Jq6YeH/98LhfMxM91VgC+rmVi/9nvu3zLQxHQAAAAAAAMAPqJm865cWE2XmT+a/ecM2oEfE9GDAQQOH0qOpHfckM+9GHwRDuHAtaYow8IZl5hS6/rXrk3y+g4i4WMrBAu2LiH3LtCiCsLBF06YP0+YPZg4AtKreGL20QNC2ulGETVYBAAAAAAAA5nX50vA52zNkAL0+tPymgUPp1dnUkjv6EOhfbYI+tdRN0cK3BTWE/nv3J/o8ryPiZAkHCiyCAPqynNo0ALZKwyAA0Do3RqFxNooAAAAAAAAAmF8tl1ZKtADDBdDrgwWrBg6lV//MTA9u0L26kcU7K82oMnPagOGDF8CfVvXzBQDjEYiFLdB+3iSffwHgkYi48HkFFsFGEQAAAAAAAAAzqiWQyqUXYsQG9JUHCzbmQ2ZedHpu8EVturTRApQyhdBvzKHsuCYADEsLOmyHzR7aczj6AADgQb0x+tpAoG120AcAAAAAAACYV0QcKpdelqEC6BFxVkp51cCh9OimBhGha7Xl+LIGTmFomXlXSpnaKO9Hn8X04GJEeB8EGJNgLGyQ9nMAoGVujMIy2EEfAAAAAAAAYF41k7eSyVuWYQLotZVOO/dmTMHDkxpEhN5Nb3QHVhn+Qwj9v7ytDx0DMBYt6LBZNnkAAJrkxigsg40iAAAAAAAAAJpwIZO3PCM1oHsIaHPOMvO215ODBxExBR9eGQj8t8y8LqVo//7P5wwPMgI/wiYWyyUgCxug/RwAaJwbo9A4G0UAAAAAAAAAzC8ipszRqaVYniEC6PUF6oHlzfgtMy97PDF4LCJOSilvDKV52kdnkpnTQ3y/DXny/+2gblYB8BK7prZYJ/WhdmC9fK5ql7+9ABiaG6OwGDaKAAAAAAAAAJhRREwlbe+swTJ1H0D3At2oj5npYXC6V68jWo2XYW/0Acypvif8Me4EvnhTrxsAjGNqUju33rA+2s+b528vAIZVP6e47wSNs1EEAAAAAAAAwLxqwdeVZViuERrQhUY3435q+evxxOCx+ka3qqEi4O+dlVJuzMnnD4ABnWtBh7Wy4R0A0Jz6mf/SykDbbFAOAAAAAAAA0IRLmbxl6zqAHhHTw8oHDRxKj04y8270ITCElesIPF99bzirG5WM7KB+DgFgHFrQYU20nwMADbtyYxTaZgd9AAAAAAAAgPlFxIVnQZev2wB63dn+TQOH0qPfMtODG3SvhkdfWWn4Ppl5XUPoo3tTP48APJf27OXTgg7rYSMfAKA59caozUqhfTaKAAAAAAAAAJhRREyZotfWYPl6bkBfNXAMPfqYmR4Ep3sRcWITC3i5zLwspfxuhD6PAN/FphXLpwUdfpD28+WoawUAo7zvuTEKC2CjCAAAAAAAAIB51SLHC8vQhy4D6LW12MMF63ev0ZYR1Dc6oVH4QZk5BfA+Dj7Hg/q5BIBxCKDDj/HZCQBoihujsAw2igAAAAAAAACYV0Ts1kzejqXoQ3cB9IjY98D/xpxl5m2n5wZ/8kYHa3dSNzAZ2Zv6oDIAY9ipD70D30n7OQDQGt8XwzLYKAIAAAAAAACgCSvF0n3psQHdg0Cb8UdmXvZ4YvCEN7qFq6EVGpGZdzWEPrrV6AMAGIwGZ3gZvzsAQGt8XwyNs1EEAAAAAAAAwPwiYiqVfmUp+tJVAL2+SDVlrd+nqf28t5OCpyLiwhsdrF9mXpVSfht8tAf1cwoAY9jTgg7fR/v5Iu2OPgAA+hYRb31fDItgowgAAAAAAACAGdVnQN9Zg/50E0Cvu9trytqMs9pgC92qAaHXVhg2IzOn9+ibwcf7NiL2GzgOoF2uEX3x9yl8H78zy3M4+gAA6Fe9MfrGEkPbbBQBAAAAAAAAMK+ak7m0DH3qqQF92t1+p4Hj6M3vtbkWuhUR00PzF1YYNu6klHI/8Jh36ucVgL+yZzJd0YIOz6T9HABoiRujsAw2igAAAAAAAABowqVcb7+6CKDXBwzsbr9+nzSQ0buI2PVGB9uRmbellNGDeEcRcdLAcQCwHf6egufxuwIAtMT3xdA4G0UAAAAAAAAAzC8ippLGA0vRr8UH0Gt4VJvoZpxl5l2PJwaPXGobhe3JzOl37sPgI1/Vzy8A9E8LOvwN7ecAQCpMDckAACAASURBVEvcGIXFsFEEAAAAAAAAwIzqM9Kn1qBvPTSgnwuPbsTvmXnV4XnBFxFxIegAs5jeuz8NPPodLZ8AQxFAh2/zuWi5DkcfAAB9cWMUlsFGEQAAAAAAAADziojp+cELy9C/RQfQI2K/lPKmgUPpzScPgNO7+jDhawvdJSGIxmXmnTBeeV0/cAPQv6Pa8Aw8of188XZHHwAA/ajf07y3pNA2G0UAAAAAAAAAzCsipmcHL2s5I51begP6qoFj6NFZDQdCl+yy0j0hiAXIzKtSym+Dj8HnGOALAeXu2eALvs7vBgAwu0c3RoGG2SgCAAAAAAAAoAnTMxZ7lmIMiw2gR8SJlqyN+KOGAqFLdlmBdmTmFDi6GXhJDiLivIHjAGDztKDDE9rPAYCGuDEKjbNRBAAAAAAAAMD8IuKtZz/HssgAen3IQHvx+t1P7ee9nRQ84WFCaMvo7ztv6+caAPqn6Rn+m98JAGB2bozCYri3AwAAAAAAADCjWij9xhqMZakN6OceMtiIt5l51+F5wZ8i4sLDhNCWzLwupfw28LLsCF8BDEMLOlTaz7thDQFYNDdGYRlsFAEAAAAAAAAwr4jYL6WsLMN4FhdAry9WDwSt38fM1CpPtyJiall+bYWhPZk5PUB4M/DSvI6IwwaOA4DNOzdj+JMNeACAWdXvYtwYhcbZKAIAAAAAAABgXhGxW0q5rAWMDGaJDegeCNoMQQi6VR8mtMECtO1s8PVxjQJ2h5/AGF7VTdVgWNrPAYC51RujKzdGoW02igAAAAAAAABowpR3ObAUY1pUAN1Dyhvze2Zed3puDK4+THjlYcKhCHUtUH0f+m3gERzVNh9gXIfWfhianxmd3wEAYG5ujELjbBQBAAAAAAAAML+ImEqPTy3FuJbWgG6X+/W79/A3nRM+H48A+nJND/9+Gvz8AejfqRZ0RmVjwf64ngGwNG6MwmLYKAIAAAAAAABgRhExFay9swZjW0wAvT4UtNfAofTmPDPvRh8CfYqIlQeUYDnq+9HZwEu2FxE2hQEYg+s9o/La748AOgCL4cYoLIONIgAAAAAAAADmFRG7tRSWwS0igF5fsB5SXr+bzNQqT5ci4swDSrA8mTl9QP0w8NKd1889APRNCzrD0X4OAMzJjVFYBhtFAAAAAAAAADThspSyYylYSgP6uRfsRpx3eE7w8IDSe5OAxZren+4HXb7p885FA8cBwObZZI3R+A4CAJjTlftM0DYbRQAAAAAAAADMLyIuFA7xoPkAem2Fe9PAofTmj9oyC13xgBIsX2beDR5Q0ooLYzq07sM5rZ9doXv1s80rKw0AzKHeGD0wfGiejSIAAAAAAAAAZhQRZ6WU19aAB0toQNcKtxmax+iVB5SgA5m5KqV8HHgtVw0cA7Bdgshj8ncZo/DdTr9soAJA09wYhWWwUQQAAAAAAADAvCJieh7wwjLwWNMB9PqiPW3gUHrze2bejj4E+hMRKw8oQVdGDuUdRcRxA8cBwGada0Gnd7X93Hc7/XINA6BZbozCMtgoAgAAAAAAAGBe9XnmlVJYnmq9Ad2DQet3r3mMHtUHlIQamOybQh8y83raNGXgEXi/BujfjhZ0BuAzDQCwdW6MwjLYKAIAAAAAAACgCUph+apmA+i19fOogUPpzUVm3o0+BPpSH1B6b1mp9gyiK2/r5ikjOqqbawDQNy3odEv7OQAwIzdGoXE2igAAAAAAAACYX0RMZVqvLAVf03IDuoas9bvXIkBv6gNKVxYW+lQ3TRn5M4HPQwD904JOz3yW6Z8NNABoTkS8dWMUFsFGEQAAAAAAAAAzqiXS76wBf6XJAHpEnGg/34hz7ef05FH4XDsGdCwzp81TPg26xnta0GEY/v4ZmxZ0uqP9fBiHow8AgLbUG6NvLAu0zUYRAAAAAAAAAPOqz3leWga+pdUGdC3d6/cpM1e9nRTDu9COAcMYOYStORSgf9OGSifWmc74DAMAbJUbo7AMNooAAAAAAAAAaMKlUlj+TnMB9NryudfAofTGg990JSLOtenBODLzqpTycdAl36vXPAD65m82uqH9HACYiRuj0DgbRQAAAAAAAADMLyJWSmF5jhYb0D10v37az+lKbcd4Z1VhOEO3oEfEbgPHAcDm7NUN2aAHvtsBALbKjVFYDBtFAAAAAAAAAMyoPq+sZIhnaSqArv18Yzz4TTe0Y8C4MvO2lPJh0AFMD2VqQQfon7/dWDzt58PZH30AAMzPjVFYBhtFAAAAAAAAAMwrIg5LKReWgedqrQHdw/brp/2cbtT2X+0YMLYphH0/6ATOtaBDn2pYE4oWdDrhu52x2EgSgFnVG6PvrQK0zUYRAAAAAAAAAPOSy+Mlmgmgaz/fGA9+05ML7Rgwtsy8G3i3JS3o0C8BdB7zNxyLpf0cANimRzdGgYbZQR8AAAAAAACgCZfyu3yvlhrQPWS/ftrP6UZEnAsy8Fxaort3oQUdgI5pQWfJfLcDAGyTG6PQODvoAwAAAAAAAMwvIqbnO48sBd+riQC69vON8eA3XYiI41LKO6vJdzg0rH5pQdeCDjAA13oWR/s5ALBNbozCYtgoAgAAAAAAAGBGEXFSSnljDXiJVhrQBaXX774+1AGLVkMMXsvAU1MA/dOgU9GCDtC/g7oJEyyJ73YG5XoFwLa5MQrLYKMIAAAAAAAAgHnVXN7KMvBSswfQtZ9vzEVtiIXFqgHLy9r4C/BFfY8bNeQ0XRPPGjgOADZLmJfF0H4OAGxLRBy6MQrts1EEAAAAAAAAwLzk8liHFhrQPVS/fve1GRaWbnodH1hF4GsyczVyC3oDxwCsz6FZ8hVHWoVZEN/tAAAbV2+MrtwYhbbZQR8AAAAAAACgCXJ5/LBZA+j1YXrt5+u30n7O0kXEuQY94BlGDTvtRYQWdOjHrrXkLwj10jzt5wDAFrkxCo2zgz4AAAAAAADA/OTyWJe5G9A9TL8Z2s9ZtIg4KaW8s4rA3xm8Bd3nKID+aUFnCXwmwUYqAGycG6OwGDaKAAAAAAAAAJhRRBzK5bEuswXQ60P0R1Zy7T5k5m1n58RA6pvcypoD30ELOgA9E+6lWdrPqQ4NAoBNcmMUlsFGEQAAAAAAAADzioipUObKMrAuczage4h+MwR3Waz6Jje9hnesIvBcg7egnzdwDABs1lEN+UKLfLcDAGyUG6OwDDaKAAAAAAAAAGjCpVwe6zRLAL0+PK/9fP1uMtODWCzZFCI9sILAC1wMOrSDiDhu4DiAH7NrfvwNIV+ao/0cANiSKzdGoW02igAAAAAAAACYX0RcyOyybnM1oHt4fjNGDd/RgYiYrguvrCVrIsg3nmkDi/tBz93nKli+Q2vI3zjVgk6DfAYBADaq3hi1YSm0zw76AAAAAAAAADOKiLNSymtrwLptPYBed8HXkLV+95m56u2kGENEnJRS3lhu1kiQbzCZeTfwRixHQokAQxD2pRnaz3nC318ArJ0bo7AMdtAHAAAAAAAAmFdEHCo2ZlPmaEA/t5obIXzOItU3Oa9fYB0utKAD0DEt6LTEZw8e2zUNANbJjVFYBhtFAAAAAAAAAMyrlkVPubwdS8EmCKD3w8NYLI43OWCdagv65aBDPa3XVAD6JvTL7LSfAwCb5DtjWAYbRQAAAAAAAAA0YXrG4sBSsClbDaDXnfA9NLR+HzPztreTYgje5IB1GzmYZ5MfgP5pQacFNkIAADbJd8bQOBtFAAAAAAAAAMwvIqYMyStLwSZtuwHdQ8qbserxpOhbRLz1JgesW92Q5cOggxVAh+USKOZ7nJkWc9F+DgBsku+MYTFsFAEAAAAAAAAwo4g4LqW8swZs2tYC6PVFvWdF1+4+MwXQWZSIOCmlvLFqwIaM+r64ExFCibBM/k7ie5zXtjmYg40F+ZojUwHgR9V7SL4zhsbZQR8AAAAAAABgXrVM6NIysA3bbEDXyrkZwucsSkQcet0Cm5SZV6WUm0GH7PMWQP92XO+Zg/ZzAGBT3BiFZbCDPsD/z96dHsd1nQkD7k/l/9BEAE6dAMCJgJwICEdAOALCEYiOgHAEBCMwGIGBCAwEcMpEBBYimK+u/LbcBLF0N+5yluepYkn2jKXbdz3LuwAAAAAAABThIuKJYXKzJKBH8JBq+NM4a/FH0abo1OgjB8yh1+/jUQSCAtA2XdBZgu7nAMBUrBlD4RSKAAAAAAAAAFheSmloCnvkUjCXuTqg6842jZuc87cWfxjNGoKTDl1eYGo552FQfdfpiT4p4BgAmJYu6MxK93MAYCo2RqEaCkUAAAAAAAAALCildCKWk7nNlYAuEWoaup9TjZTScL++ccWAGfX6nXyvKy5AF3RBZ066n/OkKFIAADuxMQp1UCgCAAAAAAAAYFkppddySVnC5AnoEUCkIv40Llr8UbQn3gMfXFpm9NbJZrVanXd8EnTFhUqklHyz2NeBYm/MIQodSAzjORLQAdhJbIx+dtagbApFAAAAAAAAACwr4jgv5OiyhDk6oAuIn8bXnPOvLf4w2qLCCrCUnPO34XvZ6QUw/gLog4IjzMF9BgCMamNjFCiY/R0AAAAAAACAIgzNGQ9dCpYwaQJ6BCa8cWUn0XNXVyqhwgpQgF6/l4cppeMCjgOAaR1GNzqYRMzpJKADAGO7sDEKZbO/AwAAAAAAALC8lNLH1Wr1zqVgKVN3QBekPI27nLPuINRAICGwqPhe3nZ6FSQkAvTho+vMhE4lnAAAY4qNUYWLoXz2dwAAAAAAAAAWFE0Jf3ENWNLUCeg6b05D8jnFSymdCSQECtFrF/R3KaVXBRwHANPSBZ1J6H7Ojl47YQA8x8Yo1EGhCAAAAAAAAIBlRS5Ir7kwFGSyBPQIgNclaxoS0ClaPP8fXCWgED0PuiUkQvl+do0YgS7oTEH3c3bhewbAk1JKr22MQvkUigAAAAAAAABYVjQQuhDDSQmm7IAu4WkadzlnCegUKwIJz1whoBQ552+r1eprpxfEeAzKp2MsY9AFnVHpfg4AjCnGFuc2RqFsKugDAAAAAAAAFGHIyztyKSjBJAnoEaDwxhWehORziqXCClCwXr+fh9G1CID26YLOmHQ/BwDGZGMUCmd/BwAAAAAAAGB50ZDqvUtBKabqgK5L1nQkoFOy4f48dIWA0uSch849d51eGAnoAH0Yio68da15Kd3P2dPPThwAD0kpndoYhSooFAEAAAAAAACwoJTS69Vq9dk1oCRTJaBLdJrGXc5ZAjpFSikNwUlvXB2gYL1+Q99HIhkA7dMFnTHofs4+XjtrANwXG6OfnBgom0IRAAAAAAAAAMuKnI9Ll4HSjJ6AnlI61gF5MpLPKVI89x9cHQoi+YGHnHV8VhQHAujDG13QeQndzwGAsdgYhTooFAEAAAAAAABQhAvNgyjRFB3QJThNR7AWxUkpvVqtVueuDIUx6OIHOefr1Wp12+mZkUgG5VI0hbHpgs5L6H4OAIzl0rgCyqZQBAAAAAAAAMDyUkpDs8U3LgUlGjUBPQIV3rvSk9EBnRKdCyQEKtLrt/QoCoYA5fnZNWFkuqCzF93PAYCxxMbokRMKxVNBHwAAAAAAAGBBKaWhGfQH14BSjd0BXffz6XzNOf/a6o+jTimlUxVWgMqcdXzBJJQB9EMXdPah+zkvodgRAL9JKZ3YGIXyqaAPAAAAAAAAsKyU0utoDAvFkoBej8veTwBliU66EluAquScv61Wq5tOr5pxGkA/3sSiFGxF93NGcOgkAhBj0J6L/0EVFIoAAAAAAAAAWFbEbZ5rHETpRktAj2TUd674ZC4a/V3Uy0cOqFWvFaIOJSMCdEUyMbvQ/RwAeBEbo1AHhSIAAAAAAAAAijDEWBy5FJRuzA7oumpO5zY6tkIRojvGG1cDqFTPRV0kIwL0430UioMn6X4OAIzExigUTqEIAAAAAAAAgOWllE41gqYWYyagn7jqk9H9nGJEgJLuGEC1oqjLTadXUMEgKI+iPkzpo7PLFnQ/BwBeJKX00cYoVEGhCAAAAAAAAIAFpZTerlarT64BtfjDGMcZXdUELEznstUfRpXOJCcADTjvdNB+kFI6zjkrbgPQh6EL+scovgI/0P2cMQ0L4zlna1gsJtaoX238+9/eO5bhnff6ieMb/reHWxz/7Wq1eurbev85uF6tVr/G3/+ac752l9CS2Bj9xUWFsqmgD/C0lNLrmDOsYt7w88b/4P5/3rRNgdGrR/77zbnCamMuYd4AABQp9pXWa6yb66/312JXW4yTbu6Nhda+3Vt//X291R4ES9iYK2ze/4/tN7x+Jrb2sfv+15gfrG3OFa5zzg/9b4DGxH7L5vtkzLWJu3vvmU3330Gb/9kaBTCLe3ON1QNzjKfeg8+Nwdaei/W4v177wxjNuIwxxP0ul4OqjJKArpvmtCSJUYpYTHvvggAN6HlT6tikBaArQzfKE5ecR+h+DhRtI6l8c7NxM9F8243EMR0+k6j+ZJBHSmn9t5ubm+s56npD08YlVYhn1BoDFE4FfaB3G/OK+39+nqnRwmNzhPv//e9FfTbmDTcbgY6//1XyFQAwpYgRfB1jp7cTjZse++ftO0b6JkGOfW3MGd5uzBmm2H946jl6tHBg3Pu3GwUaNv/YT4AKbCSX3//rXHudB8/sYT73DlptvIc2EzIvJakDz3lgfXYz/mObIhpjeVGsx+rhOcnqgXiPbxoG8YxLMZvU5v/93//934sPOaV0rQP6ZK5yzg9ViITZpZQuZx7kwUv8t8E7T0kpfduyu11r7nLOj1WBA2aWUnr5hAyeZ1zED6KS5jeLmYzofwXAs6sngi2sP/3b1WYAZWxUes4ohr2h0dkPYnQR1HNt3D+qv+ScPzb0e6AZkSi1ThRZ/33LY5V14Pfl6j+JJwK+AYCdxLzx7cYYqva12c0x0nWMkeyT8ru4519v3Pct7EesOxtfb9z35gYws3vFLH7e+Lb2sja7/gZfb/xVkQzoSMR/3H8X9ryXfL+AkOKiDM/Juaaw48o5/7+Wfk+pXtwBPQbLAoym4+NCEVJKJ4J/qcyrjU5i8JChQ9eHDs/MQUrpOOesQxlAP07jD2zS/RyYXBS7eH2vY8jP1pi2tj5Pv3cduNfpRBAli4mNUXtDUL4L436gRRHM+HrjT4/jknXHnt/nVzFfuNpIPLk0V6AWG2sIj9E9qiMbRQvv012xIE9cp02SjgoT79vh2h3HX1tr3PDQGGmdnHsZ4yMxuR3ZKLLwttF7frXR2fixucH63vc+hpFsvFs2C7n0vg77wzd49eN32L4mNGCjoM/rjXdhjw3hnvPYe3G1UUDo22aRUe/HtkVOnuRzqvTiDugppSFg+ZPLPxndoyhCx52CqZf3J0+KThj/6PQsfck5nxRwHNC1WIj7Z+/ngVkMC5avbCizpvs5E/mjIkf9ulfRfzPZ3HtmPt8FUQruZUqxMfrZSR6dDuiMSgX9yeiADjPbSJJqqUPhnO425gmXEjeZ0sb6wGYy+fq/Wxt7veBq4+9/6yQVf36718UMlGEjUfn+X1cjvdfX6yJr3zYaFvz+9+6H721cl83ndF1Acm2q7+79a7Z+flcbDXusb40kxlPH8efdLP/S8t1E0TYJ6Q2KmLCT+O4oovkft+v7XkI67CbGTW8lm4/mbiMh3bcYCrfxDlwnnHsHTuduo7jodSSle0c2IOYol56f8emAPo8xEtCvTdCn40GgBApNUCkJ6DwrpfRrpwP5u5zzz1v8/wETioW5vzvHzESAPL9LKQ33wi/OCCPznunARjey1xudzSV/lOvmXvCGatm8mI3RSUlAZzQKRUzKuBcmdi/hXMLI+O42kk4uJJ2wq5gTvNpYF3hVQaer+12lrqOTtniCkVXUBe1q4164bvVeuLeW9/NGAYDa1vNuIjn9cqPAhOT0Z0g639nXjYR066gV2kg6P9ZoaWtXcd9fuO/he/cSzu2FzuNqo0CGuRosyDuwSDcbSemKjFYm5ufX5inTkHc7jxcloOvYNznBRixOZzwqJgGdZ3XeBUiHSliYBHRmpgs6vzHHY0IScRqzEaD6diNQ1WZI3W42AjfMB9mZjdHJ2RNiFApFTM64FyYQ7663kSwiqHFewzzhXOAi991LNC85kfilbmO99HKjs5RnYUsb7++3lXdBG/ZQPuaczwo4lr3EvuPmc9tDZ877neGuPb+/3wsnHcfCjGE9PpKUW7iIYT+JP9YsX2bdHf3cu5QexfvkOMa0CreU4etG8TzfY5iQd2C1rtYJ6TEf9q4sVErpwrM1HQno83hpArquyNMSwMDidMajYhLQeVbnnYC+5JxPCjgO6JYEdBZgjok5HlPyjqncRpDqW8nm3RC4wU5SSpcSwiZ1G8HNbEcXlAcoFDGLdScetnNunMFjdCgskqSTjsW6wHGsCRj3/yeIV1Lrhhhvvt3oqtxSgnNVRcE2koyHZ/aogEMqyfr57eZ7Fs/mcD+cGleN7mojGV2h70LEO/BUEsdkFGGgC9YlqmK9Aka2sQ7kHdiO23VDAmtZ5RCrOYu/dPAbxzIUX90rJuWlCejXFjAnJXmSRemMR+W8Q3lWvOf+1emZuss5/1zAcUC3JKCzAF3QO2eOx8QkoFckKlhvdqiyxstNBG5c2IjkITZGKdDXnPOxC/M9hSIokHkC34ng7tMGkxZbJOmkM8b8W+nyuxbryuug9KYT/WrqmOSZ3cpNzvl1Bce5t1jn/ajb+SzuYv30zPrpcqLRyEdJUrP6GgmfFx39Zhom6bwJktFhTyml40YLyvGwu42E9EvvzPnFM/e33n43Rds7f2jvBPRYvPqn+2I6NS1q0yabFVROAjpb6bygjucEFiQBnYUI/O6YOR4TkwRWsFjLfbvxR0AFTxkCN84kmrBmY5RC3eacX7k4/2G8T6HME1jPR04Fd1dN0kkHjCW29t+9zJU7LRpSzfX1zG7tjy1+v2Kf+aMCZIu5irHRXl3D2I0O/8VY7xucK3hPbaxLNE0yOjxjo/DGiaTz7t3eS0gXCzKhGH9ce+4o0F7rn394we946y6Y1FXDv40KxMLdqWsFdOCi4wT045hIAsswp2IJ66rwdMYcjxnsVR2TaUg454WG++XT8CeldLORjC6orEPxPhFMS4kOhzGud9O/RaEIySeUSKGITm10yz3teA+mJUPH43cppdsYG54LUKRjH2OdvVnRXbbX9/cwdvF+a8tpxIQ0QeJ5MYbz/yYKQUjInVB8k84kbRRhvW/wMaV0Zk5A6axLdGN4N30Y/sSe5rnvMijgw6OGe+F9/FnFe3OdjK7w6IjiGbwwj6FQe61//vSC36JS+bRUYWJppz54QCd6TsA2ngPoz2Fs1NMfczxo2LB5MSSepZTOU0rDIvE/V6vV59g4sqHISxzFvfSvuL8UUeqIjVEq8NpFUiiC4gnw7czwThrGjRG88tk90JzDKHjyT/MDOnYcc6WmxNrSkFD2a+fvb++19ryJOVPVhm9uSmmIbfm75POirBNyv8U7VKHekcR+x3pOYW2yLAf35gQKz1GUodOvdYluHcV32Z4m3Yp5w/AO/Fc8D2JFeMpRFPH4W0rp/1JKF0NcqfHdKM6MQSjYXmOkvRLQY6HknbthUrqRsjRJKdTOoj5byTkP39y7Ts/WkIQoUBegPzqgd0b3c2hTbB4OQW3XsYH4NwnnTGy4v/4+BP6llE4FVHbBxiil635dS6EIaiDYsw8bSVH/jHGj91L71vODS885nTloqcj3OvE8EnR+8f4WZ9KoamPgJJ5XY52Q+y3eqewpEkcvY7/DXkf53kciugIMLC4S5ob3xz+sS7CxZnGtSQc9iHfgt5g3vHfR2dO7KN7yz3h/fpRjsLv47ngOKdlez/W+HdBtHk1PB3QWEx89C3jUzoCXXfRc+MW4DqA/uqD3R/dzaEAEBJ9E1eFfY/PwF8mhLGCzs48OJ40aigzYGKUC3j8KRVAHz2rD7gU3Sorq05uNQlXWHOlFEwnoMe+TeP49cSZtqu77NKy3RedCY6y6/JaIbly0u9j/OIvEUfd8fRRgYBEbe6frbufeH9w3rJ1/HvbWFcugNeuCchE78lnuDyM7ijHeP2J+c5ZSaqYg41QiYf9zm7+Ohuy1b7tvAroXx7Tucs7fWv6BFM9CENCbnhPQbXoB9MmYvxO6nzMjG/oTiG4fpxtdzj9H1WFBwZTgYKPDybmuh+2IjdFPvZ8HqtB1cohCEVREAnpjIrjxdCPAW3Ajq7gPPku4ohPvak5ciI7K32LeZ43pexJS2nRYUwHFSOC8Nt+r2npcdKlj4PNiXXm45z+Ufqw8abMAg70CJrVOuoxiStYl2MbBRrEMxbWp2r13oIJyzOEwxup/i4Ie55LRfxRrhT3no1CPvYrbS0Avk+7nLCYWf0zGgd70POA/UtkRFuPZY0m6oPdD93OoTCSdn0Ug8D8iGFhnU0r3ProeXgouq5uNUSrTbRC3QhFUxtigEfeCGz/ZU+YREtHpRXWxc/Eev4iOyt7hD7MG167in9mN4hCSSNrxJjoGnonL+dFG13PfpbYcxl7BhfuesUm6ZAT3i2tLRKcaG2Onf3kHsqD1e1Qy+o8uPJfUYp8x0M4J6BHQ4KGYluAulqQzHtCdnPNQ/OWu4ytv8gfLUO2cpemC3gdzPKjAsCETGzO/RtL5BwFXVOqNRPTq2RilJl3eqwpFUCEB5w0Q4M0eNjt/mhvQoqru6wgGHt7j7wo4HFhCsc+sJNwuDOv918ZE/xFx6Je6njftXXQatlfNi0k8ZyIS0anCvXegsRMleSgZvcs5T8zp3xRwKLCt6RPQJSjNQgd0FhETKJtNQK96Dtq0yQXQp0MVKNsWXaZsvkKh7iWd/y02ZjyztGIzEV3hpUrYGKVGnQYyKBRBbXQSrdiwtqATJy+0OTcQ0E1LqhiHbnQ9/5v3+HasYzSryHi4mNNeSyTpwrordPfdv2MB9AAAIABJREFU0GP/8tJcsQvD2OOTbujsS+I5M5GITrGikIt3IDVYJ6MPc55vEXfQhYi/NaenNjuvbUtAL5MEdJZy4swDHes5Ad34DqBfKo63TZd7ZmVDdnuSzunIkGzyD0Eb5YvATxuj1Kir4FWFIqiVcUB9omDWENz4WSdORvImArq7T7qiGYelJypHYquu57vzjmpUSQXMdD3v2robenfFLuK+P485hn2Rvqy7oWuQwtZiz+Ja0iUzeh/f6I/WLVja8M2MtdlP3oFUaJjjdjHfiXndeQGHArvaeayzUwJ6DKZUnZvWXc75W8s/kKJJQAd61nMBmAOV3AG69cZGb5tiQ1bQEnOTVLI9m4T0RtBGwWJNoJsq5DSnmzUthSKonLlCJYZxwdCpOgpmWVdgCh8i+URsAi0odm09OkX+3RoUfKeIZzbWYS7N77p2GEU7uykUHkXJLmOdmD4dREdMBdR5UiRdXiuIx0IOoujBt56+05RjGDPF2qxCVVC4iHs5t/ZGpXaOsdi1A7qg9Onpfs4iIunEQBXoVs655w7oK13QAbpmk7dNrisApVkHbQyJ6OaghbAxSgO6KGqhUAQNkIBeuI1uhP+ITtUwpWHs+XkIqFUgmcoVF0cX7/OLmH+zH/GR7Vr82kYBlktNoAifhjF46wU7Iy712n1P+CXmAQrV8p1IuryIpEvvC5Z2EN/pb5p6MJco0nJtbRaqcW7MQsWm7YAuMWkWEtBZigrjAKvVVcfnwEIZzE9gHaXQBb0xup8DULjhG/W3CDKTjLY8G6PUrvm5tUIRNMI3v2DR0embboQs4E10//woAYVKFTUW3eiq/K6Aw4ESLfbMbhT7+Wxuxz3DGLzZddLYs/y7+5573kShWjEz/GYj6dI4ltIMe5p/H4oj2NNkKsP3MKV0HYXkjJloRdNNAWNPxbiFmu0cI6QDenkkoDO72MxVYAKg7+/wG8E9MDsLhpREt+y2uJ4A1GAdZHbqai3DxihUQ6EIWmDtuUAR3DgEgn2yVsnCfom5gZgkanNYShJCSulYV2V41sESyY7xnrhU7IcnHLWYjLtRdAEechjFF8wBOjZc/6HDtKRLKvAuvtVicRhV3FP/MJeHesT49ZNLRm+2TkCPhTDds6b3rfUfSJGOTd5pkMVJ9tF0xa0teG6AGt26aqPQBb0Rup+zMJ0KgF0Na5KfdEOfn41RGvKm5YupUAQNMVcoSHTgXAc3Nv0epSrrrmJnCiZTmcXX1WPM+DdxP6MxbmnbrM9sJBRfSyhhCweRjFt9E6GYb1wousAWDmIOcOJk9SXeE0ORir+LbaAiwzvrl6FTtfgqXupe13NoUZMNAWPd+qKAQ4EX27UI3i4d0HVHnkHOuffEN5bh+Qb4t547oK8koAOVGuZQX128UdjYbYOKyyxJgDiwL93QZxTJ/jZGoXAKRQBTiHeL4EZK9iGSrySAUotF79VI3DFmHJc1zrbN9sxGQuU/FIdgB8O98reak3EjIeNSMT129FkSej+i0MY3RSqo2JECerxE7IdfKlJF435t9OddmuPTkJ3GMbskoEtImp7OfcwuJj8W/AD+XQhmWNy86/hcGO8BNRre3Weu3Cje6zxaN93PoSo3Lhf8YLMbuoCNaV3YGIWyqaBPg6w3LCy6i53pLkYlhgDcf0SnfijdIvur8V6/lrgDO5slAT2SSj67POypymRcHf95IUnojYvx67De+Tf7EzTiQxTXFnPLVjbeg5+8B+lAcw0BowikuQ7dkoBelm+9nwAWofs5wPd67oJ+JMgfqFHO+VJBr9EI6qyb6wf1aLXaL4xh6Ib+TcDGNGyM0qJG3xcq6NMaCc8LikSQywiMhZr8okAVFZh9frXxXje3g91N/tzE2ssn14YXqioZd+PbZO7HS0hCb1Ss315rlkaDDtfd0F1cnrIxVvIepAs556ZiomKMqggkrdmpSONWCejxwRPkML2eE95YjkBOgO9ddn4+fBdgBpJpJiHxdhy6oFdK9/Nn3RV+fK0QEA6M5SACNozxRmRjFOqgUAQwphhP/cN7hYopUEXx5rw/JZ/Dy035zMZ8ztoLY6kiGXfj2yTGnDFIQm9MJOb+XSwDjfuQUrqObyJ8J75r5vH05Kal3xrvdoVGaNFOcZ7bdkC3kTMPnY9Ygg7oAN/rvSCMcR9QqwsJpqOR6FUn1+1xw7vhvNSDa4wNVWBsOh6OxMYo1EGhCGAsw/hpGEcN4yknlQYoUEXpZlkTi6RZCX7Te9P6D2SaZ1byORMpOhlX8jkTkYTegKHxwZCQOyTm9n4u6MaQXDzsaZ665KzFWtZnYyU600xeZMSpXHiGQQJ6aXrvuMrMYnPKxxDgexLQASqUc/41Fnt4OV3QK6P7+bPOvR8okEKUsL0h8FvXgBewMQp1UCiC1vmWzyf2gL9JoKNBQ4GqCwWqKNDk37hYA/67eR2MYvRnVvI5E/s8Zef+fUk+Z2LDfa+5VqXi2l3r9kuHhm/iJ2sXRHHQc8VB6VRLeZHnYjLh3ySgl0XgKXOzQANwT875W+cddI8sfgEV0wFnPM5lXVyvp0nioUS9F76CXR1G1wBdT/ZzYWOUxlW/j6lQBJ2w7jyD6KojQZGWvYu5gaIWlGTSgq4xF/7sisNoRv2GSD5nJhcljX8knzOTc+P++qSUhr35v3k/0Ll3imv3K/Z7Ls0R6Ni3Fn567LW8K+BQYCo7jVOeTUCPgY9JwAxyzgJPmZviEgAP6/2b7PsAVCmKiFy5eqM4VpCkDrqfP+tLvBsAqN9BdD05dS23Fxujup9C+VTQB14kuupc6qpDJ44iCd1+FqWYbM4l+RwmMVo3VsnnzOggktAX37+VfM6MDmLcL26hAhvrEh96PxcQFNfuUErpVYyTRptzQIWqj9NLKR3ba6EDO82ztumArvLOPHrutMoCYlHG4BbgYRLQgalN2g2jM/cXrHQ6HsewmSu5qw66nz/N+ZmX79v2fq3lQKFAnyK4l2fYGIU6qKAPvFQkgFwrOkNnhvXLvwvkphRTdLaTfA7TGeOZlXzOAg4joWkxks9ZwMHS9z3Psy4Bj1oX1xbL1oGNd6H8HLqWc6567BaFJMSjwD3bJKBLQJpH74luzM+zTesUUOEleu+S6fmB6UnQG8937+yc88Vqtbqt/DeV4lQ18bLpfv6sK93PZ+d+3J61QHiZ95LQn2ZjFOqgUATwUvEeuTQfo2MCuSnFqPs+ks9hci+KiYhnVPI5Szhaal1U8jkLOjLmL5d1CdjKh5TSpRisdhknwe+qjtuN9/SFZxl+JAG9HLoeMTfPNq0z8OMlek8GUY0UqJ3Nx3Hogl4+3b2f5vwAtG1IQr8WrPEjG6NQB4UigJdKKQ3rNn/zzYffArl9U1naaAW+JZ/DLPYuGuEZpQDv4z6cTaxhSKpiSR8i0ZmCxLvIugRsZ4jJvYxEZRoi+Ry+U3v+xRB3fFTAcUBxnkxAjyAlFanm0XuiG/MzgQF4XPff5ZSSQiVAzYZgwztXcBS6oBdK9/NnDd3PLzf+n7of31Ec9ySM4yiCNYxXvmdjFAqnUATwUpFs+8mJhN+9102MhY2ytyqxFWaz1zMbySUKYVOCs0gKn5w1DApyPtd9z/NiXcK4FXZzJAm9LZLP4QfVxkLFmtz7Ag4FivRcB3SJR9Au3W0BHpFz/lXionEgUK94j1+4hKPQBb1cuns/7bsAsHgvQDHckzAqSegbohOqjVEon0IR9Mia8wiGMU9K6cL3Hh70xtyABb04GUryOcxq52c2vi+SSyjFwYz74ZfWMCjEQTQjYGGRfG5dAvZzEGsXJ85f3SSfw4OqTECP59maHDzhuQR01XXmc1nKgdA+XW0BttJ7R0LjQKB2ug+MRwJ6YXQ/f9ZtzlkRioVYc9jJTUXHCqWThP6fjVGdUKFwKugD+9pIenrnJMKjzA1YyovWayWfw+z2eWYll1Cao5TSpAWrI8lU8jkleTP1fc/joijetbVNeLFhTPlZEnq9Yt3pwvwAflBd7sXGvgvwBB3QoU+SCgGe963zc+RbAdPyjE0s5zwsZl01/SPnc2DTozg21Z/m/FALXdBhXEc9dz+xMQp1UEEf2NfGt17yBzxPEjqL2Lcwo+RzWMYuz6wkXAr2S6w1jC6SfCWZUqLJ7nseZ10CJjEkoWsKUpmN96HGIfC9oWFMjbkXiknAFp5LQH/jJM6m9yQ35vXK+QZ4Vu/f5sOUku8FTEfg2zy6TUCagITeQuh+/qxhMduzTy2qq/wLFXgXAcE9sjFKz6oIOFUoAthXBNZ/E+QNO5GEzhJ2vt8UKIJFbRUPEfsyknAp2ejroSml4yHJ11WnYGcuznwkn8OkPnW8t1mrC+9DeFCN3c/P5M3Cdh5NQFcdbF6VVvqgXp5vgOdJBvG9AOrwaPfYSEK9dR1HcagLejEUA3iajTlqYj0QpvE+Ngq7YWMUqinyplAEsLOI27j0/oC9SEJnbjvtrW6844FlPJuAHs+pJEdKdxTdykcR9739Nkr3RtfgeUg+h1m8l4Reh7hO9mThYVXlXUTRrQ8FHApU4akO6BKOoF0GvgDPezShsSPGg0Dxcs7PLVxZoB+PxOeF6X7+rLtnAsEUpJiHoO7tKXoF0/nQS/Gc+J02Ruld8d9UhSKAfUg+h1FIQmdOW++tppReecfD4t4+dQDx7Tj3nFKJ0/i2vIj7nsp8NM6fluRzmJUk9MLFnuz73s8DPKGaIouKbsHuJKCX4ab3E8B8LLgAbCfnrNr8MxuuAJXQlWA8uqAvTxGAp53lnJ8qIqTb9DysKW5PAjpM63NsHDZLFy74XdGFJFXQB/Yh+RxGJQmduWx1j8W9eOEdD4t77pn9KOGOihyMtE547r6nImPd9zxA8jksQhJ6oWKt9nPv5wGeUkvehaJbsB8J6GXQYZU5ebbpxhiVXaFzvhkwHYFuM4lk1C9d/Nh5SIBeiO7nWxFgQFXiG3XnqsGkLltdH7IxCnVQQR/Yh+RzmMSRbzIzeLPlv+JCIg8U4dHnUCExKvUupbR3o4mU0unwz3Dxqcz7l9z3PEzyOSxKEnphNorIAY+7qujcnBnjwO6eSkDfdlEcqIuEXHrifuelapoQTeFAIQeYjAWMeVmYH48u6MuR/P+0L890P4dS6YIO0zpoOCBANyIonEIRwD4kn8Ok3gniZmrPddqPe1BMHhTioXiIjbkc1GivYs0xD7EXSa3cuyOSfA5FGJLQvdvKca5hCDyrlu7nQ9Gt9wUcClTnwQT0WExgPt+ca2YkkRCAXRgXAtXLOQ8LXDeu5GgkoM9M9/Ot2HyjVlVswkDljlJKewVelko3IqiGQhHwPWPfZ2wEeUs+h+kI4mZqj+6txjqvIFcoy0NxdAqJUbOjXYuJK6BHA97ogj4qXUGhDL9oELI8e7KwteL3f2K8+KmAQ4EqPdYBXaLRvCSgMycJ6ADb043QuBBoR1NJRwuzgTs/QbFPG7qfW1sph/Hjbsw5YB4fUkrHLZxrG6NQB0FJwK4kn8OsBHEzpQdjcqIZzGdnHorz3X5XrB+Zy1G7XfcVP0o2pQHnLuLLpZTOFUyCony2frGclNIr8VqwnWgQVazYf7lwOWF/EtChPxLQAbb3q3O1kmAINCHnPGyU3bmao7HAPhPdz7cioKAsP/d+AnakCyTM5zwCBaoVx29jFAqnUASwq43kc0kfMJ/PimwykR/mnRvveaA8P997VhW0pgWH2yarxXjog6tOA7a+73lYFNSUfA7l+RwFzZjfhWKhsJWrCk6T4r/wQhLQAQAep5OmwiVAWwSNjEcX9PlI9n/a1Q5VVAV5Upyc81D06saVgVkcNFC0RKADFE4FfWBP55LPYREXtRepokgPxdwJcq1LDYHTjGfzmf2oIDANeXZ/MdYwFHmmJfbV9xTJ+wpqQrkuJaHPK4pyWK+F7ZTe/fzM8wwvJwG9DLqrMqc3zjbA1iSg/7tCrC6WMCIBbaPaNQjIBvq4bOBOTPfzrbgPaYHiCDCfNxEwUJ2UksQ0qIPkImAn8Y1/56zBIg4iCd0+GGP67n4S5ArF+23fNhJ6dIGmJdt0g1Z0gdbogr6H+AZq5gBls34xo4jtFIsE2yu2MHeMDc31YQQ/JKDHB1NgxLyue/qxAEB1FCeCcUlAX0jOeSgs8qXLHz8NXdCnZ0PjaTc7dD+HkrmPYV4faysKFRuj7ws4FOAJCkUAu/KNhyIcKVzKyH5vCpFSOhbkCsVbJ99KvKNFj+4zxh6vbxQtkoC+g0hmVVAT6nAormA2596LsLW7nHOR+ZCK7MC4HuqALhkCgFboXs2LSGj6nQR0oCWCCcdVZQfRGkRwoq4DT7NIXKY3NR70wsw7YF4HNY0JbYzCVhYPbJBECuwqEj4+O3FQhHcpJeucjGZI5InCZ/YjoALxDbCuTYsOY7/xIb5RtEoR/d1IPoe6HEUhXCYS3xBzA9hekfFOUWTnwjgHnrTT8/tQArqJFwBNiC6nwMspUAQ0I4qL3Lqio3lXWwfRigh6fdptztnGGk3IOf+6Wq2uXE2Y1ZtIFi2ajVHY2q9LniqFImA7Cr7+R7w3Lko5HuA3nySqMKLX5nJQlU8uFw37Yb8xpfRREWwaZ599C5HEelT8gQL3va9hj7Ni4pBgN6Xuc5yb88C4dECHjtgwBWBPOqADrfnoio7K+RyZirpbcd/RGsknML+zSPAu2YWNUSibQhHAruK9ce69AUW6qGCOQB3OJPNU7br3EwA05c1mMfH4e8m5tE4R/WdE8ur7og8SeMrnKHDJiFJKp/ZlYWfFxTpFwa13BRwKNEUCOgDA03QilAAHtGdY+LpzXUfz3gbu6CRXP+1uzwVsgYOUTAI6zO+g5G9ubIyaj0P5VNAHdqXDGJTrQKcrRuI9X7dfez8BQHM210DPFMOiEwotPCKSVs+KPDhgF5eK6I0nzqVYLdjNTc65qDWUaPrzSwGHAs15KAFdQBMALbhxFWE8FqtgVG+dzmXFwpdAwnFZhB+J7udbOdtzAVvg4EwUpdhdzvmbeSws4kOJ76yU0rGNUdjJIuM8FfSBXXlvQBXeRccrAIBWHA8xP7EHaT5CL05c6R9F/N+5QhTQhANF7kd16t0IOysq/jbiPrwXYXs7NXP6LgFdcCgADZFcAuN67XwCjVHReVy6oI9HMv/T7jy/VfA+2I/iKLCMEjdGvQ9gBznnnTZHx6BQBOys+2JLOm9AVT5FV0AAgBYMyVTH9iDpzEFKSRL6j4Z99qPSDgrY25soeMkLRHEOxQhhd5elnLN4ji8UkoCd7JRvd78DuuDQBeSci3nxAgA/+OaU/EagDVCivZMMotPsV1d1VDY1Xkj3862c79n9HGqgEi8s4018gxdnYxTqoFAE7KXredzGNx6oh2899Et8ANCiM3uQdEgC+oYoqPm+mAMCxvKLInovpvs57O52iQLhT1BkByZ2PwHd4AOAVijuwVhsMP+bQkVAiV4avKyL8rjeR0A1+5PE/zzPLc2K4ijdd4aEhZTyDbYxCru7m/OcKRQB7Ml7A+pzpIsYdEt8ANAi8xF69CYKSXZPQU1o3oV4rf3ofg57K6bgbkrpRJEd2IsO6AAAjE6hIqA5OeehYM2tKzsqi/J70v18K18iQRdapsgCLONNdP9YTErp1MYo7GXu6voKRcB+SuqEMav4xpvvQ510EQMAgLotuu5fkHOFKKBph+IM9nbi/Qh7KaKwTazdfi7gUKA6Oeed9m51QIe+vLRDJNREB3QYl0JFMB4VR8tiAX5cp6rq7k1Hpee99BxJXp+PNcb9FVMlGDq02LgwNkY/uemgbCrow4t0uUfpGw9N0CUQAADq1X0BfYXxoBvvly62XanuvxOwh9tdE1enEDGqYqxgJjqgQ0dK+NADUK1Dlw5GIymvLEMA4V3vJ2FEBxbnd6f7+Va+vrT7ue7ps1KIYk855yEx52uVBw/1O1wiMCM2RhVShP3Nsu+hgj68WHcJ6PGNl7gK9TtKKSkcCR3JOZujA0A7DmNdr0sppVcK4UNXzjUN2V7sC4uLht2VkvR94RmGvd3s+j+8n4Du4QOgCTYFGZHiHaHnBXmgXZHopxLiuHRB351N3+ct1pUWFiBJBZazRCGdiyjiA+xnrqRW683wMj2usw9z/aMCjgN4udNI3AAAAOpz0vE1O7f/AF05EGuwEw1WYD+Lv2dSSmea/cCL7Bxj8XsCuoQiABpy62Iyou46szxBMiHQKsm/49IFfQe6n2/lSoEpepJzvjCvhcW8iW8zUI9vrhVUoat19hhPfCjgUIBxCOAGAIB6Hfd47VJKp+IQoEvvorM3T4hCg96RsLvbnHMJBYfldsDL7Pwcb3ZAl1AEfbhznemAoEOYhoJFQJNyzsPY4crVHZUu6NtTAOF5up/Xx/P/cgLbYTlzf5sVWYGXmWst2LMKL1BIQNIsYj3EeB7a80YAN3TBXhEAtOcwEg27Eb9XHAL061zM1rNOCj8+KFUpex/2beFl9u+ALqFoObrPM7NuAjzomkElTMOiFFCaMRMNJLiO66DXSuK70P18K7fRDZq6WOt6OQkrsJw3MwejWceCl5GADuXrrTj2EOB9WMBxAOM7E8ANAABV6i124SxiNoA+HShC8SwJ6LCfImKZcs72beFldECvlHMPMC4d0GEab51XGIWkvPGM9s2PBNfbAn5TS2xmPM85et7Y56i3xAcqlXMevnFfXT9YzGzfaJuj8DLxzZyDZxX211P382EN/UMBhwJMYygucercQtPEmgBAm7pJNIy1iXcFHAqwrA/xPuCeaB6qgGj7rl7wRwzpw65m3Jfd6ngKOAao1c4d0P+w8feSIKAP1zrs0QGbggCUTJXhcg0VGn/p/SSM6DCldJJz1sX3Abqfb+V2gvvHnJianAkQgcUcD50Nc847b7rs6cr3CfZyM9dpyzlfp5TuzOlhLz3t2ZwVcAzAtE5TSueFBVsC4/FsA0CbjmZe81+S+Axg7UyO2IN0P6/bXcR+fbv359dhL2+KX5ZSerVarV7Ff9z8+3WRh172+UsbY1yKsYD97NMoYzMBXRdu6EMPCyh0TucomIyJGtC6Mwnoo/tog/NRup8/T+A+XRvmtimlW9W3YRFDgunxjOMYm6Own7mTQy4Vh4G9dJHIlVIa5vlHBRwKL3c/iPHXjU7+OwcybnSb+jmCftd/fa2wSZUOYl1PsDK0SUwVALRrzjX/RcTahH1FYG0ovnGacxZ7873jkg6GZ13F/tywJnu9RFHI+Hc++++NdeDNtd9XDe0ZDGvmFwUcx6ZLsb6wl7t9/kc6oEN/JqnsAwWZresNANCWodp1SunLarV679KORhf0B+h+vpU7xQuq9qrh3za3IVDkc18/GYpxOnMCus1R2N3c+x0S0GE/zRcNjg4opwUcCru7WQcvbgQxjpp8eK9w9ndBekMHvuiU8zr+ar2oDu+HxA5d0KFJYqoAoF1vW95/tjbRvZsniin9rGhi1z6mlM7HXu+qVUrptUIdxbuJNdTL2hoSbhzv/TXg1xtJ6a8rXQO+KO09Ek09CjgSqM5e65+bCegqK0MfTCBonQ1BmNAwEd61uwdAZc4koI9OF/Qf6X7+vDMbYFWzYTeSoYBHSunM2u1vru795+uR1rlePVA0QSdCVtEVYJY5sM1R2NsSHdCB3fUwtzNmr8ftOoAxghgXvT/j33+xGZSYUjqOxIhj8+uincd1AtpiTRoA2tX6+P2jtYkm3W0Uzft146/f9i2KFsUKXm106d3s1useas9BvB8UqPi3kxIOgh/cxFrbRYsFHyPe4LuYg0hKf7tRnLT0deCzAo7hIVeKusLO9k9Aj4Ek0AHBjHRAECBM62fnF2jZsOCXUrIwNS5d0Dfofr61UheuYQlnDXdGvrsXMLHa+M+/llD8aiMIY7URhLEZkKFjQNtOZgzIMAaF3c0ahBLzxTtBeLCb1guaxjz/XQGHwuOqCmDMOa8T0k8jEPE0ktF9f8ryZnj+a+vEBDxNIXYAaNoQt/CqxcS2WJvQaKENVxED/Vuy4hT3a/wz1//c+11613ug66RI+1Zt+DAUvW/x/bcHxQTL8iUalHQ3F99ISv8tPi7iUtZFSd8WthZ8U/A1uvStgp3tNR5Yd0CXgL4s55+53aqWTsNsCMK0jFvgBWLTh/KdW5ga3Yku6L/T/fx5X3Q/h++cRcJBrckG9yvzX5aSXL6Ne0EYDyYWbARjrJPV38Zfrb/Vb84EdJujsKOFEr4uJZrCTm46OF0KqJXpNtaizmsOro1500nMOY5jXck8oxwfBS5DU+5cTgBo3nGj83gxCPW6jTXniyhIt6iI07jc3BONWLfj+GNNol7nva9hRIKv4vJlGBLPPyqK8B9xLs7X8ZUbHdKPC4ghKHnsdNlwQw+Yyv4d0HWyXJxELuZ2bRJIo+5UpIbJGbcAJZkkQXXo1J1SEsw5Lh2BdD/fxZQb5NeuAbUZNvpTSheVdC64iufs20Zl/uYLSmwEY3wnkkTebvyxoV2fg5TS8UxBPzZHYTdLJbVKQIfdtN79/MQYrzhX0TVn8aDtMcWc47cAxFhf+mh9owjWPKEtYk0AoH2vW/uFYhCqdBedx6vo+htz3uHPaSTwnkpGr5I1DEUES/B1eIdIPH/eZof0jbiTdXf0Od+/Q25OsU2HhndaSqmAI4GqvCgBvbkJFfCkawFSNMrmPkxP4SKgGBNvxJxLABqdjkAqj2/jy8QbDTqrz8Tm5eg+FpiAfhXz8HWiuU3CeyJJ5CL+rO5tDB5X3NW+N8frazglm6Ows6W+O8Y3sJtmx4gxttP9vBxfagncfqmYa7+NJINzAd+Ls+YJ7bC2BQDta3HsXmxSGD+4ibWLaq9Z7AefRjL62/h7+Qj16H0Nw/rNcm5Xq9WJGKL9PBB3su6OPkeB3Br2QK4U44Gt3e3bSOYPW/z/AO3RTYdWmZjA9BQuAnoZV26dAAAgAElEQVQhAX18XVfTVXl8a4L34QHDZn5K6cuCSeg3kWh+GcnmOkLt4YGNwXUieg3d7Xt2PONv/9NqtXpV+Lk2Rp7OrWDBnSwyrxi+gSmlvyzx797BK9+WSV3Zi9hJy++1UwWFinAVXXO6m6PEGturlNJpBBC7H5ehgxi0QwI6ALTvcOjg3EpR5ZTSiaJkVRjWLj62Nm9cd0aPruglFlPnR72vYUhAX8bXSD7XMGQk97qjv9pogjBFQZAa4vhqKK5hzDat0vfuS7L3PEgH9DLoJMrcBAnTKhv7AMAoCkj0a1XP1XR1P3/elaRWeNKcG/c3Mcf+7Y/NwGnknH9LRo+EkZNIYrLpVJ6DoVhAXK9J1dD1IqUkAX0633LOxowVKP06RfErc9npXHpWie7np92fiGXpmhNyzkOg4UUEA+o6toxT+9TQBM8xAPThbUMF86xRla3JxPP7oqDDSUrpo0T0KnQZtxVJuvbh5/cl53zS24+eU7yDh3HNeexbHI+YjP6lhlihdUGUAg7lUbF36x00Efu28/gp/i0SoJelAACzioHArbNOY24lq8AsSu/EBqXzDNVF98HxvYkFta7ofr41i4HwhNg4+jLRORoSzv+6Wq3+uFqt/ivn/DrnPHQRvJB8Pr3hHA9JIznnV9EB27pdeebsgg4AlO9Mt+lF/WUYO0s+/49hvphzPo75xF0px9WRdxHIDNRNB3QA6EMTMfu6nxdt2Of7Y865q07TsTYx3Jf/Hcn3lOlNvD96I19rfpLPZxZxJ+exTvxfsVb89QVHIY4P+N0fnAro1qUqYzRGkAnMw8I1vIwgtIoMG0EppSEh76j3czGyHqvpWpB93o3A8eYoeDmNsarGDwkJFxsdzgXYFiI6YJ/Hxv9Hc7BiSEAHAH4TSab2WJdxE13PFaR+xDCfSCldR2FNa5rzGuZvgmqhYtbH6MCwJrw5jhr+/qHio6831vd/NqagAZtJkN8eKTjy6l4sh8LibWslCVEMQpn+Gl3Puy3wHePqtyml41ifUMSxPCcdNmWRgD4vyecLi+/QOvbkVcQ7nOwwv/tinQTYtE5AN1mG/khApzUXrigAMIGho9VnJ3ZUQzXdV70sUup+vrWzmf49Fsfn89o8bXzDuzOl9GXPNZ2buCYXEjbKt5GIPgQQnQrOWNzB8E1XLAUAEOC9mO4DuLc1zPdiPepMPMCs3qeUTt2jUC0dGmnFbeyDXG4k2l6/9PuUUvo51vw3/0hMpyRXUVTh27q4whj7IDGufrVx39vzbUP111H38yLdRtE8+0gh53wRSY/Dnue7Ig6KtTcd7nv21ihlSTeSz8sSMZrDWvFZSul1JKKfPBODYh8E+I4O6GWwKMESTHJpjXsaZjJMQCWsAL2IrkFnkr5G11NHIAuyz7uNRMs5SECnBbt0Qf+67nSuOnGdcs4fU0rnEZxhHXlZx9afAKBvup8vYujUeTrjukETIsnsJKU0/PVD7+djRqfWAqFa9r6p1VWsV13HGvAkhVDin3u5uTYWSelvY83s2F4qM7rduB+vp4xfeigxL5LS1/e9BOBKNRD7Zt5Rlq+RfK4g2T1xTo6jaILYq7J87CwpWwf0edzFGIlCxfhnWMM8TSmtu6LfLxKi+znwAwno0KnomHWjGimN+Grxhgm9cnJ/8HNhxwMwtWET5BdneVRDR6CPrS9W6n6+NRvksINnuqDfrbucTxlwyLzie/k2uqEbkyxHZXwAwPx1XsP85q2CuPvLOQ+BhMP5+1zrb6iMBHSol28NtbjdWPu9WPKYY+15vRa9eiJ5AcZwtb7flt5fjqT0y0jaeR1jQEUY6vO61u9/vG8VPyjHn3POZ72fhOdE84/rKLgtb6EM3XRBj6KivtPzOJO4XI+YU17EM7Luin5ofRN4yE8RDM3CoiIkzE3HHlqx6KYKzZOADlCmqxmPSoelafSwWGlB9nl3upjBXk4jGWMVfx0S0v+Yc/455zxU2L+QfN6eoRv6arX6341rz7yOrOMDQL90P5/dUEi99o50RYh1lz/1fh5mchBd3YD6+N5QsmEt8K+r1ep/cs6vhgIzSyefPyTWpIekyP+O9Wp4qZsYx/5XznlIkCsuoWmYrwx7MhFb9hdr91WpuRPuaQHHwL+f9z9KPt9erPG8jfc7ZejlfSIGfB63Ec9AZYYx9nDthvlmzDsVEQB+oAN6OV5LBmYBw2L0ByeeBkhAh3lZkIH91byJ1a3oNPtVxf7RNd0FXffzrdmQbZdv3oSG5PJ1UHuJwYZMZ6hCH9+YCx0uFnGsOBEAdEvw3HxuovO5olojiU5jK53QZ3FizgBbGzo5398fGJJSxnj/32/I8/qpjncKnlCo4Rn5WFsR39j3Oxn2AGMMrYgTu/oS3TOreTfH3OVjSukskvlOdVotXpX7mGIQinEX6xbGkDuK9+XrlNK5MUIR3g1FNztINtWwdR7ivxrg2wY8RgI6dCwCVu8sdlG5rwJQYHYS0GF/OibW60wC+iQ+RlBmiwSmP+/OBkTTfPMmJvG8X8OmX0ppXdD0qPfzMbO3kkkAoD8ppZ8Fxc5G8vlEJKHP5k0nwdvwnKv4v1/e++u3JZ+P+Ka/jrXL1/HH80ppqkw8v28jEf081tMU0+Q5X+Ler/a9vJGIvr7vJQqXq9ZC2q3GVtRE8vkIcs4nsUZhvW15LcdtrYldmYc9dICG/UE3omLogM5SLkzgqJyAewBgclG86VZwxOia7IKu8vjWzhYIKBfADjQhuuC/lYQ+OxXyAaBPp677LCSfTyyS0N+KD5jcqfcGnVh3ML+Mvw5/rkt+j8exrePzxJpQmiGh7bT2xPP7Yo/1dRQkNgbhIUPRkpOW9ovjt7xNKQ1jwk8FHBI/OhgK09Q0/xwKXXmPLk7y+YgkoRfjuLb34R7ky03vizVdgLb9pKJLMVwHlmJDhdq5h5maxQcA1nS0nkaLlXRVHt/O7EFUNoOBlsQm7nEEvDCPwwjyAgA6EZ1SJZJO7y6STgQqTmwI8F6tVl+b/pHLszZIq4ZCIX9ZrVZ/XK1W/5VzHrr9Dwk4v3VqHpJMvcdhb8O3+VVryedrw7shxiB/LuOIKMQwB/hjfEuaKla+lnMeCi/8rzX8YtUWE2htYlmSzycQ44Mvzf2wuhx0sI5hb3d6GrECNO4nF7gYBjYsIud8YYGLiqmYxRwUifmRpHygV8bO0ziNYO4mqDy+tS+tBpMAzGndScUYZVa6oANAX44jEJPpCOKe30kkkjKNoZuiJHRaMSTF/ikSzl9HsvmFOA0YzToB97iH5yqScf9UwKGwvHXRheYbzwwFWqzhF6u2+DdzjGVZt5hIJKFbo1hW6wUuDgs4htZpJgjQOAno5ZCAzpKarJ5KF0xYYBmS8mF/np+KReCHsfP4DhrbzNApfzvOU/ve9H4CYC4R8KLzxXwUZQOAvpi/Tu9UEPe8Yp3zRBLMpI4b/m207za6FP9XJMWeSziHSQyJVq97SMDdFF3eJaH37c+9FF1Yi/mOJPTyVBO/EwWuFMdbzp+sW0zurST0RR2mlJoswN1SQ5SC3VozAGjfTxKfi+E6sCRJNNTotrdNGBZjAQIY05GzWb2z3k/ARJrogq77+da+6n4OMK4I3PzitM5CB3QA6EQEXuqQM62/xliWmSlkNbl3gpyp0NVqtfrfnPPQkfZMADlM6kvO+XWveyWS0Ls1JF//T3TC744k9CLVtNZv7rYc6xYzUCivCK2+ZxQWn574L4AOSEAvh41rFhOLWyqHURuLOsxFsihAmRapLhyBIF/dE6NrpQu6rmjbUcgBYBqn0aWMaVknAIB+CPCe1k3O2TleUATRW+uczkmrP4zmDAXt/jvn/DbnfOnywuT+knPu/hsR45C/FnAozGOITX3Vewfh+P3dP/8FqaJgVErptX2JxVi3mJF35OIU0mNf1hEAOvCTi1yO6JQGS5EAQG0koMNyLDQBJViy84ZxyDSq7oKu+/nWrgQxAkxjozsAE4tuqABAw2Ke/841nszQ0eq40d9WGx3GpmN+RunWHc9Peu3CDAv4U85ZMeMQSX2a5rRvKHj0Ntavu5dzvlB8oRi1JHVLgF6GdYsFxDvyS3c/vBwtrmPIzwKAEUhAL4sBDouJqqI2lqnFFxugzEFFv0epqgp0LTY8dBcd30HlmxkChrZTwnm6KuAYuqDYIswvinwIzJje69Z/IAAgcXRiH+31lUEhq0kdWRuhUMP+xh91PIfZ/Sni8/jesZjFpg0xfseSz7+n+EI5KhmvS4Jexql1i8WcislaTIsFL6zLTM84D6ADEtDLImiNpemCTi1syDAX32YAHmPsPI0qNzN0P9/arYDG7tjMg2V8FLQ5OesFANA+CbnTuco5W1srSBTc/Nr7eZiIZBFKM3RcfR3PPTAfyeePiOQ+Y8M2Dcnn5lWP09W6DEXvZaaUTqKQP/P66ru9HIXyFnWYUrIHyq6unTGA9g0J6Dp7lsO1YGkWc6nBlaQVAGpkgbY55xK7JnEYm6i10f18O84TwAwEbc7C2B4AGpZSGhJGD13jSdwJIi7WqfXOSbjfKcXQQfB/ho6rutDC7P4sie1pOeePOp0256vk86dF/OOXko+xE6UX01bQan53CkQsL96Rf+39PCzE9xsA+MGQgH7ktBTjbe8ngGXFJpNFLUongJo5CSgHxqTgVENi7KxDyDSqSlLW/XxrtwKsAGZ1JnlkUvZVAKBtAi2ncxYFkyiMQlaTOYr1Q1jSl+h6risZzG/oAO37uh1FjNtxY061Nff98oodq6eUhhijdwUcSm+sW5Tjo73ORbT2DbcmMz3nGKADP7nIRZGQQgksalGyIWlFohdz8m0G4CnGztOorQu6+2A7AqwAZqRYzvRSSorWAUCDBHhP6ja6W1KuM91HJ6FrIUsZkjX+OHSg1fUcFnGjA/T2ooixcUj9hm/PW9+d7USSq4ZRyyo5NtA3ZH7WLQoS3xLd6Od3kFJqaR1DcvT0nGOADkhAL4uuKSzOohaFs7jD3EyMAXhUjJ2vnKFJVDHu0/18a0Owie7nfZKcCcuyjjItawYA0CYB3tNxbgsXwd3mEeN729oPogo3kQCoOB0s4877fy/GIfWTfL479/2ySt7LNIeen3NeGAVqFqOQHgDwHQnohdE1hUJ8jIVwKMltLCbAnASTP8KYBSjAt0IugvHJNGrpgi4gYDtnhQWblPL+6EHJXQOgeVEs58aVnox5MQC0SbDxNK5yzpct/rDWCO6exLuUkjUS5nQVCYDXzjos5kQS7u5iHCJmsV5/9u3ZXazjf63tuJlWFMLX1G5e1i3KZa1ufhLQ2YU1L4AOSEAvj0Q3FheLWmeuBIWR3MMSTIwf59wASysigVRA5qROSz443c+3dlfg/FICOtATa3zTkYAOAI0R4D0p+3x1cb3Gpwsuc/mSc9Z9Fpb115zzhWuwN+uZdRoSN127/Sl6v5xS1/klf87PPLhQURjgqvfzMLODlJL3ENuyZw7QAQno5fEBphRnKopSkBvdz1mIQDNgTALM2mWcMo2jlFLJz40NyO1cCHYEWJRg1+kozAYA7dFRaRq6iFVG0c1JCNxmDkPyuW8ZLOvW/tGL2Xetz5251MtE0Qrj72UcFHpcnql5Wbcon/HV/KxjsC35bwAdkIBeHh9gihAJAkV3HKQr7kVml1ISSA7AtlRzn06Rm0i6n+/ERmDfjKlhYbHGd+M6TOJNg78JAHonwHsa1gbqZM1zXArUMjXJ51CGU0V5Xybn/E2X0+p8jOvGyygmy28iFkHTnHlZtyicLuiLkIDOtg7i2wVAwySgl0cCOsWIyuYCVFma6oIsxTcZgK1EIMkXZ2sSbwrtgm4DcjtfBJx0z5gayiBwbSKK1wFAO1JKw/zl0CUdnX2+ep1HN0vGcRjvGZiC5HMow1V0MebldEGvx03OWeGicTiPCykwHkHS57ysW9RDnM68DqxjsAOFFwEaJwG9PDa1KY1NKpbmHmQpKrIBsAsbwtMpahNJ9/OdeC4AyiBwZjoCLwCgHfajpmFtoFJRdFMS3bgE4zKFr5LPoRiexfEYg9TjtPcTMJYo6q1ZFCsJ6LOzblGJKBRw2/t5mJnxLduy5gXQOAnoBSq0uxudyjlfr1arv7r+LOSvOiayIAnoAGwtxs1XztgkSuuCrqrydq7iuSjRr4WfO4BR6dwwKR3QAaAd9ujHd6sLaPUE4o/Le4ax3UgIgGJ8Ed80niiE87WV39OwL9aeR6f7f+dSSsOew5vez8OMrFvUR7zOvKxjsK3j+IYB0CgJ6GXSNYXSfFQ1jAXcWixgYb7HwNgUtmifDeHpFDEu1P18JyWP5UtNjAeYks4p07B2AAANiPn+kWs5OsnLlYviguYS4xG4zZjuhnsqkjSB5YlvGp/E5vK578fnvl9GSeN03c/n5T1WmZzzecyFmMdRrJvCcw58wwDaJgG9TILWKEpsWKmazNxObZayMNXYgLFZkB1XceMEGx2TGrqglzBXtgG5nSsdDwi+fVAOxTemYe0AANogOG4aijW2wXUcz0Eha5y04Vg8BRTjr7qfT0JH2rLp+j+BKAClUVTfFK2az51vTbWsU8zLe4ltiakDaJgE9DLZcKI4kTzwF1eGmXzNOVvcYWlvXAGAcsXma4l0dprO6ZL/ct3Pd2LDj7VDZwKKIRhwGtbyAaANCnGP74vEyGZY5xmXwG3G8BcFQKEo9gYnEMnNN839sHZIMJqOb3zfFMibz4V1i2oZe83Le4ltHaaUrLMDNEoCepmOej8BlCnn/NHCLjO4E+jD0iLBDAD2ISBzOu8X/kYLpNjObc7ZcwBQHh3QAQAekFL62f78JBSabkQE5H/t/TyMSAI6L3UVsTtAGXSBnpZE3DK576dlLtWplNJQ8Pag9/MwI0nMlYpv0FXv52FGta9j2COf11mstwPQGAnohUop2XSiVMeRIAxTOVFZkAJIQAdgL7HR8cXZm8wigXW6n+9E8CNAmay1TEMHdACony4+47vLOUuaaIvkr/GIBeIl7ny3oDj2RKZlDFIm9/203PfzK2WMbpw3n6GovqTUummKMJ+DyvOa7JHP68DzCdAmCejlsulEkSKhRndqpvJVQAqF8B0G4CUspE5nqS7oAim2c6f7OUCxBNJMQzcSAKif/YDx2etrj2s6noPobAj7UMwfynKlC/TkJOKW56v7flrxrb9p+TfyKAno89H9vH4XmunNyvopu3iXUhJnB9AYCejlsuFEsSJB+C+uECO7VdyAguiADkzBGL8TOedLm8KTmnWRWvfznVSxURvPKDOpvBo2NEOAOgDAowR4j0+ycmMiych653jsFbCPK8X8oTgK8k5MIm6RJG3Ow15mZ1JKP69Wq6Pez8OMjKsrF2ME13E+Yj7Y1S8ppVNnDaAdEtDLZaBG0XLOQ9LHF1eJEanWTUkEfgBT0B2xLzbfpzN3F3RVWbdz574HKJ5OABNQaAMA6hVdiK3ZjetOgmSzJMGMxz4ku7pTzB+KM4x5JKDPwxikHLeKPM/mupPfyX/YZ5jPTRRZo37Wn+bzpuJj97wv51NKyZwJoBES0Mt1MHNAPezjVJVRRvJnC9QURkVRAF4kgk4keU1nliqpup/v5ExBKYDiCVoDAPie7ufjE/zbLtd2PJJL2NWZJBkojkSK+VjTLIdC1PMRR9kfc4T5+IY3IgogisuaScUFuc2llzU0mbmOQrAAVEwCetlMKClaJBcM9+mtK8ULfM05W6CmGCa6AIzIxtV0TlJKP8/w79H9fHvudwAAAGpjP358EiUapZj4qBTCZhdDt1nr1FAeeyLzkYBeDvf9TKLwjKTK+ZTQLM76xHwUV2uL6zkf7yn2NayD/SOldDZTrB8AE5CAXjYDNYoXSejHFrzY09BB/8TJozAS0AHKd1XJNVJkZzoHU3dB1/18J1904OEJNpCA1lnHB4B6vXHtRifwt221rMsWr+LOYcxv0nVwYC83OWdJ0TNxrovxNeJEmY97fz6HS/7LIxlPkap53IhraI5iefOpdR3D97QcH4aO9CkleSMAFZKAXjYbTlQhFnrfSkJnR8P9cmxxmgJJQN+OZxd2oHpjn2Lj6mvv52FCpxM/W7rKbM+54inG1wAAQHEkf07ixr5f8wTtjsd6Cdu4yjkr7AHl0QV6forgLM/3aH6SKvthfWI+3mXtcU3nU2UhT2uVxRkaznxOKUlEB6iMBPSyHUbHNSieJHT28FY1QQol4GMLqkzDzrxb+qUL+nQm64Ku+/lOau1+flvAMQAAALAcAd7jkyDRPtd4PGKB2IbCn1AmiU7zE1+2rLucs8IL83Pf98P6xHx8wxsTycUK1cwkpVRr/KP4oPIcSkQHqIsE9PKZWFINSejs4E+SVylYlZX6AChTzvnSQvakpuqCLrBve7UGnAjaAAAA6Jt9+PFJTm6f/d3xKFrLc65ifwEoy41mG4twzpclYXMZ7vt+mBvM407McrN8p+ZT63qqb2q5vktEnygGEIARSEAvn41vqiIJnS38SVVUSlVxhT4AyiaZeTqjd0HX/XwngiABQHAYANRKMdrxWSNoXCTciQMYh3cQz7GvAGUy3lmG874s538B9mC7Ym4wD89Uu1zb+dS6JyoBvXy/JaIP1yqldBaxewAU5Ced2IonAZ3qSELnCX+VfE7hfHcBmMKFsfGkTkb+h4+a0N44QZBsQ2Im0DqV2AGgMiklewHju805/9raj+JBOsaNRDAtT1D4E8ol5mkZkoaWpbPscsT3N876xKy8yxoVOQtisuahAzpTGxrRfFitVv9MKV2klI6dcYAy/OSDWrxDm07UaCMJ3SIYa19yzpJ5KJ3kGABGF8G3NrOmM8ybR0lCTyn9PEFCe6tuBUGyJYmZAABAaQR4j88aQT8koI9HLBCPUfgTynQX8XDMLOcsxnk5VwpNLcq93z6xivOxbtE213cehxFXVRtj+Dq9W61Wf0sp/Rpd0X0zARb0k5NfBZVbqFIsug+DvRtXsHtD8rlEHmog6AyYikAyBIxNa6zzexrVVHmeexoAAIBaCVYbn0DOfkiCGY99SR5yo/AnFMuzuSzxh8tw3y/LPKt91ifmcauYSfN8r+ZT43vL81+3dVf0f6SUrlNKpxq8AsxPAnodbDpRraiAOdzDX13Fbkk+pwpRme/Q1dqKjT3YnUWvcVW30RqbWVcFHEqrXtwFPcYCp72fyC0NG7TnVRzp43RrAAAA6Jf99/FJjOiHaz2eGruGMb0z5xiKJbFpWfZ1luG+X5b7vn3WJ+ZhHts+36v5VPfeioaKtOFotVp9Wq1W/5SMDjCvPzjfVTDBpGqRhH6cUjqLCkT04885Zxuk1ML3dns2OICl1foeGsZFbwo4jlYNHblfkhSt+/n2Wuh+PmwwvSvgOICFROGRzQrtm3PC+/+3tdcjfStun6i0/usjgTD3AyeuY80NAIAdRECa+f/IdOvtiq5R49HtkPtaKPwJLTPeWda1fdb5GecvTsJcwzTLmZV3WeOGBOOUUu+nYS61rmXcRPIy7Vgno39KKd3Eu/5cwQGAafxBAlEVDlJKby3mULuc81Bl6DoSbwR2tO9PNkepjAR0ACaVc75IKd3aRJzMb13Q9xmD6n6+k7vVanVR0fGyPAFhzC6Sijb/bCaUl3BPHj4zHnioQMYv9/+Le4EUVxt//20jKWQzoV13PQAACZ9TuG3vJ/GYnPM3Qd2j0aGJ+8RXQLnuJDIsTpzz/K5KO6AOue/bZn1iPvIv+nAlNmEWta5lXEtAb9pR/PmQUlrHtQ1/LhX1BxjHH3R8qsaxCRAtGJJBIgn93EC+WcPA/VTyORWSgA7AHM6i+ibT2LcLuu7n2zuzOA+UYCPJ/O1Ggvmrjgu9vHnk75meIDEAqItv9/h0xO6PIpvjcA65T4wFlEvy+fKMOefnvl+e+75t1idmoohMNy4loM+i1tyP4T3wvoDjYHoHca1/u94ppat1QvpQWNP5B9jPH5y3ahzrxkYrhsn80NU/km8M5tsyJJ+/tWBDbaLrqaIYAMzhPJKkJTtPY+iCPoxHty7gpvv5Tu5iHgcwm0g0f73x55X5G4UxrgOAuihGOz6F9PvzTfL0OFJKr+2tE74KhIaiGe8szztyfu77hQ1jg5RS1+egcRLQ53HVw4/kN+bWM9k1LqsQ7o9+vYk/n1JKtxvJ6Ma6ADuQgF6PIYj+lc0GWhEd805SSheRhCNQs343kXyuGyI1EnC2GxNv2J33DL8ZxkoxBlaIaTofd3zmdD/f3oXxPjClIfD+XrK5KvUAAIxNgPf4rBXA/n527ggXTgQUTYwEPZKoBdOyPjEP77J+uNbzeVXbAQ/Jxoq6EAU1Pwx/Ukp3sRZzKR4O4Hk/2QysynHvJ4D25JwvYiFFlbm6fZF8TuUkhgIwJx2kp/VmqLa7zb9B9/OdfazseClEdLCG7wzv4JTScUrpY0pp2PD9v9Vq9Y/VavU5Nv0knwMAMKqYmyhCNz4Bvv2RhDceSScM7nLO584EFE3ToIXpUDg/zbKKIa62XUe9n4CZWLPoRHy37no/DzOpNf7DN5VNB9FAaIhP+VfErJyKbwJ42E8G1lU56f0E0KZh0pdzHhJE/mzyV6U/55xPJJ9TOQnoAMwm53xtUXty2yZK636+vS+NBZoIVJqXDRp+S/ZJKZ2klM5TSsP75F+r1epvq9XqF8nmAADMxNxkGhJTYH86oLPS/RyKdycRlw7Zy4YJpZQUopqPb3hf5EXNo9Z4a3FCPGWIWfm0Wq3+OcSzpJTOhoYKzhjAv/3kPFTlKLqzQZNyzmcR+PHVFa7C7Wq1+p+4blCtqFamouhuLMwCS2vhPaSbybSe7YKu+/nOdD8HdrLR4XydcP7PqB49VJE+dDYBAFiAYrQTkJAFLyLxhJUEdCieRCZ6ZIwP01IgbyY5ZwmnfXG951HrO8z9wbaGeJYPQydPc6oAACAASURBVEOFlNKvKaWLaLYglw/olgT0+qiiQtOGLto55+E+/99IcKZMfx02w6N7J9ROwNnubDQBS6v+PZRzPjfendxzCdO6n2/vSjA5sI3ocn6aUrrc6HAu4RwAgFJI9Byf9a0+Cdgdj8BVVp4pKJ7YqHLoyj0f+4LlME5ok/WJedz08CP5ju/XPKrc+4+CFHcFHAp1GWIL30WzhX+llK4jJsa3HOjKTxbIqiMBnS4Mg/yc81Ah6y8G+0UZrsUfc86nQ7GA3k8GzZCADsxBEBkP0QV9Wo92Qdf9fGe6nwOPGjbWUkpnG13OPw3vYGcMAIAC6TA2PoG98DL2Dvgq9gKK5xmlR5KeYVrWJ+ZhzaI/rvlMHovHqoAxDi91FDEx/xhiZCJWRo4f0Lw/DIvYKSVXuh7vhkB5mw/0Iuf8cRiYrVars+iYxXK+DEk63j80yMRvd94DsLsj54wHDGPcX5yYSZ08snmg+/n2rqIKMLzEaxt5bYlqzicxn9LdHACAWlijG9/PFQecsj8dfsbjvYQ1Myif55QeiQuCaUlAn4cmjZ0ZYlvkRc2m1oJ6F9HNGsYwxMp8GP6klO5i7jjcY0MjTgUxgKb8weWs0rFOefQkEp5PUkofo/OeRPR53Q7nX9IJLYqkCclnO8o5W5wFGEEUhPtifDup98M8YnNRV/fznVl/YAy6eTUgpfQq1iVPBMjz/9m7+6O4kqxf1PtMzP/otQAm0gAYC0RbIMYC0RaIsUC0BU1bILBgkAUNFjQYkDFgwQgL7o1sZbVKCKQC9kd+PE+EYuac9577VuWmqvbOXL+1AABqk+9nGV96NvjdugI8mzoMKJ8gbjlci5moC4LJvbbEsxD+69OdmuBZ7OWgbW3Sa/7Q9qVhIVu5ucGfDQ5CCNf57+3cvTXQgr/l93DtalbFpFa6lEIjMcZU5PyPPI2baaWH8F9ijDvC5zTMbyoASztxBSZ3fO9/gennm7uNMbYaQLe5DxsKIRyEENLB2H+HYfhV+BwAgEoJoANF0iCja7eKkKF8PqdFcS3okbrNxuSG+cxDAL1P7hfmUeVeRh6K+LGAl0L7Ul3N+2EY/ggh3IQQTlLtjesO1GoVQNcZsC5vPIDSM0H0WfyWHg5jjPfDOtAaD3NPd1vbCwYoWS5a0RRuWm9XRZymnz9Zs88D+VAJeET63gwhHIcQ0mflP6suzQAAULF9Fw8olAB6vwQjoHx3rhEdunTRYVJ7lnceBm91y3PWPGrey6hxcjt12x6G4V2qvUk1OCGEU2F0oDZ/c8Wqddj7AsC9IPpvNv1HkQL9/4gxHglk0LocRDO57+l0BgUYnyno01sFqU0/31zL08+Zn0aKlQgh7K9NO3/vOxMAgIZ4LgGgNAIxUD4BJgDGpgEVTEvt+zxqbqYhgM6SUg3O2xxGX01G15wGKN4qgG5Duz4C6JDlIPpR3pj52XTeZ1kFzw/Telb4+uE5dA8DZmGDaBJNHRbkkK9mStN6mz+Lpp9vTvicMfktLFwI4TCEkIopfzftHACARnkuAUqlQUa/1OsBUCKNF2BaAujzuOzhTfIgv2PzqLaRfR7Qd1bAS4HVZPQ/chj9KA/XAyiOCej12vXjAl9LDwQpvBNjTJ+Nn/LDgSDP4+7y5HjBc3q178o/iw06eDrFYyOLMbb4XWQK+vQuTPLd2J2/SehDDp6n/YAPab/RZQcAoGHO1oFSaZDRqUbPOqA1GkXQI5NjYVr2J+bhu6xfrv1MKh/KYygHpUlh9F+HYfhvCOE8hGDIHlCUv+cXI3RYpzQF/bj3RYCHxBjTAcBFCOFVnnJ8YILXX65zmOQ8d/GC7uTvBt8Jz+N7A2AaaWP7vbWdlPD55k48K0C78vPQUf7nuxEAgF5su9IAFMRERgCAPgmgz0Ozp3659vOpdihPypmEEG7tGVOolG94k/9GU03pqUGTwNJWE9B9GdXpsPcFgB9Zm4qeAuj/NwzDv4dh+Njhwt3lifD/jDHu5TURKKFnOoM9n/tGgAnkTcIza0shepl+flfAa4BZhRCO8z39e+FzAAB6EUJQ3A1AaYQioA7qI8riu3MeJv+Xxd99e6oNbEIN1MbPqvY9V4NAKd12ru1JU9FPQwj7rhiwlFUA3Y1Wnbb9iMDmchj9ZC2M/nMO+bQaOliFzv8VY3wVYzyMMdqQhM8E0J/PASvAdE6tLQU46+hAzvPRfIQ9FhZCOAwhCJ4DANArzyQAlMbeJNRBfURZ1DnTHUHKJu32vgAz0Uyjb9e9L8BMat9zPTe4goq8HYbh9xDCVar/ceGAuf19+PyAmr6ELH6dDj0kwdPljbnTVcgnhLCXA6mpqcPripf0On8nnMcYfTfAA0IIqYvoG2vzbA42ACaS7t9CCNcOHFmYDr9MYduqLiM3rzx1DQAA6JzpYkDJDJ7ok1ArAADANNS48kMpSxJCOMlN/KEWqa70Qwgh1felv99TDYuAOfzdKlfvIAXp/GjAy+TJ4H91mM6B9HTQu5f/lRoCusyvO4XNL3wXwEZMP3+B/H0JPI3iMZ4ibQx+sGIsJE0/V/gIDQgh7OTgec1N9gAAYCx7VhKAkhgoANVwZkKP1B/CRHLjaOahxrFvfsvm0cJ3WqrTOxqGYauA1wJPkYZQ/JoGzeRGCidyRMCU1gPolwoSq7SVg3SnvS8EjOl+IH34svmzk//t52kJcwXTb/Ohxup13TiQhGcTQAegZOd5c9vGNkuwtwCVS40q0wHTMAzvXEsAAACAIt26LFAHTXvpkcEUQAuE8LqXfsve9L4I/Jgp6DRgK//9HgmiA1MyAb0NR4rEYXqPBb5zcfdqcsJ6N6+9HFLf1NVa17Wb/O+TTV0YT/682lh6vstaXzhALfLG9qngIAu41OQK6hZCWDWp1MQEAAC+ZsIYACURaAUA6NOO6w40pJXvNFPQaYEgOjCp9QD6hQno1doNIewJqcIy8s3ZKqghsAFlM/0coH49NMM4EUBnAccWnSmFEPY1OZhGCGEnB8/t7QIAAACUzx4ZAECfBNDnYcgOmn7NY7uFN5GHxaQA+ocCXg681CqIfhhCOI4xGnQLjOJvlrEZR70vAABs4NAivYhiCIAZxBjTQchHa82MrjsNBru3oXr5IPRK+BwAAL5LgTcAJTGBCupw5zoBAFRJAJ0nySHda6tGQ1KDiA8hhKs0MMSFBV5qPYCu6LZuByGEV70vAgA8Jk8FFMp4GcUQ8DwKXHmOE6vGjPy9QWXS800IIe3n/po7GAMAAI9rYhoPAM24cimhCj6rAIxN/RDQlFyX3QoDQWnR7jAMv4cQTuUNgZdYD6ALFNUtFZoe9L4IAPAdfidfzgErPI8DJJ4sT6O+tXLM4DZ38gUqEUI4MPUcAAAAoFpq9AAA+qR+aB5qHPHMNZ9mvtdyrd5vBbwUmMLbYRhuQgiHVhd4jr8C6DFGN9v1O+59AQDgO3SnezkbcwDzMpWaOdhLYC466b5Q6kYcQki/Df8x9RwAADbT2BQeoE32TDqjRg+Agl26OEAD1Dh2zjMXL3BsYAwNS3VGH0IIF85NgKf6273/7++sYNW2Qwj7vS8CANyXfx+3LczL2JgDmN2p53Qmlv6+zi0yM9mz0M+XD39Sx+13tb4HAABYiEIqoHS7rhAAAADAsmKMqYGFCdG07vUwDFchhANXGtjU/QC6UFH9THcFgG/ZEHg5Xf0AZpY3tYWDmdJJ/jsDCpYbal0pSAcAAAConsmyAAD9eu3aA41pbhBBjDENBvilgJcCU0rT0P8TQjgNIbyy0sCP3A+g31ix6r3JE5EAgM9hjfRgpEvXy7lPBFjGsXVnImn6+Unni6sRI8ULIaRmk7/nwx8AAAAAAAAAHndhbcg1MUyvyeBqjPFYAzk68Tb9boYQmmsmAYxLAL1NAgoA8MWBsMYoBLTg+WzOjKur76MY440NbSZyavr50Pv7p3Cp0/AwDL+6TgAA8CL7lg+AgjhzBQAAmJ5nL14q1Z7fWkU6sJtD6IcuNvCY+wF0HZ/acJCnvQIAw3BkDUahURE8nyYY4+oxMNr7lGqm4e+KuWnIsqG0rxdCuMidhgEAAIC2aUDaF00xoR5qaQEAoFN5qMeBafp0ItU4fwghqCcEHnQ/gG6Tuw1bwnYA8GdwYy935uLldIQEWEiM8VxHVUZ2lqfrw5w0S9xAbiqZChtfF/9iAQAAAAAAgB/KdYwAVCTGmOqmTYWmJ+/SwAwDcYH7vgqg5x9I2iCADgB+D8fkPhFgWbpLMqZjqwnlyYUnF5poAQAAADTLmSsAQJ8EuYAW7bd+VfPgmJ8LeCkwlzQwQwgd+Mr9CejJtSVqwlYIQbcdALqVH3wO/AWMI8b4qYX3AVCxUxePkVyafg7lET4HAIDJKJICoCTOXAEAYFrqIYBRxRhPhdDpTKpdusq1TAAPBtDddLfDRDMAepYasWz5CxjFZQPvARahCyBjyY1AziwoI7BX8IU9MIqwFj73/AIAAONTIAUAAADQCQ35yTT/YlRC6HRoO09Cd8YCPBhAv7Iszdg2BR2Ajh25+KOxKQvPZ/OFMZ1YTV4oTT+/sIifOXie3evO3u9GhM8BAAAAuiIEAQAAMD2ZKEYnhE6HtoTQgUEAvQsmmwHQnRDCQe68xTjcHwIUIMaYvo8vXQteQBMDKIjwOQAAAEBf8j4/AAAAUKG1EPqd60cnhNABAfQOmIIOQI9MPx+X+0OgJL1PLD4t4DVQp9sY47lrB2UIIbzK3+nC5wAAAAAAAAAAFcgh9H0hdDoihA6d+yaAHmPsvZi/RaagA9CN/HDz2hUflQA6UJKun1nzBvZtAS+F+tgbgELk8HmafL7rmgAAAAAAAAAA1CPGeJVD6Or46MUqhL7jikN/HpqAnlz6W2hKmoK+3/siANAN08/HdRdj/NTSGwJogCnoPNVtbl4Ai3II8Zdz4XMAAAAAAADohnNSgMbkEHoamnbt2tKJFEI/z4M3gI48FkA3Bb09Cs0BaF4OtLx1pUdl+jm8jAMkpnBiVXkiewKUovvfxRBC+jy+LuClAAAAAGVwFtePu94XAACgY92fkwK0KA34ijGmEPqZC0wn0sCNCxcb+vJYAN3hRnvSFPTD3hcBgOaZfj4+D4nwMg6QGF3auLZpzRPcaVrwXZcFvzYaE0I40jALAAAAuOeTBemGejwAAABoUIwxZbV+1nyOTuzmARxAJwTQ+3Lc+wIA0K4QwqthGDRbGZ/7QoAy2cBjUye5aQGwoBDCwTAMv7oGAAAAAAAAAABtiTGmer79YRiuXVo68NaQXOjHgwH0GKNJl20yBR2AlqVpgluu8OgE0AEKlJ/bbVazCdPPYWEhhB2NQwAAAAAAAAAA2hVjvMoh9DOXmQ6chBD2XGho32MT0AeF7M0yBR2A5uTp50eu7OjuYow3jb0ngJYIFvMjZ6afU5juDh3ys8q5ZlkAAAAAAAAAAG1LtVoxxjQ49F+pDtvlpmGpFuo010YBDfteAN20yzaZgg5Ai0w/n4b7QaBEwrRZjPHUJjU/oAkdpenxwCE1C9kt4HUAAAAAZXIeBwAAANCYGGMaVrAzDMOla0vDdtUoQvsE0Pt0osMIAK0w/XxSFw2/N5jLvpUeV4zRs+rXTEHnMWn6+Y3VgeWEEA6GYXjrEgAAAADfoekqAAAAQIPyNPRUQ/qzQTM07F0IQa00NEwAvU9bgnoANMT08+m4HwQo36lrxCM0J9iM+x0mEULY8R0NAAAAAAAAOJcG6FuM8TRPQ//Y+1rQrFODcqFdjwbQY4wmXrbtKBfCAkC1TD+fnI1vgMLlCdc2prnvMsbod3wzJkzNq6eDhlONsgAAAAAAAADn0gDkaegHwzD8NAzDbfcLQmu2ZTqgXd+bgJ5cu/bNSgWwx70vAgDVM/18Onc51AhA+Uy65j7P+5Rqr4crE0JIzymvC3gpAAAAQOEMCAEAAADoR9oLijGmYaK/pFptl56GvDcoF9r0owC6Q462vQ0hdFH4C0B7TD+fnPtAgErkAkVdUVm5VrQKy8kHKb+6BAAAAAAAAAAAPCTGmAaMpBqTMwtEQ05dTGjPjwLoV65580zKA6BWpp9Py30gjEM3P+Zi4jUrnvNhWQ5SAAAAAAAAAAD4rhjjpxjj4TAM/xBEpxGvQwj7Lia0xQR00pf7QferAEBVTD+fhftAGMe2dWQm58Mw3Fns7t3GGIVfYSEhhPSM8tr6AwAAABu6tlAAAAAwOuFHqhJjvMlB9J+GYbh09aic+kVozN+/93bSj1gI4c500eadhBAuUvec3hcCgGqYfj6xGKMAOkBF0vNcCCFt3L1z3bpmEv7T3dT2giu30+oby02yfAbblvbJr/I7XH9eWv/vqTv51XNW4V4H6PT3tJf/+87aZ0eDAwAAgLao0wEAABhRCGHvued1AEvLtdv7uX7gWI0AldoOIRwapAPt+G4APUs/YG9c86Zt5yCfIlkAihdCSIX3712pSemeB5TK99P3nQigd+3Opu2zCKDPa7vh93aiSVYzLvN3w03eG392qPwpHmgCdv7Y//NUOJND6jsP/Gv5cwYAAAAAAADf88rqwGw01pvIWhB9L2e93jb5RmnZsUno0A4BdFaO0rS8NPXeigBQOA1TpqcDKECF0vNcCOGjZ/hunfS+ALCU3HnaYV+drvPzT9oDv6plGsKPXudaQH1/LaC+p0kCAABAce43IwMAANqkPh9okVrjieXagMMQwnGunz9w7k8lTEGHhmwaQKd9W7lY/cC1BqBUgh2zcf8HUK9TAfQu3Qmgw6I0yarHbZ4snp55LmKMTXZkXwuof/VsF0JI/+fXy7wqAIDFuAcCAAAAFpUHCrgIADxLHjSaguipEf1hnoq+bTUpnCno0Ii//eht1DL1hVG8CSEIoANQMsGOeQigwwjy5EmYVYzxPIfr6MtpqyFKKF1ukiXMUrY05fzfwzD8I8a4E2M8Sr+XvjcBAAAogGdTAAAAADaS6hxijCep9mEYhn8Nw/DRylGw7VxXBVTuhwH07NKF7sZJ7ooDAEXJTVIEO6Z3LYgBo3FfzVJMwu6Pa041GjxY0CSrTLdrofO9fAB70/uiAAAAUBxDQQAAAMalXotBrTE9yI33U239P4Zh+MXQGgqlrgoasGkA3RTMfmwPw3DU+yIAUCTBqnm47wOo3+kwDHeuYzfOhCpfROMdns308yKdDcPwU550LnQOAAAAAAAAfdlzvWE2zuMLkOoiYozHeSr6T7luQu0gpXgdQthxNaBuAug85H0IwcMXAMUIIRznJilMz30fQOVijClQe+46dkOX0BeIMZoyxUv4/JXhLnfzTtPOD2OMnmkAAFin8RhQLM+wAADQlUuXG2iMAHph0l5Trpt4NQzDz8MwfOx9TSiC+iqo3EYBdAceXTrtfQEAKEPuenXkcszGfR9AG2za9eGj6b6wDNPPi7AKnu/kbt6+DwEAeIjGYwAAAAAAdCXGeBpjPBiG4f+E0VnYgQsAddt0Avrgx6Y7uyEEYT8ASnAyDMOWKzGL6zw1FxjHK+s4OgXDG8ohPN2z23fS+wJQpVZ+Hw8LeA29uh889wwDAABAja5dNQAAgNGp1+pcCGGv9zWAdammYhVGjzH+v2EY/jUMw1muvYA5bIUQ1FlBxZ4SQDcNsz/HeeosACwiTxV8Y/Vn434PxmUze3wCZk8jnNy2yxij325qVP3vY94ve1vAS+lRapK6J3gOAABAAzzXAgBAXwxdmId6LTQhmI/vtQrFGM9jjIcxxvRZ+WceAKBRIlMzBR0qJoDO96Rps6dWCIAF+R2al/s9gIakzeJhGG5d02ZpMADL0ZV3fun37KfckfumtzcPAMCLuH8ESqVIGwAA+qIJFdAUTePrF2O8ygMAUvOOfwzD8HMeDGA6OmN7Y0Au1GvjAHr6YfEj0qXXIYSj3hcBgPmFEI6HYdi29LMSQAdoj2YubbrNDQaAZQigz2s19dzzCgAAT6aBEVAwRdoAAADjM/0aU/DhGdJeeozxNA8GSN+lPw3D8Jvp6IzIFHSo1FMmoA9CSd061mkEgDnl3x0NUOZ1qRshQJNMyW7Tce8LMDIHJWwshHCgUdasfs6Hm55VAAAAaI0aLAAA6MuV6z2L3Q7eI9+nCcE81No0Lg0JiDEerU1H/3ceIADPZeAHVOqpAXTTtfq0ZWoeADM7zb8/zEeRC0CDcmDvzLVtSpp+7hl9XIKt86q927huvPO4G4bhn77vAAAYya2FBApkTwoAAPriGQBoie+0juTp6Cd5gMD/G4bhX3k6ur13nmI3hKBJCFTIBHQ29TqEYBItAJPLEwVfW+nZaTQE49uxphTCFPS2uJ7UrvaDBAH06aXw+X6M0RQIAADGcmMlgdJ47gUAgO4Ia84khKBmq2/7vS/ATHyndSzGeJ6no++sTUe/7H1d2Ii6K6jQ35/yklPXkhDCdeo64WJ36TiEcOEQDICp5K5WJtzN787vO0zCYQZFSN/xIYRLDV6acOdeCZaTm2VtuQSTEj4HAIC6KCqE59EYAwAAOpNrN1z2eex47oLJOdPnTylnmAeqnOQcwH4OGaf/3LZK3LOv/hHq86QAenYhgN6trfxFv9f7QgAwmVOBjkWYfg7Uwsb1850KoDfhJMaogzAsRxfeaQmfAwAwlQv7ItOIMZooBQAAAJTmlSvSNUNjYCG5ru18VZceQtjLgeNDOUQytVdQob894yULKPVtN4Rw3PsiADC+PE3wjaVdxEWH7xmok+DtM8UYUwD9tsoXz8pd7hYLLMchyLSEzwEAoDIhBAW9AAAAsLlLazULw/b6ZuLyPJzt80OpBiTGmAaupO/l/xuG4edhGM5yHRx92sqNCYCKPDmAHmO88GXfvfchBJ3MARhNCOFVnszKMjQYAuiD39q6nZt+PpmbRt9XqaqcOpj3wrYKeCmt+ln4HACACXnum44AOgAAAABFyLXIzEMNE0+S6t7SEJ0Y42GMMX1W/zkMwy/DMFxbye7II0JlnjMBfTAlkxRccIMOwIhOhTkWcy3MBtANAfS6Hfe+ABMSRGATDj+mc5YOGVt9cwAAFMFzHwAAAFACDZnn4Wy3X6bqzsf3GS+Sp6Mf5+no/8jT0T8amNsFv9NQmecG0E3JZFt4AYAxhBAOhmF4YzEX4/ccplPlhFfaFWNMxdZnLnGVzvL1A5ZzYO0ncTsMw1GD7wsAgLJ4pp6OQjEAAADYnEExMC0DFmdi8BVjSnVxeTr6QZ6O/tMwDL+Zjt4szUKgMgLovMSbEIICUQCeLYTwSgB6cRedv3+A3vjdrdNJ7wsAS8rPLbsuwiQOHUwDADA1Td0AAACAQqjVm4ehIf0SapyHUDCTijFexBiP1qaj/9vfXVO2Qwg7vS8C1ORZAfRcFOjLm+TXEIIbdQCeKzW12bJ6i7mNMV51+t4BupQ2Zz3PV+fS7zWtqfAQwUS/aXzMv0sAADCHW6s8CbUCAAAAQHFyk3H6I9A4D03mmU2ejn4ijN4c39dQkedOQB9MTWPNuYc0AJ4qhHCk0+Tizjt//wC9Mk27Lse9LwBNqu0QQaBiGkctvikAAIplCvo01AkAAADAhjRnnpUz3j4JNM7DIA0WcS+M/s9hGH4bhuHO1aiSYSBQkZcE0AWWWNnWkACApwgh7AlTFcGGNlAbhcIjiDGe2nitxqUD6FnozMyPOPQY31k6GGztTQEAUDT3n9NQzA0AAABPo15jHoLIfbJXNQ91NiwuxngVYzyKMaYmqf9KdXauSlV8X0NFnh1AzwWCty422Zs8yRYAviuE8Co3LtmyUou6izFqKAQTyd91jExQbVSaiNXBdZqHzsz8yGsrNDoNyQAAmJt9pWls2QsFAACAJ3E+PQ8B9M7kPSp1yfMwTIOipHr4GGMaLvGPNBBBs5cq+J2GirxkAvpgCjr3/BpCMBEKgB9JQYNdq7Q493EwLd35KN2JK1S82zytHlhQCMFv+vg+aioDAFTM/WG9FHdPx+cCAAAANmePYh4yDf2xRzUfE9ApUqpFiTEe5nDzL4LoRZMlgYq8NICuEJr7znU4B+AxIYSDYRjeWaAiCKADdCwH/z76Gyia6cC0rKaDXx13x2dPGeBhzlagDj6r9dIEaTqKewEAAGBz9ijm4Zy3P/aoZhJj1EiDosUYP8UYjwXRy2YoCNTjRQH0fONw63qzZmsYhgsLAsB9IYQdQYNi3MUYBdABMAW9XHemn9O4mkI7DjvG5VkE4HG6vANMSFHkpBR0AwAAwObsUcxju4c3yVfsUc3juoc3SRsE0Yun6TMvppHBPF46AX0wPZMH7IYQFMoDcN95blTC8ty/AZA2WC80lSuW5gBQjn3XYlSeRQAAWJJ9kGko7gEAAIDNCaDPJITgrLcv9qjmcdPDm6Qt94Lov7m8xfC9zRg0MpjBGAF0QWMe8jaEcGhlABg+b+SdmOJUFKEPAFaOrURx7gTQoSg2qcflWQQAgCUpjpzG6xbfFAAAAEwhheBMYJ2NYFtf7FHNQxMNqpWD6EfDMPzTNP8iqMmCSrw4gB5jvNIpnEd80DkMgNyQ5F33C1GOuxij0AdMzwEGtTh3sFmck3zgzExijBfWenY1HSBopDUizyIAACzM899E1AUAAADAkwhwzkP9VidCCDu9r8GMfH9RvZSDjDGm34hfXM1F+Z2GSowxAX0wuYbvOHdDD9CvEMKeCZ7Fcd8G89CZb3xC0hPIQefT5t5Y3VwPelDFAYI9rdFdNvZ+AIA+uUesm+LI6SgUAwAAgM1pkjcP+xX90BxxPvZYaUaM8dg09EWps4ZKjBVAVxzNY7ZyCN0PA0Bn8nf/ef4toBwC6ECtbF5PR7OYcpzFGG96XwQoiHDRuBTSAPxAbuYIlG3b9amaZ+7pKPIFAACAzdmjmMduD2+SPzlfmYm6JlqTpqHn/W1DFeanLosx+DuawSgB9PyFe1v6m2Uxu8JuAF06O3ujGwAAIABJREFUV4xXnLsYo99kAL6SDwZsoJbhuPcFgMLYoB6XZjIAP6aZL8CEcl0D0xBABwAAgM3Zo5hJCMGeRR8E0OehvowmxRg/xRjT78WZKzwrORPGoL5vBmNNQB9MQecHXocQ/I0AdCKEkCapvna9iyN8DsBjTEFf3kddgqE4NqjHpZAGAIASKJKcxlYIQaEvAAAAbECTvFkJoPdBvfI8fHfRtBjj4TAM164ywNcE0JnT2xDCkRUHaFsIIT18vXOZiySADsCDYozpN+LW6ixKEwB6Ukuw2xTaEWmyAbARvz1QASHb6imSnI6CbgAAANicJnnzsJfXOFPuZ2VvlR6k75Q7V3oeIQTDQaACowXQcwGhTh/8yK85mAhAg3LhnfBUmW5zuBCYh41tauQ3fDmXMcaLXt98ITRgmNd2Ja9TMcJ4FNAAbMZvD9RBs4i6KZKcjjoAAAAA2Jw9inmo4Wqfazwf31s0L8b4aRiGA1d6NgLovJT7gBmMOQF9MAWdDZ2YDADQnhBCKrpLwaktl7dIwucA/Mip7p2LOe70fZfEZGYAAIA+KJKczm4+KwIAAAB+TJP6eWzJLTRP8GwmMUZ7q3QhD5I5c7UBPhNAZwkpmHjhYQ6gHcLnVXCfBsB35e6dGpbM79b0c6ADvucANuPcBOqgoLFiiiQnZzIMAAAAbMYexXzs57Xtde8LMJPLLt4lfGGgDNTBFP0ZjBpAz8XqH0t9sxRlFULXAR2gDSncvOtaFutaUR0AG7JxOj9rDuVyUA3A3JyZAMxDseR0BNABAABgAzHGm9Sw3lrNQgC9USEE13Y+ms7Tlfw7bQr69JyP81LbVnB6Y09AH0zX5AmE0AEaEEJIv/1vXMuiuT8DWmATewZ541QR9nzS9HO/03TJQTAAPEh3bqjDnutUPQ1bp/MmhOD3DAAAADajFmYe6lvbpe5gPvZU6dGJqz45Z268mFzq9EYPoMcYz4dhuCvwvVKmXSF0gHqFEI6GYXjrEhZPsA3mp8iSmvndmI9NaqAXN640wEZ054Y6ONesn+LuaZmCDgAAAJsR6JyJBunNsg81H3uqdCfGmH6nr115KJ5GBhObYgL6oFidJ9p1QwpQnxDC4TAMv7p0xfsYY/zU+yLAAoQGqFaeyH3rCk7uzv5JUdwvwbQE0AE2ZGosVOG1y1Q9Z9PTOmr5zQEAAMCI7FHMR1C5Mfk8Zbf3dZjJtTpkOnbu4kPx1FhMTACdUuyGEPzdAFQid4P84HpVwe8rAM/h92N6Jw5niqKzPABQCoejUIEQginoFcvP45rvTWfbVDEAAAD4sTxZ9c5SzUIAvT32n+ajpoaeCaBD+dRYTGySAHp+GLou6Y1ShbdC6ADlCyHseZiqxl2M0bUC4DlOrNqk7qwxDEUHdkyfBWBBCqagDnuuU/VMGJuWKegAAACwGXsU89jOta+0Q1OB+fieoluaxUAV3ONNbKoJ6INCap5JCB2gYHkDLm0kbLlOVfCbCsCz5ElgZ1ZvMuemn0PxG78C6AAsxW8Q1EEhQ/0UTU7rjcZeAAAAsBF7FPPRALYRIYTU8P5N7+swI99T9O6q9wWAwjmPmtiUAfRzXT54JiF0gALlDZtz4fOqaAgEwEv4HZnOcatvDACAF3M4CnXwWa2fosnp2f8AAACAHzu3RrM57OR99sD08/ncxhhvenmz8AgBdCjbruszrckC6HmSlwcinksIHaAgOXyeirG2XZdqXNr0gWWEEEzAogkxxrRxeu1qju7MbzTQIdMEADb32lpBFez/VC4/m9/2vg4Te2sKOgAAAHyfPYpZ7arraoYA+nxkwmAYPlkDKFsIQW3ahKacgD6YlsYLCaEDFGAtfK4zUF38hsJyXln7SegiuQzP9eMz/QsAgO9SAMcLKYKZh2YRbVA8OT37IAAAAPBjF9ZoNqagVy7XNL/pfR1m5PsJfA6gBmosJjRpAN20NEYghA6wIOHzat3FGP1+Aq1RQL+A/Hty190bn86l6efFclAwP5u+AHUyhWUeunPzbPl8lhloFtEEz4LTMwUdAAAAfkyTvPmYnF0/TQTmZQ8VgBo4t53Q1BPQB9PSGIEQOsAChM+r5ncTgDF5rh+PqV/wxStr0RWBE2iHZjrzEECHOvis1k/x5DzshwAAAMD32aOYz3YIQQi9bgLo80mDNgyNAXgZ93nzcG47oTkC6OempTECIXSAGQmfV09QEIAxeRYbRzqUsZkI9RCwHJcAOsDTOByFOvisVi4XT172vg4zSGf9Pi8AAADwiLxH8dH6zEYAvVIhhD11zbNS5wSff6d9FqB8qcmQ+rSJTB5Azw9EitUZgxA6wAyEz6v3McYoLAPLMtGVpuTflTNX9cU8z0JF3FOPzv0RwNNs5SIqoGwCtW04730BZqJxLgAAAHyfcNt83uY6Wepz5JrNyt4pADXRZGgic0xAHxwmMiIhdIAJCZ83we8kLE9IgBb5fXmZ2xijNQR65hkT4OkEW3mJW6s3iy1TnZuguHseuyGE4x7eKAAAADyToOe8BJkrk+ubBcvmk2qdrnp5s8BifM8wJue2E5klgJ4nBl0u8QZpUgqhX+k8BjAu4fMmpA0fG9EAjC7GmO4Rrq3ssymwhm+9tiZ9MckXmiGkN5/DXt4ok7ixrLNR8Fi5XESpacM8jjwXAAAAwMNy3kJdxnzswdcnXbOt3hdhRs4EIQsh7FiLyXxq9H2tc247nze9vNG5zTUBfTAFnZGlcOSFEDrAOITPm+F+C4Ap+Z15HtPP66CbKkxP0ATgaXYVM0AVBNDboLHrPFKBsD0SAAAAeJw9ivlshxCE0Otiav28fB/BF85seQkB9BmFEJzdTmC2AHqexqlzOGMSQgcYgfB5M+4UbgGNswmzvPP8e8PT+H2uQIyxh26qsDQBdICnczgK5ds20bkJiinnkxqsHPfyZgEAAOCJ7FHMyx5FJXKzgO3e12FGdzn/BTA1NXuMTY3FBOacgD64SWcCKSx5o7AD4HnyFCXh8zacC04BLYsxCqAvLP/OCFM/zZ3J8VA1TTfGtd/Sm4GOuS+fl+krPNeFlZuVz2rlYowX7v9n9d4ECgAAAPhWjPHKwL9ZpeaSzjDrIIc0L+Fz+Jq82kTyvU/r5Dvm9dag4/HNHUA3LY0pbOVJ6H7UAZ4gf29eCZ83wwYblGPHtaBVMcajYRj+bxiGn4Zh+GUYhrNhGC47v+CX+d9veU3+ldfn/2KMrzSIgcflhlgl6+GQY067NvihCQLo89qt4PcSEEBvhaLKeZ36jQMAAIAH2aOYl7rLwpl+vgjfQ/A1e9k8Wych+9Jogjyyv8/5vywVXYcQ0rS0d3P+76ULKYT+Rwjh5xijiXwAP5DD5xf5+5P6fTQZGIpis4mm5UD1xf2JerloeCd3/Hy1Nun2daXrcbcWPr3KnShv8r9PNgZhFDuCjN1JG/z27gCe5ij/g6fQCGteW6kI0hll9VJR5dveF2FG6XzqPE0Z07wPAAAAviJrMa/XIYSDGKPAbbk0CZjXnc8DfMOw1Glct/imKMKR+rRxzRpAz048FDGhD2mSUozxxCIDPCxtluUbKuHzdvjdA2BxuRnKzf1g+kpugLOafLv+34e1sPq6sYLrdw9MMb65F3r96zXHGB98/QCMQgAd6qcJz/wOQwjHwnk8kc/q/A7d59QtFVWGEO6cncxqNwf/H9oXAgAAgC6lZvghhOv83Mw8Tkx8LpPp54vwWYBv1TqAp3Q9nX/f+j2b1W5ugKwWeCSzB9BTQXoI4Uz3cCb0awo2xBgPLTLA1/JmzAfL0pRrN8cA1ODexHC/XZRI0ID7rhwije5Nbh4pRAmVSp/fEILLN6+tHGzVgBDK9lohQxNMQZ9f+uycOtsHAACAr6RGh79aktlsp9raGKMGkwVJ58qmny9CAB3W5MF/TKOnhto3AuizO1SnPJ6/LfS/V5EMU3sbQrjIDx4AfH4AOhY+b5L7KgCAcZgSyX1C0tMQLIH63bqGszvq7P3ycu5tl6EYsn7225eRzvYVeAMAAMAXAqDzO5E7KM6RsN7s7mKMvn/gawLo0+mpLksN2vzS2dNOb296KosE0PPUs8sl/nfTlTShKoXQ91x2oHe5cOd97+vQoFtdNwEAqFjpezY2/6chRAn1u3ENZ5emr/j+ZGMxRvcxy/hzCnqPb7wVuY5Bo5VlCKEDAABAFmNM+/AfrcestpxjliMHxlyP+Qmfw5rcmEQAfTo9TafWPHwZmoePZKkJ6IOLyEx2cwhdsQfQpfTgE0JIN+dv/QU0yf0UlOm16zK6u8beDwCfld5B3ub/NFKI0hR0qJtg6zKOTV/hiYRol2HPtn5C0MsRQgcAAIAvBEHn997gu2Kc5KYAzOvEesNXDnwXTaqnxvdqLJbxVp50HIsF0GOMF6agM5P0g/+7wlagN7kD4IUgZLPubDIDHREABIC2CGZB3dyfL2PL9ydP1FPRRknSFHTTMOomAL2sVAx0oekKAAAAvYsxnhrYsAh7QwvL+6tvul6EZdzGGJ0BwteczU4oxtjTWabv1+X4HI9gyQnogxt0ZvZBx3SgF7kLY7pR3XXRm3USY9QNCwAAJpIbaDKNNAXdBj/US6h1Oe9MX+EJFDIs51R4tl654Ekj/WWlxsoXfvMAAADAgJoF7DrHXE7eV5X3WIbp57Am/xZsW5PJ9HYOI/OxnNQ8/KjXNz+WRQPouTPX7ZKvge6kjulXij6AloUQDodh+CNPRaJNdzZ7AABogP2Zvh2FEHZ6XwSolAD6shResSmFDMvZ8lmtnuu3vN0cQj/ofSEAAADomhrBZbzXGG8x52qfF2NPFLJcyyKwOq2uGmnHGDUOX9axGrWXWXoC+mCUPQtIh9U3IYR9iw+0JoSQNgA+uLDNM/0cAGB8pl3Pr4ZDe5MPp7NlagNUy+HostL0FUWHbML97bLe5GaxVCg30r9z7RaXnhn+Y+oYAAAAvcphJeeVyzg38G5eeTrp657ec0HO1CTDVzTDmF6PNQcGOC9HjdoLLR5ANwWdhaQvj9/zgwpA9dJGVwghFRS+dTWbZ/o5FMzBAwA0xyHrtHZzIzWgIgpQivBOsJUN+Kwu78SkpKrZhy9Hmjp25fMEAABAp5ylLWPb2s8nDxb8tZf3WyB/65DlGpZd6zG5HgPoNwW8hp5p9P8CJUxAH0xBZ0G/hhB0KAOqlgtubnT+64bp51A2RZAA0BZTfqf3VogSqmTiyvIEW/muPB2JZW2ZlFQ1RZdlSQV/FxrM8xK5ofehRmgAAEBN8rC/OxdtEW9CCHIuEwsh7JhKuqjbGONFx+8f/pLDqYYBTu+u03NM37XL0+j/mYoIoJuCzsLepGJihVpAjfIN0B+5kI0+KIoBAID5CG7N44MNfqiO7tzL28pBPGcbfM+11Vncdv6sCqFXJsaYfus+9r4OhdnKDead7fMkIYSDNJhgGIb/pefP3Aht3yoCAAAVMa1xOe+dY04n75ueq4FelCYLX/aP7Dl2LH/Xv+t9HWbSaxBbjUUZ1Kg9QykT0Ac3LiwsFX/8oWM6UIvcof80F0nQj7Nc9AYAAC3YqeA9uP+ej0m+UBffj2UQQudHfFbLsCuEXi3F3WXazWf7Jz5XPCYXDZ+GED4Nw/CfPJhgnRolAACgJvYolvVBI7Px5X2di7zXwzLuTJ//y2nec0zNLw/tO/YlTz6XyZiPADpLE0J/omIC6KagU4jUMf3cDSNQslxQmm6837pQ3VEMA/Sq1w0ngNZtl/7+YowmoM9HiBLq4h69HKvvT8VvPMS9TDl23evUJ8aYfu+ue1+HgqVpNDeazLPyQOj87XcmqL12/wQAANQixpiec85csEWd29sbj/B5MU7y90vXcghxtYe0m4PI/8v7TAe9r0/r8kBAk8/n1WWtQT5zohxC6E9Q0gT0QaiKQrzJB9UOG4Hi5Jscmy59Mv0cAGBawjk8RuBkPqsQpQ1+KJ/fzbKk78/fBfB4gEKGsuxqGFElE8bKtpWbzN94juhPKlZ/Yuj8PjVKAABATTzDLEsz7ZEInxfltPcFyB77fk37TP/Je48nPv9tyXuLBgLO77bzYSBq0MryIZ8vGGL8A0UF0E1BpyCrYi0FBUAR8kPOae6qtmnRBO24G4ZBATHUwSYjQL267+rMo4Qs57WlyyyUL09DcJ5TnhTAO3dAyhr3MeX56wzSZ7UOahiqsZ2fIwTRGxdC2ElNd9I9T5pE9YzQ+TpT0AEAgGrk4TWXrtii0rPnH/Yenk/4vCiGYn3+m9zPe4vfs50nZKfP/1Xem9pZ9pXzEvm6pzO01xZydr03z+7+e7dAbzUZ+rHSJqAPunNRmHf5JtEXCbCY/B10pcNW105yYTdQPoXDANAewa1l6DIL5fP9WKY36eDaNHQGzSJKl4rVrgQfq6GGoR6C6A3KU85T445UnPff1HQn3/OMwecbAACoiWeYMmim/Qy5Flr4vBy+Tz576jrs5r2p/wqj1ymEkK757xs0HmAa552va+8B/FLt5iYjx+rUHlZcAF0HcQq0m7tZKNYCZpe/e/7wkNO1NP38pPdFAACgTZUEbmz+L0eXWSibAHq5tvI09O7Cd34zHuSzWq7tPA39oqcgeircqK0gTw1DlVZB9E+5YEgRaEXS73ku3k3fj/9fnnL+bqLzUlPQAQCAasQYL0xBL8afzbR7X4RNpeZywudF+Wj6+Z9/lzsvnIAtjF6RtAeYrtMwDO97X4uF9V6D5dy2bO9zs/+uguib1Fj8fZ6X8mSpo8iHQl8bfVoVa6WHn0M33MDU8gPo6QsfbGmD6ecAALCgGGM6KHQJlrPqMvtLjFEXdijLhQP64q3Cd8e5weFpK/tMef90b+3fzqpwLYTwf/bTvnI14pRYpvE6B9Ev8+e0mcLVXLCw+rzu5/+evpuu8/9dTdQw1Gkr36+8DyF8zJ+x3iesFCd/V+yv/dua+TUeKnwEAAAqsprcyvLe5mfaA9mCx+UzCudJZTEU67MxB1Suwugpc3SdMwDnvhuWl0OkJ3kAAsv62PsZbmompAateKtzpaPcbChleZr4Ls/fh+tntntrNRY/5WZXDyoygJ4O1fNEBqE7SpP+JlPR8XGM0Y03MInc7OJ0geIKymP6OQAAlOHSXuXi3ufn5aPvbXgD83E4WpXttaKXFL5LwbuLGg5K1w5BV/82mUax2l/lM80i6vE6T+I9yZ/T1We1+GKc3BRi56GChUfspv83NRVs5BqG44kmMDOP1IzjTQjhLv9OpDC6aSMzu1fgtF/Is/bbXAOiIBgAAChe3pt3dlmOXdmCh+Vw/qmp58W5dN7+1x7V4UT/v18Po9+u9vut+7zyNT7K/2QyyqA57GfXfhurkL433qV/a41FLmo5VwohrJ/Zrv5977vwu416S52APujORcFMQwcmkR90Tk2jYY3p51CfV64ZQLU83/M9F4o4irC7Nh302AEtFEGRW33erPYfc9HLRf53s/T36jMOQR8jgL5Gs4gqbeVJHH9O48hFDRd5mv3VkoUN95pCrD6vz/0dOBp5wswcTEFvw3rRkALQia1NN9/boDnFkmr8TgIAAPolZ1EW2YJ7TD0v2nHvC5AdzBRK3l7bi7zLe/3VNIqukeB50QTQP7sQQK/OqrHIsPZdfpHPbUuosbg/2fw5zbQPvvc/LDaArjsXFTANHRiNqec84DbGaKMH6rPnmk3CJCJgculgRzBnEbU0bzE5tCyvBdGhGFfOcaq2fS/kOuSO65/Wuluv/vPmJYUwOXy2+t3fz/+5t3YYOua+aJpu+0pjx684c63b7nohSv6sXubP6tXafw650OHZf/u5SGFY+2wOa5/Zsf+GDmoLe5qC3iQFoCPK3yHrTSpq+u05FEAHAABqIWdRrFW24KTX4UN5b+DU/lmxTD//Yol9oK17jaKv10KMF861XiafRR6tzj0pzpm/8b9c5HMJ6nT/uzz9x20efnR17/z200sai9+rsVj99521f2Peb22lTFuM8cFGESVPQB/yl/8fBbwOeMx6x7KjJScOAHUy9ZzvED4H+MLGE0C79mrocJuLOO40DSvOKoieNvJP8tRCIRGYl8PR9qxCrqvCxb8asDzQrOf6kee1sQPlz2EK+tcuFKM2Z3U9vzlbeOCzevnIm1/6b2I7FU5UeL5qCnq77hcN3d4rAPWskY04UaMkqbgqTalz/wAAANTCFPQybeV99cM85K6L58y8V3BsH7p4h70vwPAl0FfC9OFV89k/z1pzIP08BxcF0jeQcxirZrcmSpfN9PMvNAJpz3b+98190APntquw+n0lnLMcPPZZLTqAng6bQwhnOpBQgfQl8UcI4ZdeO5YBT5eKGHKBvAAD910rcAEAgOJcaB5WrLQB/2tuFPkxb4af26P768B1fQIhjM3haN9KLuQQQP/axXozAbpTctHnwdr09irkKeiK2fqwnWtV/qxXyU3JrvJ3avrPm5Yb1K9N1lgPm7cQNP+eI/cPAABALUxBL156fv6QQug5mN3k2aXgeVXONFj8yxLTzzexu77vvDYh/UqDzC/WQucHaniqcfvYVOUepfuB/Pl2ztSn7YLPWQ4e+x+UPgF9yDekAujUYtWxLHXGVngHPCiEsJOLF2y48JhSNzcAAKBn5w6vqrCaWPghF92c58PYZoMhK7nAYyf/2y9kAjGNy4ejCtwo0ZtUgKIZyWe5GPXO7wIFOsj1ALU5MmGsS1v5nuev+548ueI6T6u4yv95k8PpxRaE5rPKVYOq/fyfe2tB815/L3ZT8L6H50cAAKAZaQjSf13Oov0ZRE/DqkIIp3nQXdUh0hz+PMx7ZC03qmtNjfuwo1sLL9fgfiD9foPMq15C6bkWYj9fO6Hd+mj6+a0Lf8sUaCt93z6Uhy0+gJ5+EPNUaV35qUV6kPo9T1s60mkIWJe7GR4p9OM7LjUxAQCAIrlPr89f4ZB8GHuxfiBbaygxTyLcWZtsvqe4g4WdC6BTqP3898lnF5rpUKAU9typ7TzVhDHuWRWCfvUdm8Ppd2tT/lfh9OTTI9P/P/0o/Lw2mfwh9/9n6//n1qeXj+VQo2gAAKAWOWdxZthfFVLN8Lv0L+8rndY2FT2EcJCfm+0z1+cXmZa/HFRcw/9Yg8zLtb3Hi9KbY/7IWj3Equm+ffj6CaB/6zzfF0BpDh6qkaxhAnpyIqxHhdLD1X4IIXUq0zEKOpc7b53oVMQGFLVA3XZcPwB4kr1alisXcFx7rqvW1tp09D+bnYYQbtcmFX5a+8/FD2Rz5/W9tYnmq//u748SadBBqQ4E0L9yrjCQQu1XWnxkwhib2ForkNyoUDIXjbIcAXQAAKA2R5UHKnu0CpB+yGH0tHd78aOmdHNLjSPz39a+veWq3eX6dT47bHAd1kPpq1qI9B/X9+ogSqqH2FmrhVAP0bYzDTC+lRsd37l/o0D7D72kKgLoqbNTnhj7awEvB54i/Ri8DyGkG9VDE22hP7lg/ESHSTZ0VtomIvBkJsgA1M0Eu/k9NrWtVKf2KJuynf9987lfC33c3ZtMuDqUXfecPb+de82L9tf+791TUpW0l5EbOvjbpTQPHo52zBkVpTqoMYCeG1T9siroA5qxlSa6xRg1sQEAAKqQcxYn9iiq9VdwNAfRLvJ55J//OdeE9LXm2KuJw3vOfZpxVNOk/Snl0HNPNUGrMPf36iGu1+ofVlPU1z33bGn9jG69NmJP4LY7pp8/7lzGiALtpt/L+40japmAnh6OTkIIR25kqVT6u/09dyk71MEF+pB/t449KLGhOxMVAACgeOcC6N3Zuncg+9CBtIIe+Pz9+M46UJjthw5He5XDstemR1CgmptFnOSJOWoYoC2H+f4WAACgCjHG4zwszR5F3bbypPE3a1OMV82yb+79G54yxTiEsLfWHP6hycPqnNt0HWMU/vzioJQXUpD1MyO1EIzt0hDX77oQQKdQ+/ebR1QTQM/Sg9HvRbwSeJ50U/bfEMJvKZSqmxS0KYSwn4uOFPLxFCd+FwAeJSwAQBFycMukfIBvXQigU6iDvFfLZ6ea6VCgNG14L8Z4VdvFyRPGUmPZ/xTwcoDxvEmT35zbAQAAlbFH0aat9Snp961NMYaHGIr1NesB89IA4/tSE9QPJb9AuvVNAP1vNa1E7nzxsYCXAi+VCvFSwfKxlYR2pGk6IYTz3CxF+JynuE1dSK0YwMNMqwOgMA5IAO6JMaY9sTvrQoFqnqw8BdNcKVW1n9X8G3hZwEsBxmUiFgAAUJW8RyFnAaycmTz8RWqCOgzDdimvBzqQshHqq74jN0B170aJvjm3rSqAnuk6QytSR7L3IYQURD90VaFeqQN+CCFN0flv6ojvUvIM7m8AAOhVjZPEhSwBHibYSokE0NfkBm/Xxbwg+KL2z+qhZwRojgA6AABQoyN7FED+HlCX/DV5HZiXwXybUWNBibbTcNb111VdAD0XRvxSwEuBsaROSh9CCFchBIVQUJkQQro5Tr9N71w7nukydx8FKudeDgD6kDvQuocH+NaJNaFAW/cPRxlMG6BEVe+r5RoGxVTQljepCblrCgAA1CTvUdirB45yXQNfaDYI8zH9fHPqzyjVV2e3NU5AH/KD0W0BrwPGtDsMw+8hhAvhJShfCOEwhJA2696nIkaXjBfQVQ8AoBxXrgUbUrgBcE+M8crZDYVy5vI1hQyUKDWL2Kv5ysQY0zPCZQEvBRiPwmQAAKA6McbUJO/alYNuXQp+fi3vPW+X9JqgcRr2big3Czmr4sXSm/oD6PkDdlTAS4EpvBZEh3KFEA5y8PyDh1FG8EvuOgoAQBl0gGYjOWQpXALwLQUtlKjqUOvY8n7kx7beFY1o4bOaGs7eFfA6gHEIoAMAALUyFAf6dOfz/yBrAvPRBOPpNA+nRF+d29Y6AT0VR5wr8qRxguhQkPQ5TJ/HYRj+I3jOSG5NTQQAgD+ft3YqXQYHJgAbXoGSAAAgAElEQVTf8t1IiQTQv6WQgRJV/1nNDR5M9oB2vAkhvHI9AQCA2uRm2r+4cNCdY0OxHqTJIMzHGckT5XzsbVUvmh7srr/HagPomU409EAQHRa0Fjz/PX8eYSxHMUYTNgEAYBiqDKDnjr0OAADWmKxMoezr3pPvY0xppjRNNIuIMZ74LYSmKFAGAACqFGNMAbBrVw+6cZn3JlkTQtgzeA5m8zHGeGG5n0Wjf4qznmGtOoCeC5l056IXgugwI8FzJnaZu1UBbTEJZRoK4gEomc69AN9yOEpxcoERX1OIRmlaOos5tKcFzVCbAQAA1MywP+jDnc/7ozQXhPkcWetnU2NBif6qsah9AvqQiyNMGqIn60F0DwowsvS5EjxnBr6/oU2K2adx1eKbAqANpqADfCs33fPdSGk8s39LIQPFaaVZRIzxk8JGaIbPMgAAUK0Y45Vhf9CFozzck2/Z24F5/OJ76Pny2p3V+vpp1s7qjVUfQM+Ht0Jc9CgFYz+EEG4E0eHlcvA83bh9EDxnYh6wAADK5T6N5zAFHeBbJitTmh1X5GsKGShUM5/VGGNqdvxbAS8FeJmtEIIp6AAAQLVijOks89IVhGZ9zI3zuSeEkPabd60LTO4232/wMr7LKU1TE9BXh7cfC3gpsITtHET/FEI4DiG8chVgM+nzkj83q+D5tqVjYh6wAADKJoC+jKqnHJqCDvCg9N14Z2koiODYwxQyUJomJqCvxBiPFHhDE0zKAgAAandozx6adGuY53fZ04F5+B4aQc7GOlOiJH8Ndm0igJ55MKJ3W8MwvB+G4X8hhNMQQlMFGjCm1NEshHCSwyXvBc+ZkQcsAAD4VgvN9DSaAlgTY/xkCjqFMQH9AQoZKFCL55sH6higehrZAAAAVYsx3qhdhCYd5DM5HmZPB6b3Wz5vZBzqzyjKakhyMwH0fOPkgwafvR2G4Y8QwkUIwYYBZCGE/RDC+TAM/x2G4V1u3ABz8YAFAACNylPQr11fgK+cCNxREE1IH+d8lZK00JzqK7mOQaEj1G13VWQFAABQqxhjqp39zQWEZvw7xnjlcn7Xm4JfG7Tg1jnjuHLW5Lal90T1/mwe3tIE9PRBO9GlH77yehiGDyGETyGE4zT12fLQm1QMkBoxhBBSB8ffPUyykDsPWNCFFic0AQCbO7JWAF+Ygk5pQgie2x9gCjqFed3iBcmFoD8X8FKA5zuwdgAAQO1ijEeaakMTznJ2ikeEEOzlwPQOc00A45I5oSR/5lCbCqBnhyZqwDfSlOf3aepzmv7shpoepGLCEEKaQJeC5x9MuGFhHrCgDyagAMDzNPEbmsNbHwt4KQAlMQWdknhuf5xCBorR6pThGGM6szor4KUAz7Nv3QAAgEYc2LeHql1rjr8Rezkwrd9ynRQjy+dJmodTijYD6DHGGxM14LvS9Of/pGnQIYQTU9Fpydq08zRJ4o9hGN7mBgywpI8xxnNXAACgCpoGLaOlaaRHCjYAvjAFncIoNnqEKegUpqXng6/EGA991qBa7iMAAIAm5KyFQWZQpzsDsTZmLwemcx1j1AhjWpqHU4o/z21bnICeHoyOc2cf4HFpGvS7PBX9Kod2Tf+gSiGE/XvTznddSQrx52aPiwHwIrokArOJMV5ZbV4iF2w4BAD4minoUAeFIpSi9fPKA7UMUKVt9RQAAEArckPKf7ugUJ0DdS0/lgc0yhLANO40spme5uEU5M9zkSYD6JmwF2xuN4d2/5dCvCEENwQULz0chhCO0zT/YRh+N+2cQuk0CAAAnYkxngiUAHyR90YEWymBaRffkYvWzop9gfSk2Qnow5ffxUPNWaBK7iUAAIBm5DNN+4FQj59zIJEfs4cD0znMwzmYnhoLSvB6aDmAnoskfingpUBtUoj3PyGET8LolCZ1lQ8hHKWp/Wl6/zAM7/M0fyjRxxjjuSsDAABd0hwTYE2M8VRzDqjCkVAsBWh+wnCuZdj3eYPqKF4GAABac2TvHqpwls/a2Iw9HJjGb7IR88lnSb/18n4pW8sT0NOH7dhDETzbljA6Jcih88MQQrpZ/d8wDL/mqf1QsjuBE+jSa5cdAJ5lp7Vl0xwT4EE6dLM0z+0/kCczHxf9IulB0xPQV/Izg7NXqEsX308AAEA/8n5gCmreuuxQrDQMSz3y0wigw/guY4zO++d3rJkxSwsh7DUdQM8OfdjgxYTRmdUDofMPwzC8cRWoyGHenAUAAH5su8U1ys0xLwt4KQBFiDFe6NAN5YsxnmjwDfPIv40/W26ohmY2AABAc3Kd44G8BRTp2jCspwkh7LRagwILutZQdxn5Pk3wn6W9aj6AnjuH69QP43kojJ6Cwq+sMS+RHvhCCEchhCuhcyqXug2eu4gAAIDmmADfODZJhSWl7twuwEYUtLGkrgKeMcZTIXSoh3sJAACgRTlvYWIwlCUFPvcNw3oy32UwrjuD+ZaVz5EMQGFJOz1MQF916vdhg/GtwugpKPy/EMJFDhA7dGUjIYT9EMJJCOFmGIb/DsPw6zAMu1aPit0pzgQAqJ5pj4wmxnjjGQHgi3ww7XuRJWmmu4FccPpL8S8UGiGEDlVRCwEAADQp7wnan4AyCHw+n70bGM9dboRxZU0XZwAKS+ojgJ75sMH0XucA8R8pUJynox+Yjs5KnnKeJuafpwn6wzD8PgzDu2EYti0SjTiw4QMAUD33c4wqxng+DMNvVhXgsxjjhe9FKF+M8VhzJpaSzpN6W3whdKiGImYAAKBZ9iegCAKfL2MCOozn0HdRGfIAlKPe14HldBNA92GD2W3n6ej/ydPRr/Kka4H0jqRrna/5+pTzNDH/TZ6gDy35LRdQA33+5nVXFDsjG1gAHQghNH0IGGM8EuAC+EoKtt5aEhag8OhpNPhmKV3utSnyhioIoAMAAE2zPwGLEj5/ud3a3wAU4uc8cINC5Hu0j64HC9jraQK6DxssazdPuhZIb9i9wHl6+P1fvuamnNO661w4DfRLAH06JhED0Ip9YUuAz2KM6T7/wHJA2XKRmwbfMCNF3lA8AXQAAKB59idgEcLnL9T64AOY0c/5XoDyHKo9YwGvugqgZz5sUIaHAumnIYTDEIJD20qka5Wv2WmecL4eONdBjJ4c5sJpAACAB62FLU0RBfgSbFXABoXLBSZnrhMz67p5tSJvKNqWBvsAAEAP7AvCrITPxyGADi8nfF4wjf5ZSncB9PxhOyzgpQBfS2Hlt8MwfBiG4Y8QwqcQwkUI4ThP1DZVdGHpGuRrcZyvTfo+/SNfs7cmnNOxf9v0AQAANpGfHexNAmQK2FiABrjPk6agX9f4wqlW95/V/Bv5kwZWUKTuv6MAAIA+xBgPNcmDyQmfj8eeDbyM8HkFNPpnAa/+3uOqxxhTcPKXYRjeF/BygIdtDcPwOv/7Uwjh/2/v7m/jOLY+AZeN/V/cCMSLCkDjCDSO4FIRmIpgqQiuFMErR/BSESwVwZIRvGQABZAZkBFoUfZpu9QeUvyYmf56HoCgLcCwWMXu6a6q3zn1Bat+WJ6nlGq37et6PRu/7Ysu9PXrMKqBrWJOgO9dlFI+GxMAgFm5bt9F2ZvFdA8rpZzlnN9HQTeAxasH2GI98s3Sx4K90LH0GWqB75zzOp6V7RXAnsS5hnXsjbr2YDwUzwcAABajBtFyzsneJuyE8Pl2CaDD8wmfT0g8n62jkSjs2ptFBtDTnxfbH12VHWiCSdkUSk/RdeM6wumC6U8QDx2H8dUFzt0X4XHqws+RsQIAmJ1rUzqI+k56tpQfNjYCagDuv0bw1wEYg3Ws7742GzBOTQhdEBb2qB4+jUItZ/bwYDQE0AEAgEURQoeduKlnkIXPtyPOX9hnhOcRPp+gKPR/qNEO+7DYAHo4igNNDknAtL2Jr393P0UsdNy1ofT2q5SyiEBBPFBs+tLRHF6uLvzcGkcgqJ4JADxJKeVzBElUowUWL4KtR4KtMG4RhD1x0BT2q+5rRgGIMweJYBTWpgEAAFgaIXTYqqvofO4M8vY4vwlPV/NWJ8Lnk9adsVDAmJ1adAA9NmqPU0r/dwR/HWD7/tExvdMLqKf4fhtf3Z/djrWqWBMsT024PDWb3QLmsFufSinnxhhoHBgMAOCpohptEkIH+CvYqrsyjJyDpuyJtbaeOIy6zjmfen8AAAAAhhBrg9dRJM86PjzPhQZYOyGADk9zF4UwRpmX4nGi0P9aCJ1dW3oH9HqxneWcf08p/Z8R/HWA/XrVhNM3dguIQ1Sdqwiotx4TQO26r6deWPwhqw2Ha3Q0gHG4KKV8NBcAe3NtqAGYMyF0gL81IfT/MSwwXkLo7IHDgveI94dz1x8Myr49AACwWLVxj2Ky8Gxf6vqe4duJx+QzgD/dRCEM4fMZiBD6UTRi9WzGTiw+gJ7+vNhO4kVItQfgIZvuETaXYVlqta8jcw6wP6UUAXSAZVh0wEQIHeBvEUJ/L1jHjgi1bokQOgwnrr/L6Db22lQAAAAA+xTr+Ie6bcKTfCilfDZkO2P/Bx7nKjqf9xtzMmH1nLUCQezSz0b3L0cRKgMAuPd5wQsXAMDsed4bxsESf+hWVDp/P56/EcBwarAupfTOvg07YMN9i+Ja9fwCA4jOJPVQ5VfjD/sXh/kAAAAWK85R1nejL34L4EF1r+ud8PnOCaDDj30ppaxkIeYp9o3WzliwCwLoIbrqHY/iLwMAjNGnUsq5mQHusfjQHMCMXJpMhiLEBfC3UsqZDVIYP88vMJx6SKyUUgvtfzANAAAAwL7F2kTNX3wy+LBR12n4zPDsTs75QAFi+KH38ZnNjEUI/TA+f2BrBNAb8WD3+2j+QgDAWFyUUj6aDeABKmgCAFsRIa5fBS4BVOmGqWhC6K5VGEB0T/olpXRj/GFvDg01AADAn+Js5Tvrg/CdrxE+1wRh95zdhPvVfYNfYi+PBYgO92shdLZJAL2nlHJSQ2aj+ksBAEOqL15HZgAAANiXUsq5zQCAP6nSDdMQB1cUjICBxOflSsF92BsBdAAAgEY0AlxZy4c/fCilHEUIkN2zTgOb1UIYK4UwlqcJoX9Z+liwHQLomx05HAEABItAAACwe2+N8fearr+KZQKL12yQfl36WMCYNQFYh0xhAPXzMgru6zgGAAAA7F0p5TrW8hXIY6m6TsOf/QbslQA6/JNCGAsXe0bHKaVPSx8LXk4AfYPmIBMAsGzvVf0CAACGEpsBa5sBAH/dE4/cE3khhV12rDlkqmAEDCQ6jh26DmGnVoYXAADgnxTIY8F0Gh6OdRr425VCGLRKKR89l/FSAuj3iAe/96P8ywEA+/CllHJqpAEGZcEDAP7eDPjVZyOADVKYgqZgxAcTBsNorsNfo/MSsF0HxhMAAOB+USBvpSgoC1D3q97pNDwo6zTwp99rkWiFMOiL57J1FCiAJxNAf0CEzr6M9i8IAOzKVSnl2OgCT3BosHbCQhiwd6WUc6POGMXv5qFDGgAOrsFURHeFX4RfeQZrQlsS7xGrOHgGAAAAsM91ietSyjoKVSoqyxxdRNfzM7M7KB3QWbq6D/drKeVEIQzuE4UJ1nKyPIcA+g9E+EyFBwBYjrt4uAZ4itdGCwBeJuesoMsPRBdDhzQAvj+49sl4wHjFYYZ6+OuraeIJHJDaoniPOImCEIq3wHborAUAAPBIUahS103mpO7Vf6j7VHW/yswO7tXCf36W7VMUwtBwhR+K/aKak33n3BlPIYD+OGsXFgAswh/hc9W/AABgEALojxSHNHT+BfjznvgxAnUOrsFIxWGGI4cZYFi1IEQUb3kfHVGA53tj7AAAAB4v1iVWCm0zA7XY6mHs2TMwjQ5YsHpe6Je6Vy73wFOVUs7inJ5zZzyKAPojxM1YCB0A5u8kOvIAAACMWtP51yENYPGag2u6ocOINYcZdEOHAZVSTqOg1SfvEgAAAMA+KbTNhNWCju9qsVVhz1ERQGdp6pr++3peSOaBl4gC4l3RYntFPEgA/ZHixnwyib8sAPAcv8ehKwAAgMloDmkIcgGL13RDd3ANRqrphv6rDswwnLgWP8a7xBdTAQAAAOxLU2j7nTVCJqIWclxFkVXG5cB8sCC/16IL8g5sU/w+Hdor4iEC6E8QF5XuGQAwP19LKQrNAAAAkxSHNAS5AP7uhq5SN/e5NjLjUEo514EZhhfvEscppX8p4AIAAADsU4R5V/IZjFhdL/tXLeSo6/lorZY+ACzC17gXnbgXsQtRtPg4zp1dGWR6rgTQnyiqgKvqAADzUR+Sj80n8Fw557XBA5gdAd5h2Bh8oRrkKqXUqrQfBLlgL+7sF4xXU6nbwTVaAugjogMzDzg3OPvVdB77VRAdAAAA2JdmjfBfEbCDMahnRn6t62V13cyMAAO5iHvRkXsR+xDnzlaK/dNzK4D+PCcqOgDALNQH47VqYAAA9Fi0H8bBEn/oXSilfG5ClzYEYLvq3sDvKaVfSikHUQWakeodXBNuhZFqOjALvsLA4nCRIDo87GscwAMAAGBLYo3wyJoEA6vB8/e16HtdJzMZk+CcCXN00RTBcC9i73rF/p07IwmgP0OE1Na6YQHApAmfA4yfxTMAeCYdRWGrasDkQw0x12rPpZSTUsqlIZ6OJtwqiI61wBETfIXx6F2PPjvhz/NB3TvBURzAAwAAYMuaNYl3shrsUT1P/CmC5975p+Vcc1Fm5CKKYAieM7jm3JkgOjqgP1eE1Y5cQAAwWccOiwMAAHMndAnPchNdzt+VUn6KgMnnej0ZzmlzTySlZD1wAgTRca2OR1yPPjtZqu694Jc4gO6dAAAAYE9KKWf1XawG8QTR2aG7CNUdRsiOiYl7xSrWL393v2Ci2o7nimAwKoLo1H1bAfQXiNDa0WR/AABYrlod7Mz8AwDAqByYjt3phS5tCMD37qLL+fvoaHgYXc6tHcxU7574u3sijFMTRP9F8HVZohg8I9J8dv5v7xPM3F0vdH6ioDUAAMBwahBPEJ0d+C54bj1y+mL98iTuF+9iT8EaJmP3tQme63jOqPWC6B88ly2LAPoLxU3+/aR/CABYli+qgwFbJiwHANuxMo67FxuvNgTgzyriHyJYchBdzk91NFyW7jBK3BMdXlsG1/gE1eBfr5COa3XeHAocse6AUX1+is/Oq6WPCbPQdTr/Nd4NhM4BAABGphdEvzA/PNNN/A4Jns9YdEU/bvb/vi59TBiVuyiQ8K84oyB4zqTEPtHnpuCH57L5u/xfSx+BbagvNDnneuH8Z/o/DQDM2pdYVADYJmE5gPmxycjsxWb65/qVcz5KKdUA5lszz4zVTa+6eXtuE5e+uCfWgoV1v6d2W67rR/Xe+MpgzYsiE9MW81cL6XyM55d6rf576eMyQ0KfExHFfutn5yreJ3x2MiX1wPlZ/R0WNgcAAJiOZj1iHWuF9jd5jItYA9C8akF6+38HsX55ZF+BgdzEGZ1TxS+Yi1rwo66zR6b2JPZu7RPNz60A+pbUCkhxwfw2ix8IAObnSvgcAIBHurThxJJs2BCom66v/RIwcQLnPEv8vpw3B1GOHWCbDV2zZ6T3/NJdq2+WPi4z4eDVxER497j57DxxPTJSFxE6P1OUBgAAYNpiLX8d64MfFcbjHl8i7GmvcOGE0RmQ+xCzF+vtdW/oJIqIH8nXzsq1APoW1VBbPIx4CAGAcbmqi43mBAAA4H42BJiwuy5sXouI2LxlG3oHUQRc50HQbIbi+aV2jPgcXZiPFdOZPJ2IJ2rDZ6fiVgztJt4RzqIwlQIXAAAAMxPrg21hvI/WIhZPl2EedE8Yfa2QBVt01f2OuQ+xNE0R8RPFPuahPm8LoG/fcWxgOYAEAONQF5PWXuAAAGD0Dk3ReNgQYORueoFzQTV2qhdwPWwOobgvTsNFEz5jxuLzoCumo3DEtHTFZC7jUBYT1ytupTgE+9IWpjr3ngAAALAcvUDpqimMJ0y6DHexB6DLME/S3jvqfxeF+tfWMnmGm+Y+ZF2SxVPsY/Kumv2WJIC+ZfUCyTmvhdABYBTqotKR8DnAZFmIA1gWm3cjdM+GQLcpYEOAfbloQmk6FzKoCNRtOoiyti80Cldxr7gUPFu2XuGI9lDD2nPnKFw1n+2KycxcrziEMDrbdtEEzh0wBwAAoFuLqOsPdQ3/WEHZWfsagc8z+4dsQ1eov1fodu0ewj264hef7XPA/TYU+1g199e3hm5wN70zFv/YaxFA34EmhH7tECYADOYuOp97oQN2bWWEd8bGAACMiOrf7EkXHtXdnEloDqKkpjv6SiB9L9qweRdi9R7JP2x4hjlswugC6bt3EdfodVynAqILtiGMvo4D4T4zeYy2w7n7CQAAAD9UStlUaFuQdNqEztmLttBt+nNvod1XEJhcLp3O4YXi2vnj+olntHVzzsL9dbe+C5s/9oyFAPqO9DqhC6EDwH4JnwP7dGC0AYAl2lD9e607Ok9009vUECBh0pru6H+IzdJVs1m6EnR9lpsIrp7H92v3C16iuVbbQPqqd716lnm6qy5k3gXOrdHzkOaA0efmELjCELQUpwK4X/dOVD83D312bk37/um9c3zq3HyKd7ZDRYy25q5X4I/x+RS/84fCGFt10a01zuhn4gFtkcpeGN2+5vh1BemEzhlU7E399Z4gkL4oV809yDMzbFF8rv9V9D/9fX9dNV/e/5+ufdd/cZHwn759+zbgzzJ/UbVbCB0A9ut9VK4E2Lmc87kFxJ35VagAGEIsYv4/g79/pZSflvYzz1XTzXAlQEJ4VhVdmJteKN3B0b/dNZufXYD11jshQ4lQ+mHzPHPgWv3DTXuNxmf6rQNXbFtT4EogfTmu2uCTZ4BhxLt813HmoAn4uQaf7iI+Ky8927IvruFH6z/TKp40Yc27W//33+H071l3mZFmfbH/+2/d4p/aZ7LrJnhhb4Lv5Jzbong+Q8bhqgud+7xiKnqBdIVup+2mKUym8AWMQBNKbwuLu8/u6Z1HAH0PhNABYK+Ez4G9EkDfKQF0YBAC6INy75+pOBC11ll0MS56HVAd6IIf2HBwtP2aQ1jgIr53m563zWFnh/yZjA3hhvb71J9t7ppud10Yp7tmr6NzPAyiCaSvHAafhYttdd1gf5rPwO6r+/xLC3zHv+k906auA5rfZ8aquYbba3cd3+cUUr/rX5eeaZerWWtJze979w43t5B6t+7Sf5ez7rJAsc+Zmt/39jNgTr/3V/3f9+4zwDMZL6Eo3mCEPZmdyJGtrGlOQnsPOvfuCNMR7z/9Pdu5vPt07zyDr0MLoO9JPDz8zyJ+WAAYjvA5sHcC6DslhAgMQgB9UO79C7Khs+ihTdfJuWgOd507yAu70zs03d0/Uy880NlVAKg9yN/p7gGd7qBzUnyCJepdq90Bh9S7bju7Wk+66V2XacO1+tczt+dvpqrpdtF9eZcYH+8LC9QEntKGz79Nz65pgAD7xYY/u93wrNs+2/r9ZRF613D7PLvp+t1lcH3TM217TSbPtGxLnO29791t3fvf7PIQ+2PWXdrfdesuPFuzP5M23OPba6KzyzMx/Wez/nOZZzIGFddLW2DbGbHt6IrTdWFPn2ksQm9N89A9ZTAXcf/piul7voCZata6+u89/ff9Xa5z/eidp333H+U7jwD6HuWcj1NK/72YHxgA9kv4HBhEbEgfNouCFgafpztIovMNMLgmNNIdsFjPrAvMGNw19/y2A417P/3nq+469Hw1jLvmcFd7zTrcCADA6DRdhbpCV3Pr8DdG3cGp8+a9wfsCAAAAs9XraiyU/rBur/GyWTPoF1yBRdtwPkLh/u25aYpjXsa5JPcggCcSQN8zIXQA2Anhc2B0mvDi4YavpQYYb3pBwz/CTMKGwJQ0nTC6Kpjdd5vK3+vu+be98OqtzRyey/PVTnRhkev+NetaBQBgLnrv8gdNoSsHOR/WduE8730XMgcAAIAQndIPm+L2XZj01ULGqA2a38Y6wig7eMJUOJ/0JFftvUdRfYDtEkAfgBA6AGyV8DkwSU2AKjWLg90GRJrgQmEXNEzNYcS2o60NBWARcs7dPb3bCGrv93MIyV40/9zd72+bA+k2cBhM7/lq0zW4hIBJt7Gaetdm+8+ezQAAIDxinXZuh8Xv7nlP8G4PAAAAO9CcIeh/n9L5gW4P8rZXrE5RaxjIhvNJqbnPzOlsxKZzqX81wrCOCbB7AugDEUIHgK34VEr5aCiBuWuqWaZeiKrTHoh8SD/UfvGI/6bfnfyyDTXZRAB4nqYCeqe91z/0Z5v0D8O3my8PaTeHO/0/c69ntpoN2U7/39M91+Z9Nh0Sudtwnf3Ipmsz3fPnwuQAALAnvXXadM87xKY/22TT+8Nj3+c77Vpt5x/vDaWU/hovAAAAMCK9NYf+WYJNZ8X6NoVNX3ouzD4kzMSGdc37zps+5XxEesEa56azD86lAoyUAPqAhNAB4EW+lFKODSEAAAAAAAAAAAAAAADA9vxsLIdTSjlNKb1f6s8PAC8gfA4AAAAAAAAAAAAAAACwAwLoAxNCB4An+yB8DgAAAAAAAAAAAAAAALAbP3379s3QjkDOuQbp/nvp4wAAP/A+ircAAAAAAAAAAAAAAAAAsAM6oI+ETugA8EPC5wAAAAAAAAAAAAAAAAA7JoA+IkLoAHAv4XMAAAAAAAAAAAAAAACAPRBAH5kI171LKd0tfSwAIAifAwAAAAAAAAAAAAAAAOzJT9++fTPWI5RzXqWUzlNKr5Y+FgAsmvA5AAAAAAAAAAAAAAAAwB7pgD5SpZTLlNJaJ3QAFqp+/r0TPgcAAAAAAAAAAAAAAADYLx3QR04ndAAWqIbP11GMBQAAAAAAAAAAAAAAAIA90gF95CJ8V0PoV0sfCwAWQfgcAAAAAAAAAAAAAAAAYEAC6BNQSrmuYTwhdABm7kr4HAAAAAAAAAAAAAAAAGBYP3379s0UTETO+SCldJ5SeiYSCRgAAAw+SURBVLP0sQBgdrrw+a2pBQAAAAAAAAAAAAAAABiOAPoE5ZxPU0q/LX0cAJiNi5TSkfA5AAAAAAAAAAAAAAAAwPAE0CdKCB2AmfhSSjk2mQAAAAAAAAAAAAAAAADj8LN5mKYI671f+jgAMGmfhM8BAAAAAAAAAAAAAAAAxkUH9InLOdfg3ueU0quljwUAk/K+lHJqygAAAAAAAAAAAAAAAADGRQB9BnLOq5TSuRA6ABNwl1I6KqWcmywAAAAAAAAAAAAAAACA8fnZnExfKeUypVRD6FdLHwsARu0mpbQWPgcAAAAAAAAAAAAAAAAYLx3QZyTnfJBSOkspvV36WAAwOlcRPr81NQAAAAAAAAAAAAAAAADjJYA+Qznn05TSb0sfBwBG40sp5dh0AAAAAAAAAAAAAAAAAIzfz+ZofiLk937p4wDAKHwQPgcAAAAAAAAAAAAAAACYDh3QZyznvE4pnaWUXi19LADYu7uU0nEp5czQAwAAAAAAAAAAAAAAAEyHDugzVko5TynVEPrV0scCgL26qZ8/wucAAAAAAAAAAAAAAAAA0yOAPnOllMsIoX9d+lgAsBcXKaVVfP4AAAAAAAAAAAAAAAAAMDE/ffv2zZwtRM75Y0rpP0sfBwB25vdSyonhBQAAAAAAAAAAAAAAAJguAfSFyTkfpZROU0qvlj4WAGzNXUrpuJRyZkgBAAAAAAAAAAAAAAAApk0AfYFyzocppRoSfLP0sQDgxa4ifH5pKAEAAAAAAAAAAAAAAACm72dzuDyllOuU0jql9GXpYwHAi3ytnyfC5wAAAAAAAAAAAAAAAADzoQP6wuWcj1NK/730cQDgyT6UUj4bNgAAAAAAAAAAAAAAAIB5EUCnhtBXKaWzlNJrowHAD9yklI50PQcAAAAAAAAAAAAAAACYp5/NKxEirCH0r4sfDAAeUj8nVsLnAAAAAAAAAAAAAAAAAPOlAzrfyTmfpJT+y6gA0POhlPLZoAAAAAAAAAAAAAAAAADMmwA6/5Bzrt3Qz1JKr40OwOLdpJSOdD0HAAAAAAAAAAAAAAAAWIafzTN9ETKsIfQvBgdg0ernwEr4HAAAAAAAAAAAAAAAAGA5dEDnQTnno5TSaUrplZECWIy7lNJJKeXUlAMAAAAAAAAAAAAAAAAsiwA6P5RzPowQ+lujBTB7Vymlo1LKtakGAAAAAAAAAAAAAAAAWB4BdB4t5/wxpfQfIwYwW59KKR9NLwAAAAAAAAAAAAAAAMByCaDzJDnnVXRDf2PkAGbjJrqeX5pSAAAAAAAAAAAAAAAAgGX7eekDwNNEOHGdUvrd0AHMQr2fr4TPAQAAAAAAAAAAAAAAAEg6oPMSOed1dEN/bSABJqd2PT8upZybOgAAAAAAAAAAAAAAAAA6OqDzbBFaXOmGDjA5Xddz4XMAAAAAAAAAAAAAAAAAvqMDOluhGzrAJOh6DgAAAAAAAAAAAAAAAMCDdEBnK3RDBxg9Xc8BAAAAAAAAAAAAAAAA+CEd0Nk63dABRkXXcwAAAAAAAAAAAAAAAAAeTQCdnck5f0wp/ccIAwzmUynlo+EHAAAAAAAAAAAAAAAA4LEE0NmpnPMqpfQ5pfTWSAPszUVK6aSUcmnIAQAAAAAAAAAAAAAAAHgKAXT2Iud8klKqXXhfGXGAnbmr99pSymdDDAAAAAAAAAAAAAAAAMBzCKCzNznng+iG/ptRB9i6ryml41LKraEFAAAAAAAAAAAAAAAA4LkE0Nm7nPM6pXSaUnpt9AFe7CaC5+eGEgAAAAAAAAAAAAAAAICXEkBnMDnnjymlk5TSK7MA8GR3KaXPpZSPhg4AAAAAAAAAAAAAAACAbRFAZ1A558OUUg1P/mYmAB7tS713llKuDRkAAAAAAAAAAAAAAAAA2ySAzijknNe1k29K6Y0ZAbjXVUrppJRybogAAAAAAAAAAAAAAAAA2AUBdEYl53wcQfRXZgbgL3cRPD81JAAAAAAAAAAAAAAAAADs0s9GlzGJcOVhSumTiQH4Q70fHgqfAwAAAAAAAAAAAAAAALAPOqAzWjnnGkT/mFL6zSwBC/Sl3gNLKdcmHwAAAAAAAAAAAAAAAIB9EUBn9HLO6wiivzVbwAJcRPD83GQDAAAAAAAAAAAAAAAAsG8C6ExGBNFPU0qvzRowQzcppZNSypnJBQAAAAAAAAAAAAAAAGAoAuhMTs75ODqiC6IDc3ATHc9PzSYAAAAAAAAAAAAAAAAAQxNAZ7JyzicRRH9lFoEJukspfS6lfDR5AAAAAAAAAAAAAAAAAIyFADqTlnM+SCmdxJcgOjAFfwTPI3x+a8YAAAAAAAAAAAAAAAAAGBMBdGZBEB2YAMFzAAAAAAAAAAAAAAAAAEZPAJ1ZEUQHRkjwHAAAAAAAAAAAAAAAAIDJEEBnlgTRgREQPAcAAAAAAAAAAAAAAABgcgTQmTVBdGAAgucAAAAAAAAAAAAAAAAATJYAOouRcz5OKX1MKb0268AO3ETw/FTwHAAAAAAAAAAAAAAAAICpEkBncQTRgS2rwfOPpZRTAwsAAAAAAAAAAAAAAADA1Amgs1g553UE0d/6LQCe4aJ2PC+lnBk8AAAAAAAAAAAAAAAAAOZCAJ3FyzmvUkonKaXflj4WwKN8SSmdllLODRcAAAAAAAAAAAAAAAAAcyOADiHnfJhSOo4w+ivjAjTuaug8Op5fGxgAAAAAAAAAAAAAAAAA5koAHTbIOXdB9DfGBxbtJqX0MaV0Vkq5XfpgAAAAAAAAAAAAAAAAADB/AujwgJzzOrqi/2acYFG+Rrfzc9MOAAAAAAAAAAAAAAAAwJIIoMMj5JwPoiN6DaO/NmYwS3c1dJ5SOi2lXJtiAAAAAAAAAAAAAAAAAJZIAB2eKOd8FEH0fxs7mIWLCJ2fmk4AAAAAAAAAAAAAAAAAlk4AHZ4p53wYQXRd0WF6blJKZ7XjuW7nAAAAAAAAAAAAAAAAAPA3AXTYgpzzOoLovxlPGLWv0e38zDQBAAAAAAAAAAAAAAAAwD8JoMMW5ZwPUkpHKaWTlNIbYwujcFVD5xE8vzUlAAAAAAAAAAAAAAAAAHA/AXTYkZzzYXRFr1+vjTPs1U1K6SxC55eGHgAAAAAAAAAAAAAAAAAeRwAd9iDnvIog+pEwOuzMXYTOz0opZ4YZAAAAAAAAAAAAAAAAAJ5OAB32LOd8FEH0+vXK+MOLfRE6BwAAAAAAAAAAAAAAAIDtEECHAQmjw7N9bbqd3xpGAAAAAAAAAAAAAAAAANgOAXQYiQijryOM/tq8wHfumsC5TucAAAAAAAAAAAAAAAAAsCMC6DBCOedVSuk4AulvzBELdZNSOhc6BwAAAAAAAAAAAAAAAID9EUCHkcs5H0ZX9Pr11nwxc1dNp/NLkw0AAAAAAAAAAAAAAAAA+yWADhOScz6IruhH8f21+WPi7rou5/V7KeXahAIAAAAAAAAAAAAAAADAcATQYcJyzqsIotevf5tLJuKqCZyfmzQAAAAAAAAAAAAAAAAAGA8BdJiRnHPbHf2NuWUkbrrAeYTOb00MAAAAAAAAAAAAAAAAAIyTADrMVM75oOmOLpDOPt10YfMInF8bfQAAAAAAAAAAAAAAAACYBgF0WIgIpK+aQPpbc8+WXPUC5zqcAwAAAAAAAAAAAAAAAMBECaDDguWc20B6/efXfh/4gbsIml9G2PzcgAEAAAAAAAAAAAAAAADAfAigA3+JLunrplN6/f7KCC3aRRc2r99LKddLHxAAAAAAAAAAAAAAAAAAmDMBdOBBOefDCKK3Xzqlz89dGzRPKV2XUi6XPigAAAAAAAAAAAAAAAAAsDQC6MCz5Jy7DultQF239GmoXc2v46vrbH679EEBAAAAAAAAAAAAAAAAAATQgS3KOR80ofT6VUPq9c/eGOe9u4mA+WX7vZRyvbBxAAAAAAAAAAAAAAAAAACeQAAd2Iuc82HTLf2g913n9Oe5iP/qvPl+W0q5nNIPAQAAAAAAAAAAAAAAAACMhwA6MAo55y6Y3gXVU3RQT/Hvrxc0U1338hSdy2/j368FzAEAAAAAAAAAAAAAAACAXRJAByal6aSemk7qnS7E3no74M93FeHxzm0EyjvXTdBcsBwAAAAAAAAAAAAAAAAAGJwAOrBIvSD7S1yXUq79FgEAAAAAAAAAAAAAAAAAk5dS+v8THTwlWRRUrQAAAABJRU5ErkJggg=="/>
</defs>
</svg>

source/_static/images/nav/channels.svg METASEP
<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0)">
<path d="M32.68 1.82C29.71 0.58 26.64 0 23.62 0C14.37 0 5.58999 5.47 1.81999 14.54C-3.19001 26.57 2.49999 40.39 14.54 45.4C17.5 46.63 20.58 47.22 23.6 47.22C32.85 47.22 41.62 41.75 45.4 32.68C50.41 20.64 44.71 6.83 32.68 1.82ZM40.25 30.54C37.44 37.29 30.9 41.65 23.59 41.65C21.22 41.65 18.89 41.18 16.67 40.26C12.22 38.41 8.75999 34.94 6.92999 30.48C5.08999 26.03 5.09999 21.13 6.94999 16.68C9.76999 9.93 16.31 5.57 23.62 5.57C25.99 5.57 28.32 6.04 30.54 6.96C34.99 8.81 38.45 12.28 40.28 16.74C42.11 21.19 42.11 26.09 40.25 30.54Z" fill="#1B1D22"/>
<path d="M14.22 30.27V24.18L18.14 15.64H21.19L17.87 23.97H20.21V30.28H14.22V30.27ZM24.61 30.27V24.18L28.53 15.64H31.58L28.26 23.97H30.6V30.28H24.61V30.27Z" fill="#1B1D22"/>
</g>
<defs>
<clipPath id="clip0">
<rect width="47.22" height="47.22" fill="white"/>
</clipPath>
</defs>
</svg>

source/_static/images/nav/channels-icon.svg METASEP
<svg width="52" height="46" viewBox="0 0 52 46" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0)">
<path d="M26.1973 6.54942H47.2062C47.8354 6.54499 48.4594 6.66483 49.0422 6.90209C49.625 7.13934 50.1552 7.48933 50.6024 7.93197C51.0496 8.37461 51.4049 8.90119 51.6481 9.48149C51.8912 10.0618 52.0173 10.6844 52.0192 11.3135V33.0984C52.0167 33.7272 51.8901 34.3493 51.6467 34.929C51.4033 35.5087 51.0478 36.0347 50.6007 36.4769C50.1536 36.919 49.6236 37.2686 49.0411 37.5055C48.4586 37.7425 47.835 37.8622 47.2062 37.8577H42.1525V46.0385L34.5624 37.8577H26.1973C25.5685 37.8622 24.9449 37.7425 24.3624 37.5055C23.7799 37.2686 23.2499 36.919 22.8028 36.4769C22.3557 36.0347 22.0002 35.5087 21.7568 34.929C21.5134 34.3493 21.3868 33.7272 21.3843 33.0984V11.3135C21.3862 10.6844 21.5123 10.0618 21.7554 9.48149C21.9986 8.90119 22.3539 8.37461 22.8011 7.93197C23.2483 7.48933 23.7785 7.13934 24.3613 6.90209C24.9441 6.66483 25.5681 6.54499 26.1973 6.54942Z" fill="#1E325C"/>
<path d="M39.0434 6.36297e-07H4.77458C4.14533 -0.00443734 3.52141 0.11541 2.9386 0.352664C2.35579 0.589917 1.82557 0.939904 1.37839 1.38254C0.9312 1.82518 0.575843 2.35177 0.332704 2.93207C0.0895656 3.51236 -0.0365667 4.13494 -0.0384521 4.76409V26.5298C-0.0359346 27.1585 0.0906638 27.7806 0.334085 28.3603C0.577506 28.9401 0.932967 29.4661 1.38009 29.9082C1.82721 30.3503 2.35721 30.6999 2.9397 30.9369C3.52219 31.1738 4.14574 31.2935 4.77458 31.289H9.83308V39.4698L17.4232 31.289H39.0434C39.6722 31.2935 40.2957 31.1738 40.8782 30.9369C41.4607 30.6999 41.9907 30.3503 42.4379 29.9082C42.885 29.4661 43.2404 28.9401 43.4839 28.3603C43.7273 27.7806 43.8539 27.1585 43.8564 26.5298V4.76409C43.8545 4.13494 43.7284 3.51236 43.4852 2.93207C43.2421 2.35177 42.8868 1.82518 42.4396 1.38254C41.9924 0.939904 41.4622 0.589917 40.8794 0.352664C40.2965 0.11541 39.6726 -0.00443734 39.0434 6.36297e-07Z" fill="#FFBC1F"/>
<path d="M10.218 12.5358C10.8286 12.5349 11.4258 12.7151 11.9339 13.0537C12.442 13.3923 12.8381 13.874 13.0722 14.4378C13.3063 15.0016 13.3678 15.6223 13.2489 16.2211C13.1301 16.8199 12.8361 17.3699 12.4044 17.8016C11.9726 18.2333 11.4225 18.5272 10.8236 18.6461C10.2246 18.7649 9.60392 18.7034 9.03998 18.4694C8.47605 18.2353 7.99427 17.8392 7.65563 17.3312C7.317 16.8232 7.13675 16.2262 7.1377 15.6157C7.13897 14.7992 7.46392 14.0166 8.04132 13.4393C8.61872 12.862 9.40147 12.5371 10.218 12.5358Z" fill="white"/>
<path d="M21.9187 12.5358C22.5293 12.5349 23.1265 12.7151 23.6346 13.0537C24.1426 13.3923 24.5388 13.874 24.7729 14.4378C25.007 15.0016 25.0685 15.6223 24.9496 16.2211C24.8308 16.8199 24.5368 17.3699 24.1051 17.8016C23.6733 18.2333 23.1232 18.5272 22.5242 18.6461C21.9253 18.7649 21.3046 18.7034 20.7407 18.4694C20.1767 18.2353 19.695 17.8392 19.3563 17.3312C19.0177 16.8232 18.8374 16.2262 18.8384 15.6157C18.8397 14.7992 19.1646 14.0166 19.742 13.4393C20.3194 12.862 21.1022 12.5371 21.9187 12.5358Z" fill="white"/>
<path d="M33.6192 12.5358C34.2298 12.5349 34.8269 12.7151 35.335 13.0537C35.8431 13.3923 36.2393 13.874 36.4734 14.4378C36.7075 15.0016 36.769 15.6223 36.6501 16.2211C36.5312 16.8199 36.2373 17.3699 35.8055 17.8016C35.3737 18.2333 34.8236 18.5272 34.2247 18.6461C33.6258 18.7649 33.0051 18.7034 32.4411 18.4694C31.8772 18.2353 31.3954 17.8392 31.0568 17.3312C30.7181 16.8232 30.5379 16.2262 30.5388 15.6157C30.5401 14.7992 30.865 14.0166 31.4424 13.4393C32.0198 12.862 32.8026 12.5371 33.6192 12.5358Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0">
<rect width="52" height="46" fill="white"/>
</clipPath>
</defs>
</svg>

source/_static/images/nav/boards.svg METASEP
<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0)">
<path d="M32.6801 1.82C29.7101 0.58 26.6401 0 23.6201 0C14.3701 0 5.59007 5.47 1.82007 14.54C-3.18993 26.57 2.50007 40.39 14.5401 45.4C17.5001 46.63 20.5801 47.22 23.6001 47.22C32.8501 47.22 41.6201 41.75 45.4001 32.68C50.4101 20.64 44.7101 6.83 32.6801 1.82ZM40.2501 30.54C37.4401 37.29 30.9001 41.65 23.5901 41.65C21.2201 41.65 18.8901 41.18 16.6701 40.26C12.2201 38.41 8.76007 34.94 6.93007 30.48C5.09007 26.03 5.10007 21.13 6.95007 16.68C9.77007 9.93 16.3101 5.57 23.6201 5.57C25.9901 5.57 28.3201 6.04 30.5401 6.96C34.9901 8.81 38.4501 12.28 40.2801 16.74C42.1101 21.19 42.1101 26.09 40.2501 30.54Z" fill="#1B1D22"/>
<path d="M30.0102 17.2H17.2002V30.01H30.0102V17.2Z" stroke="#1B1D22" stroke-width="4.6253" stroke-miterlimit="10" stroke-linejoin="round"/>
</g>
<defs>
<clipPath id="clip0">
<rect width="47.22" height="47.22" fill="white"/>
</clipPath>
</defs>
</svg>

source/_static/images/nav/boards-icon.svg METASEP
<svg width="47" height="47" viewBox="0 0 47 47" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0)">
<path d="M8.09798 8.65202C12.1221 4.60741 17.1903 2.52241 23.3026 2.39702C29.3564 2.52533 34.3953 4.61033 38.4194 8.65202C42.4436 12.6937 44.5492 17.7327 44.7364 23.769C44.5463 29.7995 42.4406 34.8385 38.4194 38.886C34.3982 42.9335 29.3593 45.0229 23.3026 45.1541C17.1874 45.0287 12.1192 42.9452 8.09798 38.9035C4.07677 34.8618 1.9711 29.8228 1.78101 23.7865C1.96525 17.7385 4.07092 12.6937 8.09798 8.65202Z" fill="white"/>
<path d="M35.4715 23.769C35.4295 26.9874 34.1368 30.064 31.8656 32.3511C30.751 33.4862 29.4181 34.3855 27.9467 34.995C26.4754 35.6046 24.8958 35.9118 23.3026 35.8985C19.8107 35.8372 16.9418 34.6548 14.6957 32.3511C12.4459 30.0459 11.1437 26.9841 11.0459 23.769C11.1073 20.3484 12.245 17.5169 14.4588 15.2745C16.6727 13.032 19.6206 11.8189 23.3026 11.6352C24.8954 11.593 26.4796 11.8824 27.954 12.4849C29.4284 13.0874 30.7606 13.9898 31.8656 15.1345C34.1324 17.4459 35.4231 20.5365 35.4715 23.769Z" fill="white"/>
<path d="M23.3026 47.0044C16.6902 46.8178 11.1848 44.5461 6.78634 40.1895C2.38786 35.8329 0.125754 30.3594 0 23.769C0.125754 17.2341 2.38786 11.7752 6.78634 7.39228C11.1848 3.00941 16.6902 0.724647 23.3026 0.538017C29.8564 0.721731 35.3311 3.00794 39.7267 7.39665C44.1222 11.7854 46.3844 17.2443 46.5131 23.7734C46.3873 30.3666 44.1252 35.8401 39.7267 40.1939C35.3282 44.5476 29.8535 46.8178 23.3026 47.0044ZM23.3026 4.91652C17.9361 5.10315 13.4762 6.95486 9.9229 10.4717C6.36961 13.9885 4.52864 18.4209 4.39996 23.769C4.52279 29.1171 6.36376 33.5641 9.9229 37.1101C13.482 40.6561 17.9419 42.4917 23.3026 42.6171C28.6048 42.4917 33.0354 40.6561 36.5946 37.1101C40.1537 33.5641 41.9932 29.1171 42.1131 23.769C41.9903 18.418 40.1508 13.9855 36.5946 10.4717C33.0383 6.95777 28.6077 5.10461 23.3026 4.91215V4.91652Z" fill="#FFBC1F"/>
<path d="M23.3026 37.7662C19.3106 37.6379 16.0045 36.2848 13.3841 33.707C10.7637 31.1292 9.39065 27.8165 9.26489 23.769C9.26489 19.8498 10.5604 16.5838 13.1516 13.971C15.7427 11.3581 19.0957 9.95842 23.2105 9.77179C27.2025 9.83303 30.5247 11.1861 33.1773 13.831C35.8298 16.4759 37.1868 19.7885 37.2482 23.769C37.1868 27.7495 35.8298 31.0461 33.1773 33.6589C30.5492 36.2602 27.0055 37.7342 23.3026 37.7662ZM23.4913 14.5308H23.3026C20.5565 14.6533 18.3104 15.5704 16.5645 17.2822C15.7011 18.1284 15.0289 19.1488 14.5931 20.2751C14.1574 21.4014 13.968 22.6075 14.0377 23.8127C14.0291 25.0277 14.265 26.2321 14.7314 27.3546C15.1978 28.477 15.8852 29.4948 16.7531 30.3477C17.8282 31.4251 19.1524 32.2225 20.6091 32.6698C22.0659 33.117 23.6105 33.2004 25.1072 32.9126C26.6038 32.6247 28.0066 31.9745 29.192 31.0191C30.3775 30.0637 31.3092 28.8324 31.9052 27.4336C32.5013 26.0348 32.7435 24.5113 32.6103 22.9973C32.4772 21.4833 31.9729 20.0251 31.1418 18.751C30.3107 17.477 29.1783 16.4262 27.8442 15.691C26.5101 14.9559 25.0153 14.559 23.4913 14.5352V14.5308Z" fill="#FFBC1F"/>
<path d="M20.5433 21.0964C21.2765 20.4049 22.2474 20.0195 23.2566 20.0195C24.2658 20.0195 25.2366 20.4049 25.9698 21.0964C26.6623 21.8095 27.0496 22.7632 27.0496 23.7559C27.0496 24.7485 26.6623 25.7023 25.9698 26.4154C25.2366 27.1069 24.2658 27.4923 23.2566 27.4923C22.2474 27.4923 21.2765 27.1069 20.5433 26.4154C19.8538 25.7007 19.4688 24.7475 19.4688 23.7559C19.4688 22.7642 19.8538 21.8111 20.5433 21.0964Z" fill="#FFBC1F"/>
<path d="M23.7939 24.1583C23.6572 24.2946 23.4718 24.3712 23.2785 24.3712C23.0851 24.3712 22.8998 24.2946 22.7631 24.1583C22.6264 24.022 22.5496 23.8371 22.5496 23.6444C22.5496 23.4516 22.6264 23.2667 22.7631 23.1304L25.6671 20.2391L26.6015 21.267L23.7939 24.1583Z" fill="#818698"/>
<path d="M46.9825 6.97236C47.2954 8.72201 44.3314 10.0342 38.0905 10.9091L29.0142 21.0789C28.8153 21.2872 28.5756 21.4526 28.31 21.5647C28.0444 21.6768 27.7585 21.7333 27.4701 21.7307C26.8738 21.7315 26.3014 21.4972 25.8777 21.0789C25.6567 20.8875 25.4797 20.6509 25.3586 20.3853C25.2375 20.1196 25.1752 19.8311 25.1758 19.5392C25.1826 18.9333 25.4156 18.3515 25.8294 17.9077L36.0331 8.94947C36.9104 2.72946 38.2265 -0.242029 39.9812 0.0349989C41.7359 0.312027 41.8909 2.49909 40.4462 6.59619C44.4937 5.10607 46.6725 5.23146 46.9825 6.97236Z" fill="#1E325C"/>
</g>
<defs>
<clipPath id="clip0">
<rect width="47" height="47" fill="white"/>
</clipPath>
</defs>
</svg>

source/_static/images/nav/apps.svg METASEP
<svg width="40" height="42" viewBox="0 0 40 42" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M20.0001 32.632L33.5164 15.3778H27.7825V0H12.611V15.3549V15.3778H6.48389L20.0001 32.632Z" fill="#1E325C"/>
<path d="M35.3406 32.2559V37.3252H4.65935V32.2559H0V37.3252V42H4.65935H35.3406H40V37.3252V32.2559H35.3406Z" fill="#1E325C"/>
</svg>

source/_static/images/nav/WorkflowOrchestration.svg METASEP
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M15.6137 27.2188C15.0173 28.1316 13.6677 28.2604 12.6205 27.524L0.79888 19.1968C-0.01032 18.6284 -0.23992 17.5392 0.27248 16.758L10.6717 0.865246C11.1841 0.0840456 12.3293 -0.226754 13.2477 0.176446L26.6569 6.08165C27.8441 6.60525 28.3397 7.77565 27.7433 8.68845L15.6137 27.2188Z" fill="#954D0E"/>
<path d="M13.7321 26.1409L1.5437 17.8081L12.2649 1.43365L25.8477 7.63566L13.7321 26.1409Z" fill="white"/>
<path d="M21.449 6.47086C21.2782 6.73126 20.875 6.81806 20.5502 6.66686L15.4234 4.25886C15.1294 4.12166 15.023 3.81086 15.1854 3.56166L15.989 2.33246C16.1514 2.08606 16.521 1.99366 16.8206 2.12526L22.0146 4.42966C22.3422 4.57526 22.4738 4.90566 22.303 5.16886L21.449 6.47086Z" fill="#93979A"/>
<path d="M20.4688 4.87487L17.1648 3.37687L17.9796 2.13087C18.142 1.88167 18.5228 1.78647 18.8308 1.91807L21.0288 2.87287C21.3508 3.01287 21.474 3.33487 21.306 3.59247L20.4688 4.87487Z" fill="#1B1D22"/>
<path d="M20.7096 11.6285L13.8524 8.10886L14.2108 7.56006L21.0932 11.0405L20.7096 11.6285Z" fill="#FFBC1F"/>
<path d="M11.6881 7.75042C11.6125 7.79242 11.5285 7.76442 11.5033 7.68602L11.0805 6.44282C11.0553 6.36722 11.1057 6.28882 11.1925 6.27202L11.3521 6.23842C11.4417 6.21882 11.5341 6.26642 11.5593 6.34482L11.7833 6.99442C11.8113 7.07282 11.8925 7.10082 11.9681 7.05602L13.2393 6.33922C13.3149 6.29722 13.4241 6.31682 13.4801 6.38402L13.5809 6.50722C13.6369 6.57442 13.6201 6.66402 13.5445 6.70882L11.6881 7.75042Z" fill="#FFBC1F"/>
<path d="M18.4669 15.0528L11.7441 11.3288L12.1053 10.7772L18.8505 14.4676L18.4669 15.0528Z" fill="#AFBDC6"/>
<path d="M10.456 11.4577L8.47363 10.3433L9.61883 8.59326L11.6236 9.67406L10.456 11.4577Z" fill="#AFBDC6"/>
<path d="M16.2242 18.48L9.63855 14.546L9.99695 13.9944L16.6077 17.8948L16.2242 18.48Z" fill="#AFBDC6"/>
<path d="M8.36727 14.6496L6.42407 13.4708L7.56927 11.7208L9.53767 12.866L8.36727 14.6496Z" fill="#AFBDC6"/>
<path d="M13.9814 21.9045L7.53296 17.7633L7.89136 17.2145L14.365 21.3193L13.9814 21.9045Z" fill="#AFBDC6"/>
<path d="M6.27851 17.8389L4.37451 16.5985L5.52251 14.8513L7.44891 16.0553L6.27851 17.8389Z" fill="#AFBDC6"/>
</svg>

source/_static/images/nav/TestQA.svg METASEP
<svg width="25" height="25" viewBox="0 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2.545 2.545C4.3125 0.8475 6.3525 0 8.6675 0C10.9825 0 13.0225 0.8475 14.79 2.545C16.345 4.135 17.1925 5.9825 17.335 8.085C17.475 10.1875 16.8925 12.1225 15.585 13.89L16.91 15.215L15.2125 16.9125L13.8875 15.5875C12.12 16.86 10.195 17.435 8.11 17.31C6.025 17.1875 4.17 16.3475 2.545 14.7925C0.8475 13.0225 0 10.9825 0 8.6675C0 6.3525 0.8475 4.3125 2.545 2.545Z" fill="#B3B3B3"/>
<path d="M3.68497 3.65753C5.00997 2.31503 6.67997 1.62503 8.69497 1.59003C10.675 1.62503 12.335 2.31503 13.6775 3.65753C15.02 5.00003 15.71 6.66253 15.745 8.64003C15.71 10.655 15.02 12.325 13.6775 13.65C12.335 14.975 10.6725 15.6725 8.69497 15.745C6.67997 15.675 5.00997 14.9775 3.68497 13.65C2.35997 12.325 1.66247 10.655 1.58997 8.64003C1.65997 6.66253 2.35997 5.00253 3.68497 3.65753Z" fill="#F2F2F2"/>
<path d="M3.92251 12.8825C5.37001 14.26 7.03251 14.95 8.90501 14.95C10.7775 14.95 12.4375 14.26 13.8875 12.8825C14.665 12.105 15.23 11.2225 15.585 10.2325C15.3025 11.54 14.665 12.7075 13.6775 13.7325C12.2275 15.11 10.5575 15.8 8.66751 15.8C6.77751 15.8 5.10751 15.11 3.65751 13.7325C2.66751 12.7075 2.03251 11.5425 1.75001 10.2325C1.46501 8.92499 1.55501 7.63249 2.01501 6.36249C1.76751 7.49499 1.80251 8.63249 2.12001 9.78249C2.43751 10.93 3.04001 11.9625 3.92251 12.8825Z" fill="#999999"/>
<path d="M22.8225 24.89C22.38 25.0125 22.055 24.97 21.8425 24.7575L14.8975 17.2275C14.685 17.015 14.5975 16.7425 14.6325 16.405C14.6675 16.07 14.88 15.69 15.2675 15.265C15.6925 14.8775 16.07 14.655 16.4075 14.6025C16.7425 14.55 17.0175 14.6475 17.23 14.895L24.81 21.84C25.0225 22.0525 25.0575 22.37 24.915 22.795C24.7725 23.22 24.5075 23.6425 24.12 24.0675C23.695 24.4925 23.2625 24.765 22.8225 24.89Z" fill="#FFBC1F"/>
<path d="M23.2723 20.41L20.4623 23.2725L17.0173 19.56L19.5598 17.0175L23.2723 20.41Z" fill="#954D0E"/>
<path d="M11.7326 12.1275C11.7101 12.1675 11.6751 12.175 11.6301 12.1525L11.5276 12.085L11.4251 12.0175C11.3576 11.96 11.3001 11.8975 11.2551 11.83C11.1526 11.705 11.0676 11.5675 10.9976 11.42C10.9301 11.2725 10.8676 11.125 10.8101 10.975L10.6901 10.6L10.3301 10.4625L9.81759 10.275C9.81759 10.73 9.73009 11.14 9.55259 11.505C9.37509 11.87 9.13509 12.16 8.82759 12.3775C8.65759 12.49 8.48509 12.49 8.31509 12.3775C8.01759 12.16 7.78259 11.87 7.60509 11.505C7.42759 11.14 7.34009 10.73 7.34009 10.275L6.84509 10.4625L6.48759 10.6L6.36759 10.975C6.31009 11.1225 6.24509 11.2725 6.17009 11.42C6.09509 11.5675 6.00759 11.705 5.90509 11.83C5.86009 11.8975 5.80259 11.96 5.73509 12.0175L5.58009 12.12L5.52759 12.155C5.48259 12.1775 5.45009 12.17 5.43259 12.13C5.41509 12.09 5.42509 12.0525 5.45759 12.02L5.54259 11.97L5.62759 11.885C5.67259 11.84 5.71759 11.7875 5.76509 11.7325C5.84509 11.6075 5.91259 11.4725 5.97009 11.33C6.02759 11.1875 6.07759 11.0425 6.12509 10.895L6.22759 10.4675C6.23759 10.41 6.26759 10.37 6.31259 10.3475L6.74009 10.21L7.35509 9.95502C7.41259 9.45502 7.57009 9.02752 7.83259 8.67252L7.78009 8.65502C7.65509 8.64502 7.53509 8.61502 7.42009 8.57002C7.30509 8.52502 7.19759 8.48002 7.09509 8.43252L6.83759 8.28002L6.41009 8.40002L6.17009 8.48502L5.93009 8.58752C5.88509 8.60002 5.85259 8.58502 5.83509 8.54502C5.81759 8.50502 5.82759 8.47502 5.86009 8.45002L6.20259 8.24502L6.57759 8.07502L6.83509 7.99002C6.87009 7.99002 6.89759 7.99502 6.92009 8.00752L7.22759 8.16002C7.31759 8.21752 7.41509 8.26252 7.51759 8.29752C7.62009 8.33252 7.71759 8.35502 7.80759 8.36502H7.82509C7.75759 8.20502 7.72259 8.04002 7.72259 7.87002C7.72259 7.73252 7.74509 7.60252 7.79009 7.47752L7.67009 7.42752C7.55509 7.39252 7.44759 7.34752 7.34509 7.29002L7.02009 7.10252L7.00259 7.06752L6.86509 6.84502C6.83009 6.76502 6.80009 6.68502 6.77009 6.60502C6.74259 6.52502 6.71509 6.44502 6.69259 6.36502L6.64009 6.10752C6.64009 6.06252 6.66009 6.03252 6.70009 6.02252C6.74009 6.01252 6.76509 6.02752 6.77759 6.07502L6.86259 6.29752C6.89759 6.36502 6.93009 6.44002 6.96509 6.52002L7.08509 6.72502L7.20509 6.87752L7.46259 7.03002C7.56509 7.07502 7.66759 7.11502 7.77009 7.15002L7.89009 7.18502C7.94759 7.09502 8.01009 7.00752 8.07759 6.92752C7.90759 6.75752 7.81509 6.51252 7.80509 6.19252C7.82759 5.95252 7.91759 5.74252 8.07759 5.56002L8.02509 5.51002C7.98009 5.47502 7.94259 5.42752 7.91509 5.36502C7.88759 5.30252 7.86759 5.24002 7.85509 5.17752C7.84259 5.11502 7.83259 5.05502 7.82009 4.99752V4.79252C7.82009 4.73502 7.81759 4.68002 7.81259 4.62252C7.80759 4.56502 7.79509 4.51502 7.77759 4.47001C7.76009 4.42501 7.74009 4.38252 7.71759 4.34252C7.69509 4.30252 7.67259 4.26502 7.65009 4.23252C7.59259 4.17502 7.53509 4.13502 7.48009 4.11252L7.41259 4.04502C7.37759 4.01002 7.37759 3.97502 7.41259 3.93502C7.44759 3.89502 7.48009 3.89252 7.51509 3.92752L7.58259 3.96252C7.62759 3.98502 7.69009 4.03751 7.77009 4.11501C7.80509 4.15001 7.83759 4.19252 7.87259 4.24252C7.90759 4.29502 7.93509 4.35002 7.95759 4.41252C7.98009 4.47502 7.99759 4.53752 8.01009 4.60002C8.02009 4.66252 8.02759 4.72752 8.02759 4.79752L8.04509 4.96752C8.04509 5.02502 8.05259 5.07752 8.07009 5.13002C8.08759 5.18002 8.10509 5.22752 8.12259 5.26752C8.14009 5.30752 8.16009 5.33752 8.18259 5.36252L8.25009 5.39752L8.33509 5.33002C8.31259 5.24002 8.30259 5.17002 8.31009 5.12502C8.31509 5.08002 8.32759 5.04502 8.34509 5.02252C8.36259 5.00002 8.39009 4.98752 8.43009 4.98752C8.47009 4.98752 8.49009 5.00752 8.49009 5.04752C8.49009 5.08752 8.47259 5.10752 8.43759 5.10752C8.42509 5.14252 8.42509 5.20002 8.43759 5.27752C8.51759 5.25502 8.59759 5.25502 8.67759 5.27752C8.68759 5.19752 8.68759 5.14002 8.67759 5.10752C8.65509 5.10752 8.64259 5.08752 8.64259 5.04752C8.64259 5.00752 8.66009 4.98752 8.69509 4.98752C8.73009 4.98752 8.75509 5.00002 8.77259 5.02252C8.79009 5.04502 8.80009 5.08002 8.80759 5.12502C8.81259 5.17002 8.81009 5.24002 8.80009 5.33002L8.86759 5.38002L8.88509 5.36252C8.90759 5.34002 8.93009 5.30752 8.95259 5.26752C8.97509 5.22752 8.99259 5.18252 9.00259 5.13002C9.01259 5.07752 9.02509 5.02502 9.03759 4.96752L9.05509 4.79752C9.05509 4.73002 9.06009 4.66502 9.07259 4.60002C9.08259 4.53752 9.10009 4.47502 9.12509 4.41252C9.14759 4.35002 9.17259 4.29252 9.20259 4.24252C9.23009 4.19252 9.26759 4.14751 9.31259 4.11501C9.39259 4.03501 9.45509 3.98502 9.50009 3.96252L9.56759 3.92752C9.60259 3.89252 9.63509 3.89752 9.67009 3.93502C9.70509 3.97502 9.70509 4.01252 9.67009 4.04502L9.58509 4.11252C9.54009 4.13502 9.48759 4.17502 9.43009 4.23252C9.40759 4.26752 9.38509 4.30252 9.36259 4.34252C9.34009 4.38252 9.32009 4.42501 9.30259 4.47001C9.28509 4.51502 9.27509 4.56752 9.26759 4.62252C9.26259 4.68002 9.26009 4.73752 9.26009 4.79252V4.99752C9.24759 5.05502 9.23509 5.11502 9.21759 5.17752C9.20009 5.24002 9.18009 5.30252 9.15759 5.36502C9.13509 5.42752 9.10009 5.47502 9.05509 5.51002L9.02009 5.54502C9.10009 5.63752 9.16759 5.73502 9.22509 5.84502C9.28259 5.95252 9.31009 6.07002 9.31009 6.19502C9.31009 6.51502 9.22509 6.76002 9.05259 6.93002C9.11009 6.99752 9.16009 7.07252 9.20759 7.15252C9.31009 7.11752 9.40759 7.07752 9.49759 7.03252L9.77009 6.88002L9.89009 6.72752L10.0101 6.52252C10.0451 6.44252 10.0776 6.37002 10.1126 6.30002L10.1801 6.07752C10.2026 6.03252 10.2351 6.01502 10.2751 6.02502C10.3151 6.03752 10.3351 6.06502 10.3351 6.11002L10.2826 6.36752C10.2601 6.44752 10.2351 6.52752 10.2051 6.60752C10.1776 6.68752 10.1401 6.76752 10.0951 6.84752L9.97509 7.07002L9.94009 7.12002L9.63259 7.29002C9.53009 7.33502 9.42759 7.38252 9.32509 7.42752C9.37009 7.56502 9.39259 7.71252 9.39259 7.87252C9.39259 8.03252 9.37009 8.18502 9.32509 8.33502L9.46259 8.30002C9.56509 8.26502 9.66259 8.22002 9.75259 8.16252L10.0601 8.01002C10.0826 8.00002 10.1051 7.99252 10.1276 7.99252L10.4001 8.07752L10.7751 8.24752L11.1176 8.45252C11.1526 8.48752 11.1576 8.52002 11.1351 8.55502C11.1126 8.59002 11.0851 8.60002 11.0501 8.59002L10.4526 8.35002L10.1451 8.28252L9.88759 8.43502C9.78509 8.48002 9.67759 8.52752 9.56259 8.57252C9.47009 8.60752 9.38009 8.63502 9.29009 8.65752C9.56259 9.02252 9.72759 9.45502 9.78509 9.95502L9.99009 10.04L10.4001 10.21L10.8276 10.3475C10.8851 10.37 10.9176 10.41 10.9301 10.4675L10.9651 10.6725L11.0326 10.895C11.0676 11.0425 11.1151 11.1875 11.1776 11.33C11.2401 11.4725 11.3101 11.605 11.3901 11.7325C11.4251 11.79 11.4701 11.84 11.5276 11.885L11.6801 12L11.7151 12.0175C11.7476 12.05 11.7551 12.0875 11.7326 12.1275Z" fill="#1B1D22"/>
</svg>

source/_static/images/nav/SolutionsOverview.svg METASEP
<svg width="44" height="44" viewBox="0 0 44 44" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M39.5209 4.47906C36.4102 1.49155 32.82 0 28.7457 0C24.6714 0 21.0811 1.49155 17.9704 4.47906C15.2337 7.27737 13.7422 10.5289 13.4914 14.2291C13.245 17.9294 14.2702 21.3349 16.5713 24.4456L14.2394 26.7775L17.2269 29.765L19.5588 27.4331C22.6695 29.6726 26.0574 30.6846 29.7269 30.4646C33.3963 30.249 36.661 28.7707 39.5209 26.034C42.5084 22.9189 44 19.3286 44 15.2543C44 11.18 42.5084 7.58976 39.5209 4.47906Z" fill="#B3B3B3"/>
<path d="M37.5148 6.43699C35.1828 4.07427 32.2437 2.85991 28.6974 2.79831C25.2128 2.85991 22.2912 4.07427 19.9285 6.43699C17.5658 8.79972 16.3514 11.7256 16.2898 15.2059C16.3514 18.7522 17.5658 21.6913 19.9285 24.0232C22.2912 26.3551 25.2172 27.5827 28.6974 27.7103C32.2437 27.5871 35.1828 26.3595 37.5148 24.0232C39.8467 21.6913 41.0742 18.7522 41.2018 15.2059C41.0786 11.7256 39.8467 8.80412 37.5148 6.43699Z" fill="#F2F2F2"/>
<path d="M37.0966 22.6725C34.5491 25.0968 31.6232 26.3112 28.3277 26.3112C25.0322 26.3112 22.1107 25.0968 19.5588 22.6725C18.1904 21.3041 17.196 19.751 16.5713 18.0086C17.0685 20.3098 18.1904 22.3645 19.9284 24.1684C22.4803 26.5928 25.4194 27.8071 28.7457 27.8071C32.072 27.8071 35.0111 26.5928 37.563 24.1684C39.3053 22.3645 40.4229 20.3142 40.9201 18.0086C41.4217 15.7075 41.2633 13.4328 40.4537 11.1976C40.8893 13.1908 40.8277 15.1927 40.2689 17.2167C39.7101 19.2362 38.6498 21.0533 37.0966 22.6725Z" fill="#999999"/>
<path d="M3.83368 43.805C4.61246 44.0206 5.18444 43.9458 5.55843 43.5718L17.7812 30.3194C18.1552 29.9454 18.3092 29.4659 18.2476 28.8719C18.186 28.2823 17.812 27.6135 17.1301 26.8655C16.3821 26.1836 15.7177 25.792 15.1237 25.6996C14.5341 25.6072 14.0502 25.7788 13.6762 26.2144L0.3358 38.4372C-0.038187 38.8112 -0.0997887 39.3699 0.151003 40.1179C0.401794 40.8659 0.868179 41.6095 1.55016 42.3574C2.29813 43.1054 3.05931 43.585 3.83368 43.805Z" fill="#FFBC1F"/>
<path d="M3.04179 35.9204L7.98723 40.9583L14.0502 34.4245L9.57558 29.9498L3.04179 35.9204Z" fill="#954D0E"/>
</svg>

source/_static/images/nav/Server.svg METASEP
<svg width="41" height="40" viewBox="0 0 41 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M37.6427 0H3.35733C1.54621 0 0.0780029 1.4682 0.0780029 3.27932V8.70661C0.0780029 10.5177 1.54621 11.9859 3.35733 11.9859H37.6427C39.4538 11.9859 40.922 10.5177 40.922 8.70661V3.27932C40.922 1.4682 39.4538 0 37.6427 0Z" fill="#FFBC1F"/>
<path d="M40.922 8.8501C40.9198 9.67676 40.5905 10.469 40.0059 11.0535C39.4214 11.638 38.6292 11.9674 37.8025 11.9695H3.19745C2.37079 11.9674 1.5786 11.638 0.994058 11.0535C0.409515 10.469 0.080167 9.67676 0.0780029 8.8501C0.0780029 8.8501 1.30776 10.416 3.87793 10.4119C6.4481 10.4078 35.4865 10.4119 37.0811 10.4119C38.5147 10.4053 39.8906 9.84587 40.922 8.8501Z" fill="#CC8F00"/>
<path d="M6.75963 7.99753C8.08175 7.99753 9.15354 6.92574 9.15354 5.60362C9.15354 4.28151 8.08175 3.20972 6.75963 3.20972C5.43751 3.20972 4.36572 4.28151 4.36572 5.60362C4.36572 6.92574 5.43751 7.99753 6.75963 7.99753Z" fill="#1E325C"/>
<path d="M26.8209 6.88246C27.5273 6.88246 28.0999 6.30986 28.0999 5.60352C28.0999 4.89718 27.5273 4.32458 26.8209 4.32458C26.1146 4.32458 25.542 4.89718 25.542 5.60352C25.542 6.30986 26.1146 6.88246 26.8209 6.88246Z" fill="white"/>
<path d="M31.1086 6.88246C31.815 6.88246 32.3876 6.30986 32.3876 5.60352C32.3876 4.89718 31.815 4.32458 31.1086 4.32458C30.4023 4.32458 29.8297 4.89718 29.8297 5.60352C29.8297 6.30986 30.4023 6.88246 31.1086 6.88246Z" fill="white"/>
<path d="M35.4005 6.88246C36.1069 6.88246 36.6795 6.30986 36.6795 5.60352C36.6795 4.89718 36.1069 4.32458 35.4005 4.32458C34.6942 4.32458 34.1216 4.89718 34.1216 5.60352C34.1216 6.30986 34.6942 6.88246 35.4005 6.88246Z" fill="white"/>
<path d="M37.6427 13.6625H3.35733C1.54621 13.6625 0.0780029 15.1307 0.0780029 16.9418V22.3691C0.0780029 24.1802 1.54621 25.6484 3.35733 25.6484H37.6427C39.4538 25.6484 40.922 24.1802 40.922 22.3691V16.9418C40.922 15.1307 39.4538 13.6625 37.6427 13.6625Z" fill="#FFBC1F"/>
<path d="M40.922 22.5289C40.9198 23.3556 40.5905 24.1478 40.0059 24.7323C39.4214 25.3169 38.6292 25.6462 37.8025 25.6484H3.19745C2.37079 25.6462 1.5786 25.3169 0.994058 24.7323C0.409515 24.1478 0.080167 23.3556 0.0780029 22.5289C0.0780029 22.5289 1.30776 24.0948 3.87793 24.0907H37.0811C38.5147 24.0841 39.8906 23.5247 40.922 22.5289Z" fill="#CC8F00"/>
<path d="M6.75963 21.6599C8.08175 21.6599 9.15354 20.5881 9.15354 19.266C9.15354 17.9439 8.08175 16.8721 6.75963 16.8721C5.43751 16.8721 4.36572 17.9439 4.36572 19.266C4.36572 20.5881 5.43751 21.6599 6.75963 21.6599Z" fill="#1E325C"/>
<path d="M26.8209 20.5451C27.5273 20.5451 28.0999 19.9725 28.0999 19.2661C28.0999 18.5598 27.5273 17.9872 26.8209 17.9872C26.1146 17.9872 25.542 18.5598 25.542 19.2661C25.542 19.9725 26.1146 20.5451 26.8209 20.5451Z" fill="white"/>
<path d="M31.1086 20.5451C31.815 20.5451 32.3876 19.9725 32.3876 19.2661C32.3876 18.5598 31.815 17.9872 31.1086 17.9872C30.4023 17.9872 29.8297 18.5598 29.8297 19.2661C29.8297 19.9725 30.4023 20.5451 31.1086 20.5451Z" fill="white"/>
<path d="M35.4005 20.5451C36.1069 20.5451 36.6795 19.9725 36.6795 19.2661C36.6795 18.5598 36.1069 17.9872 35.4005 17.9872C34.6942 17.9872 34.1216 18.5598 34.1216 19.2661C34.1216 19.9725 34.6942 20.5451 35.4005 20.5451Z" fill="white"/>
<path d="M37.6427 27.325H3.35733C1.54621 27.325 0.0780029 28.7932 0.0780029 30.6043V36.0316C0.0780029 37.8427 1.54621 39.3109 3.35733 39.3109H37.6427C39.4538 39.3109 40.922 37.8427 40.922 36.0316V30.6043C40.922 28.7932 39.4538 27.325 37.6427 27.325Z" fill="#FFBC1F"/>
<path d="M40.922 36.1914C40.9198 37.0181 40.5905 37.8103 40.0059 38.3948C39.4214 38.9793 38.6292 39.3087 37.8025 39.3109H3.19745C2.37079 39.3087 1.5786 38.9793 0.994058 38.3948C0.409515 37.8103 0.080167 37.0181 0.0780029 36.1914C0.0780029 36.1914 1.30776 37.7573 3.87793 37.7532H37.0811C38.5147 37.7466 39.8906 37.1872 40.922 36.1914Z" fill="#CC8F00"/>
<path d="M6.75963 35.3225C8.08175 35.3225 9.15354 34.2507 9.15354 32.9286C9.15354 31.6065 8.08175 30.5347 6.75963 30.5347C5.43751 30.5347 4.36572 31.6065 4.36572 32.9286C4.36572 34.2507 5.43751 35.3225 6.75963 35.3225Z" fill="#1E325C"/>
<path d="M26.8209 34.2074C27.5273 34.2074 28.0999 33.6348 28.0999 32.9285C28.0999 32.2221 27.5273 31.6495 26.8209 31.6495C26.1146 31.6495 25.542 32.2221 25.542 32.9285C25.542 33.6348 26.1146 34.2074 26.8209 34.2074Z" fill="white"/>
<path d="M31.1086 34.2074C31.815 34.2074 32.3876 33.6348 32.3876 32.9285C32.3876 32.2221 31.815 31.6495 31.1086 31.6495C30.4023 31.6495 29.8297 32.2221 29.8297 32.9285C29.8297 33.6348 30.4023 34.2074 31.1086 34.2074Z" fill="white"/>
<path d="M35.4005 34.2074C36.1069 34.2074 36.6795 33.6348 36.6795 32.9285C36.6795 32.2221 36.1069 31.6495 35.4005 31.6495C34.6942 31.6495 34.1216 32.2221 34.1216 32.9285C34.1216 33.6348 34.6942 34.2074 35.4005 34.2074Z" fill="white"/>
<path d="M34.4125 11.986H6.59155V13.6625H34.4125V11.986Z" fill="#66320A"/>
<path d="M34.4125 25.6484H6.59155V27.325H34.4125V25.6484Z" fill="#66320A"/>
</svg>

source/_static/images/nav/Security.svg METASEP
<svg width="23" height="25" viewBox="0 0 23 25" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 10.8339V22.8833C0 23.7933 0.736431 24.5328 1.6435 24.5328H21.3565C22.2636 24.5328 23 23.7933 23 22.8803V10.8339H0Z" fill="#FFBC1F"/>
<path d="M23 9.18144C23 8.27138 22.2636 7.53195 21.3565 7.53195H1.6435C0.736431 7.53195 0 8.27138 0 9.18144V10.8309H23V9.18144Z" fill="#CC8F00"/>
<path d="M3.97327 8.05891C5.22759 8.05891 6.24243 8.48699 6.24243 9.01686C6.24243 9.54672 5.22759 9.9778 3.97327 9.9778C2.71894 9.9778 1.7041 9.54971 1.7041 9.01686C1.7041 8.48998 2.72193 8.05891 3.97327 8.05891Z" fill="#1B1D22"/>
<path d="M19.025 8.05891C20.2794 8.05891 21.2942 8.48699 21.2942 9.01686C21.2942 9.54672 20.2794 9.9778 19.025 9.9778C17.7707 9.9778 16.7559 9.54971 16.7559 9.01686C16.7559 8.48998 17.7737 8.05891 19.025 8.05891Z" fill="#1B1D22"/>
<path d="M11.4988 0C6.55035 0 2.52393 4.04438 2.52393 9.01978C2.52393 9.31915 3.12864 9.56462 3.97583 9.56462V9.01978C4.26322 4.81374 7.52627 1.48484 11.4988 1.48484C15.4713 1.48484 18.7344 4.81375 19.0248 9.01679V9.56163C19.869 9.56163 20.4767 9.31915 20.4767 9.01679C20.4767 4.04438 16.4503 0 11.4988 0Z" fill="#E0E9EF"/>
<path d="M19.0246 9.01965C18.7372 4.81361 15.4742 1.48471 11.4986 1.48471C7.52609 1.48471 4.26304 4.81361 3.97266 9.01666V9.5615C4.81686 9.5615 5.57424 9.31902 5.57424 9.01666C5.57424 6.29546 7.84042 3.06534 11.4986 3.06534C15.1568 3.06534 17.423 6.29546 17.423 9.01666C17.423 9.31602 18.1804 9.5615 19.0246 9.5615V9.01965Z" fill="#AFBDC6"/>
<path d="M13.2664 21.62L12.5329 16.92C12.967 16.5997 13.2484 16.0848 13.2484 15.504C13.2484 14.5341 12.4641 13.7468 11.5001 13.7468C10.5362 13.7468 9.75185 14.5341 9.75185 15.504C9.75185 16.0848 10.0332 16.5997 10.4673 16.92L9.73389 21.62H13.2664Z" fill="#1B1D22"/>
</svg>

source/_static/images/nav/SecureCollaboration.svg METASEP
<svg width="22" height="24" viewBox="0 0 22 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 10.3629V21.8883C0 22.7588 0.704412 23.4661 1.57204 23.4661H20.428C21.2956 23.4661 22 22.7588 22 21.8854V10.3629H0Z" fill="#FFBC1F"/>
<path d="M22 8.78224C22 7.91174 21.2956 7.20447 20.428 7.20447H1.57204C0.704412 7.20447 0 7.91174 0 8.78224V10.36H22V8.78224Z" fill="#CC8F00"/>
<path d="M3.7999 7.70844C4.99969 7.70844 5.97041 8.11791 5.97041 8.62474C5.97041 9.13158 4.99969 9.54392 3.7999 9.54392C2.60011 9.54392 1.62939 9.13444 1.62939 8.62474C1.62939 8.12077 2.60297 7.70844 3.7999 7.70844Z" fill="#1B1D22"/>
<path d="M18.1974 7.70844C19.3972 7.70844 20.3679 8.11791 20.3679 8.62474C20.3679 9.13158 19.3972 9.54392 18.1974 9.54392C16.9976 9.54392 16.0269 9.13444 16.0269 8.62474C16.0269 8.12077 17.0004 7.70844 18.1974 7.70844Z" fill="#1B1D22"/>
<path d="M10.9986 0C6.2653 0 2.41394 3.86854 2.41394 8.62762C2.41394 8.91397 2.99236 9.14877 3.80272 9.14877V8.62762C4.07761 4.60445 7.19879 1.42028 10.9986 1.42028C14.7984 1.42028 17.9196 4.60445 18.1974 8.62476V9.14591C19.0049 9.14591 19.5861 8.91397 19.5861 8.62476C19.5861 3.86854 15.7348 0 10.9986 0Z" fill="#E0E9EF"/>
<path d="M18.1973 8.62763C17.9224 4.60446 14.8012 1.42029 10.9986 1.42029C7.19874 1.42029 4.07756 4.60446 3.7998 8.62477V9.14592C4.6073 9.14592 5.33176 8.91398 5.33176 8.62477C5.33176 6.02188 7.4994 2.9322 10.9986 2.9322C14.4977 2.9322 16.6653 6.02188 16.6653 8.62477C16.6653 8.91111 17.3898 9.14592 18.1973 9.14592V8.62763Z" fill="#AFBDC6"/>
<path d="M12.6909 20.68L11.9894 16.1843C12.4046 15.8779 12.6737 15.3854 12.6737 14.8299C12.6737 13.9021 11.9235 13.149 11.0015 13.149C10.0794 13.149 9.32919 13.9021 9.32919 14.8299C9.32919 15.3854 9.59836 15.8779 10.0136 16.1843L9.31201 20.68H12.6909Z" fill="#1B1D22"/>
</svg>

source/_static/images/nav/Resources.svg METASEP
<svg width="26" height="23" viewBox="0 0 26 23" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M9.90176 13.7636V22.13L5.84143 22.0804C4.71869 21.9812 3.79435 21.5529 3.06841 20.7931C2.34246 20.0333 1.97949 19.0842 1.97949 17.9457C1.97949 16.8072 2.34246 15.849 3.06841 15.0735C3.79435 14.2979 4.71869 13.8605 5.84143 13.7614H9.90176V13.7636Z" fill="#1788C1"/>
<path d="M5.49418 7.27747V13.7636H2.67382C1.91406 13.6644 1.27829 13.3172 0.76878 12.7243C0.254757 12.1291 0 11.3942 0 10.5194C0 9.64468 0.254757 8.90295 0.766525 8.29198C1.27829 7.68102 1.9118 7.34285 2.67157 7.27747H5.49418Z" fill="#142129"/>
<path d="M10.7426 0V7.27748L7.07906 7.22788C6.18854 7.1625 5.46259 6.79051 4.90123 6.11417C4.33986 5.43782 4.0603 4.60366 4.0603 3.61394C4.0603 2.62422 4.33986 1.79006 4.90123 1.11372C5.46259 0.43737 6.18854 0.0653801 7.07906 0H10.7426V0Z" fill="#CC8F00"/>
<path d="M23.0206 6.08937H23.8615C24.0915 6.12319 24.2245 6.25395 24.2583 6.48616V6.88295C24.2245 7.11516 24.0937 7.24592 23.8615 7.27974H11.1395C10.9073 7.24817 10.7765 7.11516 10.7427 6.88295V0.39679C10.7765 0.133015 10.9073 0 11.1395 0H23.8615C24.0915 0 24.2245 0.133015 24.2583 0.39679V0.743981C24.2245 0.976193 24.0937 1.10695 23.8615 1.14077H23.0206C22.7884 1.17459 22.6576 1.30535 22.6238 1.53756V5.69709C22.6576 5.92479 22.7884 6.05781 23.0206 6.08937Z" fill="#FFBC1F"/>
<path d="M20.049 8.86238V12.0795C20.0806 12.3433 20.2632 12.4921 20.5946 12.5259H23.1196C23.4172 12.5259 23.5818 12.6589 23.6156 12.9227V13.3195C23.5818 13.5833 23.4172 13.7321 23.1196 13.7659H5.39711C4.63735 13.6667 4.0106 13.3195 3.51687 12.7266C3.02089 12.1336 2.77515 11.3987 2.77515 10.5239C2.77515 9.64919 3.02314 8.90747 3.51687 8.2965C4.01286 7.68554 4.63735 7.34736 5.39711 7.28198H23.1196C23.4172 7.28198 23.5818 7.415 23.6156 7.67877V8.07556C23.5818 8.30777 23.4172 8.43853 23.1196 8.47235H20.5946C20.2655 8.49941 20.0828 8.63017 20.049 8.86238Z" fill="#455157"/>
<path d="M22.2291 12.526H5.64284V12.4764C5.14685 12.4764 4.7433 12.278 4.42993 11.8812C4.11655 11.4844 3.95874 10.9997 3.95874 10.4203C3.95874 9.84316 4.1143 9.36521 4.42993 8.9842C4.7433 8.60545 5.14685 8.41382 5.64284 8.41382C5.80742 8.41382 5.95622 8.43185 6.08923 8.46342H22.4275C22.4591 8.49723 22.4591 8.54683 22.4275 8.61221L22.2787 8.71141C22.2449 8.77904 22.2449 8.82639 22.2787 8.86021L22.4275 9.009C22.4591 9.07664 22.4591 9.12398 22.4275 9.1578L22.2787 9.30659C22.2449 9.37423 22.2449 9.42157 22.2787 9.45539L22.4275 9.60419C22.4591 9.638 22.4591 9.6876 22.4275 9.75298L22.2787 9.90178C22.2449 9.93559 22.2449 9.98519 22.2787 10.0506L22.4275 10.1994C22.4591 10.2332 22.4591 10.2828 22.4275 10.3482L22.2787 10.4474C22.2449 10.5127 22.2449 10.5804 22.2787 10.6458L22.4275 10.745C22.4591 10.8126 22.4591 10.878 22.4275 10.9434L22.2787 11.0425C22.2449 11.1079 22.2449 11.1756 22.2787 11.2409L22.4275 11.3401C22.4591 11.4078 22.4591 11.4732 22.4275 11.5385L22.2787 11.6377C22.2449 11.7054 22.2449 11.7707 22.2787 11.8361L22.4275 11.9353C22.4591 12.003 22.4591 12.0683 22.4275 12.1337L22.2787 12.2329C22.2449 12.3005 22.2449 12.3659 22.2787 12.4313L22.4275 12.5305H22.2291V12.526Z" fill="#DBE0E0"/>
<path d="M12.5757 0V7.27748H10.745C9.72151 7.24592 8.8648 6.88069 8.17042 6.18857C7.4783 5.49644 7.1311 4.63748 7.1311 3.61394C7.1311 2.59041 7.4783 1.7337 8.17042 1.03932C8.86255 0.347191 9.71926 0 10.7428 0H12.5757Z" fill="#FFBC1F"/>
<path d="M23.5165 2.07862C23.4489 2.14626 23.4489 2.21164 23.5165 2.27702L23.6157 2.37621C23.6811 2.44159 23.6811 2.50923 23.6157 2.57461L23.5165 2.67381C23.4489 2.74144 23.4489 2.80682 23.5165 2.8722L23.6157 2.9714C23.6811 3.03903 23.6811 3.10441 23.6157 3.16979L23.5165 3.26899C23.4489 3.33662 23.4489 3.38397 23.5165 3.41779L23.6157 3.56658C23.6811 3.63422 23.6811 3.68156 23.6157 3.71538L23.5165 3.86417C23.4489 3.93181 23.4489 3.97915 23.5165 4.01297L23.6157 4.16177C23.6811 4.19558 23.6811 4.24518 23.6157 4.31056L23.5165 4.45936C23.4489 4.49318 23.4489 4.54277 23.5165 4.60815L23.6157 4.75695C23.6811 4.79077 23.6811 4.84037 23.6157 4.90575L23.5165 5.00494C23.4489 5.07258 23.4489 5.13796 23.5165 5.20334L23.6157 5.30254C23.6811 5.37017 23.6811 5.43555 23.6157 5.50093L23.5165 5.60013C23.4489 5.66551 23.4489 5.73314 23.5165 5.79852L23.6157 5.89772C23.6811 5.96536 23.6811 6.03074 23.6157 6.09612H10.941C10.2151 6.09612 9.61987 5.85714 9.1577 5.37919C8.69553 4.90124 8.46558 4.31507 8.46558 3.62069C8.46558 2.92856 8.69553 2.35141 9.1577 1.88699C9.61987 1.42482 10.2128 1.17683 10.941 1.14526H23.6157C23.6811 1.21064 23.6811 1.29406 23.6157 1.39326L23.5165 1.49245C23.4489 1.56009 23.4489 1.62547 23.5165 1.69085L23.6157 1.79005C23.6811 1.85768 23.6811 1.92306 23.6157 1.98844L23.5165 2.07862Z" fill="#DBE0E0"/>
<path d="M23.1693 15.5446V20.2971C23.2008 20.5946 23.3496 20.7592 23.6157 20.793H24.5558C24.8534 20.793 25.0022 20.9418 25.0022 21.2394V21.6362C25.0022 21.9338 24.8534 22.0984 24.5558 22.1322L9.30868 22.0826L8.96149 22.1322C7.77338 22.0984 6.79042 21.6858 6.01488 20.8945C5.23933 20.1032 4.85156 19.1112 4.85156 17.9231C4.85156 16.735 5.23933 15.7543 6.01488 14.9765C6.79042 14.2009 7.77338 13.7974 8.96149 13.7635H9.30868H24.5558C24.8534 13.7974 25.0022 13.9462 25.0022 14.2099V14.6541C25.0022 14.9178 24.8534 15.0666 24.5558 15.1005H23.6157C23.3496 15.132 23.2008 15.2808 23.1693 15.5446Z" fill="#32A4EC"/>
<path d="M24.2085 16.1895C24.1408 16.2571 24.1408 16.3225 24.2085 16.3879L24.3573 16.5367C24.3888 16.6043 24.3888 16.6697 24.3573 16.735L24.2085 16.8342C24.1408 16.9019 24.1408 16.9673 24.2085 17.0326L24.3573 17.1814C24.3888 17.2491 24.3888 17.3144 24.3573 17.3798L24.2085 17.479C24.1408 17.5467 24.1408 17.612 24.2085 17.6774L24.3573 17.8262C24.3888 17.8939 24.3888 17.9592 24.3573 18.0246L24.2085 18.1238C24.1408 18.1914 24.1408 18.2568 24.2085 18.3222L24.3573 18.471C24.3888 18.5386 24.3888 18.604 24.3573 18.6694L24.2085 18.7686C24.1408 18.8362 24.1408 18.9016 24.2085 18.967L24.3573 19.1158C24.3888 19.1834 24.3888 19.2488 24.3573 19.3142L24.2085 19.4134C24.1408 19.481 24.1408 19.5464 24.2085 19.6118L24.3573 19.7606C24.3888 19.8282 24.3888 19.8936 24.3573 19.959L24.2085 20.0582C24.1408 20.1258 24.1408 20.207 24.2085 20.3062L24.3573 20.4054C24.3888 20.4707 24.3888 20.5361 24.3573 20.6037L24.1589 20.8021H9.15752C8.3662 20.7683 7.69661 20.4888 7.15328 19.9612C6.6077 19.4337 6.33716 18.7663 6.33716 17.957C6.33716 17.1476 6.60995 16.4713 7.15328 15.9279C7.69887 15.3824 8.3662 15.1118 9.15752 15.1118H24.2085L24.3573 15.211C24.3888 15.2786 24.3888 15.344 24.3573 15.4094L24.2085 15.5582C24.1408 15.6258 24.1408 15.6912 24.2085 15.7566L24.3573 15.8558C24.3888 15.9234 24.3888 15.9888 24.3573 16.0542L24.2085 16.1895Z" fill="#DBE0E0"/>
</svg>

source/_static/images/nav/ReleaseNotes.svg METASEP
<svg width="25" height="25" viewBox="0 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8.5474 17.9925L8.49491 18.045L8.28786 18.3016C8.08082 18.5408 7.7892 18.8324 7.41302 19.1765L6.84729 19.6897L3.96907 22.2092L0.580525 24.9329C0.408473 25.035 0.253918 25.0087 0.11686 24.8571C-0.0201981 24.7025 -0.0376949 24.5392 0.0643697 24.3701L1.09376 23.0841L4.69227 18.8178L5.82373 17.5318C6.16492 17.1906 6.44195 16.9136 6.64608 16.7094L7.00476 16.4003C7.24389 16.2283 7.50925 16.1524 7.80087 16.1699C8.09248 16.1874 8.3316 16.307 8.52115 16.5286C8.70778 16.7532 8.80402 16.9923 8.80402 17.2489C8.80402 17.5055 8.71945 17.7534 8.5474 17.9925Z" fill="#95A9B2"/>
<path d="M25.0003 9.17707C25.0003 9.46868 24.8983 9.71655 24.6912 9.9236L24.3325 10.2823C23.7493 10.8305 23.0815 11.1046 22.3262 11.1046C21.571 11.1046 20.9032 10.8305 20.3199 10.2823C20.25 10.2152 20.1829 10.2152 20.1129 10.2823L15.8495 14.4961C15.5754 14.8402 15.5579 15.1814 15.797 15.5255C16.3103 16.3128 16.5261 17.1527 16.4386 18.045C16.354 18.9374 15.9837 19.7247 15.3334 20.41L13.6887 22.0547C13.2075 22.5009 12.668 22.7225 12.0702 22.7225C11.4695 22.7225 10.93 22.498 10.4518 22.0547L2.89314 14.5486C2.44697 14.0703 2.22534 13.5279 2.22534 12.9301C2.22534 12.3323 2.44697 11.7899 2.89314 11.3117L4.59032 9.66698C5.27562 8.98169 6.06297 8.6055 6.95531 8.53552C7.84473 8.46845 8.68457 8.69007 9.47485 9.20331C9.81603 9.41036 10.1426 9.37536 10.4518 9.10125L14.7181 4.88452C14.753 4.81745 14.753 4.74746 14.7181 4.67748C14.1698 4.09425 13.8957 3.42646 13.8957 2.67118C13.8957 1.91881 14.1698 1.2481 14.7181 0.664878L15.0272 0.306194C15.2663 0.102065 15.5317 0 15.8233 0C16.1149 0 16.3628 0.102065 16.5698 0.30911L24.6912 8.43054C24.8983 8.63758 25.0003 8.88545 25.0003 9.17707Z" fill="#FFBC1F"/>
<path d="M12.8168 11.2592C12.6447 11.4312 12.4406 11.5158 12.1986 11.5158C11.9594 11.5158 11.7524 11.4312 11.5803 11.2592C11.4083 11.0871 11.3237 10.8917 11.3237 10.6672C11.3237 10.4456 11.4083 10.2298 11.5803 10.0256L14.9747 6.68374C15.1468 6.51169 15.3422 6.42712 15.5667 6.42712C15.7883 6.42712 15.9866 6.51169 16.1587 6.68374C16.3307 6.8558 16.4153 7.05118 16.4153 7.27572C16.4153 7.50026 16.3307 7.69564 16.1587 7.86769L12.8168 11.2592Z" fill="#FFD791"/>
</svg>

source/_static/images/nav/ProductOverview.svg METASEP
<svg width="25" height="25" viewBox="0 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M22.455 2.545C20.6875 0.8475 18.6475 0 16.3325 0C14.0175 0 11.9775 0.8475 10.21 2.545C8.655 4.135 7.8075 5.9825 7.665 8.085C7.525 10.1875 8.1075 12.1225 9.415 13.89L8.09 15.215L9.7875 16.9125L11.1125 15.5875C12.88 16.86 14.805 17.435 16.89 17.31C18.975 17.1875 20.83 16.3475 22.455 14.7925C24.1525 13.0225 25 10.9825 25 8.6675C25 6.3525 24.1525 4.3125 22.455 2.545Z" fill="#B3B3B3"/>
<path d="M21.3152 3.6575C19.9902 2.315 18.3202 1.625 16.3052 1.59C14.3252 1.625 12.6652 2.315 11.3227 3.6575C9.98015 5 9.29015 6.6625 9.25515 8.64C9.29015 10.655 9.98015 12.325 11.3227 13.65C12.6652 14.975 14.3277 15.6725 16.3052 15.745C18.3202 15.675 19.9902 14.9775 21.3152 13.65C22.6402 12.325 23.3377 10.655 23.4102 8.64C23.3402 6.6625 22.6402 5.0025 21.3152 3.6575Z" fill="#F2F2F2"/>
<path d="M21.0774 12.8825C19.6299 14.26 17.9674 14.95 16.0949 14.95C14.2224 14.95 12.5624 14.26 11.1124 12.8825C10.3349 12.105 9.76987 11.2225 9.41487 10.2325C9.69737 11.54 10.3349 12.7075 11.3224 13.7325C12.7724 15.11 14.4424 15.8 16.3324 15.8C18.2224 15.8 19.8924 15.11 21.3424 13.7325C22.3324 12.7075 22.9674 11.5425 23.2499 10.2325C23.5349 8.925 23.4449 7.6325 22.9849 6.3625C23.2324 7.495 23.1974 8.6325 22.8799 9.7825C22.5624 10.93 21.9599 11.9625 21.0774 12.8825Z" fill="#999999"/>
<path d="M2.17751 24.89C2.62001 25.0125 2.94501 24.97 3.15751 24.7575L10.1025 17.2275C10.315 17.015 10.4025 16.7425 10.3675 16.405C10.3325 16.07 10.12 15.69 9.73251 15.265C9.30751 14.8775 8.93001 14.655 8.59251 14.6025C8.25751 14.55 7.98251 14.6475 7.77001 14.895L0.190013 21.84C-0.0224876 22.0525 -0.0574884 22.37 0.0850115 22.795C0.227511 23.22 0.492511 23.6425 0.880011 24.0675C1.30501 24.4925 1.73751 24.765 2.17751 24.89Z" fill="#FFBC1F"/>
<path d="M1.72742 20.41L4.53742 23.2725L7.98242 19.56L5.43992 17.0175L1.72742 20.41Z" fill="#954D0E"/>
</svg>

source/_static/images/nav/MediaEntertainment.svg METASEP
<svg width="28" height="25" viewBox="0 0 28 25" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M14.5929 6.99808C14.5571 7.3256 14.3754 7.50983 14.0454 7.54565C13.7179 7.50983 13.5336 7.32816 13.4978 6.99808C13.4978 6.01298 13.7153 5.23001 14.1528 4.64662C14.5904 4.06324 15.0816 3.55405 15.6292 3.11651C16.0668 2.75318 16.4403 2.36937 16.7499 1.96765C17.0595 1.56593 17.2156 1.07466 17.2156 0.491273C17.2514 0.163758 17.4433 0 17.7913 0C18.1367 0 18.3287 0.163758 18.3645 0.491273C18.3287 1.33053 18.1086 2.02138 17.7094 2.56895C17.3077 3.11651 16.8625 3.57964 16.3712 3.96345C15.88 4.34725 15.4603 4.76433 15.1149 5.21978C14.7644 5.67779 14.5929 6.26885 14.5929 6.99808Z" fill="#5A7B90"/>
<path d="M27.9033 15.9101C27.9928 17.7319 28.021 19.7558 27.9852 21.9793C27.8393 23.3636 27.1843 24.2029 26.0175 24.4945C24.8507 24.7862 23.8477 24.3845 23.011 23.292L21.7547 21.4881C21.1355 20.613 20.46 19.6125 19.7307 18.4816C19.3649 18.5916 19.0015 18.6632 18.6382 18.6991C17.4356 18.589 16.6066 18.2334 16.1511 17.6321C15.6957 17.0308 15.102 16.693 14.3754 16.6214H14.099C13.3698 16.6956 12.7787 17.0308 12.3233 17.6321C11.8678 18.2334 11.0388 18.589 9.8362 18.6991C9.28864 18.6632 8.79737 18.5353 8.35983 18.3153C7.59477 19.482 6.90136 20.503 6.28215 21.378L4.96953 23.292C4.13027 24.3845 3.12982 24.7965 1.96304 24.5227C0.79627 24.2489 0.15915 23.402 0.0491256 21.9793C-0.0250771 19.7558 -0.0148423 17.7319 0.0772714 15.9101C0.166826 14.0883 0.578779 12.2665 1.30801 10.4421L1.58179 9.73077C1.94513 8.74567 2.53875 7.95502 3.35754 7.35373C4.17633 6.75243 5.13329 6.4505 6.22842 6.4505H21.7547C22.9215 6.4505 23.9219 6.78825 24.7612 7.46119C25.5979 8.13669 26.1634 8.98363 26.455 10.0046C26.5267 10.1504 26.583 10.2962 26.6188 10.4421C27.3839 12.2639 27.8137 14.0857 27.9033 15.9101Z" fill="#2B3B47"/>
<path d="M9.37052 8.61006C10.1177 9.3572 10.4912 10.3065 10.4912 11.4528C10.4912 12.6016 10.1177 13.5586 9.37052 14.3237C8.62338 15.0887 7.67666 15.4725 6.52779 15.4725C5.37893 15.4725 4.42197 15.0887 3.65692 14.3237C2.89186 13.5586 2.50806 12.6016 2.50806 11.4528C2.50806 10.3039 2.89186 9.3572 3.65692 8.61006C4.42197 7.86291 5.3687 7.47143 6.49965 7.43561C7.66642 7.47143 8.62338 7.86291 9.37052 8.61006ZM24.5411 8.61006C23.7761 7.86291 22.8191 7.48934 21.6703 7.48934C20.5214 7.48934 19.5644 7.86291 18.7994 8.61006C18.0343 9.3572 17.6505 10.3039 17.6505 11.4528C17.6505 12.6016 18.0343 13.5586 18.7994 14.3237C19.5644 15.0887 20.5214 15.4725 21.6703 15.4725C22.8191 15.4725 23.7761 15.0887 24.5411 14.3237C25.3062 13.5586 25.7079 12.6119 25.7437 11.4809C25.7079 10.3142 25.3062 9.3572 24.5411 8.61006Z" fill="#142129"/>
<path d="M21.0153 12.7654C21.2149 12.5658 21.4605 12.4635 21.7522 12.4635C22.0439 12.4635 22.2998 12.5633 22.5173 12.7654C22.7348 12.965 22.8448 13.2209 22.8448 13.5305C22.8448 13.8401 22.7348 14.096 22.5173 14.2955C22.2998 14.4951 22.0439 14.5949 21.7522 14.5949C21.4605 14.5949 21.2149 14.4951 21.0153 14.2955C20.8157 14.096 20.6955 13.8503 20.6597 13.5586C20.6955 13.2311 20.8157 12.965 21.0153 12.7654Z" fill="#32A4EC"/>
<path d="M21.0153 8.72015C21.2149 8.52057 21.4605 8.42078 21.7522 8.42078C22.0439 8.42078 22.2998 8.52057 22.5173 8.72015C22.7348 8.91973 22.8448 9.1756 22.8448 9.4852C22.8448 9.79481 22.7348 10.0507 22.5173 10.2503C22.2998 10.4498 22.0439 10.5496 21.7522 10.5496C21.4605 10.5496 21.2149 10.4498 21.0153 10.2503C20.8157 10.0507 20.6955 9.80504 20.6597 9.51335C20.6955 9.18583 20.8157 8.91973 21.0153 8.72015Z" fill="#FFBC1F"/>
<path d="M18.9938 10.7415C19.1934 10.5419 19.4493 10.4396 19.7589 10.4396C20.0685 10.4396 20.3244 10.5394 20.524 10.7415C20.7235 10.9411 20.8259 11.197 20.8259 11.5066C20.8259 11.8162 20.7261 12.072 20.524 12.2716C20.3244 12.4712 20.0685 12.571 19.7589 12.571C19.4493 12.571 19.1934 12.4712 18.9938 12.2716C18.7943 12.072 18.674 11.8264 18.6382 11.5347C18.674 11.2072 18.7917 10.9436 18.9938 10.7415Z" fill="#C43133"/>
<path d="M23.039 10.7415C23.2386 10.5419 23.4842 10.4396 23.7759 10.4396C24.0676 10.4396 24.3235 10.5394 24.541 10.7415C24.7585 10.9411 24.8685 11.197 24.8685 11.5066C24.8685 11.8162 24.7585 12.072 24.541 12.2716C24.3235 12.4712 24.0676 12.571 23.7759 12.571C23.4842 12.571 23.2386 12.4712 23.039 12.2716C22.8394 12.072 22.7192 11.8264 22.6833 11.5347C22.7192 11.2072 22.8369 10.9436 23.039 10.7415Z" fill="#339970"/>
<path d="M5.18957 10.6059L5.62711 11.0971C5.77296 11.3146 5.77296 11.5347 5.62711 11.7522L5.18957 12.2434C5.11537 12.3176 5.04373 12.3535 4.97208 12.3535H3.54944C3.33195 12.3535 3.22192 12.2255 3.22192 11.9696V10.9308C3.22192 10.6775 3.33195 10.5291 3.54944 10.4933H4.97208C5.04117 10.4958 5.11537 10.5342 5.18957 10.6059ZM7.32098 10.222L6.82971 10.6596C6.61222 10.8054 6.39217 10.8054 6.17468 10.6596L5.68341 10.222C5.6092 10.1504 5.57338 10.0762 5.57338 10.0046V8.58447C5.6092 8.36698 5.75505 8.25696 6.01092 8.25696H6.99603C7.24934 8.25696 7.39774 8.36698 7.43357 8.58447V10.0046C7.43101 10.0788 7.39263 10.1504 7.32098 10.222ZM5.68085 12.7373L6.17212 12.2997C6.38961 12.1539 6.60966 12.1539 6.82715 12.2997L7.31842 12.7373C7.39007 12.7731 7.42845 12.8473 7.42845 12.9548V14.3774C7.39263 14.5591 7.24678 14.6691 6.99091 14.7049H6.0058C5.74993 14.6691 5.60409 14.5591 5.56826 14.3774V12.9548C5.57082 12.8473 5.60664 12.7756 5.68085 12.7373ZM7.81226 12.356L7.37472 11.8085C7.22887 11.6268 7.22887 11.4246 7.37472 11.2072L7.81226 10.7159C7.8839 10.6442 7.9581 10.6059 8.02975 10.6059H9.50612C9.68779 10.6059 9.77991 10.7338 9.77991 10.9897V12.0285C9.77991 12.2844 9.68779 12.4302 9.50612 12.466H8.02975C7.9581 12.4635 7.88646 12.4277 7.81226 12.356ZM11.1744 14.2136C11.5198 14.5795 11.6938 15.0248 11.6938 15.5518C11.6938 16.0815 11.5198 16.519 11.1744 16.8645C10.8264 17.2125 10.3914 17.3839 9.86178 17.3839C9.33213 17.3839 8.88692 17.2125 8.52358 16.8645C8.15768 16.519 7.97601 16.0815 7.97601 15.5518C7.97601 15.0248 8.15768 14.577 8.52358 14.2136C8.88692 13.8503 9.32445 13.6661 9.8362 13.6661C10.3812 13.6686 10.829 13.8503 11.1744 14.2136ZM13.4977 12.9573C13.4977 12.704 13.3698 12.5556 13.1139 12.5198H11.7476C11.4917 12.5556 11.3637 12.7014 11.3637 12.9573C11.3637 13.2132 11.4917 13.359 11.7476 13.3949H13.1139C13.3698 13.359 13.4977 13.2132 13.4977 12.9573ZM16.6142 13.3949H15.2479C14.992 13.359 14.8641 13.2132 14.8641 12.9573C14.8641 12.704 14.992 12.5556 15.2479 12.5198H16.6142C16.8675 12.5556 16.998 12.7014 16.998 12.9573C16.998 13.2132 16.8701 13.359 16.6142 13.3949ZM19.5388 14.2136C19.8843 14.5795 20.0583 15.0248 20.0583 15.5518C20.0583 16.0815 19.8843 16.519 19.5388 16.8645C19.1909 17.2125 18.7559 17.3839 18.2262 17.3839C17.6966 17.3839 17.2513 17.2125 16.888 16.8645C16.5221 16.519 16.3404 16.0815 16.3404 15.5518C16.3404 15.0248 16.5221 14.577 16.888 14.2136C17.2513 13.8503 17.6889 13.6661 18.2006 13.6661C18.7456 13.6686 19.1934 13.8503 19.5388 14.2136Z" fill="#5A7B90"/>
</svg>

source/_static/images/nav/Legal.svg METASEP
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1.6752 15.3336H8.82141L5.24967 6.23619L1.6752 15.3336ZM10.0621 16.1862H0.437256L5.24967 3.93793L10.0621 16.1862Z" fill="#CFCFCF"/>
<path d="M19.1759 15.3336H26.3221L22.7504 6.23619L19.1759 15.3336ZM27.5601 16.1862H17.938L22.7504 3.93793L27.5601 16.1862Z" fill="#CFCFCF"/>
<path d="M22.537 3.85321C22.537 3.85321 21.5313 3.46515 20.9656 3.23287C18.9598 2.4103 16.4702 1.38824 13.9998 1.38824C11.5294 1.38824 9.03709 2.4103 7.03397 3.23287C6.46828 3.46515 5.46262 3.85321 5.46262 3.85321L3.92407 5.04196C3.92407 5.04196 5.16475 5.82627 5.80969 5.59398C6.30705 5.41635 6.85087 5.19227 7.42476 4.95725C9.34316 4.17021 11.7289 3.18914 13.9998 3.18914C16.2707 3.18914 18.6592 4.17021 20.5749 4.95725C21.1487 5.195 21.6926 5.41635 22.1899 5.59398C22.8349 5.829 24.0755 5.04196 24.0755 5.04196L22.537 3.85321Z" fill="#B7C1C4"/>
<path d="M0 15.3117C0 18.2112 2.35019 20.5614 5.24966 20.5614C8.14913 20.5614 10.4993 18.2112 10.4993 15.3117H0Z" fill="#FFBC1F"/>
<path d="M17.498 15.3117C17.498 18.2112 19.8482 20.5614 22.7477 20.5614C25.6472 20.5614 27.9974 18.2112 27.9974 15.3117H17.498Z" fill="#FFBC1F"/>
<path d="M14.8745 4.81244H13.1255V24.0621H14.8745V4.81244Z" fill="#B7C1C4"/>
<path d="M15.4101 7.77203H12.5872V24.0621H15.4101V7.77203Z" fill="#CFCFCF"/>
<path d="M15.995 16.1862H12.0051V25.3711H15.995V16.1862Z" fill="#B7C1C4"/>
<path d="M5.24971 3.50067C6.21711 3.50067 6.99868 4.28498 6.99868 5.24965C6.99868 6.21705 6.21438 6.99862 5.24971 6.99862C4.28231 6.99862 3.50073 6.21431 3.50073 5.24965C3.50073 4.28224 4.28231 3.50067 5.24971 3.50067Z" fill="#DAB471"/>
<path d="M22.7502 3.50067C23.7176 3.50067 24.4992 4.28498 24.4992 5.24965C24.4992 6.21705 23.7149 6.99862 22.7502 6.99862C21.7828 6.99862 21.0012 6.21431 21.0012 5.24965C20.9985 4.28224 21.7828 3.50067 22.7502 3.50067Z" fill="#555B60"/>
<path d="M5.24971 3.50067C6.21711 3.50067 6.99868 4.28498 6.99868 5.24965C6.99868 6.21705 6.21438 6.99862 5.24971 6.99862C4.28231 6.99862 3.50073 6.21431 3.50073 5.24965C3.50073 4.28224 4.28231 3.50067 5.24971 3.50067Z" fill="#555B60"/>
<path d="M14 0C15.4483 0 16.6234 1.17509 16.6234 2.62346C16.6234 4.07183 15.4483 5.24966 14 5.24966C12.5516 5.24966 11.3738 4.07457 11.3738 2.62346C11.3738 1.17509 12.5489 0 14 0Z" fill="#CFCFCF"/>
<path d="M13.9999 20.1241C10.133 20.1241 7.00122 22.0835 7.00122 24.4993H21.0012C20.9985 22.0835 17.864 20.1241 13.9999 20.1241Z" fill="#CFCFCF"/>
<path d="M21.8732 24.4993H6.12427V26.2483H21.8732V24.4993Z" fill="#555B60"/>
<path d="M23.6249 26.2483H4.37524V27.9973H23.6249V26.2483Z" fill="#6A767C"/>
</svg>

source/_static/images/nav/Integrations.svg METASEP
<svg width="28" height="26" viewBox="0 0 28 26" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M24.9282 6.54378C24.6203 6.5277 24.3997 6.78044 24.4411 7.10212L24.7352 9.44115C24.7766 9.76283 25.05 9.95353 25.3441 9.86163L27.5315 9.18841C27.8256 9.0988 28.0347 8.76104 27.9933 8.43937L27.8463 7.26985C27.8049 6.94817 27.52 6.67245 27.2121 6.65867L24.9282 6.54378Z" fill="#546266"/>
<path d="M24.9166 11.4218C24.7098 11.192 24.3767 11.215 24.1768 11.4723L22.7292 13.3334C22.5293 13.5885 22.5914 13.917 22.8625 14.0618L24.8868 15.1325C25.1602 15.2773 25.5439 15.1854 25.7438 14.9303L26.4676 13.9997C26.6675 13.7447 26.6606 13.3472 26.4538 13.1197L24.9166 11.4218Z" fill="#546266"/>
<path d="M21.4563 14.8614C21.4724 14.5535 21.2196 14.3352 20.898 14.3743L18.5589 14.6661C18.2373 14.7074 18.0489 14.9809 18.1385 15.275L18.8117 17.4623C18.9036 17.7565 19.239 17.9655 19.5607 17.9242L20.7302 17.7771C21.0519 17.7381 21.3276 17.4532 21.3414 17.1453L21.4563 14.8614Z" fill="#546266"/>
<path d="M16.5783 14.8476C16.8058 14.6408 16.7851 14.3076 16.5278 14.11L14.6667 12.6625C14.4093 12.4626 14.0831 12.5246 13.9383 12.7958L12.8676 14.8177C12.7228 15.0912 12.8147 15.4772 13.0698 15.6748L14.0003 16.3985C14.2554 16.5984 14.6529 16.5915 14.8803 16.3847L16.5783 14.8476Z" fill="#546266"/>
<path d="M13.1387 11.3896C13.4466 11.4057 13.6649 11.1529 13.6258 10.8313L13.3317 8.49222C13.2904 8.17055 13.017 7.98214 12.7229 8.07175L10.5355 8.74497C10.2414 8.83458 10.0323 9.17233 10.0736 9.49401L10.2207 10.6635C10.2621 10.9852 10.547 11.2609 10.8548 11.2747L13.1387 11.3896Z" fill="#546266"/>
<path d="M13.15 6.51162C13.3568 6.73909 13.69 6.71842 13.8876 6.46108L15.3351 4.59996C15.535 4.34491 15.473 4.01635 15.2018 3.87159L13.1776 2.80087C12.9042 2.65612 12.5181 2.74803 12.3205 3.00307L11.5968 3.93363C11.3969 4.18867 11.4038 4.58617 11.6106 4.81364L13.15 6.51162Z" fill="#546266"/>
<path d="M16.6105 3.072C16.5944 3.37989 16.8472 3.59817 17.1689 3.55911L19.5079 3.265C19.8296 3.22364 20.018 2.95022 19.9284 2.65612L19.2552 0.468731C19.1655 0.174628 18.8278 -0.0344602 18.5061 0.00689797L17.3366 0.153949C17.0149 0.19301 16.7392 0.480219 16.7254 0.788108L16.6105 3.072Z" fill="#546266"/>
<path d="M21.4886 3.08348C21.2612 3.29027 21.2819 3.62344 21.5392 3.82104L23.4003 5.26857C23.6554 5.46617 23.9839 5.40644 24.1287 5.13531L25.1994 3.11335C25.3441 2.83993 25.2522 2.45392 24.9972 2.25632L24.0666 1.53255C23.8116 1.33265 23.4141 1.33955 23.1866 1.54864L21.4886 3.08348Z" fill="#546266"/>
<path d="M17.8304 13.3472C20.2499 14.0112 22.7497 12.589 23.4161 10.1695C24.0801 7.75006 22.6578 5.25019 20.2384 4.58387C17.8189 3.91984 15.3191 5.3421 14.6527 7.76155C13.9864 10.1833 15.411 12.6832 17.8304 13.3472ZM20.9438 2.00817C24.7878 3.0628 27.0464 7.03549 25.9918 10.8772C24.9371 14.7189 20.9644 16.9798 17.1227 15.9229C13.281 14.8683 11.0201 10.8956 12.0747 7.05387C13.1294 3.21215 17.1021 0.953537 20.9438 2.00817Z" fill="#546266"/>
<path d="M18.4674 11.0289C19.607 11.3413 20.7834 10.6727 21.0959 9.53307C21.4084 8.39342 20.7398 7.21701 19.6001 6.90453C18.4605 6.59204 17.2841 7.26067 16.9716 8.40031C16.6591 9.53766 17.3277 10.7164 18.4674 11.0289ZM20.5192 3.55451C23.5085 4.37478 25.2662 7.46516 24.4459 10.4521C23.6257 13.4414 20.5353 15.1991 17.546 14.3789C14.5567 13.5586 12.799 10.4682 13.6216 7.48124C14.4441 4.49426 17.5299 2.73424 20.5192 3.55451Z" fill="#AABBC1"/>
<path d="M18.467 11.0289C19.6066 11.3413 20.783 10.6727 21.0955 9.53307C21.408 8.39342 20.7394 7.21701 19.5997 6.90453C18.4601 6.59204 17.2837 7.26067 16.9712 8.40031C16.6587 9.53766 17.3273 10.7164 18.467 11.0289ZM20.165 4.84351C22.442 5.46848 23.7815 7.8213 23.1565 10.1006C22.5316 12.3776 20.1787 13.7171 17.8994 13.0922C15.6224 12.4649 14.2852 10.1098 14.9102 7.83279C15.5351 5.55579 17.888 4.21854 20.165 4.84351Z" fill="#546266"/>
<path d="M12.1461 16.5915C11.914 16.5801 11.7509 16.7685 11.7807 17.0097L12.0013 18.7651C12.0312 19.0064 12.238 19.1488 12.4586 19.0799L14.0991 18.5744C14.3197 18.5055 14.4759 18.2528 14.446 18.0115L14.3358 17.1338C14.3059 16.8925 14.0922 16.6857 13.8601 16.6743L12.1461 16.5915Z" fill="#546266"/>
<path d="M12.1368 20.2494C11.9805 20.0771 11.7324 20.0955 11.583 20.2862L10.4985 21.6832C10.3492 21.8762 10.3951 22.122 10.5996 22.23L12.1161 23.0342C12.3206 23.1422 12.6101 23.0733 12.7595 22.8826L13.3017 22.1841C13.4511 21.9911 13.4465 21.6947 13.2902 21.5223L12.1368 20.2494Z" fill="#546266"/>
<path d="M9.54296 22.8297C9.55445 22.5977 9.36604 22.4345 9.12478 22.4644L7.36936 22.685C7.12811 22.7148 6.98565 22.9216 7.05458 23.1422L7.56007 24.7827C7.629 25.0033 7.88174 25.1596 8.123 25.1297L9.00071 25.0194C9.24196 24.9895 9.44875 24.7759 9.46024 24.5438L9.54296 22.8297Z" fill="#546266"/>
<path d="M5.88244 22.8205C6.05476 22.6643 6.03638 22.4162 5.84567 22.2668L4.44869 21.1823C4.25568 21.0329 4.00983 21.0789 3.90184 21.2834L3.09765 22.7999C2.98966 23.0044 3.05859 23.2939 3.2493 23.4432L3.94779 23.9855C4.1408 24.1348 4.4372 24.1302 4.60952 23.974L5.88244 22.8205Z" fill="#546266"/>
<path d="M3.30208 20.2265C3.53185 20.2379 3.69728 20.0495 3.66741 19.8083L3.44683 18.0529C3.41696 17.8116 3.21017 17.6691 2.9896 17.7381L1.34905 18.2436C1.12847 18.3102 0.972231 18.5652 1.0021 18.8065L1.11239 19.6842C1.14226 19.9255 1.35594 20.1323 1.58801 20.1437L3.30208 20.2265Z" fill="#546266"/>
<path d="M3.31396 16.5663C3.47021 16.7386 3.71836 16.7202 3.86771 16.5295L4.95221 15.1325C5.10156 14.9395 5.0556 14.696 4.85111 14.5857L3.33464 13.7815C3.13015 13.6735 2.84064 13.7424 2.69129 13.9331L2.14904 14.6316C1.99969 14.8223 2.00429 15.121 2.16053 15.2911L3.31396 16.5663Z" fill="#546266"/>
<path d="M5.90536 13.986C5.89388 14.218 6.08229 14.3812 6.32354 14.3513L8.07897 14.1307C8.32023 14.1009 8.46268 13.8941 8.39375 13.6735L7.88826 12.0329C7.81933 11.8124 7.56659 11.6561 7.32533 11.686L6.44762 11.7963C6.20636 11.8262 5.99957 12.0398 5.98808 12.2719L5.90536 13.986Z" fill="#546266"/>
<path d="M9.5658 13.9975C9.39347 14.1537 9.41185 14.4019 9.60256 14.5512L10.9995 15.6357C11.1926 15.7851 11.4361 15.7391 11.5464 15.5346L12.3483 14.0181C12.4563 13.8137 12.3873 13.5241 12.1966 13.3748L11.4981 12.8325C11.3051 12.6832 11.0087 12.6878 10.8387 12.844L9.5658 13.9975Z" fill="#546266"/>
<path d="M6.8225 21.6947C8.63767 22.1933 10.5126 21.1249 11.0112 19.312C11.5098 17.4968 10.4436 15.6219 8.62848 15.1233C6.81331 14.6247 4.93841 15.6931 4.43981 17.506C3.93892 19.3189 5.00734 21.1961 6.8225 21.6947ZM9.15694 13.1887C12.0382 13.9814 13.7339 16.9592 12.9412 19.8404C12.1485 22.7217 9.17073 24.4174 6.28944 23.6247C3.40815 22.832 1.71247 19.8542 2.50517 16.9729C3.29787 14.0917 6.27565 12.3983 9.15694 13.1887Z" fill="#546266"/>
<path d="M7.30029 19.953C8.15502 20.1874 9.03733 19.6865 9.27169 18.8318C9.50605 17.977 9.00516 17.0947 8.15043 16.8604C7.29569 16.626 6.41338 17.1269 6.17902 17.9816C5.94236 18.8364 6.44555 19.7187 7.30029 19.953ZM8.83973 14.349C11.0823 14.9648 12.3988 17.2808 11.7831 19.5234C11.1673 21.7659 8.85122 23.0825 6.60869 22.4667C4.36615 21.8509 3.04958 19.5349 3.66536 17.2923C4.28114 15.0521 6.5972 13.7332 8.83973 14.349Z" fill="#AABBC1"/>
<path d="M7.30052 19.953C8.15525 20.1874 9.03756 19.6865 9.27192 18.8318C9.50628 17.977 9.00539 17.0947 8.15066 16.8604C7.29592 16.626 6.41361 17.1269 6.17925 17.9816C5.94259 18.8364 6.44578 19.7187 7.30052 19.953ZM8.57343 15.3163C10.2806 15.7851 11.2847 17.5497 10.816 19.2591C10.3472 20.9663 8.58262 21.9704 6.87315 21.5017C5.16598 21.033 4.16189 19.2683 4.63062 17.5589C5.10164 15.8494 6.86626 14.8453 8.57343 15.3163Z" fill="#546266"/>
</svg>

source/_static/images/nav/Integrate.svg METASEP
<svg width="51" height="47" viewBox="0 0 51 47" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_883:726)">
<path d="M5.74457 12.2377C6.32036 12.2076 6.73287 12.6803 6.65553 13.2818L6.10552 17.6561C6.02817 18.2577 5.51683 18.6144 4.96683 18.4425L0.876133 17.1835C0.326124 17.0159 -0.0648984 16.3842 0.0124467 15.7827L0.287451 13.5955C0.364796 12.994 0.897618 12.4783 1.47341 12.4525L5.74457 12.2377Z" fill="#546266"/>
<path d="M5.76547 21.3601C6.1522 20.9304 6.77525 20.9734 7.14909 21.4547L9.85616 24.9352C10.23 25.4121 10.114 26.0266 9.60694 26.2973L5.82133 28.2997C5.30999 28.5704 4.5924 28.3985 4.21857 27.9216L2.86503 26.1813C2.4912 25.7043 2.50409 24.961 2.89081 24.5356L5.76547 21.3601Z" fill="#546266"/>
<path d="M12.2374 27.7926C12.2074 27.2168 12.68 26.8086 13.2816 26.8816L17.6559 27.4273C18.2575 27.5047 18.6098 28.016 18.4422 28.566L17.1832 32.6567C17.0114 33.2067 16.384 33.5978 15.7824 33.5204L13.5953 33.2454C12.9937 33.1724 12.4781 32.6395 12.4523 32.0637L12.2374 27.7926Z" fill="#546266"/>
<path d="M21.3593 27.7668C20.9339 27.38 20.9725 26.757 21.4538 26.3875L24.9343 23.6804C25.4156 23.3065 26.0257 23.4226 26.2964 23.9296L28.2988 27.7109C28.5695 28.2222 28.3977 28.9441 27.9207 29.3137L26.1804 30.6672C25.7035 31.041 24.9601 31.0282 24.5347 30.6414L21.3593 27.7668Z" fill="#546266"/>
<path d="M27.792 21.3C27.2162 21.3301 26.808 20.8574 26.881 20.2558L27.431 15.8815C27.5084 15.28 28.0197 14.9276 28.5697 15.0952L32.6604 16.3542C33.2104 16.5218 33.6014 17.1534 33.5241 17.755L33.2491 19.9421C33.1717 20.5437 32.6389 21.0593 32.0631 21.0851L27.792 21.3Z" fill="#546266"/>
<path d="M27.7705 12.1775C27.3838 12.6029 26.7608 12.5642 26.3912 12.083L23.6842 8.60244C23.3103 8.12547 23.4263 7.51101 23.9334 7.2403L27.719 5.23792C28.2303 4.96722 28.9522 5.13909 29.3217 5.61606L30.6753 7.35632C31.0491 7.83328 31.0362 8.57665 30.6495 9.00205L27.7705 12.1775Z" fill="#546266"/>
<path d="M21.2997 5.74494C21.3298 6.32073 20.8571 6.72894 20.2556 6.65589L15.8813 6.10588C15.2797 6.02854 14.9274 5.5172 15.0949 4.96719L16.3539 0.876499C16.5215 0.32649 17.1532 -0.0645321 17.7548 0.0128129L19.9419 0.287817C20.5435 0.360866 21.0591 0.897984 21.0849 1.47377L21.2997 5.74494Z" fill="#546266"/>
<path d="M12.1766 5.76644C12.602 6.15316 12.5634 6.77622 12.0821 7.14576L8.60158 9.85283C8.12462 10.2224 7.51015 10.1106 7.23945 9.60361L5.23707 5.8223C4.96636 5.31096 5.13824 4.58908 5.6152 4.21954L7.35546 2.866C7.83243 2.49217 8.5758 2.50506 9.00119 2.89608L12.1766 5.76644Z" fill="#546266"/>
<path d="M19.0172 24.961C14.4925 26.2028 9.81741 23.543 8.57129 19.0183C7.32947 14.4936 9.98928 9.81852 14.514 8.57241C19.0386 7.33059 23.7137 9.9904 24.9598 14.5151C26.206 19.0441 23.5418 23.7191 19.0172 24.961ZM13.1948 3.75553C6.00601 5.72783 1.78212 13.1573 3.75441 20.3417C5.72671 27.5262 13.1561 31.7544 20.3406 29.7778C27.5251 27.8055 31.7533 20.3761 29.781 13.1916C27.8087 6.00713 20.3793 1.78323 13.1948 3.75553Z" fill="#546266"/>
<path d="M17.8271 20.6253C15.6958 21.2097 13.4958 19.9593 12.9114 17.828C12.327 15.6967 13.5774 13.4967 15.7087 12.9123C17.84 12.3279 20.04 13.5783 20.6244 15.7096C21.2088 17.8366 19.9584 20.0409 17.8271 20.6253ZM13.9899 6.64735C8.39958 8.18137 5.11242 13.9608 6.64643 19.5468C8.18044 25.1371 13.9598 28.4243 19.5502 26.8903C25.1405 25.3563 28.4276 19.5769 26.8893 13.9908C25.351 8.40481 19.5802 5.11334 13.9899 6.64735Z" fill="#AABBC1"/>
<path d="M17.8275 20.6253C15.6962 21.2097 13.4961 19.9593 12.9117 17.828C12.3274 15.6967 13.5778 13.4967 15.7091 12.9123C17.8403 12.3279 20.0404 13.5783 20.6248 15.7096C21.2091 17.8366 19.9587 20.0409 17.8275 20.6253ZM14.652 9.05795C10.3937 10.2267 7.88862 14.6268 9.05738 18.8894C10.2262 23.1476 14.6262 25.6528 18.8888 24.484C23.1471 23.3109 25.6479 18.9066 24.4791 14.6483C23.3104 10.39 18.9103 7.88918 14.652 9.05795Z" fill="#546266"/>
<path d="M29.6484 31.0283C30.0824 31.0068 30.3875 31.3591 30.3316 31.8103L29.9191 35.0932C29.8633 35.5444 29.4766 35.8108 29.064 35.6819L25.996 34.7365C25.5835 34.6076 25.2913 34.135 25.3472 33.6838L25.5534 32.0424C25.6093 31.5912 26.0089 31.2045 26.4429 31.183L29.6484 31.0283Z" fill="#546266"/>
<path d="M29.6657 37.869C29.9579 37.5468 30.422 37.5811 30.7013 37.9378L32.7294 40.5503C33.0087 40.9113 32.9228 41.371 32.5404 41.573L29.7044 43.0769C29.322 43.2789 28.7805 43.15 28.5012 42.7933L27.4872 41.4871C27.2079 41.1261 27.2165 40.5718 27.5086 40.2495L29.6657 37.869Z" fill="#546266"/>
<path d="M34.517 42.6944C34.4956 42.2605 34.8479 41.9554 35.2991 42.0112L38.582 42.4237C39.0331 42.4796 39.2995 42.8663 39.1706 43.2788L38.2253 46.3469C38.0964 46.7594 37.6237 47.0516 37.1726 46.9957L35.5311 46.7894C35.0799 46.7336 34.6932 46.334 34.6717 45.9L34.517 42.6944Z" fill="#546266"/>
<path d="M41.3623 42.6773C41.04 42.3851 41.0744 41.9211 41.4311 41.6418L44.0436 39.6136C44.4045 39.3343 44.8643 39.4202 45.0663 39.8027L46.5702 42.6387C46.7722 43.0211 46.6433 43.5625 46.2866 43.8418L44.9803 44.8559C44.6194 45.1352 44.0651 45.1266 43.7428 44.8344L41.3623 42.6773Z" fill="#546266"/>
<path d="M46.1878 37.826C45.7581 37.8475 45.4487 37.4951 45.5046 37.0439L45.9171 33.7611C45.9729 33.3099 46.3597 33.0435 46.7722 33.1724L49.8402 34.1177C50.2527 34.2423 50.5449 34.7193 50.489 35.1705L50.2828 36.8119C50.2269 37.2631 49.8273 37.6498 49.3933 37.6713L46.1878 37.826Z" fill="#546266"/>
<path d="M46.1662 30.981C45.874 31.3033 45.4099 31.2689 45.1306 30.9123L43.1025 28.2997C42.8232 27.9388 42.9091 27.4833 43.2916 27.277L46.1275 25.7731C46.51 25.5712 47.0514 25.7001 47.3307 26.0567L48.3448 27.363C48.6241 27.7196 48.6155 28.2782 48.3233 28.5962L46.1662 30.981Z" fill="#546266"/>
<path d="M41.3184 26.1555C41.3399 26.5895 40.9876 26.8946 40.5364 26.8387L37.2535 26.4262C36.8023 26.3704 36.5359 25.9836 36.6648 25.5711L37.6102 22.5031C37.7391 22.0906 38.2117 21.7984 38.6629 21.8543L40.3043 22.0605C40.7555 22.1164 41.1422 22.516 41.1637 22.95L41.3184 26.1555Z" fill="#546266"/>
<path d="M34.4738 26.1769C34.796 26.4691 34.7617 26.9332 34.405 27.2125L31.7925 29.2407C31.4315 29.52 30.9761 29.434 30.7698 29.0516L29.2702 26.2156C29.0682 25.8332 29.1971 25.2918 29.5538 25.0125L30.86 23.9984C31.221 23.7191 31.7753 23.7277 32.0933 24.0199L34.4738 26.1769Z" fill="#546266"/>
<path d="M39.6048 40.5718C36.2102 41.5042 32.7039 39.5061 31.7715 36.1158C30.8391 32.7213 32.8328 29.2149 36.2274 28.2825C39.622 27.3501 43.1283 29.3482 44.0608 32.7384C44.9975 36.1287 42.9994 39.6393 39.6048 40.5718ZM35.2391 24.6645C29.8508 26.1469 26.6796 31.7158 28.1621 37.1041C29.6445 42.4925 35.2134 45.6637 40.6017 44.1812C45.9901 42.6988 49.1612 37.1299 47.6788 31.7416C46.1963 26.3532 40.6275 23.1863 35.2391 24.6645Z" fill="#546266"/>
<path d="M38.7104 37.3147C37.1119 37.753 35.4619 36.8163 35.0236 35.2178C34.5853 33.6193 35.5221 31.9693 37.1205 31.531C38.719 31.0927 40.369 32.0295 40.8073 33.6279C41.2499 35.2264 40.3089 36.8764 38.7104 37.3147ZM35.8314 26.8345C31.6376 27.986 29.1755 32.3174 30.3271 36.5112C31.4786 40.705 35.81 43.1672 40.0038 42.0156C44.1976 40.864 46.6598 36.5327 45.5082 32.3388C44.3566 28.1493 40.0253 25.6829 35.8314 26.8345Z" fill="#AABBC1"/>
<path d="M38.7106 37.3147C37.1122 37.753 35.4622 36.8163 35.0239 35.2178C34.5856 33.6193 35.5223 31.9693 37.1208 31.531C38.7192 31.0927 40.3693 32.0295 40.8076 33.6279C41.2501 35.2264 40.3091 36.8764 38.7106 37.3147ZM36.3301 28.6435C33.1375 29.5201 31.2597 32.8201 32.1363 36.017C33.0129 39.2097 36.313 41.0874 39.5099 40.2109C42.7025 39.3343 44.5803 36.0342 43.7037 32.8373C42.8228 29.6404 39.5228 27.7626 36.3301 28.6435Z" fill="#546266"/>
</g>
<defs>
<clipPath id="clip0_883:726">
<rect width="50.4934" height="47" fill="white"/>
</clipPath>
</defs>
</svg>

source/_static/images/nav/IncidentCollaboration.svg METASEP
<svg width="25" height="31" viewBox="0 0 25 31" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M3.05711 26.9926C3.70208 26.9926 4.22494 26.4698 4.22494 25.8248C4.22494 25.1798 3.70208 24.657 3.05711 24.657C2.41214 24.657 1.88928 25.1798 1.88928 25.8248C1.88928 26.4698 2.41214 26.9926 3.05711 26.9926Z" fill="#195B3D"/>
<path d="M17.5692 30.4799C18.2142 30.4799 18.737 29.9571 18.737 29.3121C18.737 28.6671 18.2142 28.1443 17.5692 28.1443C16.9242 28.1443 16.4014 28.6671 16.4014 29.3121C16.4014 29.9571 16.9242 30.4799 17.5692 30.4799Z" fill="#195B3D"/>
<path d="M23.0621 27.1997C23.7071 27.1997 24.2299 26.6768 24.2299 26.0318C24.2299 25.3869 23.7071 24.864 23.0621 24.864C22.4171 24.864 21.8943 25.3869 21.8943 26.0318C21.8943 26.6768 22.4171 27.1997 23.0621 27.1997Z" fill="#195B3D"/>
<path d="M24.9999 14.4862L5.16626 12.0988L0 14.4862L20.1183 29.076C21.8264 27.6073 23.5247 26.3521 24.3626 25.7537C24.699 25.511 24.8996 25.1261 24.9061 24.712C24.9287 22.3505 25.0031 14.4895 24.9999 14.4862Z" fill="#227551"/>
<path d="M24.9999 14.4862L5.16626 12.0988L0 14.4862L20.5162 17.3718L24.9999 14.4862Z" fill="#195B3D"/>
<path d="M20.6909 7.92893C20.6909 7.92893 19.6945 8.83796 18.0285 9.92167C17.5724 7.27223 16.3108 3.99843 13.8133 0C13.8133 0 12.9981 4.28634 10.2775 8.34624C9.09028 6.50877 8.58239 5.06921 8.58239 5.06921C0.0258794 13.6225 7.11695 19.6881 11.5715 19.6881C17.2909 19.6881 22.3213 16.9448 20.6909 7.92893Z" fill="#C43133"/>
<path d="M17.3297 15.5635C17.8246 14.4733 18.1675 13.079 18.2484 11.2998C18.2484 11.2998 17.5496 11.9047 16.3851 12.6294C16.0648 10.8599 15.1849 8.67948 13.4348 6.01385C13.4348 6.01385 12.8622 8.87357 10.96 11.578C10.1286 10.3552 9.77276 9.39117 9.77276 9.39117C8.34937 11.6298 7.79619 13.4058 7.76384 14.7903C6.97774 14.5024 6.49573 14.2566 6.49573 14.2566C7.83824 18.2679 10.6203 19.1414 11.8658 19.1414C14.0915 19.1414 16.3559 18.4815 18.6042 15.3015C18.6042 15.2982 18.1093 15.4341 17.3297 15.5635Z" fill="#E07315"/>
<path d="M9.19698 13.7325C9.19698 13.7325 10.1125 14.9877 10.8112 14.6836C10.8112 14.6836 12.1376 12.6164 14.0397 11.468C14.0397 11.468 13.6483 14.6189 14.098 15.1753C14.6932 15.9161 16.3075 14.3536 16.3075 14.3536C16.3075 16.217 14.2694 18.5623 12.4481 18.5623C10.6365 18.5656 8.07121 16.5437 9.19698 13.7325Z" fill="#FFBC1F"/>
<path d="M18.3325 5.28919C19.0184 4.29282 19.4874 3.26733 19.4874 3.26733C20.6391 5.16303 19.9597 6.31468 19.4518 6.68994C18.7725 7.19783 17.54 6.44085 18.3325 5.28919Z" fill="#C43133"/>
<path d="M5.79386 4.96567C5.12098 3.80755 5.04658 2.36798 5.04658 2.36798C3.40321 4.84597 4.04697 6.19172 4.59368 6.60257C5.32479 7.14604 6.57025 6.30171 5.79386 4.96567Z" fill="#C43133"/>
<path d="M9.61756 2.39062C9.70167 1.61422 9.37817 0.808716 9.37817 0.808716C10.9374 1.81479 10.918 2.68824 10.7142 3.03114C10.436 3.48728 9.52051 3.28994 9.61756 2.39062Z" fill="#C43133"/>
<path d="M20.7362 27.3873C20.7362 28.9013 19.6654 29.8653 18.3682 29.5515L1.97334 25.5692C1.00931 25.3363 0.236153 24.1167 0.236153 22.8422L0 14.4862L20.5162 17.375L20.7362 27.3873Z" fill="#339970"/>
<path d="M19.1964 20.458L1.65955 17.6015V16.7993L19.1964 19.6557V20.458Z" fill="#195B3D"/>
<path d="M19.1964 25.2619L1.88928 21.9202V21.1179L19.1964 24.4629V25.2619Z" fill="#195B3D"/>
</svg>

source/_static/images/nav/ITServiceDesk.svg METASEP
<svg width="30" height="26" viewBox="0 0 30 26" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M21.8103 6.46232C20.9746 5.31922 21.2235 3.7138 22.3666 2.87553L20.2659 0L0 14.812L2.1033 17.6901C3.2464 16.8544 4.85182 17.1033 5.69009 18.2464C6.52583 19.3895 6.27688 20.9949 5.13379 21.8332L7.23709 24.7113L27.503 9.89924L25.3997 7.02117C24.2515 7.8569 22.6461 7.60796 21.8103 6.46232Z" fill="#FFBC1F"/>
<path d="M21.7569 12.0559L11.0346 19.8925C10.5749 20.2278 9.92456 20.1262 9.58925 19.6664L5.51727 14.0983C5.18197 13.6385 5.28358 12.9882 5.74335 12.6529L16.4656 4.81629C16.9254 4.48098 17.5757 4.58259 17.911 5.04237L21.983 10.6131C22.3158 11.0703 22.2167 11.7206 21.7569 12.0559Z" stroke="#1E325C" stroke-width="0.381033" stroke-miterlimit="10"/>
<path d="M15.4657 4.23462L14.8279 4.70081L15.6793 5.86576L16.3172 5.39957L15.4657 4.23462Z" fill="white"/>
<path d="M19.7245 10.0592L19.0867 10.5254L19.9381 11.6903L20.5759 11.2242L19.7245 10.0592Z" fill="white"/>
<path d="M18.3053 8.11835L17.6675 8.58453L18.5189 9.74949L19.1568 9.2833L18.3053 8.11835Z" fill="white"/>
<path d="M16.8849 6.17542L16.2471 6.6416L17.0985 7.80655L17.7363 7.34037L16.8849 6.17542Z" fill="white"/>
<path d="M21.1452 12.0021L20.5073 12.4683L21.3587 13.6332L21.9966 13.167L21.1452 12.0021Z" fill="white"/>
<path opacity="0.5" d="M5.38532 10.8747L2.77905 12.7799V14.4386C4.1965 14.4386 5.34468 15.5868 5.34468 17.0042C5.34468 17.271 5.30403 17.525 5.23037 17.7663C5.39802 17.9035 5.55551 18.061 5.69015 18.2439C6.52588 19.387 6.27694 20.9924 5.13384 21.8307L6.08642 23.1338H9.39125L26.1643 10.8747H5.38532Z" fill="#954D0E"/>
<path d="M27.4344 18.8916C27.4344 17.4742 28.5826 16.326 30.0001 16.326V12.7621H4.90015V16.326C6.31759 16.326 7.46577 17.4742 7.46577 18.8916C7.46577 20.3091 6.31759 21.4573 4.90015 21.4573V25.0212H30.0001V21.4573C28.5826 21.4573 27.4344 20.3065 27.4344 18.8916Z" fill="#FFBC1F"/>
<path d="M24.0888 23.3751H10.8111C10.2421 23.3751 9.77466 22.9102 9.77466 22.3387V15.442C9.77466 14.873 10.2395 14.4056 10.8111 14.4056H24.0913C24.6603 14.4056 25.1277 14.8704 25.1277 15.442V22.3412C25.1252 22.9102 24.6578 23.3751 24.0888 23.3751Z" stroke="#1E325C" stroke-width="0.381033" stroke-miterlimit="10"/>
<path d="M23.6267 13.3463H22.8367V14.7892H23.6267V13.3463Z" fill="white"/>
<path d="M23.6267 20.563H22.8367V22.0059H23.6267V20.563Z" fill="white"/>
<path d="M23.6267 18.1575H22.8367V19.6003H23.6267V18.1575Z" fill="white"/>
<path d="M23.6267 15.7519H22.8367V17.1947H23.6267V15.7519Z" fill="white"/>
<path d="M23.6267 22.9687H22.8367V24.4115H23.6267V22.9687Z" fill="white"/>
</svg>

source/_static/images/nav/Healthcare.svg METASEP
<svg width="26" height="25" viewBox="0 0 26 25" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1.72968 23.2721C-0.430497 21.1119 -0.58848 17.7685 1.37502 15.805L8.48426 8.69574L16.306 16.5175L9.19679 23.6267C7.23329 25.5902 3.88985 25.429 1.72968 23.2721Z" fill="#FFBC1F"/>
<path d="M23.4605 10.3207C25.6626 8.11538 25.4853 4.36571 23.0607 1.94115C20.6362 -0.483404 16.8865 -0.660732 14.6812 1.54458L9.34845 6.87409L7.82021 8.40233L7.79764 8.4249L7.80086 8.42812C7.52036 8.73119 7.52681 9.20514 7.82021 9.49854L15.5033 17.1817C15.7967 17.4751 16.2707 17.4815 16.5738 17.201L16.577 17.2042L16.5995 17.1817L18.1278 15.6534L23.4605 10.3207Z" fill="#C43133"/>
</svg>

source/_static/images/nav/Guides.svg METASEP
<svg width="28" height="27" viewBox="0 0 28 27" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M16.2216 21.0005L13.9051 20.885L11.8829 24.0186C11.3163 22.8463 11.3555 21.4146 12.1139 20.24C12.8722 19.0654 14.1601 18.44 15.4632 18.4749L20.6605 10.4294C20.0939 9.25485 20.1332 7.82315 20.8915 6.64858C21.6499 5.47401 22.9377 4.8486 24.2409 4.88346L22.2164 8.01927L23.2733 10.0808L25.5876 10.1962L27.612 7.06044C28.1786 8.23283 28.1394 9.66454 27.3789 10.8391C26.6205 12.0137 25.3326 12.6391 24.0295 12.6064L18.8366 20.6497C19.4031 21.8242 19.3639 23.2559 18.6056 24.4305C17.8472 25.6051 16.5593 26.2305 15.2562 26.1956L17.2806 23.062L16.2216 21.0005Z" fill="#808F95"/>
<path d="M16.2216 21.0005L13.9051 20.885L11.8829 24.0186C11.3163 22.8463 11.3555 21.4146 12.1139 20.24C12.8722 19.0654 14.1601 18.44 15.4632 18.4749L20.6605 10.4294C20.0939 9.25485 20.1332 7.82315 20.8915 6.64858C21.6499 5.47401 22.9377 4.8486 24.2409 4.88346L22.2164 8.01927L23.2733 10.0808" fill="#AABBC1"/>
<path d="M14.6634 0.723432L4.22522 1.7825L2.57778 1.9503C1.36399 2.07233 1.17004 2.71518 1.28118 3.92679L2.79787 20.3206C2.90901 21.5322 3.18358 21.7567 4.39738 21.6346L6.04482 21.4668L16.4852 20.4099C17.699 20.2879 18.5924 19.2049 18.4813 17.9933L17.067 2.69775C16.9537 1.48396 15.8772 0.601399 14.6634 0.723432Z" fill="#3D4247"/>
<path d="M13.8746 0.348617L3.48219 1.83698L1.84347 2.07233C0.634035 2.24448 0.46624 2.89605 0.627497 4.10113L2.80012 20.4143C2.9592 21.6194 3.24467 21.8329 4.45192 21.6608L6.09282 21.4254L16.483 19.9371C17.6903 19.7649 18.5402 18.647 18.3789 17.4398L16.3523 2.21833C16.191 1.01326 15.0818 0.176464 13.8746 0.348617Z" fill="#CFCFCF"/>
<path d="M13.1902 0.0348588L2.85229 1.88932L6.12975 21.3688L16.4655 19.5144C17.6662 19.2986 18.4769 18.1524 18.2764 16.9538L15.7311 1.81523C15.5285 0.616694 14.3909 -0.180878 13.1902 0.0348588Z" fill="#1C58D9"/>
<path d="M1.22237 2.18129C0.0216546 2.39703 -0.126528 3.05077 0.0761336 4.25149L2.80662 20.4753C3.00928 21.676 3.29911 21.8787 4.49982 21.663L6.13201 21.371L2.85238 1.88928L1.22237 2.18129Z" fill="#3D4247"/>
<path d="M13.5563 7.59003L7.15174 8.73844L6.72681 6.20408L13.1292 5.05566L13.5563 7.59003Z" fill="white"/>
</svg>

source/_static/images/nav/Government.svg METASEP
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M28 27.1226H0V27.997H28V27.1226Z" fill="#ABB8BF"/>
<path d="M26.3646 25.3737H1.63257V26.2481H26.3646V25.3737Z" fill="#ABB8BF"/>
<path d="M27.1851 26.2481H0.817627V27.1225H27.1851V26.2481Z" fill="#DAE3EA"/>
<path d="M25.5497 24.4993H2.4502V25.3737H25.5497V24.4993Z" fill="#DAE3EA"/>
<path d="M26.6869 12.0243H1.31323V12.8987H26.6869V12.0243Z" fill="#93979A"/>
<path d="M28 12.9017H0V13.7762H28V12.9017Z" fill="#DAE3EA"/>
<path d="M13.994 1.32507L0 8.97717L1.17288 10.729L13.994 2.18758L26.8271 10.729L28 8.97717L13.994 1.32507Z" fill="#93979A"/>
<path d="M13.994 0L0 8.97719V10.2903L13.994 1.31315L28 10.2903V8.97719L13.994 0Z" fill="#DAE3EA"/>
<path d="M13.994 2.18756L0 11.1648V12.0422H28V11.1648L13.994 2.18756Z" fill="#DAE3EA"/>
<path d="M13.994 3.49176L2.37256 11.1648H25.6273L13.994 3.49176Z" fill="#ABB8BF"/>
<path d="M5.83163 14.558H3.03223V23.6845H5.83163V14.558Z" fill="#DAE3EA"/>
<path d="M6.18385 23.6815H2.68311V24.4993H6.18385V23.6815Z" fill="#93979A"/>
<path d="M6.18385 13.7642H2.68311V14.5551H6.18385V13.7642Z" fill="#93979A"/>
<path d="M3.64402 14.9222H3.31274V23.3413H3.64402V14.9222Z" fill="#C8CFD6"/>
<path d="M5.55393 14.9222H5.22266V23.3413H5.55393V14.9222Z" fill="#C8CFD6"/>
<path d="M4.91819 14.9222H4.58691V23.3413H4.91819V14.9222Z" fill="#C8CFD6"/>
<path d="M4.27976 14.9222H3.94849V23.3413H4.27976V14.9222Z" fill="#C8CFD6"/>
<path d="M12.2093 14.558H9.40991V23.7113H12.2093V14.558Z" fill="#DAE3EA"/>
<path d="M12.5615 23.7114H9.06079V24.4993H12.5615V23.7114Z" fill="#93979A"/>
<path d="M12.5615 13.7642H9.06079V14.5551H12.5615V13.7642Z" fill="#93979A"/>
<path d="M10.0217 14.9222H9.69043V23.3413H10.0217V14.9222Z" fill="#C8CFD6"/>
<path d="M11.9316 14.9222H11.6003V23.3413H11.9316V14.9222Z" fill="#C8CFD6"/>
<path d="M11.2961 14.9222H10.9648V23.3413H11.2961V14.9222Z" fill="#C8CFD6"/>
<path d="M10.6574 14.9222H10.3262V23.3413H10.6574V14.9222Z" fill="#C8CFD6"/>
<path d="M18.5872 14.558H15.7878V23.7113H18.5872V14.558Z" fill="#DAE3EA"/>
<path d="M18.9392 23.7114H15.4385V24.4993H18.9392V23.7114Z" fill="#93979A"/>
<path d="M18.9392 13.7642H15.4385V14.5551H18.9392V13.7642Z" fill="#93979A"/>
<path d="M16.3994 14.9222H16.0681V23.3413H16.3994V14.9222Z" fill="#C8CFD6"/>
<path d="M18.3095 14.9222H17.9783V23.3413H18.3095V14.9222Z" fill="#C8CFD6"/>
<path d="M17.6738 14.9222H17.3425V23.3413H17.6738V14.9222Z" fill="#C8CFD6"/>
<path d="M17.0351 14.9222H16.7039V23.3413H17.0351V14.9222Z" fill="#C8CFD6"/>
<path d="M24.9649 14.558H22.1655V23.6845H24.9649V14.558Z" fill="#DAE3EA"/>
<path d="M25.3169 23.6815H21.8162V24.4993H25.3169V23.6815Z" fill="#93979A"/>
<path d="M25.3169 13.7642H21.8162V14.5551H25.3169V13.7642Z" fill="#93979A"/>
<path d="M22.7773 14.9222H22.446V23.3413H22.7773V14.9222Z" fill="#C8CFD6"/>
<path d="M24.6872 14.9222H24.356V23.3413H24.6872V14.9222Z" fill="#C8CFD6"/>
<path d="M24.0515 14.9222H23.7202V23.3413H24.0515V14.9222Z" fill="#C8CFD6"/>
<path d="M23.4128 14.9222H23.0815V23.3413H23.4128V14.9222Z" fill="#C8CFD6"/>
</svg>

source/_static/images/nav/FinancialServices.svg METASEP
<svg width="28" height="21" viewBox="0 0 28 21" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M28 16.626H0V20.5628H28V16.626Z" fill="#227551"/>
<path d="M28 0H0V16.626H28V0Z" fill="#339970"/>
<path d="M17.5017 16.626H10.501V20.5628H17.5017V16.626Z" fill="#93979A"/>
<path d="M26.2484 1.75159H1.74878V14.8772H26.2484V1.75159Z" fill="#227551"/>
<path d="M24.9388 3.06384H3.06372V13.5649H24.9388V3.06384Z" fill="#339970"/>
<path d="M19.6871 4.81262C21.6206 4.81262 23.1875 6.37952 23.1875 8.31297C23.1875 10.2464 21.6206 11.8133 19.6871 11.8133C17.7537 11.8133 16.1868 10.2464 16.1868 8.31297C16.1868 6.37952 17.7537 4.81262 19.6871 4.81262Z" fill="#227551"/>
<path d="M17.5017 0H10.501V16.626H17.5017V0Z" fill="#CFCFCF"/>
<path d="M7.00073 7.87648C6.51947 7.87648 6.12494 7.48475 6.12494 7.00069C6.12494 6.51663 6.51667 6.1249 7.00073 6.1249C7.48199 6.1249 7.87652 6.51663 7.87652 7.00069H8.7523C8.7523 6.18646 8.19269 5.50933 7.44002 5.31347V4.81262H6.56423V5.31347C5.81156 5.50933 5.25195 6.18926 5.25195 7.00069C5.25195 7.96601 6.0382 8.75226 7.00353 8.75226C7.48479 8.75226 7.87931 9.14399 7.87931 9.62805C7.87931 10.1121 7.48759 10.5038 7.00353 10.5038C6.52226 10.5038 6.12774 10.1121 6.12774 9.62805H5.25195C5.25195 10.4423 5.81156 11.1194 6.56423 11.3153V11.8161H7.44002V11.3153C8.19269 11.1194 8.7523 10.4395 8.7523 9.62805C8.74951 8.65993 7.96605 7.87648 7.00073 7.87648Z" fill="white"/>
</svg>

source/_static/images/nav/Docs.svg METASEP
<svg width="18" height="27" viewBox="0 0 18 27" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M7.20068 25.1979C7.20068 26.1914 8.00794 26.9987 9.00149 26.9987C9.99504 26.9987 10.8023 26.1914 10.8023 25.1979H7.20068Z" fill="#616466"/>
<path d="M5.82091 20.6999H12.1764C12.5544 18.7587 13.7558 16.8742 15.0194 14.8952C16.4827 12.6003 18 10.2217 18 7.9133C18 3.55032 13.961 0 8.99865 0C4.039 0 0 3.55032 0 7.9133C0 10.2217 1.51462 12.6003 2.98065 14.8952C4.24149 16.8715 5.44563 18.7587 5.82091 20.6999Z" fill="#FFBC1F"/>
<path d="M5.6858 12.9783C5.7047 12.8784 5.7506 12.8271 5.8019 12.8163C5.8289 12.8028 5.87479 12.8082 5.87479 12.8082C5.89099 12.819 5.92879 12.8352 5.96389 12.873C6.11238 13.0296 6.22038 13.2861 6.30677 13.521C6.33917 13.6101 6.36617 13.7046 6.39047 13.7964C6.20148 13.7613 6.02329 13.6857 5.90719 13.5723C5.7398 13.4211 5.65071 13.17 5.6858 12.9783ZM8.72855 11.407C8.80145 11.2963 8.89864 11.2315 8.99854 11.2315C9.09843 11.2315 9.19563 11.2936 9.27123 11.407C9.35762 11.5474 9.32792 11.7364 9.24153 11.9226C9.17943 12.0549 9.09034 12.1791 8.99854 12.2979C8.90404 12.1764 8.81765 12.0522 8.75555 11.9199C8.67186 11.7337 8.63946 11.5447 8.72855 11.407ZM11.6957 13.5237C11.7821 13.2861 11.8901 13.0296 12.0359 12.8757C12.071 12.8379 12.1061 12.8217 12.125 12.8109C12.125 12.8109 12.1682 12.8055 12.1979 12.819C12.2492 12.8298 12.2951 12.8838 12.314 12.981C12.3491 13.1727 12.26 13.4211 12.0926 13.5777C11.9765 13.6884 11.7983 13.7667 11.6093 13.8018C11.6363 13.7046 11.6633 13.6128 11.6957 13.5237ZM6.50116 14.2175C6.56596 14.4848 6.62266 14.7548 6.69285 15.014C6.81165 15.5054 6.92774 15.9805 7.04114 16.4395C7.45422 18.1296 7.8187 19.5822 8.10758 20.6972H8.37487C8.13728 19.566 7.816 18.0864 7.42722 16.3639C7.32192 15.9049 7.21393 15.4244 7.10323 14.933C7.04384 14.6927 6.99254 14.4497 6.93854 14.1986C7.31382 14.1149 8.13188 13.8369 9.00124 12.8973C9.8706 13.8369 10.6887 14.1149 11.0639 14.1986C11.0072 14.4497 10.9586 14.6927 10.8992 14.933C10.7885 15.4244 10.6806 15.9049 10.5753 16.3639C10.1865 18.0864 9.8652 19.566 9.62761 20.6972H9.8949C10.1838 19.5822 10.5483 18.1296 10.9613 16.4395C11.072 15.9805 11.1881 15.5054 11.3069 15.014C11.3744 14.7548 11.4338 14.4848 11.4986 14.2175C11.8388 14.1932 12.1628 14.0879 12.4193 13.8558C12.6785 13.5993 12.8161 13.2645 12.7541 12.9081C12.7271 12.738 12.5975 12.5166 12.3518 12.441C12.2384 12.4032 12.1223 12.3951 11.9765 12.4329C11.855 12.4788 11.7686 12.5463 11.7065 12.6111C11.4662 12.8784 11.3798 13.143 11.2826 13.4076C11.2367 13.5399 11.1989 13.6722 11.1638 13.8045C11.1638 13.8045 10.7805 13.8342 9.96239 13.2834C9.50881 12.9783 9.37652 12.7569 9.24423 12.6111C9.38732 12.4518 9.52231 12.279 9.62761 12.0711C9.68431 11.955 9.7302 11.8282 9.7464 11.6851C9.7626 11.542 9.7356 11.38 9.65461 11.2396C9.57361 11.1019 9.45482 10.975 9.26583 10.8994C9.18483 10.8697 9.09303 10.8562 9.00124 10.8562C8.90944 10.8562 8.81765 10.8697 8.73665 10.8994C8.54766 10.9777 8.42887 11.1046 8.34787 11.2396C8.26688 11.38 8.23988 11.542 8.25608 11.6851C8.27228 11.8282 8.32087 11.955 8.37757 12.0711C8.48287 12.2817 8.62056 12.4545 8.76095 12.6111C8.62866 12.7569 8.49636 12.9783 8.04279 13.2834C7.22473 13.8342 6.84135 13.8045 6.84135 13.8045C6.80625 13.6722 6.76845 13.5426 6.72255 13.4076C6.62266 13.143 6.53896 12.8784 6.29597 12.6111C6.23658 12.5463 6.14748 12.4788 6.02599 12.4329C5.88019 12.3951 5.7668 12.4032 5.65071 12.441C5.40232 12.5166 5.27542 12.738 5.24843 12.9081C5.18633 13.2645 5.32402 13.5993 5.58321 13.8558C5.837 14.0879 6.16098 14.1932 6.50116 14.2175Z" fill="#A37200"/>
<path d="M12.2359 21.58H5.7832V22.4088H12.2359V21.58Z" fill="#93979A"/>
<path d="M11.7848 23.235H6.23389V24.0638H11.7848V23.235Z" fill="#93979A"/>
<path d="M11.7848 22.4089H6.23389V23.2378H11.7848V22.4089Z" fill="#616466"/>
<path d="M12.2357 21.58L6.23389 23.235V24.0638L12.2357 22.4088V21.58Z" fill="#93979A"/>
<path d="M11.334 24.8928H6.68213V25.7217H11.334V24.8928Z" fill="#93979A"/>
<path d="M11.334 24.0638H6.68213V24.8927H11.334V24.0638Z" fill="#616466"/>
<path d="M11.7849 23.235L6.68213 24.8927V25.7189L11.7849 24.0638V23.235Z" fill="#93979A"/>
<path d="M2.72143 7.72166C3.09401 6.73621 3.93097 5.08119 5.66158 3.84195C5.83168 3.72046 5.81818 3.45587 5.63999 3.46937C4.50874 3.55037 2.16526 4.14974 2.37585 7.74866C2.38935 7.95385 2.64044 7.93495 2.72143 7.72166Z" fill="#FFD791"/>
</svg>

source/_static/images/nav/DevOps.svg METASEP
<svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M20.6996 22H1.30037C0.582376 22 0 21.4176 0 20.6996V1.30037C0 0.582376 0.582376 0 1.30037 0H20.6996C21.4176 0 22 0.582376 22 1.30037V20.6996C22 21.4176 21.4176 22 20.6996 22Z" fill="#FFBC1F"/>
<path d="M7.10549 4.94354L2.50232 10.746L7.10549 16.5512" stroke="#1B1D22" stroke-width="1.22219" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M14.8944 16.5512L19.4976 10.746L14.8944 4.94354" stroke="#1B1D22" stroke-width="1.22219" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M9.59973 17.0564L12.3973 4.94354" stroke="#1B1D22" stroke-width="0.488877" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

source/_static/images/nav/Contribute.svg METASEP
<svg width="43" height="49" viewBox="0 0 43 49" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M30.7986 25.4885L33.291 23.4327L38.3376 23.1814L42.0041 26.8356C42.0041 22.4893 39.0915 19.7992 33.291 21.48C32.9243 21.5871 31.7667 21.6489 31.7667 21.6489L30.7986 25.4885Z" fill="#FFBC1F"/>
<path d="M39.9195 26.6296C39.9195 30.6916 30.3578 31.7586 27.4452 33.8019C26.2258 34.6588 24.1536 38.486 24.1536 38.486L41.139 28.6524C41.1431 28.6524 39.9195 23.4698 39.9195 26.6296Z" fill="#FFBC1F"/>
<path d="M30.7986 26.9591L32.2199 26.6295C32.2199 26.6295 32.4588 25.2824 33.5917 24.269C35.0418 22.9754 39.9401 23.2597 39.9401 26.4153C39.9401 31.6185 30.1106 33.2169 27.198 35.2602C25.9786 36.1171 24.5779 38.7702 24.5779 38.7702C24.5779 38.7702 25.6366 38.9679 25.8756 38.7702C30.3331 35.0872 42.0082 33.5547 42.0082 26.6749C42.0082 24.2072 38.42 21.1133 33.2951 22.9507C32.9408 23.0784 31.7708 23.1196 31.7708 23.1196L30.7986 26.9591Z" fill="#CC8F00"/>
<path d="M31.9109 18.3943H0V40.591C0 41.8187 0.358411 42.9557 0.972241 43.9197C2.24522 46.7953 8.46591 48.9746 15.9555 48.9746C23.4533 48.9746 29.6781 46.787 30.9428 43.9115C31.5525 42.9516 31.9109 41.8105 31.9109 40.591V18.3943Z" fill="#FFBC1F"/>
<path d="M15.9555 11.704C24.7674 11.704 31.9109 14.6784 31.9109 18.349C31.9109 22.0196 24.7674 24.994 15.9555 24.994C7.1435 24.994 0 22.0196 0 18.349C0 14.6784 7.1435 11.704 15.9555 11.704Z" fill="#FFBC1F"/>
<path d="M15.9555 14.9255C23.3009 14.9255 29.4268 16.8041 30.8605 19.3088C31.0706 18.9463 31.1818 18.5714 31.1818 18.1841C31.1818 15.1438 24.3638 12.6761 15.9555 12.6761C7.54318 12.6761 0.729248 15.1438 0.729248 18.1841C0.729248 18.5714 0.840479 18.9463 1.04646 19.3088C2.48835 16.8041 8.61429 14.9255 15.9555 14.9255Z" fill="#CC8F00"/>
<path d="M15.9555 24.1948C23.3008 24.1948 29.4268 22.0979 30.8604 19.3047C29.4268 16.5157 23.3008 14.4188 15.9555 14.4188C8.61421 14.4188 2.48415 16.5157 1.04639 19.3047C2.48827 22.0979 8.61421 24.1948 15.9555 24.1948Z" fill="#724E41"/>
<path d="M26.1764 17.6569C23.9271 15.0574 16.6312 16.2233 15.9556 17.521C15.0286 16.1368 7.90985 15.1068 5.73466 17.6569C4.37105 19.2595 7.5226 20.7673 10.6824 21.8549C12.6722 22.6129 10.6824 23.4698 10.6824 23.4698C18.5963 23.4698 24.1537 20.6766 24.1537 20.6766C25.9622 19.7662 27.0951 18.7198 26.1764 17.6569Z" fill="#8D6A54"/>
<path d="M22.4563 18.5715C21.1339 16.4869 16.2562 17.3397 15.733 18.3655C15.2057 17.2573 10.5793 16.3716 8.99327 18.3779C8.00043 19.6344 9.98199 20.862 11.9965 21.756C13.2612 22.3781 11.8976 23.0372 11.8976 23.0372C17.109 23.1155 20.9444 20.9485 20.9444 20.9485C22.1844 20.2441 23.0001 19.4243 22.4563 18.5715Z" fill="#B49166"/>
<path d="M20.2152 19.3253C19.3295 17.9288 16.0667 18.5014 15.7165 19.1894C15.3664 18.4479 12.2684 17.8546 11.2055 19.1935C10.5381 20.0339 11.8646 20.8579 13.2159 21.4552C14.0645 21.8713 13.15 22.3121 13.15 22.3121C16.6393 22.3615 19.2018 20.9155 19.2018 20.9155C20.0339 20.4459 20.5777 19.898 20.2152 19.3253Z" fill="#FAF3D9"/>
<g opacity="0.6">
<path opacity="0.6" d="M16.8288 6.1177C14.427 3.62531 16.0254 0 16.0254 0C16.0254 0 10.9829 4.79529 14.1675 8.09926C17.8504 11.9223 16.0254 14.3035 16.0254 14.3035C16.0254 14.3035 20.59 10.0231 16.8288 6.1177Z" fill="#A6ADAF"/>
<path opacity="0.6" d="M9.63998 8.35061C7.83969 6.53795 9.03851 3.90137 9.03851 3.90137C9.03851 3.90137 5.25666 7.38661 7.64606 9.79249C10.4104 12.5733 9.03851 14.3035 9.03851 14.3035C9.03851 14.3035 12.462 11.1932 9.63998 8.35061Z" fill="#A6ADAF"/>
<path opacity="0.6" d="M23.9434 8.35061C22.1432 6.53795 23.342 3.90137 23.342 3.90137C23.342 3.90137 19.5601 7.38661 21.9495 9.79249C24.7138 12.5733 23.342 14.3035 23.342 14.3035C23.342 14.3035 26.7654 11.1891 23.9434 8.35061Z" fill="#A6ADAF"/>
</g>
</svg>

source/_static/images/nav/Community.svg METASEP
<svg width="44" height="44" viewBox="0 0 44 44" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M44 22.0007C44 34.152 34.1513 44.0007 22 44.0007C9.8487 44.0007 0 34.152 0 22.0007C0 11.4432 7.44037 2.62051 17.3596 0.490211L17.9822 0.501959L18.4286 0.290496C18.7889 0.231756 19.1492 0.180848 19.5134 0.141688L20.2848 0.165184L20.8213 0.0320408C20.927 0.0281248 21.0288 0.0202929 21.1346 0.0163769L22 0.137772L22.5717 0.00854492C22.6814 0.0124609 22.791 0.0163769 22.9007 0.0202929L24.1068 0.32574L25.5322 0.28658C25.7006 0.313992 25.869 0.341404 26.0374 0.372731L31.2574 3.6974L36.9512 5.86294C41.2862 9.87682 44 15.6216 44 22.0007Z" fill="#1C58D9"/>
<path d="M23.0692 6.94309C24.5025 7.40126 24.4437 6.49667 25.3483 7.55007C25.8691 8.15313 26.809 9.26135 27.925 9.53547C28.0817 9.57463 28.4302 9.24177 28.4302 8.97157C28.4302 8.70528 27.6588 8.14138 27.2162 8.0239C26.7698 7.9025 27.3925 7.07623 26.8011 6.82561C26.2098 6.57107 25.5559 5.62732 25.3209 4.8872C25.082 4.14708 24.0443 4.76972 23.6919 4.62091C23.3355 4.4721 22.893 4.56217 22.5092 5.12607C22.1215 5.68606 22.7011 6.82561 23.0692 6.94309Z" fill="#FFBC1F"/>
<path d="M30.8306 27.6665C30.8149 27.3571 27.9954 25.8142 27.6508 25.7946C27.0869 25.7633 26.3194 25.4774 25.8025 25.779C25.5793 25.9043 25.3991 26.0766 25.2581 26.288C25.1602 26.4721 24.612 26.1275 24.3966 26.2411C23.8876 26.5113 23.5978 25.6302 23.7427 25.2934C24.0951 24.4671 22.842 24.9919 22.7128 24.7647C22.8655 25.031 22.6697 22.4112 22.2311 23.8915C21.8982 25.0114 20.5942 23.727 20.7508 22.9125C20.9936 21.6554 22.889 21.4714 23.3041 21.6946C23.5155 21.8042 24.2831 22.9242 24.381 22.8929C24.5924 22.8263 24.2557 21.5771 24.2126 21.4087C24.0599 20.8017 25.2307 20.5942 25.313 19.9598C25.3835 19.4194 25.7476 19.6074 26.1118 19.3176C26.6405 18.8986 26.2293 18.1193 26.9068 17.716C27.1378 17.5789 27.9993 17.481 28.1129 17.2382C28.2186 17.0189 27.3845 16.4119 28.1012 16.2396C28.7434 16.083 29.4013 16.361 29.5736 15.4329C29.7302 14.591 28.8021 14.3991 28.5202 13.7451C28.434 13.5493 28.3283 12.4215 27.9288 12.6291C27.4354 12.8875 27.13 13.5102 26.7306 12.7701C26.0061 11.4347 24.2126 10.8591 25.0545 12.958C25.4892 14.0428 23.868 17.34 23.633 14.2895C23.5508 13.2322 20.3827 12.911 21.4479 11.7402C22.5287 10.5497 24.005 10.5066 24.4045 8.68178C24.9605 6.14813 23.2062 8.30193 22.3094 7.81243C20.9701 7.08014 22.1058 7.47565 21.4126 8.42724C21.1503 8.78751 20.2888 8.20011 19.905 8.25493C19.5486 8.30976 18.6362 9.09295 18.3934 8.60346C17.9431 7.7067 14.8025 7.15454 13.9488 7.47174C12.1788 8.13745 11.56 7.23678 9.79001 6.88826C9.1752 6.76686 6.15989 6.68071 6.35569 7.72628C6.43401 8.13745 6.72379 8.45857 6.8491 8.84625C7.03707 9.4219 6.17164 8.97939 5.97584 9.12037C5.92493 9.15953 6.99399 9.9114 7.08015 10.0015C7.36993 10.2952 5.96801 10.6554 5.83095 11.1488C5.549 12.1553 7.74978 11.8655 7.34643 13.0716C7.22504 13.4397 5.96409 14.0388 5.84269 15.2685C5.8192 15.5034 7.40909 13.7412 8.43508 14.1132C9.34358 14.4422 9.26135 11.979 10.3892 11.979C12.4881 11.979 12.8915 14.0232 13.9997 15.3938C14.5166 16.0321 14.9317 16.2984 15.0218 17.1325C15.1079 17.9118 14.9395 18.8555 15.2215 19.5956C15.4917 20.3044 16.0399 20.3514 16.4002 20.9231C16.8309 21.5967 17.0737 22.2507 17.6572 22.8302C18.5031 23.68 19.9481 24.9801 21.2756 24.7804C21.538 24.7412 22.5287 25.3051 22.7519 25.4735C23.1004 25.7359 23.2767 26.1314 23.5273 26.4682C23.7622 26.7815 24.5024 26.5857 24.8313 26.7345C25.1211 26.8676 24.0755 29.0684 24.4671 29.648C24.894 30.2863 24.894 30.999 25.5362 31.5002C26.1432 31.9741 26.3233 32.0132 26.4016 32.8356C26.523 34.1748 26.1314 35.5298 25.8103 36.779C25.6419 37.4212 25.9787 38.13 25.732 38.7409C25.4187 39.5084 25.2072 40.1624 25.4814 41.0121C25.9552 42.4885 28.6141 42.7313 27.036 41.4429C26.3664 40.8947 27.7605 39.5711 27.3258 39.4418C26.5778 39.1286 27.4628 38.8466 27.5607 38.5216C27.7565 37.8754 30.7249 35.2008 30.9442 34.7583C31.1282 34.3863 31.0107 34.0025 31.3123 33.6814C31.6451 33.3251 32.1072 33.4504 32.4831 33.1998C33.2663 32.675 32.9844 31.7861 33.3055 31.0616C33.9477 29.6245 34.2179 30.1923 33.3407 29.0723C33.0196 28.6768 30.8893 28.8256 30.8306 27.6665Z" fill="#FFBC1F"/>
<path d="M14.9708 5.921C15.5112 6.48491 16.0438 5.62339 16.1338 5.921C16.2239 6.21862 16.2357 6.7786 16.8818 6.82168C17.5279 6.86867 16.2827 7.27985 16.6977 7.45999C17.1128 7.63621 18.0018 8.20011 18.3268 7.96515C18.6518 7.72627 19.0395 7.55005 19.1844 7.72627C19.3332 7.90641 20.2221 7.69886 19.9676 7.40125C19.717 7.10363 19.0356 6.40267 19.063 5.99932C19.0943 5.59598 19.8658 4.55824 19.0043 4.64831C18.4443 4.70705 18.3229 5.21221 18.3229 5.50983C18.3229 5.80744 17.524 5.06732 17.3752 5.07907C17.2264 5.09473 16.6625 4.17839 16.4589 4.17839C16.2513 4.17839 14.8572 3.73197 14.9786 4.17839C15.1 4.6209 14.4304 5.36102 14.9708 5.921Z" fill="#FFBC1F"/>
<path d="M27.3922 10.158C26.9732 9.91914 26.1783 8.82658 25.8219 9.17902C25.4656 9.53537 25.912 10.3342 26.2057 10.6906C26.5033 11.0469 27.7486 11.8184 27.5684 11.462C27.3922 11.1096 28.2224 10.6318 27.3922 10.158Z" fill="#FFBC1F"/>
<path d="M15.7894 2.62371C16.0087 2.60413 16.3416 3.35208 16.6588 3.43432C16.976 3.51264 17.1326 3.88857 17.2501 3.97864C17.3715 4.06871 18.6912 3.55572 19.0084 3.43432C19.3765 3.29726 18.6128 2.58455 18.3583 2.07156C18.0999 1.55856 18.2996 2.92133 17.9236 2.69811C17.5477 2.4749 17.6064 2.16946 17.1522 2.16946C16.6979 2.16946 17.0151 1.24137 16.4395 1.43717C15.8638 1.63688 15.574 2.64329 15.7894 2.62371Z" fill="#FFBC1F"/>
<path d="M20.5472 4.40156C20.1595 4.47988 20.23 4.73834 20.0146 4.95371C19.7993 5.17301 19.8188 5.46671 20.0146 5.72516C20.2143 5.98362 20.5276 6.43396 20.7665 5.99928C21.0054 5.56461 20.7665 5.21217 20.7665 4.93413C20.7665 4.66002 20.7391 4.3624 20.5472 4.40156Z" fill="#FFBC1F"/>
<path d="M21.3381 5.78399C21.436 6.02286 21.6162 5.36889 21.9999 5.03212C22.3837 4.69534 21.812 3.84949 21.4556 4.28025C21.2167 4.57786 21.2402 5.54511 21.3381 5.78399Z" fill="#FFBC1F"/>
<path d="M21.2675 6.08154C21.06 6.37132 20.8994 7.14669 21.2675 7.20543C21.6356 7.26808 21.8588 6.84907 21.6983 6.55146C21.5338 6.25776 21.3537 5.96015 21.2675 6.08154Z" fill="#FFBC1F"/>
<path d="M22.7597 1.08467C22.4033 1.24522 23.2727 1.53892 22.6813 1.69948C22.0861 1.85612 22.0665 2.35345 21.5535 1.93444C21.0405 1.51934 20.4806 2.0715 20.8682 2.32995C21.2559 2.58841 21.9099 3.1993 21.8903 3.53608C21.8707 3.87285 22.5012 4.02949 23.0964 3.99033C23.6877 3.95117 24.4005 4.12739 24.42 3.87285C24.4396 3.6144 24.5101 3.50866 24.4396 3.3207C24.3378 3.04266 24.0833 2.76854 23.4724 3.0035C22.8576 3.24238 22.462 3.12098 22.3759 2.82728C22.2858 2.52575 23.5742 1.9501 24.142 2.34953C24.7137 2.74505 25.2502 2.13024 24.8351 1.85612C24.42 1.57808 24.6981 1.28438 24.9839 1.24522C25.1915 1.21781 25.3795 0.693071 25.5322 0.285808C24.6707 0.148749 23.7935 0.0586814 22.9006 0.0234375C22.9046 0.575591 23.1121 0.92803 22.7597 1.08467Z" fill="#FFBC1F"/>
<path d="M17.5084 0.591326C17.9039 0.759713 18.5501 0.58741 18.4287 0.289795C18.0723 0.348535 17.716 0.415106 17.3635 0.48951C17.3949 0.52867 17.4418 0.563914 17.5084 0.591326Z" fill="#FFBC1F"/>
<path d="M17.7513 0.904642C17.1952 0.618775 17.2265 1.31974 17.481 1.59777C17.7395 1.87189 18.4718 1.27666 17.7513 0.904642Z" fill="#FFBC1F"/>
<path d="M21.1345 0.0156639C21.5496 0.0939836 21.8237 0.415094 21.8903 0.653969C21.9647 0.904592 22.5639 0.360271 22.5717 0.00391598C22.3837 0.00391598 22.1918 0 22 0C21.7102 0 21.4243 0.00391598 21.1345 0.0156639Z" fill="#FFBC1F"/>
<path d="M19.9716 0.838065C19.721 1.18267 19.9363 1.60168 20.234 1.25316C20.5316 0.904637 20.2927 0.0352881 20.5316 0.411222C20.7665 0.787157 21.2051 1.38239 21.4988 1.4098C21.7925 1.43721 21.538 1.06128 21.4988 0.747997C21.4675 0.485626 20.7587 0.137104 20.8214 0.0313721C20.3828 0.054868 19.9481 0.0901118 19.5173 0.137104C19.8267 0.340735 20.1517 0.591358 19.9716 0.838065Z" fill="#FFBC1F"/>
<path d="M21.2678 3.80633C21.6163 3.94339 21.2678 3.09753 21.2678 3.09753C20.9036 3.31683 20.9232 3.66927 21.2678 3.80633Z" fill="#FFBC1F"/>
<path d="M20.0145 3.25418C20.0733 3.49306 20.4492 3.57138 20.6489 3.25418C20.8447 2.93699 20.6372 1.78569 20.367 2.14596C20.085 2.52189 19.76 2.34567 19.1883 2.14596C18.6126 1.95016 19.9558 3.01922 20.0145 3.25418Z" fill="#FFBC1F"/>
<path d="M23.8836 23.445C24.3731 23.3862 24.655 23.9776 25.215 23.9501C25.7789 23.9227 26.5934 24.7529 27.0673 24.2634C27.451 23.864 25.3795 23.539 24.6981 23.1826C24.0167 22.8263 23.3941 23.5037 23.8836 23.445Z" fill="#FFBC1F"/>
<path d="M26.2958 1.18269C26.9772 1.50772 26.8597 1.49988 26.4446 1.81316C26.0295 2.13036 26.1783 2.82349 27.0986 2.77258C28.0149 2.72559 28.5788 1.81316 28.9939 3.0976C29.409 4.38205 29.1114 5.78789 29.6479 6.17948C30.1804 6.575 29.7379 6.84129 29.6479 7.2133C29.5578 7.58141 29.7967 7.84769 30.2118 7.73021C30.6269 7.61273 30.5094 8.38418 30.2118 8.70921C29.9142 9.03424 29.5617 9.65688 30.4781 10.7808C31.3944 11.9047 31.5119 11.7598 31.8095 12.1435C32.1071 12.5273 32.3421 12.0026 32.4321 11.5522C32.5222 11.1058 32.2246 9.5394 33.2623 9.5394C34.3001 9.53548 34.5938 8.70529 34.7152 8.43901C34.8326 8.17272 35.6628 8.20405 36.1053 7.81637C36.5008 7.47567 36.9394 7.18589 36.9512 5.85837C33.9633 3.08977 30.2039 1.13961 26.0373 0.368164C25.9551 0.677527 25.959 1.02213 26.2958 1.18269Z" fill="#FFBC1F"/>
</svg>

source/_static/images/nav/CICD.svg METASEP
<svg width="28" height="16" viewBox="0 0 28 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M24.7668 8.00366C24.7668 10.5272 22.7146 12.5794 20.1936 12.5794C17.6701 12.5794 15.6179 10.5272 15.6179 8.00366C15.6179 7.96779 15.6179 7.90886 15.6179 7.85763C15.6179 7.84225 15.6179 7.82176 15.6179 7.80895C15.6179 6.06423 15.0363 4.4553 14.0653 3.15381C12.6383 1.24513 10.3684 0 7.80895 0C3.50224 0 0 3.50224 0 7.80895H3.23323C3.23323 5.28539 5.28539 3.23579 7.80639 3.23579C10.3299 3.23579 12.3821 5.28795 12.3821 7.80895H12.3847C12.3821 7.873 12.3821 7.93705 12.3821 8.00366C12.3821 9.74325 12.9611 11.3471 13.927 12.646C15.3514 14.5624 17.6239 15.8126 20.191 15.8126C24.4978 15.8126 28 12.3104 28 8.00366H24.7668Z" fill="#FFBC1F"/>
<path d="M7.80895 12.3821C5.50572 12.3821 3.60216 10.6706 3.28703 8.45452H3.28447L3.28191 8.40584L3.23836 7.80634H0C0 7.89601 0.0230579 8.35973 0.0281819 8.45452C0.0281819 8.46477 0.0281819 8.47502 0.0281819 8.47502H0.0333059C0.374051 12.4692 3.7277 15.6153 7.80895 15.6153C10.0507 15.6153 12.0695 14.6597 13.494 13.143C12.7408 12.1643 12.2002 11.0216 11.9338 9.77394C11.1959 11.3137 9.6254 12.3821 7.80895 12.3821Z" fill="#1E325C"/>
<path d="M27.9717 7.35547V7.32728H27.9666C27.6207 3.33826 24.2696 0.194702 20.1909 0.194702C17.9364 0.194702 15.9175 1.13751 14.4956 2.65421C15.2488 3.63033 15.7971 4.77042 16.0687 6.01554C16.804 4.47835 18.3668 3.42793 20.1909 3.42793C22.4941 3.42793 24.3977 5.13934 24.7128 7.35547H24.7154L24.718 7.39902L24.7615 8.00109H27.9947L27.9717 7.35547Z" fill="#1E325C"/>
</svg>

source/_static/images/nav/Blog.svg METASEP
<svg width="30" height="25" viewBox="0 0 30 25" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M21.3129 0H2.61816C1.17062 0 0 1.16307 0 2.60054V14.483C0 15.9179 1.17062 17.0835 2.61816 17.0835H5.37731V21.5394L9.52105 17.0835H21.3129C22.7579 17.0835 23.931 15.9204 23.931 14.4855V2.60306C23.9285 1.16307 22.7579 0 21.3129 0Z" fill="#FFBC1F"/>
<path d="M9.521 17.081H21.3128C22.7578 17.081 23.931 15.918 23.931 14.483V7.26794C23.931 7.26794 23.1078 13.9392 22.9617 14.5258C22.8157 15.1124 22.5212 15.991 21.129 16.1395C19.7344 16.283 9.521 17.081 9.521 17.081Z" fill="#CC8F00"/>
<path d="M5.57864 6.84253C6.50758 6.84253 7.26031 7.59525 7.26031 8.5242C7.26031 9.45314 6.50758 10.2059 5.57864 10.2059C4.64969 10.2059 3.89697 9.45314 3.89697 8.5242C3.89697 7.59525 4.64969 6.84253 5.57864 6.84253Z" fill="white"/>
<path d="M11.9629 6.84253C12.8919 6.84253 13.6446 7.59525 13.6446 8.5242C13.6446 9.45314 12.8919 10.2059 11.9629 10.2059C11.034 10.2059 10.2812 9.45314 10.2812 8.5242C10.2812 7.59525 11.034 6.84253 11.9629 6.84253Z" fill="white"/>
<path d="M18.3499 6.84253C19.2788 6.84253 20.0315 7.59525 20.0315 8.5242C20.0315 9.45314 19.2788 10.2059 18.3499 10.2059C17.4209 10.2059 16.6682 9.45314 16.6682 8.5242C16.6682 7.59525 17.4209 6.84253 18.3499 6.84253Z" fill="white"/>
<path d="M1.93856 4.97201C2.18527 4.11356 2.82722 2.69874 4.46609 1.77987C4.62721 1.68924 4.57686 1.44505 4.39057 1.43498C3.21239 1.36449 0.83339 1.61623 1.58108 4.95439C1.62136 5.1432 1.88569 5.15831 1.93856 4.97201Z" fill="#FFD791"/>
<path d="M24.2991 11.5498L16.7771 19.0697L20.3012 22.5948L27.8232 15.0749L24.2991 11.5498Z" fill="#FFBC1F"/>
<path d="M29.3636 10.4601L28.9155 10.012C28.0646 9.16364 26.6901 9.16364 25.8392 10.012L24.301 11.5502L27.8255 15.0746L29.3636 13.5365C30.212 12.6856 30.212 11.3085 29.3636 10.4601Z" fill="#C43133"/>
<path d="M24.3007 11.5491L23.3394 12.5103L26.8635 16.0353L27.8248 15.0742L24.3007 11.5491Z" fill="#91A0A9"/>
<path d="M24.6778 11.9267L23.7166 12.8879L26.4864 15.6578L27.4476 14.6965L24.6778 11.9267Z" fill="#C6D2D8"/>
<path d="M16.779 19.0698L15.2534 23.0676L16.3032 24.1224L20.3035 22.5943L16.779 19.0698Z" fill="#F7CEAC"/>
<path d="M14.9839 23.7649C14.7724 24.3212 15.0544 24.6007 15.6082 24.3892L17.5492 23.6491L15.7266 21.8264L14.9839 23.7649Z" fill="#1B1D22"/>
<path d="M23.3395 12.5095L16.7798 19.0692L17.9547 20.2441L24.5143 13.6844L23.3395 12.5095Z" fill="#FFD791"/>
<path d="M25.6878 14.859L19.1282 21.4187L20.303 22.5936L26.8627 16.0339L25.6878 14.859Z" fill="#CC8F00"/>
</svg>

source/_static/images/nav/APM_NPM.svg METASEP
<svg width="28" height="21" viewBox="0 0 28 21" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2.48586 16.715H25.5273C25.8776 16.715 26.1635 16.4239 26.1635 16.0659V0.649126C26.1635 0.291076 25.8802 0 25.5273 0H2.48586C2.13553 0 1.84961 0.291076 1.84961 0.649126V16.0659C1.84961 16.4239 2.13553 16.715 2.48586 16.715Z" fill="#202427"/>
<path d="M0 18.9766C0 19.7545 0.631095 20.5325 1.39871 20.5325H26.6013C27.3277 20.5325 28 19.7571 28 18.9766H0Z" fill="#202427"/>
<path d="M25.6662 16.715H2.33376L0 18.9766H28L25.6662 16.715Z" fill="#DCDCDC"/>
<path d="M24.8959 16.8927H3.11665L2.34131 17.8458H25.6738L24.8959 16.8927Z" fill="#BEBDBE"/>
<path d="M16.4008 18.2657H11.6122L11.2542 18.7397H16.7588L16.4008 18.2657Z" fill="#202427"/>
<path d="M24.7389 1.40906H3.27393V15.306H24.7389V1.40906Z" fill="#3D4247"/>
<path d="M14.0053 0.360596C14.2062 0.360596 14.3685 0.522877 14.3685 0.723797C14.3685 0.924717 14.2062 1.087 14.0053 1.087C13.8044 1.087 13.6421 0.924717 13.6421 0.723797C13.6447 0.522877 13.8069 0.360596 14.0053 0.360596Z" fill="#DCDCDC"/>
<path d="M16.0143 19.9915H11.9856C11.8465 19.9915 11.4807 19.9915 11.4807 19.5201H16.5217C16.5192 19.9915 16.1457 19.9915 16.0143 19.9915Z" fill="#3D4247"/>
<path d="M9.63379 13.5621C9.07997 13.5621 8.83011 13.1628 9.0774 12.676L13.5492 3.89217C13.7964 3.40533 14.2034 3.40533 14.4507 3.89217L18.9225 12.676C19.1698 13.1628 18.9199 13.5621 18.3661 13.5621H9.63379Z" fill="#FFBC1F"/>
<path d="M13.2965 7.1378L13.7576 10.2263C13.804 10.5328 14.1955 10.5328 14.2419 10.2263L14.7004 7.1378C14.7854 5.93486 13.2115 5.93486 13.2965 7.1378Z" fill="#221E1F"/>
<path d="M14 10.7853C14.3889 10.7853 14.7058 11.0995 14.7058 11.4885C14.7058 11.8775 14.3889 12.1917 14 12.1917C13.611 12.1917 13.2942 11.8775 13.2942 11.4885C13.2942 11.0995 13.611 10.7853 14 10.7853Z" fill="#221E1F"/>
</svg>

source/_static/images/nav/APIReference.svg METASEP
<svg width="19" height="25" viewBox="0 0 19 25" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M17.9555 24.0337H1.0445C0.760103 24.0027 0.522248 23.8916 0.330929 23.7002C0.142196 23.5115 0.0310246 23.2736 0 22.9893V1.0445C0.0310246 0.760103 0.142196 0.522248 0.333515 0.330929C0.522248 0.142196 0.760103 0.0310246 1.0445 0H13.5836L18.9974 5.36726V22.9893C18.9974 23.2736 18.9018 23.5115 18.713 23.7028C18.5243 23.8916 18.2709 24.0027 17.9555 24.0337Z" fill="#DBE0E0"/>
<path d="M11.2568 3.65832H2.376C2.15365 3.62729 2.04248 3.49027 2.04248 3.25241C2.04248 3.01456 2.15365 2.89563 2.376 2.89563H11.2594C11.4817 2.89563 11.5929 3.01456 11.5929 3.25241C11.5903 3.49027 11.4791 3.62729 11.2568 3.65832ZM9.87878 6.22302C10.1011 6.192 10.2278 6.06531 10.2588 5.84297C10.2278 5.62063 10.1011 5.49394 9.87878 5.46292H2.376C2.15365 5.49394 2.04248 5.62063 2.04248 5.84297C2.04248 6.06531 2.15365 6.192 2.376 6.22302H9.87878ZM15.7683 8.83426C15.9906 8.80324 16.1173 8.67655 16.1483 8.45421C16.1173 8.23187 15.9906 8.10518 15.7683 8.07416H2.376C2.15365 8.10777 2.04248 8.23445 2.04248 8.45421C2.04248 8.67655 2.15365 8.80324 2.376 8.83426H15.7683ZM14.9151 11.399C15.1375 11.399 15.2641 11.2723 15.2952 11.0189C15.2641 10.7966 15.1375 10.6699 14.9151 10.6389H2.376C2.15365 10.6725 2.04248 10.8069 2.04248 11.0422C2.04248 11.28 2.15365 11.399 2.376 11.399H14.9151ZM9.87878 14.0128C10.1011 13.9818 10.2278 13.8551 10.2588 13.6327C10.2278 13.4104 10.1011 13.2837 9.87878 13.2527H2.376C2.15365 13.2837 2.04248 13.4104 2.04248 13.6327C2.04248 13.8551 2.15365 13.9818 2.376 14.0128H9.87878ZM15.7683 16.5775C15.9906 16.5775 16.1173 16.4508 16.1483 16.1974C16.1173 15.9751 15.9906 15.8484 15.7683 15.8174H2.376C2.15365 15.8484 2.04248 15.9829 2.04248 16.2207C2.04248 16.4586 2.15365 16.5775 2.376 16.5775H15.7683ZM15.7683 19.1887C15.9906 19.1577 16.1173 19.031 16.1483 18.8087C16.1173 18.5863 15.9906 18.4597 15.7683 18.4286H2.376C2.15365 18.4622 2.04248 18.5889 2.04248 18.8087C2.04248 19.031 2.15365 19.1577 2.376 19.1887H15.7683ZM15.7683 21.7534C15.9906 21.7534 16.1173 21.6268 16.1483 21.3734C16.1173 21.151 15.9906 21.0399 15.7683 21.0399H2.376C2.15365 21.0399 2.04248 21.1588 2.04248 21.3967C2.04248 21.6345 2.15365 21.7534 2.376 21.7534H15.7683Z" fill="#95A9B2"/>
<path d="M13.5835 0L18.9508 5.36726H14.7237C14.4056 5.36726 14.1368 5.26385 13.917 5.0596C13.6947 4.85277 13.5835 4.57613 13.5835 4.22711V0Z" fill="#B9C5C6"/>
</svg>

source/_static/images/home/Playbooks.svg METASEP
<svg width="53" height="53" viewBox="0 0 53 53" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0)">
<path d="M29.5599 51.5211C28.4319 53.2487 25.8783 53.4974 23.8975 52.0985L1.51442 36.337C0.784571 35.8444 0.273194 35.089 0.087004 34.2284C-0.0991861 33.3678 0.0542004 32.4685 0.515175 31.7183L20.2025 1.63876C21.1751 0.159878 23.3468 -0.430788 25.0877 0.33308L50.4819 11.5157C52.7291 12.5061 53.6706 14.7222 52.5381 16.4498L29.5599 51.5211Z" fill="#FFBC1F"/>
<path d="M25.998 49.4826L2.92651 33.7123L23.2223 2.7135L48.9318 14.4513L25.998 49.4826Z" fill="white"/>
<path d="M40.605 12.2352C40.4084 12.4846 40.1314 12.6581 39.8213 12.7261C39.5111 12.7941 39.1869 12.7525 38.904 12.6083L29.1958 8.05169C29.0679 8.00682 28.9519 7.93329 28.8568 7.83669C28.7617 7.7401 28.69 7.62301 28.6471 7.49441C28.6043 7.36581 28.5914 7.22909 28.6095 7.09475C28.6277 6.96041 28.6763 6.832 28.7517 6.71936L30.275 4.39223C30.4533 4.15764 30.7063 3.991 30.9922 3.91992C31.2782 3.84884 31.5798 3.87759 31.8471 4.00141L41.6797 8.36257C41.8177 8.40515 41.9442 8.47831 42.0499 8.5766C42.1557 8.67489 42.2379 8.79578 42.2904 8.93026C42.3429 9.06473 42.3644 9.20932 42.3532 9.35325C42.3421 9.49718 42.2986 9.63673 42.226 9.76151L40.605 12.2352Z" fill="#818698"/>
<path d="M38.7487 9.22859L32.4956 6.39073L34.0367 4.03251C34.2204 3.79319 34.4799 3.62332 34.7728 3.55071C35.0657 3.4781 35.3745 3.50705 35.6488 3.63281L39.8101 5.4359C39.9444 5.47746 40.0677 5.54887 40.1705 5.64479C40.2734 5.74071 40.3532 5.85866 40.4041 5.9898C40.4549 6.12094 40.4754 6.26187 40.4641 6.40206C40.4527 6.54225 40.4098 6.67805 40.3386 6.79932L38.7487 9.22859Z" fill="#1E325C"/>
<path d="M39.2059 22.0101L26.2246 15.3529L26.9041 14.3092L39.9298 20.8998L39.2059 22.0101Z" fill="#F4BC49"/>
<path d="M22.1301 14.6689C22.1002 14.6884 22.0662 14.7009 22.0307 14.7053C21.9953 14.7097 21.9593 14.706 21.9255 14.6945C21.8917 14.6829 21.8609 14.6638 21.8356 14.6386C21.8103 14.6134 21.791 14.5828 21.7793 14.549L20.9799 12.1952C20.97 12.1598 20.9679 12.1227 20.9736 12.0864C20.9792 12.0501 20.9926 12.0154 21.0128 11.9847C21.033 11.954 21.0595 11.928 21.0906 11.9084C21.1217 11.8888 21.1566 11.876 21.193 11.871L21.495 11.8089C21.5739 11.7899 21.657 11.7995 21.7294 11.8362C21.8018 11.8728 21.8588 11.9339 21.8903 12.0087L22.3344 13.2389C22.3461 13.2727 22.3654 13.3033 22.3907 13.3285C22.4161 13.3537 22.4468 13.3728 22.4806 13.3843C22.5144 13.3959 22.5504 13.3996 22.5859 13.3952C22.6213 13.3908 22.6553 13.3783 22.6852 13.3588L25.0923 11.9998C25.1657 11.9648 25.2483 11.9541 25.3282 11.9693C25.4081 11.9844 25.481 12.0247 25.5364 12.0842L25.7318 12.3151C25.7571 12.343 25.7755 12.3764 25.7857 12.4125C25.796 12.4487 25.7977 12.4867 25.7909 12.5237C25.784 12.5607 25.7687 12.5955 25.7461 12.6256C25.7235 12.6557 25.6943 12.6801 25.6608 12.6971L22.1301 14.6689Z" fill="#F4BC49"/>
<path d="M34.9603 28.4941L22.2366 21.4416L22.9161 20.4024L35.6886 27.3882L34.9603 28.4941Z" fill="#818698"/>
<path d="M19.7984 21.6903L16.0413 19.5763L18.2085 16.2677L22.0101 18.3106L19.7984 21.6903Z" fill="#818698"/>
<path d="M30.7144 34.9825L18.2483 27.5348L18.9278 26.4911L31.4383 33.8722L30.7144 34.9825Z" fill="#818698"/>
<path d="M15.8415 27.7302L12.1643 25.5008L14.3316 22.1877L18.0576 24.3505L15.8415 27.7302Z" fill="#818698"/>
<path d="M26.4691 41.4665L14.2605 33.6279L14.94 32.5843L27.193 40.3562L26.4691 41.4665Z" fill="#818698"/>
<path d="M11.8888 33.7701L8.28711 31.4207L10.4544 28.1121L14.1005 30.3904L11.8888 33.7701Z" fill="#818698"/>
</g>
<defs>
<clipPath id="clip0">
<rect width="53" height="53" fill="white"/>
</clipPath>
</defs>
</svg>

source/_static/images/home/Overview.svg METASEP
<svg width="55" height="54" viewBox="0 0 55 54" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M48.5861 5.50645C44.7619 1.83368 40.348 0 35.3392 0C30.3304 0 25.9166 1.83368 22.0924 5.50645C18.7279 8.94663 16.8942 12.9439 16.5859 17.493C16.283 22.042 17.5433 26.2287 20.3723 30.0529L17.5055 32.9197L21.1782 36.5925L24.0451 33.7257C27.8693 36.4789 32.0343 37.723 36.5455 37.4525C41.0566 37.1875 45.0702 35.37 48.5861 32.0056C52.2588 28.1759 54.0925 23.7621 54.0925 18.7533C54.0925 13.7445 52.2588 9.33067 48.5861 5.50645Z" fill="#B3B3B3"/>
<path d="M46.1198 7.9135C43.253 5.00882 39.6397 3.51591 35.28 3.44019C30.996 3.51591 27.4043 5.00882 24.4996 7.9135C21.595 10.8182 20.1021 14.4152 20.0263 18.6938C20.1021 23.0535 21.595 26.6668 24.4996 29.5336C27.4043 32.4004 31.0014 33.9096 35.28 34.0664C39.6397 33.915 43.253 32.4058 46.1198 29.5336C48.9866 26.6668 50.4957 23.0535 50.6526 18.6938C50.5011 14.4152 48.9866 10.8236 46.1198 7.9135Z" fill="#F2F2F2"/>
<path d="M45.6056 27.8731C42.4738 30.8535 38.8767 32.3464 34.8253 32.3464C30.7739 32.3464 27.1823 30.8535 24.045 27.8731C22.3628 26.1909 21.1403 24.2815 20.3722 22.1395C20.9835 24.9685 22.3628 27.4945 24.4994 29.7122C27.6366 32.6926 31.2499 34.1855 35.3392 34.1855C39.4285 34.1855 43.0417 32.6926 46.179 29.7122C48.321 27.4945 49.6949 24.9739 50.3061 22.1395C50.9228 19.3105 50.728 16.5141 49.7328 13.7662C50.2683 16.2166 50.1925 18.6777 49.5056 21.1659C48.8186 23.6486 47.515 25.8826 45.6056 27.8731Z" fill="#999999"/>
<path d="M4.71309 53.853C5.6705 54.1181 6.37368 54.0261 6.83345 53.5663L21.8599 37.2742C22.3197 36.8144 22.509 36.2248 22.4333 35.4946C22.3575 34.7698 21.8978 33.9476 21.0593 33.028C20.1398 32.1896 19.323 31.7082 18.5928 31.5946C17.868 31.481 17.273 31.692 16.8132 32.2275L0.412868 47.2539C-0.0469036 47.7137 -0.122635 48.4007 0.185684 49.3202C0.494001 50.2398 1.06736 51.1539 1.90577 52.0734C2.82532 52.993 3.76109 53.5826 4.71309 53.853Z" fill="#FFBC1F"/>
<path d="M3.73942 44.1597L9.81923 50.3531L17.2729 42.3206L11.7719 36.8196L3.73942 44.1597Z" fill="#954D0E"/>
</svg>

source/_static/images/home/Integrate-Extend.svg METASEP
<svg width="61" height="56" viewBox="0 0 61 56" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M6.82611 14.5417C7.51031 14.5059 8.00048 15.0676 7.90857 15.7824L7.25501 20.9803C7.1631 21.6951 6.55549 22.1189 5.90193 21.9146L1.04107 20.4186C0.387507 20.2195 -0.0771344 19.4689 0.0147727 18.7541L0.341553 16.1551C0.433461 15.4403 1.0666 14.8276 1.7508 14.797L6.82611 14.5417Z" fill="#546266"/>
<path d="M6.85113 25.3816C7.31067 24.871 8.05103 24.9221 8.49525 25.4939L11.712 29.6298C12.1562 30.1965 12.0184 30.9267 11.4159 31.2483L6.91751 33.6277C6.3099 33.9494 5.45721 33.7452 5.01299 33.1784L3.40462 31.1105C2.9604 30.5437 2.97572 29.6604 3.43525 29.1549L6.85113 25.3816Z" fill="#546266"/>
<path d="M14.5417 33.0252C14.5059 32.341 15.0676 31.8559 15.7824 31.9427L20.9803 32.5912C21.6951 32.6831 22.1138 33.2907 21.9146 33.9443L20.4186 38.8051C20.2144 39.4587 19.4689 39.9233 18.7541 39.8314L16.1551 39.5046C15.4403 39.4178 14.8276 38.7847 14.797 38.1005L14.5417 33.0252Z" fill="#546266"/>
<path d="M25.3808 32.9946C24.8753 32.535 24.9212 31.7947 25.4931 31.3556L29.6289 28.1388C30.2008 27.6946 30.9258 27.8325 31.2475 28.435L33.6269 32.9282C33.9486 33.5358 33.7443 34.3936 33.1776 34.8327L31.1097 36.4411C30.5429 36.8853 29.6596 36.87 29.1541 36.4104L25.3808 32.9946Z" fill="#546266"/>
<path d="M33.0246 25.3101C32.3404 25.3459 31.8554 24.7842 31.9422 24.0694L32.5957 18.8715C32.6876 18.1567 33.2953 17.738 33.9488 17.9371L38.8097 19.4332C39.4632 19.6323 39.9279 20.3829 39.836 21.0977L39.5092 23.6967C39.4173 24.4115 38.7842 25.0242 38.1 25.0548L33.0246 25.3101Z" fill="#546266"/>
<path d="M32.999 14.4702C32.5395 14.9757 31.7991 14.9298 31.36 14.3579L28.1433 10.2221C27.6991 9.65534 27.8369 8.92519 28.4394 8.60351L32.9378 6.22414C33.5454 5.90247 34.4032 6.1067 34.8423 6.67346L36.4506 8.74137C36.8949 9.30813 36.8795 10.1915 36.42 10.697L32.999 14.4702Z" fill="#546266"/>
<path d="M25.31 6.8266C25.3458 7.51079 24.7841 7.99586 24.0693 7.90906L18.8714 7.2555C18.1566 7.16359 17.7379 6.55598 17.937 5.90242L19.4331 1.04156C19.6322 0.387995 20.3828 -0.0766461 21.0976 0.015261L23.6965 0.342042C24.4114 0.428843 25.0241 1.06709 25.0547 1.75128L25.31 6.8266Z" fill="#546266"/>
<path d="M14.4693 6.85213C14.9748 7.31167 14.9288 8.05203 14.3569 8.49114L10.2211 11.7079C9.65436 12.147 8.92421 12.0142 8.60254 11.4117L6.22316 6.91851C5.90149 6.3109 6.10573 5.4531 6.67249 5.01399L8.7404 3.40562C9.30716 2.9614 10.1905 2.97672 10.696 3.44136L14.4693 6.85213Z" fill="#546266"/>
<path d="M22.5976 29.6604C17.221 31.1361 11.6658 27.9755 10.1851 22.5989C8.70943 17.2224 11.87 11.6671 17.2466 10.1864C22.6231 8.71074 28.1784 11.8713 29.6591 17.2479C31.1399 22.6296 27.9742 28.1848 22.5976 29.6604ZM15.6791 4.46259C7.1368 6.80622 2.11765 15.6344 4.46128 24.1715C6.80491 32.7087 15.6331 37.7329 24.1702 35.3842C32.7074 33.0406 37.7316 24.2124 35.388 15.6753C33.0444 7.1381 24.2162 2.11896 15.6791 4.46259Z" fill="#546266"/>
<path d="M21.1837 24.5085C18.6512 25.2029 16.0369 23.7171 15.3425 21.1845C14.6481 18.652 16.134 16.0377 18.6665 15.3433C21.1991 14.6489 23.8133 16.1348 24.5077 18.6673C25.2021 21.1948 23.7163 23.8141 21.1837 24.5085ZM16.6241 7.89886C9.98128 9.72169 6.07523 16.5892 7.89806 23.2269C9.72088 29.8698 16.5884 33.7758 23.2312 31.953C29.8741 30.1302 33.7801 23.2627 31.9522 16.6249C30.1243 9.9872 23.267 6.07604 16.6241 7.89886Z" fill="#AABBC1"/>
<path d="M21.1841 24.5085C18.6515 25.2029 16.0373 23.717 15.3428 21.1845C14.6484 18.6519 16.1343 16.0377 18.6668 15.3433C21.1994 14.6489 23.8136 16.1347 24.508 18.6673C25.2024 21.1947 23.7166 23.8141 21.1841 24.5085ZM17.4108 10.7632C12.3508 12.1521 9.37399 17.3806 10.7628 22.4457C12.1516 27.5057 17.3801 30.4824 22.4452 29.0936C27.5052 27.6997 30.4769 22.4661 29.0881 17.4061C27.6992 12.3461 22.4707 9.37443 17.4108 10.7632Z" fill="#546266"/>
<path d="M35.2305 36.87C35.7462 36.8445 36.1087 37.2632 36.0424 37.7993L35.5522 41.7002C35.4858 42.2363 35.0263 42.5529 34.5361 42.3997L30.8905 41.2764C30.4003 41.1233 30.0531 40.5616 30.1195 40.0255L30.3645 38.075C30.4309 37.5389 30.9058 37.0793 31.4215 37.0538L35.2305 36.87Z" fill="#546266"/>
<path d="M35.2512 44.9987C35.5984 44.6158 36.1498 44.6566 36.4817 45.0804L38.8917 48.1848C39.2236 48.6137 39.1215 49.1601 38.6671 49.4L35.2971 51.1871C34.8427 51.4271 34.1994 51.2739 33.8675 50.8501L32.6625 49.2979C32.3306 48.869 32.3408 48.2104 32.688 47.8274L35.2512 44.9987Z" fill="#546266"/>
<path d="M41.0158 50.7327C40.9902 50.217 41.4089 49.8545 41.945 49.9209L45.846 50.411C46.3821 50.4774 46.6987 50.9369 46.5455 51.4271L45.4222 55.0728C45.269 55.5629 44.7074 55.9101 44.1712 55.8438L42.2208 55.5987C41.6846 55.5323 41.2251 55.0574 41.1996 54.5417L41.0158 50.7327Z" fill="#546266"/>
<path d="M49.1499 50.7123C48.767 50.3651 48.8078 49.8137 49.2316 49.4818L52.336 47.0718C52.7649 46.7399 53.3112 46.842 53.5512 47.2964L55.3383 50.6664C55.5783 51.1208 55.4251 51.7641 55.0013 52.096L53.4491 53.301C53.0202 53.6329 52.3615 53.6227 51.9786 53.2755L49.1499 50.7123Z" fill="#546266"/>
<path d="M54.8838 44.9476C54.3732 44.9732 54.0056 44.5545 54.072 44.0184L54.5621 40.1174C54.6285 39.5813 55.088 39.2647 55.5782 39.4179L59.2239 40.5412C59.714 40.6893 60.0612 41.256 59.9949 41.7922L59.7498 43.7426C59.6834 44.2788 59.2085 44.7383 58.6928 44.7638L54.8838 44.9476Z" fill="#546266"/>
<path d="M54.8582 36.8138C54.511 37.1968 53.9595 37.1559 53.6276 36.7321L51.2176 33.6277C50.8858 33.1988 50.9879 32.6576 51.4423 32.4125L54.8122 30.6254C55.2667 30.3854 55.91 30.5386 56.2419 30.9624L57.4469 32.5146C57.7788 32.9384 57.7686 33.6022 57.4214 33.98L54.8582 36.8138Z" fill="#546266"/>
<path d="M49.0977 31.0799C49.1232 31.5956 48.7045 31.9581 48.1684 31.8917L44.2674 31.4016C43.7313 31.3352 43.4147 30.8756 43.5679 30.3855L44.6912 26.7398C44.8444 26.2497 45.4061 25.9025 45.9422 25.9688L47.8927 26.2139C48.4288 26.2803 48.8883 26.7551 48.9139 27.2708L49.0977 31.0799Z" fill="#546266"/>
<path d="M40.9642 31.1054C41.3471 31.4526 41.3063 32.004 40.8825 32.3359L37.778 34.7459C37.3491 35.0778 36.8079 34.9757 36.5628 34.5213L34.7809 31.1513C34.5409 30.6969 34.6941 30.0536 35.1178 29.7217L36.6701 28.5167C37.099 28.1848 37.7576 28.195 38.1355 28.5422L40.9642 31.1054Z" fill="#546266"/>
<path d="M47.0615 48.2103C43.0278 49.3183 38.8614 46.9441 37.7534 42.9155C36.6454 38.8818 39.0145 34.7153 43.0482 33.6073C47.0819 32.4993 51.2484 34.8736 52.3564 38.9022C53.4695 42.9308 51.0952 47.1023 47.0615 48.2103ZM41.8739 29.3081C35.471 31.0697 31.7028 37.687 33.4644 44.0898C35.2259 50.4927 41.8432 54.2609 48.2461 52.4993C54.649 50.7378 58.4171 44.1205 56.6556 37.7176C54.894 31.3148 48.2767 27.5517 41.8739 29.3081Z" fill="#546266"/>
<path d="M45.9986 44.3401C44.0992 44.8609 42.1385 43.7478 41.6177 41.8484C41.0969 39.9489 42.21 37.9883 44.1094 37.4674C46.0088 36.9466 47.9695 38.0597 48.4903 39.9592C49.0162 41.8586 47.898 43.8192 45.9986 44.3401ZM42.5776 31.8866C37.5942 33.255 34.6685 38.4018 36.0369 43.3852C37.4053 48.3687 42.5521 51.2944 47.5355 49.926C52.5189 48.5576 55.4446 43.4108 54.0762 38.4274C52.7078 33.4491 47.561 30.5183 42.5776 31.8866Z" fill="#AABBC1"/>
<path d="M45.999 44.34C44.0996 44.8609 42.1389 43.7478 41.6181 41.8483C41.0973 39.9489 42.2104 37.9882 44.1098 37.4674C46.0092 36.9466 47.9699 38.0597 48.4907 39.9591C49.0166 41.8586 47.8984 43.8192 45.999 44.34ZM43.1703 34.0362C39.3766 35.0779 37.1453 38.9992 38.1869 42.7981C39.2285 46.5918 43.1499 48.8231 46.9487 47.7815C50.7424 46.7398 52.9737 42.8185 51.9321 39.0197C50.8854 35.2208 46.964 32.9895 43.1703 34.0362Z" fill="#546266"/>
</svg>

source/_static/images/home/Hero_Stipple_Bottom.png METASEP

source/_static/images/home/Help.svg METASEP
<svg width="50" height="50" viewBox="0 0 50 50" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M49.9992 25.0004C49.9992 38.8085 38.8077 50 24.9996 50C11.1915 50 0 38.8085 0 25.0004C0 13.0034 8.45483 2.9778 19.7265 0.557044L20.434 0.570393L20.9413 0.330098C21.3507 0.26335 21.7601 0.205501 22.1739 0.161002L23.0505 0.187701L23.6602 0.0364041C23.7803 0.0319541 23.896 0.0230543 24.0162 0.0186044L24.9996 0.156552L25.6493 0.00970459C25.7739 0.0141545 25.8985 0.0186044 26.0231 0.0230543L27.3937 0.370147L29.0134 0.325648C29.2048 0.356798 29.3961 0.387947 29.5875 0.423546L35.5192 4.20152L41.9894 6.66232C46.9154 11.2235 49.9992 17.7515 49.9992 25.0004Z" fill="#1C58D9"/>
<path d="M26.2145 7.88967C27.8431 8.41031 27.7764 7.38238 28.8043 8.5794C29.3961 9.26469 30.4641 10.524 31.7324 10.8355C31.9103 10.88 32.3064 10.5018 32.3064 10.1947C32.3064 9.89213 31.4298 9.25134 30.9269 9.11784C30.4196 8.9799 31.1272 8.04097 30.4552 7.75617C29.7833 7.46693 29.0402 6.3945 28.7732 5.55346C28.5017 4.71243 27.3225 5.41997 26.922 5.25087C26.5171 5.08177 26.0142 5.18412 25.5781 5.82491C25.1376 6.46125 25.7962 7.75617 26.2145 7.88967Z" fill="#FFBC1F"/>
<path d="M35.0341 31.4386C35.0163 31.0871 31.8124 29.3338 31.4208 29.3116C30.78 29.276 29.9078 28.9511 29.3204 29.2938C29.0668 29.4362 28.8621 29.632 28.7019 29.8722C28.5906 30.0814 27.9676 29.6898 27.7229 29.8188C27.1444 30.1259 26.8151 29.1247 26.9798 28.742C27.3803 27.803 25.9563 28.3993 25.8094 28.1412C25.983 28.4438 25.7605 25.4668 25.2621 27.1489C24.8839 28.4216 23.402 26.962 23.58 26.0364C23.8559 24.608 26.0097 24.3989 26.4814 24.6525C26.7217 24.7771 27.5938 26.0498 27.7051 26.0142C27.9454 25.9385 27.5627 24.519 27.5138 24.3277C27.3402 23.6379 28.6707 23.4021 28.7642 22.6812C28.8443 22.0671 29.2581 22.2807 29.672 21.9514C30.2727 21.4753 29.8055 20.5897 30.5753 20.1314C30.8378 19.9756 31.8168 19.8644 31.9459 19.5885C32.066 19.3393 31.1182 18.6496 31.9325 18.4538C32.6623 18.2758 33.4099 18.5917 33.6057 17.5371C33.7837 16.5804 32.729 16.3623 32.4087 15.6192C32.3108 15.3967 32.1906 14.1151 31.7367 14.351C31.176 14.6446 30.8289 15.3522 30.375 14.5112C29.5518 12.9937 27.5138 12.3396 28.4705 14.7247C28.9644 15.9574 27.1222 19.7042 26.8552 16.2377C26.7617 15.0362 23.1617 14.6713 24.3721 13.3408C25.6003 11.9881 27.2779 11.9391 27.7318 9.86544C28.3637 6.98635 26.3701 9.4338 25.3511 8.87756C23.8292 8.04543 25.1197 8.49487 24.3321 9.5762C24.0339 9.98559 23.0549 9.3181 22.6188 9.3804C22.2139 9.4427 21.1771 10.3327 20.9012 9.77645C20.3894 8.75742 16.8206 8.12998 15.8505 8.49042C13.8392 9.24691 13.1361 8.22343 11.1247 7.82738C10.4261 7.68944 6.99966 7.59154 7.22215 8.77967C7.31115 9.24691 7.64044 9.6118 7.78284 10.0523C7.99644 10.7065 7.01301 10.2036 6.79051 10.3638C6.73266 10.4083 7.94749 11.2627 8.04539 11.3651C8.37468 11.6988 6.78161 12.1082 6.62586 12.6689C6.30547 13.8125 8.80632 13.4832 8.34798 14.8538C8.21003 15.2721 6.77716 15.9529 6.63921 17.3502C6.61251 17.6172 8.41918 15.6147 9.58506 16.0375C10.6174 16.4113 10.524 13.6123 11.8056 13.6123C14.1907 13.6123 14.6491 15.9351 15.9084 17.4926C16.4958 18.2179 16.9675 18.5205 17.0698 19.4684C17.1677 20.3539 16.9764 21.4263 17.2968 22.2673C17.6038 23.0728 18.2268 23.1262 18.6362 23.7759C19.1257 24.5413 19.4016 25.2844 20.0646 25.943C21.0258 26.9086 22.6678 28.386 24.1763 28.159C24.4745 28.1145 25.6003 28.7553 25.8539 28.9467C26.25 29.2448 26.4502 29.6942 26.735 30.0769C27.002 30.4329 27.843 30.2104 28.2168 30.3795C28.5461 30.5308 27.358 33.0317 27.803 33.6903C28.288 34.4156 28.288 35.2255 29.0178 35.7951C29.7076 36.3335 29.9123 36.378 30.0012 37.3125C30.1392 38.8344 29.6942 40.374 29.3293 41.7936C29.138 42.5233 29.5207 43.3288 29.2403 44.023C28.8843 44.8951 28.644 45.6383 28.9555 46.6039C29.494 48.2815 32.5155 48.5574 30.7221 47.0934C29.9612 46.4704 31.5454 44.9663 31.0514 44.8195C30.2015 44.4635 31.2072 44.1431 31.3184 43.7738C31.5409 43.0395 34.9139 40.0002 35.1631 39.4974C35.3723 39.0747 35.2388 38.6386 35.5814 38.2737C35.9597 37.8687 36.4848 38.0111 36.912 37.7263C37.8019 37.1301 37.4816 36.1199 37.8464 35.2967C38.5762 33.6636 38.8833 34.3088 37.8865 33.0361C37.5216 32.5867 35.1009 32.7558 35.0341 31.4386Z" fill="#FFBC1F"/>
<path d="M17.0119 6.72826C17.626 7.36904 18.2312 6.39006 18.3335 6.72826C18.4359 7.06645 18.4492 7.70279 19.1835 7.75174C19.9177 7.80514 18.5026 8.27238 18.9743 8.47707C19.446 8.67732 20.4561 9.31811 20.8255 9.05111C21.1948 8.77967 21.6354 8.57942 21.8 8.77967C21.9691 8.98436 22.9792 8.74852 22.69 8.41032C22.4052 8.07213 21.6309 7.2756 21.6621 6.81725C21.6977 6.35891 22.5743 5.17969 21.5953 5.28203C20.959 5.34878 20.821 5.92282 20.821 6.26102C20.821 6.59921 19.9132 5.75818 19.7441 5.77153C19.5751 5.78932 18.9343 4.74805 18.7029 4.74805C18.467 4.74805 16.8829 4.24076 17.0208 4.74805C17.1588 5.25089 16.3978 6.09192 17.0119 6.72826Z" fill="#FFBC1F"/>
<path d="M31.1271 11.5431C30.651 11.2716 29.7476 10.0301 29.3427 10.4306C28.9378 10.8355 29.4451 11.7433 29.7788 12.1483C30.117 12.5532 31.5321 13.4298 31.3274 13.0249C31.1271 12.6244 32.0705 12.0815 31.1271 11.5431Z" fill="#FFBC1F"/>
<path d="M17.9421 2.98145C18.1913 2.9592 18.5695 3.80914 18.9299 3.90258C19.2904 3.99158 19.4684 4.41877 19.6019 4.52112C19.7398 4.62347 21.2395 4.04053 21.5999 3.90258C22.0182 3.74684 21.1505 2.93695 20.8612 2.35401C20.5675 1.77107 20.7945 3.31964 20.3673 3.066C19.9401 2.81235 20.0068 2.46526 19.4906 2.46526C18.9744 2.46526 19.3349 1.41063 18.6808 1.63313C18.0266 1.86007 17.6973 3.0037 17.9421 2.98145Z" fill="#FFBC1F"/>
<path d="M23.3486 5.00171C22.9081 5.09071 22.9882 5.3844 22.7434 5.62914C22.4987 5.87834 22.5209 6.21208 22.7434 6.50578C22.9704 6.79947 23.3264 7.31121 23.5978 6.81727C23.8693 6.32333 23.5978 5.92284 23.5978 5.6069C23.5978 5.2954 23.5667 4.95721 23.3486 5.00171Z" fill="#FFBC1F"/>
<path d="M24.2476 6.57252C24.3588 6.84397 24.5635 6.10083 24.9996 5.71814C25.4357 5.33545 24.786 4.37427 24.3811 4.86376C24.1097 5.20195 24.1364 6.30108 24.2476 6.57252Z" fill="#FFBC1F"/>
<path d="M24.1674 6.91065C23.9315 7.23995 23.7491 8.12103 24.1674 8.18778C24.5857 8.25897 24.8393 7.78283 24.6569 7.44464C24.47 7.1109 24.2653 6.77271 24.1674 6.91065Z" fill="#FFBC1F"/>
<path d="M25.8629 1.23254C25.458 1.41498 26.4459 1.74873 25.7739 1.93117C25.0975 2.10917 25.0753 2.67431 24.4924 2.19817C23.9094 1.72648 23.2731 2.35392 23.7136 2.64761C24.1542 2.9413 24.8973 3.63549 24.875 4.01818C24.8528 4.40087 25.5692 4.57887 26.2456 4.53437C26.9176 4.48987 27.7274 4.69012 27.7497 4.40087C27.7719 4.10718 27.852 3.98703 27.7719 3.77344C27.6562 3.45749 27.367 3.146 26.6728 3.41299C25.9742 3.68444 25.5247 3.54649 25.4268 3.21275C25.3245 2.87011 26.7885 2.21597 27.4337 2.66986C28.0834 3.1193 28.6931 2.42066 28.2214 2.10917C27.7497 1.79323 28.0656 1.45948 28.3905 1.41498C28.6263 1.38383 28.8399 0.787546 29.0135 0.324755C28.0345 0.169009 27.0377 0.0666605 26.0231 0.0266113C26.0276 0.654049 26.2634 1.05454 25.8629 1.23254Z" fill="#FFBC1F"/>
<path d="M19.8955 0.671928C20.3449 0.863274 21.0792 0.667478 20.9412 0.329285C20.5363 0.396033 20.1313 0.471682 19.7308 0.55623C19.7664 0.600729 19.8198 0.640779 19.8955 0.671928Z" fill="#FFBC1F"/>
<path d="M20.1715 1.02795C19.5396 0.703102 19.5752 1.49964 19.8645 1.81558C20.1582 2.12707 20.9903 1.45069 20.1715 1.02795Z" fill="#FFBC1F"/>
<path d="M24.0162 0.0177996C24.4879 0.106798 24.7994 0.471691 24.8751 0.743135C24.9596 1.02793 25.6405 0.409392 25.6494 0.00444991C25.4358 0.00444991 25.2177 0 24.9997 0C24.6704 0 24.3455 0.00444991 24.0162 0.0177996Z" fill="#FFBC1F"/>
<path d="M22.6945 0.952326C22.4097 1.34392 22.6545 1.82006 22.9927 1.42402C23.3309 1.02797 23.0594 0.0400944 23.3309 0.467286C23.5979 0.894477 24.0963 1.57086 24.43 1.60201C24.7637 1.63316 24.4745 1.20597 24.43 0.849978C24.3944 0.551834 23.589 0.155792 23.6602 0.0356445C23.1618 0.062344 22.6678 0.102393 22.1783 0.155792C22.5299 0.387187 22.8992 0.671982 22.6945 0.952326Z" fill="#FFBC1F"/>
<path d="M24.1675 4.32533C24.5635 4.48108 24.1675 3.5199 24.1675 3.5199C23.7536 3.76909 23.7759 4.16959 24.1675 4.32533Z" fill="#FFBC1F"/>
<path d="M22.7435 3.6979C22.8103 3.96934 23.2374 4.05834 23.4644 3.6979C23.6869 3.33746 23.451 2.02918 23.144 2.43857C22.8236 2.86577 22.4543 2.66552 21.8046 2.43857C21.1504 2.21608 22.6768 3.4309 22.7435 3.6979Z" fill="#FFBC1F"/>
<path d="M27.14 26.6417C27.6962 26.5749 28.0166 27.2469 28.6529 27.2157C29.2937 27.1846 30.2193 28.128 30.7577 27.5717C31.1938 27.1178 28.8398 26.7485 28.0655 26.3435C27.2913 25.9386 26.5837 26.7084 27.14 26.6417Z" fill="#FFBC1F"/>
<path d="M29.8813 1.34386C30.6556 1.7132 30.5221 1.7043 30.0504 2.06029C29.5787 2.42073 29.7478 3.20837 30.7935 3.15052C31.8348 3.09712 32.4756 2.06029 32.9473 3.51986C33.419 4.97943 33.0808 6.57695 33.6904 7.02194C34.2956 7.47138 33.7927 7.77398 33.6904 8.19672C33.588 8.61501 33.8595 8.9176 34.3312 8.78411C34.8029 8.65061 34.6694 9.52724 34.3312 9.89658C33.993 10.2659 33.5925 10.9735 34.6338 12.2506C35.6751 13.5277 35.8086 13.3631 36.1467 13.7992C36.4849 14.2352 36.7519 13.639 36.8543 13.1272C36.9566 12.6199 36.6184 10.84 37.7977 10.84C38.9769 10.8355 39.3106 9.89213 39.4486 9.58954C39.5821 9.28695 40.5255 9.32255 41.0283 8.882C41.4777 8.49486 41.9761 8.16557 41.9895 6.65705C38.5942 3.51096 34.3223 1.29491 29.5876 0.418274C29.4941 0.769817 29.4986 1.16141 29.8813 1.34386Z" fill="#FFBC1F"/>
</svg>

source/_static/images/home/Deploy.svg METASEP
<svg width="53" height="60" viewBox="0 0 53 60" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M15.9362 31.2786L14.1097 31.7809C14.1097 31.7809 8.72155 30.137 5.06858 34.3379L2.32886 31.9179C2.32886 31.9179 8.35626 17.6713 19.3152 17.6256C20.0001 17.6256 21.1416 17.8539 21.6896 17.9452C21.8722 17.9909 22.0092 17.9909 22.0092 17.9909C19.1325 22.1918 17.306 26.758 16.1188 30.8676C16.0275 31.0046 15.9818 31.1416 15.9362 31.2786Z" fill="#C43133"/>
<path d="M27.7624 54.2466L24.9771 51.8265C28.63 47.6256 26.3469 42.5114 26.3469 42.5114L26.6209 40.6393C26.7579 40.5936 26.8949 40.5023 27.0318 40.4566C30.9588 38.7215 35.2054 36.3014 38.9953 32.9224C38.9953 32.9224 39.041 33.0137 39.0866 33.1963C39.2693 33.6986 39.6346 34.8402 39.7259 35.4794C41.0501 46.3927 27.7624 54.2466 27.7624 54.2466Z" fill="#C43133"/>
<path d="M15.9361 31.2785L14.1096 31.7808C15.6165 27.2146 17.9909 22.2374 21.6895 17.8995C21.8722 17.9452 22.0092 17.9452 22.0092 17.9452C19.1325 22.1461 17.306 26.7123 16.1188 30.8219C16.0274 31.0046 15.9818 31.1415 15.9361 31.2785Z" fill="#D1D3D4"/>
<path d="M39.0869 33.242C35.2513 37.4429 30.6394 40.4109 26.3015 42.5114L26.5755 40.6393C26.7125 40.5936 26.8495 40.5023 26.9864 40.4566C30.9134 38.7215 35.16 36.3014 38.9499 32.9224C38.9956 32.9224 39.0412 33.0594 39.0869 33.242Z" fill="#D1D3D4"/>
<path d="M42.1005 29.8174C41.1416 30.9132 40.0914 31.9635 38.9955 32.9224C35.2055 36.3014 30.9133 38.7215 27.032 40.4566C26.895 40.5023 26.758 40.5479 26.621 40.6393C26.0731 40.8676 25.5708 41.0959 25.0229 41.2785L15.5251 32.9224C15.6621 32.3744 15.7991 31.8265 15.9361 31.2785C15.9818 31.1416 16.0274 31.0046 16.0731 30.8219C17.2603 26.7123 19.1325 22.1461 21.9635 17.9452C22.7854 16.758 23.653 15.5708 24.6576 14.4749C29.6804 8.72146 36.2101 5.15982 41.7352 3.0137C47.9452 0.639269 52.8311 0 52.8311 0C52.8311 0 52.8311 4.93151 51.2329 11.4155C49.8174 17.169 47.1233 24.0639 42.1005 29.8174Z" fill="url(#paint0_linear)"/>
<path d="M51.2328 11.4155L41.7351 3.05936C47.9452 0.639269 52.831 0 52.831 0C52.831 0 52.831 4.93151 51.2328 11.4155Z" fill="#C43133"/>
<path d="M24.2466 42.1917L14.7489 33.8356C3.9726 38.1278 0 49.5433 0 49.5433C0 49.5433 2.69406 48.3105 5.02283 48.0822C2.37443 53.8812 0.136986 60 0.136986 60C0.136986 60 5.89041 56.9863 11.3242 53.6073C11.4155 55.9817 10.5479 58.8128 10.5479 58.8128C10.5479 58.8128 21.3699 53.4246 24.2466 42.1917Z" fill="#DD6400"/>
<path d="M22.1919 41.9634L15.2056 35.8447C7.30604 38.9954 3.69873 46.758 3.69873 46.758C3.69873 46.758 6.34713 46.4383 8.08229 46.3013C6.16448 50.5479 4.52065 55.0228 4.52065 55.0228C4.52065 55.0228 8.72156 52.831 12.6942 50.3196C12.7855 52.0548 12.8312 54.7488 12.8312 54.7488C12.8312 54.7488 20.0914 50.2283 22.1919 41.9634Z" fill="#E08F00"/>
<path d="M20.0914 41.8721L15.5709 37.8995C10.5024 39.9543 8.12793 44.9315 8.12793 44.9315C8.12793 44.9315 9.49779 44.4292 10.6393 44.3379C9.40647 47.0776 8.67588 50.274 8.67588 50.274C8.67588 50.274 11.7352 49.1324 14.338 47.5342C14.3836 48.6758 14.064 50.0913 14.064 50.0913C14.064 50.0913 18.7215 47.1689 20.0914 41.8721Z" fill="#FFBC1F"/>
<path d="M24.2465 42.1918L14.7488 33.8356L15.525 32.9224L25.0228 41.2785L24.2465 42.1918Z" fill="url(#paint1_linear)"/>
<path d="M27.032 40.4566C26.3471 40.7306 25.7078 41.0045 25.0685 41.2785L15.5251 32.9223C15.7078 32.2374 15.8904 31.5525 16.0731 30.8676L27.032 40.4566Z" fill="url(#paint2_linear)"/>
<path d="M39.041 21.1872C42.0672 21.1872 44.5204 18.7339 44.5204 15.7077C44.5204 12.6815 42.0672 10.2283 39.041 10.2283C36.0148 10.2283 33.5615 12.6815 33.5615 15.7077C33.5615 18.7339 36.0148 21.1872 39.041 21.1872Z" fill="#C43133"/>
<path d="M42.4657 18.7214C41.4155 19.9086 39.9086 20.4109 38.4474 20.2283C37.8082 20.1369 37.2145 19.9543 36.6666 19.589C36.4383 19.452 36.21 19.315 36.0273 19.1324C34.1095 17.4429 33.9269 14.5662 35.6164 12.694C36.7123 11.4611 38.3104 10.9589 39.8173 11.1872C40.4566 11.2785 41.0502 11.5068 41.5981 11.8721C41.7808 11.9634 41.9177 12.1004 42.1004 12.2374C43.9725 13.9269 44.1552 16.8493 42.4657 18.7214Z" fill="#32A4EC"/>
<path opacity="0.5" d="M38.4476 20.274C37.8083 20.1827 37.2147 20 36.6667 19.6347L39.8174 11.2329C40.4567 11.3242 41.0503 11.5525 41.5983 11.9178L38.4476 20.274Z" fill="white"/>
<path d="M29.9439 24.9962L14.4629 42.6365L15.5268 43.5702L31.0078 25.9299L29.9439 24.9962Z" fill="#C43133"/>
<path d="M31.0046 25.936L27.032 40.4566L25.0228 41.2785L24.2466 42.1917L20 38.4931L31.0046 25.936Z" fill="#E6E7E8"/>
<defs>
<linearGradient id="paint0_linear" x1="27.8426" y1="10.9023" x2="45.2702" y2="26.1967" gradientUnits="userSpaceOnUse">
<stop offset="0.5" stop-color="#D1D3D4"/>
</linearGradient>
<linearGradient id="paint1_linear" x1="15.1246" y1="33.3783" x2="24.6356" y2="41.725" gradientUnits="userSpaceOnUse">
<stop offset="0.5" stop-color="#808285"/>
</linearGradient>
<linearGradient id="paint2_linear" x1="15.4437" y1="31.5773" x2="26.38" y2="41.1749" gradientUnits="userSpaceOnUse">
<stop offset="0.5" stop-color="#A7A9AC"/>
</linearGradient>
</defs>
</svg>

source/_static/images/home/Contribute.svg METASEP
<svg width="51" height="59" viewBox="0 0 51 59" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M36.6653 30.7035L39.6324 28.2271L45.6403 27.9244L50.0051 32.3262C50.0051 27.0907 46.5378 23.8502 39.6324 25.8749C39.1959 26.0039 37.8178 26.0783 37.8178 26.0783L36.6653 30.7035Z" fill="#FFBC1F"/>
<path d="M47.5229 32.0781C47.5229 36.9712 36.1399 38.2565 32.6725 40.7179C31.2208 41.7501 28.7539 46.3604 28.7539 46.3604L48.9746 34.5147C48.9795 34.5147 47.5229 28.2718 47.5229 32.0781Z" fill="#FFBC1F"/>
<path d="M36.6649 32.4751L38.3569 32.0781C38.3569 32.0781 38.6413 30.4553 39.99 29.2345C41.7164 27.6763 47.5477 28.0187 47.5477 31.82C47.5477 38.0877 35.8458 40.0132 32.3785 42.4746C30.9268 43.5068 29.2593 46.7027 29.2593 46.7027C29.2593 46.7027 30.5197 46.9409 30.8042 46.7027C36.1107 42.2662 50.0096 40.4201 50.0096 32.1326C50.0096 29.1601 45.7379 25.4332 39.6369 27.6465C39.2151 27.8003 37.8223 27.8499 37.8223 27.8499L36.6649 32.4751Z" fill="#CC8F00"/>
<path d="M37.9892 22.1578H0V48.8962C0 50.375 0.42668 51.7447 1.15743 52.9059C2.67288 56.3698 10.0785 58.995 18.9946 58.995C27.9206 58.995 35.3311 56.3599 36.8367 52.896C37.5625 51.7397 37.9892 50.3651 37.9892 48.8962V22.1578Z" fill="#FFBC1F"/>
<path d="M18.9946 14.0986C29.485 14.0986 37.9892 17.6816 37.9892 22.1033C37.9892 26.5249 29.485 30.1079 18.9946 30.1079C8.50417 30.1079 0 26.5249 0 22.1033C0 17.6816 8.50417 14.0986 18.9946 14.0986Z" fill="#FFBC1F"/>
<path d="M18.9949 17.9794C27.7394 17.9794 35.0322 20.2423 36.7389 23.2596C36.9891 22.8229 37.1215 22.3713 37.1215 21.9048C37.1215 18.2424 29.0047 15.2698 18.9949 15.2698C8.98023 15.2698 0.868408 18.2424 0.868408 21.9048C0.868408 22.3713 1.00083 22.8229 1.24604 23.2596C2.96257 20.2423 10.2554 17.9794 18.9949 17.9794Z" fill="#CC8F00"/>
<path d="M18.995 29.1452C27.7395 29.1452 35.0323 26.6192 36.739 23.2546C35.0323 19.895 27.7395 17.369 18.995 17.369C10.2554 17.369 2.95772 19.895 1.24609 23.2546C2.96262 26.6192 10.2554 29.1452 18.995 29.1452Z" fill="#724E41"/>
<path d="M31.1626 21.2696C28.4848 18.1382 19.7992 19.5426 18.9949 21.1058C17.8914 19.4384 9.41662 18.1977 6.82712 21.2696C5.20377 23.2 8.95561 25.0163 12.7173 26.3264C15.0861 27.2395 12.7173 28.2717 12.7173 28.2717C22.1385 28.2717 28.7545 24.9071 28.7545 24.9071C30.9076 23.8104 32.2563 22.5499 31.1626 21.2696Z" fill="#8D6A54"/>
<path d="M26.7332 22.3713C25.1589 19.8602 19.3521 20.8875 18.7293 22.1232C18.1015 20.7882 12.5939 19.7213 10.7057 22.1381C9.52377 23.6516 11.8828 25.1305 14.281 26.2074C15.7866 26.9567 14.1633 27.7507 14.1633 27.7507C20.3673 27.845 24.9333 25.2347 24.9333 25.2347C26.4095 24.3861 27.3806 23.3985 26.7332 22.3713Z" fill="#B49166"/>
<path d="M24.0659 23.2794C23.0114 21.5971 19.1272 22.2869 18.7103 23.1157C18.2934 22.2224 14.6053 21.5078 13.34 23.1206C12.5455 24.133 14.1247 25.1255 15.7333 25.8451C16.7436 26.3463 15.6549 26.8773 15.6549 26.8773C19.8089 26.9368 22.8594 25.195 22.8594 25.195C23.8501 24.6292 24.4974 23.9692 24.0659 23.2794Z" fill="#FAF3D9"/>
<g opacity="0.6">
<path opacity="0.6" d="M20.0344 7.36942C17.1751 4.36706 19.078 0 19.078 0C19.078 0 13.0751 5.77643 16.8661 9.75641C21.2506 14.3617 19.078 17.23 19.078 17.23C19.078 17.23 24.512 12.0739 20.0344 7.36942Z" fill="#A6ADAF"/>
<path opacity="0.6" d="M11.4762 10.0592C9.33301 7.87563 10.7602 4.69958 10.7602 4.69958C10.7602 4.69958 6.25797 8.89792 9.1025 11.7961C12.3933 15.1458 10.7602 17.2301 10.7602 17.2301C10.7602 17.2301 14.8357 13.4833 11.4762 10.0592Z" fill="#A6ADAF"/>
<path opacity="0.6" d="M28.5038 10.0592C26.3606 7.87563 27.7878 4.69958 27.7878 4.69958C27.7878 4.69958 23.2856 8.89792 26.1301 11.7961C29.4209 15.1458 27.7878 17.2301 27.7878 17.2301C27.7878 17.2301 31.8633 13.4784 28.5038 10.0592Z" fill="#A6ADAF"/>
</g>
</svg>

source/_static/images/home/Channels.svg METASEP
<svg width="52" height="46" viewBox="0 0 52 46" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0)">
<path d="M26.1973 6.54942H47.2062C47.8354 6.54499 48.4594 6.66483 49.0422 6.90209C49.625 7.13934 50.1552 7.48933 50.6024 7.93197C51.0496 8.37461 51.4049 8.90119 51.6481 9.48149C51.8912 10.0618 52.0173 10.6844 52.0192 11.3135V33.0984C52.0167 33.7272 51.8901 34.3493 51.6467 34.929C51.4033 35.5087 51.0478 36.0347 50.6007 36.4769C50.1536 36.919 49.6236 37.2686 49.0411 37.5055C48.4586 37.7425 47.835 37.8622 47.2062 37.8577H42.1525V46.0385L34.5624 37.8577H26.1973C25.5685 37.8622 24.9449 37.7425 24.3624 37.5055C23.7799 37.2686 23.2499 36.919 22.8028 36.4769C22.3557 36.0347 22.0002 35.5087 21.7568 34.929C21.5134 34.3493 21.3868 33.7272 21.3843 33.0984V11.3135C21.3862 10.6844 21.5123 10.0618 21.7554 9.48149C21.9986 8.90119 22.3539 8.37461 22.8011 7.93197C23.2483 7.48933 23.7785 7.13934 24.3613 6.90209C24.9441 6.66483 25.5681 6.54499 26.1973 6.54942Z" fill="#1E325C"/>
<path d="M39.0434 6.36297e-07H4.77458C4.14533 -0.00443734 3.52141 0.11541 2.9386 0.352664C2.35579 0.589917 1.82557 0.939904 1.37839 1.38254C0.9312 1.82518 0.575843 2.35177 0.332704 2.93207C0.0895656 3.51236 -0.0365667 4.13494 -0.0384521 4.76409V26.5298C-0.0359346 27.1585 0.0906638 27.7806 0.334085 28.3603C0.577506 28.9401 0.932967 29.4661 1.38009 29.9082C1.82721 30.3503 2.35721 30.6999 2.9397 30.9369C3.52219 31.1738 4.14574 31.2935 4.77458 31.289H9.83308V39.4698L17.4232 31.289H39.0434C39.6722 31.2935 40.2957 31.1738 40.8782 30.9369C41.4607 30.6999 41.9907 30.3503 42.4379 29.9082C42.885 29.4661 43.2404 28.9401 43.4839 28.3603C43.7273 27.7806 43.8539 27.1585 43.8564 26.5298V4.76409C43.8545 4.13494 43.7284 3.51236 43.4852 2.93207C43.2421 2.35177 42.8868 1.82518 42.4396 1.38254C41.9924 0.939904 41.4622 0.589917 40.8794 0.352664C40.2965 0.11541 39.6726 -0.00443734 39.0434 6.36297e-07Z" fill="#FFBC1F"/>
<path d="M10.218 12.5358C10.8286 12.5349 11.4258 12.7151 11.9339 13.0537C12.442 13.3923 12.8381 13.874 13.0722 14.4378C13.3063 15.0016 13.3678 15.6223 13.2489 16.2211C13.1301 16.8199 12.8361 17.3699 12.4044 17.8016C11.9726 18.2333 11.4225 18.5272 10.8236 18.6461C10.2246 18.7649 9.60392 18.7034 9.03998 18.4694C8.47605 18.2353 7.99427 17.8392 7.65563 17.3312C7.317 16.8232 7.13675 16.2262 7.1377 15.6157C7.13897 14.7992 7.46392 14.0166 8.04132 13.4393C8.61872 12.862 9.40147 12.5371 10.218 12.5358Z" fill="white"/>
<path d="M21.9187 12.5358C22.5293 12.5349 23.1265 12.7151 23.6346 13.0537C24.1426 13.3923 24.5388 13.874 24.7729 14.4378C25.007 15.0016 25.0685 15.6223 24.9496 16.2211C24.8308 16.8199 24.5368 17.3699 24.1051 17.8016C23.6733 18.2333 23.1232 18.5272 22.5242 18.6461C21.9253 18.7649 21.3046 18.7034 20.7407 18.4694C20.1767 18.2353 19.695 17.8392 19.3563 17.3312C19.0177 16.8232 18.8374 16.2262 18.8384 15.6157C18.8397 14.7992 19.1646 14.0166 19.742 13.4393C20.3194 12.862 21.1022 12.5371 21.9187 12.5358Z" fill="white"/>
<path d="M33.6192 12.5358C34.2298 12.5349 34.8269 12.7151 35.335 13.0537C35.8431 13.3923 36.2393 13.874 36.4734 14.4378C36.7075 15.0016 36.769 15.6223 36.6501 16.2211C36.5312 16.8199 36.2373 17.3699 35.8055 17.8016C35.3737 18.2333 34.8236 18.5272 34.2247 18.6461C33.6258 18.7649 33.0051 18.7034 32.4411 18.4694C31.8772 18.2353 31.3954 17.8392 31.0568 17.3312C30.7181 16.8232 30.5379 16.2262 30.5388 15.6157C30.5401 14.7992 30.865 14.0166 31.4424 13.4393C32.0198 12.862 32.8026 12.5371 33.6192 12.5358Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0">
<rect width="52" height="46" fill="white"/>
</clipPath>
</defs>
</svg>

source/_static/images/home/Boards.svg METASEP
<svg width="47" height="47" viewBox="0 0 47 47" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0)">
<path d="M8.09798 8.65202C12.1221 4.60741 17.1903 2.52241 23.3026 2.39702C29.3564 2.52533 34.3953 4.61033 38.4194 8.65202C42.4436 12.6937 44.5492 17.7327 44.7364 23.769C44.5463 29.7995 42.4406 34.8385 38.4194 38.886C34.3982 42.9335 29.3593 45.0229 23.3026 45.1541C17.1874 45.0287 12.1192 42.9452 8.09798 38.9035C4.07677 34.8618 1.9711 29.8228 1.78101 23.7865C1.96525 17.7385 4.07092 12.6937 8.09798 8.65202Z" fill="white"/>
<path d="M35.4715 23.769C35.4295 26.9874 34.1368 30.064 31.8656 32.3511C30.751 33.4862 29.4181 34.3855 27.9467 34.995C26.4754 35.6046 24.8958 35.9118 23.3026 35.8985C19.8107 35.8372 16.9418 34.6548 14.6957 32.3511C12.4459 30.0459 11.1437 26.9841 11.0459 23.769C11.1073 20.3484 12.245 17.5169 14.4588 15.2745C16.6727 13.032 19.6206 11.8189 23.3026 11.6352C24.8954 11.593 26.4796 11.8824 27.954 12.4849C29.4284 13.0874 30.7606 13.9898 31.8656 15.1345C34.1324 17.4459 35.4231 20.5365 35.4715 23.769Z" fill="white"/>
<path d="M23.3026 47.0044C16.6902 46.8178 11.1848 44.5461 6.78634 40.1895C2.38786 35.8329 0.125754 30.3594 0 23.769C0.125754 17.2341 2.38786 11.7752 6.78634 7.39228C11.1848 3.00941 16.6902 0.724647 23.3026 0.538017C29.8564 0.721731 35.3311 3.00794 39.7267 7.39665C44.1222 11.7854 46.3844 17.2443 46.5131 23.7734C46.3873 30.3666 44.1252 35.8401 39.7267 40.1939C35.3282 44.5476 29.8535 46.8178 23.3026 47.0044ZM23.3026 4.91652C17.9361 5.10315 13.4762 6.95486 9.9229 10.4717C6.36961 13.9885 4.52864 18.4209 4.39996 23.769C4.52279 29.1171 6.36376 33.5641 9.9229 37.1101C13.482 40.6561 17.9419 42.4917 23.3026 42.6171C28.6048 42.4917 33.0354 40.6561 36.5946 37.1101C40.1537 33.5641 41.9932 29.1171 42.1131 23.769C41.9903 18.418 40.1508 13.9855 36.5946 10.4717C33.0383 6.95777 28.6077 5.10461 23.3026 4.91215V4.91652Z" fill="#FFBC1F"/>
<path d="M23.3026 37.7662C19.3106 37.6379 16.0045 36.2848 13.3841 33.707C10.7637 31.1292 9.39065 27.8165 9.26489 23.769C9.26489 19.8498 10.5604 16.5838 13.1516 13.971C15.7427 11.3581 19.0957 9.95842 23.2105 9.77179C27.2025 9.83303 30.5247 11.1861 33.1773 13.831C35.8298 16.4759 37.1868 19.7885 37.2482 23.769C37.1868 27.7495 35.8298 31.0461 33.1773 33.6589C30.5492 36.2602 27.0055 37.7342 23.3026 37.7662ZM23.4913 14.5308H23.3026C20.5565 14.6533 18.3104 15.5704 16.5645 17.2822C15.7011 18.1284 15.0289 19.1488 14.5931 20.2751C14.1574 21.4014 13.968 22.6075 14.0377 23.8127C14.0291 25.0277 14.265 26.2321 14.7314 27.3546C15.1978 28.477 15.8852 29.4948 16.7531 30.3477C17.8282 31.4251 19.1524 32.2225 20.6091 32.6698C22.0659 33.117 23.6105 33.2004 25.1072 32.9126C26.6038 32.6247 28.0066 31.9745 29.192 31.0191C30.3775 30.0637 31.3092 28.8324 31.9052 27.4336C32.5013 26.0348 32.7435 24.5113 32.6103 22.9973C32.4772 21.4833 31.9729 20.0251 31.1418 18.751C30.3107 17.477 29.1783 16.4262 27.8442 15.691C26.5101 14.9559 25.0153 14.559 23.4913 14.5352V14.5308Z" fill="#FFBC1F"/>
<path d="M20.5433 21.0964C21.2765 20.4049 22.2474 20.0195 23.2566 20.0195C24.2658 20.0195 25.2366 20.4049 25.9698 21.0964C26.6623 21.8095 27.0496 22.7632 27.0496 23.7559C27.0496 24.7485 26.6623 25.7023 25.9698 26.4154C25.2366 27.1069 24.2658 27.4923 23.2566 27.4923C22.2474 27.4923 21.2765 27.1069 20.5433 26.4154C19.8538 25.7007 19.4688 24.7475 19.4688 23.7559C19.4688 22.7642 19.8538 21.8111 20.5433 21.0964Z" fill="#FFBC1F"/>
<path d="M23.7939 24.1583C23.6572 24.2946 23.4718 24.3712 23.2785 24.3712C23.0851 24.3712 22.8998 24.2946 22.7631 24.1583C22.6264 24.022 22.5496 23.8371 22.5496 23.6444C22.5496 23.4516 22.6264 23.2667 22.7631 23.1304L25.6671 20.2391L26.6015 21.267L23.7939 24.1583Z" fill="#818698"/>
<path d="M46.9825 6.97236C47.2954 8.72201 44.3314 10.0342 38.0905 10.9091L29.0142 21.0789C28.8153 21.2872 28.5756 21.4526 28.31 21.5647C28.0444 21.6768 27.7585 21.7333 27.4701 21.7307C26.8738 21.7315 26.3014 21.4972 25.8777 21.0789C25.6567 20.8875 25.4797 20.6509 25.3586 20.3853C25.2375 20.1196 25.1752 19.8311 25.1758 19.5392C25.1826 18.9333 25.4156 18.3515 25.8294 17.9077L36.0331 8.94947C36.9104 2.72946 38.2265 -0.242029 39.9812 0.0349989C41.7359 0.312027 41.8909 2.49909 40.4462 6.59619C44.4937 5.10607 46.6725 5.23146 46.9825 6.97236Z" fill="#1E325C"/>
</g>
<defs>
<clipPath id="clip0">
<rect width="47" height="47" fill="white"/>
</clipPath>
</defs>
</svg>

source/_static/images/home/Admin-Guide.svg METASEP
<svg width="60" height="56" viewBox="0 0 60 56" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M34.6743 44.8918L29.7226 44.6449L25.3998 51.3434C24.1886 48.8373 24.2725 45.7768 25.8935 43.2661C27.5146 40.7553 30.2676 39.4184 33.0532 39.4929L44.163 22.2948C42.9519 19.784 43.0358 16.7235 44.6568 14.2128C46.2779 11.702 49.0309 10.3651 51.8165 10.4396L47.489 17.1428L49.7483 21.5494L54.6953 21.7963L59.0228 15.0932C60.2339 17.5993 60.1501 20.6597 58.5243 23.1705C56.9033 25.6813 54.1503 27.0182 51.3647 26.9483L40.2641 44.1418C41.4753 46.6526 41.3914 49.713 39.7703 52.2238C38.1493 54.7346 35.3963 56.0715 32.6107 55.997L36.9382 49.2985L34.6743 44.8918Z" fill="#808F95"/>
<path d="M34.6743 44.8918L29.7226 44.6449L25.3998 51.3434C24.1886 48.8373 24.2725 45.7768 25.8935 43.2661C27.5146 40.7553 30.2676 39.4184 33.0532 39.4929L44.163 22.2948C42.9519 19.784 43.0358 16.7235 44.6568 14.2128C46.2779 11.702 49.0309 10.3651 51.8165 10.4396L47.489 17.1428L49.7482 21.5494" fill="#AABBC1"/>
<path d="M31.3437 1.54717L9.03084 3.81106L5.50923 4.16975C2.9146 4.43061 2.50002 5.80478 2.73759 8.39475L5.97971 43.4385C6.21728 46.0285 6.80421 46.5083 9.39884 46.2474L12.9205 45.8887L35.238 43.6295C37.8326 43.3686 39.7425 41.0535 39.5049 38.4635L36.4817 5.76752C36.2395 3.17289 33.9383 1.28631 31.3437 1.54717Z" fill="#3D4247"/>
<path d="M29.6576 0.7461L7.4426 3.92766L3.93962 4.43075C1.35431 4.79875 0.995631 6.19156 1.34034 8.76755L5.98458 43.639C6.32463 46.215 6.93486 46.6715 9.51551 46.3035L13.0231 45.8004L35.2335 42.6188C37.8142 42.2508 39.6309 39.8611 39.2862 37.2805L34.954 4.74285C34.6093 2.16686 32.2383 0.378101 29.6576 0.7461Z" fill="#CFCFCF"/>
<path d="M28.1948 0.0752979L6.09619 4.03944L13.1021 45.6792L35.1961 41.7151C37.7627 41.2539 39.4956 38.8037 39.0671 36.2417L33.6263 3.88106C33.193 1.31904 30.7614 -0.385866 28.1948 0.0752979Z" fill="#1C58D9"/>
<path d="M2.61192 4.66351C0.0452456 5.12467 -0.271513 6.52214 0.161701 9.08881L5.99845 43.7692C6.43166 46.3359 7.05121 46.7691 9.61788 46.308L13.1069 45.6838L6.09627 4.03931L2.61192 4.66351Z" fill="#3D4247"/>
<path d="M28.9773 16.2254L15.2868 18.6802L14.3784 13.2627L28.0643 10.8079L28.9773 16.2254Z" fill="white"/>
</svg>

source/_static/images/badges/flag_icon_yellow.svg METASEP
<svg width="11" height="12" viewBox="0 0 11 12" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M5.772 1.78281L6.028 3.11081H9.5V7.11081H7.228L6.972 5.78281H2.172V1.78281H5.772ZM6.828 0.454812H0.828V11.7828H2.172V7.11081H5.9L6.172 8.45481H10.828V1.78281H7.1L6.828 0.454812Z" fill="#FFBC1F"/>
</svg>

source/_static/images/badges/flag_icon.svg METASEP
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8.306 3.50078L8.594 4.99478H12.5V9.49478H9.944L9.656 8.00078H4.256V3.50078H8.306ZM9.494 2.00678H2.744V14.7508H4.256V9.49478H8.45L8.756 11.0068H13.994V3.50078H9.8L9.494 2.00678Z" fill="#3F4350"/>
</svg>

source/_static/images/badges/deployment_icon_yellow.svg METASEP
<svg width="16" height="18" viewBox="0 0 16 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12 11.5V14H3.25V11.5H12ZM12.625 10.25H2.625C2.28125 10.25 2 10.5312 2 10.875V14.625C2 14.9688 2.28125 15.25 2.625 15.25H12.625C12.9688 15.25 13.25 14.9688 13.25 14.625V10.875C13.25 10.5312 12.9688 10.25 12.625 10.25ZM4.5 13.6875C3.9875 13.6875 3.5625 13.2688 3.5625 12.75C3.5625 12.2312 3.9875 11.8125 4.5 11.8125C5.0125 11.8125 5.4375 12.2312 5.4375 12.75C5.4375 13.2688 5.01875 13.6875 4.5 13.6875ZM12 5.25V7.75H3.25V5.25H12ZM12.625 4H2.625C2.28125 4 2 4.28125 2 4.625V8.375C2 8.71875 2.28125 9 2.625 9H12.625C12.9688 9 13.25 8.71875 13.25 8.375V4.625C13.25 4.28125 12.9688 4 12.625 4ZM4.5 7.4375C3.9875 7.4375 3.5625 7.01875 3.5625 6.5C3.5625 5.98125 3.9875 5.5625 4.5 5.5625C5.0125 5.5625 5.4375 5.9875 5.4375 6.5C5.4375 7.0125 5.01875 7.4375 4.5 7.4375Z" fill="#FFBC1F"/>
</svg>

source/_static/images/badges/deployment_icon.svg METASEP
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.994 4.25678V3.50078H3.5V4.25678H4.994ZM4.994 11.7448H3.5V12.5008H4.994V11.7448ZM10.25 3.50078V4.25678H6.506V3.50078H10.25ZM10.25 11.7448H6.506V12.5008H10.25V11.7448ZM15.506 2.00678C15.506 1.58678 15.356 1.23278 15.056 0.94478C14.768 0.644781 14.414 0.494781 13.994 0.494781H2.006C1.598 0.494781 1.244 0.644781 0.944 0.94478C0.644 1.23278 0.494 1.58678 0.494 2.00678V5.75078C0.494 6.15878 0.638 6.51278 0.926 6.81278C1.226 7.10078 1.586 7.24478 2.006 7.24478H13.994C14.414 7.24478 14.768 7.10078 15.056 6.81278C15.356 6.51278 15.506 6.15878 15.506 5.75078V2.00678ZM13.994 2.00678V5.75078H2.006V2.00678H13.994ZM15.506 10.2508V13.9948C15.506 14.4028 15.356 14.7568 15.056 15.0568C14.768 15.3568 14.414 15.5068 13.994 15.5068H2.006C1.598 15.5068 1.244 15.3568 0.944 15.0568C0.644 14.7568 0.494 14.4028 0.494 13.9948V10.2508C0.494 9.84278 0.638 9.49478 0.926 9.20678C1.226 8.90678 1.586 8.75678 2.006 8.75678H13.994C14.414 8.75678 14.768 8.90678 15.056 9.20678C15.356 9.49478 15.506 9.84278 15.506 10.2508ZM13.994 10.2508H2.006V13.9948H13.994V10.2508Z" fill="#3F4350"/>
</svg>

source/scripts/generate-certificates/gencert.sh METASEP
#!/bin/bash

umask 007

certname="${CRT_FILENAME:-"mattermost-x509"}"
openssl x509 \
    -in <(
        openssl req \
            -days 3650 \
            -newkey rsa:4096 \
            -nodes \
            -keyout "${certname}.key" \
            -subj "/C=${CRT_C:-"US"}/L=${CRT_L:-"Palo Alto"}/O=${CRT_O:-"Mattermost"}/OU=${CRT_OU:-"DevOps"}/CN=${CRT_CN:-"base.example.com"}"
        ) \
    -req \
    -signkey "${certname}.key" \
    -sha256 \
    -days 3650 \
    -out "${certname}.crt" \
    -extfile <(echo -e "basicConstraints=critical,CA:true,pathlen:0\nsubjectAltName=${CRT_SAN:-"DNS.1:logs.example.com,DNS.2:metrics.example.com,IP.1:192.168.0.1,IP.2:127.0.0.1"}")

chmod 600 ${certname}.crt

source/scripts/generate-certificates/gencert.md METASEP
<!---This documentation page is intentionally missing from the LHS. You can safely ignore related build warnings.--->

# gencert.sh for Mattermost

Generate a self-signed x509v3 certificate for use with multiple URLs / IPs.

## Generate Certificates

### Default values

```bash
CRT_CN="client.com" CRT_SAN="DNS.1:www.client.com,DNS.2:admin.client.com,IP.1:192.168.1.10,IP.2:10.0.0.234" gencert.sh
```

### Custom values

You may change the `CRT_CN` and `CRT_SAN` values of the above command based on your needs.

Additionally you may use any of the following environment variables :
 - `CRT_C` : Country value
 - `CRT_L` : Locality value
 - `CRT_O` : Organization value
 - `CRT_OU` : Organizational Unit value
 - `CRT_CN` : Common Name value
 - `CRT_SAN` : SubjectAltName value

### Result

The command will generate two files:
 - pkcs#8 private key : `mattermost-x509.key`
 - x509v3 certificate : `mattermost-x509.crt`

You can confirm the certificate content by using the following standard `x509` command:

```bash
openssl x509 -in mattermost-x509.crt -noout -text
```

## Secure/Unsecure Certificates

The generated private key is passwordless by default. 

You can secure/unsecure the certificates using standard `pkcs8` commands:

```bash
# secure
openssl pkcs8 -in mattermost-x509.key -topk8 -v2 des3 -out mattermost-x509.secure.key

# unsecure
openssl pkcs8 -in mattermost-x509.secure.key -topk8 -nocrypt -out mattermost-x509.key
```

## Additional Reading

Below are additional guides and documentation for optional reading:
 - [SubjectAltName page on wikipedia](https://en.wikipedia.org/wiki/SubjectAltName)

source/samples/incident-response-app/workflow_multiple.json METASEP
[
    {
        "name": "HighSeverity",
        "triggers": [
            {
                "name": "ServiceDown",
                "type": "text",
                "match": "DOWN",
                "team_name": "infosec",
                "channel_name": "alerts"
            }
        ],
        "steps": [
            {
                "name": "Open",
                "start_actions": [
                    {
                        "name": "CreateIncidentChannel",
                        "type": "create_channel",
                        "channel_name": "incident-s1-{{.Instance.Number}}",
                        "channel_displayname": "Incident S1 {{.Instance.Number}}"
                    },
                    {
                        "name": "AddIncidentAndServicesTeam",
                        "type": "add_users_channel",
                        "channel_name": "{{.Action.CreateIncidentChannel.ChannelName}}",
                        "users": [
                            "tester",
                            "tester2"
                        ]
                    },
                    {
                        "name": "IntroPost",
                        "type": "post",
                        "channel_name": "{{.Action.CreateIncidentChannel.ChannelName}}",
                        "message": "New S1 issue reported:\n ```{{.Trigger.ServiceDown.Message}}```",
                        "transitions": [
                            {
                                "label": "Resolved",
                                "to": "Resolved"
                            }
                        ]
                    }
                ]
            },
            {
                "name": "Resolved",
                "start_actions": [
                    {
                        "name": "ArchiveChannel",
                        "type": "archive_channel",
                        "channel_name": "{{.Action.CreateIncidentChannel.ChannelName}}"
                    }
                ]
            }
        ]
    },
    {
        "name": "MediumSevertiy",
        "triggers": [
            {
                "name": "ServiceCritical",
                "type": "text",
                "match_regex": "(CRITICAL.*SERVICE|SERVICE.*CRITICAL)",
                "team_name": "infosec",
                "channel_name": "alerts"
            }
        ],
        "steps": [
            {
                "name": "Open",
                "start_actions": [
                    {
                        "name": "CreateIncidentChannel",
                        "type": "create_channel",
                        "channel_name": "incident-s2-{{.Instance.Number}}",
                        "channel_displayname": "Incident S2 {{.Instance.Number}}"
                    },
                    {
                        "name": "AddServicesTeam",
                        "type": "add_users_channel",
                        "channel_name": "{{.Action.CreateIncidentChannel.ChannelName}}",
                        "users": [
                            "tester"
                        ]
                    },
                    {
                        "name": "IntroPost",
                        "type": "post",
                        "channel_name": "{{.Action.CreateIncidentChannel.ChannelName}}",
                        "message": "New S2 issue reported:\n ```{{.Trigger.ServiceCritical.Message}}```",
                        "transitions": [
                            {
                                "label": "Resolved",
                                "to": "Resolved"
                            }
                        ]
                    }
                ]
            },
            {
                "name": "Resolved",
                "start_actions": [
                    {
                        "name": "ArchiveChannel",
                        "type": "archive_channel",
                        "channel_name": "{{.Action.CreateIncidentChannel.ChannelName}}"
                    }
                ]
            }
        ]
    },
    {
        "name": "Warning",
        "triggers": [
            {
                "name": "ServiceWarning",
                "type": "text",
                "match": "WARNING",
                "team_name": "infosec",
                "channel_name": "alerts"
            }
        ],
        "steps": [
            {
                "name": "SendAlert",
                "start_actions": [
                    {
                        "name": "IntroPost",
                        "type": "post",
                        "team_name": "infosec",
                        "channel_name": "alerts",
                        "message": "@tester\nNew S3 issue reported:\n ```{{.Trigger.ServiceWarning.Message}}```"
                    }
                ]
            }
        ]
    }
]

source/samples/incident-response-app/workflow.json METASEP
[
    {
        "name": "security_issue",
        "triggers": [
            {
                "name": "IssueReported",
                "type": "text",
                "match": "#sec"
            }
        ],
        "steps": [
            {
                "name": "Setup",
                "start_actions": [
                    {
                        "name": "CreateWarroom",
                        "type": "create_channel",
                        "channel_name": "security-issue-{{.Instance.Number}}",
                        "channel_displayname": "Security Issue {{.Instance.Number}}"
                    },
                    {
                        "name": "AddUsers",
                        "type": "add_users_channel",
                        "channel_name": "{{.Action.CreateWarroom.ChannelName}}",
                        "users": [
                            "tester",
                            "tester2"
                        ]
                    },
                    {
                        "type": "post",
                        "name": "attention_post",
                        "channel_name": "Town Square",
                        "message": "Security issue reported. War room created: ~{{.Action.CreateWarroom.ChannelName}}"
                    },
                    {
                        "type": "transition_to",
                        "name": "TransitionToTriage",
                        "to": "Triage"
                    }
                ]
            },
            {
                "name": "Triage",
                "start_actions": [
                    {
                        "name": "TriagePost",
                        "type": "post",
                        "channel_name": "{{.Action.CreateWarroom.ChannelName}}",
                        "message": "New issue to triage:\n ```{{.Trigger.IssueReported.Message}}```",
                        "fields_title": "Please add details to this issue",
                        "fields": [
                            {
                                "name": "Alert",
                                "type": "button",
                                "description": "Alert the Sysadmin to take immediate action"
                            },
                            {
                                "name": "Likelihood",
                                "description": "How likely the security issue is to be exploited.",
                                "type": "options",
                                "options": [
                                    "L1",
                                    "L2",
                                    "L3"
                                ]
                            },
                            {
                                "name": "Impact",
                                "type": "options",
                                "description": "The impact of the security issue if exploited",
                                "options": [
                                    "I1",
                                    "I2",
                                    "I3"
                                ]
                            },
                            {
                                "name": "Severity",
                                "type": "options",
                                "description": "Derived from Impact and Likelihood",
                                "options": [
                                    "S1",
                                    "S2",
                                    "S3"
                                ]
                            }
                        ],
                        "transitions_title": "Transition to step",
                        "transitions": [
                            {
                                "label": "Triaged",
                                "description": "Issue has been triaged",
                                "to": "DevelopFix"
                            },
                            {
                                "label": "Resolved",
                                "description": "Issue has been resolved",
                                "to": "Resolved"
                            }
                        ]
                    }
                ],
                "finish_actions": [
                    {
                        "name": "TriageConfirmation",
                        "type": "post",
                        "channel_name": "{{.Action.CreateWarroom.ChannelName}}",
                        "message": "Finished Triage"
                    }
                ]
            },
            {
                "name": "DevelopFix",
                "start_actions": [
                    {
                        "name": "InfoPost",
                        "type": "post",
                        "channel_name": "{{.Action.CreateWarroom.ChannelName}}",
                        "message": "Developing a fix underway. Issue information:\n\nLikelihood: {{.Action.TriagePost.Likelihood}}\nImpact: {{.Action.TriagePost.Impact}}\nSeverity: {{.Action.TriagePost.Severity}}",
                        "transitions": [
                            {
                                "label": "Triage",
                                "description": "Return to triage.",
                                "to": "Triage"
                            },
                            {
                                "label": "Resolved",
                                "description": "Close issue as resolved",
                                "to": "Resolved"
                            }
                        ]
                    }
                ]
            },
            {
                "name": "Resolved",
                "start_actions": [
                    {
                        "name": "ResolveWarroom",
                        "type": "post",
                        "channel_name": "{{.Action.CreateWarroom.ChannelName}}",
                        "message": "Resolved."
                    },
                    {
                        "name": "PostResolved",
                        "type": "post",
                        "channel_name": "town-square",
                        "message": "Resolved Security Issue {{.Instance.Number}}"
                    },
                    {
                        "name": "ArchiveSecurityChannel",
                        "type": "archive_channel",
                        "channel_name": "security-issue-{{.Instance.Number}}"
                    }
                ]
            }
        ]
    }
]

source/samples/grafana-dashboards/server-perf-monitoring-set2.json METASEP
{
  "__inputs": [
    {
      "name": "DS_MATTERMOST",
      "label": "mattermost",
      "description": "",
      "type": "datasource",
      "pluginId": "prometheus",
      "pluginName": "Prometheus"
    }
  ],
  "__requires": [
    {
      "type": "grafana",
      "id": "grafana",
      "name": "Grafana",
      "version": "5.1.1"
    },
    {
      "type": "panel",
      "id": "graph",
      "name": "Graph",
      "version": "5.0.0"
    },
    {
      "type": "datasource",
      "id": "prometheus",
      "name": "Prometheus",
      "version": "5.0.0"
    }
  ],
  "annotations": {
    "list": [
      {
        "builtIn": 1,
        "datasource": "-- Grafana --",
        "enable": true,
        "hide": true,
        "iconColor": "rgba(0, 211, 255, 1)",
        "name": "Annotations & Alerts",
        "type": "dashboard"
      }
    ]
  },
  "editable": true,
  "gnetId": 2545,
  "graphTooltip": 0,
  "id": null,
  "iteration": 1532611119807,
  "links": [],
  "panels": [
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "fill": 1,
      "gridPos": {
        "h": 9,
        "w": 24,
        "x": 0,
        "y": 0
      },
      "id": 7,
      "legend": {
        "avg": false,
        "current": false,
        "max": false,
        "min": false,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 2,
      "links": [],
      "nullPointMode": "connected",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "mattermost_login_logins_total{instance=~\"$server\"}/(mattermost_login_logins_total{instance=~\"$server\"}+mattermost_login_logins_fail_total{instance=~\"$server\"})",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "{{instance}}",
          "metric": "mattermost_login_logins_total",
          "refId": "A",
          "step": 5
        },
        {
          "expr": "sum(mattermost_login_logins_total{instance=~\"$server\"})/(sum(mattermost_login_logins_total{instance=~\"$server\"})+sum(mattermost_login_logins_fail_total{instance=~\"$server\"}))",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "All",
          "metric": "mattermost_login_logins_total",
          "refId": "B",
          "step": 5
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeShift": null,
      "title": "Number of Successful Logins / Number of Login Attempts",
      "tooltip": {
        "msResolution": false,
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "percentunit",
          "label": "Login Success Rate",
          "logBase": 1,
          "max": "1",
          "min": "0",
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "fill": 1,
      "gridPos": {
        "h": 9,
        "w": 24,
        "x": 0,
        "y": 9
      },
      "id": 8,
      "legend": {
        "avg": false,
        "current": false,
        "max": false,
        "min": false,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 2,
      "links": [],
      "nullPointMode": "connected",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "irate(mattermost_login_logins_total{instance=~\"$server\"}[1m])",
          "format": "time_series",
          "interval": "1s",
          "intervalFactor": 1,
          "legendFormat": "{{instance}}",
          "metric": "mattermost_login_logins_total",
          "refId": "A",
          "step": 2
        },
        {
          "expr": "sum(irate(mattermost_login_logins_total{instance=~\"$server\"}[1m]))",
          "format": "time_series",
          "interval": "1s",
          "intervalFactor": 1,
          "legendFormat": "Total",
          "refId": "B",
          "step": 2
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeShift": null,
      "title": "Number of Successful Logins per Second",
      "tooltip": {
        "msResolution": false,
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "short",
          "label": "Count",
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "fill": 1,
      "gridPos": {
        "h": 9,
        "w": 24,
        "x": 0,
        "y": 18
      },
      "id": 9,
      "legend": {
        "avg": false,
        "current": false,
        "max": false,
        "min": false,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 2,
      "links": [],
      "nullPointMode": "connected",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "irate(mattermost_post_emails_sent_total{instance=~\"$server\"}[1m])",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "{{instance}}",
          "metric": "mattermost_post_broadcasts_total",
          "refId": "A",
          "step": 5
        },
        {
          "expr": "sum(irate(mattermost_post_emails_sent_total{instance=~\"$server\"}[1m]))",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "Total",
          "metric": "mattermost_post_broadcasts_total",
          "refId": "B",
          "step": 5
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeShift": null,
      "title": "Number of Emails Sent per Second",
      "tooltip": {
        "msResolution": false,
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "short",
          "label": "Count",
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "fill": 1,
      "gridPos": {
        "h": 9,
        "w": 24,
        "x": 0,
        "y": 27
      },
      "id": 10,
      "legend": {
        "avg": false,
        "current": false,
        "max": false,
        "min": false,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 2,
      "links": [],
      "nullPointMode": "connected",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "irate(mattermost_post_pushes_sent_total{instance=~\"$server\"}[1m])",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "{{instance}}",
          "refId": "A",
          "step": 5
        },
        {
          "expr": "sum(irate(mattermost_post_pushes_sent_total{instance=~\"$server\"}[1m]))",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "Total",
          "refId": "B",
          "step": 5
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeShift": null,
      "title": "Number of Mobile Push Notifications Sent per Second",
      "tooltip": {
        "msResolution": false,
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "short",
          "label": "Count",
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "fill": 1,
      "gridPos": {
        "h": 9,
        "w": 24,
        "x": 0,
        "y": 36
      },
      "id": 11,
      "legend": {
        "avg": false,
        "current": false,
        "max": false,
        "min": false,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 2,
      "links": [],
      "nullPointMode": "connected",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "irate(mattermost_post_file_attachments_total{instance=~\"$server\"}[1m])",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "{{instance}}",
          "metric": "mattermost_post_file_attachments_total",
          "refId": "A",
          "step": 5
        },
        {
          "expr": "sum(irate(mattermost_post_file_attachments_total{instance=~\"$server\"}[1m]))",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "Total",
          "metric": "mattermost_post_file_attachments_total",
          "refId": "B",
          "step": 5
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeShift": null,
      "title": "Number of File Attachments per Second",
      "tooltip": {
        "msResolution": false,
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "short",
          "label": "Count",
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "fill": 1,
      "gridPos": {
        "h": 8,
        "w": 24,
        "x": 0,
        "y": 45
      },
      "id": 23,
      "legend": {
        "avg": false,
        "current": false,
        "max": false,
        "min": false,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 1,
      "links": [],
      "nullPointMode": "null",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "irate(mattermost_search_posts_searches_total{instance=~\"$server\"}[1m])",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "{{instance}}",
          "refId": "A"
        },
        {
          "expr": "sum(irate(mattermost_search_posts_searches_total{instance=~\"$server\"}[1m]))",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "{{instance}}",
          "refId": "B"
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeShift": null,
      "title": "Number of Search Queries for Posts per Second",
      "tooltip": {
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "fill": 1,
      "gridPos": {
        "h": 8,
        "w": 24,
        "x": 0,
        "y": 53
      },
      "id": 21,
      "legend": {
        "avg": false,
        "current": false,
        "max": false,
        "min": false,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 2,
      "links": [],
      "nullPointMode": "null as zero",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "1000.0 * rate(mattermost_search_posts_searches_duration_seconds_sum{instance=~\"$server\"}[1m]) / rate(mattermost_search_posts_searches_duration_seconds_count{instance=~\"$server\"}[1m])",
          "format": "time_series",
          "instant": false,
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "{{instance}}",
          "refId": "A"
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeShift": null,
      "title": "Mean Search Query Time for Posts (in milliseconds)",
      "tooltip": {
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "short",
          "label": "Milliseconds (ms)",
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "fill": 1,
      "gridPos": {
        "h": 12,
        "w": 24,
        "x": 0,
        "y": 61
      },
      "id": 12,
      "legend": {
        "alignAsTable": true,
        "avg": false,
        "current": false,
        "max": true,
        "min": false,
        "show": true,
        "sort": "max",
        "sortDesc": true,
        "total": false,
        "values": true
      },
      "lines": true,
      "linewidth": 1,
      "links": [],
      "nullPointMode": "connected",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "irate(mattermost_websocket_event_total{instance=~\"$server\"}[1m])",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "{{type}}",
          "metric": "mattermost_websocket_event_total",
          "refId": "A",
          "step": 5
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeShift": null,
      "title": "Number of Websocket Events per Second",
      "tooltip": {
        "msResolution": false,
        "shared": false,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "short",
          "label": "Count",
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "fill": 1,
      "gridPos": {
        "h": 12,
        "w": 24,
        "x": 0,
        "y": 73
      },
      "id": 13,
      "legend": {
        "alignAsTable": true,
        "avg": false,
        "current": false,
        "max": true,
        "min": false,
        "show": true,
        "sort": "max",
        "sortDesc": true,
        "total": false,
        "values": true
      },
      "lines": true,
      "linewidth": 1,
      "links": [],
      "nullPointMode": "connected",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "irate(mattermost_websocket_broadcasts_total{instance=~\"$server\"}[1m])",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "{{name}}",
          "metric": "mattermost_websocket_broadcasts_total",
          "refId": "A",
          "step": 5
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeShift": null,
      "title": "Number of Websocket Broadcasts per Second",
      "tooltip": {
        "msResolution": false,
        "shared": false,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "short",
          "label": "Count",
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "fill": 1,
      "gridPos": {
        "h": 9,
        "w": 24,
        "x": 0,
        "y": 85
      },
      "id": 17,
      "legend": {
        "avg": false,
        "current": false,
        "max": false,
        "min": false,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 2,
      "links": [],
      "nullPointMode": "connected",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "irate(mattermost_http_requests_total{instance=~\"$server\"}[1m])",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "{{instance}}",
          "metric": "mattermost_http_requests_total",
          "refId": "A",
          "step": 5
        },
        {
          "expr": "sum(irate(mattermost_http_requests_total{instance=~\"$server\"}[1m]))",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "Total",
          "metric": "mattermost_http_requests_total",
          "refId": "B",
          "step": 5
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeShift": null,
      "title": "Number of API Requests per Second",
      "tooltip": {
        "msResolution": false,
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "short",
          "label": "Count",
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "fill": 1,
      "gridPos": {
        "h": 10,
        "w": 24,
        "x": 0,
        "y": 94
      },
      "id": 18,
      "legend": {
        "avg": false,
        "current": false,
        "max": false,
        "min": false,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 2,
      "links": [],
      "nullPointMode": "connected",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "irate(mattermost_cluster_cluster_requests_total{instance=~\"$server\"}[1m])",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "{{instance}}",
          "metric": "mattermost_cluster_cluster_requests_total",
          "refId": "A",
          "step": 5
        },
        {
          "expr": "sum(irate(mattermost_cluster_cluster_requests_total{instance=~\"$server\"}[1m]))",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "Total",
          "metric": "mattermost_cluster_cluster_requests_total",
          "refId": "B",
          "step": 5
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeShift": null,
      "title": "Number of Cluster Requests per Second",
      "tooltip": {
        "msResolution": false,
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "short",
          "label": "Count",
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "fill": 1,
      "gridPos": {
        "h": 10,
        "w": 24,
        "x": 0,
        "y": 104
      },
      "id": 19,
      "legend": {
        "alignAsTable": true,
        "avg": false,
        "current": false,
        "max": true,
        "min": false,
        "show": true,
        "sort": "max",
        "sortDesc": true,
        "total": false,
        "values": true
      },
      "lines": true,
      "linewidth": 1,
      "links": [],
      "nullPointMode": "connected",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "irate(mattermost_cluster_cluster_event_type_totals{instance=~\"$server\"}[1m])",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "{{name}}",
          "metric": "mattermost_websocket_broadcasts_total",
          "refId": "A",
          "step": 5
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeShift": null,
      "title": "Number of Cluster Events per Second",
      "tooltip": {
        "msResolution": false,
        "shared": false,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "short",
          "label": "Count",
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": false
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "fill": 1,
      "gridPos": {
        "h": 9,
        "w": 24,
        "x": 0,
        "y": 114
      },
      "id": 5,
      "legend": {
        "avg": false,
        "current": false,
        "max": false,
        "min": false,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 2,
      "links": [],
      "nullPointMode": "connected",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "go_gc_duration_seconds{instance=~\"$server\"}",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "{{instance}} {{quantile}}",
          "metric": "go_gc_duration_seconds",
          "refId": "A",
          "step": 5
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeShift": null,
      "title": "Garbage Collection Duration by Quantile (in seconds)",
      "tooltip": {
        "msResolution": false,
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "short",
          "label": "Seconds",
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "fill": 1,
      "gridPos": {
        "h": 9,
        "w": 24,
        "x": 0,
        "y": 123
      },
      "id": 6,
      "legend": {
        "avg": false,
        "current": false,
        "max": false,
        "min": false,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 2,
      "links": [],
      "nullPointMode": "connected",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "go_memstats_heap_objects{instance=~\"$server\"}",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "{{instance}}",
          "metric": "go_memstats_heap_objects",
          "refId": "A",
          "step": 5
        },
        {
          "expr": "sum(go_memstats_heap_objects{instance=~\"$server\"})",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "Total",
          "metric": "go_memstats_heap_objects",
          "refId": "B",
          "step": 5
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeShift": null,
      "title": "Number of Objects on the Heap",
      "tooltip": {
        "msResolution": false,
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "short",
          "label": "Count",
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "fill": 1,
      "gridPos": {
        "h": 9,
        "w": 24,
        "x": 0,
        "y": 132
      },
      "id": 1,
      "legend": {
        "alignAsTable": true,
        "avg": false,
        "current": false,
        "max": true,
        "min": false,
        "show": true,
        "sort": "max",
        "sortDesc": true,
        "total": false,
        "values": true
      },
      "lines": true,
      "linewidth": 1,
      "links": [],
      "nullPointMode": "connected",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": true,
      "targets": [
        {
          "expr": "mattermost_cache_etag_hit_total{instance=~\"$server\"}/(mattermost_cache_etag_miss_total{instance=~\"$server\"} + mattermost_cache_etag_hit_total{instance=~\"$server\"})",
          "format": "time_series",
          "interval": "30s",
          "intervalFactor": 1,
          "legendFormat": "{{route}}",
          "metric": "mattermost_cache_etag_hit_total",
          "refId": "A",
          "step": 30
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeShift": null,
      "title": "Etag Hit Rate",
      "tooltip": {
        "msResolution": false,
        "shared": false,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "percentunit",
          "label": "Hit Rate",
          "logBase": 1,
          "max": "1",
          "min": "0",
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": false
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "fill": 1,
      "gridPos": {
        "h": 9,
        "w": 24,
        "x": 0,
        "y": 141
      },
      "id": 2,
      "legend": {
        "alignAsTable": true,
        "avg": false,
        "current": false,
        "max": true,
        "min": false,
        "show": true,
        "sort": "max",
        "sortDesc": true,
        "total": false,
        "values": true
      },
      "lines": true,
      "linewidth": 1,
      "links": [],
      "nullPointMode": "connected",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "mattermost_cache_mem_hit_total{instance=~\"$server\"}/(mattermost_cache_mem_miss_total{instance=~\"$server\"} + mattermost_cache_mem_hit_total{instance=~\"$server\"})",
          "format": "time_series",
          "interval": "30s",
          "intervalFactor": 1,
          "legendFormat": "{{name}}",
          "metric": "mattermost_cache_mem_hit_total",
          "refId": "A",
          "step": 30
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeShift": null,
      "title": "Memory Cache Hit Rate",
      "tooltip": {
        "msResolution": false,
        "shared": false,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "percentunit",
          "label": "Hit Rate",
          "logBase": 1,
          "max": "1",
          "min": "0",
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": false
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "aliasColors": {},
      "bars": true,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "fill": 1,
      "gridPos": {
        "h": 9,
        "w": 24,
        "x": 0,
        "y": 150
      },
      "id": 3,
      "legend": {
        "alignAsTable": true,
        "avg": true,
        "current": false,
        "max": false,
        "min": false,
        "show": true,
        "sort": "avg",
        "sortDesc": true,
        "total": false,
        "values": true
      },
      "lines": false,
      "linewidth": 1,
      "links": [],
      "nullPointMode": "connected",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "mattermost_cache_etag_hit_total{instance=~\"$server\"}/(mattermost_cache_etag_miss_total{instance=~\"$server\"} + mattermost_cache_etag_hit_total{instance=~\"$server\"})",
          "format": "time_series",
          "interval": "30s",
          "intervalFactor": 1,
          "legendFormat": "{{route}}",
          "metric": "mattermost_cache_etag_hit_total",
          "refId": "A",
          "step": 30
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeShift": null,
      "title": "Mean Etag Hit Rate (for each server)",
      "tooltip": {
        "msResolution": false,
        "shared": false,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "series",
        "name": null,
        "show": true,
        "values": [
          "avg"
        ]
      },
      "yaxes": [
        {
          "format": "percentunit",
          "label": "Hit Rate",
          "logBase": 1,
          "max": "1",
          "min": "0",
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": false
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "aliasColors": {},
      "bars": true,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "fill": 1,
      "gridPos": {
        "h": 12,
        "w": 24,
        "x": 0,
        "y": 159
      },
      "id": 4,
      "legend": {
        "alignAsTable": true,
        "avg": true,
        "current": false,
        "max": false,
        "min": false,
        "show": true,
        "sort": "avg",
        "sortDesc": true,
        "total": false,
        "values": true
      },
      "lines": false,
      "linewidth": 1,
      "links": [],
      "nullPointMode": "connected",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "mattermost_cache_mem_hit_total{instance=~\"$server\"}/(mattermost_cache_mem_miss_total{instance=~\"$server\"} + mattermost_cache_mem_hit_total{instance=~\"$server\"})",
          "format": "time_series",
          "interval": "30s",
          "intervalFactor": 1,
          "legendFormat": "{{name}}",
          "metric": "mattermost_cache_etag_hit_total",
          "refId": "A",
          "step": 30
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeShift": null,
      "title": "Mean Memory Cache Hit Rate (for each server)",
      "tooltip": {
        "msResolution": false,
        "shared": false,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "series",
        "name": null,
        "show": true,
        "values": [
          "avg"
        ]
      },
      "yaxes": [
        {
          "format": "percentunit",
          "label": "Hit Rate",
          "logBase": 1,
          "max": "1",
          "min": "0",
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": false
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "fill": 1,
      "gridPos": {
        "h": 9,
        "w": 24,
        "x": 0,
        "y": 171
      },
      "id": 14,
      "legend": {
        "avg": false,
        "current": false,
        "max": false,
        "min": false,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 2,
      "links": [],
      "nullPointMode": "connected",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "mattermost_process_resident_memory_bytes{instance=~\"$server\"}/1024/1024",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "{{instance}}",
          "metric": "mattermost_process_resident_memory_bytes",
          "refId": "A",
          "step": 5
        },
        {
          "expr": "sum(mattermost_process_resident_memory_bytes{instance=~\"$server\"}/1024/1024)",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "Total",
          "metric": "mattermost_process_resident_memory_bytes",
          "refId": "B",
          "step": 5
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeShift": null,
      "title": "Resident Memory Size (in MB)",
      "tooltip": {
        "msResolution": false,
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "short",
          "label": "MB",
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "fill": 1,
      "gridPos": {
        "h": 9,
        "w": 24,
        "x": 0,
        "y": 180
      },
      "id": 15,
      "legend": {
        "avg": false,
        "current": false,
        "max": false,
        "min": false,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 2,
      "links": [],
      "nullPointMode": "connected",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "mattermost_process_virtual_memory_bytes{instance=~\"$server\"}/1024/1024",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "{{instance}}",
          "metric": "mattermost_process_virtual_memory_bytes",
          "refId": "A",
          "step": 5
        },
        {
          "expr": "sum(mattermost_process_virtual_memory_bytes{instance=~\"$server\"}/1024/1024)",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "Total",
          "metric": "mattermost_process_virtual_memory_bytes",
          "refId": "B",
          "step": 5
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeShift": null,
      "title": "Virtual Memory Size (in MB)",
      "tooltip": {
        "msResolution": false,
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "short",
          "label": "MB",
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "fill": 1,
      "gridPos": {
        "h": 9,
        "w": 24,
        "x": 0,
        "y": 189
      },
      "id": 16,
      "legend": {
        "avg": false,
        "current": false,
        "max": false,
        "min": false,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 2,
      "links": [],
      "nullPointMode": "connected",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "mattermost_process_open_fds{instance=~\"$server\"}",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "{{instance}}",
          "metric": "mattermost_process_open_fds",
          "refId": "A",
          "step": 5
        },
        {
          "expr": "sum(mattermost_process_open_fds{instance=~\"$server\"})",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "Total",
          "metric": "mattermost_process_open_fds",
          "refId": "B",
          "step": 5
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeShift": null,
      "title": "Number of Open File Descriptors",
      "tooltip": {
        "msResolution": false,
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "short",
          "label": "Count",
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    }
  ],
  "refresh": "30s",
  "schemaVersion": 16,
  "style": "dark",
  "tags": [
    "mattermost",
    "mattermost-perf"
  ],
  "templating": {
    "list": [
      {
        "allValue": null,
        "current": {},
        "datasource": "${DS_MATTERMOST}",
        "hide": 0,
        "includeAll": false,
        "label": "server",
        "multi": true,
        "name": "server",
        "options": [],
        "query": "label_values(instance)",
        "refresh": 1,
        "regex": "",
        "sort": 0,
        "tagValuesQuery": null,
        "tags": [],
        "tagsQuery": null,
        "type": "query",
        "useTags": false
      }
    ]
  },
  "time": {
    "from": "now-6h",
    "to": "now"
  },
  "timepicker": {
    "refresh_intervals": [
      "5s",
      "10s",
      "30s",
      "1m",
      "5m",
      "15m",
      "30m",
      "1h",
      "2h",
      "1d"
    ],
    "time_options": [
      "5m",
      "15m",
      "1h",
      "6h",
      "12h",
      "24h",
      "2d",
      "7d",
      "30d"
    ]
  },
  "timezone": "browser",
  "title": "Mattermost Performance Monitoring (Bonus Metrics)",
  "uid": "000000013",
  "version": 34
}

source/samples/grafana-dashboards/server-perf-monitoring-set1.json METASEP
{
  "__inputs": [
    {
      "name": "DS_MATTERMOST",
      "label": "mattermost",
      "description": "",
      "type": "datasource",
      "pluginId": "prometheus",
      "pluginName": "Prometheus"
    }
  ],
  "__requires": [
    {
      "type": "grafana",
      "id": "grafana",
      "name": "Grafana",
      "version": "5.1.1"
    },
    {
      "type": "panel",
      "id": "graph",
      "name": "Graph",
      "version": "5.0.0"
    },
    {
      "type": "datasource",
      "id": "prometheus",
      "name": "Prometheus",
      "version": "5.0.0"
    }
  ],
  "annotations": {
    "list": [
      {
        "builtIn": 1,
        "datasource": "-- Grafana --",
        "enable": true,
        "hide": true,
        "iconColor": "rgba(0, 211, 255, 1)",
        "name": "Annotations & Alerts",
        "type": "dashboard"
      }
    ]
  },
  "editable": true,
  "gnetId": 2542,
  "graphTooltip": 0,
  "id": null,
  "iteration": 1532611059937,
  "links": [],
  "panels": [
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "fill": 1,
      "gridPos": {
        "h": 9,
        "w": 24,
        "x": 0,
        "y": 0
      },
      "id": 7,
      "legend": {
        "avg": false,
        "current": false,
        "max": false,
        "min": false,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 2,
      "links": [],
      "nullPointMode": "connected",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "irate(mattermost_post_total{instance=~\"$server\"}[1m])",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "{{instance}}",
          "metric": "mattermost_post_total",
          "refId": "A",
          "step": 5
        },
        {
          "expr": "sum(irate(mattermost_post_total{instance=~\"$server\"}[1m]))",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "Total",
          "metric": "mattermost_post_total",
          "refId": "B",
          "step": 5
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeShift": null,
      "title": "Number of Messages per Second",
      "tooltip": {
        "msResolution": false,
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "short",
          "label": "Count",
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "fill": 1,
      "gridPos": {
        "h": 9,
        "w": 24,
        "x": 0,
        "y": 9
      },
      "id": 10,
      "legend": {
        "avg": false,
        "current": false,
        "max": false,
        "min": false,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 2,
      "links": [],
      "nullPointMode": "connected",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "irate(mattermost_http_errors_total{instance=~\"$server\"}[1m])",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "{{instance}}",
          "metric": "mattermost_http_errors_total",
          "refId": "A",
          "step": 5
        },
        {
          "expr": "sum(irate(mattermost_http_errors_total{instance=~\"$server\"}[1m]))",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "Total",
          "metric": "mattermost_http_errors_total",
          "refId": "B",
          "step": 5
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeShift": null,
      "title": "Number of API Errors per Second",
      "tooltip": {
        "msResolution": false,
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "short",
          "label": "Count",
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "alert": {
        "conditions": [
          {
            "evaluator": {
              "params": [
                36000
              ],
              "type": "gt"
            },
            "operator": {
              "type": "and"
            },
            "query": {
              "params": [
                "A",
                "10s",
                "now"
              ]
            },
            "reducer": {
              "params": [],
              "type": "last"
            },
            "type": "query"
          }
        ],
        "executionErrorState": "alerting",
        "frequency": "60s",
        "handler": 1,
        "message": "#grafana-alert",
        "name": "Number of Connected Devices (WebSocket Connections) alert",
        "noDataState": "no_data",
        "notifications": []
      },
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "fill": 1,
      "gridPos": {
        "h": 9,
        "w": 24,
        "x": 0,
        "y": 18
      },
      "id": 6,
      "legend": {
        "avg": false,
        "current": false,
        "max": false,
        "min": false,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 2,
      "links": [],
      "nullPointMode": "connected",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "mattermost_http_websockets_total{instance=~\"$server\"}",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "{{instance}}",
          "metric": "mattermost_http_websockets_total",
          "refId": "A",
          "step": 5
        },
        {
          "expr": "sum(mattermost_http_websockets_total{instance=~\"$server\"})",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "Total",
          "refId": "B",
          "step": 5
        }
      ],
      "thresholds": [
        {
          "colorMode": "critical",
          "fill": true,
          "line": true,
          "op": "gt",
          "value": 36000
        }
      ],
      "timeFrom": null,
      "timeShift": null,
      "title": "Number of Connected Devices (WebSocket Connections)",
      "tooltip": {
        "msResolution": false,
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "short",
          "label": "Count",
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "fill": 1,
      "gridPos": {
        "h": 9,
        "w": 24,
        "x": 0,
        "y": 27
      },
      "id": 1,
      "legend": {
        "avg": false,
        "current": false,
        "max": false,
        "min": false,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 2,
      "links": [],
      "nullPointMode": "connected",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "mattermost_db_master_connections_total{instance=~\"$server\"}",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "{{instance}}",
          "metric": "mattermost_db_master_connections_total",
          "refId": "A",
          "step": 5
        },
        {
          "expr": "sum(mattermost_db_master_connections_total{instance=~\"$server\"})",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "Total",
          "metric": "mattermost_db_master_connections_total",
          "refId": "B",
          "step": 5
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeShift": null,
      "title": "Number of Connections to Master Database",
      "tooltip": {
        "msResolution": false,
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "short",
          "label": "Count",
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "fill": 1,
      "gridPos": {
        "h": 9,
        "w": 24,
        "x": 0,
        "y": 36
      },
      "id": 2,
      "legend": {
        "avg": false,
        "current": false,
        "max": false,
        "min": false,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 2,
      "links": [],
      "nullPointMode": "connected",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "mattermost_db_read_replica_connections_total{instance=~\"$server\"}",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "{{instance}}",
          "metric": "mattermost_db_read_replica_connections_total",
          "refId": "A",
          "step": 5
        },
        {
          "expr": "sum(mattermost_db_read_replica_connections_total{instance=~\"$server\"})",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "Total",
          "metric": "mattermost_db_read_replica_connections_total",
          "refId": "B",
          "step": 5
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeShift": null,
      "title": "Number of Connections to Read Replica Databases",
      "tooltip": {
        "msResolution": false,
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "short",
          "label": "Count",
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "fill": 1,
      "gridPos": {
        "h": 9,
        "w": 24,
        "x": 0,
        "y": 45
      },
      "id": 3,
      "legend": {
        "avg": false,
        "current": false,
        "max": false,
        "min": false,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 2,
      "links": [],
      "nullPointMode": "connected",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "mattermost_db_search_replica_connections_total{instance=~\"$server\"}",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "{{instance}}",
          "metric": "mattermost_db_search_replica_connections_total",
          "refId": "A",
          "step": 5
        },
        {
          "expr": "sum(mattermost_db_search_replica_connections_total{instance=~\"$server\"})",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "Total",
          "metric": "mattermost_db_search_replica_connections_total",
          "refId": "B",
          "step": 5
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeShift": null,
      "title": "Number of Connections to Search Replica Databases",
      "tooltip": {
        "msResolution": false,
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "short",
          "label": "Count",
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "fill": 1,
      "gridPos": {
        "h": 9,
        "w": 24,
        "x": 0,
        "y": 54
      },
      "id": 9,
      "legend": {
        "avg": false,
        "current": false,
        "max": false,
        "min": false,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 2,
      "links": [],
      "nullPointMode": "connected",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "sum(irate(mattermost_post_webhooks_total[1m]))",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "Webhooks",
          "metric": "mattermost_post_webhooks_total",
          "refId": "A",
          "step": 5
        },
        {
          "expr": "sum(irate(mattermost_post_total[1m])*10)-sum(irate(mattermost_post_webhooks_total[1m]))",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "Users",
          "metric": "mattermost_post_total",
          "refId": "B",
          "step": 5
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeShift": null,
      "title": "Number of Messages Per Second by Type",
      "tooltip": {
        "msResolution": false,
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "short",
          "label": "Count",
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "fill": 1,
      "gridPos": {
        "h": 9,
        "w": 24,
        "x": 0,
        "y": 63
      },
      "id": 8,
      "legend": {
        "avg": false,
        "current": false,
        "max": false,
        "min": false,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 2,
      "links": [],
      "nullPointMode": "connected",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "irate(mattermost_post_broadcasts_total{instance=~\"$server\"}[1m])",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "{{instance}}",
          "metric": "mattermost_post_broadcasts_total",
          "refId": "A",
          "step": 5
        },
        {
          "expr": "sum(irate(mattermost_post_broadcasts_total{instance=~\"$server\"}[1m]))",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "Total",
          "metric": "mattermost_post_broadcasts_total",
          "refId": "B",
          "step": 5
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeShift": null,
      "title": "Number of Broadcasts per Second",
      "tooltip": {
        "msResolution": false,
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "short",
          "label": "Count",
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "fill": 1,
      "gridPos": {
        "h": 9,
        "w": 24,
        "x": 0,
        "y": 72
      },
      "id": 13,
      "legend": {
        "avg": false,
        "current": false,
        "max": false,
        "min": false,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 2,
      "links": [],
      "nullPointMode": "connected",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "irate(mattermost_process_cpu_seconds_total{instance=~\"$server\"}[1m])* 100",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "{{instance}}",
          "refId": "A",
          "step": 5
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeShift": null,
      "title": "CPU Utilization Rate (%)",
      "tooltip": {
        "msResolution": false,
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "short",
          "label": "Utilization Rate (%)",
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "fill": 1,
      "gridPos": {
        "h": 9,
        "w": 24,
        "x": 0,
        "y": 81
      },
      "id": 11,
      "legend": {
        "avg": false,
        "current": false,
        "max": false,
        "min": false,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 2,
      "links": [],
      "nullPointMode": "connected",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "1000.0 * rate(mattermost_http_request_duration_seconds_sum{instance=~\"$server\"}[1m]) /   rate(mattermost_http_request_duration_seconds_count{instance=~\"$server\"}[1m])",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "{{instance}}",
          "metric": "mattermost_http_request_duration_seconds_sum",
          "refId": "A",
          "step": 5
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeShift": null,
      "title": "Mean API Request Time (in milliseconds)",
      "tooltip": {
        "msResolution": false,
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "short",
          "label": "Milliseconds (ms)",
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "fill": 1,
      "gridPos": {
        "h": 9,
        "w": 24,
        "x": 0,
        "y": 90
      },
      "id": 12,
      "legend": {
        "avg": false,
        "current": false,
        "max": false,
        "min": false,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 2,
      "links": [],
      "nullPointMode": "connected",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "1000.0 * rate(mattermost_cluster_cluster_request_duration_seconds_sum{instance=~\"$server\"}[1m]) /  rate(mattermost_cluster_cluster_request_duration_seconds_count{instance=~\"$server\"}[1m])",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "{{instance}}",
          "refId": "A",
          "step": 5
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeShift": null,
      "title": "Mean Cluster Request Time (in milliseconds)",
      "tooltip": {
        "msResolution": false,
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "short",
          "label": "Milliseconds (ms)",
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "fill": 1,
      "gridPos": {
        "h": 9,
        "w": 24,
        "x": 0,
        "y": 99
      },
      "id": 4,
      "legend": {
        "avg": false,
        "current": false,
        "max": false,
        "min": false,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 2,
      "links": [],
      "nullPointMode": "connected",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "go_goroutines{instance=~\"$server\"}",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "{{instance}}",
          "metric": "go_goroutines",
          "refId": "A",
          "step": 5
        },
        {
          "expr": "sum(go_goroutines{instance=~\"$server\"})",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "Total",
          "metric": "go_goroutines",
          "refId": "B",
          "step": 5
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeShift": null,
      "title": "Number of Go Routines",
      "tooltip": {
        "msResolution": false,
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "short",
          "label": "Count",
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "fill": 1,
      "gridPos": {
        "h": 9,
        "w": 24,
        "x": 0,
        "y": 108
      },
      "id": 5,
      "legend": {
        "avg": false,
        "current": false,
        "max": false,
        "min": false,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 2,
      "links": [],
      "nullPointMode": "connected",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "go_memstats_alloc_bytes{instance=~\"$server\"}/1024/1024",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "{{instance}}",
          "metric": "go_memstats_alloc_bytes_total",
          "refId": "A",
          "step": 5
        },
        {
          "expr": "sum(go_memstats_alloc_bytes{instance=~\"$server\"})/1024/1024",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "Total",
          "metric": "go_memstats_alloc_bytes_total",
          "refId": "B",
          "step": 5
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeShift": null,
      "title": "Memory Usage (in MB)",
      "tooltip": {
        "msResolution": false,
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "short",
          "label": "MB",
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    }
  ],
  "refresh": "30s",
  "schemaVersion": 16,
  "style": "dark",
  "tags": [
    "mattermost",
    "mattermost-perf"
  ],
  "templating": {
    "list": [
      {
        "allValue": null,
        "current": {},
        "datasource": "${DS_MATTERMOST}",
        "hide": 0,
        "includeAll": false,
        "label": "server",
        "multi": true,
        "name": "server",
        "options": [],
        "query": "label_values(instance)",
        "refresh": 1,
        "regex": "",
        "sort": 0,
        "tagValuesQuery": null,
        "tags": [],
        "tagsQuery": null,
        "type": "query",
        "useTags": false
      }
    ]
  },
  "time": {
    "from": "now-6h",
    "to": "now"
  },
  "timepicker": {
    "refresh_intervals": [
      "5s",
      "10s",
      "30s",
      "1m",
      "5m",
      "15m",
      "30m",
      "1h",
      "2h",
      "1d"
    ],
    "time_options": [
      "5m",
      "15m",
      "1h",
      "6h",
      "12h",
      "24h",
      "2d",
      "7d",
      "30d"
    ]
  },
  "timezone": "browser",
  "title": "Mattermost Performance Monitoring",
  "uid": "000000011",
  "version": 35
}

source/samples/grafana-dashboards/server-perf-monitoring-kpi-metrics.json METASEP
{
  "__inputs": [
    {
      "name": "DS_MATTERMOST",
      "label": "mattermost",
      "description": "",
      "type": "datasource",
      "pluginId": "prometheus",
      "pluginName": "Prometheus"
    }
  ],
  "__requires": [
    {
      "type": "grafana",
      "id": "grafana",
      "name": "Grafana",
      "version": "5.1.1"
    },
    {
      "type": "panel",
      "id": "graph",
      "name": "Graph",
      "version": "5.0.0"
    },
    {
      "type": "datasource",
      "id": "prometheus",
      "name": "Prometheus",
      "version": "5.0.0"
    },
    {
      "type": "panel",
      "id": "singlestat",
      "name": "Singlestat",
      "version": "5.0.0"
    }
  ],
  "annotations": {
    "list": [
      {
        "builtIn": 1,
        "datasource": "-- Grafana --",
        "enable": true,
        "hide": true,
        "iconColor": "rgba(0, 211, 255, 1)",
        "name": "Annotations & Alerts",
        "type": "dashboard"
      }
    ]
  },
  "editable": true,
  "gnetId": 2539,
  "graphTooltip": 0,
  "id": null,
  "iteration": 1532610781587,
  "links": [],
  "panels": [
    {
      "cacheTimeout": null,
      "colorBackground": false,
      "colorValue": false,
      "colors": [
        "rgba(50, 172, 45, 0.97)",
        "rgba(237, 129, 40, 0.89)",
        "rgba(245, 54, 54, 0.9)"
      ],
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "format": "none",
      "gauge": {
        "maxValue": 100,
        "minValue": 0,
        "show": true,
        "thresholdLabels": false,
        "thresholdMarkers": true
      },
      "gridPos": {
        "h": 4,
        "w": 4,
        "x": 0,
        "y": 0
      },
      "id": 9,
      "interval": null,
      "links": [],
      "mappingType": 1,
      "mappingTypes": [
        {
          "name": "value to text",
          "value": 1
        },
        {
          "name": "range to text",
          "value": 2
        }
      ],
      "maxDataPoints": 100,
      "nullPointMode": "connected",
      "nullText": null,
      "postfix": " %",
      "postfixFontSize": "50%",
      "prefix": "",
      "prefixFontSize": "50%",
      "rangeMaps": [
        {
          "from": "null",
          "text": "N/A",
          "to": "null"
        }
      ],
      "sparkline": {
        "fillColor": "rgba(31, 118, 189, 0.18)",
        "full": false,
        "lineColor": "rgb(31, 120, 193)",
        "show": false
      },
      "tableColumn": "",
      "targets": [
        {
          "expr": "max(irate(mattermost_process_cpu_seconds_total{instance=~\"$server\"}[1m])* 100)",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "",
          "metric": "mattermost_process_cpu_seconds_total",
          "refId": "A",
          "step": 5
        }
      ],
      "thresholds": "50,80",
      "title": "Max CPU utilization rate (%)",
      "type": "singlestat",
      "valueFontSize": "80%",
      "valueMaps": [
        {
          "op": "=",
          "text": "N/A",
          "value": "null"
        }
      ],
      "valueName": "current"
    },
    {
      "cacheTimeout": null,
      "colorBackground": false,
      "colorValue": false,
      "colors": [
        "rgba(245, 54, 54, 0.9)",
        "rgba(237, 129, 40, 0.89)",
        "rgba(50, 172, 45, 0.97)"
      ],
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "format": "none",
      "gauge": {
        "maxValue": 100,
        "minValue": 0,
        "show": false,
        "thresholdLabels": false,
        "thresholdMarkers": true
      },
      "gridPos": {
        "h": 4,
        "w": 4,
        "x": 4,
        "y": 0
      },
      "id": 21,
      "interval": null,
      "links": [],
      "mappingType": 1,
      "mappingTypes": [
        {
          "name": "value to text",
          "value": 1
        },
        {
          "name": "range to text",
          "value": 2
        }
      ],
      "maxDataPoints": 100,
      "nullPointMode": "connected",
      "nullText": null,
      "postfix": "",
      "postfixFontSize": "50%",
      "prefix": "",
      "prefixFontSize": "50%",
      "rangeMaps": [
        {
          "from": "null",
          "text": "N/A",
          "to": "null"
        }
      ],
      "sparkline": {
        "fillColor": "rgba(31, 118, 189, 0.18)",
        "full": false,
        "lineColor": "rgb(31, 120, 193)",
        "show": false
      },
      "tableColumn": "",
      "targets": [
        {
          "expr": "sum(rate(mattermost_post_total{instance=~\"$server\"}[1m]))",
          "format": "time_series",
          "interval": "1m",
          "intervalFactor": 1,
          "legendFormat": "",
          "refId": "A",
          "step": 60
        }
      ],
      "thresholds": "",
      "title": "Number of messages / min",
      "type": "singlestat",
      "valueFontSize": "80%",
      "valueMaps": [
        {
          "op": "=",
          "text": "N/A",
          "value": "null"
        }
      ],
      "valueName": "current"
    },
    {
      "cacheTimeout": null,
      "colorBackground": false,
      "colorValue": false,
      "colors": [
        "rgba(245, 54, 54, 0.9)",
        "rgba(237, 129, 40, 0.89)",
        "rgba(50, 172, 45, 0.97)"
      ],
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "format": "none",
      "gauge": {
        "maxValue": 100,
        "minValue": 0,
        "show": false,
        "thresholdLabels": false,
        "thresholdMarkers": true
      },
      "gridPos": {
        "h": 4,
        "w": 4,
        "x": 8,
        "y": 0
      },
      "id": 20,
      "interval": null,
      "links": [],
      "mappingType": 1,
      "mappingTypes": [
        {
          "name": "value to text",
          "value": 1
        },
        {
          "name": "range to text",
          "value": 2
        }
      ],
      "maxDataPoints": 100,
      "nullPointMode": "connected",
      "nullText": null,
      "postfix": "",
      "postfixFontSize": "50%",
      "prefix": "",
      "prefixFontSize": "50%",
      "rangeMaps": [
        {
          "from": "null",
          "text": "N/A",
          "to": "null"
        }
      ],
      "sparkline": {
        "fillColor": "rgba(31, 118, 189, 0.18)",
        "full": false,
        "lineColor": "rgb(31, 120, 193)",
        "show": false
      },
      "tableColumn": "",
      "targets": [
        {
          "expr": "sum(rate(mattermost_http_errors_total{instance=~\"$server\"}[1m]))",
          "format": "time_series",
          "interval": "1m",
          "intervalFactor": 1,
          "refId": "A",
          "step": 60
        }
      ],
      "thresholds": "",
      "title": "Number of API errors / min",
      "type": "singlestat",
      "valueFontSize": "80%",
      "valueMaps": [
        {
          "op": "=",
          "text": "N/A",
          "value": "null"
        }
      ],
      "valueName": "current"
    },
    {
      "cacheTimeout": null,
      "colorBackground": false,
      "colorValue": false,
      "colors": [
        "rgba(50, 172, 45, 0.97)",
        "rgba(237, 129, 40, 0.89)",
        "rgba(245, 54, 54, 0.9)"
      ],
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "format": "none",
      "gauge": {
        "maxValue": 1000,
        "minValue": 0,
        "show": false,
        "thresholdLabels": false,
        "thresholdMarkers": true
      },
      "gridPos": {
        "h": 4,
        "w": 4,
        "x": 12,
        "y": 0
      },
      "id": 13,
      "interval": null,
      "links": [],
      "mappingType": 1,
      "mappingTypes": [
        {
          "name": "value to text",
          "value": 1
        },
        {
          "name": "range to text",
          "value": 2
        }
      ],
      "maxDataPoints": 100,
      "nullPointMode": "connected",
      "nullText": null,
      "postfix": "",
      "postfixFontSize": "50%",
      "prefix": "",
      "prefixFontSize": "50%",
      "rangeMaps": [
        {
          "from": "null",
          "text": "N/A",
          "to": "null"
        }
      ],
      "sparkline": {
        "fillColor": "rgba(31, 118, 189, 0.18)",
        "full": false,
        "lineColor": "rgb(31, 120, 193)",
        "show": false
      },
      "tableColumn": "",
      "targets": [
        {
          "expr": "sum(mattermost_http_websockets_total{instance=~\"$server\"})",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "refId": "A",
          "step": 5
        }
      ],
      "thresholds": "500, 800",
      "title": "Number of connected devices",
      "type": "singlestat",
      "valueFontSize": "80%",
      "valueMaps": [
        {
          "op": "=",
          "text": "N/A",
          "value": "null"
        }
      ],
      "valueName": "current"
    },
    {
      "cacheTimeout": null,
      "colorBackground": false,
      "colorValue": false,
      "colors": [
        "rgba(50, 172, 45, 0.97)",
        "rgba(237, 129, 40, 0.89)",
        "rgba(245, 54, 54, 0.9)"
      ],
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "format": "none",
      "gauge": {
        "maxValue": 100,
        "minValue": 0,
        "show": false,
        "thresholdLabels": false,
        "thresholdMarkers": true
      },
      "gridPos": {
        "h": 4,
        "w": 4,
        "x": 16,
        "y": 0
      },
      "id": 17,
      "interval": null,
      "links": [],
      "mappingType": 1,
      "mappingTypes": [
        {
          "name": "value to text",
          "value": 1
        },
        {
          "name": "range to text",
          "value": 2
        }
      ],
      "maxDataPoints": 100,
      "nullPointMode": "connected",
      "nullText": null,
      "postfix": "",
      "postfixFontSize": "50%",
      "prefix": "",
      "prefixFontSize": "50%",
      "rangeMaps": [
        {
          "from": "null",
          "text": "N/A",
          "to": "null"
        }
      ],
      "sparkline": {
        "fillColor": "rgba(31, 118, 189, 0.18)",
        "full": false,
        "lineColor": "rgb(31, 120, 193)",
        "show": false
      },
      "tableColumn": "",
      "targets": [
        {
          "expr": "sum(mattermost_db_master_connections_total{instance=~\"$server\"})",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "refId": "A",
          "step": 5
        }
      ],
      "thresholds": "50, 80",
      "title": "Number of master DB conns",
      "type": "singlestat",
      "valueFontSize": "80%",
      "valueMaps": [
        {
          "op": "=",
          "text": "N/A",
          "value": "null"
        }
      ],
      "valueName": "current"
    },
    {
      "cacheTimeout": null,
      "colorBackground": false,
      "colorValue": false,
      "colors": [
        "rgba(50, 172, 45, 0.97)",
        "rgba(237, 129, 40, 0.89)",
        "rgba(245, 54, 54, 0.9)"
      ],
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "format": "none",
      "gauge": {
        "maxValue": 1000,
        "minValue": 0,
        "show": false,
        "thresholdLabels": false,
        "thresholdMarkers": true
      },
      "gridPos": {
        "h": 4,
        "w": 4,
        "x": 20,
        "y": 0
      },
      "id": 12,
      "interval": null,
      "links": [],
      "mappingType": 1,
      "mappingTypes": [
        {
          "name": "value to text",
          "value": 1
        },
        {
          "name": "range to text",
          "value": 2
        }
      ],
      "maxDataPoints": 100,
      "nullPointMode": "connected",
      "nullText": null,
      "postfix": " MB",
      "postfixFontSize": "50%",
      "prefix": "",
      "prefixFontSize": "50%",
      "rangeMaps": [
        {
          "from": "null",
          "text": "N/A",
          "to": "null"
        }
      ],
      "sparkline": {
        "fillColor": "rgba(31, 118, 189, 0.18)",
        "full": false,
        "lineColor": "rgb(31, 120, 193)",
        "show": false
      },
      "tableColumn": "",
      "targets": [
        {
          "expr": "sum(go_memstats_alloc_bytes{instance=~\"$server\"})/1024/1024",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "refId": "A",
          "step": 5
        }
      ],
      "thresholds": "500, 800",
      "title": "Server memory usage (in MB)",
      "type": "singlestat",
      "valueFontSize": "80%",
      "valueMaps": [
        {
          "op": "=",
          "text": "N/A",
          "value": "null"
        }
      ],
      "valueName": "current"
    },
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "fill": 1,
      "gridPos": {
        "h": 7,
        "w": 12,
        "x": 0,
        "y": 4
      },
      "id": 2,
      "legend": {
        "avg": false,
        "current": false,
        "max": false,
        "min": false,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 2,
      "links": [],
      "nullPointMode": "connected",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "irate(mattermost_post_total{instance=~\"$server\"}[1m])",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "{{instance}}",
          "metric": "mattermost_post_total",
          "refId": "A",
          "step": 5
        },
        {
          "expr": "sum(irate(mattermost_post_total{instance=~\"$server\"}[1m]))",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "Total",
          "metric": "mattermost_post_total",
          "refId": "B",
          "step": 5
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeShift": null,
      "title": "Number of Messages per Second",
      "tooltip": {
        "msResolution": false,
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "short",
          "label": "Count",
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "alert": {
        "conditions": [
          {
            "evaluator": {
              "params": [
                5000
              ],
              "type": "gt"
            },
            "operator": {
              "type": "and"
            },
            "query": {
              "params": [
                "C",
                "1m",
                "now"
              ]
            },
            "reducer": {
              "params": [],
              "type": "avg"
            },
            "type": "query"
          }
        ],
        "executionErrorState": "alerting",
        "frequency": "60s",
        "handler": 1,
        "name": "Number of API Errors per Second alert",
        "noDataState": "no_data",
        "notifications": []
      },
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "fill": 1,
      "gridPos": {
        "h": 7,
        "w": 12,
        "x": 12,
        "y": 4
      },
      "id": 5,
      "legend": {
        "avg": false,
        "current": false,
        "max": false,
        "min": false,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 2,
      "links": [],
      "nullPointMode": "connected",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "irate(mattermost_http_errors_total{instance=~\"$server\"}[1m])",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "{{instance}}",
          "metric": "mattermost_http_errors_total",
          "refId": "A",
          "step": 5
        },
        {
          "expr": "sum(irate(mattermost_http_errors_total{instance=~\"$server\"}[1m]))",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "Total",
          "metric": "mattermost_http_errors_total",
          "refId": "B",
          "step": 5
        },
        {
          "expr": "irate(mattermost_http_errors_total[1m])",
          "format": "time_series",
          "hide": true,
          "intervalFactor": 1,
          "refId": "C"
        }
      ],
      "thresholds": [
        {
          "colorMode": "critical",
          "fill": true,
          "line": true,
          "op": "gt",
          "value": 5000
        }
      ],
      "timeFrom": null,
      "timeShift": null,
      "title": "Number of API Errors per Second",
      "tooltip": {
        "msResolution": false,
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "short",
          "label": "Count",
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "alert": {
        "conditions": [
          {
            "evaluator": {
              "params": [
                1000
              ],
              "type": "gt"
            },
            "operator": {
              "type": "and"
            },
            "query": {
              "params": [
                "B",
                "1m",
                "now"
              ]
            },
            "reducer": {
              "params": [],
              "type": "avg"
            },
            "type": "query"
          }
        ],
        "executionErrorState": "alerting",
        "frequency": "60s",
        "handler": 1,
        "name": "Mean API Request Time (in milliseconds) alert",
        "noDataState": "no_data",
        "notifications": []
      },
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "fill": 1,
      "gridPos": {
        "h": 7,
        "w": 12,
        "x": 0,
        "y": 11
      },
      "id": 8,
      "legend": {
        "avg": false,
        "current": false,
        "max": false,
        "min": false,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 2,
      "links": [],
      "nullPointMode": "connected",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "1000.0 * rate(mattermost_http_request_duration_seconds_sum{instance=~\"$server\"}[1m]) /   rate(mattermost_http_request_duration_seconds_count{instance=~\"$server\"}[1m])",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "{{instance}}",
          "metric": "mattermost_http_request_duration_seconds_sum",
          "refId": "A",
          "step": 5
        },
        {
          "expr": "1000.0 * rate(mattermost_http_request_duration_seconds_sum[1m]) /   rate(mattermost_http_request_duration_seconds_count[1m])",
          "format": "time_series",
          "hide": true,
          "intervalFactor": 1,
          "refId": "B"
        }
      ],
      "thresholds": [
        {
          "colorMode": "critical",
          "fill": true,
          "line": true,
          "op": "gt",
          "value": 1000
        }
      ],
      "timeFrom": null,
      "timeShift": null,
      "title": "Mean API Request Time (in milliseconds)",
      "tooltip": {
        "msResolution": false,
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "short",
          "label": "Milliseconds (ms)",
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "fill": 1,
      "gridPos": {
        "h": 7,
        "w": 12,
        "x": 12,
        "y": 11
      },
      "id": 19,
      "legend": {
        "avg": false,
        "current": false,
        "max": false,
        "min": false,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 2,
      "links": [],
      "nullPointMode": "connected",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "mattermost_db_master_connections_total{instance=~\"$server\"}",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "{{instance}}",
          "metric": "mattermost_db_master_connections_total",
          "refId": "A",
          "step": 5
        },
        {
          "expr": "sum(mattermost_db_master_connections_total{instance=~\"$server\"})",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "Total",
          "metric": "mattermost_db_master_connections_total",
          "refId": "B",
          "step": 5
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeShift": null,
      "title": "Number of Connections to Master Database",
      "tooltip": {
        "msResolution": false,
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "short",
          "label": "Count",
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "fill": 1,
      "gridPos": {
        "h": 7,
        "w": 12,
        "x": 0,
        "y": 18
      },
      "id": 1,
      "legend": {
        "avg": false,
        "current": false,
        "max": false,
        "min": false,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 2,
      "links": [],
      "nullPointMode": "connected",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "1000.0 * rate(mattermost_cluster_cluster_request_duration_seconds_sum{instance=~\"$server\"}[1m]) /   rate(mattermost_cluster_cluster_request_duration_seconds_count{instance=~\"$server\"}[1m])",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "{{instance}}",
          "metric": "mattermost_cluster_cluster_request_duration_seconds_sum",
          "refId": "A",
          "step": 5
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeShift": null,
      "title": "Mean Cluster Request Time (in milliseconds)",
      "tooltip": {
        "msResolution": false,
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "short",
          "label": "Milliseconds (ms)",
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "fill": 1,
      "gridPos": {
        "h": 7,
        "w": 12,
        "x": 12,
        "y": 18
      },
      "id": 23,
      "legend": {
        "avg": false,
        "current": false,
        "max": false,
        "min": false,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 2,
      "links": [],
      "nullPointMode": "connected",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "mattermost_db_read_replica_connections_total{instance=~\"$server\"}",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "{{job}}",
          "metric": "mattermost_db_read_replica_connections_total",
          "refId": "A",
          "step": 5
        },
        {
          "expr": "sum(mattermost_db_read_replica_connections_total{instance=~\"$server\"})",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "Total",
          "metric": "mattermost_db_read_replica_connections_total",
          "refId": "B",
          "step": 5
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeShift": null,
      "title": "Number of Connections to Read Replica Databases",
      "tooltip": {
        "msResolution": false,
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "short",
          "label": "Count",
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "fill": 1,
      "gridPos": {
        "h": 7,
        "w": 12,
        "x": 0,
        "y": 25
      },
      "id": 22,
      "legend": {
        "avg": false,
        "current": false,
        "max": false,
        "min": false,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 2,
      "links": [],
      "nullPointMode": "connected",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "irate(mattermost_process_cpu_seconds_total{instance=~\"$server\"}[1m])* 100",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "{{instance}}",
          "metric": "mattermost_process_cpu_seconds_total",
          "refId": "A",
          "step": 5
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeShift": null,
      "title": "CPU Utilization Rate (%)",
      "tooltip": {
        "msResolution": false,
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "short",
          "label": "Utilization Rate (%)",
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${DS_MATTERMOST}",
      "editable": true,
      "error": false,
      "fill": 1,
      "gridPos": {
        "h": 7,
        "w": 12,
        "x": 12,
        "y": 25
      },
      "id": 18,
      "legend": {
        "avg": false,
        "current": false,
        "max": false,
        "min": false,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 2,
      "links": [],
      "nullPointMode": "connected",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "go_goroutines{instance=~\"$server\"}",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "{{instance}}",
          "metric": "go_goroutines",
          "refId": "A",
          "step": 5
        },
        {
          "expr": "sum(go_goroutines{instance=~\"$server\"})",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "Total",
          "metric": "go_goroutines",
          "refId": "B",
          "step": 5
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeShift": null,
      "title": "Number of Go Routines",
      "tooltip": {
        "msResolution": false,
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "short",
          "label": "Count",
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    }
  ],
  "refresh": "30s",
  "schemaVersion": 16,
  "style": "dark",
  "tags": [
    "mattermost",
    "mattermost-perf"
  ],
  "templating": {
    "list": [
      {
        "allValue": null,
        "current": {},
        "datasource": "${DS_MATTERMOST}",
        "hide": 0,
        "includeAll": false,
        "label": "server",
        "multi": true,
        "name": "server",
        "options": [],
        "query": "label_values(instance)",
        "refresh": 1,
        "regex": "",
        "sort": 0,
        "tagValuesQuery": null,
        "tags": [],
        "tagsQuery": null,
        "type": "query",
        "useTags": false
      }
    ]
  },
  "time": {
    "from": "now-6h",
    "to": "now"
  },
  "timepicker": {
    "refresh_intervals": [
      "5s",
      "10s",
      "30s",
      "1m",
      "5m",
      "15m",
      "30m",
      "1h",
      "2h",
      "1d"
    ],
    "time_options": [
      "5m",
      "15m",
      "1h",
      "6h",
      "12h",
      "24h",
      "2d",
      "7d",
      "30d"
    ]
  },
  "timezone": "browser",
  "title": "Mattermost Performance KPI Metrics",
  "uid": "000000010",
  "version": 41
}

source/samples/grafana-dashboards/mobile-push-notifications-monitoring.json METASEP
{
  "annotations": {
    "list": [
      {
        "builtIn": 1,
        "datasource": "-- Grafana --",
        "enable": true,
        "hide": true,
        "iconColor": "rgba(0, 211, 255, 1)",
        "name": "Annotations & Alerts",
        "type": "dashboard"
      }
    ]
  },
  "editable": true,
  "gnetId": null,
  "graphTooltip": 1,
  "id": 1,
  "iteration": 1554316834857,
  "links": [],
  "panels": [
    {
      "cacheTimeout": null,
      "colorBackground": false,
      "colorPostfix": false,
      "colorPrefix": false,
      "colorValue": false,
      "colors": [
        "#73BF69",
        "rgba(237, 129, 40, 0.89)",
        "rgba(245, 54, 54, 0.9)"
      ],
      "datasource": "Prometheus",
      "description": "The number of push notifications sent through the proxy",
      "format": "none",
      "gauge": {
        "maxValue": 100,
        "minValue": 0,
        "show": false,
        "thresholdLabels": false,
        "thresholdMarkers": true
      },
      "gridPos": {
        "h": 6,
        "w": 4,
        "x": 0,
        "y": 0
      },
      "hideTimeOverride": false,
      "id": 37,
      "interval": "",
      "links": [],
      "mappingType": 1,
      "mappingTypes": [
        {
          "name": "value to text",
          "value": 1
        },
        {
          "name": "range to text",
          "value": 2
        }
      ],
      "maxDataPoints": 100,
      "nullPointMode": "connected",
      "nullText": null,
      "postfix": "",
      "postfixFontSize": "50%",
      "prefix": "",
      "prefixFontSize": "50%",
      "rangeMaps": [
        {
          "from": "null",
          "text": "N/A",
          "to": "null"
        }
      ],
      "sparkline": {
        "fillColor": "rgba(31, 118, 189, 0.18)",
        "full": false,
        "lineColor": "rgb(31, 120, 193)",
        "show": true
      },
      "tableColumn": "",
      "targets": [
        {
          "expr": "sum(service_notifications_total{platform=\"$Platform\"}) without(type)",
          "format": "time_series",
          "instant": false,
          "intervalFactor": 1,
          "legendFormat": "",
          "refId": "A",
          "step": 60
        }
      ],
      "thresholds": "1,100",
      "timeFrom": null,
      "timeShift": null,
      "title": "Total Notifications",
      "type": "singlestat",
      "valueFontSize": "200%",
      "valueMaps": [
        {
          "op": "=",
          "text": "0",
          "value": "0"
        }
      ],
      "valueName": "current"
    },
    {
      "cacheTimeout": null,
      "colorBackground": false,
      "colorValue": true,
      "colors": [
        "#d44a3a",
        "rgba(237, 129, 40, 0.89)",
        "#299c46"
      ],
      "datasource": "Prometheus",
      "decimals": 1,
      "description": "The percentage of push notifications sent that contained new messages",
      "format": "percentunit",
      "gauge": {
        "maxValue": 1,
        "minValue": 0,
        "show": true,
        "thresholdLabels": false,
        "thresholdMarkers": true
      },
      "gridPos": {
        "h": 6,
        "w": 4,
        "x": 4,
        "y": 0
      },
      "id": 14,
      "interval": null,
      "links": [],
      "mappingType": 1,
      "mappingTypes": [
        {
          "name": "value to text",
          "value": 1
        },
        {
          "name": "range to text",
          "value": 2
        }
      ],
      "maxDataPoints": 100,
      "nullPointMode": "connected",
      "nullText": null,
      "postfix": "",
      "postfixFontSize": "50%",
      "prefix": "",
      "prefixFontSize": "50%",
      "rangeMaps": [],
      "sparkline": {
        "fillColor": "rgba(31, 118, 189, 0.18)",
        "full": false,
        "lineColor": "rgb(31, 120, 193)",
        "show": false
      },
      "tableColumn": "",
      "targets": [
        {
          "expr": "sum(service_notifications_total{platform=\"$Platform\", type=\"message\"}) /  sum(service_notifications_total{platform=\"$Platform\"})",
          "format": "time_series",
          "interval": "",
          "intervalFactor": 2,
          "legendFormat": "",
          "metric": "",
          "refId": "A",
          "step": 20
        }
      ],
      "thresholds": "0.1,0.5",
      "timeFrom": null,
      "timeShift": null,
      "title": "Message Notifications",
      "type": "singlestat",
      "valueFontSize": "70%",
      "valueMaps": [
        {
          "op": "=",
          "text": "N/A",
          "value": "null"
        }
      ],
      "valueName": "current"
    },
    {
      "cacheTimeout": null,
      "colorBackground": false,
      "colorValue": true,
      "colors": [
        "#299c46",
        "rgba(237, 129, 40, 0.89)",
        "#d44a3a"
      ],
      "datasource": "Prometheus",
      "decimals": 1,
      "description": "The percentage of push notifications sent to clear a previous notification",
      "format": "percentunit",
      "gauge": {
        "maxValue": 1,
        "minValue": 0,
        "show": true,
        "thresholdLabels": false,
        "thresholdMarkers": true
      },
      "gridPos": {
        "h": 6,
        "w": 4,
        "x": 8,
        "y": 0
      },
      "id": 16,
      "interval": null,
      "links": [],
      "mappingType": 1,
      "mappingTypes": [
        {
          "name": "value to text",
          "value": 1
        },
        {
          "name": "range to text",
          "value": 2
        }
      ],
      "maxDataPoints": 100,
      "nullPointMode": "connected",
      "nullText": null,
      "postfix": "",
      "postfixFontSize": "50%",
      "prefix": "",
      "prefixFontSize": "50%",
      "rangeMaps": [
        {
          "from": "null",
          "text": "N/A",
          "to": "null"
        }
      ],
      "sparkline": {
        "fillColor": "rgba(31, 118, 189, 0.18)",
        "full": false,
        "lineColor": "rgb(31, 120, 193)",
        "show": false
      },
      "tableColumn": "",
      "targets": [
        {
          "expr": "sum(service_notifications_total{platform=\"$Platform\", type=\"clear\"}) /  sum(service_notifications_total{platform=\"$Platform\"})",
          "format": "time_series",
          "instant": false,
          "intervalFactor": 2,
          "refId": "A"
        }
      ],
      "thresholds": "0.5,0.7",
      "timeFrom": null,
      "timeShift": null,
      "title": "Clear Notifications",
      "type": "singlestat",
      "valueFontSize": "70%",
      "valueMaps": [
        {
          "op": "=",
          "text": "N/A",
          "value": "null"
        }
      ],
      "valueName": "current"
    },
    {
      "cacheTimeout": null,
      "colorBackground": false,
      "colorValue": true,
      "colors": [
        "#299c46",
        "rgba(237, 129, 40, 0.89)",
        "#d44a3a"
      ],
      "datasource": "Prometheus",
      "decimals": 1,
      "description": "The percentage of push notifications sent to update the notification count on the app icon",
      "format": "percentunit",
      "gauge": {
        "maxValue": 1,
        "minValue": 0,
        "show": true,
        "thresholdLabels": false,
        "thresholdMarkers": true
      },
      "gridPos": {
        "h": 6,
        "w": 4,
        "x": 12,
        "y": 0
      },
      "id": 56,
      "interval": null,
      "links": [],
      "mappingType": 1,
      "mappingTypes": [
        {
          "name": "value to text",
          "value": 1
        },
        {
          "name": "range to text",
          "value": 2
        }
      ],
      "maxDataPoints": 100,
      "nullPointMode": "connected",
      "nullText": null,
      "postfix": "",
      "postfixFontSize": "50%",
      "prefix": "",
      "prefixFontSize": "50%",
      "rangeMaps": [
        {
          "from": "null",
          "text": "N/A",
          "to": "null"
        }
      ],
      "sparkline": {
        "fillColor": "rgba(31, 118, 189, 0.18)",
        "full": false,
        "lineColor": "rgb(31, 120, 193)",
        "show": false
      },
      "tableColumn": "",
      "targets": [
        {
          "expr": "sum(service_notifications_total{platform=\"$Platform\", type=\"update_badge\"}) /  sum(service_notifications_total{platform=\"$Platform\"})",
          "format": "time_series",
          "instant": false,
          "intervalFactor": 2,
          "refId": "A"
        }
      ],
      "thresholds": "0.5,0.7",
      "timeFrom": null,
      "timeShift": null,
      "title": "Update Badge Notifications",
      "type": "singlestat",
      "valueFontSize": "70%",
      "valueMaps": [
        {
          "op": "=",
          "text": "N/A",
          "value": "null"
        }
      ],
      "valueName": "current"
    },
    {
      "cacheTimeout": null,
      "colorBackground": false,
      "colorValue": true,
      "colors": [
        "#d44a3a",
        "rgba(237, 129, 40, 0.89)",
        "#299c46"
      ],
      "datasource": "Prometheus",
      "decimals": 1,
      "description": "Percentage successfully sent to the platform notification services",
      "format": "percentunit",
      "gauge": {
        "maxValue": 1,
        "minValue": 0,
        "show": true,
        "thresholdLabels": false,
        "thresholdMarkers": true
      },
      "gridPos": {
        "h": 6,
        "w": 4,
        "x": 16,
        "y": 0
      },
      "id": 44,
      "interval": null,
      "links": [],
      "mappingType": 1,
      "mappingTypes": [
        {
          "name": "value to text",
          "value": 1
        },
        {
          "name": "range to text",
          "value": 2
        }
      ],
      "maxDataPoints": 100,
      "nullPointMode": "connected",
      "nullText": null,
      "postfix": "",
      "postfixFontSize": "50%",
      "prefix": "",
      "prefixFontSize": "50%",
      "rangeMaps": [
        {
          "from": "null",
          "text": "N/A",
          "to": "null"
        }
      ],
      "sparkline": {
        "fillColor": "rgba(31, 118, 189, 0.18)",
        "full": false,
        "lineColor": "rgb(31, 120, 193)",
        "show": false
      },
      "tableColumn": "",
      "targets": [
        {
          "expr": "sum(service_success_total{platform=\"$Platform\"}) / sum(service_notifications_total{platform=\"$Platform\"})",
          "format": "time_series",
          "instant": false,
          "intervalFactor": 1,
          "refId": "A"
        }
      ],
      "thresholds": "0.8,0.9",
      "timeFrom": null,
      "timeShift": null,
      "title": "Push Notifications Sent",
      "type": "singlestat",
      "valueFontSize": "70%",
      "valueMaps": [
        {
          "op": "=",
          "text": "N/A",
          "value": "null"
        }
      ],
      "valueName": "current"
    },
    {
      "cacheTimeout": null,
      "colorBackground": false,
      "colorValue": true,
      "colors": [
        "#299c46",
        "rgba(237, 129, 40, 0.89)",
        "#d44a3a"
      ],
      "datasource": "Prometheus",
      "decimals": 1,
      "description": "Percentage successfully sent to the platform notification services",
      "format": "percentunit",
      "gauge": {
        "maxValue": 1,
        "minValue": 0,
        "show": true,
        "thresholdLabels": false,
        "thresholdMarkers": true
      },
      "gridPos": {
        "h": 6,
        "w": 4,
        "x": 20,
        "y": 0
      },
      "id": 54,
      "interval": null,
      "links": [],
      "mappingType": 1,
      "mappingTypes": [
        {
          "name": "value to text",
          "value": 1
        },
        {
          "name": "range to text",
          "value": 2
        }
      ],
      "maxDataPoints": 100,
      "nullPointMode": "connected",
      "nullText": null,
      "postfix": "",
      "postfixFontSize": "50%",
      "prefix": "",
      "prefixFontSize": "50%",
      "rangeMaps": [
        {
          "from": "null",
          "text": "N/A",
          "to": "null"
        }
      ],
      "sparkline": {
        "fillColor": "rgba(31, 118, 189, 0.18)",
        "full": false,
        "lineColor": "rgb(31, 120, 193)",
        "show": false
      },
      "tableColumn": "",
      "targets": [
        {
          "expr": "sum(service_failure_total{platform=\"$Platform\"}) / sum(service_notifications_total{platform=\"$Platform\"})",
          "format": "time_series",
          "instant": false,
          "intervalFactor": 1,
          "refId": "A"
        }
      ],
      "thresholds": "0.1,0.3",
      "timeFrom": null,
      "timeShift": null,
      "title": "Push Notifications Failures",
      "type": "singlestat",
      "valueFontSize": "70%",
      "valueMaps": [
        {
          "op": "=",
          "text": "N/A",
          "value": "null"
        }
      ],
      "valueName": "current"
    },
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "Prometheus",
      "description": "Notification requests per minute.\n\nThe amount of notifications queued to be sent to FCM for delivery.",
      "fill": 1,
      "gridPos": {
        "h": 8,
        "w": 12,
        "x": 0,
        "y": 6
      },
      "hideTimeOverride": false,
      "id": 46,
      "legend": {
        "alignAsTable": false,
        "avg": false,
        "current": false,
        "hideEmpty": false,
        "hideZero": false,
        "max": false,
        "min": false,
        "rightSide": false,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 1,
      "links": [],
      "nullPointMode": "null as zero",
      "paceLength": 10,
      "percentage": false,
      "pointradius": 2,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "idelta(service_notifications_total{platform=\"$Platform\"}[1m])",
          "format": "time_series",
          "hide": false,
          "instant": false,
          "intervalFactor": 1,
          "legendFormat": "{{type}}",
          "refId": "A"
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeRegions": [],
      "timeShift": null,
      "title": "Notifications Requests",
      "tooltip": {
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "decimals": 0,
          "format": "short",
          "label": "Count",
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "decimals": null,
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "Prometheus",
      "description": "Successful Notification per minute.\n\nThe amount of notifications that were successfully sent to FCM for delivery.",
      "fill": 1,
      "gridPos": {
        "h": 8,
        "w": 12,
        "x": 12,
        "y": 6
      },
      "hideTimeOverride": false,
      "id": 47,
      "legend": {
        "alignAsTable": false,
        "avg": false,
        "current": false,
        "hideEmpty": false,
        "hideZero": false,
        "max": false,
        "min": false,
        "rightSide": false,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 1,
      "links": [],
      "nullPointMode": "null as zero",
      "paceLength": 10,
      "percentage": false,
      "pointradius": 2,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "idelta(service_success_total{platform=\"$Platform\"}[1m])",
          "format": "time_series",
          "hide": false,
          "instant": false,
          "intervalFactor": 1,
          "legendFormat": "{{type}}",
          "refId": "A"
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeRegions": [],
      "timeShift": null,
      "title": "Successful Notifications",
      "tooltip": {
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "short",
          "label": "Count",
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "Prometheus",
      "description": "Rate of notification failures per minute\nTotal number of failed notifications / total number of notification attempts",
      "fill": 1,
      "gridPos": {
        "h": 8,
        "w": 12,
        "x": 0,
        "y": 14
      },
      "id": 49,
      "interval": "",
      "legend": {
        "avg": false,
        "current": false,
        "max": false,
        "min": false,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 1,
      "links": [],
      "nullPointMode": "null",
      "paceLength": 10,
      "percentage": false,
      "pointradius": 2,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "rate(service_failure_total{platform=\"$Platform\"}[1m]) / sum(rate(service_notifications_total{platform=\"$Platform\"}[1m])) by(instance, job, platform, type)",
          "format": "time_series",
          "intervalFactor": 1,
          "legendFormat": "{{type}}",
          "refId": "A"
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeRegions": [],
      "timeShift": null,
      "title": "Notification Failure Rate",
      "tooltip": {
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "decimals": 1,
          "format": "percentunit",
          "label": "Rate",
          "logBase": 1,
          "max": "1",
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "aliasColors": {},
      "breakPoint": "50%",
      "cacheTimeout": null,
      "combine": {
        "label": "Others",
        "threshold": 0
      },
      "datasource": "Prometheus",
      "description": "Why did the push notification failed to send",
      "fontSize": "80%",
      "format": "short",
      "gridPos": {
        "h": 8,
        "w": 12,
        "x": 12,
        "y": 14
      },
      "id": 51,
      "interval": null,
      "legend": {
        "percentage": true,
        "show": true,
        "sideWidth": null,
        "sort": null,
        "sortDesc": null,
        "values": true
      },
      "legendType": "Right side",
      "links": [],
      "maxDataPoints": 3,
      "nullPointMode": "connected",
      "pieType": "pie",
      "strokeWidth": 1,
      "targets": [
        {
          "expr": "service_failure_with_reason_total{platform=\"$Platform\"}",
          "format": "time_series",
          "intervalFactor": 1,
          "legendFormat": "{{reason}}",
          "refId": "A"
        }
      ],
      "timeFrom": null,
      "timeShift": null,
      "title": "Notification Failures Reason",
      "type": "grafana-piechart-panel",
      "valueName": "current"
    },
    {
      "alert": {
        "conditions": [
          {
            "evaluator": {
              "params": [
                1000
              ],
              "type": "gt"
            },
            "operator": {
              "type": "and"
            },
            "query": {
              "params": [
                "A",
                "5m",
                "now"
              ]
            },
            "reducer": {
              "params": [],
              "type": "avg"
            },
            "type": "query"
          }
        ],
        "executionErrorState": "alerting",
        "for": "0m",
        "frequency": "1m",
        "handler": 1,
        "name": "Mean Request Time alert",
        "noDataState": "no_data",
        "notifications": []
      },
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "description": "The time it took to process the request from the MM server",
      "fill": 1,
      "gridPos": {
        "h": 8,
        "w": 12,
        "x": 0,
        "y": 22
      },
      "id": 53,
      "legend": {
        "avg": false,
        "current": false,
        "max": false,
        "min": false,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 2,
      "links": [],
      "nullPointMode": "connected",
      "paceLength": 10,
      "percentage": false,
      "pointradius": 2,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "1000.0 * rate(service_request_duration_seconds_sum[1m]) / rate(service_request_duration_seconds_count[1m])",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "{{instance}}",
          "refId": "A"
        }
      ],
      "thresholds": [
        {
          "colorMode": "critical",
          "fill": true,
          "line": true,
          "op": "gt",
          "value": 1000,
          "yaxis": "left"
        }
      ],
      "timeFrom": null,
      "timeRegions": [],
      "timeShift": null,
      "title": "Mean Request Time",
      "tooltip": {
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "ms",
          "label": "Milliseconds (ms)",
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "alert": {
        "conditions": [
          {
            "evaluator": {
              "params": [
                1000
              ],
              "type": "gt"
            },
            "operator": {
              "type": "and"
            },
            "query": {
              "params": [
                "A",
                "5m",
                "now"
              ]
            },
            "reducer": {
              "params": [],
              "type": "avg"
            },
            "type": "query"
          }
        ],
        "executionErrorState": "alerting",
        "for": "0m",
        "frequency": "1m",
        "handler": 1,
        "name": "Mean Notification Request Time alert",
        "noDataState": "no_data",
        "notifications": []
      },
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "description": "The time it took to get the response from the Notification Service\n\nFCM for android\nAPNS for iOS",
      "fill": 1,
      "gridPos": {
        "h": 8,
        "w": 12,
        "x": 12,
        "y": 22
      },
      "id": 55,
      "legend": {
        "avg": false,
        "current": false,
        "max": false,
        "min": false,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 2,
      "links": [],
      "nullPointMode": "connected",
      "paceLength": 10,
      "percentage": false,
      "pointradius": 2,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "1000.0 * rate(service_notification_duration_seconds_sum{platform=\"$Platform\"}[1m]) / rate(service_notification_duration_seconds_count{platform=\"$Platform\"}[1m])",
          "format": "time_series",
          "interval": "5s",
          "intervalFactor": 1,
          "legendFormat": "{{instance}}",
          "refId": "A"
        }
      ],
      "thresholds": [
        {
          "colorMode": "critical",
          "fill": true,
          "line": true,
          "op": "gt",
          "value": 1000,
          "yaxis": "left"
        }
      ],
      "timeFrom": null,
      "timeRegions": [],
      "timeShift": null,
      "title": "Mean Notification Response Time",
      "tooltip": {
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "ms",
          "label": "Milliseconds (ms)",
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    }
  ],
  "refresh": "30s",
  "revision": "1.0",
  "schemaVersion": 18,
  "style": "dark",
  "tags": [
    "prometheus"
  ],
  "templating": {
    "list": [
      {
        "allValue": null,
        "current": {
          "tags": [],
          "text": "apple",
          "value": "apple"
        },
        "hide": 0,
        "includeAll": false,
        "label": "Platform",
        "multi": false,
        "name": "Platform",
        "options": [
          {
            "selected": false,
            "text": "android",
            "value": "android"
          },
          {
            "selected": true,
            "text": "apple",
            "value": "apple"
          }
        ],
        "query": "android, apple",
        "skipUrlSync": false,
        "type": "custom"
      }
    ]
  },
  "time": {
    "from": "now-1h",
    "to": "now"
  },
  "timepicker": {
    "now": true,
    "refresh_intervals": [
      "5s",
      "10s",
      "30s",
      "1m",
      "5m",
      "15m",
      "30m",
      "1h",
      "2h",
      "1d"
    ],
    "time_options": [
      "5m",
      "15m",
      "1h",
      "6h",
      "12h",
      "24h",
      "2d",
      "7d",
      "30d"
    ]
  },
  "timezone": "browser",
  "title": "Push Notifications",
  "uid": "7OjHq63mz",
  "version": 23
}

source/images/recipe/prod-vuln-incident9.png METASEP

source/images/recipe/prod-vuln-incident8.png METASEP

source/images/recipe/prod-vuln-incident7.png METASEP

source/images/recipe/prod-vuln-incident6.png METASEP

source/images/recipe/prod-vuln-incident5.png METASEP

source/images/recipe/prod-vuln-incident4.png METASEP

source/images/recipe/prod-vuln-incident3.png METASEP

source/images/recipe/prod-vuln-incident2.png METASEP

source/images/recipe/prod-vuln-incident10.png METASEP

source/images/recipe/prod-vuln-incident1.png METASEP

source/images/mobile/xcode_preferences.png METASEP

source/images/mobile/running_ios.png METASEP

source/images/mobile/proxy-config.png METASEP

source/images/mobile/ios_upload_csr.png METASEP

source/images/mobile/ios_type.png METASEP

source/images/mobile/ios_keychain_select.png METASEP

source/images/mobile/ios_keychain_save_cert_request.png METASEP

source/images/mobile/ios_keychain_request_certificate.png METASEP

source/images/mobile/ios_keychain_export_save.png METASEP

source/images/mobile/ios_keychain_export_password.png METASEP

source/images/mobile/ios_keychain_export.png METASEP

source/images/mobile/ios_keychain_create_cert_request.png METASEP

source/images/mobile/ios_icloud.png METASEP

source/images/mobile/ios_edit_appid.png METASEP

source/images/mobile/ios_csr.png METASEP

source/images/mobile/ios_create_push_certificate.png METASEP

source/images/mobile/ios_appid.png METASEP

source/images/mobile/ios_account.png METASEP

source/images/mobile/firebase_settings.png METASEP

source/images/mobile/firebase_sdk.png METASEP

source/images/mobile/firebase_register_app.png METASEP

source/images/mobile/firebase_project.png METASEP

source/images/mobile/firebase_google_services.png METASEP

source/images/mobile/firebase_dashboard.png METASEP

source/images/mobile/firebase_console.png METASEP

source/images/mobile/firebase_cloud_messaging.png METASEP

source/images/mobile/farebase_server_key.png METASEP

source/images/mobile/code_signing.png METASEP

source/images/mobile/appleemojiskintones.png METASEP

source/images/mobile/app_groups.png METASEP

source/images/mobile/androidemojiskintones.png METASEP

source/_static/images/Mattermost-Logo-Denim.svg METASEP
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 25.4.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
	 viewBox="0 0 1164 265" style="enable-background:new 0 0 1164 265;" xml:space="preserve">
<style type="text/css">
	.st0{fill-rule:evenodd;clip-rule:evenodd;fill:#1B1D21;}
</style>
<g id="XMLID_6_">
	<path id="XMLID_11_" class="st0" d="M280.1,79.4c4.5-0.6,8.9-0.9,13-0.9c4.4,0,8.8,0.3,13.1,0.9l28,58l28.8-58
		c3.5-0.6,7.4-0.9,11.7-0.9c4.3,0,8.4,0.3,12.4,0.9l5.8,106.6c-4.3,0.6-8.4,0.9-12.2,0.9c-3.8,0-7.6-0.3-11.4-0.9l-3.1-77.1
		l-24.7,53.3c-1.6,0.2-3.2,0.4-4.9,0.6c-1.7,0.2-3.4,0.2-5.1,0.2c-1.5,0-2.9-0.1-4.4-0.2c-1.5-0.1-3-0.3-4.6-0.6l-23-54.4L297,186
		c-3.6,0.6-7.1,0.9-10.5,0.9c-3.6,0-7.3-0.3-11.2-0.9L280.1,79.4L280.1,79.4z M1017.6,121.1h-10.2l-0.8-3.1l29.3-37.4h3.6v23.6h18.9
		c0.3,1.6,0.5,3,0.6,4.2c0.1,1.3,0.2,2.6,0.2,3.9c0,1.5-0.1,2.9-0.2,4.2c-0.1,1.4-0.3,2.9-0.6,4.5h-18.9v31.8c0,3.2,0.3,5.8,0.8,7.8
		c0.5,2,1.3,3.5,2.3,4.7c1,1.1,2.2,1.9,3.7,2.3c1.5,0.4,3.2,0.6,5.2,0.6c1.6,0,3.1-0.1,4.6-0.4c1.5-0.3,2.8-0.5,4-0.7
		c0.7,2,1.3,4,1.6,6.2c0.3,2.1,0.5,4,0.5,5.7c0,1.1,0,2.1-0.1,2.9c-0.1,0.8-0.1,1.5-0.2,2.3c-4.8,1.1-9.8,1.7-14.9,1.7
		c-9.5,0-16.7-2.2-21.7-6.6c-5-4.4-7.5-11.7-7.5-21.7V121.1L1017.6,121.1z M963.5,149.9c-5.8-1.7-10.4-4.1-13.7-7.4
		c-3.3-3.3-4.9-8.2-4.9-14.8c0-7.9,2.8-14.1,8.5-18.6c5.7-4.5,13.4-6.7,23.2-6.7c4.1,0,8.1,0.4,12,1.1c4,0.7,8,1.8,12,3.3
		c-0.2,2.7-0.7,5.5-1.6,8.4c-0.8,2.9-1.8,5.5-3,7.7c-2.5-1-5.3-2-8.3-2.7c-3-0.8-6.2-1.2-9.5-1.2c-3.5,0-6.3,0.5-8.3,1.6
		c-2,1.1-3,2.8-3,5.2c0,2.3,0.7,3.9,2.1,4.9c1.4,0.9,3.4,1.8,6,2.7l8.9,2.7c2.9,0.8,5.6,1.8,7.9,3c2.3,1.2,4.4,2.7,6,4.5
		c1.7,1.8,3,4,3.9,6.6c0.9,2.6,1.4,5.8,1.4,9.5c0,3.9-0.8,7.5-2.4,10.8c-1.6,3.3-4,6.2-7,8.7c-3.1,2.5-6.8,4.4-11.2,5.8
		c-4.4,1.4-9.3,2.1-14.9,2.1c-2.5,0-4.8-0.1-6.9-0.2c-2.1-0.2-4.1-0.4-6-0.8c-1.9-0.4-3.8-0.8-5.7-1.3c-1.9-0.5-3.9-1.2-6.1-2
		c0.2-2.8,0.7-5.7,1.5-8.5c0.8-2.9,1.8-5.7,3.1-8.4c3.4,1.4,6.7,2.4,9.8,3.1c3.1,0.7,6.3,1,9.6,1c1.5,0,3.1-0.1,4.8-0.4
		c1.7-0.3,3.3-0.7,4.8-1.4c1.5-0.7,2.7-1.6,3.7-2.7c1-1.1,1.5-2.5,1.5-4.3c0-2.5-0.8-4.3-2.3-5.4c-1.5-1.1-3.6-2.1-6.3-2.9
		L963.5,149.9L963.5,149.9z M896,186.9c-6.6,0-12.3-1.1-17.1-3.2c-4.9-2.1-8.9-5.1-12-8.9c-3.2-3.8-5.6-8.3-7.2-13.4
		c-1.6-5.1-2.4-10.6-2.4-16.6c0-5.9,0.8-11.5,2.4-16.7c1.6-5.2,4-9.7,7.2-13.5c3.2-3.8,7.2-6.8,12-9c4.8-2.2,10.6-3.3,17.1-3.3
		c6.6,0,12.3,1.1,17.2,3.3c4.9,2.2,9,5.2,12.2,9c3.2,3.8,5.6,8.3,7.2,13.5c1.6,5.2,2.3,10.8,2.3,16.7c0,5.9-0.8,11.5-2.3,16.6
		c-1.6,5.1-4,9.6-7.2,13.4c-3.2,3.8-7.3,6.8-12.2,8.9C908.3,185.9,902.6,186.9,896,186.9L896,186.9z M896,170c5.8,0,10-2.2,12.6-6.5
		c2.6-4.3,3.8-10.6,3.8-18.7c0-8.1-1.3-14.4-3.8-18.7c-2.6-4.3-6.8-6.5-12.6-6.5c-5.7,0-9.9,2.2-12.4,6.5
		c-2.6,4.3-3.8,10.6-3.8,18.7c0,8.1,1.3,14.4,3.8,18.7C886.1,167.9,890.2,170,896,170L896,170z M733.4,104.2
		c1.5-0.3,2.9-0.5,4.4-0.7c1.5-0.2,3.1-0.2,4.9-0.2c1.8,0,3.3,0.1,4.7,0.2c1.4,0.2,2.8,0.4,4.2,0.7c0.3,0.5,0.6,1.3,0.9,2.3
		c0.3,1,0.5,2,0.7,3.1c0.2,1.1,0.4,2.2,0.5,3.2c0.2,1,0.3,1.9,0.4,2.7c0.8-1.6,1.9-3.1,3.3-4.7c1.4-1.6,3-3,4.8-4.2
		c1.9-1.3,4-2.3,6.3-3.1c2.3-0.8,5-1.2,7.9-1.2c12.6,0,20.7,4.8,24.2,14.4c2.1-3.9,5-7.2,8.8-10.1c3.8-2.9,8.6-4.3,14.5-4.3
		c9.2,0,15.9,2.5,20.3,7.6c4.3,5.1,6.5,13,6.5,23.7v51.5c-3.8,0.6-7.5,0.9-11.1,0.9c-3.7,0-7.4-0.3-11.1-0.9v-45.7
		c0-5.6-0.7-10-2.1-13c-1.4-3-4.2-4.5-8.5-4.5c-1.8,0-3.5,0.3-5.2,0.8c-1.7,0.5-3.3,1.5-4.7,2.9c-1.4,1.4-2.6,3.4-3.4,5.9
		c-0.9,2.6-1.3,5.9-1.3,9.9v43.6c-3.8,0.6-7.5,0.9-11.1,0.9c-3.7,0-7.4-0.3-11.1-0.9v-45.7c0-5.6-0.7-10-2.1-13
		c-1.4-3-4.2-4.5-8.5-4.5c-1.8,0-3.5,0.3-5.3,0.8c-1.8,0.5-3.4,1.5-4.8,3.1c-1.4,1.5-2.5,3.6-3.4,6.3c-0.8,2.7-1.3,6.3-1.3,10.6
		v42.4c-3.8,0.6-7.5,0.9-11.1,0.9c-3.7,0-7.4-0.3-11.1-0.9V104.2L733.4,104.2z M674.2,104.2c1.6-0.3,3-0.5,4.5-0.7
		c1.4-0.2,2.9-0.2,4.6-0.2c1.6,0,3.1,0.1,4.6,0.3c1.5,0.2,3,0.5,4.5,0.8c0.3,0.5,0.6,1.3,0.9,2.3c0.3,1,0.5,2,0.7,3.1
		c0.2,1.1,0.4,2.2,0.5,3.3c0.2,1.1,0.3,2,0.4,2.7c2.3-3.2,5.1-6.1,8.4-8.7c3.3-2.6,7.5-3.8,12.5-3.8c1,0,2.2,0.1,3.6,0.2
		c1.4,0.1,2.3,0.3,3,0.5c0.2,1,0.4,2.2,0.5,3.6c0.1,1.4,0.2,2.8,0.2,4.2c0,1.8-0.1,3.7-0.2,5.8c-0.2,2.1-0.4,4.1-0.9,5.9
		c-1.1-0.2-2.4-0.3-3.8-0.3c-1.4,0-2.3,0-2.6,0c-1.8,0-3.8,0.2-5.9,0.5c-2.2,0.4-4.3,1.3-6.3,2.9c-2,1.6-3.6,3.9-4.9,7
		c-1.3,3.1-2,7.5-2,13.1v38.5c-1.9,0.3-3.8,0.5-5.6,0.6c-1.9,0.1-3.7,0.2-5.5,0.2c-1.8,0-3.6-0.1-5.4-0.2c-1.8-0.1-3.7-0.3-5.7-0.6
		V104.2L674.2,104.2z M613,151.4c0.4,6.3,2.6,10.8,6.6,13.6c4,2.8,9.2,4.2,15.6,4.2c3.5,0,7.2-0.3,10.9-1c3.7-0.7,7.2-1.6,10.6-2.9
		c1.1,2.1,2.1,4.6,3,7.5c0.8,2.9,1.3,6,1.4,9.4c-8.1,3.1-17.3,4.7-27.5,4.7c-7.5,0-13.9-1-19.3-3.1c-5.4-2.1-9.8-5-13.1-8.7
		c-3.4-3.7-5.9-8.1-7.5-13.2c-1.6-5.1-2.4-10.7-2.4-16.7c0-5.9,0.8-11.5,2.5-16.7c1.7-5.2,4.1-9.8,7.4-13.6
		c3.3-3.9,7.4-6.9,12.2-9.2c4.8-2.2,10.5-3.4,17-3.4c5.6,0,10.6,1,15,3c4.4,2,8.1,4.7,11.2,8.1c3.1,3.4,5.4,7.5,7,12.3
		c1.6,4.7,2.3,9.8,2.3,15.3c0,2-0.1,3.9-0.2,5.9c-0.2,1.9-0.3,3.5-0.5,4.6H613L613,151.4z M644.7,135.9c-0.2-5-1.6-9-4.1-12.1
		c-2.6-3.1-6.1-4.6-10.7-4.6c-5.2,0-9.2,1.5-11.9,4.4c-2.7,2.9-4.3,7-4.8,12.4H644.7L644.7,135.9z M542,121.1h-10.2l-0.8-3.1
		l29.3-37.4h3.6v23.6h18.9c0.3,1.6,0.5,3,0.6,4.2c0.1,1.3,0.2,2.6,0.2,3.9c0,1.5-0.1,2.9-0.2,4.2c-0.1,1.4-0.3,2.9-0.6,4.5h-18.9
		v31.8c0,3.2,0.3,5.8,0.8,7.8c0.5,2,1.3,3.5,2.3,4.7c1,1.1,2.2,1.9,3.7,2.3c1.5,0.4,3.2,0.6,5.2,0.6c1.6,0,3.1-0.1,4.6-0.4
		c1.5-0.3,2.8-0.5,4-0.7c0.7,2,1.3,4,1.6,6.2c0.3,2.1,0.5,4,0.5,5.7c0,1.1,0,2.1-0.1,2.9c-0.1,0.8-0.1,1.5-0.2,2.3
		c-4.8,1.1-9.8,1.7-14.9,1.7c-9.5,0-16.7-2.2-21.7-6.6c-5-4.4-7.5-11.7-7.5-21.7V121.1L542,121.1z M483.3,121.1h-10.2l-0.8-3.1
		l29.3-37.4h3.6v23.6h18.9c0.3,1.6,0.5,3,0.6,4.2c0.1,1.3,0.2,2.6,0.2,3.9c0,1.5-0.1,2.9-0.2,4.2c-0.1,1.4-0.3,2.9-0.6,4.5h-18.9
		v31.8c0,3.2,0.3,5.8,0.8,7.8c0.5,2,1.3,3.5,2.3,4.7c1,1.1,2.2,1.9,3.7,2.3c1.5,0.4,3.2,0.6,5.2,0.6c1.6,0,3.1-0.1,4.6-0.4
		c1.5-0.3,2.8-0.5,4-0.7c0.7,2,1.3,4,1.6,6.2c0.3,2.1,0.5,4,0.5,5.7c0,1.1,0,2.1-0.1,2.9c-0.1,0.8-0.1,1.5-0.2,2.3
		c-4.8,1.1-9.8,1.7-14.9,1.7c-9.5,0-16.7-2.2-21.7-6.6c-5-4.4-7.5-11.7-7.5-21.7V121.1L483.3,121.1z M446.9,148
		c-1.3-0.2-2.6-0.4-4.1-0.5c-1.5-0.2-2.8-0.2-3.9-0.2c-5.1,0-9.2,0.9-12.1,2.7c-3,1.8-4.5,4.8-4.5,8.8c0,2.7,0.6,4.8,1.7,6.3
		c1.1,1.5,2.5,2.5,4.1,3.2c1.6,0.7,3.3,1.1,5.2,1.3c1.8,0.2,3.4,0.2,4.8,0.2c1.6,0,3.1-0.1,4.7-0.4c1.6-0.3,2.9-0.5,4.1-0.7V148
		L446.9,148z M446.9,131.9c0-2.5-0.4-4.5-1.3-6.1c-0.8-1.6-2-2.8-3.4-3.7c-1.5-0.9-3.3-1.5-5.4-1.8c-2.1-0.3-4.5-0.5-7.1-0.5
		c-5.6,0-11.6,1.1-18,3.3c-1.5-2.7-2.6-5.3-3.3-7.7c-0.7-2.4-1.1-5.3-1.1-8.6c4.6-1.6,9.2-2.7,13.8-3.4c4.6-0.7,8.9-1.1,12.8-1.1
		c10.8,0,19.3,2.6,25.4,7.8c6.1,5.2,9.2,13.6,9.2,25v46.9c-3.7,1.1-8.1,2.2-13.3,3.3c-5.2,1-11.1,1.6-17.7,1.6
		c-5.3,0-10.2-0.5-14.6-1.4c-4.4-0.9-8.2-2.5-11.4-4.7c-3.2-2.2-5.6-5-7.4-8.4c-1.7-3.4-2.6-7.7-2.6-12.7c0-5,1.1-9.2,3.2-12.6
		c2.1-3.4,4.9-6.1,8.3-8.1c3.4-2,7.2-3.5,11.3-4.4c4.2-0.9,8.3-1.3,12.5-1.3c3,0,6.4,0.2,10,0.5V131.9z"/>
	<g id="XMLID_2_">
		<g id="XMLID_3_">
			<path id="XMLID_4_" class="st0" d="M192.4,62.7l0.9,17.4c14.1,15.6,19.7,37.7,12.7,58.5c-10.5,31-45.1,47.3-77.4,36.4
				s-49.8-44.9-39.3-75.9c7.1-20.9,25-35.1,45.8-38.8L146.3,47c-35.1-0.9-68.1,20.8-80,55.8c-14.5,43,8.5,89.6,51.5,104.1
				s89.6-8.5,104.1-51.5C233.7,120.6,220.7,83.2,192.4,62.7z"/>
		</g>
		<path id="XMLID_5_" class="st0" d="M172.3,114.1l-0.6-24.4l-0.5-14l-0.3-12.2c0,0,0.1-5.9-0.1-7.2c0-0.3-0.1-0.5-0.2-0.7
			c0,0,0-0.1,0-0.1c0,0,0-0.1,0-0.1c-0.2-0.4-0.6-0.7-1-0.9c-0.5-0.2-1-0.1-1.4,0.1c0,0,0,0,0,0c0,0-0.1,0-0.1,0.1
			c-0.2,0.1-0.4,0.2-0.6,0.4c-1,1-4.5,5.7-4.5,5.7l-7.6,9.5l-8.9,10.9l-15.3,19c0,0-7,8.7-5.5,19.5c1.5,10.8,9.6,16,15.8,18.1
			c6.2,2.1,15.8,2.8,23.5-4.8C172.5,125.3,172.3,114.1,172.3,114.1z"/>
	</g>
</g>
</svg>

source/_static/images/Mattermost-Logo-Blue.svg METASEP
<?xml version="1.0" encoding="UTF-8"?>
<svg width="747px" height="123px" viewBox="0 0 747 123" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 46 (44423) - http://www.bohemiancoding.com/sketch -->
    <title>Logo Blue</title>
    <desc>Created with Sketch.</desc>
    <defs></defs>
    <g id="UI-Kit" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="Logos" transform="translate(-346.000000, -426.000000)">
            <g id="Logo-Blue" transform="translate(346.000000, 426.000000)">
                <g>
                    <path d="M287.469241,63.7570427 C287.469241,61.8940143 287.15702,60.3781155 286.533324,59.2115812 C285.911122,58.0480265 285.053634,57.1332728 283.963101,56.4747694 C282.872567,55.8132863 281.528073,55.3655934 279.931861,55.1339253 C278.334154,54.9007674 276.561664,54.7845609 274.613642,54.7845609 C270.406871,54.7845609 265.928214,55.5994962 261.175429,57.2308565 C260.084149,55.2106514 259.266995,53.3066528 258.722476,51.5203505 C258.177209,49.7340482 257.903081,47.5976366 257.903081,45.1103708 C261.33154,43.9453262 264.758505,43.0909106 268.186963,42.5471238 C271.613928,42.003337 274.810087,41.7306987 277.76872,41.7306987 C285.871534,41.7306987 292.201111,43.6726879 296.758944,47.5589011 C301.31603,51.4436244 303.594947,57.6576918 303.594947,66.2040831 L303.594947,101.165848 C300.867866,102.020264 297.556677,102.836689 293.66138,103.613633 C289.767578,104.390578 285.365108,104.779423 280.45696,104.779423 C276.483982,104.779423 272.841151,104.429314 269.529963,103.72984 C266.219521,103.031111 263.37517,101.864577 261.001392,100.233216 C258.623879,98.603346 256.793874,96.504925 255.506895,93.9409331 C254.222904,91.3761963 253.579788,88.2304271 253.579788,84.5006457 C253.579788,80.7723542 254.378268,77.6452078 255.975227,75.1199515 C257.572187,72.59544 259.637478,70.57449 262.168114,69.0600811 C264.70099,67.5449272 267.524426,66.4573537 270.641411,65.7966155 C273.757648,65.1358773 276.873138,64.8058807 279.989375,64.8058807 C282.248871,64.8058807 284.741413,64.923577 287.469241,65.1552451 L287.469241,63.7570427 Z M287.469241,75.7613219 C286.533324,75.605635 285.521219,75.4685709 284.429192,75.3531093 C283.338658,75.2369029 282.366888,75.1787996 281.508653,75.1787996 C277.691038,75.1787996 274.671903,75.8574157 272.451248,77.2176276 C270.23134,78.5770945 269.121386,80.7723542 269.121386,83.801917 C269.121386,85.822867 269.55013,87.3752665 270.406871,88.4643299 C271.263612,89.5511585 272.296631,90.3474709 273.503688,90.8517773 C274.711491,91.3575735 275.995483,91.6682023 277.359397,91.7851537 C278.724057,91.9006153 279.911693,91.9609533 280.923051,91.9609533 C282.092761,91.9609533 283.261723,91.8626247 284.429192,91.6682023 C285.598901,91.4737799 286.611006,91.3002151 287.469241,91.1437833 L287.469241,75.7613219 Z M314.657887,55.7157027 L307.061499,55.7157027 L306.475897,53.3848687 L328.329893,25.5318122 L331.017386,25.5318122 L331.017386,43.1289012 L345.156976,43.1289012 C345.389275,44.2954355 345.546132,45.3435287 345.625308,46.2754153 C345.701496,47.2087918 345.740337,48.1794139 345.740337,49.1902614 C345.740337,50.27709 345.701496,51.3259281 345.625308,52.3360306 C345.546132,53.3468781 345.389275,54.4731871 345.156976,55.7157027 L331.017386,55.7157027 L331.017386,79.3741518 C331.017386,81.7817119 331.213084,83.7237011 331.602987,85.2008643 C331.99065,86.6750479 332.556084,87.8415823 333.295555,88.6967428 C334.037268,89.5511585 334.951523,90.1336808 336.042057,90.4443096 C337.13259,90.7564284 338.41957,90.9113703 339.897765,90.9113703 C341.067475,90.9113703 342.215523,90.8137867 343.346391,90.6193643 C344.475019,90.4256868 345.46845,90.2506322 346.325191,90.0956902 C346.871952,91.5698738 347.259614,93.1051403 347.494154,94.69851 C347.728693,96.2911348 347.844469,97.7101948 347.844469,98.9527104 C347.844469,99.807126 347.825796,100.525223 347.786208,101.10849 C347.747367,101.690267 347.689852,102.255656 347.610677,102.797953 C344.027601,103.653859 340.328003,104.079204 336.510389,104.079204 C329.420426,104.079204 324.005105,102.429221 320.266666,99.1285099 C316.52748,95.825564 314.657887,90.4443096 314.657887,82.9862368 L314.657887,55.7157027 Z M358.500327,55.7157027 L350.905433,55.7157027 L350.319831,53.3848687 L372.173079,25.5318122 L374.860572,25.5318122 L374.860572,43.1289012 L389.000163,43.1289012 C389.233208,44.2954355 389.390066,45.3435287 389.468494,46.2754153 C389.544682,47.2087918 389.58427,48.1794139 389.58427,49.1902614 C389.58427,50.27709 389.544682,51.3259281 389.468494,52.3360306 C389.390066,53.3468781 389.233208,54.4731871 389.000163,55.7157027 L374.860572,55.7157027 L374.860572,79.3741518 C374.860572,81.7817119 375.057018,83.7237011 375.445427,85.2008643 C375.83533,86.6750479 376.400018,87.8415823 377.139489,88.6967428 C377.880454,89.5511585 378.793963,90.1336808 379.88599,90.4443096 C380.975777,90.7564284 382.262756,90.9113703 383.740952,90.9113703 C384.909915,90.9113703 386.05871,90.8137867 387.189578,90.6193643 C388.318953,90.4256868 389.312384,90.2506322 390.169125,90.0956902 C390.714392,91.5698738 391.103548,93.1051403 391.336594,94.69851 C391.57188,96.2911348 391.688403,97.7101948 391.688403,98.9527104 C391.688403,99.807126 391.668982,100.525223 391.629394,101.10849 C391.5913,101.690267 391.533039,102.255656 391.45461,102.797953 C387.870788,103.653859 384.171937,104.079204 380.352828,104.079204 C373.26436,104.079204 367.849039,102.429221 364.109853,99.1285099 C360.370667,95.825564 358.500327,90.4443096 358.500327,82.9862368 L358.500327,55.7157027 Z M435.261197,66.7888401 C435.105833,63.057569 434.072814,60.0481189 432.16438,57.7560204 C430.255946,55.4639219 427.587873,54.3167553 424.159415,54.3167553 C420.264118,54.3167553 417.303992,55.4050738 415.278288,57.5802209 C413.253332,59.7561129 412.046275,62.825156 411.657119,66.7888401 L435.261197,66.7888401 Z M411.539102,78.3245688 C411.851324,82.9862368 413.487124,86.3659089 416.447251,88.4643299 C419.407377,90.562006 423.302674,91.610844 428.133887,91.610844 C430.782539,91.610844 433.487959,91.3575735 436.254628,90.8517773 C439.02055,90.3474709 441.649035,89.6286295 444.14307,88.6967428 C444.999811,90.2506322 445.739283,92.1151504 446.362978,94.2910424 C446.985927,96.4646996 447.336242,98.7970235 447.414671,101.282799 C441.33756,103.613633 434.48139,104.779423 426.846161,104.779423 C421.238129,104.779423 416.428577,104.002478 412.414517,102.447844 C408.403445,100.8947 405.131097,98.7374304 402.599714,95.9812509 C400.067585,93.2228366 398.197245,89.9400033 396.990189,86.1320061 C395.783132,82.3254986 395.180351,78.1696269 395.180351,73.6643907 C395.180351,69.2351357 395.802553,65.078519 397.049197,61.1937957 C398.294347,57.3075826 400.145267,53.9294003 402.599714,51.0555245 C405.053415,48.1794139 408.091224,45.9074281 411.714634,44.2365874 C415.337297,42.5664916 419.563488,41.7306987 424.393207,41.7306987 C428.599978,41.7306987 432.339911,42.4689079 435.611512,43.9453262 C438.88386,45.4209996 441.668455,47.4419497 443.966792,50.0066865 C446.265129,52.5684436 447.999526,55.6196088 449.167741,59.1542228 C450.336704,62.6888369 450.920811,66.4774663 450.920811,70.5163867 C450.920811,71.9928051 450.86255,73.4506006 450.74528,74.8867936 C450.628758,76.3229866 450.490574,77.4701532 450.336704,78.3245688 L411.539102,78.3245688 Z M457.257858,43.1289012 C458.426073,42.8972331 459.536027,42.7214335 460.58772,42.605972 C461.640906,42.4875307 462.788208,42.4301724 464.035599,42.4301724 C465.204561,42.4301724 466.354103,42.5091332 467.481984,42.6625854 C468.612852,42.8182723 469.722806,43.0134396 470.811846,43.2465975 C471.047132,43.6354423 471.261504,44.1978519 471.455709,44.936061 C471.650661,45.6742702 471.825445,46.4512149 471.981555,47.2676399 C472.137666,48.0833201 472.272862,48.8975104 472.390132,49.7146804 C472.507402,50.5311055 472.603757,51.2082317 472.682933,51.7549982 C474.396415,49.3452034 476.501294,47.1886791 478.993089,45.2861703 C481.486378,43.3821717 484.602615,42.4301724 488.341054,42.4301724 C489.121607,42.4301724 490.017189,42.4689079 491.029294,42.5471238 C492.041399,42.6245948 492.781617,42.7408013 493.249202,42.8972331 C493.405313,43.6726879 493.522582,44.566584 493.599517,45.5766865 C493.67944,46.5867891 493.717534,47.6356271 493.717534,48.7239456 C493.717534,50.044677 493.657779,51.481615 493.542003,53.0355043 C493.424733,54.5893936 493.210361,56.065067 492.89814,57.4640144 C492.041399,57.3075826 491.087555,57.2308565 490.036609,57.2308565 C488.984917,57.2308565 488.341054,57.2308565 488.108755,57.2308565 C486.782935,57.2308565 485.303992,57.3671756 483.666698,57.6383241 C482.031644,57.9109624 480.473526,58.6290589 478.993089,59.7955933 C477.511905,60.9606378 476.286176,62.7089495 475.311418,65.0405284 C474.338154,67.3698726 473.849655,70.6333381 473.849655,74.8294352 L473.849655,103.498172 C472.44914,103.72984 471.047132,103.885527 469.643631,103.962998 C468.24237,104.041214 466.879203,104.079204 465.55413,104.079204 C464.229056,104.079204 462.886057,104.041214 461.522143,103.962998 C460.158976,103.885527 458.737547,103.72984 457.257858,103.498172 L457.257858,43.1289012 Z M501.496176,43.1289012 C502.585963,42.8972331 503.677243,42.7214335 504.76703,42.605972 C505.85831,42.4875307 507.065367,42.4301724 508.39044,42.4301724 C509.714766,42.4301724 510.882981,42.4875307 511.895833,42.605972 C512.908685,42.7214335 513.960378,42.8972331 515.050911,43.1289012 C515.283957,43.5177459 515.499823,44.0816454 515.694027,44.8198545 C515.888232,45.5573188 516.06451,46.3357533 516.219874,47.1499436 C516.375984,47.9663687 516.511181,48.7619362 516.62845,49.5388808 C516.747214,50.3158255 516.843569,50.9765637 516.921251,51.5203505 C517.542706,50.3560508 518.3621,49.1902614 519.375699,48.023727 C520.387804,46.8601723 521.59486,45.8120792 522.996868,44.8779578 C524.398876,43.9453262 525.976415,43.1877493 527.730232,42.605972 C529.482555,42.0219599 531.450745,41.7306987 533.631812,41.7306987 C543.057458,41.7306987 549.094981,45.3055381 551.74438,52.4537269 C553.301752,49.5783613 555.502987,47.0739625 558.345843,44.936061 C561.190194,42.7989045 564.793437,41.7306987 569.157065,41.7306987 C576.011741,41.7306987 581.055833,43.6168194 584.288593,47.3845913 C587.522847,51.1516183 589.139227,57.037179 589.139227,65.0405284 L589.139227,103.38122 C586.335211,103.847536 583.567795,104.079204 580.842208,104.079204 C578.115127,104.079204 575.349205,103.847536 572.545189,103.38122 L572.545189,69.3505973 C572.545189,65.1552451 572.018596,61.9320049 570.966156,59.6793868 C569.915957,57.4260238 567.793151,56.2989698 564.599232,56.2989698 C563.273412,56.2989698 561.97,56.4941371 560.685262,56.8814921 C559.398283,57.2688471 558.230068,57.9876885 557.179122,59.0372714 C556.127429,60.0861095 555.270688,61.5632727 554.607404,63.4665264 C553.944868,65.3682903 553.613973,67.8369333 553.613973,70.866496 L553.613973,103.38122 C550.80921,103.847536 548.043288,104.079204 545.316954,104.079204 C542.59062,104.079204 539.823951,103.847536 537.019188,103.38122 L537.019188,69.3505973 C537.019188,65.1552451 536.494089,61.9320049 535.441649,59.6793868 C534.389957,57.4260238 532.267898,56.2989698 529.073979,56.2989698 C527.751147,56.2989698 526.425327,56.4941371 525.100253,56.8814921 C523.777421,57.2688471 522.588291,58.0271689 521.536599,59.1542228 C520.484159,60.279787 519.646838,61.853044 519.024637,63.8739941 C518.400941,65.8934543 518.08872,68.535662 518.08872,71.7983827 L518.08872,103.38122 C515.283957,103.847536 512.520276,104.079204 509.792448,104.079204 C507.065367,104.079204 504.300939,103.847536 501.496176,103.38122 L501.496176,43.1289012 Z M622.933818,92.1926214 C627.2967,92.1926214 630.432357,90.5813737 632.340044,87.3558987 C634.249225,84.1326585 635.203815,79.4896134 635.203815,73.4304879 C635.203815,67.3698726 634.249225,62.7283173 632.340044,59.5035872 C630.432357,56.2781123 627.2967,54.6668646 622.933818,54.6668646 C618.649365,54.6668646 615.552549,56.2781123 613.644115,59.5035872 C611.734187,62.7283173 610.779597,67.3698726 610.779597,73.4304879 C610.779597,79.4896134 611.734187,84.1326585 613.644115,87.3558987 C615.552549,90.5813737 618.649365,92.1926214 622.933818,92.1926214 Z M622.933818,104.779423 C618.02567,104.779423 613.759891,103.982366 610.137974,102.389741 C606.515311,100.797861 603.515597,98.5832333 601.139578,95.7466031 C598.763559,92.9107179 596.971648,89.589894 595.765339,85.7826417 C594.556789,81.9753894 593.95326,77.858998 593.95326,73.4304879 C593.95326,69.0019778 594.556789,64.8446162 595.765339,60.9606378 C596.971648,57.0759145 598.763559,53.7156102 601.139578,50.8797249 C603.515597,48.0430948 606.515311,45.8120792 610.137974,44.1784841 C613.759891,42.5471238 618.02567,41.7306987 622.933818,41.7306987 C627.841966,41.7306987 632.125672,42.5471238 635.787923,44.1784841 C639.44868,45.8120792 642.486488,48.0430948 644.903589,50.8797249 C647.318449,53.7156102 649.109613,57.0759145 650.279322,60.9606378 C651.447538,64.8446162 652.030899,69.0019778 652.030899,73.4304879 C652.030899,77.858998 651.447538,81.9753894 650.279322,85.7826417 C649.109613,89.589894 647.318449,92.9107179 644.903589,95.7466031 C642.486488,98.5832333 639.44868,100.797861 635.787923,102.389741 C632.125672,103.982366 627.841966,104.779423 622.933818,104.779423 Z M673.335145,77.1595243 C668.971517,75.915519 665.563226,74.0711134 663.110272,71.623328 C660.655824,69.1770325 659.428601,65.5053544 659.428601,60.6097836 C659.428601,54.7048552 661.552153,50.0841574 665.798512,46.7432209 C670.043377,43.4015395 675.829181,41.7306987 683.151442,41.7306987 C686.189997,41.7306987 689.188218,42.003337 692.149091,42.5471238 C695.109965,43.0909106 698.108932,43.9058458 701.146741,44.9949092 C700.99063,47.0136245 700.601474,49.1113006 699.977031,51.2879375 C699.355576,53.4623397 698.615358,55.3655934 697.758617,56.9991884 C695.888277,56.2214988 693.82448,55.5413929 691.564237,54.9581257 C689.306234,54.3763484 686.929469,54.0850872 684.436927,54.0850872 C681.787528,54.0850872 679.724477,54.4925549 678.242547,55.308235 C676.762857,56.1246601 676.022638,57.4260238 676.022638,59.2115812 C676.022638,60.9211574 676.548485,62.1256823 677.600177,62.825156 C678.65187,63.5238848 680.152474,64.1861128 682.099002,64.8058807 L688.760221,66.7888401 C690.942035,67.409353 692.90873,68.166185 694.6618,69.0600811 C696.414123,69.9539771 697.914728,71.0609184 699.160625,72.3809049 C700.407269,73.7016364 701.380533,75.3337416 702.081164,77.2757308 C702.783288,79.2184649 703.13435,81.5872895 703.13435,84.3836943 C703.13435,87.2598049 702.530075,89.9400033 701.322272,92.4257793 C700.115215,94.9123001 698.361398,97.0680795 696.063808,98.8931173 C693.765471,100.72039 690.980129,102.157328 687.707781,103.205421 C684.436927,104.255004 680.735835,104.779423 676.606746,104.779423 C674.736406,104.779423 673.024418,104.720575 671.466299,104.604368 C669.907434,104.486672 668.408323,104.292994 666.966728,104.021846 C665.525879,103.749208 664.103703,103.419956 662.701695,103.031111 C661.298941,102.643011 659.779663,102.13796 658.143862,101.515957 C658.30072,99.4175363 658.670456,97.3004925 659.253817,95.1648258 C659.837924,93.0291591 660.59831,90.9493609 661.532733,88.9291558 C664.103703,89.9400033 666.538731,90.6968353 668.837068,91.2018866 C671.135404,91.7076828 673.530844,91.9609533 676.022638,91.9609533 C677.114666,91.9609533 678.302302,91.8626247 679.586293,91.6682023 C680.872525,91.4737799 682.060908,91.1244156 683.151442,90.6193643 C684.242722,90.114313 685.158472,89.4535748 685.897943,88.6386396 C686.638162,87.8229594 687.006404,86.7547536 687.006404,85.4325324 C687.006404,83.569504 686.442463,82.2286599 685.313089,81.4129797 C684.182967,80.5980445 682.605428,79.8769683 680.581218,79.2564555 L673.335145,77.1595243 Z M713.753608,55.7157027 L706.159461,55.7157027 L705.573112,53.3848687 L727.425613,25.5318122 L730.113106,25.5318122 L730.113106,43.1289012 L744.253444,43.1289012 C744.487236,44.2954355 744.6426,45.3435287 744.721775,46.2754153 C744.79871,47.2087918 744.838298,48.1794139 744.838298,49.1902614 C744.838298,50.27709 744.79871,51.3259281 744.721775,52.3360306 C744.6426,53.3468781 744.487236,54.4731871 744.253444,55.7157027 L730.113106,55.7157027 L730.113106,79.3741518 C730.113106,81.7817119 730.309552,83.7237011 730.697961,85.2008643 C731.088611,86.6750479 731.652552,87.8415823 732.392023,88.6967428 C733.133735,89.5511585 734.048738,90.1336808 735.138524,90.4443096 C736.228311,90.7564284 737.516037,90.9113703 738.99498,90.9113703 C740.163942,90.9113703 741.311991,90.8137867 742.442859,90.6193643 C743.571487,90.4256868 744.564918,90.2506322 745.421659,90.0956902 C745.967673,91.5698738 746.357576,93.1051403 746.589874,94.69851 C746.825161,96.2911348 746.940937,97.7101948 746.940937,98.9527104 C746.940937,99.807126 746.921516,100.525223 746.882675,101.10849 C746.843834,101.690267 746.78632,102.255656 746.707144,102.797953 C743.124816,103.653859 739.424471,104.079204 735.606856,104.079204 C728.516894,104.079204 723.10232,102.429221 719.362387,99.1285099 C715.623948,95.825564 713.753608,90.4443096 713.753608,82.9862368 L713.753608,55.7157027 Z M162.88399,24.6811211 C166.26091,24.2125706 169.509355,23.977178 172.631568,23.977178 C175.923336,23.977178 179.173276,24.2125706 182.379893,24.6811211 L203.268094,67.9181288 L224.788953,24.6811211 C227.405487,24.2125706 230.315568,23.977178 233.523679,23.977178 C236.731043,23.977178 239.809933,24.2125706 242.764831,24.6811211 L247.068705,104.076225 C243.862834,104.54552 240.824279,104.779423 237.955279,104.779423 C235.084039,104.779423 232.258362,104.54552 229.473766,104.076225 L227.194103,46.6724541 L208.711051,86.347286 C207.528644,86.5037178 206.305902,86.6422717 205.03909,86.7577333 C203.773026,86.8754296 202.508455,86.9335329 201.241643,86.9335329 C200.14364,86.9335329 199.047878,86.8947974 197.951369,86.8165815 C196.854113,86.7383656 195.715028,86.5811888 194.53262,86.347286 L177.316381,45.8500698 L175.54389,104.076225 C172.843699,104.54552 170.227165,104.779423 167.694289,104.779423 C164.993351,104.779423 162.207262,104.54552 159.339756,104.076225 L162.88399,24.6811211 Z" id="Shape" fill="#263238"></path>
                    <g id="icon" fill="#1875F0">
                        <path d="M97.4086496,12.2149956 L98.0547534,25.2018156 C108.612015,36.8336381 112.779198,53.3066528 107.523722,68.7889326 C99.6786028,91.8998704 73.8098006,104.048663 49.7448606,95.9238925 C25.6791736,87.7998671 12.530027,62.4780264 20.3751467,39.3670886 C25.6478021,23.8334097 39.0628596,13.251915 54.5999761,10.4502958 L62.9948442,0.558590938 C36.8048574,-0.148331866 12.0960544,16.0639631 3.25526255,42.1083698 C-7.60675118,74.1083591 9.59903112,108.831007 41.6861158,119.664282 C73.7732005,130.496813 108.591101,113.336988 119.453862,81.3369986 C128.279715,55.3350519 118.573218,27.5341394 97.4086496,12.2149956 Z" id="Shape"></path>
                        <path d="M82.3674075,50.536414 L81.9229777,32.38064 L81.5666869,21.9332298 L81.325425,12.8825321 C81.325425,12.8825321 81.3754701,8.51808458 81.2230941,7.49233884 C81.1909757,7.27631396 81.1230041,7.10125931 81.0415875,6.94780716 L81.0109629,6.88374461 L80.9758567,6.8278761 C80.808542,6.53959462 80.5441249,6.30569182 80.2027729,6.19023024 C79.8539516,6.07253393 79.4924322,6.10158555 79.1787171,6.23641487 L79.1592966,6.24386401 L79.0509902,6.2989876 C78.9023489,6.3712442 78.7507199,6.46510328 78.6028257,6.60812665 C77.8566318,7.32994772 75.2386041,10.8273161 75.2386041,10.8273161 L69.53347,17.8712171 L62.8871903,25.9542722 L51.4754281,40.1068816 C51.4754281,40.1068816 46.2386259,46.6248738 47.3956373,54.6483359 C48.5533956,62.671053 54.5341509,66.5796136 59.1741474,68.1461664 C63.813397,69.7127193 70.9451881,70.231179 76.7519063,64.5586636 C82.5578774,58.8861481 82.3674075,50.536414 82.3674075,50.536414 Z" id="Shape"></path>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>
source/_static/fonts/fontawesome-webfont.woff2 METASEP

source/_static/badges/selfhosted-only.rst METASEP
:orphan:
:nosearch:

.. raw:: html

  <div class="mm-badge mm-badge--note">

Note

|deployment-img-yellow| Available only for `self-hosted <https://mattermost.com/deploy/>`__ deployments

.. |deployment-img-yellow| image:: ../_static/images/badges/deployment_icon_yellow.svg
    :class: mm-badge-deployment

.. raw:: html

  </div>
source/_static/badges/ent-selfhosted.rst METASEP
:orphan:
:nosearch:

.. raw:: html

  <div class="mm-badge">

|plans-img| Available on `Enterprise plans <https://mattermost.com/pricing/>`__

|deployment-img| `self-hosted <https://mattermost.com/deploy/>`__ deployments

.. |plans-img| image:: ../_static/images/badges/flag_icon.svg

.. |deployment-img| image:: ../_static/images/badges/deployment_icon.svg

.. raw:: html

  </div>
source/_static/badges/ent-selfhosted-only.rst METASEP
:orphan:
:nosearch:

.. raw:: html

  <div class="mm-badge mm-badge--note">

Note

|plans-img-yellow| Available only on `Enterprise <https://mattermost.com/pricing/>`__ plans

|deployment-img-yellow| Available only for `self-hosted <https://mattermost.com/deploy/>`__ deployments

.. |plans-img-yellow| image:: ../_static/images/badges/flag_icon_yellow.svg
    :class: mm-badge-flag

.. |deployment-img-yellow| image:: ../_static/images/badges/deployment_icon_yellow.svg
    :class: mm-badge-deployment

.. raw:: html

  </div>
source/_static/badges/ent-pro-selfhosted.rst METASEP
:orphan:
:nosearch:

.. raw:: html

  <div class="mm-badge">

|plans-img| Available on `Enterprise and Professional plans <https://mattermost.com/pricing/>`__

|deployment-img| `self-hosted <https://mattermost.com/deploy/>`__ deployments

.. |plans-img| image:: ../_static/images/badges/flag_icon.svg

.. |deployment-img| image:: ../_static/images/badges/deployment_icon.svg

.. raw:: html

  </div>
source/_static/badges/ent-pro-only.rst METASEP
:orphan:
:nosearch:

.. If used with include::, note the paths for images

.. raw:: html

  <div class="mm-badge mm-badge--note">

Note

|plans-img-yellow| Available only on `Enterprise and Professional <https://mattermost.com/pricing/>`__ plans

.. |plans-img-yellow| image:: ../_static/images/badges/flag_icon_yellow.svg
    :class: mm-badge-flag

.. raw:: html

  </div>
source/_static/badges/ent-pro-cloud-selfhosted.rst METASEP
:orphan:
:nosearch:

.. raw:: html

  <div class="mm-badge">

|plans-img| Available on `Enterprise and Professional plans <https://mattermost.com/pricing/>`__

|deployment-img| `Cloud <https://customers.mattermost.com/cloud/signup/>`__ and `self-hosted <https://mattermost.com/deploy/>`__ deployments

.. |plans-img| image:: ../_static/images/badges/flag_icon.svg

.. |deployment-img| image:: ../_static/images/badges/deployment_icon.svg

.. raw:: html

  </div>
source/_static/badges/ent-only.rst METASEP
:orphan:
:nosearch:

.. If used with include::, note the paths for images

.. raw:: html

  <div class="mm-badge mm-badge--note">

Note

|plans-img-yellow| Available only on `Enterprise <https://mattermost.com/pricing/>`__ plans

.. |plans-img-yellow| image:: ../_static/images/badges/flag_icon_yellow.svg
    :class: mm-badge-flag

.. raw:: html

  </div>
source/_static/badges/ent-cloud-selfhosted.rst METASEP
:orphan:
:nosearch:

.. raw:: html

  <div class="mm-badge">

|plans-img| Available on `Enterprise plans <https://mattermost.com/pricing/>`__

|deployment-img| `Cloud <https://customers.mattermost.com/cloud/signup/>`__ and `self-hosted <https://mattermost.com/deploy/>`__ deployments

.. |plans-img| image:: ../_static/images/badges/flag_icon.svg

.. |deployment-img| image:: ../_static/images/badges/deployment_icon.svg

.. raw:: html

  </div>
source/_static/badges/cloud-selfhosted.rst METASEP
:orphan:
:nosearch:

.. raw:: html

  <div class="mm-badge">

|deployment-img| `Cloud <https://customers.mattermost.com/cloud/signup/>`__ and `self-hosted <https://mattermost.com/deploy/>`__ deployments

.. |deployment-img| image:: ../_static/images/badges/deployment_icon.svg

.. raw:: html

  </div>
source/_static/badges/allplans-selfhosted.rst METASEP
:orphan:
:nosearch:

.. raw:: html

  <div class="mm-badge">

|plans-img| Available on `all plans <https://mattermost.com/pricing/>`__

|deployment-img| `self-hosted <https://mattermost.com/deploy/>`__ deployments

.. |plans-img| image:: ../_static/images/badges/flag_icon.svg

.. |deployment-img| image:: ../_static/images/badges/deployment_icon.svg

.. raw:: html

  </div>
source/_static/badges/allplans-cloud.rst METASEP
:orphan:
:nosearch:

.. raw:: html

  <div class="mm-badge">

|plans-img| Available on `all plans <https://mattermost.com/pricing/>`__

|deployment-img| `Cloud <https://customers.mattermost.com/cloud/signup/>`__ deployments

.. |plans-img| image:: ../_static/images/badges/flag_icon.svg

.. |deployment-img| image:: ../_static/images/badges/deployment_icon.svg

.. raw:: html

  </div>
source/_static/badges/allplans-cloud-selfhosted.rst METASEP
:orphan:
:nosearch:

.. raw:: html

  <div class="mm-badge">

|plans-img| Available on `all plans <https://mattermost.com/pricing/>`__

|deployment-img| `Cloud <https://customers.mattermost.com/cloud/signup/>`__ and `self-hosted <https://mattermost.com/deploy/>`__ deployments

.. |plans-img| image:: ../_static/images/badges/flag_icon.svg

.. |deployment-img| image:: ../_static/images/badges/deployment_icon.svg

.. raw:: html

  </div>
source/welcome/whats-new-in-v72.rst METASEP
What’s new in Mattermost Boards 
===============================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Mattermost Boards v7.2 will be released to the Cloud during mid-August, and all Cloud plans will be automatically upgraded to the latest version during this time. For self-hosted plans, the latest version of Boards will be available with Mattermost Server v7.3 in mid-September.

Boards is moving from a channel-based to a role-based permissions system. This means that access to individual boards can be controlled on a channel level or a board level, depending on whether a board is linked to a channel or not.

TL;DR
------

1. All the boards you're currently a member of from your current team will appear on the sidebar without needing to switch workspaces.
2. Organize boards on the sidebar with custom categories. 
3. Press :kbd:`Ctrl` :kbd:`K` on Windows or Linux, pressing :kbd:`⌘` :kbd:`K` on macOS to find additional boards.
4. Navigate between teams in Boards with the new team switcher.
5. Set board and template permissions in the new **Share** dialog.
6. Link boards to channels to automatically grant board permissions to channel members.

Navigation
----------

Sidebar categories
~~~~~~~~~~~~~~~~~~~

Navigation is simplified, and now works similarly to channels. No more switching between workspaces - and the dashboard page has been removed. All the boards you're currently a member of from your current team will appear on the sidebar without needing to switch workspaces. Use the search box (Ctrl+K / Cmd+K) to find additional boards.

.. image:: ../images/boards-whats-new-01.png
  :width: 303
  :alt: Boards sidebar categories can be customized for easier navigation.

Boards can be organized under custom categories on a per-user level. So, users can organize their boards under categories that make sense to them without impacting the boards or categories for other users. Select the “...” options menu next to a custom category to manage your categories.

.. image:: ../images/boards-whats-new-02.png
  :alt: Select the context menu to create a new category, delete a category, or rename a category.

Team sidebar
~~~~~~~~~~~~

Boards now supports a team sidebar so you can easily navigate between boards on different teams. If you’re a member of multiple teams, the team sidebar will appear on the left hand side. To switch teams, select any of the team icons from the team sidebar.

.. image:: ../images/boards-whats-new-03.png
  :alt: The team sidebar allows you to switch between teams from within boards.

Linking boards to channels
--------------------------

The channel header’s board icon is now located on the channel `Apps Bar <https://docs.mattermost.com/configure/configuration-settings.html#enable-apps-bar>`_. When you select the **Boards** icon, you’ll open a new right-hand sidebar (RHS) where channel members can search and link boards to the channel. To maintain the same organization, all the boards previously associated with the workspace will automatically appear on the RHS post-migration. Select a linked board to navigate directly to the board.

.. image:: ../images/boards-whats-new-04.png
  :alt: You can find the boards icon in the Apps Bar on the right-hand side of the screen.

Channel members can search and link boards within the team where they are also board admins. Linking a board to a channel automatically grants all channel members Editor access to the board.

.. note:: 
  
  A channel can be linked to multiple boards, but each individual board can only be linked to one channel at a time. Linking the same board to another channel will automatically remove the link from the previous channel.

Channel members can also create a new board from the RHS. Doing so will automatically link the new board to the channel and grant channel members permissions to the board.

.. image:: ../images/boards-whats-new-05.png
  :alt: You can create a board from the RHS which is automatically added to the channel you're in.

Sharing
-------

Select **Share** to view and edit permissions to a board.

.. image:: ../images/boards-whats-new-07.png
  :alt: Adjust the roles and sharing options as needed.
    
Team access
~~~~~~~~~~~

Boards belong to teams, and only members of that team can either be granted editor access or no access to the board by default.

Roles
~~~~~

In v7.2, there will only be two roles:

- **Admin**: Can modify the board, its contents, and its permissions
- **Editor**: Can modify the board and its contents

In the future, there will be additional roles:

- **Commenter**: Can add comments
- **Viewer**: Can view the board and its contents

Channel role groups
~~~~~~~~~~~~~~~~~~~

Board Admins can add a channel to a board to grant its members editor access. To do this, open the **Share** option, search for the channel, and add it to the board as a user. The default role is **Editor**. Doing so also links the board back to the channel, where the board will appear on the channel RHS.

Custom templates
----------------

Custom templates also support permissions control, and are restricted to only the template creator by default. The template creator is an admin of the template and can make it public so it will be accessible to everyone on the team via the **Share** button on the template editor, and then setting the team role as **Editor**.

Automatic migration
-------------------

Instead of being tied to a particular channel, each board has been automatically migrated to use its own access control list. The creator of the original board is set as an admin on the board, with the ability to change the board’s permissions. Other members are granted the **Editor** role.

.. note::
  
  There are schema changes introduced in Boards v7.2. If you have a large database, you may need to allocate additional time and resources to this migration. Please review `this document <https://docs.google.com/document/d/1hKQV6QfXSJ6LznvKxoENvU1Z21ulaZ09b-h8N1caS64/edit#heading=h.1ozc9hcotgot>`_ for details around permission migrations.

Public channels
~~~~~~~~~~~~~~~

If a board or custom template was previously attached to a public channel: It’s now searchable by, and accessible to, any member of that channel’s team, including future members.

Private channels
~~~~~~~~~~~~~~~~

If a board or custom template was previously attached to a private channel: It's now searchable by, and accessible to, any member of that channel at the time of migration. Future members will need to be added by the admin.

Direct messages (DMs) and group messages (GMs)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

If a board or custom template was previously attached to a direct message or group message: It's now searchable by, and accessible to, any member of that channel. Future members will need to be added by the admin.

For boards previously attached to DMs and GMs whose members are associated with **more than one team**:

- The board will be moved to the first team on the team sidebar where all the board members are current team members.
- In the case where some members do not belong to the same team, we will associate the board to the first team where the creator (board admin) has access and where most other board members are current team members.

.. note::
   
   These boards may not appear in your search results when switching teams.

Workspaces to categories
~~~~~~~~~~~~~~~~~~~~~~~~

If you belonged to a workspace at the time of migration you’ll see that they’ve been migrated to custom categories in the sidebar. All boards from a workspace are listed under a category of the same name. Boards from direct messages and group messages appear under the default **Boards** category.

Categories are per-user, and can be renamed or deleted by each user after migration. New users won’t see the custom categories created from migration, and boards they join will appear under the default **Boards** category.

Boards that you create after the migration won’t be linked to a workspace, and will always appear under the default **Boards** category unless you move or hide the boards.

Frequently asked questions
--------------------------

Do I need to plan for downtime during the migration?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

There are schema changes in v7.2. If you have a large database you may need to allocate additional time and resources to this migration. Please review `this document <https://docs.google.com/document/d/1hKQV6QfXSJ6LznvKxoENvU1Z21ulaZ09b-h8N1caS64/edit#heading=h.1ozc9hcotgot>`_ for details around permission migrations.

Will I need to backup and restore any data?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The migration will happen automatically, but your administrator should perform a backup prior to the upgrade.

Why are there so many boards on my sidebar?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

We removed workspaces, so if you were a member of many boards prior to migration, they will now all appear under the same sidebar. To help you organize your boards better, you can collapse categories, hide boards, delete old boards, and/or move them to other categories.

How do I find my boards now?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Use the search box (CMD+K/CTRL+K).

How do I create a new sidebar category?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Select the **…** menu next to the “Boards” (default) category or any other existing category, and select **Create New Category**.

How do I move a board to another category?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Select the **…** menu next to the board’s name in the sidebar, and select **Move To…**.

How do I remove a board from the sidebar?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Select the **…** menu next to the board’s name, and select **Hide board**. If you're an admin of the board, you can delete the board by selecting **Delete board** from the same menu. Deleting the board permanently removes the board from the sidebar of all board members.

.. note:: 
  
  Hiding the board only removes the board from *your* sidebar. You can add the board back to your sidebar using the search box (CMD+K/CTRL+K).

What happens if I delete a category with boards underneath it?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The boards will be moved to the default “Boards” category. Other users with the same category name will not be impacted.

How do I create a public custom template?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

On the template editor, select **Share** and set the team role to **Editor**.

Help, I’ve got a problem not covered here, what do I do?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Please report any issues to the public `Focalboard channel <https://community.mattermost.com/core/channels/focalboard>`_ or `file a bug <https://github.com/mattermost/focalboard/issues/new?assignees=&labels=Bug%2C+Triage&template=bug_report.md&title=Bug%3A+>`_ on GitHub. We’re here to help!

source/welcome/what-changed-in-v70.rst METASEP
What changed in Mattermost v7.0?
================================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

.. |view-info-icon| image:: ../images/information-outline_F02FD.svg
  :height: 24px
  :width: 24px
  :alt: Access channel information in the right pane using the View Info icon.

.. |message-actions-icon| image:: ../images/apps_F003B.svg
  :height: 24px
  :width: 24px
  :alt: Access message actions to push information to an external system through a Mattermost integration using the Message actions icon.

.. |copy-link-icon| image:: ../images/paperclip_F03E2.svg
  :height: 24px
  :width: 24px
  :alt: Copy the public URL link for an image in a message using the Copy link icon.

.. |more-actions-icon| image:: ../images/dots-horizontal_F01D8.svg
  :height: 24px
  :width: 24px
  :alt: Access additional message actions using the More actions icon.


In Mattermost v7.0, we've changed where you can find channel information, where you can access your Mattermost integrations and their related actions, and we've made it easier to format your messages. Whether you're new to Mattermost, or a long-time user, this document will help you start using these new features and introduce you to new ways of navigating the product.

Channel information
-------------------

When creating channels, you're prompted to provide context that helps other users understand the focus of the channel. From Mattermost v7.0, these channel details appear in both the center pane under the channel name and in a new channel information pane on the right. 

You can show or hide channel information in the right pane by selecting the **View Info** |view-info-icon| icon located in the top right corner of the center pane, or by using the keyboard shortcut CMD/CTRL+ALT+I.

.. image:: ../images/channel-info.png
    :alt: Access channel information by using the View Info icon.

Apps bar (beta)
---------------

We're moving access to your enabled Mattermost integrations, including the icons for Playbooks and Boards, from the channel header in the center pane. Their new home is a vertical pane located to far right of the Mattermost screen called the Apps Bar.

.. image:: ../images/app-bar.png
    :alt: You can access your Mattermost integrations from the Apps Bar when your System Admin enables this feature in the System Console.

In self-hosted Mattermost v7.0 deployments, the Apps Bar is hidden and integrations continue to display in the channel header by default. Your System Admin can `enable the Apps Bar in the System Console <https://docs.mattermost.com/configure/configuration-settings.html#enable-app-bar>`__. When enabled, access to all Mattermost integrations, with the exception of calls beta functionality, moves to the far right pane.

.. note:: 
    
    In Mattermost Cloud workspaces, enabled integrations automatically display in the Apps Bar on the far right. Cloud System Admins can't disable this feature or move the integration icons back to the channel header.

    Integrations currently registered to the channel header will move to the Apps Bar automatically; however, we strongly encourage Mattermost integrators to update their integrations to provide the best user experience. See the developer documentation for details on registering integrations to the Apps Bar.

Message actions have moved
--------------------------

You use message actions to take action on a message by pushing information to an external system, such as when creating a Jira ticket using the `Jira integration <https://mattermost.com/marketplace/jira-plugin/>`__, creating a GitHub issue using the `GitHub integration <https://mattermost.com/marketplace/github-plugin/>`__, or creating a Zendesk support ticket using the `Zendesk integration <https://mattermost.com/marketplace/zendesk-app/>`__. 

We’ve moved message actions for Mattermost integrations to their own dedicated location under a **Message actions** |message-actions-icon| icon to reduce clutter. Select this icon to see what messages you can take based on the integrations enabled for your Mattermost instance.

.. image:: ../images/message-actions.png
    :alt: Take action on messages through your Mattermost integrations using message actions available through the Message actions icon.

Message formatting toolbar
~~~~~~~~~~~~~~~~~~~~~~~~~~

Formatting your messages is easier with the introduction of an message formatting toolbar that includes shortcuts to preview messages, react with emojis, strike out text, add headings, format numbered steps, add bullets, format content as code, and hide the formatting options. See the `format messages <https://docs.mattermost.com/channels/format-messages.html>`__ documentation to learn more about the many ways you can format your messages in Mattermost using both Markdown and using the new message formatting toolbar.

.. image:: ../images/message-formatting-toolbar.png
    :alt: Use the message formatting editor to format your messages without having to use Markdown syntax.
source/welcome/what-changed-in-v60.rst METASEP
What changed in Mattermost v6.0?
================================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

In Mattermost v6.0, we introduced changes in how to navigate Mattermost with the introduction of the Global Header. Whether you're new to Mattermost, or a long-time user, this document will help you start using these new Global Header features as well as introduce you to some new ways of navigating the product.

The Global Header introduces a new way of navigating and using Mattermost, and offers shared functionality available across the Mattermost platform in a single place. If you’ve recently installed or upgraded to v6.0, you’ll notice that Account Settings options have been split up, the Search bar is now front and center, and we’ve introduced a Product Menu button for easy navigation between Channels, Boards, and Playbooks. You'll notice that going forward, when you open Playbooks and Boards, they display as tabs in the window header for easier access.

We've also changed how you access multiple servers. Previously, multiple servers were displayed in tabs across the top of Mattermost. They're now folded into a single menu which supports drag and drop for reordering. Notifications across servers work the same way as before, so you won't miss any important conversations.

.. image:: ../images/server-menu.png
  :alt: Mattermost server list

Where is everything?
--------------------

While Channels, Boards, and Playbooks feature unique functionality within the Global Header, the following features are shared across all three products:

* Your user profile
* Your status and availability
* Product menu

In addition to this documentation, take a look at the Mattermost onboarding tips/tutorials available immediately after installation/upgrade. Note that once the tips/tutorials are dismissed, you won't be able to access them again.

Account settings
----------------

The Account Settings menu has been split into **Profile** and **Settings**.

Your **Profile** and **Security** settings can be found in **Profile**. Select your avatar in the top-right corner of Mattermost, then choose **Profile**.

Channel-specific options for **Notifications**, **Display**, **Sidebar**, and **Advanced** settings are found in **Settings**. In Channels, select the |gear-icon| in the Global Header, to the left of your avatar, to access Channels settings. 

.. |gear-icon| image:: ../images/settings-outline_F08BB.svg
  :alt: Select the Gear icon to access Channel settings.

Status and availability
-----------------------

Let your team know your online status using `custom status and availability settings <https://docs.mattermost.com/welcome/set-your-status-availability.html>`_, which include emojis. Select your avatar in the top-right corner to change your status and availability.

Product menu
------------

In the top-left corner of the Global Header, select the Product menu button to navigate to Channels, Playbooks, and Boards.

Depending on permissions set for your Mattermost, this is also where you would also find Mattermost Integrations, System Console, and Marketplace menu links. You’ll always be able to view the version information of your Mattermost workspace in this menu.

History arrows
--------------

Use the arrows to the right of the Product menu to show the last channel/next channel.

Server list
-----------

If you're using multiple servers (e.g., you're running community, community-release, and a Cloud test server) the Mattermost menu is where your servers are located. To change servers, select the menu and then select the server you want to use.

What else has changed?
----------------------

Some other menu items have moved around. For example:

* Plugins are listed in the Product menu, in the top-left corner of Mattermost.
* System Console is listed in the Product menu, in the top-left corner of Mattermost.
* Managing Custom Emojis can be done from the emoji picker now.

source/welcome/team-settings.rst METASEP
Team settings
=============

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Team settings enable you to adjust settings applied to a specific team. Select the team name to access additional team options, including **Team Settings**. 

.. image:: ../images/team-settings.png
    :alt: Access team settings from the team name. 

General
-------

General settings provide options around how teams are displayed to users. 

Team name
~~~~~~~~~

Your **Team Name** is displayed on the login screen, and in the top of the channel sidebar for your team. 

Team names can contain any letters, numbers, or symbols, must be 2 - 64 characters in length, and are case-sensitive. `Some unicode characters <https://www.w3.org/TR/unicode-xml/#Charlist>`_ aren't supported in team names. 

Team description
~~~~~~~~~~~~~~~~

Your **Team Description** is displayed when viewing the list of teams available to join and in the tooltip when hovering over the team name in the team sidebar.

You can enter a description up to 50 characters in length. Please note that `some unicode characters <https://www.w3.org/TR/unicode-xml/#Charlist>`_ are not supported. 

Team icon
~~~~~~~~~

Your **Team Icon** appears in the team sidebar, and it's visible if you're a member of more than one team. By default, teams display an icon containing the first two letters of the team name. You can customize the team icon.

1. Select **Team Settings**.

2. Edit the **Team Icon** option.

.. image:: ../images/edit-team-icon.png
  :alt: Manage the team icon from Team Settings.

3. Upload an icon image in BMP, JPG, or PNG format. We recommend using square images with a solid background color since transparency in PNG icons fills with a white background in the team sidebar. 

.. image:: ../images/upload-team-icon.png
  :alt: Upload a team icon from Team Settings.

Removing the team icon resets it to the default icon that contains the first two letters of the team name.

Allow only users with a specific email domain to join this team
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Specifying domains in this setting prevents users from joining the team when their email domain is not on the list. Only users that have an email domain matching the defined domains may join the team.

Users without a matching domain on the team prior to the domain being specified will not be removed after the domain is added. For servers with email authentication **System Console > Authentication > Email > Require Email Verification** must be set to **true** for domain restrictions to be effective.

Allow anyone to join this team
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

After a user logs in to the site, they are shown a Team Selection page if they don't belong to a team. Any team with **Allow anyone to join this team** option set to **Yes** will show up on this page under "Teams you can join". 

A user can access the Team Selection page by also clicking the "+" icon at the bottom of their team sidebar or from the **Main Menu > Join Another Team**.

Invite code
~~~~~~~~~~~

The **Invite Code** is used as part of the URL in the team invitation link retrieved when you select your team name and then choose **Invite people**.

Import
------

Import from Slack
~~~~~~~~~~~~~~~~~

From v6.0, this feature has been deprecated. See our `Migration Guide <https://docs.mattermost.com/onboard/migrating-to-mattermost.html>`__ for details on migrating to Mattermost from other solutions, including `Slack <https://docs.mattermost.com/onboard/migrating-to-mattermost.html#migrating-from-slack>`__. 

source/welcome/team-keyboard-shortcuts.rst METASEP
Team keyboard shortcuts
=======================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Keyboard shortcuts for Mattermost teams help you make a more efficient use of your keyboard.

.. tip::

  Display a list of available keyboard shortcuts by pressing :kbd:`Ctrl` :kbd:`/` on Windows or Linux, pressing :kbd:`⌘` :kbd:`/` on Mac, or using the ``/shortcuts`` slash command.

Navigation shortcuts for Mattermost Channels
--------------------------------------------

The following keyboard shortcuts are supported in all `supported browsers <https://docs.mattermost.com/install/software-hardware-requirements.html#software-requirements>`__ and in the Mattermost Desktop App.

+-------------------------------------------+--------------------------------------+----------------------------------------------+
| On Windows & Linux                        | On Mac                               | Description                                  |
+===========================================+======================================+==============================================+
| :kbd:`Ctrl` :kbd:`Alt` :kbd:`↑`           | :kbd:`⌘` :kbd:`⌥` :kbd:`↑`           | Navigate to the previous team.               |
+-------------------------------------------+--------------------------------------+----------------------------------------------+
| :kbd:`Ctrl` :kbd:`Alt` :kbd:`↓`           | :kbd:`⌘` :kbd:`⌥` :kbd:`↓`           | Navigate to the next team.                   |
+-------------------------------------------+--------------------------------------+----------------------------------------------+
| :kbd:`Ctrl` :kbd:`Alt` :kbd:`1`-:kbd:`9`  | :kbd:`⌘` :kbd:`⌥` :kbd:`1`-:kbd:`9`  | Navigate to a specific team.                 |
+-------------------------------------------+--------------------------------------+----------------------------------------------+

.. note::

   Though Mattermost keyboard shortcuts support standard languages and keyboard layouts, they may not work if you use keymapping that overwrites default browser shortcuts.
source/welcome/set-your-status-availability.rst METASEP
Set your status and availability
=================================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Let your team know whether you're available by setting a custom status and your availability in Mattermost.

Set a custom status
--------------------

Set a custom status to add an optional emoji to a descriptive status message. Other members can see your status anywhere they can see your name, such as the Channel Sidebar and in conversations.

.. tabs::

  .. tab:: Mattermost v6.0 onwards

      From Mattermost v6.0, set status and availability from your Avatar in the top-right corner of the Global Header.
      
      1. Select your Avatar, then select **Set a Custom Status**.
      2. Choose from a list of suggested statuses, reuse a recent status, or enter a new emoji and status, then select **Set Status**. The Speech bubble emoji 💬  is used by default if you don't specify an emoji. A custom status can be a maximum of 100 characters in length.
      
  .. tab:: Mattermost v5.39 and earlier

      In Mattermost versions up to v5.39, set status and availability from your Avatar at the top of the channel sidebar.

      1. Select your Avatar, then select **Set a Custom Status**.
      2. Choose from a list of suggested statuses, reuse a recent status, or enter a new emoji and status, then select **Set Status**. The Speech bubble emoji 💬  is used by default if you don't specify an emoji. A custom status can be a maximum of 100 characters in length.
 
.. note::

  - If custom statuses aren't available, you can request your System Admin to enable this feature in **System Console > Site Configuration > Users and Teams > Enable Custom Statuses**.
  - Custom statuses will be available in the Mattermost mobile app in a future release. 

Clear a custom status
------------------------

To clear a custom status, select your Avatar, then select **Clear Status**, or select the **Clear** option next to your current status.

.. image:: ../images/clear-custom-status.png
  :alt: Clear your custom status.

Set your availability
---------------------

To set your availability, select your Avatar, then specify your availability as  **Online**, **Away**, **Do Not Disturb**, or **Offline**.

.. image:: ../images/set-your-availability.png
  :alt: Set your availability to online, away, do not disturb, or offline.

Other members can see your availability anywhere they can see your name, such as the channel sidebar, within conversations, and within Direct Messages.

Set your status as Do Not Disturb
---------------------------------

From Mattermost v6.1, set your availability to **Do Not Disturb** to disable all desktop, email, and push notifications when you are unavailable or need to concentrate. 

You can specify how long to disable notifications by selecting a preset expiration or setting a custom expiration. Your availability setting automatically reverts to its previous setting once the expiration is reached (this may take up to five minutes).

How Mattermost determines your availability
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. csv-table::
    :header: "Client", "**Online**", "**Away**", "**Offline**"

    "**Desktop App**", "You're interacting with your computer", "You've been inactive on your computer for five minutes", "You close Mattermost, sleep, or lock your computer"
    "**Web Browser**", "You're interacting with Mattermost in a browser", "
    - You have not typed or navigated between channels for five minutes
    - The tab is unfocused for five minutes
    - The browser is in the background or minimized for five minutes", "You close the Mattermost browser window"
    "**Mobile App**", "Mattermost is open", "Mattermost is open with five minutes of inactivity", "You change apps, close Mattermost, or lock your screen" 
    

source/welcome/manage-your-profile.rst METASEP
Manage your Mattermost profile
==============================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

You can configure your profile and security preferences by selecting **Profile** from your avatar in the global header.

.. tabs::

  .. tab:: Mattermost v6.0 onwards

      In Mattermost v6.0, **Account Settings** have moved.

      - Access **Profile** and **Security** settings from your Avatar in the Global Header.
      - Access **Notifications**, **Display**, **Sidebar**, and **Advanced Settings** by selecting the Gear |gear-icon| icon in the Global Header.

      .. |gear-icon| image:: ../images/settings-outline_F08BB.svg
        :alt: Select the Gear icon to open the Settings dialog.

  .. tab:: Mattermost v5.39 and earlier

      In Mattermost versions up to v5.39, access all of your profile and security settings in **Account Settings** from the **Main Menu** by selecting the three horizontal lines (also known as a hambuger menu) at the top of the channel sidebar.

Profile
-------

Settings to configure name, username, nickname, email, and profile picture.

Full name
~~~~~~~~~

Full names appear in the direct messages member list and team management modal. By default, you will receive mention notifications when someone types your first name. Entering a full name is optional. 

Username
~~~~~~~~

Usernames are unique identifiers appearing next to all posts. Pick something easy for teammates to recognize and recall. By default, you will receive mention notifications when someone types your username. In order to maintain message integrity, changing your username does not update @mentions in messages already posted. Username must begin with a letter, and contain between 3 to 22 lowercase characters made up of numbers, letters, and the symbols '.', '-', and '_'. 

Nickname
~~~~~~~~

Nicknames appear in the direct messages member list and team management modal. You will not receive mention notifications when someone types your nickname unless you add it to the *Words That Trigger Mentions* notifications list in **Notifications**.

Position
~~~~~~~~~

Position can be used to describe your role or job title. It appears in the profile popup that shows up when you select a user's name in the center channel or right-hand sidebar.

Email
~~~~~

Email is used for signing in, notifications, and password reset. Email requires verification if changed. If you are signing in using a single sign-on service, the email field is not editable and you will receive email notifications to the email you used to sign up to your SSO service.

Profile picture
~~~~~~~~~~~~~~~

Profile pictures appear next to all posts and at the top of the channel sidebar next to your name. To change your profile picture, choose **Select**, then choose an image. For best results, choose an image that's at least 128 x 128 pixels in size. Supported image formats include: BMP, JPG, JPEG, and PNG. The GIF file format is not supported.

Security
--------

Settings to configure your password, view access history, and view or logout of active sessions.

Password
~~~~~~~~

You may change your password if you've logged in by email. If you are signing in using a single sign-on service, the password field is not editable, and you must access your SSO service's account settings to update your password.

Multi-factor authentication
~~~~~~~~~~~~~~~~~~~~~~~~~~~

When your System Admin enables `multi-factor authentication <https://docs.mattermost.com/configure/configuration-settings.html#enable-multi-factor-authentication>`__ in Mattermost, you can choose to set up your Mattermost account to require a phone-based passcode generated by Google Authenticator, in addition to your password, when signing in.

Download Google Authenticator from `iTunes <https://itunes.apple.com/us/app/google-authenticator/id388497605?mt=8>`__ or `Google Play <https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=en>`__ for your device, then:

1. In Mattermost, select your avatar, then select **Profile > Security**.
2. Under **Multi-factor Authentication**, select **Edit**.

.. image:: ../images/multi-factor-authentication.png
  :alt: Enable multi-factor authentication through your Mattermost user profile.

3. Select **Add MFA to Account**.

.. image:: ../images/add-mfa-to-account.png
  :alt: Add multi-factor authentication to your Mattermost user profile.

4. On your device, use the Google Authenticator app to scan the QR code that displays in Mattermost.
5. Enter the **MFA Code** generated by the authentication app, then select **Save**.

Once you've set up multi-factor authentication for your Mattermost account, when you log in to Mattermost you'll be asked to enter a code generated by Google Authenticator as well as your password.

.. tip::
  If scanning the QR code using your device doesn't work, you can manually enter the **Secret** provided on the Mattermost screen into the Google Authenticator app as a **Manual Entry** instead.

Sign-in method
~~~~~~~~~~~~~~

This option allows you to switch your `login method <https://docs.mattermost.com/welcome/log-in.html>`__ from `email/username and password <https://docs.mattermost.com/welcome/log-in.html#email-address-or-username>`__ to a `single sign-on option <https://docs.mattermost.com/welcome/log-in.html#single-sign-on-sso>`__, and back again. While you can choose to log in with either set of credentials, you can enable one login method at a time.

For example, if AD/LDAP single sign-on is enabled, you can select **Switch to using AD/LDAP** and enter your AD/LDAP credentials to switch login over to AD/LDAP. You'll need to enter the password for your email account to verify your existing credentials. Following the change, you'll receive an email to confirm the action.

View access history
~~~~~~~~~~~~~~~~~~~

Access history displays a chronological list of the last 20 login and logout attempts, channel creations and deletions, account settings changes, or channel setting modifications made on your account. The details of the Session ID (unique identifier for each Mattermost browser session) and IP Address of the action is recorded for audit log purposes.

View and logout of active sessions
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Sessions are created when you log in with your email and password to a new browser on a device. Sessions let you use Mattermost for up to 30 days without having to log in again. Select **Logout** on an active session if you want to revoke automatic login privileges for a specific browser or device. Select **More Info** to view details on browser and operating system.

source/welcome/manage-desktop-app-server-connections.rst METASEP
Manage Desktop App server connections
=====================================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Using the Mattermost desktop app, you can connect to multiple Mattermost servers from a single interface. 

.. tabs::

  .. tab:: Mattermost desktop app v5.0 onwards
  
    The **Server** list is located in the top left corner of the window and displays all servers available in your desktop app environment. Drag to reorder the servers in the list. You can also navigate the server options using `keyboard shortcuts <https://docs.mattermost.com/welcome/keyboard-shortcuts.html>`__. From the **Server** list, you can add, edit, and remove servers.
    
    **Add a server**
    
    1. Select **Add a server**.

      .. image:: ../images/desktop-server-add.png
        :alt: Connect the desktop app to a Mattermost Server using options located in the top left corner of the Mattermost screen.

    2. Enter the server name as it will appear in the desktop app.
    3. Enter the server URL. Server URLs must begin with either ``http://`` or ``https://``.

       .. tip::

        Can't find your Mattermost server URL? Ask your company’s IT department or your Mattermost System Admin for your organization’s **Mattermost Site URL**. It’ll look something like ``https://example.com/company/mattermost``, ``mattermost.yourcompanydomain.com``, or ``chat.yourcompanydomain.com``. These URLs could also end in ``.net``.

    4. Select **Add**.

      .. image:: ../images/desktop-server-add2.png
          :alt: Connect the desktop app to another Mattermost Server using options located in the top left corner of the Mattermost screen.
    
    **Edit a server**
    
    1. Hover over a server and select the **Edit** icon.

       .. image:: ../images/desktop-edit-server.png
         :alt: Edit an existing Mattermost server connection using options located in the top right corner of the Mattermost screen.

    2. Modify the server's display name or URL, then select **Save**.
    
    **Remove a server**
    
    Removing a server from your desktop app doesn't delete its data. You can add the server back any time.
    
    1. Hover over a server and select **Remove**.

       .. image:: ../images/desktop-remove-server.png
         :alt: Remove a Mattermost server connection using options located in the top right corner of the Mattermost screen.

    2. Select **Remove** when prompted to confirm.
    
  .. tab:: Mattermost desktop app v4.7 and earlier
  
    Each server appears as a separate tab at the top of the window. Drag to reorder the server tabs. From the Server Management section, you can add, edit, and remove servers. 

    **Add a server**

    To add a new server to your desktop app environment:

    1. Select the **+** button in the desktop window bar at the top of the screen.
    2. In the **Name** field, enter the name that you want for the tab.
    3. In the **URL** field, enter the complete URL of the server that you want to connect to. Must begin with either ``http://`` or ``https://``.
    4. Select **Add**.

    **Edit a server**

    To edit a server in your desktop app environment:

    1. On Windows and Linux, go to **... > File > Settings**. On Mac, go to **Mattermost > Preferences**.
    2. Next to the server you want to update, select **Edit**.
    3. Edit **Name** and/or **URL**.
    4. Select **Save**.

    **Remove a server**

    To remove a server from your desktop app environment:

    1. On Windows and Linux, go to **... > File > Settings**. On Mac, go to **Mattermost > Preferences**.
    2. Next to the server or team that you want to remove, select **Remove**.


source/welcome/manage-custom-groups.rst METASEP
Manage custom groups (beta)
===========================

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Not available in legacy Enterprise Edition E10/E20*

Custom groups (beta) reduce noise and improve focus by notifying the right people in a channel at the right time, while maintaining transparency for all members in that channel. Custom user groups let you notify up to 30 users at a time rather than notifying users individually. 

For example, perhaps you want to @mention a cross-functional team about a bug fixes needed for an upcoming feature release, without notifying everyone else in the channel. Using a custom group notifies the cross-functional team immediately, while keeping important stakeholders in the loop on the status of the feature release.

Once a custom user group has been created, you can mention that group the same way you @mention another Mattermost member. See the `mention people in messages <https://docs.mattermost.com/channels/mention-people.html>`__ documentation for details.

.. note::
  
  - System Admins need to enable this feature. See our `Mattermost Configuration Settings <https://docs.mattermost.com/configure/configuration-settings.html#custom-user-groups>`__ documentation for details. 
  - From Mattermost v7.2, System Admins can limit who can manage custom user groups through a system admin role, instead of all users being able to manage custom user groups. See the `system roles <https://docs.mattermost.com/onboard/system-admin-roles.html>`__ documentation for details.
  - The ability to create custom user groups on mobile will be available in a future release. @mentions for custom user groups on mobile work the same as `LDAP-synced groups <https://docs.mattermost.com/channels/mention-people.html#groupname>`__.

Create a custom group
---------------------

1. Select **+** from the top of the channel sidebar, then select **Create New User Group**.

2. Specify a name and mention. The mention is the handle you use to @mention a notification to the group. Group names must be unique across the Mattermost workspace. If a name is in use as a channel name, display name, or another custom group's name, it won't be available.

3. Search for and select members to add to the custom user group, then select **Create Group**.

Manage custom user groups
-------------------------

You can review and filter the list of custom groups, add people to an existing group, edit the group name or mention, leave the group, or archive the group. 

To manage a custom user group, select **User Groups** from the Products menu, then select the group you want to modify.

.. image:: ../images/access-user-groups.png
  :alt: Access tools to manage user groups.

Review available groups
~~~~~~~~~~~~~~~~~~~~~~~

Review a list of all available custom user groups, search for specific groups by name, or filter the list of groups to display only groups you're a member of.

Change name or mention
~~~~~~~~~~~~~~~~~~~~~~

1. From the **More Actions** icon to the right of any custom group, select **View Group**. 

  .. image:: ../images/manage-user-groups.png
    :alt: Access tools to manage your custom user groups.

2. From the **More Actions** icon, select **Edit Details**.

  .. image:: ../images/edit-custom-group.png
    :alt: Edit details of a custom user group.

3. Update the **Name** or **Mention**, then select **Save Details**.

Add people
~~~~~~~~~~

1. Select **Add People**.
2. Search for and select people to add to the group, then select **Add People**.

Remove people
~~~~~~~~~~~~~

Hover over a member, then select the **Trash** icon to remove them from the group.

Leave a group
~~~~~~~~~~~~~

From the **More Actions** icon, select **Leave Group**.

Archive group
~~~~~~~~~~~~~

From the **More Actions** icon, select **Archive Group**. When you archive a custom user group, you won’t be able to mention the group’s handle or view its members. However, the group isn't deleted from the list, and all members remain in the group unless manually removed.

source/welcome/log-out.rst METASEP
Log out of Mattermost
=====================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

You can log out of Mattermost from your avatar. Select **Log Out** to log out of all teams on the server.
source/welcome/log-in.rst METASEP
Log in to Mattermost
=====================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

You'll receive link to access Mattermost from your Mattermost System Admin or through an email invitation. Once you have your organization's Mattermost link, navigate to that URL in a web browser, the `desktop app <https://docs.mattermost.com/install/desktop-app-install.html>`__, or the `mobile app <https://docs.mattermost.com/deploy/use-prebuilt-mobile-apps.html>`__, then enter your user credentials to log into Mattermost.

.. tip::
  - We recommend bookmarking the Mattermost URL in your browser of choice so logging into Mattermost is easy in the future.
  - Can't find your Mattermost link? Ask your company's IT department or your Mattermost System Admin for your organization's **Mattermost Site URL**. It'll look something like ``https://example.com/company/mattermost``, ``mattermost.yourcompanydomain.com``, or ``chat.yourcompanydomain.com``. These URLs could also end in ``.net``.
  - Mattermost Cloud customers can log into their Cloud workspaces from the [Cloud Workspace Connection](https://customers.mattermost.com/cloud/connect-workspace) page by specifying their company or domain name.

After logging in, the team that appears first on your team sidebar opens. If you have not joined a team, the Team Selection page opens where you can view a list of teams that you can join.

Reset your password
--------------------

If you've forgotten your password, you can reset it on the login screen by selecting **Forgot your password?**, or by contacting your System Admin for help.

Email address or username
--------------------------

When enabled by your System Admin, you can log in with the username or email address used to create your account.

.. image:: ../images/sign-in_with_email.png
  :alt: Log in to Mattermost with your username or email address, or reset your password.

Single Sign-On (SSO)
--------------------
  
When enabled by your System Admin, you may log in using your GitLab, Google, Office 365, AD/LDAP, or SAML credentials.

GitLab SSO
~~~~~~~~~~

When enabled by your System Admin, you can log in with your GitLab account using a one-click login option.

.. image:: ../images/sign-in-gitlab.png
  :alt: Log in to Mattermost using your GitLab credentials.

Google SSO
~~~~~~~~~~~

.. include:: ../_static/badges/ent-pro-only.rst
  :start-after: :nosearch:

*Available in legacy Mattermost Enterprise Edition E20*

When enabled by your System Admin, you can log in with your Google account using a one-click login option.

.. image:: ../images/sign-in-google-apps.png
  :alt: Log in to Mattermost using your Google Apps credentials.

Office 365 SSO
~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-pro-only.rst
  :start-after: :nosearch:

*Available in legacy Mattermost Enterprise Edition E20*

When enabled by your System Admin, you can log in with your Office 365 account using a one-click login option.

.. image:: ../images/sign-in-office365.png
  :alt: Log in to Mattermost with your Office 365 credentials.

AD/LDAP SSO
~~~~~~~~~~~

.. include:: ../_static/badges/ent-pro-only.rst
  :start-after: :nosearch:

*Available in legacy Mattermost Enterprise Edition E10 and E20*

When enabled by your System Admin, you can log in with your AD/LDAP credentials. This lets you use the same username and password for Mattermost that you use for various other company services.

.. image:: ../images/sign-in_with_ldap.png
  :alt: Log in to Mattermost with your AD/LDAP credentials.

SAML SSO
~~~~~~~~

.. include:: ../_static/badges/ent-pro-only.rst
  :start-after: :nosearch:

*Available in legacy Mattermost Enterprise Edition E20*

When enabled by your System Admin, you can log in with your SAML credentials. This lets you use the same username and password for Mattermost that you use for various other company services. Mattermost officially supports `Okta <https://docs.mattermost.com/onboard/sso-saml-okta.html>`__, `OneLogin <https://docs.mattermost.com/onboard/sso-saml-onelogin.html>`__, and Microsoft ADFS as an identity provider (IDP) for SAML, but you may use other SAML IDPs as well. Please see our `SAML Single Sign-On documentation <https://docs.mattermost.com/onboard/sso-saml.html>`__ to learn more about configuring SAML for Mattermost.

.. image:: ../images/sign-in_with_saml.png
  :alt: Log in to Mattermost with your SAML credentials.

source/welcome/keyboard-shortcuts.rst METASEP
Mattermost keyboard shortcuts
=============================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Mattermost keyboard shortcuts help you make a more efficient use of your keyboard.

.. tip::

  - In Mattermost, display a list of available keyboard shortcuts by pressing :kbd:`Ctrl` :kbd:`/` on Windows or Linux, pressing :kbd:`⌘` :kbd:`/` on macOS, or using the ``/shortcuts`` slash command.
  - Additional keyboard shortcuts are available for Mattermost Channels. See the `keyboard shortcuts for Mattermost Channels <https://docs.mattermost.com/channels/keyboard-shortcuts-for-channels.html>`__ and the `team keyboard shortcuts <https://docs.mattermost.com/welcome/team-keyboard-shortcuts.html>`__ documentation for details.

Navigation shortcuts in the desktop app
---------------------------------------

The following navigation keyboard shortcuts are supported only in the Mattermost desktop app.

.. tabs::

  .. tab:: Desktop app v5.0 onwards

    Mattermost desktop app v5.0 introduces additional ways to navigate your Mattermost interface, including server selections, as well as tabs for Channels, Playbooks, and Boards. 
    
    +--------------------------------------+-------------------------------+-------------------------------------------------------------------------------------------------+
    | On Windows & Linux                   | On Mac                        | Description                                                                                     |
    +======================================+===============================+=================================================================================================+
    | :kbd:`Ctrl` :kbd:`F`                 | :kbd:`⌘` :kbd:`F`             | Move focus to the **Search** field and search the current channel.                              |
    +--------------------------------------+-------------------------------+-------------------------------------------------------------------------------------------------+
    | :kbd:`Ctrl` :kbd:`Shift` :kbd:`S`    | :kbd:`⌘` :kbd:`⌃` :kbd:`S`    | Open the **Servers** selector, press :kbd:`↑` or :kbd:`↓` to navigate between                   |
    |                                      |                               | servers, then press :kbd:`Enter` on Windows or Linux, or :kbd:`↵` on macOS, to select a server. |
    +--------------------------------------+-------------------------------+-------------------------------------------------------------------------------------------------+
    || :kbd:`Ctrl` :kbd:`Shift` :kbd:`1`   || :kbd:`⌘` :kbd:`⌃` :kbd:`1`   || Navigate to the first server in the **Servers** list.                                          |
    || :kbd:`Ctrl` :kbd:`Shift` :kbd:`2`   || :kbd:`⌘` :kbd:`⌃` :kbd:`2`   || Replace the number with the server's position within the server in the list.                   |
    +--------------------------------------+-------------------------------+-------------------------------------------------------------------------------------------------+
    | :kbd:`Ctrl` :kbd:`Tab`               | :kbd:`⌘` :kbd:`Tab`           | Navigate to the next product tab based on the current product selected.                         |
    +--------------------------------------+-------------------------------+-------------------------------------------------------------------------------------------------+  
    | :kbd:`Ctrl` :kbd:`Shift` :kbd:`Tab`  | :kbd:`⌘` :kbd:`⇧` :kbd:`Tab`  | Navigate to the previous product tab based on the current product selected.                     |  
    +--------------------------------------+-------------------------------+-------------------------------------------------------------------------------------------------+
    | :kbd:`Ctrl` :kbd:`1`                 | :kbd:`⌘` :kbd:`1`             | Navigate to the **Channels** tab.                                                               |
    +--------------------------------------+-------------------------------+-------------------------------------------------------------------------------------------------+
    | :kbd:`Ctrl` :kbd:`2`                 | :kbd:`⌘` :kbd:`2`             | Navigate to the **Boards** tab.                                                                 |
    +--------------------------------------+-------------------------------+-------------------------------------------------------------------------------------------------+
    | :kbd:`Ctrl` :kbd:`3`                 | :kbd:`⌘` :kbd:`3`             | Navigate to the **Playbooks** tab.                                                              |
    +--------------------------------------+-------------------------------+-------------------------------------------------------------------------------------------------+
    | :kbd:`Ctrl` :kbd:`Tab`               | :kbd:`⌘` :kbd:`Tab`           | Navigate to the next product tab based on your current position.                                |
    +--------------------------------------+-------------------------------+-------------------------------------------------------------------------------------------------+
    
  .. tab:: Desktop App v4.7 and earlier

    Mattermost Desktop App v4.7 and earlier releases support the following navigation keyboard shortcuts:

    +--------------------------------------+------------------------------+--------------------------------------------------------------------------------+
    | On Windows & Linux                   | On Mac                       | Description                                                                    |
    +======================================+==============================+================================================================================+
    | :kbd:`Ctrl` :kbd:`F`                 | :kbd:`⌘` :kbd:`F`            | Move focus to the **Search** field and search the current channel.             |
    +--------------------------------------+------------------------------+--------------------------------------------------------------------------------+
    || :kbd:`Ctrl` :kbd:`1`                || :kbd:`⌘` :kbd:`1`           | Navigate to the first server in the **Servers** list.                          |
    || :kbd:`Ctrl` :kbd:`2`                || :kbd:`⌘` :kbd:`2`           | Replace the number with the server's tab position.                             |
    || :kbd:`Ctrl` :kbd:`3`                || :kbd:`⌘` :kbd:`3`           |                                                                                |
    +--------------------------------------+------------------------------+--------------------------------------------------------------------------------+
    | :kbd:`Ctrl` :kbd:`Tab`               | :kbd:`⌘` :kbd:`Tab`          | Navigate to the next server tab based on the current server selected.          |
    +--------------------------------------+------------------------------+--------------------------------------------------------------------------------+
    | :kbd:`Ctrl` :kbd:`Shift` :kbd:`Tab`  | :kbd:`⌘` :kbd:`⇧` :kbd:`Tab` | Navigate to the previous server tab based on the current server selected.      |
    +--------------------------------------+------------------------------+--------------------------------------------------------------------------------+
    | :kbd:`Alt` :kbd:`↓`                  | :kbd:`⌥` :kbd:`↓`            | Next channel or direct message in the channel sidebar.                         |
    +--------------------------------------+------------------------------+--------------------------------------------------------------------------------+

Zoom shortcuts for Web and Desktop App
---------------------------------------

The following display keyboard shortcuts work in all `supported browsers <https://docs.mattermost.com/install/software-hardware-requirements.html#software-requirements>`__ and in the Mattermost desktop app.

+------------------------------+------------------------------+----------------------------------------+
| On Windows & Linux           | On Mac                       | Description                            |
+==============================+==============================+========================================+
| :kbd:`Ctrl` :kbd:`+`         | :kbd:`⌘` :kbd:`+`            | Increase font size (zoom in).          |
+------------------------------+------------------------------+----------------------------------------+
| :kbd:`Ctrl` :kbd:`-`         | :kbd:`⌘` :kbd:`-`            | Decrease font size (zoom out).         |
+------------------------------+------------------------------+----------------------------------------+

.. note::

   Though Mattermost keyboard shortcuts support standard languages and keyboard layouts, they may not work if you use keymapping that overwrites default browser shortcuts.

source/welcome/insights.rst METASEP
Insights
========

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

Insights offer you visibility into top activities by surfacing the most important events happening within each team within your Mattermost workspace. 

From Mattermost v7.1, insights are available in the web and the desktop app for all users, except guests. Mobile support for insights is coming in a future release.

.. image:: ../images/myinsights_teaminsights.gif
  :alt: An example of the Mattermost Insights page that includes top user and team-based activities and events.

Access insights
---------------

To access insights, go to Channels, then select **Insights** located at the top of the channel sidebar. On the Insights page, you'll see your own insights over the last seven days by default. You can also:

- Switch between your insights and insights for the team.
- Show insights for the current day or the last 28 days.
- Select insights to go directly to that channel, thread, or board.

My insights
-----------

+----------------------+--------------------------------------------+
| **Insight category** | **Description**                            |
+----------------------+--------------------------------------------+
| My top channels      | Most active channels you're a member of.   |
+----------------------+--------------------------------------------+
| My top threads       | Most active threads you follow.            |
+----------------------+--------------------------------------------+
| My top boards        | Most active boards you've participated in. |
+----------------------+--------------------------------------------+
| My top reactions     | Emoji reactions you've used the most.      |
+----------------------+--------------------------------------------+

Team insights
-------------

+-----------------------+---------------------------------------+
| **Insight category**  | **Description**                       |
+-----------------------+---------------------------------------+
| Top channels          | Most active channels for the team.    |
+-----------------------+---------------------------------------+
| Top threads           | Most active threads for the team.     |
+-----------------------+---------------------------------------+
| Top boards            | Most active boards for the team.      |
+-----------------------+---------------------------------------+
| Top reactions         | The team's most used emoji reactions. |
+-----------------------+---------------------------------------+
source/welcome/get-started-mattermost-channels.rst METASEP
Get started with Mattermost Channels
====================================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Access Mattermost Channels by selecting **Channels** from the **product menu** |product-list|.

.. |product-list| image:: ../images/products_E82F.svg
  :height: 24px
  :width: 24px
  :alt: Navigate between Channels, Playbooks, and Boards using the Product list icon.

Channels are where you can communicate with your team about various topics or projects. The channels you're a member of and useful channel management tools are available in the channel sidebar to the left. 

See our `Mattermost Channels <https://docs.mattermost.com/guides/channels.html>`__ documentation for details on the many ways you can use Channels to enable team collaboration.

Channels and direct messages
----------------------------

Everyone who joins a Mattermost workspace is automatically added to two default channels: **Town Square** and **Off-Topic**. See our `Channel Types <https://docs.mattermost.com/channels/channel-types.html>`__ documentation for details.

- **Town Square** is great for your team-wide communications, such as announcements.
- **Off-Topic** is great for fun, social, non-work-related conversations. 

Direct messages are private conversations between two people. 
Group messages are private conversations for small groups of up to seven people. 
Start a new direct or group message by selecting the **Plus** |plus| icon next to **Direct Messages** in the channel sidebar.

.. |plus| image:: ../images/plus_F0415.svg
  :height: 24px
  :width: 24px
  :alt: The Plus icon provides access to channel and direct message functionality.

.. tip:: 
    Direct and group messages are also channels in Mattermost, so many of the `preferences available for channels <https://docs.mattermost.com/channels/set-channel-preferences.html>`__ are also available for direct messages. 

Create and join channels
------------------------

Channels are either **public** or **private**.

- **Public** channels are identified with a **Globe** |globe| icon. Anyone on the team can join a public channel.
- **Private** channels are typically used for sensitive topics, and are identified with a **Lock** |lock| icon. You must be invited to private channels by another channel member.  

.. |globe| image:: ../images/globe_E805.svg
  :height: 24px
  :width: 24px
  :alt: Public channels are identified with a Globe icon.

.. |lock| image:: ../images/lock-outline_F0341.svg
  :height: 24px
  :width: 24px
  :alt: Private channels are identified with a Lock icon.

To see all available public channels you can join, select the **Plus** |plus| icon at the top of the channel sidebar, then select **Browse Channels**. Search for channels by name or scroll through the list. Select **Join** next to any channel to become a member of that channel.

.. tip:: 
    Select **Find Channel** in the channel sidebar to see a list of recently visited channels and to jump to specific channels quickly by name, including public and private channels, as well as all direct and group messages.

To create a new public or private channel, select the **Plus** |plus| icon, then select **Create New Channel**. Anyone can create new channels, unless the System Admin has `restricted permissions <https://docs.mattermost.com/onboard/advanced-permissions.html>`__ to do so. See our `Create Channels <https://docs.mattermost.com/channels/create-channels.html>`__ documentation for more information.

As your channel sidebar fills up with channels you've joined, you can organize your channels into categories based on how you work. See `Customize Your Channel Sidebar <https://docs.mattermost.com/channels/customize-your-channel-sidebar.html>`__ for details.

Invite people to the team
-------------------------

You can invite members of your organization, as well as external guests such as vendors or project partners, to a Mattermost team. Anyone can invite people to the team, unless the System Admin has `disabled this option <https://docs.mattermost.com/configure/configuration-settings.html#enable-account-creation>`__ or `restricted permissions <https://docs.mattermost.com/onboard/advanced-permissions.html>`__ to do so. 

To invite people to a team, select the **Plus** |plus| icon, then select **Invite People**. 

- For existing Mattermost users, enter usernames, then select **Member**. An invitation to join the team is sent as a direct message.
- For new Mattermost users or guests, enter email addresses, then select **Guest**. You must specify the channels the guest can access. 

.. tip:: 
    To extend an invitation to a larger group of people, you can share a team invitation link rather than sending individual invitations. Select the **Plus** |plus| icon, then select **Invite People**, then copy the invite link to your clipboard.

All email invitations contain a single-use link that expires after 48 hours. System Admins can also invalidate all active invitation links. See our `Invite people to teams <https://docs.mattermost.com/welcome/about-teams.html#invite-people-to-teams>`__ documemtation for details on inviting people to your Mattermost workspace.

Send messages
-------------

Enter your message in the text field, then press :kbd:`Enter` on Windows or Linux, or :kbd:`↵` on Mac to send the message. Your messages can also include images and file attachments.

- Copy and paste images or drag-and-drop image files into the text field to add them to your message.
- Select the **Attachment** |attachment| icon to the right of the text field to attach documents or other files to your message.
  
.. |attachment| image:: ../images/paperclip_F03E2.svg
  :height: 24px
  :width: 24px
  :alt: Use the Attachment icon to add images or files to your messages.

Customize your Mattermost experience
------------------------------------

You can customize many aspects of your Mattermost experience, including the types of notifications you receive, how unread channels are organized, the number of direct messages to show, your Mattermost theme, and more!

- Select your user avatar in the top-right corner of the Mattermost screen to manage your profile, status, and availability. See `Manage Your Mattermost Profile <https://docs.mattermost.com/welcome/manage-your-profile.html>`__ for more information on managing your profile.
- Select the **Settings** |gear| icon to manage your notifications, display, channel sidebar options, and more. See `Customize Your Channels Experience <https://docs.mattermost.com/channels/channels-settings.html>`__ for more information on managing your Mattermost preferences.

.. |gear| image:: ../images/settings-outline_F08BB.svg
  :height: 24px
  :width: 24px
  :alt: Use the Settings icon to customize your Mattermost user experience.

source/welcome/customize-your-theme.rst METASEP
.. _theme-colors:

Customize your Mattermost theme
===============================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

The colors of the Mattermost user interface are customizable. 

.. tabs::

  .. tab:: Mattermost v6.0 onwards

      In Mattermost v6.0, navigate to **Settings > Display > Theme**.
      
  .. tab:: Mattermost v5.39 and earlier

      In Mattermost versions up to 5.39, navigate to **Settings > Display > Theme**.
     
You can import your theme colors from Slack, customize the colors yourself, or choose from four standard themes designed by the Mattermost team.

Any color changes you make are applied to all teams that you belong to. In Mattermost Enterprise, you can choose to apply the theme to the current team only, allowing you to have a different theme for each team.

Import theme from Slack
-----------------------

To import a theme, in Slack, go to **Preferences > Themes**, select **Create a custom theme**, then copy the theme color values.

In Mattermost, select **Import theme colors from Slack**, then paste the color values into the input box and select **Submit**. Any theme settings that are not customizable in Slack will default to the “Mattermost” standard theme settings. Select **Save** to confirm your theme changes.

Custom themes
-------------

Select **Custom Theme**, then expand the `Sidebar Styles <https://docs.mattermost.com/welcome/customize-your-theme.html#sidebar-styles>`__, `Center Channel Styles <https://docs.mattermost.com/welcome/customize-your-theme.html#center-channel-styles>`__, and `Link and Button Styles <https://docs.mattermost.com/welcome/customize-your-theme.html#link-and-button-styles>`__ options to customize individual interface colors, such as backgrounds, links, text, and borders. 

Your custom theme changes are applied in Mattermost as you make them. Select **Save** to confirm your theme changes. Discard your changes by exiting the **Display Settings** window and selecting **Yes, Discard**.

Standard themes
---------------

Select **Theme Colors** to choose from four standard themes designed by the Mattermost team. To make custom adjustments on the four standard theme colors, select a standard theme, then select **Custom Theme** to further customize that standard theme based on your preferences. Select **Save** to confirm your theme changes.

Sidebar styles
~~~~~~~~~~~~~~

Sidebar BG
  	Background color of the Channels pane, and Account and Team settings navigation sidebars.
Sidebar Text
  	Text color of read channels in the Channels pane, and tabs in the Account and Team settings navigation sidebar.
Sidebar Header BG
 	Background color of the header above the Channels pane and all dialog window headers.
Team Sidebar BG
	Background color of the Global Header (available from Mattermost v6.0).
Sidebar Header Text
 	Text color of the header above the Channels pane and all dialog window headers.
Sidebar Unread Text
	Text color of unread channels in the Channels pane.
Sidebar Text Hover BG
	Background color behind channel names and settings tabs as you hover over them.
Sidebar Text Active Border
	Color of the rectangular marker on the left side of the Channels pane or Settings sidebar indicating the active channel or tab.
Sidebar Text Active Color
	Text color of the active channel or tab in the Channels pane or Settings sidebar.
Online Indicator
	Color of the online indicator appearing next to team members names in the direct messages list.
Away Indicator
	Color of the away indicator appearing next to team members names in the direct messages list when they have had no browser activity for 5 minutes.
Do Not Disturb Indicator
	Color of the do not disturb indicator appearing next to team members names in the direct messages list.
Mention Jewel BG
	Background color of the jewel indicating unread mentions that appears to the right of the channel name. This is also the background color of the “Unread Posts Below/Above” indicator appearing at the top or bottom of the Channels pane on shorter browser windows.
Mention Jewel Text
	Text color on the mention jewel indicating the number of unread mentions. This is also the text color on the “Unread Posts Below/Above” indicator.

Center channel styles
~~~~~~~~~~~~~~~~~~~~~

Center Channel BG
	Color of the center pane, right-hand sidebar and all dialog window backgrounds.
Center Channel Text
	Color of all the text - with the exception of mentions, links, hashtags and code blocks - in the center pane, right-hand sidebar, and dialogs.
New Message Separator
	The new message separator appears below the last read message when you navigate to a channel with unread messages.
Error Text Color
	Color of all error text.
Mention Highlight BG
	Highlight color behind your words that trigger mentions in the center pane and right-hand sidebar.
Mention Highlight Link
	Text color of your words that trigger mentions in the center pane and right-hand sidebar.
Code Theme
	Background and syntax colors for all code blocks.

Link and button styles
~~~~~~~~~~~~~~~~~~~~~~

Link Color
	Text color of all links, hashtags, teammate mentions, and low priority UI buttons.
Button BG
	Color of the rectangular background behind all high priority UI buttons.
Button Text
	Text color appearing on the rectangular background for all high priority UI buttons.

Export a custom theme
~~~~~~~~~~~~~~~~~~~~~~~~

You can export a theme from Mattermost by copying the theme values from the Custom Theme menu.

.. tabs::

  .. tab:: Mattermost v6.0 onwards

      In Mattermost v6.0, navigate to **Settings > Display > Theme**, select **Custom Theme** and then select **Copy Theme Colors**.
      
  .. tab:: Mattermost v5.39 and earlier

      In Mattermost versions up to 5.39, navigate to **Settings > Display > Custom Theme**, then select **Copy Theme Colors** to export the theme's color values.
  
Import a custom theme
~~~~~~~~~~~~~~~~~~~~~~~~

You can import a theme into Mattermost by pasting the theme values into the Custom Theme menu.

Copy existing theme values, then go to: 

.. tabs::

  .. tab:: Mattermost v6.0 onwards

      In Mattermost v6.0, navigate to **Settings > Display > Theme**, select **Custom Theme** and paste the theme values into the **Copy and paste to share theme colors** field. 

  .. tab:: Mattermost v5.39 and earlier

      In Mattermost versions up to 5.39, navigate to **Settings > Display > Custom Theme** to paste the theme values into the **Copy and paste to share theme colors** field. Select **Save** to confirm your theme changes.
  
Custom theme examples
~~~~~~~~~~~~~~~~~~~~~

Customize your theme colors and share them with others by copying and pasting theme values into the input box. Below are some example themes with their corresponding theme values.

Mattermost
^^^^^^^^^^

.. image:: ../images/Mattermost.png
  :alt: Mattermost Theme
  
.. code-block:: none

		{"sidebarBg":"#145dbf","sidebarText":"#ffffff","sidebarUnreadText":"#ffffff","sidebarTextHoverBg":"#4578bf","sidebarTextActiveBorder":"#579eff","sidebarTextActiveColor":"#ffffff","sidebarHeaderBg":"#1153ab","sidebarTeamBarBg":"#0b428c","sidebarHeaderTextColor":"#ffffff","onlineIndicator":"#06d6a0","awayIndicator":"#ffbc42","dndIndicator":"#f74343","mentionBg":"#ffffff","mentionBj":"#ffffff","mentionColor":"#145dbf","centerChannelBg":"#ffffff","centerChannelColor":"#3d3c40","newMessageSeparator":"#ff8800","linkColor":"#2389d7","buttonBg":"#166de0","buttonColor":"#ffffff","errorTextColor":"#fd5960","mentionHighlightBg":"#ffe577","mentionHighlightLink":"#166de0","codeTheme":"github"}

Organization
^^^^^^^^^^^^

.. image:: ../images/Organization.png
  :alt: Organization Theme

.. code-block:: none

						{"sidebarBg":"#2071a7","sidebarText":"#ffffff","sidebarUnreadText":"#ffffff","sidebarTextHoverBg":"#136197","sidebarTextActiveBorder":"#7ab0d6","sidebarTextActiveColor":"#ffffff","sidebarHeaderBg":"#2f81b7","sidebarTeamBarBg":"#256996","sidebarHeaderTextColor":"#ffffff","onlineIndicator":"#7dbe00","awayIndicator":"#dcbd4e","dndIndicator":"#ff6a6a","mentionBg":"#fbfbfb","mentionColor":"#2071f7","centerChannelBg":"#f2f4f8","centerChannelColor":"#333333","newMessageSeparator":"#ff8800","linkColor":"#2f81b7","buttonBg":"#1dacfc","buttonColor":"#ffffff","errorTextColor":"#a94442","mentionHighlightBg":"#f3e197","mentionHighlightLink":"#2f81b7","codeTheme":"github"}

Mattermost Dark
^^^^^^^^^^^^^^^

.. image:: ../images/MattermostDark.png
  :alt: Mattermost Dark Theme

.. code-block:: none

			{"sidebarBg":"#1b2c3e","sidebarText":"#ffffff","sidebarUnreadText":"#ffffff","sidebarTextHoverBg":"#4a5664","sidebarTextActiveBorder":"#66b9a7","sidebarTextActiveColor":"#ffffff","sidebarHeaderBg":"#1b2c3e","sidebarTeamBarBg":"#152231","sidebarHeaderTextColor":"#ffffff","onlineIndicator":"#65dcc8","awayIndicator":"#c1b966","dndIndicator":"#e81023","mentionBg":"#b74a4a","mentionColor":"#ffffff","centerChannelBg":"#2f3e4e","centerChannelColor":"#dddddd","newMessageSeparator":"#5de5da","linkColor":"#a4ffeb","buttonBg":"#4cbba4","buttonColor":"#ffffff","errorTextColor":"#ff6461","mentionHighlightBg":"#984063","mentionHighlightLink":"#a4ffeb","codeTheme":"solarized-dark"}

Windows Dark
^^^^^^^^^^^^

.. image:: ../images/WindowsDark.png
  :alt: Windows Dark Theme

.. code-block:: none

		{"sidebarBg":"#171717","sidebarText":"#ffffff","sidebarUnreadText":"#ffffff","sidebarTextHoverBg":"#302e30","sidebarTextActiveBorder":"#196caf","sidebarTextActiveColor":"#ffffff","sidebarHeaderBg":"#1f1f1f","sidebarTeamBarBg":"#181818","sidebarHeaderTextColor":"#ffffff","onlineIndicator":"#399fff","awayIndicator":"#c1b966","dndIndicator":"#e81023","mentionBg":"#0177e7","mentionColor":"#ffffff","centerChannelBg":"#1f1f1f","centerChannelColor":"#dddddd","newMessageSeparator":"#cc992d","linkColor":"#0d93ff","buttonBg":"#0177e7","buttonColor":"#ffffff","errorTextColor":"#ff6461","mentionHighlightBg":"#784098","mentionHighlightLink":"#a4ffeb","codeTheme":"monokai"}

GitHub Theme
^^^^^^^^^^^^

.. image:: ../images/GitHub.png
  :alt: GitHub Theme

.. code-block:: none

  {"awayIndicator":"#D4B579","buttonBg":"#66CCCC","buttonColor":"#FFFFFF","centerChannelBg":"#FFFFFF","centerChannelColor":"#444444","codeTheme":"github","linkColor":"#3DADAD","mentionBg":"#66CCCC","mentionColor":"#FFFFFF","mentionHighlightBg":"#3DADAD","mentionHighlightLink":"#FFFFFF","newMessageSeparator":"#F2777A","onlineIndicator":"#52ADAD","sidebarBg":"#F2F0EC","sidebarHeaderBg":"#E8E6DF","sidebarHeaderTextColor":"#424242","sidebarText":"#2E2E2E","sidebarTextActiveBorder":"#66CCCC","sidebarTextActiveColor":"#594545","sidebarTextHoverBg":"#E0E0E0","sidebarUnreadText":"#515151"}

Monokai Theme
^^^^^^^^^^^^^

.. image:: ../images/Monokai.png
  :alt: Monokai Theme

.. code-block:: none

  {"awayIndicator":"#B8B884","buttonBg":"#90AD58","buttonColor":"#FFFFFF","centerChannelBg":"#FFFFFF","centerChannelColor":"#444444","codeTheme":"monokai","linkColor":"#90AD58","mentionBg":"#7E9949","mentionColor":"#FFFFFF","mentionHighlightBg":"#54850C","mentionHighlightLink":"#FFFFFF","newMessageSeparator":"#90AD58","onlineIndicator":"#99CB3F","sidebarBg":"#262626","sidebarHeaderBg":"#363636","sidebarHeaderTextColor":"#FFFFFF","sidebarText":"#FFFFFF","sidebarTextActiveBorder":"#7E9949","sidebarTextActiveColor":"#FFFFFF","sidebarTextHoverBg":"#525252","sidebarUnreadText":"#CCCCCC"}

Solarized Dark Theme
^^^^^^^^^^^^^^^^^^^^

.. image:: ../images/SolarizedDark.png
  :alt: Solarized Dark Theme

.. code-block:: none

  {"awayIndicator":"#E0B333","buttonBg":"#859900","buttonColor":"#fdf6e3","centerChannelBg":"#073642","centerChannelColor":"#93a1a1","codeTheme":"solarized-dark","linkColor":"#268bd2","mentionBg":"#dc322f","mentionColor":"#ffffff","mentionHighlightBg":"#d33682","mentionHighlightLink":"#268bd2","newMessageSeparator":"#cb4b16","onlineIndicator":"#2AA198","sidebarBg":"#073642","sidebarHeaderBg":"#002B36","sidebarHeaderTextColor":"#FDF6E3","sidebarText":"#FDF6E3","sidebarTextActiveBorder":"#d33682","sidebarTextActiveColor":"#FDF6E3","sidebarTextHoverBg":"#CB4B16","sidebarUnreadText":"#FDF6E3","errorTextColor":"#dc322f"}

Gruvbox Dark Theme
^^^^^^^^^^^^^^^^^^

.. image:: ../images/GruvboxDark.png
  :alt: Gruvbox Dark Theme

.. code-block:: none

  {"awayIndicator":"#fabd2f","buttonBg":"#689d6a","buttonColor":"#ebdbb2","centerChannelBg":"#3c3836","centerChannelColor":"#ebdbb2","codeTheme":"monokai","errorTextColor":"#fb4934","linkColor":"#83a598","mentionBg":"#b16286","mentionColor":"#fbf1c7","mentionHighlightBg":"#d65d0e","mentionHighlightLink":"#fbf1c7","newMessageSeparator":"#d65d0e","onlineIndicator":"#b8bb26","sidebarBg":"#282828","sidebarHeaderBg":"#1d2021","sidebarHeaderTextColor":"#ebdbb2","sidebarText":"#ebdbb2","sidebarTextActiveBorder":"#d65d0e","sidebarTextActiveColor":"#fbf1c7","sidebarTextHoverBg":"#d65d0e","sidebarUnreadText":"#fe8019"}

One Dark Theme
^^^^^^^^^^^^^^

.. image:: ../images/OneDark.png
  :alt: One Dark Theme

`GitHub <https://github.com/georgewitteman/one-dark-mattermost>`_

.. code-block:: none

  {"sidebarBg":"#21252b","sidebarText":"#abb2bf","sidebarUnreadText":"#abb2bf","sidebarTextHoverBg":"#3a3f4b","sidebarTextActiveBorder":"#4d78cc","sidebarTextActiveColor":"#d7dae0","sidebarHeaderBg":"#282c34","sidebarHeaderTextColor":"#abb2bf","onlineIndicator":"#98c379","awayIndicator":"#d19a66","dndIndicator":"#be5046","mentionBg":"#98c379","mentionColor":"#ffffff","centerChannelBg":"#282c34","centerChannelColor":"#abb2bf","newMessageSeparator":"#c67add","linkColor":"#61afef","buttonBg":"#4d78cc","buttonColor":"#ffffff","errorTextColor":"#f44747","mentionHighlightBg":"#525a69","mentionHighlightLink":"#61afef","codeTheme":"monokai","mentionBg":"#98c379"}

Discord Dark Theme
^^^^^^^^^^^^^^^^^^

.. image:: ../images/DiscordDarkTheme.png
  :alt: Discord Dark Theme

`GitHub <https://github.com/danger89/mattermost-discord-dark>`_

.. code-block:: none

  {"sidebarBg":"#2f3136","sidebarText":"#ffffff","sidebarUnreadText":"#ffffff","sidebarTextHoverBg":"#33363c","sidebarTextActiveBorder":"#66cfa0","sidebarTextActiveColor":"#ffffff","sidebarHeaderBg":"#27292c","sidebarHeaderTextColor":"#ffffff","onlineIndicator":"#43b581","awayIndicator":"#faa61a","dndIndicator":"#f04747","mentionBg":"#6e84d2","mentionBg":"#6e84d2","mentionColor":"#ffffff","centerChannelBg":"#36393f","centerChannelColor":"#dddddd","newMessageSeparator":"#6e84d2","linkColor":"#2095e8","buttonBg":"#43b581","buttonColor":"#ffffff","errorTextColor":"#ff6461","mentionHighlightBg":"#3d414f","mentionHighlightLink":"#6e84d2","codeTheme":"monokai"}

Night Owl Dark Theme
^^^^^^^^^^^^^^^^^^^^

.. image:: ../images/NightOwlDark.png
  :alt: Night Owl Dark Theme

.. code-block:: none

  {"sidebarBg":"#011627","sidebarText":"#d6deeb","sidebarUnreadText":"#d6deeb","sidebarTextHoverBg":"#1d3b53","sidebarTextActiveBorder":"#ff2c83","sidebarTextActiveColor":"#82aaff","sidebarHeaderBg":"#1d3b53","sidebarHeaderTextColor":"#d6deeb","onlineIndicator":"#addb67","awayIndicator":"#ffbc42","dndIndicator":"#f74343","mentionBg":"#d6deeb","mentionBg":"#d6deeb","mentionColor":"#145dbf","centerChannelBg":"#011627","centerChannelColor":"#d6deeb","newMessageSeparator":"#ff8800","linkColor":"#2389d7","buttonBg":"#166de0","buttonColor":"#011627","errorTextColor":"#fd5960","mentionHighlightBg":"#0b2942","mentionHighlightLink":"#82aaff","codeTheme":"solarized-dark"}

Dark Theme (Desktop app only)
-----------------------------

The Mattermost desktop app applies Light or Dark Mode based on the System Preferences appearance setting of your computer's operating system to your Mattermost instance.

source/welcome/customize-desktop-app-experience.rst METASEP
Customize your Desktop App experience
=====================================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

.. |more-icon-vertical| image:: ../images/dots-vertical_F01D9.svg
  :alt: Use the More icon in the top left corner to access Mattermost Desktop Apps customization settings.

In addition to your `personal profile settings <https://docs.mattermost.com/welcome/manage-your-profile.html>`__ and :doc:`Mattermost Channels settings </channels/channels-settings>`, the Mattermost desktop app offers the following options to further customize your Mattermost experience.

.. tabs::

    .. tab:: Linux

        Access additional Desktop App customization settings from the **More** |more-icon-vertical| icon located in the top left corner of the Mattermost window by selecting **File > Settings...**

        .. image:: ../images/desktop-app-settings.jpg
            :alt: Access Desktop App customization settings by selecting More in the top left corner, then selecting File > Settings.

        +----------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------+
        | **Desktop App setting**                                                    | **Description**                                                                                                                            |
        +============================================================================+============================================================================================================================================+
        | Start app on login                                                         | The Mattermost Desktop App starts up automatically when you log in to your machine.                                                        |
        |                                                                            | You can configure the Desktop App not to launch automatically when you log in to your machine.                                             |
        +----------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------+
        | Launch app minimized                                                       | You can configure the Mattermost Desktop App to launch minimized in the system tray.                                                       |
        +----------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------+
        | Check spelling                                                             | Misspelled words in your messages are highlighted based on the system language. You can disable spell check.                               |
        |                                                                            |                                                                                                                                            |
        |                                                                            | You can also specify additional spell check languages. You must restart the app to change this setting.                                    |
        |                                                                            | When multiple languages are configured:                                                                                                    |
        |                                                                            |                                                                                                                                            |
        |                                                                            | - All selected languages show as correct when a word matches at least one selected language.                                               |
        |                                                                            | - All selected languages show as incorrect when a word matches none of the languages.                                                      |
        +----------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------+
        | Use an alternative dictionary URL                                          | You can specify an alternate dictionary for spell check as a site URL.                                                                     |
        +----------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------+
        | Flash taskbar icon when a new message is received                          | Your taskbar icon flashes when a new message is received on any of your active teams and servers.                                          |
        |                                                                            | You can disable the flashing taskbar icon.                                                                                                 |
        +----------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------+
        | Show icon in the notification area                                         | The Mattermost icon displays in the notification area. You can hide this icon.                                                             |
        |                                                                            | You must restart the app to change this setting.                                                                                           |
        +----------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------+
        | Icon theme                                                                 | The default icon theme is based on the system preferences appearance setting.                                                              |
        |                                                                            | You can choose to display a light or dark-themed icon.                                                                                     |
        +----------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------+
        | Leave app running in notification center when application window is closed | When you close the Mattermost Desktop App, you're prompted to confirm whether you want to permanently close the app.                       |
        |                                                                            | You can disable this confirmation or silence it by selecting **Don't ask again**.                                                          |
        |                                                                            | You can also configure the app to continue running after the window is closed.                                                             |
        |                                                                            | To silence the notifications, select **Don't show again**.                                                                                 |
        +----------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------+
        | Use GPU hardware acceleration                                              | GPU hardware acceleration renders the Mattermost Desktop App interface more efficiently.                                                   |
        |                                                                            | If you encounter decreased stability, you can disable GPU hardware acceleration. You must restart the app to change this setting.          |
        +----------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------+
        | Open app in fullscreen                                                     | You can configure the Mattermost Desktop App to open in fullscreen mode.                                                                   |
        |                                                                            | You can also toggle this setting using the following CLI command:                                                                          |
        |                                                                            |                                                                                                                                            |
        |                                                                            | ``open release/mac/Mattermost.app --args --fullscreen true`` or ``open release/mac/Mattermost.app --args -f true``                         |
        +----------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------+
        | Download location                                                          | Specify where you want files to be downloaded on your machine.                                                                             |
        +----------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------+
        | Logging level                                                              | You can adjust logging levels to isolate and troubleshoot issues.                                                                          |  
        |                                                                            | Increasing the log level increases disk space usage and can impact performance.                                                            |
        +----------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------+    

    .. tab:: Mac

        Access additional Desktop App customization settings by selecting **Mattermost > Preferences** from the menu bar.

        .. image:: ../images/mac-desktop-app-settings.png
            :alt: Access Desktop App customization settings by selecting Mattermost from the menu bar, then selecting Preferences.

        +---------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
        | **Desktop App setting**                                 | **Description**                                                                                                                                          |
        +=========================================================+==========================================================================================================================================================+
        | Check spelling                                          | Misspelled words in your messages are highlighted based on the system language. You can disable spell check.                                             |
        |                                                         |                                                                                                                                                          |
        |                                                         | You can also specify additional spell check languages. You must restart the app to change this setting.                                                  |
        |                                                         | When multiple languages are configured:                                                                                                                  |
        |                                                         |                                                                                                                                                          |
        |                                                         | - All selected languages show as correct when a word matches at least one selected language.                                                             |
        |                                                         | - All selected languages show as incorrect when a word matches none of the languages.                                                                    |
        +---------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
        | Show red badge on Dock icon to indicate unread messages | A red badge on the Dock icon displays a count of unread messages and mentions.                                                                           |
        |                                                         | You can configure the Mattermost Desktop App to display a count of mentions only.                                                                        |
        +---------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
        | Bounce the Dock icon                                    | When a new message is received on any of your active teams and servers, the Dock icon bounces once or bounces until you open the Mattermost Desktop App. |
        |                                                         | You can configure the Mattermost Desktop App Dock icon to bounce more, less, or not at all.                                                              |
        +---------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
        | Show Mattermost icon in the menu bar                    | The Mattermost icon displays in the notification area.                                                                                                   |
        |                                                         | You can hide this icon. You must restart the app to change this setting.                                                                                 |
        +---------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
        | Use GPU hardware acceleration                           | GPU hardware acceleration renders the Mattermost Desktop App interface more efficiently.                                                                 |
        |                                                         | If you encounter decreased stability with this enabled, you can disable GPU hardware acceleration. You must restart the app to change this setting.      |
        +---------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
        | Open app in fullscreen                                  | You can configure the Mattermost Desktop App to open in fullscreen mode.                                                                                 |
        |                                                         | You can also toggle this setting using the following CLI command:                                                                                        |
        |                                                         |                                                                                                                                                          |
        |                                                         | ``open release/mac/Mattermost.app --args --fullscreen true`` or ``open release/mac/Mattermost.app --args -f true``                                       |
        +---------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------+

    .. tab:: Windows

        Access additional Desktop App customization settings from the **More** |more-icon-vertical| icon located in the top left corner of the Mattermost window by selecting **File > Settings...**

        .. image:: ../images/desktop-app-settings.jpg
            :alt: Access Desktop App customization settings by selecting More in the top left corner, then selecting File > Settings.

        +--------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------+
        | **Desktop App setting**                                                  | **Description**                                                                                                                   |
        +==========================================================================+===================================================================================================================================+
        | Automatically check for updates                                          | Updates to the Mattermost Desktop App download automatically. You're notified when an update is ready.                            |
        |                                                                          | You can disable automatic updates through group policy (GPO) settings.                                                            |
        |                                                                          | You can also manually check for updates by selecting **Check for Updates Now**.                                                   |
        +--------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------+
        | Start app on login                                                       | The Mattermost Desktop App starts up automatically when you log in to your machine.                                               |
        |                                                                          | You can configure the Desktop App not to launch automatically when you log in to your machine.                                    |
        +--------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------+
        | Launch app minimized                                                     | You can configure the Mattermost Desktop App to launch minimized in the system tray.                                              |
        +--------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------+
        | Check spelling                                                           | Misspelled words in your messages are highlighted based on the system language. You can disable spell check.                      |
        |                                                                          |                                                                                                                                   |
        |                                                                          | You can also specify additional spell check languages. You must restart the app to change this setting.                           |
        |                                                                          |                                                                                                                                   |
        |                                                                          | When multiple languages are configured:                                                                                           |
        |                                                                          |                                                                                                                                   |
        |                                                                          | - All selected languages show as correct when a word matches at least one selected language.                                      |
        |                                                                          | - All selected languages show as incorrect when a word matches none of the languages.                                             |
        +--------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------+
        | Use an alternative dictionary URL                                        | You can specify an alternate dictionary for spell check as a site URL.                                                            |
        +--------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------+
        | Icon theme                                                               | The default icon theme is based on the system preferences appearance setting.                                                     |
        |                                                                          | You can choose to display a light or dark-themed icon.                                                                            |
        +--------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------+
        | Leave app running in notification area when application window is closed | When you close the Mattermost Desktop App, you're prompted to confirm whether you want to permanently close the app.              |
        |                                                                          | You can disable this confirmation or silence it by selecting **Don't ask again**.                                                 |
        |                                                                          | You can also configure the app to continue running after the window is closed.                                                    |
        |                                                                          | To silence the notifications, select **Don't show again**.                                                                        |
        +--------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------+
        | Use GPU hardware acceleration                                            | GPU hardware acceleration renders the Mattermost Desktop App interface more efficiently.                                          |
        |                                                                          | If you encounter decreased stability, you can disable GPU hardware acceleration. You must restart the app to change this setting. |
        +--------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------+
        | Open app in fullscreen                                                   | You can configure the Mattermost Desktop App to open in fullscreen mode.                                                          |
        |                                                                          | You can also toggle this setting using the following CLI command:                                                                 |
        |                                                                          |                                                                                                                                   |
        |                                                                          | ``open release/mac/Mattermost.app --args --fullscreen true`` or ``open release/mac/Mattermost.app --args -f true``                |
        +--------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------+
        | Download location                                                        | Specify where you want files to be downloaded on your machine.                                                                    |
        +--------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------+
        | Logging level                                                            | You can adjust logging levels to isolate and troubleshoot issues.                                                                 |
        |                                                                          | Increasing the log level increases disk space usage and can impact performance.                                                   |
        +--------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------+

source/welcome/about-user-roles.rst METASEP
About user roles
================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

There are six types of user roles with different permission levels in Mattermost: System Admins, Team Admins, Channel Admins, Members, Guests, and Inactive accounts. To view a list of users on the team and what their roles are, Team Admins can open the Team menu and select **Manage Members**.

System Admin
------------

The first user added to a newly-installed Mattermost system is assigned the System Admin role.

The System Admin is typically a member of the IT staff and has all the privileges of a Team Admin, along with the following additional privileges:

- Access to the System Console in any team site.
- Ability to change any setting on the Mattermost server available in the System Console.
- Ability to promote and demote other users from Member role to System Admin role (and vice versa).
- Ability to promote and demote other users to and from Guest role.
- Ability to deactivate user accounts and to reactivate them.
- Access to private channels, but only if given the link to the private channel.

A System Admin can view and manage users in **System Console > User Management > Users**. They can search users by name, filter users by teams, and filter to view other System Admins, guests, as well as active and inactive users.

Team Admin
----------

When a team is first created, the person who set it up is made a Team Admin. It is a team-specific role, meaning that someone can be a Team Admin for one team but only a member on another team. Team Admins have the following privileges:

- Access to the **Team Settings** menu.
- Ability to change the team name and import data from Slack export files.
- Access to the **Manage Members** menu, where they can control whether team members are a **Member** or a **Team Admin**.

Channel Admin
-------------

*Available in legacy Mattermost Enterprise Edition E10 or E20*

The person who creates a channel is assigned the Channel Admin role for that channel. People with the Channel Admin role have the following privileges:

- Ability to assign the Channel Admin role to other members of the channel.
- Ability to remove the Channel Admin role from other holders of the Channel Admin role.
- Ability to remove members from the channel.
- Ability to configure channel actions that automate tasks based on trigger conditions, such as `joining a channel <https://docs.mattermost.com/channels/join-leave-channels.html#join-a-channel>`__ or `sending a message <https://docs.mattermost.com/channels/send-messages.html>`__ in a channel.

Depending on your system configuration, Channel Admins can be granted special permissions by the System Admin to rename and delete channels.

Member
------

This is the default role given to users when they join a team. Members have basic permissions on the Mattermost team.

Guest
-----

Guest is a role with restricted permissions, which allow organizations to collaborate with users outside of their organization, and control what channels they are in and who they can collaborate with.

Guests can: 

- Pin messages to channels.
- Use slash commands (with the exception of those used to invite members).
- Favorite channels.
- Mute channels.
- Update their profile.

Guests cannot:

- Discover public channels.
- Join open teams.
- Create direct messages or group messages with members who aren’t within the same channel.

User with personal access token permission
------------------------------------------

A System Admin can enable `personal access tokens <https://developers.mattermost.com/integrate/admin-guide/admin-personal-access-token/>`__ and give permissions for that account to create personal access tokens in **System Console > Users**.

In addition, the System Admin can optionally set the following permissions for the account, useful for integrations and bot accounts:

- **post:all**: Allows the account to post to all Mattermost channels including direct messages.
- **post:channels**: Allows the account to post to all Mattermost public channels.

Deactivate users
----------------

A System Admin can deactivate user accounts via **System Console > Users** for a list of all users on the server. The list can be searched and filtered to make finding users easier. Select the user's role and in the menu that opens, then select **Deactivate**.

When **Deactivate** is selected, the user is logged out of the system, and receives an error message if they try to log back in. The user no longer appears in channel member lists, and they are removed from the team members list. A deactivated account can also be reactivated from the System Console, in which case the user rejoins channels and teams that they previously belonged to.

Direct Message channels with deactivated users are hidden in users' sidebars, but can be reopened using the **More...** button or by pressing  :kbd:`Ctrl` :kbd:`K` on Windows or Linux, or :kbd:`⌘` :kbd:`K` on Mac.

Mattermost is designed as a system-of-record, so there isn't an option to delete users from the Mattermost system, as such an operation could compromise the integrity of message archives.

.. note::

    AD/LDAP user accounts can't be deactivated from Mattermost; they must be deactivated from your Active Directory.
source/welcome/about-teams.rst METASEP
About teams
===========

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

A team is a digital workspace where you and your teammates can collaborate in Mattermost. Depending on how Mattermost is set up in your organization, you can belong to one team or multiple teams. 

Only users with the **Create Teams** permission can `create new teams <#create-a-team>`__ and `manage team settings <https://docs.mattermost.com/welcome/team-settings.html>`__ for existing teams.

Single team versus multiple teams
----------------------------------

Mattermost can be deployed both to a single team and to multiple teams. Currently, we recommend deploying to a single team for the following reasons:

- Single team deployments promote communication across the organization. When you add multiple teams, groups can become isolated.
- We don't yet support search or channels across teams, which can impact the cross-team user experience. This includes general searches, saved posts, and recent mentions.
- Integrations (e.g., webhooks and slash commands) are only persistent across single team deployments.

However, some Mattermost customers prefer multiple team deployments for the following reasons:

- Teams are useful when there is a purpose for each of them. For example, one team is used for staff members and another team for external users.
- Performance is better when users are scattered across multiple teams instead of all in the same one. With multiple teams, there is less content to load per team or channel switch and database queries are faster.
- Creating a shared team for all users, and using advanced permissions to control who can create channels and add members to the shared team, improves cross-team collaboration when using multiple teams. Additionally, an annoucement banner can be used to provide system-wide announcements.

Team sidebar
------------

If you belong to more than one team, a team sidebar displays to the left of the channel sidebar. Drag teams to reorder them in the sidebar. You can also use keyboard shortcuts to navigate between teams.

.. image:: ../images/teams.gif
   :alt: Navigating between teams in Mattermost.

Create a team
--------------

If team creation is enabled by the System Admin, teams can be created from the team sidebar or the channel sidebar. The person who creates a team is automatically  assigned the Team Admin role for that team.

If you have appropriate permissions, select the **Plus** icon at the top of the team sidebar, then select **Create a New Team** on the team selection page, which guides you through the rest of the team creation steps. If this option is not visible on the web page, then the System Admin has disabled team creation.

If you have no other teams to join, selecting the **Plus** icon takes you directly to the team creation page if team creation is enabled.

.. tip::

  From your current Mattermost team, you can also select your team name, then select **Create a Team**. If this option is not visible in the menu, then the System Admin has disabled team creation.

Team name and URL selection
~~~~~~~~~~~~~~~~~~~~~~~~~~~

There are a few details and restrictions to consider when selecting a team name and team URL.

Team name
^^^^^^^^^

This is the display name of your team that appears in menus and headings.

- Team names can contain any letters, numbers, or symbols.
- Team names are case sensitive.
- Team names must be 2 - 64 characters in length.

Team URL
^^^^^^^^

The team URL is part of the web address that navigates to your team on the system domain, ``https://domain.com/teamurl/``.

- Teams may contain only lowercase letters, numbers, and dashes.
- Teams must start with a letter and cannot end in a dash.
- Teams must be 2 - 64 characters in length.
- Team names cannot start with the following restricted words: admin, api, channel, claim, error, files, help, landing, login, mfa, oauth, plug, plugins, post, signup, playbooks, or boards.

Join a team
-----------

You can join any team configured to `"allow any user with an account on this server to join this team" <https://docs.mattermost.com/welcome/team-settings.html#allow-anyone-to-join-this-team>`__, or when you receive an invitation to join.

If you haven't yet joined any teams in Mattermost, you're prompted to join available teams when you `log in <https://docs.mattermost.com/welcome/log-in.html>`__.

You can be a member of multiple teams at the same time. To join additional teams, select the current team name, choose **Join Another Team**, and select the name of the team you want to join.

.. image:: ../images/join-team.png
  :alt: Select a team name to join another team.

Invite people to teams
----------------------

If you have the required permissions, you can add people, including members of your organization as well as guests, to your team via a direct invite, a public team invite link, or if they already have an account on the server, you can add them to the team yourself.

A guest is a special role that is restricted to only the channels they have been invited to. When guest access is enabled, you can invite guests or users external to the organization, such as vendors or customers.

Send a direct invite
~~~~~~~~~~~~~~~~~~~~~

Direct invites are invitation emails sent from your team's server directly to the invited person's email address. A link within the invitation directs them to an account creation page. Invitation links sent by email expire after 48 hours and can only be used once. 

.. note::
  A System Admin can invalidate all active invitation links via **System Console > Authentication > Signup > Invalidate pending email invites**.

1. Select the Team menu at the top of the Navigation Panel.
2. Select **Invite People**.
3. If there's an option to invite members and guests, choose **Invite Members**.
4. In the **Invite People** field, enter the email address of the person you want to add. You can add multiple email addresses at a time.
5. When sending a direct invite to a guest, you must specify the channels the guest can access, and your invitation can include an optional custom message.
6. Select **Invite Members** or **Invite Guests**.

.. note::

  - If you aren't able to see the **Invite Guests** option, confirm with your System Admin that you have the correct permissions.
  - If you don't see the **Send Email Invite** option, confirm with your System Admin that **System Console > Authentication > Signup > Enable Email Invitations** is set to **true**.

Send a team invite link
~~~~~~~~~~~~~~~~~~~~~~~

The team invite link is a unique URL that directs people to an account creation page for a team. A team invite link can be used by anyone and does not change unless it is re-generated by a System Admin or Team Admin via **Team Settings > General > Invite Code**. For example, the team invite link can be included in a company-wide email to invite all employees to join a Mattermost team.

1. Select the Team menu at the top of the Navigation Panel.
2. Select **Invite People**.
3. If there's an option to invite members and guests, choose **Invite Members**.
4. Select the **Copy Link** button to save the URL to your clipboard and share it with those you want to invite to the team.

Adding someone to your team
~~~~~~~~~~~~~~~~~~~~~~~~~~~

If someone you want to add to your team already has an account on the server, you can add them to your team without sending an invitation.

1. Select the Team menu at the top of the Navigation Panel.
2. Select **Invite People**.
3. Choose **Invite Members** or **Invite Guests**.
4. Search for the person you want to add. If the people you want to add are not on the list, then they do not have an account on your server.
5. When adding a guest, you must specify the channels the guest can access.
6. Select **Invite Members** or **Invite Guests**.

.. note:: 
   
   - If you aren't able to see the **Invite Guests** option, confirm with your System Admin that you have the correct permissions.
   - System Admins can view and add team membership to individual users on the user profile page (via **System Console > Users > User Profile**) by selecting **Add Team**.

Remove people from teams
------------------------

A Team Admin can remove a user from a team via **Team menu > Manage Members > Remove From Team** in the dropdown menu beside a user entry.

When a user is removed from a team, the team will no longer show up in their team sidebar. If they currently have the team open, they are redirected to the first team that appears on their team sidebar. If they didn't belong to any other teams, the user is sent to the team selection page.

Removing a user from the team does not deactivate the account. The user will still be able to log in to the site, and join other teams. They will also be able to rejoin the team they were removed from if they receive another invite, or if the team is set to `"Allow any user with an account on this server to join this team" <https://docs.mattermost.com/welcome/team-settings.html#allow-anyone-to-join-this-team>`__. If the user does rejoin the team, they will no longer belong to the channels they were previously a part of, and they will lose all Admin privileges if they had them previously.

A System Admin can also remove users from teams via **System Console > Users**, and selecting the dropdown beside a user entry and selecting **Manage Teams**. The list of teams an individual user belongs to can be viewed on the user's profile page via **System Console > Users** and selecting the member's name from the list provided in the **User Configuration** screen.

Leave a team
------------

Users can also choose to remove themselves from a team, from **Team menu > Leave Team**. This will remove the user from the team, and from all public channels and private channels on the team.

They will only be able to rejoin the team if it is set to `"Allow any user with an account on this server to join this team" <https://docs.mattermost.com/welcome/team-settings.html#allow-anyone-to-join-this-team>`__ team, or if they receive a new invite. If they do rejoin, they will no longer be a part of their old channels.
source/upgrade/version-archive.rst METASEP
Version Archive
================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

If you want to check that the version of Mattermost you are installing is the official, unmodified version, compare the SHA-265 checksum or the file's GPG signature with the one published in this version archive. To verify the GPG signature of a Mattermost release, use the public key stored in Keybase: https://keybase.io/mattermost.

.. important::
   
   Support for Mattermost Server v6.3 `Extended Support Release <https://docs.mattermost.com/upgrade/extended-support-release.html>`_ is coming to the end of its life cycle on October 15, 2022. Upgrading to Mattermost Server v7.1 `Extended Support Release <https://docs.mattermost.com/upgrade/extended-support-release.html>`_ or later is recommended.

.. contents::
    :backlinks: top

Mattermost Enterprise Edition
------------------------------

Mattermost Enterprise Edition v7.2.0 - `View Changelog <https://docs.mattermost.com/install/self-managed-changelog.html#release-v7-2-feature-release>`__ - `Download <https://releases.mattermost.com/7.2.0/mattermost-7.2.0-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/7.2.0/mattermost-7.2.0-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``1404ed3bac456bf6cac32c3284a105660ae57b440f29923c0506eb0372253d18``
  - GPG Signature: https://releases.mattermost.com/7.2.0/mattermost-7.2.0-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v7.1.3 *Extended Support Release (ESR)* - `View Changelog <https://docs.mattermost.com/install/self-managed-changelog.html#release-v7-1-extended-support-release>`__ - `Download <https://releases.mattermost.com/7.1.3/mattermost-7.1.3-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/7.1.3/mattermost-7.1.3-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``1ce1c6215afef6941662338463b9ba57a517bfd21745fa34777f2d8662a49116``
  - GPG Signature: https://releases.mattermost.com/7.1.3/mattermost-7.1.3-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v7.0.2 - `View Changelog <https://docs.mattermost.com/install/self-managed-changelog.html#release-v7-0-major-release>`__ - `Download <https://releases.mattermost.com/7.0.2/mattermost-7.0.2-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/7.0.2/mattermost-7.0.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``e7597ab12598c908e0b4b2c4c35e87cdbad5a1db54a676d35787d1c41481eb5b``
  - GPG Signature: https://releases.mattermost.com/7.0.2/mattermost-7.0.2-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v6.7.2 - `View Changelog <https://docs.mattermost.com/install/self-managed-changelog.html#release-v6-7-feature-release>`__ - `Download <https://releases.mattermost.com/6.7.2/mattermost-6.7.2-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/6.7.2/mattermost-6.7.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``db3faada1a1673fcae4a4f7a26a630874498d11ee181e10fb93797f68939d3c1``
  - GPG Signature: https://releases.mattermost.com/6.7.2/mattermost-6.7.2-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v6.6.2 - `View Changelog <https://docs.mattermost.com/install/self-managed-changelog.html#release-v6-6-feature-release>`__ - `Download <https://releases.mattermost.com/6.6.2/mattermost-6.6.2-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/6.6.2/mattermost-6.6.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``895b89b87803b083eb4cd25ab4441f71c77930054c868df0d4f5ef19bae41bf8``
  - GPG Signature: https://releases.mattermost.com/6.6.2/mattermost-6.6.2-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v6.5.2 - `View Changelog <https://docs.mattermost.com/install/self-managed-changelog.html#release-v6-5-feature-release>`__ - `Download <https://releases.mattermost.com/6.5.2/mattermost-6.5.2-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/6.5.2/mattermost-6.5.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``4b10b7d6d8e17c167bb103da86b12957aaf40ab8c008b99a1c4653771516274d``
  - GPG Signature: https://releases.mattermost.com/6.5.2/mattermost-6.5.2-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v6.4.3 - `View Changelog <https://docs.mattermost.com/install/self-managed-changelog.html#release-v6-4-feature-release>`__ - `Download <https://releases.mattermost.com/6.4.3/mattermost-6.4.3-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/6.4.3/mattermost-6.4.3-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``099dbd1f62cd69a97ee664eee3b71646a8916f109b0493088403836fc8e5e5b5``
  - GPG Signature: https://releases.mattermost.com/6.4.3/mattermost-6.4.3-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v6.3.10 *Extended Support Release (ESR)* - `View Changelog <https://docs.mattermost.com/install/self-managed-changelog.html#release-v6-3-extended-support-release>`__ - `Download <https://releases.mattermost.com/6.3.10/mattermost-6.3.10-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/6.3.10/mattermost-6.3.10-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``40f5417f438a8c9c26106b037a2352ebffdb0f6236ac2a4e8ad91c602e65e1f2``
  - GPG Signature: https://releases.mattermost.com/6.3.10/mattermost-6.3.10-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v6.2.5 - `View Changelog <https://docs.mattermost.com/install/self-managed-changelog.html#release-v6-2-feature-release>`__ - `Download <https://releases.mattermost.com/6.2.5/mattermost-6.2.5-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/6.2.5/mattermost-6.2.5-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``2196a1402f19a4c27d284271c76191fa27ed5011e46c5e8bc31dd1d1c5b50b0e``
  - GPG Signature: https://releases.mattermost.com/6.2.5/mattermost-6.2.5-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v6.1.3 - `View Changelog <https://docs.mattermost.com/install/self-managed-changelog.html#release-v6-1-feature-release>`__ - `Download <https://releases.mattermost.com/6.1.3/mattermost-6.1.3-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/6.1.3/mattermost-6.1.3-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``b0d7b2792b5ff6ee510eac9a4f57cbf30a82c495d495f2d873bf9d00fe39a3ae``
  - GPG Signature: https://releases.mattermost.com/6.1.3/mattermost-6.1.3-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v6.0.4 - `View Changelog <https://docs.mattermost.com/install/self-managed-changelog.html#release-v6-0-feature-release>`__ - `Download <https://releases.mattermost.com/6.0.4/mattermost-6.0.4-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/6.0.4/mattermost-6.0.4-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``23ca2886e0ec0a785920cd78d47284b8eff543ee8ba07df5cdd4042acd549246``
  - GPG Signature: https://releases.mattermost.com/6.0.4/mattermost-6.0.4-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v5.39.3 - `View Changelog <https://docs.mattermost.com/install/self-managed-changelog.html#release-v5-39-quality-release>`__ - `Download <https://releases.mattermost.com/5.39.3/mattermost-5.39.3-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.39.3/mattermost-5.39.3-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``c2feb80ffc9378f224a8f24e2dc4d6ec5ab0daa19c6a473503e64fcc473f5172``
  - GPG Signature: https://releases.mattermost.com/5.39.3/mattermost-5.39.3-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v5.38.4 - `View Changelog <https://docs.mattermost.com/install/self-managed-changelog.html#release-v5-38-feature-release>`__ - `Download <https://releases.mattermost.com/5.38.4/mattermost-5.38.4-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.38.4/mattermost-5.38.4-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``ffb0f544222550c8477bbb83df35379da6a0280d1d0501c2569c839db9cb22c6``
  - GPG Signature: https://releases.mattermost.com/5.38.4/mattermost-5.38.4-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v5.37.10 *Extended Support Release (ESR)* - `View Changelog <https://docs.mattermost.com/install/self-managed-changelog.html#release-v5-37-extended-support-release>`__ - `Download <https://releases.mattermost.com/5.37.10/mattermost-5.37.10-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.37.10/mattermost-5.37.10-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``ccaecdb70d49879fe4582456357ecfbc305d17e3aa847850389ad7d1f521caa7``
  - GPG Signature: https://releases.mattermost.com/5.37.10/mattermost-5.37.10-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v5.36.2 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-36-feature-release>`__ - `Download <https://releases.mattermost.com/5.36.2/mattermost-5.36.2-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.36.2/mattermost-5.36.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``fc5e03ada4f04290230e56411f3aecefa0d3a21317fc08b355193a1702bf1136``
  - GPG Signature: https://releases.mattermost.com/5.36.2/mattermost-5.36.2-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v5.35.5 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-35-feature-release>`__ - `Download <https://releases.mattermost.com/5.35.5/mattermost-5.35.5-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.35.5/mattermost-5.35.5-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``f7de6ad424498a68537b34f18c70cfbe89487f2700e83ee041aa33491719e31f``
  - GPG Signature: https://releases.mattermost.com/5.35.5/mattermost-5.35.5-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v5.34.5 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-34-feature-release>`__ - `Download <https://releases.mattermost.com/5.34.5/mattermost-5.34.5-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.34.5/mattermost-5.34.5-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``4af01d1a40f21c8b3ac4830f124713950a815f2dbb1ac1163d35d5c2aec8783b``
  - GPG Signature: https://releases.mattermost.com/5.34.5/mattermost-5.34.5-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v5.33.5 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-33-feature-release>`__ - `Download <https://releases.mattermost.com/5.33.5/mattermost-5.33.5-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.33.5/mattermost-5.33.5-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``6b4fef57213a73832e97430daba1d2faf211c5ee5fad127944dc35af2d31823d``
  - GPG Signature: https://releases.mattermost.com/5.33.5/mattermost-5.33.5-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v5.32.1 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-32-feature-release>`__ - `Download <https://releases.mattermost.com/5.32.1/mattermost-5.32.1-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.32.1/mattermost-5.32.1-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``9117ab9777d8453ae8b63f3a008152a2bdc6a638400640a67a0a359acf479a44``
  - GPG Signature: https://releases.mattermost.com/5.32.1/mattermost-5.32.1-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v5.31.9 *Extended Support Release (ESR)* - `View Changelog <https://docs.mattermost.com/install/self-managed-changelog.html#release-v5-31-esr>`__ - `Download <https://releases.mattermost.com/5.31.9/mattermost-5.31.9-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.31.9/mattermost-5.31.9-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``95cc8744dd162ad16add85e76231494153473810f9a3a72d30d283466d73f949``
  - GPG Signature: https://releases.mattermost.com/5.31.9/mattermost-5.31.9-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v5.30.3 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-30>`__ - `Download <https://releases.mattermost.com/5.30.3/mattermost-5.30.3-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.30.3/mattermost-5.30.3-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``6502b01d966dca12443e4d397866651d236241373f2c3fb6fb8ce37ef136efc0``
  - GPG Signature: https://releases.mattermost.com/5.30.3/mattermost-5.30.3-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v5.29.2 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-29-quality-release>`__ - `Download <https://releases.mattermost.com/5.29.2/mattermost-5.29.2-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.29.2/mattermost-5.29.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``6e0741f06fbbe6c11707a18b9cfb1a80356d7ca32378b109657a0b29b3b246d0``
  - GPG Signature: https://releases.mattermost.com/5.29.2/mattermost-5.29.2-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v5.28.2 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-28-feature-release>`__ - `Download <https://releases.mattermost.com/5.28.2/mattermost-5.28.2-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.28.2/mattermost-5.28.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``399f3ad35ea0e0b109cdb714d18aaccf8571223d856ac2129a8cd0866f39ac20``
  - GPG Signature: https://releases.mattermost.com/5.28.2/mattermost-5.28.2-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v5.27.2 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-27-quality-release>`__ - `Download <https://releases.mattermost.com/5.27.2/mattermost-5.27.2-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.27.2/mattermost-5.27.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``067bfe08307580851c407ec43a6cb725f179aa3baf2c434a2bed9b03c69e15f0``
  - GPG Signature: https://releases.mattermost.com/5.27.2/mattermost-5.27.2-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v5.26.2 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-26-feature-release>`__ - `Download <https://releases.mattermost.com/5.26.2/mattermost-5.26.2-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.26.2/mattermost-5.26.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``aa671915f684d7daca2fed321ede89dd05c3d377b0beaaca9561b1d7e3c36970``
  - GPG Signature: https://releases.mattermost.com/5.26.2/mattermost-5.26.2-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v5.25.7 *Extended Support Release (ESR)* - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-25-esr>`__ - `Download <https://releases.mattermost.com/5.25.7/mattermost-5.25.7-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.25.7/mattermost-5.25.7-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``89048fc2b4d4930927e4b92a508d8db3628d05059c7f271caffd05d9b50136c8``
  - GPG Signature: https://releases.mattermost.com/5.25.7/mattermost-5.25.7-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v5.24.3 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-24-feature-release>`__ - `Download <https://releases.mattermost.com/5.24.3/mattermost-5.24.3-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.24.3/mattermost-5.24.3-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``1a9a3200a3de242b4461df7bf58ff131ebf730cc242d7515ce101ad880b37fb8``
  - GPG Signature: https://releases.mattermost.com/5.24.3/mattermost-5.24.3-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v5.23.2 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-23-quality-release>`__ - `Download <https://releases.mattermost.com/5.23.2/mattermost-5.23.2-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.23.2/mattermost-5.23.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``a36f8de7fdc1b12c1b2b1a841e43a5f0604845b1c2bd4cff9318786964fcefae``
  - GPG Signature: https://releases.mattermost.com/5.23.2/mattermost-5.23.2-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v5.22.3 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-22-feature-release>`__ - `Download <https://releases.mattermost.com/5.22.3/mattermost-5.22.3-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.22.3/mattermost-5.22.3-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``24ce88ab151c873bcb107a2ff4fdbde7a06ef3d66fa172982ebd931211b2e7e0``
  - GPG Signature: https://releases.mattermost.com/5.22.3/mattermost-5.22.3-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v5.21.0 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-21-quality-release>`__ - `Download <https://releases.mattermost.com/5.21.0/mattermost-5.21.0-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.21.0/mattermost-5.21.0-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``909b17498139cd511d4e5483e2b7be0b757ac28ea5063be9c3d82cbe49b4a696``
  - GPG Signature: https://releases.mattermost.com/5.21.0/mattermost-5.21.0-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v5.20.2 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-20-feature-release>`__ - `Download <https://releases.mattermost.com/5.20.2/mattermost-5.20.2-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.20.2/mattermost-5.20.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``20fc3fdbeee5f13371b29c2016a3d42d5a8edf8c2508b43b295dd39c6cd57c90``
  - GPG Signature: https://releases.mattermost.com/5.20.2/mattermost-5.20.2-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v5.19.3 *Extended Support Release (ESR)* - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-19-esr>`__ - `Download <https://releases.mattermost.com/5.19.3/mattermost-5.19.3-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.19.3/mattermost-5.19.3-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``9926f1ded2faedea9168a1ac84be77b9b4a66f038bbdc92297b653c3a0a04271``
  - GPG Signature: https://releases.mattermost.com/5.19.3/mattermost-5.19.3-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v5.18.2 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-18-feature-release>`__ - `Download <https://releases.mattermost.com/5.18.2/mattermost-5.18.2-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.18.2/mattermost-5.18.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``e61d6affca5bcf0e85b9152ff280b11135861f1b7b76dd30ad3ca96913c9f7a6``
  - GPG Signature: https://releases.mattermost.com/5.18.2/mattermost-5.18.2-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v5.17.3 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-17-quality-release>`__ - `Download <https://releases.mattermost.com/5.17.3/mattermost-5.17.3-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.17.3/mattermost-5.17.3-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``5b02c4e6c6c5735191bbdf46ee9af5aa08f2002e4b41d5ffb7cc39b4c838fadc``
  - GPG Signature: https://releases.mattermost.com/5.17.3/mattermost-5.17.3-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v5.16.5 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-16-feature-release>`__ - `Download <https://releases.mattermost.com/5.16.5/mattermost-5.16.5-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.16.5/mattermost-5.16.5-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``85dc0ec19fec3573c7331f25c17ad1a35a2db8f9bffa7ef9131dc6f9e00b51cc``
  - GPG Signature: https://releases.mattermost.com/5.16.5/mattermost-5.16.5-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v5.15.5 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-15-quality-release>`__ - `Download <https://releases.mattermost.com/5.15.5/mattermost-5.15.5-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.15.5/mattermost-5.15.5-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``9676cadb908891227d8bce784643506dd36ba05498c9b3c4ce9d9378eed2b071``
  - GPG Signature: https://releases.mattermost.com/5.15.5/mattermost-5.15.5-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v5.14.5 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-14-feature-release>`__ - `Download <https://releases.mattermost.com/5.14.5/mattermost-5.14.5-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.14.5/mattermost-5.14.5-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``d8f530ec5540dce20c3ff1a13beb54a8e065cb391247b4d92deb9f8c4adb3d7e``
  - GPG Signature: https://releases.mattermost.com/5.14.5/mattermost-5.14.5-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v5.13.3 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-13-quality-release>`__ - `Download <https://releases.mattermost.com/5.13.3/mattermost-5.13.3-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.13.3/mattermost-5.13.3-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``41f40fb7397309aeecdd9c8670e8f137a4892093ec658fc0346c732bca54e8f9``
  - GPG Signature: https://releases.mattermost.com/5.13.3/mattermost-5.13.3-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v5.12.6 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-12-feature-release>`__ - `Download <https://releases.mattermost.com/5.12.6/mattermost-5.12.6-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.12.6/mattermost-5.12.6-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``1464e3f970c3b55c9b3ce94925b8d6e4b3b291c05f181498e8ae23822cf1ade4``
  - GPG Signature: https://releases.mattermost.com/5.12.6/mattermost-5.12.6-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v5.11.1 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-11-quality-release>`__ - `Download <https://releases.mattermost.com/5.11.1/mattermost-5.11.1-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.11.1/mattermost-5.11.1-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``ad2db1a68103fb3ce9383f857eddc817848d548334b510b2dd2491f13f59ea4d``
  - GPG Signature: https://releases.mattermost.com/5.11.1/mattermost-5.11.1-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v5.10.2 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-10-feature-release>`__ - `Download <https://releases.mattermost.com/5.10.2/mattermost-5.10.2-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.10.2/mattermost-5.10.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``7212c63f94c0b3d44c9296e3f7907a2cb651e15f5ac2032f1092223867cdea90``
  - GPG Signature: https://releases.mattermost.com/5.10.2/mattermost-5.10.2-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v5.9.8 *Extended Support Release (ESR)* - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-9-esr>`__ - `Download <https://releases.mattermost.com/5.9.8/mattermost-5.9.8-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.9.8/mattermost-5.9.8-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``393a9803c2d1c28f592d52e43785899f787cccee1a12510a14f1d10e659792fe``
  - GPG Signature: https://releases.mattermost.com/5.9.8/mattermost-5.9.8-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v5.8.2 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-8-feature-release>`__ - `Download <https://releases.mattermost.com/5.8.2/mattermost-5.8.2-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.8.2/mattermost-5.8.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``d681b7a2de4711e39d961598dad3821114c94ff916ec84b7d9965c54ff48cdda``
  - GPG Signature: https://releases.mattermost.com/5.8.2/mattermost-5.8.2-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v5.7.3 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-7-quality-release>`__ - `Download <https://releases.mattermost.com/5.7.3/mattermost-5.7.3-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.7.3/mattermost-5.7.3-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``7775e6b38785f1838835fcdd0e64a1c8f718c0071232f31e9a70d83b09384955``
  - GPG Signature: https://releases.mattermost.com/5.7.3/mattermost-5.7.3-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v5.6.5 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-6-feature-release>`__ - `Download <https://releases.mattermost.com/5.6.5/mattermost-5.6.5-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.6.5/mattermost-5.6.5-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``9705f6befff80451228c12909eed7e36730ffc6a231bcacf1381b9807c7acb91``
  - GPG Signature: https://releases.mattermost.com/5.6.5/mattermost-5.6.5-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v5.5.3 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-5-quality-release>`__ - `Download <https://releases.mattermost.com/5.5.3/mattermost-5.5.3-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.5.3/mattermost-5.5.3-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``e568e23f1914b180665089dd711a154f03483bd127d2b037ab4dd35e50e6d567``
  - GPG Signature: https://releases.mattermost.com/5.5.3/mattermost-5.5.3-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v5.4.0 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-4-feature-release>`__ - `Download <https://releases.mattermost.com/5.4.0/mattermost-5.4.0-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.4.0/mattermost-5.4.0-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``dfbd4a76d640cf2b3fc1d78f3eddd6571669d3d0c27a4bc7166ac06c8d03af19``
  - GPG Signature: https://releases.mattermost.com/5.4.0/mattermost-5.4.0-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v5.3.1 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-3-feature-release>`__ - `Download <https://releases.mattermost.com/5.3.1/mattermost-5.3.1-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.3.1/mattermost-5.3.1-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``ebe59b38f0c7c1bed2dd94c0f5c64858dd316347418196199d871417747dcf97``
  - GPG Signature: https://releases.mattermost.com/5.3.1/mattermost-5.3.1-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v5.2.2 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-2-feature-release>`__ - `Download <https://releases.mattermost.com/5.2.2/mattermost-5.2.2-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.2.2/mattermost-5.2.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``91c383892e5072b798c828e6c4af19252a03d798bd42757c8a2369946f10ca8f``
  - GPG Signature: https://releases.mattermost.com/5.2.2/mattermost-5.2.2-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v5.1.2 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-1-feature-release>`__ - `Download <https://releases.mattermost.com/5.1.2/mattermost-5.1.2-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.1.2/mattermost-5.1.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``4646910788a177931e6a4c5a0d8751e3d4f10e8083c6078de348e3463b106bb3``
  - GPG Signature: https://releases.mattermost.com/5.1.2/mattermost-5.1.2-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v5.0.3 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-0-feature-release>`__ - `Download <https://releases.mattermost.com/5.0.3/mattermost-5.0.3-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.0.3/mattermost-5.0.3-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``35863bd376f949d1fd87a012d4f5676e5eb2bdaaccaec4dd9141cf88979af6a6``
  - GPG Signature: https://releases.mattermost.com/5.0.3/mattermost-5.0.3-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v4.10.10 *Extended Support Release (ESR)* - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v4-10>`__ - `Download <https://releases.mattermost.com/4.10.10/mattermost-4.10.10-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/4.10.10/mattermost-4.10.10-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``57070578ec7580df1a1d28d6248b387ad8be72cb584fd8535483e853b4858b9e``
  - GPG Signature: https://releases.mattermost.com/4.10.10/mattermost-4.10.10-linux-amd64.tar.gz.sig
Mattermost Enterprise Edition v4.9.4 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v4-9>`__ - `Download <https://releases.mattermost.com/4.9.4/mattermost-4.9.4-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/4.9.4/mattermost-4.9.4-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``368419bc8301ae9823c42c2b5ae69a3135b1dc640c94b8280d46941bda1b7b0b``
Mattermost Enterprise Edition v4.8.2 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v4-8>`__ - `Download <https://releases.mattermost.com/4.8.2/mattermost-4.8.2-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/4.8.2/mattermost-4.8.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``61b218111ab336e1ef0dfaa5fa1dfec345b11f7af281fa7e8a76a5bd28ca9ca9``
Mattermost Enterprise Edition v4.7.4 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v4-7>`__ - `Download <https://releases.mattermost.com/4.7.4/mattermost-4.7.4-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/4.7.4/mattermost-4.7.4-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``6f616c02e6cab054acb80c6d949f12b1874f92a58690931cf3f1890a66c08bcc``
Mattermost Enterprise Edition v4.6.3 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v4-6>`__ - `Download <https://releases.mattermost.com/4.6.3/mattermost-4.6.3-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/4.6.3/mattermost-4.6.3-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``79763620c9a8b32a94193ae88d7fbab2899e3f525737b3e5c20cc5a0b96d19e2``
Mattermost Enterprise Edition v4.5.2 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v4-5>`__ - `Download <https://releases.mattermost.com/4.5.2/mattermost-4.5.2-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/4.5.2/mattermost-4.5.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``cb5b7d5729bb5abda3d89f0263ccb596feee4d4fd015c3c5e0de85792f700494``
Mattermost Enterprise Edition v4.4.5 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v4-4-5>`__ - `Download <https://releases.mattermost.com/4.4.5/mattermost-4.4.5-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/4.4.5/mattermost-4.4.5-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``54c268cb1ace376981ffc6845b18185c287783fad4dfb90969cd6bc459e306ae``
Mattermost Enterprise Edition v4.3.4 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v4-3-4>`__ - `Download <https://releases.mattermost.com/4.3.4/mattermost-4.3.4-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/4.3.4/mattermost-4.3.4-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``10a30776bfb1af34ab89657f0c77f96eb8be0e2998e8ea50bf3960cc1aacd383``
Mattermost Enterprise Edition v4.2.2 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v4-2-2>`__ - `Download <https://releases.mattermost.com/4.2.2/mattermost-4.2.2-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/4.2.2/mattermost-4.2.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``21d7fa761c2843ba69295cd10c7f4de8969acf57cb53b58be90d42eb6d0a71f7``
Mattermost Enterprise Edition v4.1.2 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v4-1-2>`__ - `Download <https://releases.mattermost.com/4.1.2/mattermost-4.1.2-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/4.1.2/mattermost-4.1.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``e13c33d92ab19e7448ec122925953ab4938a565d7775e237564ebb6e1025f8bd``
Mattermost Enterprise Edition v4.0.5 - `View Changelog <./changelog.html#release-v4-0-5>`__ - `Download <https://releases.mattermost.com/4.0.5/mattermost-4.0.5-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/4.0.5/mattermost-4.0.5-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``9b910bc0f1534852dead573bddcc13eccb3bbc51194cf64da92dadb662a480e8``
Mattermost Enterprise Edition v3.10.3 - `View Changelog <./changelog.html#release-v3-10-3>`__ - `Download <https://releases.mattermost.com/3.10.3/mattermost-3.10.3-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/3.10.3/mattermost-3.10.3-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``a70a29986f62fdced9195eeb6d26dd3f6dad2bb9fe8badef708f779043e6d438``
Mattermost Enterprise Edition v3.9.2 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v3-9-2>`__ - `Download <https://releases.mattermost.com/3.9.2/mattermost-3.9.2-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/3.9.2/mattermost-3.9.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``49097757a4e97b26339446754859f2589ab420d56a795a57c507fcc1b02ba91b``
Mattermost Enterprise Edition v3.8.3 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v3-8-3>`__ - `Download <https://releases.mattermost.com/3.8.3/mattermost-3.8.3-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/3.8.3/mattermost-3.8.3-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``c223320a82222ebff002071633c6331dce0da6ff6ac8e22d0ab0d7055356ff9c``
Mattermost Enterprise Edition v3.7.5 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v3-7-5>`__ - `Download <https://releases.mattermost.com/3.7.5/mattermost-3.7.5-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/3.7.5/mattermost-3.7.5-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``65e65da661edbc7b7b2b02411f13dbe498fd704d5ae1289789feca79fe00b58a``
Mattermost Enterprise Edition v3.6.7 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v3-6-7>`__ - `Download <https://releases.mattermost.com/3.6.7/mattermost-3.6.7-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/3.6.7/mattermost-3.6.7-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``8e666708fead5fbfcf1f20617b07fda21cc8cbc85f9690321cbf4a41bfc1dd89``
Mattermost Enterprise Edition v3.5.1 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v3-5-1>`__ - `Download <https://releases.mattermost.com/3.5.1/mattermost-3.5.1-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/3.5.1/mattermost-3.5.1-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``b972ac6f38f8b4c4f364e40a7c0e7819511315a81cb38c8a51c0622d7c5b14a1``
Mattermost Enterprise Edition v3.4.0 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v3-4-0>`__ - `Download <https://releases.mattermost.com/3.4.0/mattermost-3.4.0-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/3.4.0/mattermost-3.4.0-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``3329fe3ef4d6bd7bd156eec86903b5d9db30d8c62545e4f5ca63633a64559f16``
Mattermost Enterprise Edition v3.3.0 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v3-3-0>`__ - `Download <https://releases.mattermost.com/3.3.0/mattermost-3.3.0-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/3.3.0/mattermost-3.3.0-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``d12d567c270a0c163e07b38ff41ea1d7839991d31f7c10b6ad1b4ef0f05f4e14``
Mattermost Enterprise Edition v3.2.0 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v3-2-0>`__ - `Download <https://releases.mattermost.com/3.2.0/mattermost-3.2.0-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/3.2.0/mattermost-3.2.0-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``f66597ad2fa94d3f75f06135129aa91cddd35dd8b94acab4aa15dfa225596422``
Mattermost Enterprise Edition v3.1.0 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v3-1-0>`__ - `Download <https://releases.mattermost.com/3.1.0/mattermost-3.1.0-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/3.1.0/mattermost-3.1.0-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``9e29525199e25eca6b7fe6422b415f6371d21e22c344ca6febc5e64f69ec670b``
Mattermost Enterprise Edition v3.0.3 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v3-0-3>`__ - `Download <https://releases.mattermost.com/3.0.3/mattermost-enterprise-3.0.3-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/3.0.3/mattermost-enterprise-3.0.3-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``3c692f8532b1858aefd2f0c2c22721e6b18734580a84a8ae5d6ce891f0e16f07``
Mattermost Enterprise Edition v2.2.0 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v2-2-0>`__ - `Download <https://releases.mattermost.com/2.2.0/mattermost-enterprise-2.2.0-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/2.2.0/mattermost-enterprise-2.2.0-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``a7e997526d9204eab70c74a31d51eea693cca0d4bf0f0f71760f14f797fa5477``
Mattermost Enterprise Edition v2.1.0 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v2-1-0>`__ - `Download <https://releases.mattermost.com/2.1.0/mattermost-enterprise-2.1.0-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/2.1.0/mattermost-enterprise-2.1.0-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``9454c3daacae602025b03950590e3f1ecd540b85a4bb7ad73bdca212ba85cf7a``

Mattermost Team Edition
-----------------------

The open source Mattermost Team Edition is functionally identical to the commercial Mattermost Enterprise Edition in its free “team mode”, but there is no ability to unlock enterprise features. It deploys as single Linux binary with MySQL or PostgreSQL under an MIT license.

We generally recommend installing Enterprise Edition, even if you don't currently need a license. This provides the flexibility to seamlessly unlock Enterprise features should you need them. However, if you only want to install software with a fully open source code base, then Team Edition is the best choice for you.

Mattermost Team Edition v7.2.0 - `View Changelog <https://docs.mattermost.com/install/self-managed-changelog.html#release-v7-2-feature-release>`__ - `Download <https://releases.mattermost.com/7.2.0/mattermost-team-7.2.0-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/7.2.0/mattermost-team-7.2.0-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``185eecbcee8bdfc10f9c99f04a294912269701da86a6217eb48cc761207fca80``
  - GPG Signature: https://releases.mattermost.com/7.2.0/mattermost-team-7.2.0-linux-amd64.tar.gz.sig
Mattermost Team Edition v7.1.3 *Extended Support Release (ESR)* - `View Changelog <https://docs.mattermost.com/install/self-managed-changelog.html#release-v7-1-extended-support-release>`__ - `Download <https://releases.mattermost.com/7.1.3/mattermost-team-7.1.3-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/7.1.3/mattermost-team-7.1.3-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``ef41b2300a47ffa6e1b52bac2978ec3a781d21551277c6ac275b800dc693f8d1``
  - GPG Signature: https://releases.mattermost.com/7.1.3/mattermost-team-7.1.3-linux-amd64.tar.gz.sig
Mattermost Team Edition v7.0.2 - `View Changelog <https://docs.mattermost.com/install/self-managed-changelog.html#release-v7-0-major-release>`__ - `Download <https://releases.mattermost.com/7.0.2/mattermost-team-7.0.2-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/7.0.2/mattermost-team-7.0.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``95725aa1950d1165ed671fbc855bee386422c95c0cdfc71940bab2200002fcbe``
  - GPG Signature: https://releases.mattermost.com/7.0.2/mattermost-team-7.0.2-linux-amd64.tar.gz.sig
Mattermost Team Edition v6.7.2 - `View Changelog <https://docs.mattermost.com/install/self-managed-changelog.html#release-v6-7-feature-release>`__ - `Download <https://releases.mattermost.com/6.7.2/mattermost-team-6.7.2-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/6.7.2/mattermost-team-6.7.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``f5e6d1433a09380d2197fde4c6c04d4ad876178823bd6e5fb63301382806fd16``
  - GPG Signature: https://releases.mattermost.com/6.7.2/mattermost-team-6.7.2-linux-amd64.tar.gz.sig
Mattermost Team Edition v6.6.2 - `View Changelog <https://docs.mattermost.com/install/self-managed-changelog.html#release-v6-6-feature-release>`__ - `Download <https://releases.mattermost.com/6.6.2/mattermost-team-6.6.2-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/6.6.2/mattermost-team-6.6.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``3e0b3240037fc81e52c168805734bb46dbac454c704429777b82f852ba0f5858``
  - GPG Signature: https://releases.mattermost.com/6.6.2/mattermost-team-6.6.2-linux-amd64.tar.gz.sig
Mattermost Team Edition v6.5.2 - `View Changelog <https://docs.mattermost.com/install/self-managed-changelog.html#release-v6-5-feature-release>`__ - `Download <https://releases.mattermost.com/6.5.2/mattermost-team-6.5.2-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/6.5.2/mattermost-team-6.5.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``3c62748e5a7c0c78ad81b9b514d7a8eb88d19232707167b68a41757827736262``
  - GPG Signature: https://releases.mattermost.com/6.5.2/mattermost-team-6.5.2-linux-amd64.tar.gz.sig
Mattermost Team Edition v6.4.3 - `View Changelog <https://docs.mattermost.com/install/self-managed-changelog.html#release-v6-4-feature-release>`__ - `Download <https://releases.mattermost.com/6.4.3/mattermost-team-6.4.3-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/6.4.3/mattermost-team-6.4.3-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``8a0297e875a78aa90e7c92a344dcc16dda9b80c3dd17e0085e00a005d3892ec8``
  - GPG Signature: https://releases.mattermost.com/6.4.3/mattermost-team-6.4.3-linux-amd64.tar.gz.sig
Mattermost Team Edition v6.3.10 *Extended Support Release (ESR)* - `View Changelog <https://docs.mattermost.com/install/self-managed-changelog.html#release-v6-3-extended-support-release>`__ - `Download <https://releases.mattermost.com/6.3.10/mattermost-team-6.3.10-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/6.3.10/mattermost-team-6.3.10-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``00771ee7649f7a13a1598491ee5222509e85920271a12b3ae9683356b4d563ff``
  - GPG Signature: https://releases.mattermost.com/6.3.10/mattermost-team-6.3.10-linux-amd64.tar.gz.sig
Mattermost Team Edition v6.2.5 - `View Changelog <https://docs.mattermost.com/install/self-managed-changelog.html#release-v6-2-feature-release>`__ - `Download <https://releases.mattermost.com/6.2.5/mattermost-team-6.2.5-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/6.2.5/mattermost-team-6.2.5-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``21e21b7ca6706816a30bdd4e12b4cfb2416eb07523f178b167bd19bb92316ee6``
  - GPG Signature: https://releases.mattermost.com/6.2.5/mattermost-team-6.2.5-linux-amd64.tar.gz.sig
Mattermost Team Edition v6.1.3 - `View Changelog <https://docs.mattermost.com/install/self-managed-changelog.html#release-v6-1-feature-release>`__ - `Download <https://releases.mattermost.com/6.1.3/mattermost-team-6.1.3-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/6.1.3/mattermost-team-6.1.3-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``942f2a051b25a36e32e9b5da19bc8cf3ba54fb6febeffe71ba1db72dbf242520``
  - GPG Signature: https://releases.mattermost.com/6.1.3/mattermost-team-6.1.3-linux-amd64.tar.gz.sig
Mattermost Team Edition v6.0.4 - `View Changelog <https://docs.mattermost.com/install/self-managed-changelog.html#release-v6-0-feature-release>`__ - `Download <https://releases.mattermost.com/6.0.4/mattermost-team-6.0.4-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/6.0.4/mattermost-team-6.0.4-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``11b26d3b2b1f6367118da3c21c7ab46e289c900a8860870a1b07b1a46c71fa24``
  - GPG Signature: https://releases.mattermost.com/6.0.4/mattermost-team-6.0.4-linux-amd64.tar.gz.sig
Mattermost Team Edition v5.39.3 - `View Changelog <https://docs.mattermost.com/install/self-managed-changelog.html#release-v5-39-quality-release>`__ - `Download <https://releases.mattermost.com/5.39.3/mattermost-team-5.39.3-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.39.3/mattermost-team-5.39.3-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``77f77bcd73da8f449aba069108fafc694829cfa5ad0b5bcf289b52ee116c3d10``
  - GPG Signature: https://releases.mattermost.com/5.39.3/mattermost-team-5.39.3-linux-amd64.tar.gz.sig
Mattermost Team Edition v5.38.4 - `View Changelog <https://docs.mattermost.com/install/self-managed-changelog.html#release-v5-38-feature-release>`__ - `Download <https://releases.mattermost.com/5.38.4/mattermost-team-5.38.4-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.38.4/mattermost-team-5.38.4-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``03d083280e8764010505a4f07810531907265335a0115745bf32cd7250fe858e``
  - GPG Signature: https://releases.mattermost.com/5.38.4/mattermost-team-5.38.4-linux-amd64.tar.gz.sig
Mattermost Team Edition v5.37.10 *Extended Support Release (ESR)* - `View Changelog <https://docs.mattermost.com/install/self-managed-changelog.html#release-v5-37-extended-support-release>`__ - `Download <https://releases.mattermost.com/5.37.10/mattermost-team-5.37.10-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.37.10/mattermost-team-5.37.10-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``3d8efd53b900d5ffc19ce5af142bb6103371111f122040edeab3b72913ffc0b1``
  - GPG Signature: https://releases.mattermost.com/5.37.10/mattermost-team-5.37.10-linux-amd64.tar.gz.sig
Mattermost Team Edition v5.36.2 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-36-feature-release>`__ - `Download <https://releases.mattermost.com/5.36.2/mattermost-team-5.36.2-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.36.2/mattermost-team-5.36.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``dff78b91a2c36b948470f0b6df247bbc9bb489cce531fa1d239367a1448afc74``
  - GPG Signature: https://releases.mattermost.com/5.36.2/mattermost-team-5.36.2-linux-amd64.tar.gz.sig
Mattermost Team Edition v5.35.5 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-35-feature-release>`__ - `Download <https://releases.mattermost.com/5.35.5/mattermost-team-5.35.5-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.35.5/mattermost-team-5.35.5-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``3d5f3e529e0f4276c2ffb1a601fd778787913f689e2fc83e4c32e3703740fe8e``
  - GPG Signature: https://releases.mattermost.com/5.35.5/mattermost-team-5.35.5-linux-amd64.tar.gz.sig
Mattermost Team Edition v5.34.5 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-34-feature-release>`__ - `Download <https://releases.mattermost.com/5.34.5/mattermost-team-5.34.5-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.34.5/mattermost-team-5.34.5-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``40c8e00dcbf3f6543e511e3c5dbc072af2e2aced0614e5c3f500a53c66395716``
  - GPG Signature: https://releases.mattermost.com/5.34.5/mattermost-team-5.34.5-linux-amd64.tar.gz.sig
Mattermost Team Edition v5.33.5 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-33-feature-release>`__ - `Download <https://releases.mattermost.com/5.33.5/mattermost-team-5.33.5-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.33.5/mattermost-team-5.33.5-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``b2a14215bf33079c45892c387e48b7977e96ab2f7543def0f655096782f9277d``
  - GPG Signature: https://releases.mattermost.com/5.33.5/mattermost-team-5.33.5-linux-amd64.tar.gz.sig
Mattermost Team Edition v5.32.1 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-32-feature-release>`__ - `Download <https://releases.mattermost.com/5.32.1/mattermost-team-5.32.1-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.32.1/mattermost-team-5.32.1-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``86fd99e49b6ed687004d46813e51fd91e761a87dff58fa2878e752728fac555a``
  - GPG Signature: https://releases.mattermost.com/5.32.1/mattermost-team-5.32.1-linux-amd64.tar.gz.sig
Mattermost Team Edition v5.31.9 *Extended Support Release (ESR)* - `View Changelog <https://docs.mattermost.com/install/self-managed-changelog.html#release-v5-31-esr>`__ - `Download <https://releases.mattermost.com/5.31.9/mattermost-team-5.31.9-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.31.9/mattermost-team-5.31.9-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``b5322d6187ca62b1b5725ae7162c8a2c7306a181afae6ebc508fc5de7308c808``
  - GPG Signature: https://releases.mattermost.com/5.31.9/mattermost-team-5.31.9-linux-amd64.tar.gz.sig
Mattermost Team Edition v5.30.3 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-30>`__ - `Download <https://releases.mattermost.com/5.30.3/mattermost-team-5.30.3-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.30.3/mattermost-team-5.30.3-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``9d9e3c5b4602749d111a569b5a597745450898dab6976c17b5b87d7b8f82d4b4``
  - GPG Signature: https://releases.mattermost.com/5.30.3/mattermost-team-5.30.3-linux-amd64.tar.gz.sig
Mattermost Team Edition v5.29.2 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-29-quality-release>`__ - `Download <https://releases.mattermost.com/5.29.2/mattermost-team-5.29.2-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.29.2/mattermost-team-5.29.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``10dff87226298c22254f56825877c8639a882dc04c42e82bb34cfdbef8b06bae``
  - GPG Signature: https://releases.mattermost.com/5.29.2/mattermost-team-5.29.2-linux-amd64.tar.gz.sig
Mattermost Team Edition v5.28.2 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-28-feature-release>`__ - `Download <https://releases.mattermost.com/5.28.2/mattermost-team-5.28.2-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.28.2/mattermost-team-5.28.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``a2bcc4aba7e2bfeb5b2b8d9f9793a3ae4882b457b60a40fe86c959769be182e8``
  - GPG Signature: https://releases.mattermost.com/5.28.2/mattermost-team-5.28.2-linux-amd64.tar.gz.sig
Mattermost Team Edition v5.27.2 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-27-quality-release>`__ - `Download <https://releases.mattermost.com/5.27.2/mattermost-team-5.27.2-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.27.2/mattermost-team-5.27.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``9d1a1dd99a516c3aee64db44c9ef11a9dc33674928cdd570ca33ed8ae7837ee3``
  - GPG Signature: https://releases.mattermost.com/5.27.2/mattermost-team-5.27.2-linux-amd64.tar.gz.sig
Mattermost Team Edition v5.26.2 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-26-feature-release>`__ - `Download <https://releases.mattermost.com/5.26.1/mattermost-team-5.26.1-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.26.2/mattermost-team-5.26.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``1d56a1b10ba3ea3ee89e48c5ca7dcbbc40704f4b541a26d9f7b7254193c320bd``
  - GPG Signature: https://releases.mattermost.com/5.26.2/mattermost-team-5.26.2-linux-amd64.tar.gz.sig
Mattermost Team Edition v5.25.7 *Extended Support Release (ESR)* - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-25-esr>`__ - `Download <https://releases.mattermost.com/5.25.7/mattermost-team-5.25.7-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.25.7/mattermost-team-5.25.7-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``9ee64a0e0bb09ef24f32aa3eea1a80b47cccf36339b7498e52e0d244422e13bb``
  - GPG Signature: https://releases.mattermost.com/5.25.7/mattermost-team-5.25.7-linux-amd64.tar.gz.sig
Mattermost Team Edition v5.24.3 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-24-feature-release>`__ - `Download <https://releases.mattermost.com/5.24.3/mattermost-team-5.24.3-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.24.3/mattermost-team-5.24.3-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``c5328aca0e1f21b9d6dcb7ac9c58b96d56a107cbbbfe4cedbf38934b554bd82f``
  - GPG Signature: https://releases.mattermost.com/5.24.3/mattermost-team-5.24.3-linux-amd64.tar.gz.sig
Mattermost Team Edition v5.23.2 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-23-quality-release>`__ - `Download <https://releases.mattermost.com/5.23.2/mattermost-team-5.23.2-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.23.2/mattermost-team-5.23.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``253da42ac5cadcce29342dcc576fe2b232f2f2a012503996edaa377596bb5aa4``
  - GPG Signature: https://releases.mattermost.com/5.23.2/mattermost-team-5.23.2-linux-amd64.tar.gz.sig
Mattermost Team Edition v5.22.3 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-22-feature-release>`__ - `Download <https://releases.mattermost.com/5.22.3/mattermost-team-5.22.3-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.22.3/mattermost-team-5.22.3-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``05f956d2c2257b9bcbb9d8a4abdd8a41a63f040a790823f9612b5e7c7ad54fa7``
  - GPG Signature: https://releases.mattermost.com/5.22.3/mattermost-team-5.22.3-linux-amd64.tar.gz.sig
Mattermost Team Edition v5.21.0 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-21-quality-release>`__ - `Download <https://releases.mattermost.com/5.21.0/mattermost-team-5.21.0-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.21.0/mattermost-team-5.21.0-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``4d81e27dd107ba3c66ad06b3e029c2e1b940a0f56b46250d9ebccb4edf3e50eb``
  - GPG Signature: https://releases.mattermost.com/5.21.0/mattermost-team-5.21.0-linux-amd64.tar.gz.sig
Mattermost Team Edition v5.20.2 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-20-feature-release>`__ - `Download <https://releases.mattermost.com/5.20.2/mattermost-team-5.20.2-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.20.2/mattermost-team-5.20.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``ea8122b2c8839bfba25f8b4c56b7a17c88c12064ead70a9a43aa8c3681af9ba2``
  - GPG Signature: https://releases.mattermost.com/5.20.2/mattermost-team-5.20.2-linux-amd64.tar.gz.sig
Mattermost Team Edition v5.19.3 *Extended Support Release (ESR)* - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-19-esr>`__ - `Download <https://releases.mattermost.com/5.19.3/mattermost-team-5.19.3-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.19.3/mattermost-team-5.19.3-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``ec3b85032baccc5794e83cc134ca0114594ef69babb003c0a7fe96e22c7bcbd2``
  - GPG Signature: https://releases.mattermost.com/5.19.3/mattermost-team-5.19.3-linux-amd64.tar.gz.sig
Mattermost Team Edition v5.18.2 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-18-feature-release>`__ - `Download <https://releases.mattermost.com/5.18.2/mattermost-team-5.18.2-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.18.2/mattermost-team-5.18.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``06db01d79b99f02b80d91e0e2af8907bc04b82d305fdf56d5b797062c023f10f``
  - GPG Signature: https://releases.mattermost.com/5.18.2/mattermost-team-5.18.2-linux-amd64.tar.gz.sig
Mattermost Team Edition v5.17.3 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-17-quality-release>`__ - `Download <https://releases.mattermost.com/5.17.3/mattermost-team-5.17.3-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.17.3/mattermost-team-5.17.3-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``8189929e301017f384b89d40b3ef90b0355eddf59ed1c4a46fdf591f23c3e870``
  - GPG Signature: https://releases.mattermost.com/5.17.3/mattermost-team-5.17.3-linux-amd64.tar.gz.sig
Mattermost Team Edition v5.16.5 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-16-feature-release>`__ - `Download <https://releases.mattermost.com/5.16.5/mattermost-team-5.16.5-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.16.5/mattermost-team-5.16.5-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``442f1faf85037cac187022f8acb362ba84b871f23185ad400fcee7dc07c71672``
  - GPG Signature: https://releases.mattermost.com/5.16.5/mattermost-team-5.16.5-linux-amd64.tar.gz.sig
Mattermost Team Edition v5.15.5 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-15-quality-release>`__ - `Download <https://releases.mattermost.com/5.15.5/mattermost-team-5.15.5-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.15.5/mattermost-team-5.15.5-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``820dba42b593c000e3288b50ab929ab0107d31410e6b4d032d2c272b8a206b32``
  - GPG Signature: https://releases.mattermost.com/5.15.5/mattermost-team-5.15.5-linux-amd64.tar.gz.sig
Mattermost Team Edition v5.14.5 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-14-feature-release>`__ - `Download <https://releases.mattermost.com/5.14.5/mattermost-team-5.14.5-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.14.5/mattermost-team-5.14.5-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``65401dacc38785b8735f8517849ca30a1972713c82eac3862ac1ac917e493d33``
  - GPG Signature: https://releases.mattermost.com/5.14.5/mattermost-team-5.14.5-linux-amd64.tar.gz.sig
Mattermost Team Edition v5.13.3 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-13-quality-release>`__ - `Download <https://releases.mattermost.com/5.13.3/mattermost-team-5.13.3-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.13.3/mattermost-team-5.13.3-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``bfbcc5b0f56c97104f8e17bf7068225258fdd50ce2171cc16c4fd69cf4fc3e69``
  - GPG Signature: https://releases.mattermost.com/5.13.3/mattermost-team-5.13.3-linux-amd64.tar.gz.sig
Mattermost Team Edition v5.12.6 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-12-feature-release>`__ - `Download <https://releases.mattermost.com/5.12.6/mattermost-team-5.12.6-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.12.6/mattermost-team-5.12.6-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``080fc3644165c313d9ddc7ad83f8c5391fe83df30c7ce58cfbcbe3605351c4af``
  - GPG Signature: https://releases.mattermost.com/5.12.6/mattermost-team-5.12.6-linux-amd64.tar.gz.sig
Mattermost Team Edition v5.11.1 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-11-quality-release>`__ - `Download <https://releases.mattermost.com/5.11.1/mattermost-team-5.11.1-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.11.1/mattermost-team-5.11.1-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``ae0435ec68d739ac68714b49325d2cd1b7c58524726871cc2cea191c7b3e4085``
  - GPG Signature: https://releases.mattermost.com/5.11.1/mattermost-team-5.11.1-linux-amd64.tar.gz.sig
Mattermost Team Edition v5.10.2 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-10-feature-release>`__ - `Download <https://releases.mattermost.com/5.10.2/mattermost-team-5.10.2-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.10.2/mattermost-team-5.10.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``8359e0fadb923bdc904c72a7defd9a1f819a7fdc888e62da5c593e30bfb4314d``
  - GPG Signature: https://releases.mattermost.com/5.10.2/mattermost-team-5.10.2-linux-amd64.tar.gz.sig
Mattermost Team Edition v5.9.8 *Extended Support Release (ESR)* - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-9-esr>`__ - `Download <https://releases.mattermost.com/5.9.8/mattermost-team-5.9.8-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.9.8/mattermost-team-5.9.8-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``74052a54c6b70a223ad2378484ebda7f7f80f855674987dcc2c510b142aa8432``
  - GPG Signature: https://releases.mattermost.com/5.9.8/mattermost-team-5.9.8-linux-amd64.tar.gz.sig
Mattermost Team Edition v5.8.2 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-8-feature-release>`__ - `Download <https://releases.mattermost.com/5.8.2/mattermost-team-5.8.2-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.8.2/mattermost-team-5.8.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``be9499f24d4b7a38e2f390583a26071626fe8242d8e34fb382228c23012621c7``
  - GPG Signature: https://releases.mattermost.com/5.8.2/mattermost-team-5.8.2-linux-amd64.tar.gz.sig
Mattermost Team Edition v5.7.3 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-7-quality-release>`__ - `Download <https://releases.mattermost.com/5.7.3/mattermost-team-5.7.3-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.7.3/mattermost-team-5.7.3-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``95e81c3764338df2eefec48a395dd6972877447309570b8843220b952a33fde2``
  - GPG Signature: https://releases.mattermost.com/5.7.3/mattermost-team-5.7.3-linux-amd64.tar.gz.sig
Mattermost Team Edition v5.6.5 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-6-feature-release>`__ - `Download <https://releases.mattermost.com/5.6.5/mattermost-team-5.6.5-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.6.5/mattermost-team-5.6.5-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``9bd863f5f52d87ff792b98e67597f193d34969e682f562a40b1542a8f301f008``
  - GPG Signature: https://releases.mattermost.com/5.6.5/mattermost-team-5.6.5-linux-amd64.tar.gz.sig
Mattermost Team Edition v5.5.3 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-5-quality-release>`__ - `Download <https://releases.mattermost.com/5.5.3/mattermost-team-5.5.3-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.5.3/mattermost-team-5.5.3-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``a47f941509d3b4191e60de487fd27eccc034a7196818ecba5022f09c7718fe09``
  - GPG Signature: https://releases.mattermost.com/5.5.3/mattermost-team-5.5.3-linux-amd64.tar.gz.sig
Mattermost Team Edition v5.4.0 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-4-feature-release>`__ - `Download <https://releases.mattermost.com/5.4.0/mattermost-team-5.4.0-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.4.0/mattermost-team-5.4.0-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``6b6f3ea9e0faf3895d71f38cf90737468a8db07b12370762be6cf60c6983355a``
  - GPG Signature: https://releases.mattermost.com/5.4.0/mattermost-team-5.4.0-linux-amd64.tar.gz.sig
Mattermost Team Edition v5.3.1 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-3-feature-release>`__ - `Download <https://releases.mattermost.com/5.3.1/mattermost-team-5.3.1-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.3.1/mattermost-team-5.3.1-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``047a78b45293479f69f1cb99169a1c01ee0f90ffaf9dbe145147638fb410526a``
  - GPG Signature: https://releases.mattermost.com/5.3.1/mattermost-team-5.3.1-linux-amd64.tar.gz.sig
Mattermost Team Edition v5.2.2 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-2-feature-release>`__ - `Download <https://releases.mattermost.com/5.2.2/mattermost-team-5.2.2-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.2.2/mattermost-team-5.2.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``d51adb0f8611bb90641e6169f1a81ed9a43765c1b5d885c3dc98038355cd4429``
  - GPG Signature: https://releases.mattermost.com/5.2.2/mattermost-team-5.2.2-linux-amd64.tar.gz.sig
Mattermost Team Edition v5.1.2 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-1-feature-release>`__ - `Download <https://releases.mattermost.com/5.1.2/mattermost-team-5.1.2-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.1.2/mattermost-team-5.1.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``2fa5c087b74a41017fc6f38fa1d8d2dbb59adb2b4a70efc38b624c564a572f22``
  - GPG Signature: https://releases.mattermost.com/5.1.2/mattermost-team-5.1.2-linux-amd64.tar.gz.sig
Mattermost Team Edition v5.0.3 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v5-0-feature-release>`__ - `Download <https://releases.mattermost.com/5.0.3/mattermost-team-5.0.3-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/5.0.3/mattermost-team-5.0.3-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``b3711ebd0e0240876ba751b18bd7a7349ffbf3f8a02d63ff79303aba98ca02c9``
  - GPG Signature: https://releases.mattermost.com/5.0.3/mattermost-team-5.0.3-linux-amd64.tar.gz.sig
Mattermost Team Edition v4.10.10 *Extended Support Release (ESR)* - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v4-10>`__ - `Download <https://releases.mattermost.com/4.10.10/mattermost-team-4.10.10-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/4.10.10/mattermost-team-4.10.10-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``c8a8569e3a65246ab4babc01ce61c52b0ac0b6bd4984ef9896d20ce0ade233c2``
  - GPG Signature: https://releases.mattermost.com/4.10.10/mattermost-team-4.10.10-linux-amd64.tar.gz.sig
Mattermost Team Edition v4.9.4 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v4-9>`__ - `Download <https://releases.mattermost.com/4.9.4/mattermost-team-4.9.4-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/4.9.4/mattermost-team-4.9.4-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``7b8ed13dc08349bcd7e0886464e7c242f5905bb6685fb28e434a2bd3e3423cfc``
Mattermost Team Edition v4.8.2 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v4-8>`__ - `Download <https://releases.mattermost.com/4.8.2/mattermost-team-4.8.2-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/4.8.2/mattermost-team-4.8.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``192d5b9ce2b1aeb3fc1c8a09ca53e7883b0977d7a37d63ea2f116a13ca5efaf8``
Mattermost Team Edition v4.7.4 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v4-7>`__ - `Download <https://releases.mattermost.com/4.7.4/mattermost-team-4.7.4-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/4.7.4/mattermost-team-4.7.4-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``caac6f6a612fc50b230e0f77b3ba58c34e7bca86c2c6479e7732dece03cd69dc``
Mattermost Team Edition v4.6.3 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v4-6>`__ - `Download <https://releases.mattermost.com/4.6.3/mattermost-team-4.6.3-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/4.6.3/mattermost-team-4.6.3-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``2583ece515ecd6f9f45f874aa009c8fa8970a273d5d2e3006ee47aad0bac0a3d``
Mattermost Team Edition v4.5.2 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v4-5>`__ - `Download <https://releases.mattermost.com/4.5.2/mattermost-team-4.5.2-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/4.5.2/mattermost-team-4.5.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``756f30c7690c1c3d81470d73f18d87ff99869d130ca2528cb2a97a660ec9b73e``
Mattermost Team Edition v4.4.5 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v4-4-5>`__ - `Download <https://releases.mattermost.com/4.4.5/mattermost-team-4.4.5-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/4.4.5/mattermost-team-4.4.5-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``c261384b2bd8e0472e22307368818eb84b0171e15bdacf7e926187aa846861d7``
Mattermost Team Edition v4.3.4 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v4-3-4>`__ - `Download <https://releases.mattermost.com/4.3.4/mattermost-team-4.3.4-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/4.3.4/mattermost-team-4.3.4-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``fbc2504cfe417b45ed957c2f45be654849c87fc0d46c14067b8febdbc626f4cc``
Mattermost Team Edition v4.2.2 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v4-2-2>`__ - `Download <https://releases.mattermost.com/4.2.2/mattermost-team-4.2.2-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/4.2.2/mattermost-team-4.2.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``4353f7d77bf5a0bcc1bbce00f2ca60fd14f5fd8caa8b57f4c518dc3ef657c4d6``
Mattermost Team Edition v4.1.2 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v4-1-2>`__ - `Download <https://releases.mattermost.com/4.1.2/mattermost-team-4.1.2-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/4.1.2/mattermost-team-4.1.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``1b43c5d1938d17f3ce5d9f90c958a8353639422df48488f002377a30a6d84ae1``
Mattermost Team Edition v4.0.5 - `View Changelog <./changelog.html#release-v4-0-5>`__ - `Download <https://releases.mattermost.com/4.0.5/mattermost-team-4.0.5-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/4.0.5/mattermost-team-4.0.5-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``a7897c6027eb972c0e5d8039862308f1073f1a078e0aa28b3d67f7a5e519dc04``
Mattermost Team Edition v3.10.3 - `View Changelog <./changelog.html#release-v3-10-3>`__ - `Download <https://releases.mattermost.com/3.10.3/mattermost-team-3.10.3-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/3.10.3/mattermost-team-3.10.3-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``cdc8c706ccc169c143be87167077171bfcf4bec8d85cc42e2e78c45d483bf0a1``
Mattermost Team Edition v3.9.2 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v3-9-2>`__ - `Download <https://releases.mattermost.com/3.9.2/mattermost-team-3.9.2-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/3.9.2/mattermost-team-3.9.2-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``f7f878c7d195e1f336b7025fbb4063c1796fa16296ac2d7437d2a5067750966e``
Mattermost Team Edition v3.8.3 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v3-8-3>`__ - `Download <https://releases.mattermost.com/3.8.3/mattermost-team-3.8.3-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/3.8.3/mattermost-team-3.8.3-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``1a5de4052c007c54fce6cd844ab3e89aabc8d1a05b8bac72ef58f6896760c4e1``
Mattermost Team Edition v3.7.5 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v3-7-5>`__ - `Download <https://releases.mattermost.com/3.7.5/mattermost-team-3.7.5-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/3.7.5/mattermost-team-3.7.5-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``eaee6a57ab9e2924f71853cbebf465d63f7dbf1112716c0e4768984de39f83a2``
Mattermost Team Edition v3.6.7 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v3-6-7>`__ - `Download <https://releases.mattermost.com/3.6.7/mattermost-team-3.6.7-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/3.6.7/mattermost-team-3.6.7-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``8378f15a6bd070386077798f36d8e521b63844bc838f6553915c6fd4fba3b01d``
Mattermost Team Edition v3.5.1 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v3-5-1>`__ - `Download <https://releases.mattermost.com/3.5.1/mattermost-team-3.5.1-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/3.5.1/mattermost-team-3.5.1-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``2c6bc8b1c25e48d1ac887cd6cbef77df1f80542127b4d98c4d7c0dfbfade04d5``
Mattermost Team Edition v3.4.0 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v3-4-0>`__ - `Download <https://releases.mattermost.com/3.4.0/mattermost-team-3.4.0-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/3.4.0/mattermost-team-3.4.0-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``c352f6c15466c35787bdb5207a6efe6b471513ccdd5b1f64a91a8bd09c3365da``
Mattermost Team Edition v3.3.0 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v3-3-0>`__ - `Download <https://releases.mattermost.com/3.3.0/mattermost-team-3.3.0-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/3.3.0/mattermost-team-3.3.0-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``09948edb32ebb940708e30a05c269e69568dfd2e0c05495392f353b26139b79a``
Mattermost Team Edition v3.2.0 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v3-2-0>`__ - `Download <https://releases.mattermost.com/3.2.0/mattermost-team-3.2.0-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/3.2.0/mattermost-team-3.2.0-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``14e5c1460a991791ef3dccd6b5aeab40ce903090c5f6c15e7974eb5e4571417a``
Mattermost Team Edition v3.1.0 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v3-1-0>`__ - `Download <https://releases.mattermost.com/3.1.0/mattermost-team-3.1.0-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/3.1.0/mattermost-team-3.1.0-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``dad164d2382428c36623b6d50e3290336a3be01bae278a465e0d8d94b701e3ff``
Mattermost Team Edition v3.0.3 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v3-0-3>`__ - `Download <https://releases.mattermost.com/3.0.3/mattermost-team-3.0.3-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/3.0.3/mattermost-team-3.0.3-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``b60d26a13927b614e3245384559869ae31250c19790b1218a193d52599c09834``
Mattermost Team Edition v2.2.0 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v2-2-0>`__ - `Download <https://releases.mattermost.com/2.2.0/mattermost-team-2.2.0-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/2.2.0/mattermost-team-2.2.0-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``d723fe9bf18d2d2a419a8d2aa6ad94fc99f251f8382c4342f08a48813501ca06``
Mattermost Team Edition v2.1.0 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v2-1-0>`__ - `Download <https://releases.mattermost.com/2.1.0/mattermost-team-2.1.0-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/2.1.0/mattermost-team-2.1.0-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``2825434aad23db1181e03b036bd826e66d6d4f21d337d209679a095a3ed9a4d2``
Mattermost Team Edition v2.0.0 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v2-0-0>`__ - `Download <https://releases.mattermost.com/2.0.0/mattermost-team-2.0.0-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/2.0.0/mattermost-team-2.0.0-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``005687c6a8128e1e40d01933f09d7da1a1b70b149a6bef96d923166bc1e7ce8f``
Mattermost Team Edition v1.4.0 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v1-4-0>`__ - `Download <https://releases.mattermost.com/1.4.0/mattermost-team-1.4.0-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/1.4.0/mattermost-team-1.4.0-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``0874dad79415066466c22ac584e599897124106417e774818cf40864d202dbb0``
Mattermost Team Edition v1.3.0 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v1-3-0>`__ - `Download <https://releases.mattermost.com/1.3.0/mattermost-team-1.3.0-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/1.3.0/mattermost-team-1.3.0-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``57af87ae8a98743b5379ed70f93a923654f7b8547f89b7f99ef9a718f472364d``
Mattermost Team Edition v1.2.1 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v1-2-1>`__ - `Download <https://releases.mattermost.com/1.2.1/mattermost-team-1.2.1-linux-amd64.tar.gz?src=arc>`__
  - ``https://releases.mattermost.com/1.2.1/mattermost-team-1.2.1-linux-amd64.tar.gz``
  - SHA-256 Checksum: ``f4cc5b0e1026026ff0cea4cc915b92967f9dfdf497c249731dc804a9a2ff156d``
Mattermost Team Edition v1.1.1 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v1-1-1>`__ - `Download <https://releases.mattermost.com/1.1.1/mattermost-team-1.1.1-linux-amd64.tar.gz?src=arc>`__
   - ``https://releases.mattermost.com/1.1.1/mattermost-team-1.1.1-linux-amd64.tar.gz``
   - SHA-256 Checksum: ``e6687b9d7f94538e1f4a9f93a0bcb8a66e293e2260433ed648964baa53c3e561``
Mattermost Team Edition v1.0.0 - `View Changelog <https://docs.mattermost.com/administration/changelog.html##release-v1-0-0>`__ - `Download <https://releases.mattermost.com/1.0.0/mattermost-team-1.0.0-linux-amd64.tar.gz?src=arc>`__
   - ``https://releases.mattermost.com/1.0.0/mattermost-team-1.0.0-linux-amd64.tar.gz``
   - SHA-256 Checksum: ``208b429cc29119b3d3c686b8973d6100eb02845b1da2f18744195f055521cbc8``
Mattermost Team Edition v0.7.0 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v0-7-0-beta>`__ - `Download <https://releases.mattermost.com/0.7.0/mattermost-team-0.7.0-linux-amd64.tar.gz?src=arc>`__
   - ``https://releases.mattermost.com/0.7.0/mattermost-team-0.7.0-linux-amd64.tar.gz``
   - SHA-256 Checksum: ``f0a0e5b5fab3aeb5dc638ab3059b3ea5bf7bc1ec5123db1199aa10db41bfffb1``
Mattermost Team Edition v0.6.0 - `View Changelog <https://docs.mattermost.com/administration/changelog.html#release-v0-6-0-alpha>`__ - `Download <https://releases.mattermost.com/0.6.0/mattermost-team-0.6.0-linux-amd64.tar.gz?src=arc>`__
   - ``https://releases.mattermost.com/0.6.0/mattermost-team-0.6.0-linux-amd64.tar.gz``
   - SHA-256 Checksum: ``9eb364f7f963af32d4a9efe3bbb5abb2a21ca5d1a213b50ca461dab047a123b6``

source/upgrade/upgrading-to-v60.rst METASEP
:nosearch:

Notes on Upgrading to Mattermost v6.0 or later
----------------------------------------------

Upgrading Mattermost desktop and mobile apps to the latest version is not mandatory when `upgrading to Mattermost Server v6.0 <https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html>`__. Earlier 4.x versions of Mattermost desktop app, and earlier v1.x versions of the mobile app, will continue to be supported with a Mattermost v6.0 Server.

source/upgrade/upgrading-mattermost-server.rst METASEP
Upgrade Mattermost Server
=========================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

In most cases, you can upgrade Mattermost Server in a few minutes. However, the upgrade can take longer depending on several factors, including the size and complexity of your installation, and the version that you're upgrading from.

.. _before-you-begin:

Before you begin
----------------

**Read these instructions carefully from start to finish.** 

Make sure that you understand how to `prepare for your upgrade <https://docs.mattermost.com/upgrade/prepare-to-upgrade-mattermost.html>`__, familiarize yourself with all `software and hardware requirements <https://docs.mattermost.com/install/software-hardware-requirements.html>`__, and that you understand each step of the upgrade process documented below before starting a Mattermost upgrade. If you have questions or concerns, you can ask on the Mattermost forum at https://forum.mattermost.com/.

**Gather the following information before starting the upgrade:**

- **Existing install directory - {install-path}**: If you don't know where Mattermost Server is installed, use the ``whereis mattermost`` command to find standard binary places and $PATH (which won't return anything if ``/opt/mattermost/bin`` wasn't added to the PATH), or use the ``find / -executable -type f -iname mattermost 2> /dev/null`` command to find the ``mattermost`` binary. The output should be similar to ``/opt/mattermost/bin/mattermost``. The install directory is everything before the first occurrence of the string ``/mattermost``. In this example, the ``{install-path}`` is ``/opt``. If that command doesn't produce any results, it's likely because your version is older; try ``whereis platform`` instead.
- **Location of your local storage directory**: The local storage directory contains all the files that users have attached to their messages. If you don't know its location, open the System Console and go to **Environment > File Storage**, then read the value in **Local Storage Directory**. Paths are relative to the ``mattermost`` directory. For example, if the local storage directory is ``./data/`` then the absolute path is ``{install-path}/mattermost/data``.

Upgrade Mattermost Server
--------------------------

1. In a terminal window on the server that hosts Mattermost, change to your home directory. Delete any files and directories that might still exist from a previous download.

   .. code-block:: sh

     cd /tmp

2. Download `the latest version of Mattermost Server <https://mattermost.com/deploy/>`__. In the following command, replace ``X.X.X`` with the version that you want to download:

   .. code-block:: sh

     wget https://releases.mattermost.com/X.X.X/mattermost-X.X.X-linux-amd64.tar.gz

3. Confirm no other Mattermost zip folders exist in your ``/tmp`` directory. If another version's zip file does exist, delete or rename the file.

   .. code-block:: sh
     
     ls -- mattermost*.gz
  
   If anything except the new release is returned above, rename this file or delete it completely.

4. Extract the Mattermost Server files.

   .. code-block:: sh
     
     tar -xf mattermost*.gz --transform='s,^[^/]\+,\0-upgrade,'
  
   The ``transform`` option adds a suffix to the topmost extracted directory so it does not conflict with the usual install directory.

5. Stop your Mattermost server.

   .. code-block:: sh

     sudo systemctl stop mattermost

6. Back up your data and application. Make sure you've properly backed up your database before continuing with the upgrade. In case of an unexpected failure, you should be in a position to load a previous database snapshot.

   a. Back up your database using your organization’s standard procedures for backing up MySQL or PostgreSQL.

   b. Back up your application by copying into an archive folder (e.g. ``mattermost-back-YYYY-MM-DD-HH-mm``).

      .. code-block:: sh

        cd {install-path}
        sudo cp -ra mattermost/ mattermost-back-$(date +'%F-%H-%M')/

7. Remove all files **except** data and custom directories from within the current ``mattermost`` directory. 

   .. code-block:: sh

     sudo find mattermost/ mattermost/client/ -mindepth 1 -maxdepth 1 \! \( -type d \( -path mattermost/client -o -path mattermost/client/plugins -o -path mattermost/config -o -path mattermost/logs -o -path mattermost/plugins -o -path mattermost/data \) -prune \) | sort | sudo xargs rm -r

   **What's preserved on upgrade?**
  
   By default, the following subdirectories will be preserved:``config``, ``logs``, ``plugins``, ``client/plugins``, and ``data`` (unless you have a different directory configured for local storage). Custom directories are any directories that you've added to Mattermost and are not preserved by default. Generally, these are TLS keys or other custom information.

   Run ``ls`` on your Mattermost install directory to identify what default folders exist.
      
   **A default Mattermost installation has the following files and directories:**

   .. code-block:: sh

     $ ls /opt/mattermost
     ENTERPRISE-EDITION-LICENSE.txt README.md  client  data   i18n  manifest.txt  prepackaged_plugins
     NOTICE.txt                      bin        config  fonts  logs  plugins       templates

   **Clear the Mattermost folder**

   Dry-run the following command to delete the contents of the ``mattermost`` folder, preserving only the specified directories and their contents: 
  
   .. code-block:: sh
    
     sudo find mattermost/ mattermost/client/ -mindepth 1 -maxdepth 1 \! \( -type d \( -path mattermost/client -o -path mattermost/client/plugins -o -path mattermost/config -o -path mattermost/logs -o -path mattermost/plugins -o -path mattermost/data \) -prune \) | sort
    
   If you store TLSCert/TLSKey files or other information within your ``/opt/mattermost`` folder, you need to append ``-o -path mattermost/yourFolderHere`` to the command above to avoid having to manually copy the TLSCert/TLSKey files from the backup into the new install.
 
  .. code-block:: sh
 
    sudo find mattermost/ mattermost/client/ -mindepth 1 -maxdepth 1 \! \( -type d \( -path mattermost/client -o -path mattermost/client/plugins -o -path mattermost/config -o -path mattermost/logs -o -path mattermost/plugins -o -path mattermost/data -o -path  mattermost/yourFolderHere \) -prune \) | sort
    
  When you're ready to execute the command, append ``xargs rm -r`` to the command above to delete the files. Note that the following example includes ``-o -path mattermost/yourFolderHere``:
  
  .. code-block:: sh
  
    sudo find mattermost/ mattermost/client/ -mindepth 1 -maxdepth 1 \! \( -type d \( -path mattermost/client -o -path mattermost/client/plugins -o -path mattermost/config -o -path mattermost/logs -o -path mattermost/plugins -o -path mattermost/data -o -path  mattermost/yourFolderHere \) -prune \) | sort | sudo xargs rm -r
  
  **Using Bleve Search**

  If using `Bleve Search <https://docs.mattermost.com/deploy/bleve-search.html>`__, and the directory exists *within* the ``mattermost`` directory, the index directory path won't be preserved using the command above. 
  
  - You can either move the bleve index directory out from the ``mattermost`` directory before upgrading or, following an upgrade, you can copy the contents of the bleve index directory from the ``backup`` directory. 
  - You can then store that directory or re-index as preferred. 
  - The bleve indexes can be migrated without reindexing between Mattermost versions. See our `Configuration Settings <https://docs.mattermost.com/configure/configuration-settings.html#bleve-settings-experimental>`__ documentation for details on configuring the bleve index directory.

8. Copy the new files to your install directory.

  .. code-block:: sh

   sudo cp -an /tmp/mattermost-upgrade/. mattermost/

  .. note::
    
    The ``n`` (no-clobber) flag and trailing ``.`` on source are very important. The ``n`` (no-clobber) flag preserves existing configurations and logs in your installation path. The trailing ``.`` on source ensures all installation files are copied.


9. Change ownership of the new files after copying them. For example:

  .. code-block:: sh
         
    sudo chown -R mattermost:mattermost mattermost
     
.. note::
    
  - If you didn't use ``mattermost`` as the owner and group of the install directory, run ``sudo chown -hR {owner}:{group} {install-path}/mattermost``.
  - If you're uncertain what owner or group was defined, use the ``ls -l {install-path}/mattermost/bin/mattermost`` command to obtain them.
  
10. If you want to use port 80 or 443 to serve your server, and/or if you have TLS set up on your Mattermost server, you **must** activate the ``CAP_NET_BIND_SERVICE`` capability to allow the new Mattermost binary to bind to ports lower than 1024. For example:

  .. code-block:: sh

    sudo setcap cap_net_bind_service=+ep ./mattermost/bin/mattermost

11. Start your Mattermost server.

  .. code-block:: sh

    sudo systemctl start mattermost

12. Remove the temporary files.

  .. code-block:: sh

    sudo rm -r /tmp/mattermost-upgrade/
    sudo rm -i /tmp/mattermost*.gz

13. If you're using a `High Availability <https://docs.mattermost.com/scale/high-availability-cluster.html>`__ deployment, you need to apply the steps above on every node in your cluster. Once complete, the **Config File MD5** columns in the High Availability section of the System Console should be green. If they're yellow, please ensure that all nodes have the same server version and the same configuration.

    If they continue to display as yellow, trigger a configuration propagation across the cluster by opening the System Console, changing a setting, and reverting it. This will enable the **Save** button for that page. Then, select **Save**. This will not change any configuration, but sends the existing configuration to all nodes in the cluster. 

After the server is upgraded, users might need to refresh their browsers to experience any new features.

Upgrade Team Edition to Enterprise Edition
--------------------------------------------

To upgrade from the Team Edition to the Enterprise Edition, follow the normal upgrade instructions provided above, making sure that you download the Enterprise Edition of Mattermost Server in Step 2.

Upload a license key
---------------------

When Enterprise Edition is running, open **System Console > About > Editions and License** and upload your license key.

source/upgrade/upgrade_mattermost.sh METASEP
#!/usr/bin/env bash

# Immediately exit if a command run from a loop, a pipeline or a compound
# command statement fails or a variable is used unset.
set -o errexit nounset


################################################################################
# Configuration - please adapt it to your environment
################################################################################

# Mattermost path
mattermostdir="/opt/mattermost"

# Backup path
backupdir="/opt"

# Temporary path for download
downloaddir="/tmp"

# Specify the edition you use
#edition="Team"
edition="Enterprise"

# Start with plugins? Set 1 for starting with plugins active
plugins=0

# Set 1 for overriding the database backup question
backupdatabase=0

################################################################################

# Check dependencies
if ((EUID != 0)); then
	echo "[-] This script needs to be run as root to work properly. Aborted."
	exit 1
fi

if ! type "systemctl" >/dev/null 2>&1 && ! type "service" >/dev/null 2>&1; then
	echo "[-] The daemon manager (systemd or sysvinit) is not accessible. Aborted."
	exit 1
fi

if ! type "wget" >/dev/null 2>&1 && ! type "curl" >/dev/null 2>&1; then
	echo "[-] A download tool like wget or curl is not accessible. Aborted."
	exit 1
fi

# Check requirements
if [[ "${edition}" != "Team" ]] && [[ "${edition}" != "Enterprise" ]]; then
	echo "[-] The edition must either be \"Team\" or \"Enterprise\". Aborted."
	exit 1
fi

# Check config variables
test -d ${backup}
test -d ${downloaddir}
test -d ${mattermostdir}

# Ask for database backup
if [ "${backupdatabase}" -eq 0 ]; then
	read -r -p "[?] Do you have a current backup of the Mattermost database? [Y/n]" input

	case "$input" in
		[yY])
			echo "[+] Starting the update process of Mattermost..."
			;;
		*)
			echo "[-] Please create a backup and start again"
			exit 1
			;;
	esac
fi

# Check if Mattermost exists in the path provided above
if [ ! -f "${mattermostdir}/bin/mattermost" ];  then
	echo "Mattermost not found please check the path for the Mattermost directory"
	exit 1
fi

# Get version from argument
if [ -z "${1}" ]; then
	echo "Please specify the version of Mattermost to download"
	exit 1
fi
version="${1}"

if [[ "${edition}" == "Team" ]]; then
	url="https://releases.mattermost.com/${version}/mattermost-team-${version}-linux-amd64.tar.gz"
else
	url="https://releases.mattermost.com/${version}/mattermost-${version}-linux-amd64.tar.gz"
fi

# Main

# Get the file
function get_the_file() {
	echo "[+] Downloading Mattermost ${edition} \"${version}\"..."
	if type "curl" >/dev/null 2>&1; then
		if ! curl -LC - "${url}" -o "${downloaddir}/mattermost-upgrade.tar.gz"; then
			echo "[-] An issue occurred when downloading the Mattermost update package."
			exit 1
		fi
	else
		if ! wget "${url}" -o "${downloaddir}/mattermost-upgrade.tar.gz"; then
			echo "[-] An issue occurred when downloading the Mattermost update package."
			exit 1
		fi
	fi

	echo "[+] The Mattermost update package has been downloaded with successful"
}

# Check previous download
if [ -e "${downloaddir}/mattermost-upgrade.tar.gz" ]; then
	read -r -p "[?] A previous download exists. Do you want to replace it by a new one? [Y/n]" input

	case "$input" in
		[yY])
			echo "[+] Remove previous download."
			rm -rf "${downloaddir}/mattermost-upgrade.tar.gz"
			get_the_file
			;;
	esac
else
	get_the_file
fi

echo "[+] Extracting Mattermost update package..."
mkdir -p "${downloaddir}/mattermost-upgrade"
tar -xf "${downloaddir}/mattermost-upgrade.tar.gz" -C "${downloaddir}/mattermost-upgrade/"

echo "[+] Stopping Mattermost service..."
if type systemctl >/dev/null 2>&1;  then
	systemctl stop mattermost
else
	service mattermost stop
fi

if pgrep mattermost > /dev/null; then
	echo "[-] Mattermost is still running. Update not possible. Aborting..."
	rm -rf "${downloaddir}/mattermost-upgrade"
	rm -f "${downloaddir}/mattermost-upgrade.tar.gz"
	exit 1
fi

echo "[+] Creating backup of Mattermost..."
cp -ra "${mattermostdir}" "${backupdir}/mattermost-backup-$(date +'%F-%H-%M')/"

echo "[+] Preparing update..."
USER="$(stat -c '%U' ${mattermostdir}/bin/mattermost)"
GROUP="$(stat -c '%G' ${mattermostdir}/bin/mattermost)"
chown -hR "$USER":"$GROUP" "${downloaddir}/mattermost-upgrade/"


# Clean up Mattermost directory
find "${mattermostdir}" -mindepth 1 -maxdepth 1 -not \( -path "${mattermostdir}/config" -o -path "${mattermostdir}/logs" -o -path "${mattermostdir}/plugins" -o -path "${mattermostdir}/data" -o -path "${mattermostdir}/client" \) -exec rm -rf {} \;
find "${mattermostdir}/client" -mindepth 1 -maxdepth 1 -not \( -path "${mattermostdir}/client/plugins" \) -exec rm -rf {} \;


# Rename plugin directory
if [ "${plugins}" -eq 0 ];  then
	echo "[+] Renaming plugin folders..."
	if [ -d "${mattermostdir}/plugins/" ]; then
		mv "${mattermostdir}/plugins/" "${mattermostdir}/plugins~"
	fi
	if [ -d "${mattermostdir}/client/plugins/" ]; then
		mv "${mattermostdir}/client/plugins/" "${mattermostdir}/client/plugins~"
	fi
fi

echo "[+] Updating Mattermost..."
cp -an "${downloaddir}/mattermost-upgrade/mattermost/"* "${mattermostdir}"


echo "[+] Cleaning Mattermost temporary files..."
rm -rf "${downloaddir}/mattermost-upgrade/"
rm -f "${downloaddir}/mattermost-upgrade.gz"

echo "[+] Allowing Mattermost to run on port 0-1023..."
setcap cap_net_bind_service=+ep "${mattermostdir}/bin/mattermost"

echo "[+] Starting Mattermost service..."
if type systemctl >/dev/null 2>&1;  then
	systemctl start mattermost
else
	service mattermost start
fi

echo "[+] Mattermost updated with successful"

if [ "${plugins}" -eq 0 ];  then
	echo "*************************************************"
	echo "Dont forget to reactivate your plugins"
	echo "mv \"${mattermostdir}/plugins~\" \"${mattermostdir}/plugins\""
	echo "mv \"${mattermostdir}/client/plugins\" \"${mattermostdir}/client/plugins~\""
	echo "*************************************************"
fi

source/upgrade/release-lifecycle.rst METASEP
Release Lifecycle
==================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

What is a Release Lifecycle?
-----------------------------

During each monthly release, Mattermost backports high severity or high impact security fixes to the previous three monthly releases. `Extended Support Releases <https://docs.mattermost.com/upgrade/extended-support-release.html>`_ receive backports for security fixes and major bug fixes for the length of their life cycle.  Once a release life cycle has ended, it will no longer receive the security or major bug backports. We follow the same release cycle pattern for all upcoming releases.

.. important::

  Support for Mattermost Server v6.3 `Extended Support Release <https://docs.mattermost.com/upgrade/extended-support-release.html>`_ is coming to the end of its life cycle on October 15, 2022. Upgrading to Mattermost Server v7.1 or later is recommended.

+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| Version     | Release Type          | Lifecyle Start Date      | Lifecycle End Date       | Extended Support Release |
+=============+=======================+==========================+==========================+==========================+
| 7.3         | Feature               |  2022-09-16              | 2022-12-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 7.2         | Feature               |  2022-08-16              | 2022-11-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 7.1         | Feature               |  2022-07-15              | 2023-04-15               | Yes                      |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 7.0         | Major                 |  2022-06-15              | 2022-09-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 6.7         | Feature               |  2022-05-16              | 2022-08-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 6.6         | Feature               |  2022-04-16              | 2022-07-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 6.5         | Feature               |  2022-03-16              | 2022-06-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 6.4         | Feature               |  2022-02-16              | 2022-05-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 6.3         | Feature               |  2022-01-16              | 2022-10-15               | Yes                      |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 6.2         | Feature               |  2021-12-16              | 2022-03-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 6.1         | Feature               |  2021-11-16              | 2022-02-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 6.0         | Feature               |  2021-10-13              | 2022-01-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 5.39        | Quality               |  2021-09-16              | 2021-12-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 5.38        | Feature               |  2021-08-16              | 2021-11-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 5.37        | Feature               |  2021-07-16              | 2022-04-15               | Yes                      |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 5.36        | Feature               |  2021-06-16              | 2021-09-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 5.35        | Feature               |  2021-05-16              | 2021-08-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 5.34        | Feature               |  2021-04-16              | 2021-07-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 5.33        | Feature               |  2021-03-16              | 2021-06-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 5.32        | Feature               |  2021-02-16              | 2021-05-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 5.31        | Feature               |  2021-01-16              | 2021-10-15               | Yes                      |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 5.30        | Feature               |  2020-12-16              | 2021-03-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 5.29        | Quality               |  2020-11-16              | 2021-02-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 5.28        | Feature               |  2020-10-16              | 2021-01-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 5.27        | Quality               |  2020-09-16              | 2020-12-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 5.26        | Feature               |  2020-08-16              | 2020-11-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 5.25        | Quality               |  2020-07-16              | 2021-04-15               | Yes                      |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 5.24        | Feature               |  2020-06-16              | 2020-09-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 5.23        | Quality               |  2020-05-16              | 2020-08-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 5.22        | Feature               |  2020-04-16              | 2020-07-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 5.21        | Quality               |  2020-03-16              | 2020-06-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 5.20        | Feature               |  2020-02-16              | 2020-05-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 5.19        | Quality               |  2020-01-16              | 2020-10-15               | Yes                      |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 5.18        | Feature               |  2019-12-16              | 2020-03-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 5.17        | Quality               |  2019-11-16              | 2020-02-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 5.16        | Feature               |  2019-10-16              | 2020-01-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 5.15        | Quality               |  2019-09-16              | 2019-12-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 5.14        | Feature               |  2019-08-16              | 2019-11-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 5.13        | Quality               |  2019-07-16              | 2019-09-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 5.12        | Feature               |  2019-06-16              | 2019-08-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 5.11        | Quality               |  2019-05-16              | 2019-07-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 5.10        | Feature               |  2019-04-16              | 2019-06-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 5.9         | Quality               |  2019-03-16              | 2020-04-15               | Yes                      |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 5.8         | Feature               |  2019-02-16              | 2019-04-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 5.7         | Quality               |  2019-01-16              | 2019-03-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 5.6         | Feature               |  2018-12-16              | 2019-02-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 5.5         | Quality               |  2018-11-16              | 2019-01-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 5.4         | Feature               |  2018-10-16              | 2018-12-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 5.3         | Feature               |  2018-09-16              | 2018-11-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 5.2         | Feature               |  2018-08-16              | 2018-10-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 5.1         | Feature               |  2018-07-16              | 2018-09-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 5.0         | Feature               |  2018-06-16              | 2018-08-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 4.10        | Feature               |  2018-05-16              | 2019-07-15               | Yes                      |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 4.9         | Feature               |  2018-04-16              | 2018-06-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 4.8         | Feature               |  2018-03-16              | 2018-05-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 4.7         | Feature               |  2018-02-16              | 2018-04-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 4.6         | Feature               |  2018-01-16              | 2018-03-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 4.5         | Feature               |  2017-12-16              | 2018-02-15               |                          | 
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 4.4         | Feature               |  2017-11-16              | 2018-01-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 4.3         | Feature               |  2017-10-16              | 2017-12-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 4.2         | Feature               |  2017-09-16              | 2017-11-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 4.1         | Feature               |  2017-08-16              | 2017-10-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+
| 4.0         | Feature               |  2017-07-16              | 2017-09-15               |                          |
+-------------+-----------------------+--------------------------+--------------------------+--------------------------+

Desktop and mobile app compatibility
-------------------------------------

Mattermost desktop and mobile apps are backwards compatible; however, we strongly recommend updating to the latest version for an optimal user experience. The latest versions include the latest security fixes, and are compatible with the oldest supported `extended support release <https://docs.mattermost.com/upgrade/extended-support-release.html>`__ of Mattermost Server to ensure backwards compatibility.

Please review the `desktop app changelog <https://docs.mattermost.com/install/desktop-app-changelog.html>`__ and the `mobile app changelog <https://docs.mattermost.com/deploy/mobile-app-changelog.html>`__ notes for any self-hosted or Cloud-specific version requirements for features and functionalities, as well as notes on security fixes.

.. include:: upgrading-to-v60.rst
  :start-after: :nosearch:

source/upgrade/release-definitions.rst METASEP
Release definitions
===================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Mattermost ships with a new version on the 16th of each month in `binary form <https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html>`_.

Feature release
----------------

The feature releases have new features added.

Extended Support Release (ESR)
------------------------------

Extended Support Releases are releases that are maintained for a longer period of time. They will receive backports for security fixes and major bug fixes for the length of their life cycle. Read more about `Extended Support Releases here <https://docs.mattermost.com/upgrade/extended-support-release.html>`_.

Major release
-------------

Major releases are planned once a year for June. Major releases follow a theme and include multiple new features.

source/upgrade/prepare-to-upgrade-mattermost.rst METASEP
Prepare to upgrade Mattermost
=============================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

In most cases, you can `upgrade Mattermost Server <https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html>`__ in a few minutes. However, the upgrade can take longer depending on several factors, including the size and complexity of your installation, and the version that you're upgrading from. When planning an upgrade, it's worth confirming that your current database and operating system version are still supported. Details can be found on our `software and hardware requirements <https://docs.mattermost.com/install/software-hardware-requirements.html#server-software>`__ page.

.. contents::
  :backlinks: top
  :local:

Upgrade to Mattermost v7.1
--------------------------

Mattermost v7.1 introduces schema changes in the form of a new column and its index. The following notes our test results for the schema changes:

- MySQL 12M Posts, 2.5M Reactions - ~1min 34s (instance: PC with 8 cores, 16GB RAM)
- PostgreSQL 12M Posts, 2.5M Reactions - ~1min 18s (instance: db.r5.2xlarge)

You can run the following SQL queries before the upgrade that obtains a lock on ``Reactions`` table. Users' reactions posted during this time won't be reflected in the database until the migrations are complete. This is fully backwards-compatible.

.. tabs:: 

  .. tab:: MySQL

    ``ALTER TABLE Reactions ADD COLUMN ChannelId varchar(26) NOT NULL DEFAULT "";``

    ``UPDATE Reactions SET ChannelId = COALESCE((select ChannelId from Posts where Posts.Id = Reactions.PostId), '') WHERE ChannelId="";``

    ``CREATE INDEX idx_reactions_channel_id ON Reactions(ChannelId) LOCK=NONE;``

  .. tab:: PostgreSQL

    ``ALTER TABLE reactions ADD COLUMN IF NOT EXISTS channelid varchar(26) NOT NULL DEFAULT '';``

    ``UPDATE reactions SET channelid = COALESCE((select channelid from posts where posts.id = reactions.postid), '') WHERE channelid='';``

    ``CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_reactions_channel_id on reactions (channelid);``

Upgrade to Mattermost v7.0
--------------------------

Self-hosted Mattermost customers using MySQL databases may notice the migration to release v7.0 taking longer than usual when there are a large number of rows in the ``FileInfo`` table. See the `important upgrade notes <https://docs.mattermost.com/upgrade/important-upgrade-notes.html>`__ documentation for details.

Upgrade to Mattermost v6.7
--------------------------

Mattermost v6.7 introduces schema changes in the form of a new index. The following notes our test results for the schema changes:

- MySQL 7M Posts - ~17s (instance: db.r5.xlarge)
- MySQL 9M Posts - 2min 12s (instance: db.r5.large)
- Postgres 7M Posts - ~9s  (instance: db.r5.xlarge)

If you want a zero downtime upgrade, you can apply this index prior to doing the upgrade. This is fully backwards-compatible and will not acquire any table lock or affect any existing operations on the table.

- For MySQL: ``CREATE INDEX idx_posts_create_at_id on Posts(CreateAt, Id) LOCK=NONE;``
- For Postgres: ``CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_posts_create_at_id on posts(createat, id);``

Upgrade to Mattermost v6.0
--------------------------

A Mattermost Server v6.0 upgrade will run significant database schema changes that can cause an extended startup time depending on the dataset size. Zero downtime won't be possible for v6.0, but depending on the efforts made during the migration process, it can be minimized to a large extent. 

Running queries prior to the upgrade can also save some downtime. However, some queries can still cause full table locking and require Mattermost to be in read-only mode for the duration of the query.

We strongly recommend that you:

- Set up a maintenance window outside of working hours to mitigate the migration impact. 
- Keep a backup of your database to ensure you can load a previous database snapshot if necessary.
- Upgrade your instance of Mattermost to the latest `Extended Support Release (ESR) <https://docs.mattermost.com/upgrade/extended-support-release.html>`__ first before attempting to run the Mattermost v6.0 upgrade.

.. important::

  Support for Mattermost Server v6.3 `Extended Support Release <https://docs.mattermost.com/upgrade/extended-support-release.html>`_ is coming to the end of its life cycle on October 15, 2022. Upgrading to Mattermost Server v7.1 Extended Support Release or later is recommended.

Upgrading from a previous Extended Support Release to the latest Extended Support Release is supported. Upgrading from v5.31 to v5.37 should take roughly the same amount of time as upgrading from v5.31 to v5.35, then upgrading v5.35 to 5.37. However, an upgrade directly from v5.31 to v5.37 could potentially take hours due to the database schema migrations required for v5.35. Review the :doc:`important-upgrade-notes` for all intermediate versions in between to ensure you’re aware of the possible migrations that could affect your upgrade.

v6.0 database schema migrations
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost v6.0 introduces several database schema changes to improve both database and application performance. The upgrade will run significant database schema changes that can cause an extended startup time depending on the dataset size. We've conducted extensive tests on supported database drivers including MySQL and PostgreSQL, using realistic datasets of more than 10 million posts and more than 72 million posts.

A migration to v6.0 of 10+ million posts will take approximately 1 hour and 22 minutes to complete for a MySQL database. See the `Mattermost v6.0 DB schema migrations analysis <https://gist.github.com/streamer45/59b3582118913d4fc5e8ff81ea78b055>`__ documentation for test specifications, data sizes, and test results.

A large migration from v5.39 to v6.0 of 72+ million posts will take approximately 3 hours and 40 minutes to complete for a MySQL database. See the `Migration results analysis <https://gist.github.com/streamer45/868c451164f6e8069d8b398685a31b6e>`__ documentation for test specifications, data sizes, and test results.

.. tabs::

   .. tab:: MySQL

      The following queries, executed during the migration process on an environment with 10+ million posts, will have a significant impact on database CPU usage and write operation restrictions for the duration of the query:

      ``ALTER TABLE Posts MODIFY Props JSON;`` (~26 minutes)

      ``ALTER TABLE Posts DROP COLUMN ParentId;`` (~26 minutes)

      ``ALTER TABLE Posts MODIFY COLUMN FileIds text;`` (~26 minutes)

      For a complete breakdown of MySQL queries, as well as their impact and duration, see the `Mattermost v6.0 DB schema migrations analysis <https://gist.github.com/streamer45/59b3582118913d4fc5e8ff81ea78b055#mysql-1>`__ documentation.

      **MySQL Mitigation Strategies**

      **Run combined queries prior to the upgrade.**
      The previous queries can be combined when run prior to the upgrade as follows:

      ``ALTER TABLE Posts MODIFY COLUMN FileIds text, MODIFY COLUMN Props JSON;``

      This limits the time taken to that of a single query of that type.

      **Online migration**: An online migration that avoids locking can be attempted on MySQL installations, especially for particularly heavy queries or very big datasets (tens of millions of posts or more). This can be done through an external tool like `pt-online-schema-change <https://www.percona.com/doc/percona-toolkit/LATEST/pt-online-schema-change.html>`__. However, the online migration process can cause a significant spike in CPU usage on the database instance it runs.

      See the `Mattermost v6.0 DB schema migrations analysis <https://gist.github.com/streamer45/59b3582118913d4fc5e8ff81ea78b055#online-migration-mysql>`__ documentation for a sample execution and additional caveats.

   .. tab:: PostgreSQL

      The following query executed during the migration process will have a significant impact on database CPU usage and write operation restrictions for the duration of the query:

      ``ALTER TABLE posts ALTER COLUMN props TYPE jsonb USING props::jsonb;`` (~ 11 minutes)

      For a complete breakdown of PostgreSQL queries, as well as their impact and duration, see the `Mattermost v6.0 DB schema migrations analysis <https://gist.github.com/streamer45/59b3582118913d4fc5e8ff81ea78b055#postgresql-1>`__.

Upgrade from releases older than v5.35
----------------------------------------

Customers upgrading from a release older than Mattermost v5.35 should expect extended downtime when upgrading to v6.0 due to the introduction of backend database architecture introduced in v5.35. This upgrade path isn't recommended for large installations. We recommend upgrading to the latest `Extended Support Release (ESR) <https://docs.mattermost.com/upgrade/extended-support-release.html>`__ first before upgrading to Mattermost v6.0. See the `Mattermost changelog <https://docs.mattermost.com/install/self-managed-changelog.html>`__ documentation for additional details.

If you're upgrading from a version prior to Mattermost v5.0, you can't upgrade directly to v6.0. Instead, we strongly recommend approaching the upgrade in phases, starting with an upgrade to the latest ESR first, followed by the upgrade to v6.0. During the first phase of updates, you must also modify your service file to work with the binary changes introduced with the v5.0 release. Your execution directory should point to the Mattermost base directory (i.e. ``/opt/mattermost``), and your binary should point to the ``mattermost`` binary (i.e. ``/opt/mattermost/bin/mattermost``). 

Ensure you review the :doc:`important-upgrade-notes` for all intermediate release versions in between to ensure you’re aware of the possible migrations that could affect your upgrade.

.. note::

  Customers upgrading from releases older than v5.35 following our recommended upgrade process may encounter the following error during the upgrade to v6.0:
  
  ``Failed to alter column type. It is likely you have invalid JSON values in the column. Please fix the values manually and run the migration again.","caller":"sqlstore/store.go:854","error":"pq: unsupported Unicode escape sequence``
  
  To assist with troubleshooting, you can enable ``SqlSettings.Trace`` to narrow down what table and column are causing issues during the upgrade. The following queries change the columns to JSONB format in PostgreSQL. Run these against your v5.39 development database to find out which table and column has Unicode issues:
  
  .. code-block:: sh

    ALTER TABLE posts ALTER COLUMN props TYPE jsonb USING props::jsonb;
    ALTER TABLE channelmembers ALTER COLUMN notifyprops TYPE jsonb USING notifyprops::jsonb;
    ALTER TABLE jobs ALTER COLUMN data TYPE jsonb USING data::jsonb;
    ALTER TABLE linkmetadata ALTER COLUMN data TYPE jsonb USING data::jsonb;
    ALTER TABLE sessions ALTER COLUMN props TYPE jsonb USING props::jsonb;
    ALTER TABLE threads ALTER COLUMN participants TYPE jsonb USING participants::jsonb;
    ALTER TABLE users ALTER COLUMN props TYPE jsonb USING props::jsonb;
    ALTER TABLE users ALTER COLUMN notifyprops TYPE jsonb USING notifyprops::jsonb;
    ALTER TABLE users ALTER COLUMN timezone TYPE jsonb USING timezone::jsonb;

  Once you've identified the table being affected, verify how many invalid occurrences of `\u0000` you have using the following SELECT query:

  .. code-block:: sh

    SELECT COUNT(*) FROM TableName WHERE ColumnName LIKE '%\u0000%';

  Then select and fix the rows accordingly. If you prefer, you can also fix all occurrences at once in a given table or column using the following UPDATE query:

  .. code-block:: sh

    UPDATE TableName SET ColumnName = regexp_replace(ColumnName, '\\u0000', '', 'g') WHERE ColumnName LIKE '%\u0000%';

Upgrade high availability deployments
---------------------------------------

In `high availability <https://docs.mattermost.com/scale/high-availability-cluster.html>`__ environments, you should expect to schedule downtime for the upgrade to v6.0. Based on your database size and setup, the migration to v6.0 can take a significant amount of time, and may even lock the tables for posts which will prevent your users from posting or receiving messages until the migration is complete.

Ensure you review the `high availability cluster upgrade guide <https://docs.mattermost.com/scale/high-availability-cluster.html#upgrade-guide>`__, as well as the :doc:`important-upgrade-notes` to make sure you're aware of any actions you need to take before or after upgrading from your particular version.

.. important::

  We only support one minor version difference between server versions when performing a rolling upgrade. For example v5.27.1 + v5.27.2 or v5.26.4 + v5.27.1 is supported, whereas v5.25.5 + v5.27.0 is not supported. 

  Running two different versions of Mattermost in your cluster should not be done outside of an upgrade scenario. Due to a fundamental change to the clustering code in v6.0, nodes from different versions cannot be run, as noted in the :doc:`important-upgrade-notes` product documentation.

  The release of v6.0 also introduces database schema changes and longer migration times should be expected, especially on MySQL installations. 

source/upgrade/open-source-components.rst METASEP
Open Source Components
=======================

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

The following open source components are used to provide the full benefits of Mattermost Enterprise.

Desktop
--------

 - Mattermost Desktop v5.1.0 - `View Open Source Components <https://github.com/mattermost/desktop/blob/release-5.1/NOTICE.txt>`_.
 - Mattermost Desktop v5.0.0 - `View Open Source Components <https://github.com/mattermost/desktop/blob/release-5.0/NOTICE.txt>`_.
 - Mattermost Desktop v4.7.0 - `View Open Source Components <https://github.com/mattermost/desktop/blob/release-4.7/NOTICE.txt>`_.
 - Mattermost Desktop v4.6.0 - `View Open Source Components <https://github.com/mattermost/desktop/blob/release-4.6/NOTICE.txt>`_.
 - Mattermost Desktop v4.5.0 - `View Open Source Components <https://github.com/mattermost/desktop/blob/release-4.5/NOTICE.txt>`_.
 - Mattermost Desktop v4.4.0 - `View Open Source Components <https://github.com/mattermost/desktop/blob/release-4.4/NOTICE.txt>`_.
 - Mattermost Desktop v4.3.0 - `View Open Source Components <https://github.com/mattermost/desktop/blob/release-4.3/NOTICE.txt>`_.
 - Mattermost Desktop v4.2.0 - `View Open Source Components <https://github.com/mattermost/desktop/blob/release-4.2/NOTICE.txt>`_.
 - Mattermost Desktop v4.1.0 - `View Open Source Components <https://github.com/mattermost/desktop/blob/release-4.1/NOTICE.txt>`_.
 - Mattermost Desktop v4.0.0 - `View Open Source Components <https://github.com/mattermost/desktop/blob/release-4.0/NOTICE.txt>`_.
 - Mattermost Desktop v3.7.0 - `View Open Source Components <https://github.com/mattermost/desktop/blob/release-3.7/NOTICE.txt>`_.

Mobile
-------

 - Mattermost Mobile v1.55.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.55/NOTICE.txt>`_.
 - Mattermost Mobile v1.54.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.54/NOTICE.txt>`_.
 - Mattermost Mobile v1.53.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.53/NOTICE.txt>`_.
 - Mattermost Mobile v1.52.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.52/NOTICE.txt>`_.
 - Mattermost Mobile v1.51.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.51/NOTICE.txt>`_.
 - Mattermost Mobile v1.50.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.50/NOTICE.txt>`_.
 - Mattermost Mobile v1.49.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.49/NOTICE.txt>`_.
 - Mattermost Mobile v1.48.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.48/NOTICE.txt>`_.
 - Mattermost Mobile v1.47.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.47/NOTICE.txt>`_.
 - Mattermost Mobile v1.46.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.46/NOTICE.txt>`_.
 - Mattermost Mobile v1.45.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.45/NOTICE.txt>`_.
 - Mattermost Mobile v1.44.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.44/NOTICE.txt>`_.
 - Mattermost Mobile v1.43.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.43/NOTICE.txt>`_.
 - Mattermost Mobile v1.42.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.42/NOTICE.txt>`_.
 - Mattermost Mobile v1.41.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.41/NOTICE.txt>`_.
 - Mattermost Mobile v1.40.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.40/NOTICE.txt>`_.
 - Mattermost Mobile v1.39.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.39/NOTICE.txt>`_.
 - Mattermost Mobile v1.38.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.38/NOTICE.txt>`_.
 - Mattermost Mobile v1.37.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.37/NOTICE.txt>`_.
 - Mattermost Mobile v1.36.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.36/NOTICE.txt>`_.
 - Mattermost Mobile v1.35.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.35/NOTICE.txt>`_.
 - Mattermost Mobile v1.34.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.34/NOTICE.txt>`_.
 - Mattermost Mobile v1.33.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.33/NOTICE.txt>`_.
 - Mattermost Mobile v1.32.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.32/NOTICE.txt>`_.
 - Mattermost Mobile v1.31.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.31/NOTICE.txt>`_.
 - Mattermost Mobile v1.30.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.30/NOTICE.txt>`_.
 - Mattermost Mobile v1.29.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.29/NOTICE.txt>`_.
 - Mattermost Mobile v1.28.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.28/NOTICE.txt>`_.
 - Mattermost Mobile v1.27.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.27/NOTICE.txt>`_.
 - Mattermost Mobile v1.26.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.26/NOTICE.txt>`_.
 - Mattermost Mobile v1.25.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.25/NOTICE.txt>`_.
 - Mattermost Mobile v1.24.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.24/NOTICE.txt>`_.
 - Mattermost Mobile v1.23.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.23/NOTICE.txt>`_.
 - Mattermost Mobile v1.22.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.22/NOTICE.txt>`_.
 - Mattermost Mobile v1.21.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.21/NOTICE.txt>`_.
 - Mattermost Mobile v1.20.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.20/NOTICE.txt>`_.
 - Mattermost Mobile v1.19.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.19/NOTICE.txt>`_.
 - Mattermost Mobile v1.18.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.18/NOTICE.txt>`_.
 - Mattermost Mobile v1.17.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.17/NOTICE.txt>`_.
 - Mattermost Mobile v1.16.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.16/NOTICE.txt>`_.
 - Mattermost Mobile v1.15.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.15/NOTICE.txt>`_.
 - Mattermost Mobile v1.14.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.14/NOTICE.txt>`_.
 - Mattermost Mobile v1.13.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.13/NOTICE.txt>`_.
 - Mattermost Mobile v1.12.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.12/NOTICE.txt>`_.
 - Mattermost Mobile v1.11.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.11/NOTICE.txt>`_.
 - Mattermost Mobile v1.10.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.10/NOTICE.txt>`_.
 - Mattermost Mobile v1.9.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.9/NOTICE.txt>`_.
 - Mattermost Mobile v1.8.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.8/NOTICE.txt>`_.
 - Mattermost Mobile v1.7.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.7/NOTICE.txt>`_.
 - Mattermost Mobile v1.6.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.6/NOTICE.txt>`_.
 - Mattermost Mobile v1.5.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.5/NOTICE.txt>`_.
 - Mattermost Mobile v1.4.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.4/NOTICE.txt>`_.
 - Mattermost Mobile v1.3.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.3/NOTICE.txt>`_.
 - Mattermost Mobile v1.2.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.2/NOTICE.txt>`_.
 - Mattermost Mobile v1.1.0 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.1/NOTICE.txt>`_.
 - Mattermost Mobile v1.0.1 - `View Open Source Components <https://github.com/mattermost/mattermost-mobile/blob/release-1.0.1/NOTICE.txt>`_.
 
Server
------------------------------

 - Mattermost Enterprise Edition v7.2.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-7.2/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v7.1.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-7.1/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v7.0.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-7.0/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v6.7.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-6.7/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v6.6.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-6.6/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v6.5.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-6.5/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v6.4.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-6.4/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v6.3.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-6.3/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v6.2.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-6.2/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v6.1.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-6.1/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v6.0.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-6.0/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.39.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-5.39/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.38.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-5.38/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.37.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-5.37/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.36.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-5.36/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.35.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-5.35/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.34.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-5.34/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.33.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-5.33/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.32.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-5.32/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.31.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-5.31/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.30.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-5.30/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.29.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-5.29/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.28.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-5.28/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.27.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-5.27/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.26.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-5.26/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.25.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-5.25/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.24.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-5.24/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.23.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-5.23/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.22.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-5.22/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.21.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-5.21/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.20.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-5.20/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.19.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-5.19/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.18.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-5.18/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.17.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-5.17/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.16.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-5.16/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.15.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-5.15/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.14.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-5.14/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.13.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-5.13/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.12.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-5.12/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.11.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-5.11/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.10.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-5.10/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.9.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-5.9/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.8.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-5.8/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.7.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-5.7/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.6.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-5.6/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.5.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-5.5/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.4.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-5.4/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.3.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-5.3/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.2.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-5.2/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.1.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-5.1/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.0.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-5.0/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v4.10.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-4.10/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v4.9.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-4.9/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v4.8.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-4.8/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v4.7.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-4.7/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v4.6.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-4.6/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v4.5.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-4.5/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v4.4.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-4.4/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v4.3.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-4.3/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v4.2.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-4.2/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v4.1.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-4.1/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v4.0.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-4.0/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v3.10.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-3.10/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v3.9.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-3.9/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v3.8.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-3.8/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v3.7.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-3.7/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v3.6.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-3.6/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v3.5.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-3.5/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v3.4.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-3.4/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v3.3.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-3.3/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v3.2.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-3.2/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v3.1.0 - `View Open Source Components <https://github.com/mattermost/mattermost-server/blob/release-3.1/NOTICE.txt>`_.

Webapp
------------------------------

 - Mattermost Enterprise Edition v7.2.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-7.2/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v7.1.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-7.1/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v7.0.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-7.0/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v6.7.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-6.7/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v6.6.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-6.6/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v6.5.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-6.5/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v6.4.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-6.4/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v6.3.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-6.3/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v6.2.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-6.2/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v6.1.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-6.1/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v6.0.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-6.0/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.39.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-5.39/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.38.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-5.38/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.37.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-5.37/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.36.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-5.36/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.35.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-5.35/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.34.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-5.34/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.33.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-5.33/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.32.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-5.32/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.31.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-5.31/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.30.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-5.30/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.29.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-5.29/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.28.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-5.28/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.27.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-5.27/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.26.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-5.26/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.25.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-5.25/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.24.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-5.24/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.23.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-5.23/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.22.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-5.22/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.21.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-5.21/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.20.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-5.20/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.19.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-5.19/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.18.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-5.18/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.17.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-5.17/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.16.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-5.16/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.15.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-5.15/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.14.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-5.14/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.13.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-5.13/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.12.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-5.12/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.11.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-5.11/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.10.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-5.10/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.9.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-5.9/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.8.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-5.8/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.7.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-5.7/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.6.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-5.6/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.5.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-5.5/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.4.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-5.4/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.3.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-5.3/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.2.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-5.2/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.1.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-5.1/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v5.0.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-5.0/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v4.10.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-4.10/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v4.9.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-4.9/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v4.8.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-4.8/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v4.7.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-4.7/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v4.6.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-4.6/NOTICE.txt>`_.
 - Mattermost Enterprise Edition v4.5.0 - `View Open Source Components <https://github.com/mattermost/mattermost-webapp/blob/release-4.5/NOTICE.txt>`_.

source/upgrade/important-upgrade-notes.rst METASEP
Important Upgrade Notes
=======================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

.. important::
   - Support for Mattermost Server v6.3 `Extended Support Release <https://docs.mattermost.com/upgrade/extended-support-release.html>`_ is coming to the end of its life cycle in October 15, 2022. Upgrading to Mattermost Server v7.1 `Extended Support Release <https://docs.mattermost.com/upgrade/extended-support-release.html>`_ or later is recommended.
   - MySQL 8.0.22 contains an `issue with JSON column types <https://bugs.mysql.com/bug.php?id=101284>`__ changing string values to integers which is preventing Mattermost from working properly. Users are advised to avoid this database version.
   - Upgrading the Microsoft Teams Calling plugin to v2.0.0 requires users to reconnect their accounts.
   - When upgrading to 7.x from a 5.x release please make sure to upgrade to 5.37.9 first for the upgrade to complete successfully.

+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| If you’re upgrading from a version earlier than... | Then...                                                                                                                                                          |
+====================================================+==================================================================================================================================================================+
| v7.2                                               | Several schema changes impose additional database constraints to make the data more strict. All the commands listed below were tested on a 8 core, 16GB RAM      |
|                                                    | machine. Here are the times recorded:                                                                                                                            |
|                                                    |                                                                                                                                                                  |
|                                                    | **PostgreSQL (131869 channels, 2 teams)**:                                                                                                                       |
|                                                    |                                                                                                                                                                  |
|                                                    | - ``CREATE TYPE channel_type AS ENUM ('P', 'G', 'O', 'D');`` took 14.114 milliseconds                                                                            |
|                                                    | - ``ALTER TABLE channels alter column type type channel_type using type::channel_type;`` took 3856.790 milliseconds (3.857 seconds)                              |
|                                                    | - ``CREATE TYPE team_type AS ENUM ('I', 'O');`` took 4.191 milliseconds                                                                                          |
|                                                    | - ``ALTER TABLE teams alter column type type team_type using type::team_type;`` took 116.205 milliseconds                                                        |
|                                                    | - ``CREATE TYPE upload_session_type AS ENUM ('attachment', 'import');`` took 4.266 milliseconds                                                                  |
|                                                    | - ``ALTER TABLE uploadsessions alter column type type upload_session_type using type::upload_session_type;`` took 37.099 milliseconds                            |
|                                                    |                                                                                                                                                                  |
|                                                    | **MySQL (270959 channels, 2 teams)**:                                                                                                                            |
|                                                    |                                                                                                                                                                  |
|                                                    | - ``ALTER TABLE Channels MODIFY COLUMN Type ENUM("D", "O", "G", "P");`` took 13.24 seconds                                                                       |
|                                                    | - ``ALTER TABLE Teams MODIFY COLUMN Type ENUM("I", "O");`` took 0.04 seconds                                                                                     |
|                                                    | - ``ALTER TABLE UploadSessions MODIFY COLUMN Type ENUM("attachment", "import");`` took 0.03 seconds                                                              |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v7.1                                               | A new configuration option ``MaxImageDecoderConcurrency`` indicates how many images can be decoded concurrently at once. The default is -1, and the value        |
|                                                    | indicates the number of CPUs present. This affects the total memory consumption of the server. The maximum memory of a single image is dictated by               |
|                                                    | ``MaxImageResolution * 24 bytes``. Therefore, we recommend that ``MaxImageResolution * MaxImageDecoderConcurrency * 24`` should be less than the allocated       |
|                                                    | memory for image decoding.                                                                                                                                       |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | Mattermost v7.1 introduces schema changes in the form of a new column and its index. The following notes our test results for the schema changes:                |                                                                                                                                                                                                             
|                                                    |                                                                                                                                                                  |
|                                                    | - MySQL 12M Posts, 2.5M Reactions - ~1min 34s (instance: PC with 8 cores, 16GB RAM)                                                                              |
|                                                    | - PostgreSQL 12M Posts, 2.5M Reactions - ~1min 18s (instance: db.r5.2xlarge)                                                                                     |
|                                                    |                                                                                                                                                                  |
|                                                    | You can run the following SQL queries before the upgrade to obtain a lock on ``Reactions`` table, so that users' reactions posted during this time won't be      |
|                                                    | reflected in the database until the migrations are complete. This is fully backwards-compatible.                                                                 |                                                                                                                                              
|                                                    |                                                                                                                                                                  |
|                                                    | MySQL:                                                                                                                                                           |
|                                                    |                                                                                                                                                                  |
|                                                    | - ``ALTER TABLE Reactions ADD COLUMN ChannelId varchar(26) NOT NULL DEFAULT "";``                                                                                |
|                                                    | - ``UPDATE Reactions SET ChannelId = COALESCE((select ChannelId from Posts where Posts.Id = Reactions.PostId), '') WHERE ChannelId="";``                         |
|                                                    | - ``CREATE INDEX idx_reactions_channel_id ON Reactions(ChannelId) LOCK=NONE;``                                                                                   |
|                                                    |                                                                                                                                                                  |   
|                                                    | PostgreSQL:                                                                                                                                                      |
|                                                    |                                                                                                                                                                  |
|                                                    | - ``ALTER TABLE reactions ADD COLUMN IF NOT EXISTS channelid varchar(26) NOT NULL DEFAULT '';``                                                                  |
|                                                    | - ``UPDATE reactions SET channelid = COALESCE((select channelid from posts where posts.id = reactions.postid), '') WHERE channelid='';``                         |
|                                                    | - ``CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_reactions_channel_id on reactions (channelid);``                                                                 |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v7.0                                               | **IMPORTANT:** Session length configuration settings have changed from using a unit of *days* to *hours*. Instances using a config.json file or a database       |
|                                                    | configuration for the following values should be automatically migrated to the new units, but instances using environment variables must make the following      |
|                                                    | changes:                                                                                                                                                         |
|                                                    |                                                                                                                                                                  |
|                                                    | 1. replace ``MM_SERVICESETTINGS_SESSIONLENGTHWEBINDAYS`` with ``MM_SERVICESETTINGS_SESSIONLENGTHWEBINHOURS`` (x24 the value).                                    |
|                                                    | 2. replace ``MM_SERVICESETTINGS_SESSIONLENGTHMOBILEINDAYS`` with ``MM_SERVICESETTINGS_SESSIONLENGTHMOBILEINHOURS`` (x24 the value).                              |
|                                                    | 3. replace ``MM_SERVICESETTINGS_SESSIONLENGTHSSOINDAYS`` with ``MM_SERVICESETTINGS_SESSIONLENGTHSSOINHOURS`` (x24 the value).                                    |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | MySQL self-hosted customers may notice the migration taking longer than usual when having a large number of rows in FileInfo table. For MySQL, it takes around   |
|                                                    | 19 seconds for a table of size 700,000 rows. The time required for PostgreSQL is negligible. The testing was performed on a machine with specifications of       |
|                                                    | ``CPU - Intel i7 6-cores @ 2.6 GHz`` and ``Memory - 16 GB``.                                                                                                     |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | When a new configuration setting via **System Console > Experimental > Features > Enable App Bar** is enabled, all channel header icons registered by plugins    |
|                                                    | will be moved to the new Apps Bar, even if they do not explicitly use the new registry function to render a component there. The setting for Apps Bar defaults   |
|                                                    | to ``false`` for self-hosted deployments.                                                                                                                        |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | The value of ``ServiceSettings.TrustedProxyIPHeader`` defaults to empty from now on. A previous bug prevented this from happening in certain conditions.         |
|                                                    | Customers are requested to check for these values in their config and set them to nil if necessary. See more details                                             |
|                                                    | `here <https://docs.mattermost.com/configure/configuration-settings.html#trusted-proxy-ip-header>`_.                                                             |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | `Collapsed Reply Threads <https://docs.mattermost.com/channels/organize-conversations.html>`_ is now generally available and enabled by default for new          |
|                                                    | Mattermost servers. For servers upgrading to v7.0 and later, please reference                                                                                    |
|                                                    | `this article <https://support.mattermost.com/hc/en-us/articles/6880701948564>`_ for more information and guidance on enabling the                               |
|                                                    | feature.                                                                                                                                                         |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v6.7                                               | New schema changes were introduced in the form of a new index. The following summarizes the test results measuring how long it took for the database queries to  |
|                                                    | run with these schema changes:                                                                                                                                   |
|                                                    |                                                                                                                                                                  |
|                                                    | MySQL 7M Posts - ~17s (Instance: db.r5.xlarge)                                                                                                                   |
|                                                    |                                                                                                                                                                  |
|                                                    | MySQL 9M Posts - 2min 12s (Instance: db.r5.large)                                                                                                                |
|                                                    |                                                                                                                                                                  |
|                                                    | Postgres 7M Posts - ~9s  (Instance: db.r5.xlarge)                                                                                                                |
|                                                    |                                                                                                                                                                  |
|                                                    | For customers wanting a zero downtime upgrade, they are encouraged to apply this index prior to doing the upgrade. This is fully backwards compatible and will   |
|                                                    | not acquire any table lock or affect any existing operations on the table when run manually. Else, the queries will run during the upgrade process and will lock |
|                                                    | the table in non-MySQL environments. Run the following to apply this index:                                                                                      |
|                                                    |                                                                                                                                                                  |
|                                                    | For MySQL: ``CREATE INDEX idx_posts_create_at_id on Posts(CreateAt, Id) LOCK=NONE;``                                                                             |
|                                                    |                                                                                                                                                                  |
|                                                    | For Postgres: ``CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_posts_create_at_id on posts(createat, id);``                                                         |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | In v6.7.1, the value of ``ServiceSettings.TrustedProxyIPHeader`` defaults to empty from now on. A previous bug prevented this from happening in certain          |
|                                                    | conditions. Customers are requested to check for these values in their config and set them to nil if necessary. See more details                                 |
|                                                    | `here <https://docs.mattermost.com/configure/configuration-settings.html#trusted-proxy-ip-header>`_.                                                             |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v6.6                                               | The `Apps Framework protocol <https://developers.mattermost.com/integrate/apps/>`_ for binding/form submissions has changed, by separating the single `call`     |
|                                                    | into separate `submit`, `form`, `refresh` and `lookup` calls. If any users have created their own Apps, they have to be updated to the new system.               |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | Channel admins can now configure `certain actions <https://docs.mattermost.com/channels/create-channels.html>`_ to be executed automatically based on trigger    |
|                                                    | conditions without writing any code. Users running an older Playbooks release need to upgrade their Playbooks instance to at least v1.26 to take advantage of the|
|                                                    | channel actions functionality.                                                                                                                                   |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | In v6.6.2, the value of ``ServiceSettings.TrustedProxyIPHeader`` defaults to empty from now on. A previous bug prevented this from happening in certain          |
|                                                    | conditions. Customers are requested to check for these values in their config and set them to nil if necessary. See more details                                 |
|                                                    | `here <https://docs.mattermost.com/configure/configuration-settings.html#trusted-proxy-ip-header>`_.                                                             |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v6.5                                               | The ``mattermost version`` CLI command does not interact with the database anymore. Therefore the database version is not going to be                            |
|                                                    | printed. Also, the database migrations are not going to be applied with the version sub command.                                                                 |
|                                                    | `A new db migrate sub command <https://docs.mattermost.com/manage/command-line-tools.html#mattermost-db-migrate>`_ is added to enable administrators             |
|                                                    | to trigger migrations.                                                                                                                                           |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | In v6.5.2, the value of ``ServiceSettings.TrustedProxyIPHeader`` defaults to empty from now on. A previous bug prevented this from happening in certain          |
|                                                    | conditions. Customers are requested to check for these values in their config and set them to nil if necessary. See more details                                 |
|                                                    | `here <https://docs.mattermost.com/configure/configuration-settings.html#trusted-proxy-ip-header>`_.                                                             |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v6.4                                               | A new schema migration system has been introduced, so we strongly recommend backing up the database before updating the server to this version. The new          |
|                                                    | migration system will run through all existing migrations to record them to a new table. This will only happen for the first run in order to migrate the         |
|                                                    | application to the new system. The table where the migration information is stored is called ``db_migrations``. Additionally, a ``db_lock`` table is used to     |
|                                                    | prevent multiple installations from running migrations in parallel. In case of an error while applying the migrations, please check this table first.  Any       |
|                                                    | downtime depends on how many records the database has and whether there are missing migrations in the schema. If you encounter an issue please file              |
|                                                    | `an Issue <https://github.com/mattermost/mattermost-server/issues>`_ by including the failing migration name, database driver/version, and the server logs.      |
|                                                    |                                                                                                                                                                  |
|                                                    | On MySQL, if you encounter an error "Failed to apply database migrations" when upgrading to v6.4.0, it means that there is a mismatch between the                |
|                                                    | table collation and the default database collation. You can manually fix this by changing the database collation with                                            |
|                                                    | ``ALTER DATABASE <YOUR_DB_NAME> COLLATE = 'utf8mb4_general_ci',``. Then do the server upgrade again and the migration will be successful.                        |   
|                                                    |                                                                                                                                                                  |
|                                                    | It has been commonly observed on MySQL 8+ systems to have an error ``Error 1267: Illegal mix of collations`` when upgrading due to changing the default          |
|                                                    | collation. This is caused by the database and the tables having different collations. If you get this error, please change the collations to have the same       |
|                                                    | value with, for example, ``ALTER DATABASE <db_name> COLLATE = '<collation>'``.                                                                                   |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | The new migration system requires the MySQL database user to have additional *EXECUTE*, *CREATE ROUTINE*, *ALTER ROUTINE* and *REFERENCES* privileges to run     |
|                                                    | schema migrations.                                                                                                                                               |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v6.3                                               | In v6.3.3, the default for ``ThreadAutoFollow`` has been changed to ``false``. This does not affect existing configurations where this value is already set to   |
|                                                    | ``true``.                                                                                                                                                        |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | In v6.3.9, the value of ``ServiceSettings.TrustedProxyIPHeader`` defaults to empty from now on. A previous bug prevented this from happening in certain          |
|                                                    | conditions. Customers are requested to check for these values in their config and set them to nil if necessary. See more details                                 |
|                                                    | `here <https://docs.mattermost.com/configure/configuration-settings.html#trusted-proxy-ip-header>`_.                                                             |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v6.2                                               | Channel results in the channel autocomplete will include private channels. Customers using `Bleve <https://docs.mattermost.com/deploy/bleve-search.html>`_ or    |
|                                                    | `Elasticsearch <https://docs.mattermost.com/scale/elasticsearch.html>`_ for autocomplete will have to reindex their data to get the new results. Since this can  |
|                                                    | take a long time, we suggest disabling autocomplete and running indexing in the background. When this is complete, re-enable autocomplete. Note that only channel|
|                                                    | members will see private channel names in autocomplete results.                                                                                                  |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | In v6.2.3, the default for ``ThreadAutoFollow`` has been changed to ``false``. This does not affect existing configurations where this value is already set to   |
|                                                    | ``true``.                                                                                                                                                        |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | Mattermost Boards requires ``EnableReliableWebSockets`` setting to be manually set to ``true`` for real-time updates to appear correctly.                        |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v6.1                                               | Please refer to `the schema migration analysis <https://gist.github.com/streamer45/997b726a86b5d2a624ac2af435a66086>`_ when upgrading to v6.1.                   |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | The Bleve index has been updated to use the scorch index type. This new default index type features some efficiency improvements which means that the indexes    |
|                                                    | use significantly less disk space. To use this new type of index, after upgrading the server version, run a purge operation and then a reindex from the Bleve    |
|                                                    | section of the System Console. Bleve is still compatible with the old indexes, so the currently indexed data will work fine if the purge and reindex is not run. |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | A composite index has been added to the jobs table for better query performance. For some customers with a large jobs table, this can take a long time, so we    |
|                                                    | recommend adding the index during off-hours, and then running the migration. A table with more than 1 million rows can be considered as large enough to be       |
|                                                    | updated prior to the upgrade.                                                                                                                                    |
|                                                    |   - For PostgreSQL: ``create index concurrently idx_jobs_status_type on jobs (status,type);``                                                                    |
|                                                    |   - For MySQL: ``create index idx_jobs_status_type on Jobs (Status,Type);``                                                                                      |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | In v6.1.3, the default for ``ThreadAutoFollow`` has been changed to ``false``. This does not affect existing configurations where this value is already set to   |
|                                                    | ``true``.                                                                                                                                                        |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | Mattermost Boards requires ``EnableReliableWebSockets`` setting to be manually set to ``true`` for real-time updates to appear correctly.                        |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v6.0                                               | Longer migration times can be expected.                                                                                                                          |
|                                                    |                                                                                                                                                                  |
|                                                    |  - See `this document <https://gist.github.com/streamer45/59b3582118913d4fc5e8ff81ea78b055>`_ for the estimated upgrade times with datasets of 10+ million posts.|                                                                                                                                            
|                                                    |  - See `this document <https://gist.github.com/streamer45/868c451164f6e8069d8b398685a31b6e>`_ for the estimated upgrade times with datasets of 70+ million posts.|                                                                                                                          
|                                                    |                                                                                                                                                                  |
|                                                    | The field type of Data in ``model.ClusterMessage`` was changed to []byte from string. Therefore, a major thing to note is that a v6 server is incompatible to    |
|                                                    | run along with a v5 server in a cluster. Customers upgrading from 5.x to 6.x cannot do a High Availability upgrade. While upgrading, it is required that no      | 
|                                                    | other v5 server runs when a v6 server is brought up. A v6 server will run significant database schema changes that can cause a large startup time depending on   |
|                                                    | the dataset size. Zero downtime will not be possible, but depending on the efforts made during the migration process, it can be minimized to a large extent.     |
|                                                    |                                                                                                                                                                  |
|                                                    | 1. Low effort, long downtime - This is the usual process of starting a v6 server normally. This has two implications: during the migration process, various      |
|                                                    | tables will be locked which will render those tables read-only during that period. Secondly, once the server finishes migration and starts the application, no   |
|                                                    | other v5 server can run in the cluster.                                                                                                                          |
|                                                    |                                                                                                                                                                  |
|                                                    | 2. Medium effort, medium downtime - This process will require SQL queries to be executed manually on the server. To avoid causing a table lock, a customer can   |
|                                                    | choose to use the pt-online-schema-change tool for MySQL. For Postgres, the table locking is very minimal. The advantage is that since there are a lot of        |
|                                                    | queries, the customer can take their own time to run individual queries during off-hours. All queries except #11 are safe to be executed this way. Then the      |
|                                                    | usual method of (1) can be followed.                                                                                                                             |
|                                                    |                                                                                                                                                                  |
|                                                    | 3. High effort, low downtime - This process requires everything of (2), plus it tries to minimize the impact of query #11. We can do this by following step 2,   |
|                                                    | and then starting v6 along with a running v5 server, and then monitor the application logs. As soon as the v6 application starts up, we need to bring down a v5  |
|                                                    | node. This minimizes the downtime to only a few seconds.                                                                                                         |
|                                                    |                                                                                                                                                                  |
|                                                    | It is recommended to start Mattermost directly and not through systemctl to avoid the server process getting killed during the migration. This can happen since  |
|                                                    | the value of ``TimeoutStartSec`` in the provided systemctl service file is set to one hour.                                                                      |
|                                                    |                                                                                                                                                                  |
|                                                    | Customers using the Mattermost Kubernetes operator should be aware of the above migration information and choose the path that is most appropriate for them. If  |
|                                                    | (1) is acceptable, then the normal upgrade process using the operator will suffice. For minimum downtime, follow (2) before using the operator to update         |
|                                                    | Mattermost following the normal upgrade process.                                                                                                                 |    
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | While trying to upgrade to a Mattermost version >= 6.0.x, you might encounter the following error: ``Failed to alter column type. It is likely you have invalid  |
|                                                    | JSON values in the column. Please fix the values manually and run the migration again.``                                                                         |                                                                                                                                                          
|                                                    |                                                                                                                                                                  |
|                                                    | This means that the particular column has some invalid JSON values which need to be fixed manually. A common fix that is known to work is to wipe out all        |
|                                                    | ``\u0000`` characters.                                                                                                                                           |
|                                                    |                                                                                                                                                                  |
|                                                    | Please follow these steps:                                                                                                                                       |
|                                                    |                                                                                                                                                                  |
|                                                    | 1. Check the affected values by: ``SELECT COUNT(*) FROM <table> WHERE <column> LIKE '%\u0000%';``                                                                |
|                                                    | 2. If you get a count more than 0, check those values manually, and confirm they are okay to be removed.                                                         |
|                                                    | 3. Remove them by ``UPDATE <table> SET <column> = regexp_replace(<column>, '\\u0000', '', 'g') where <column> like '%\u0000%';``                                 |
|                                                    |                                                                                                                                                                  |
|                                                    | Then try to start Mattermost again.                                                                                                                              |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | Please see `the changelog <https://docs.mattermost.com/install/self-managed-changelog.html>`_ for a list deprecations in this release.                           |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | Focalboard plugin has been renamed to Mattermost Boards, and v0.9.1 (released with Mattermost v6.0) is now enabled by default.                                   |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | The advanced logging configuration schema changed. This is a breaking change relative to 5.x. See updated                                                        |
|                                                    | `documentation <https://docs.mattermost.com/comply/audit-log.html>`_.                                                                                            |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | The existing theme names and colors, including "Mattermost", "Organization", "Mattermost Dark", and "Windows Dark" have been updated to the new "Denim",         |
|                                                    | "Quartz", "Indigo", and "Onyx" theme names and colors, respectively. Anyone using the existing themes will see slightly modified theme colors after their        |
|                                                    | server or workspace is upgraded. The theme variables for the existing "Mattermost", "Organization", "Mattermost Dark", and "Windows Dark" themes will still be   |
|                                                    | accessible in `our documentation <https://docs.mattermost.com/messaging/customizing-theme-colors.html#custom-theme-examples>`_, so a custom theme can be created |
|                                                    | with these theme variables if desired. Custom themes are unaffected by this change.                                                                              |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | Some breaking changes to plugins are included:                                                                                                                   |
|                                                    |                                                                                                                                                                  |
|                                                    |  - Support for left-hand side-specific bot icons was dropped.                                                                                                    |
|                                                    |  - Removed a deprecated "Backend" field from the plugin manifest.                                                                                                |
|                                                    |  - Converted the "Executables" field in the plugin manifest to a map.                                                                                            |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | Mattermost Boards requires ``EnableReliableWebSockets`` setting to be manually set to ``true`` for real-time updates to appear correctly.                        |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v5.38.0                                            | The “config watcher” (the mechanism that automatically reloads the ``config.json`` file) has been removed in favor of the ``mmctl config reload`` command, which |
|                                                    | must be run to apply configuration changes after they are made on disk. This change improves configuration performance and robustness.                           |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | v5.38 adds fixes for some of the incorrect mention counts and unreads around threads and channels since the introduction of Collapsed Reply Threads (Beta). This |
|                                                    | fix is done through a SQL migration, and it may take several minutes to complete for large databases. The ``fixCRTChannelMembershipCounts`` fix takes 1 minute   |
|                                                    | and 20 seconds for a database containing approximately four million channel memberships and about 130,000 channels. The ``fixCRTThreadCountsAndUnreads`` fix     |
|                                                    | takes about 3 minutes and 30 seconds for a database containing 56367 threads, 124587 thread memberships, and 220801 channel memberships. These are on MySQL      |
|                                                    | v5.6.51.                                                                                                                                                         | 
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | Focalboard v0.8.2 (released with Mattermost v5.38.0) requires Mattermost v5.37+ due to the new database connection system.                                       |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v5.37.0                                            | The ``platform`` binary and “--platform” flag have been removed. If you are using the “--platform” flag or are using the ``platform`` binary directly to run     |
|                                                    | the Mattermost server application via a systemd file or custom script, you will be required to use only the mattermost binary.                                   |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | `Collapsed Reply Threads <https://mattermost.com/blog/collapsed-reply-threads-beta/>`_ are available as beta in Mattermost Server                                |
|                                                    | v5.37 and later. It’s expected that you may experience bugs as we stabilize the feature. In particular, please be aware of                                       |
|                                                    | `the known issues documented here <https://docs.mattermost.com/help/messaging/organizing-conversations.html#known-issues>`_.                                     |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | v5.37 adds support for emoji standard v13.0. If you have added a custom emoji in the past that uses one of the new system names, then it is going to get         |
|                                                    | overwritten by the system emoji. The workaround is to change the custom emoji name.                                                                              |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | Parts of Incident Collaboration are now available to all Mattermost editions. As part of this update, Incident Collaboration will require a minimum server       |
|                                                    | version of v5.37. To learn more about what is available in each edition, visit `our pricing page <https://mattermost.com/pricing>`_.                             |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | In v5.37.8, the default for ``ThreadAutoFollow`` has been changed to ``false``. This does not affect existing configurations where this value is already set to  |
|                                                    | ``true``.                                                                                                                                                        |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v5.36.0                                            | Gossip clustering mode is now in General Availability and is no longer available as an option. All cluster traffic will always use the gossip protocol. The      |
|                                                    | config setting ``UseExperimentalGossip`` has no effect and has only been kept for compatibility purposes. The setting to use gossip has been removed from the    |
|                                                    | System Console. **Note:** For High Availability upgrades, all nodes in the cluster must use a single protocol. If an existing system is not currently using      |
|                                                    | gossip, one node in a cluster can't be upgraded while other nodes in the cluster use an older version. Customers must either use gossip for their High           |
|                                                    | Availability upgrade, or customers must shut down all nodes, perform the upgrade, and then bring all nodes back up.                                              |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | To enable Focalboard, open the Marketplace from the sidebar menu, install the Focalboard plugin, then click on **Configure**, enable it, and save. Update your   |
|                                                    | NGINX or Apache web proxy config following `these steps <https://github.com/mattermost/focalboard/discussions/566>`_.                                            |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v5.35.0                                            | Due to the introduction of backend database architecture required for upcoming new features, Shared Channels and Collapsed Reply Threads, the performance of the |
|                                                    | migration process for the v5.35 release (May 16, 2021) has been noticeably affected. Depending on the size, type, and version of the database, longer than usual |
|                                                    | upgrade times should be expected. This can vary from a couple of minutes (average case) to hours (worst case, MySQL 5.x only). A moderate to significant spike   |
|                                                    | in database CPU usage should also be expected during this process. `More details on the performance impact of the migration and possible mitigation strategies   | 
|                                                    | are provided here <https://gist.github.com/streamer45/9aee4906639a49ebde68b2f3c0f924c1>`_.                                                                       |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | The existing password generation logic used during the bulk user import process was comparatively weak. Hence it's advised for admins to immediately reset the   |
|                                                    | passwords for all the users who were generated during the bulk import process and whose password has not been changed even once.                                 |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | v5.35.0 introduces a new feature to search for files. Search results for files shared in the past may be incomplete until a                                      |
|                                                    | `content extraction command <https://docs.mattermost.com/administration/command-line-tools.html#mattermost-extract-documents-content>`_ is executed to extract   |
|                                                    | and index the content of files already in the database. Instances running Elasticsearch or Bleve search backends will also need to execute a Bulk Indexing after |
|                                                    | the content extraction is complete. Please see more details in `this blog post <https://mattermost.com/blog/file-search/>`_.                                     |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v5.34.1                                            | v5.34.1 fixes an issue where upgrading to v5.34.0 runs a migration that can cause timeouts on MySQL installations. Upgrading to v5.34.1 may also execute missing |
|                                                    | migrations that were scheduled for v5.32.0. These additions can be lengthy on very big MySQL (version 5.x) installations.                                        |
|                                                    |                                                                                                                                                                  |
|                                                    |       - Altering of ``Posts.FileIds`` type (PostgreSQL only)                                                                                                     |
|                                                    |       - Added new column ``ThreadMemberships.UnreadMentions``                                                                                                    |
|                                                    |       - Added new column ``Channels.Shared``                                                                                                                     |
|                                                    |       - Added new column ``Reactions.UpdateAt``                                                                                                                  |
|                                                    |       - Added new column ``Reactions.DeleteAt``                                                                                                                  |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v5.33.0                                            | Deleting a reaction is now a soft delete in the ``Reactions`` table. A schema update is required and may take up to 15 seconds on first run with large data sets.|
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | WebSocket handshakes done with HTTP version lower than 1.1 will result in a warning, and the server will transparently upgrade the version to 1.1 to comply with |
|                                                    | the WebSocket RFC. This is done to work around incorrect Nginx (and other proxy) configs that do not set the ``proxy_http_version`` directive to 1.1. This       |
|                                                    | facility will be removed in a future Mattermost version and it is strongly recommended to fix the proxy configuration to correctly use the WebSocket protocol.   |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v5.32.0                                            | ``ExperimentalChannelOrganization``, ``EnableXToLeaveChannelsFromLHS``, ``CloseUnusedDirectMessages``, and ``ExperimentalHideTownSquareinLHS`` settings are only |
|                                                    | functional if the Legacy Sidebar (``EnableLegacySidebar``) is enabled since they are not compatible with the new sidebar experience.                             |
|                                                    | ``ExperimentalChannelSidebarOrganization`` has been deprecated, since the                                                                                        |
|                                                    | `new sidebar is now enabled for all users <https://mattermost.com/blog/custom-collapsible-channel-categories/>`_.                                                |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | Breaking changes to the Golang client API were introduced: ``GetPostThread``, ``GetPostsForChannel``, ``GetPostsSince``, ``GetPostsAfter``, ``GetPostsBefore``,  |
|                                                    | and ``GetPostsAroundLastUnread`` now require an additional collapsedThreads parameter to be passed. Any client making use of these functions will need to update |
|                                                    | them when upgrading its dependencies.                                                                                                                            |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | `A breaking change was introduced when upgrading the Go version to v1.15.5 <https://golang.org/doc/go1.15#commonname>`_ where user logins fail with AD/LDAP Sync |
|                                                    | when the certificate of the LDAP Server has no Subject Alternative Name (SAN) in it. Creating a new certificate on the AD/LDAP Server with the SAN inside fixes  |
|                                                    | this.                                                                                                                                                            |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | TLS versions 1.0 and 1.1 have been deprecated by browser vendors. Starting in Mattermost Server v5.32 (February 16), mmctl returns an error when connected to    |
|                                                    | Mattermost servers deployed with these TLS versions. System Admins will need to explicitly add a flag in their commands to continue to use them. We recommend    |
|                                                    | upgrading to TLS version 1.2 or higher.                                                                                                                          |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v5.31.0                                            | For Mobile Apps v1.42.0+, the minimum server version is set to 5.31.3 as                                                                                         |
|                                                    | `5.31.3 fixed an issue <https://docs.mattermost.com/administration/changelog.html#release-v5-31-esr>`_ where the server version was reported as v5.30.0.         |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v5.29.0                                            | A new configuration setting ``ThreadAutoFollow`` has been added to support `Collapsed Reply Threads                                                              |
|                                                    | <https://docs.google.com/presentation/d/1QSrPws3N8AMSjVyOKp15FKT7O0fGMSx8YidjSDS4Wng/edit#slide=id.g2f0aecc189_0_245>`_ releasing in beta in Q1 2021. This       |
|                                                    | setting is enabled by default and may affect server performance. It is recommended to review our `documentation on hardware requirements                         |
|                                                    | <https://docs.mattermost.com/install/requirements.html#hardware-requirements>`_ to ensure your servers are appropriately scaled for the size of your user base.  |   
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | Disabled the xmlsec1-based SAML library in favor of the re-enabled and improved SAML library.                                                                    |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v5.28.0                                            | Now when the service crashes, it will generate a coredump instead of just dumping the stack trace to the console. This allows us to preserve the full            |
|                                                    | information of the crash to help with debugging it.                                                                                                              |
|                                                    |                                                                                                                                                                  |
|                                                    | For more information about coredumps, please see: https://man7.org/linux/man-pages/man5/core.5.html.                                                             |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | In-product notices have been introduced to keep System Admins and end users informed of the latest product enhancements available in new server and desktop      | 
|                                                    | versions. `Learn more about in-product notices <https://docs.mattermost.com/administration/notices.html>`_ and how to disable them in our documentation.         |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | Disabled the xmlsec1-based SAML library in favor of the re-enabled and improved SAML library.                                                                    |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v5.27.0                                            | Disabled the xmlsec1-based SAML library in favor of the re-enabled and improved SAML library.                                                                    |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v5.26.0                                            | In v5.26, Elasticsearch indexes needed to be recreated. Admins should re-index Elasticsearch using the **Purge index** and then **Index now** button so that all |
|                                                    | the changes will be included in the index. Systems may be left with a limited search during the indexing, so it should be done during a time when there is       |
|                                                    | little to no activity because it may take several hours.                                                                                                         |
|                                                    +----------------------------------------------------+-------------------------------------------------------------------------------------------------------------+
|                                                    | An ``EnableExperimentalGossipEncryption`` option was added under ``ClusterSettings``. If this is set to ``true``, and ``UseExperimentalGossip`` is also ``true``,| 
|                                                    | all communication through the cluster using the gossip protocol will be encrypted. The encryption uses ``AES-256`` by default, and it is not kept configurable   |
|                                                    | by design. However, if one wishes, they can set the value in Systems table manually for the ``ClusterEncryptionKey`` row. A key is a byte array converted to     |
|                                                    | base64. It should be either 16, 24, or 32 bytes to select AES-128, AES-192, or AES-256.                                                                          |
|                                                    |                                                                                                                                                                  |
|                                                    | To update the key, one can execute:                                                                                                                              |
|                                                    | ``UPDATE Systems SET Value='<value>' WHERE Name='ClusterEncryptionKey';`` in MySQL and                                                                           |
|                                                    | ``UPDATE systems SET value='<value>' WHERE name='ClusterEncryptionKey'`` for PostgreSQL.                                                                         |
|                                                    |                                                                                                                                                                  |
|                                                    | For any change in this config setting to take effect, the whole cluster must be shut down first. Then the config change made, and then restarted. In a cluster,  |
|                                                    | all servers either will completely use encryption or not. There cannot be any partial usage.                                                                     |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | SAML Setting "Use Improved SAML Library (Beta)" was forcefully disabled. Follow instructions at                                                                  |
|                                                    | https://docs.mattermost.com/deployment/sso-saml-before-you-begin.html for enabling SAML using the feature-equivalent ``xmlsec1`` utility.                        |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | PostgreSQL ended long-term support for `version 9.4 in February 2020 <https://www.postgresql.org/support/versioning>`_. From v5.26 Mattermost officially supports| 
|                                                    | PostgreSQL version 10 as PostgreSQL 9.4 is no longer supported. New installs will require PostgreSQL 10+. Previous Mattermost versions, including our current    |
|                                                    | ESR, will continue to be compatible with PostgreSQL 9.4. PostgreSQL 9.4 and all 9.x versions are now fully deprecated in our v5.30 release (December 16, 2020).  |
|                                                    | Please follow the instructions under the Upgrading Section within `the PostgreSQL documentation <https://www.postgresql.org/support/versioning/>`_.              |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v5.25.0                                            | Some incorrect instructions regarding SAML setup with Active Directory ADFS for setting the “Relying Party Trust Identifier” were corrected. Although the        |
|                                                    | settings will continue to work, it is encouraged that you                                                                                                        |
|                                                    | `modify those settings <https://docs.mattermost.com/deployment/sso-saml-adfs-msws2016.html#add-a-relying-party-trust>`_.                                         | 
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | Disabled the xmlsec1-based SAML library in favor of the re-enabled and improved SAML library.                                                                    |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v5.24.0                                            | A new configuration setting, ``ExtendSessionLengthWithActivity`` automatically extends sessions to keep users logged in if they are active in their Mattermost   |
|                                                    | apps. It is recommended to enable this setting to improve user experience if compliant with your organization's policies.                                        |
|                                                    | `Learn more here <https://mattermost.com/blog/session-expiry-experience>`_.                                                                                      |
|                                                    +----------------------------------------------------+-------------------------------------------------------------------------------------------------------------+
|                                                    | The ``mattermost_http_request_duration_seconds`` histogram metric (in Enterprise Edition) has been removed. This information was already captured by             |
|                                                    | ``mattermost_api_time``, which also contains the API handler name, HTTP method, and the response code.                                                           |
|                                                    |                                                                                                                                                                  |
|                                                    | As an example, if you are using                                                                                                                                  |
|                                                    | ``rate(mattermost_http_request_duration_seconds_sum{server=~"$var"}[5m]) /   rate(mattermost_http_request_duration_seconds_count{server=~"$var"}[5m])``          |
|                                                    | to measure average call duration, it needs to be replaced with                                                                                                   |
|                                                    | ``sum(rate(mattermost_api_time_sum{server=~"$var"}[5m])) by (instance) /   sum(rate(mattermost_api_time_count{server=~"$var"}[5m])) by (instance)``.             |
|                                                    +----------------------------------------------------+-------------------------------------------------------------------------------------------------------------+
|                                                    | Due to fixing performance issues related to emoji reactions, the performance of the upgrade has been affected in that the schema upgrade now takes more time in  |
|                                                    | environments with lots of reactions in their database. These environments are recommended to perform the schema migration during low usage times and potentially |
|                                                    | in advance of the upgrade. Since this migration happens before the Mattermost server is fully launched, non-High Availability installs will be unreachable       |
|                                                    | during this time.                                                                                                                                                |          
|                                                    |                                                                                                                                                                  |
|                                                    | The migration is a single line of SQL and can be applied directly to the database through the MySQL/PSQL command line clients if you prefer to decouple this     |
|                                                    | from restarting the Mattermost server. It is fully backwards compatible so the schema change can be applied to any previous version of Mattermost without issue. |
|                                                    | During the time the schema change is running (~30s per million rows in the Reactions table), if end users attempt to react to posts, the emoji reactions will    | 
|                                                    | not load for end users.                                                                                                                                          |
|                                                    |                                                                                                                                                                  |
|                                                    | MySQL: ``ALTER TABLE Reactions DROP PRIMARY KEY, ADD PRIMARY KEY (PostId, UserId, EmojiName);``                                                                  |
|                                                    |                                                                                                                                                                  |
|                                                    | PostgreSQL: ``ALTER TABLE reactions DROP CONSTRAINT reactions_pkey, ADD PRIMARY KEY (PostId, UserId, EmojiName);``                                               |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+                                                  
|                                                    | On mobile apps, users will not be able to see LDAP group mentions (E20 feature) in the autocomplete dropdown. Users will still receive notifications if they are |
|                                                    | part of an LDAP group. However, the group mention keyword will not be highlighted.                                                                               |  
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | SAML Setting "Use Improved SAML Library (Beta)" was forcefully disabled. Follow instructions at                                                                  |
|                                                    | https://docs.mattermost.com/onboard/sso-saml.html for enabling SAML using the feature-equivalent ``xmlsec1`` utility.                                            |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v5.22.0                                            | Due to fixing performance issues related to emoji reactions, the performance of the upgrade has been affected in that the schema upgrade now takes more time in  |
|                                                    | environments with lots of reactions in their database. These environments are recommended to perform the schema migration during low usage times and potentially |
|                                                    | in advance of the upgrade. Since this migration happens before the Mattermost server is fully launched, non-High Availability installs will be unreachable       |
|                                                    | during this time.                                                                                                                                                |          
|                                                    |                                                                                                                                                                  |
|                                                    | The migration is a single line of SQL and can be applied directly to the database through the MySQL/PSQL command line clients if you prefer to decouple this     |
|                                                    | from restarting the Mattermost server. It is fully backwards compatible so the schema change can be applied to any previous version of Mattermost without issue. |
|                                                    | During the time the schema change is running (~30s per million rows in the Reactions table), if end users attempt to react to posts, the emoji reactions will    | 
|                                                    | not load for end users.                                                                                                                                          |
|                                                    |                                                                                                                                                                  |
|                                                    | MySQL: ``ALTER TABLE Reactions DROP PRIMARY KEY, ADD PRIMARY KEY (PostId, UserId, EmojiName);``                                                                  |
|                                                    |                                                                                                                                                                  |
|                                                    | Postgres: ``ALTER TABLE reactions DROP CONSTRAINT reactions_pkey, ADD PRIMARY KEY (PostId, UserId, EmojiName);``                                                 |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | The Channel Moderation Settings feature is supported on mobile app versions v1.30 and later. In earlier versions of the mobile app, users who attempt to post or |
|                                                    | react to posts without proper permissions will see an error.                                                                                                     |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | Direct access to the ``Props`` field in the ``model.Post`` structure has been deprecated. The available ``GetProps()`` and ``SetProps()`` methods should now be  |
|                                                    | used. Also, direct copy of the ``model.Post`` structure must be avoided in favor of the provided ``Clone()`` method.                                             |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | SAML Setting "Use Improved SAML Library (Beta)" was forcefully disabled. Follow instructions at                                                                  |
|                                                    | https://docs.mattermost.com/onboard/sso-saml.html for enabling SAML using the feature-equivalent ``xmlsec1`` utility.                                            |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v5.21.0                                            | Honour key value expiry in KVCompareAndSet, KVCompareAndDelete, and KVList. We also improved handling of plugin key value race conditions and deleted keys in    |
|                                                    | Postgres.                                                                                                                                                        |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | SAML Setting "Use Improved SAML Library (Beta)" was forcefully disabled. Follow instructions at                                                                  |
|                                                    | https://docs.mattermost.com/onboard/sso-saml.html for enabling SAML using the feature-equivalent ``xmlsec1`` utility.                                            |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v5.20.0                                            | Any `pre-packaged plugin <https://developers.mattermost.com/integrate/admin-guide/admin-plugins-beta/#pre-packaged-plugins>`_                                    |
|                                                    | that is not enabled in the ``config.json`` will no longer install automatically, but can continue to be installed via the                                        |
|                                                    | `Plugin Marketplace <https://developers.mattermost.com/integrate/admin-guide/admin-plugins-beta/#plugin-marketplace>`_.                                          | 
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | Boolean elements from interactive dialogs are no longer serialized as strings. While we try to avoid breaking changes, this change was necessary to allow        |
|                                                    | both the web and mobile apps to work with the boolean elements introduced with v5.16.                                                                            |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v5.19.0                                            | ``LockTeammateNameDisplay`` setting was moved to Enterprise Edition E20 as it was erroneously available in Team Edition and Enterprise Edition E10.              |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v5.18.0                                            | Marking a post unread from the mobile app requires v1.26 or later. If using v5.18, but mobile is on v1.25 or earlier, marking a post unread from webapp/desktop  |
|                                                    | will only be reflected on mobile the next time the app launches or is brought to the foreground.                                                                 |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | The Go module path of ``mattermost-server`` was changed to comply with the Go module version specification. Developers using Go modules with                     |
|                                                    | ``mattermost-server`` as a dependency must change the module and import paths to ``github.com/mattermost/mattermost-server/v5`` when upgrade this dependency     |
|                                                    | to `v5.18`. See `<https://blog.golang.org/v2-go-modules>`__ for further information.                                                                             |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | Removed ``Team.InviteId`` from the related Websocket event and sanitized it on all team API endpoints for users without invite permissions.                      |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | Removed the ability to change the type of a channel using the ``PUT /channels/{channel_id}`` API endpoint. The new ``PUT /channels/{channel_id}/privacy``        |
|                                                    | endpoint should be used for that purpose.                                                                                                                        |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v5.16.0                                            | Support for Internet Explorer (IE11) is removed. See                                                                                                             |
|                                                    | `this forum post <https://forum.mattermost.com/t/mattermost-is-dropping-support-for-internet-explorer-ie11-in-v5-16/7575>`__ to learn more.                      |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | The `Mattermost Desktop v4.3.0 <https://github.com/mattermost/desktop/blob/master/CHANGELOG.md>`_ release includes a change to how desktop notifications are sent|
|                                                    | from non-secure URLs (http://). Organizations using non-secure Mattermost Servers (http://) will need to update to Mattermost Server versions 5.16.0+, 5.15.1,   |
|                                                    | 5.14.4 or 5.9.5 (ESR) to continue receiving desktop notifications when using Mattermost Desktop v4.3.0 or later.                                                 | 
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | When enabling `Guest Accounts <https://docs.mattermost.com/deployment/guest-accounts.html>`_, all users who have the ability to invite users will be able to     |
|                                                    | invite guests by default. System Admins will need to remove this permission on each role via **System Console > Permissions Schemes**.  In Mattermost Server     |
|                                                    | version 5.17, the System Admin will be the only role to automatically get the invite guest permission, however the fix will not be applicable in 5.16 due to     |
|                                                    | database migration processes.                                                                                                                                    |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v5.14.0                                            | Webhooks are now only displayed if the user is the creator of the webhook or a System Administrator.                                                             |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | With the update from Google+ to Google People, system admins need to ensure the ``GoogleSettings.Scope`` config.json setting is set to ``profile email`` and     |
|                                                    | ``UserAPIEndpoint`` setting should be set to ``https://people.googleapis.com/v1/people/me?personFields=names,emailAddresses,nicknames,metadata`` per             |
|                                                    | `updated documentation <https://docs.mattermost.com/deployment/sso-google.html>`_.                                                                               |              
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v5.12.0                                            | If your plugin uses the ``DeleteEphemeralMessage`` plugin API, update it to accept a ``postId string`` parameter.                                                |
|                                                    | See `documentation <https://developers.mattermost.com/extend/plugins/server/reference/#API.DeleteEphemeralPost>`_ to learn more.                                 |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+                               
|                                                    | Image link and YouTube previews do not display unless **System Console > Enable Link Previews** is enabled. Please ensure that your Mattermost server is         |
|                                                    | connected to the internet and has network access to the websites from which previews are expected to appear.                                                     |
|                                                    | `Learn more here <https://forum.mattermost.com/t/link-previews-managed-server-side-in-v5-12-and-later/7712>`_.                                                   | 
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | ``ExperimentalEnablePostMetadata`` setting was removed. Post metadata, including post dimensions, is now stored in the database to correct scroll position and   |
|                                                    | eliminate scroll jumps as content loads in a channel.                                                                                                            |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | Added the ability to enforce the administration of teams/channels with Group Sync. If Group Sync is enabled, all Team and Channel Admin designations will be     |
|                                                    | lost upon upgrade. It is highly recommended that prior to upgrading, Team and Channel Admins are added to admin-specific LDAP groups corresponding to their      |
|                                                    | teams and channels. After upgrading, those groups will need to be role-synced to the Team or Channel Admin role.                                                 |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v5.11.0                                            | If your integration uses ``Update.Props == nil`` to clear ``Props``, this will no longer work in 5.11+. Instead, use ``Update.Props == {}`` to clear properties. |
|                                                    |                                                                                                                                                                  |
|                                                    | This change was made because ``Update.Props == nil`` unintentionally cleared all ``Props``, such as the profile picture, instead of preserving them.             |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v5.10.0                                            | ``SupportedTimezonesPath`` setting in config.json and changes to timezones in the UI based on the ``timezones.json`` file was removed. This was made to support  |
|                                                    | `storing configurations in the database <https://docs.mattermost.com/administration/config-in-database.html#configuration-in-the-mattermost-database>`_.         |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v5.9.0                                             | If ``DisableLegacyMfa`` setting in ``config.json`` is set to ``true`` and `multi-factor authentication <https://docs.mattermost.com/deployment/auth.html>`_ is   |
|                                                    | enabled, ensure your users have upgraded to mobile app version 1.17 or later. Otherwise, users who have MFA enabled may not be able to log in successfully.      |
|                                                    |                                                                                                                                                                  |
|                                                    | If the setting is not defined in the ``config.json`` file, the ``DisableLegacyMfa`` setting is set to ``false`` by default to ensure no breaking changes.        |
|                                                    |                                                                                                                                                                  |
|                                                    | We recommend setting ``DisableLegacyMfa`` to ``true`` for additional security hardening.                                                                         |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | The public IP of the Mattermost application server is considered a reserved IP for additional security hardening in the context of untrusted external requests   |
|                                                    | such as Open Graph metadata, webhooks, or slash commands.                                                                                                        |
|                                                    | `See documentation <https://docs.mattermost.com/administration/config-settings.html#allow-untrusted-internal-connections-to>`_ for additional information.       |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v5.8.0                                             | The local image proxy has been added, and images displayed within the client are now affected by the ``AllowUntrustedInternalConnections`` setting.              |
|                                                    | `See documentation <https://docs.mattermost.com/administration/image-proxy.html#local-image-proxy>`_ for more details if you have trouble loading images.        |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v5.6.0                                             | Built-in WebRTC is removed. See `here for more details <https://forum.mattermost.com/t/built-in-webrtc-video-and-audio-calls-removed-in-v5-6-                    | 
|                                                    | in-favor-of-open-source-plugins/5998>`__.                                                                                                                        |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | If ``EnablePublicChannelsMaterialization`` setting in ``config.json`` is set to ``false``, an offline migration prior to upgrade may be required to synchronize  |
|                                                    | the materialized table for public channels to increase channel search performance in the channel switcher (CTRL/CMD+K), channel autocomplete (~), and elsewhere  |
|                                                    | in the UI. Use the following steps:                                                                                                                              |
|                                                    |                                                                                                                                                                  |
|                                                    | 1. Shut down your application servers.                                                                                                                           |
|                                                    | 2. Connect to your Mattermost database.                                                                                                                          |
|                                                    | 3. Execute the following queries:                                                                                                                                |
|                                                    |                                                                                                                                                                  |
|                                                    | .. code-block:: SQL                                                                                                                                              |
|                                                    |                                                                                                                                                                  |
|                                                    |   DELETE FROM PublicChannels;                                                                                                                                    |
|                                                    |   INSERT INTO PublicChannels                                                                                                                                     |
|                                                    |       (Id, DeleteAt, TeamId, DisplayName, Name, Header, Purpose)                                                                                                 |
|                                                    |   SELECT                                                                                                                                                         |
|                                                    |       c.Id, c.DeleteAt, c.TeamId, c.DisplayName, c.Name, c.Header, c.Purpose                                                                                     |
|                                                    |   FROM                                                                                                                                                           |
|                                                    |       Channels c                                                                                                                                                 |
|                                                    |   WHERE                                                                                                                                                          |
|                                                    |       c.Type = 'O';                                                                                                                                              |
|                                                    |                                                                                                                                                                  |
|                                                    | The queries above rebuild the materialized ``PublicChannels`` table without modifying the authoritative ``Channels`` table.                                      |
|                                                    |                                                                                                                                                                  |
|                                                    | Note that this migration is not required if the experimental ``PublicChannels`` feature was never disabled. This feature launched in Mattermost v5.4 with a      |
|                                                    | temporary flag to disable should an issue arise, but nothing prompted doing so. If you did not modify this setting, there is no need to perform this migration.  |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v5.4.0                                             | Mattermost mobile app version 1.13+ is required. File uploads will fail on earlier mobile app versions.                                                          |                                        
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | In certain upgrade scenarios the new **Allow Team Administrators to edit others posts** setting under **General** then **Users and Teams** may be                |
|                                                    | set to **True** while the Mattermost default in 5.1 and earlier and with new 5.4+ installations is **False**.                                                    |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v5.3.0                                             | Those servers with Elasticsearch enabled will notice that hashtag search is case-sensitive.                                                                      |                                        
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v5.2.0                                             | Those servers upgrading from v4.1 - v4.4 directly to v5.2 or later and have Jira enabled will need to re-enable the Jira plugin after an upgrade.                |                                        
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v5.1.0                                             | ``mattermost export`` CLI command is renamed to ``mattermost export schedule``. Make sure to update your scripts if you use this command.                        |                                        
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v5.0.0                                             | All API v3 endpoints are removed. `See documentation <https://api.mattermost.com/#tag/APIv3-Deprecation>`__ to learn how to migrate your integrations to API v4. |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | ``platform`` binary is renamed to ``mattermost`` for a clearer install and upgrade experience. You should point your ``systemd`` service file at the new         |
|                                                    | ``mattermost`` binary. All command line tools, including the bulk loading tool and developer tools, are also be renamed from ``platform`` to ``mattermost``.     |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | A Mattermost user setting to configure desktop notification duration in **Account Settings > Notifications > Desktop Notifications** is removed.                 |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | Slash commands configured to receive a GET request will have the payload being encoded in the query string instead of receiving it in the body of the request,   |
|                                                    | consistent with standard HTTP requests. Although unlikely, this could break custom slash commands that use GET requests incorrectly.                             |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | A new ``config.json`` setting to whitelist types of protocols for auto-linking will be added.                                                                    |
|                                                    | If you rely on custom protocols auto-linking in Mattermost, whitelist them in ``config.json`` before upgrading.                                                  |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | A new ``config.json`` setting to disable the `permanent APIv4 delete team parameter                                                                              |
|                                                    | <https://api.mattermost.com/#tag/teams%2Fpaths%2F~1teams~1%7Bteam_id%7D%2Fput>`__ is added. The setting will be off by default for all new and existing          |
|                                                    | installs, except those deployed on GitLab Omnibus. If you reply on the APIv4 parameter, enable the setting in ``config.json`` before upgrading.                  |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | An unused ``ExtraUpdateAt`` field will be removed from the channel modal.                                                                                        |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | This release includes support for post messages longer than the default of 4000 characters, but may require a manual database migration. This migration is       |
|                                                    | entirely optional, and need only be done if you want to enable post messages up to 16383 characters. For many installations, no migration will be required, or   |
|                                                    | the old limit remains sufficient.                                                                                                                                |
|                                                    |                                                                                                                                                                  |
|                                                    | To check your current post limit after upgrading to 5.0.0, look for a log message on startup:                                                                    |
|                                                    |                                                                                                                                                                  |
|                                                    |     [2018/03/27 09:08:00 EDT] [INFO] Post.Message supports at most 16383 characters (65535 bytes)                                                                |
|                                                    |                                                                                                                                                                  |
|                                                    | As of 5.0.0, the maximum post message size is 16383 (multi-byte) characters. If your logs show a number less than this limit and you want to enable longer       |
|                                                    | post messages, you will need to manually migrate your database as described below. This migration can be slow for larger ``Posts`` tables, so it's best to       |
|                                                    | schedule this upgrade during off-peak hours.                                                                                                                     |
|                                                    |                                                                                                                                                                  |
|                                                    | To migrate a MySQL database, connect to your database and run the following:                                                                                     |
|                                                    |                                                                                                                                                                  |
|                                                    |   ALTER TABLE Posts MODIFY COLUMN Message TEXT;                                                                                                                  |
|                                                    |                                                                                                                                                                  |
|                                                    | To migrate a PostgreSQL database, connect to your database and run the following:                                                                                |
|                                                    |                                                                                                                                                                  |
|                                                    |   ALTER TABLE Posts ALTER COLUMN Message TYPE VARCHAR(65535);                                                                                                    |
|                                                    |                                                                                                                                                                  |
|                                                    | Restart your Mattermost instances.                                                                                                                               |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | Deployments on Enterprise E20 will need to enable ``RunJobs`` in the ``config.json`` and allow the permissions migration to complete before using `Team          |
|                                                    | Override Schemes <https://docs.mattermost.com/deployment/advanced-permissions.html>`__.                                                                          |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v4.10.0                                            | Old email invitation links will no longer work due to a bug fix where teams could be re-joined via the link.                                                     |
|                                                    | Team invite links copied from the Team Invite Link dialog, password reset links and email verification links are not affected and are still valid.               |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | Server logs written to **System Console > Logs** and to the ``mattermost.log`` file specified in **System Console > Logging > File Log Directory**               |
|                                                    | now use JSON formatting. If you have built a tool that parses the server logs and sends them to an external system, make sure it supports the JSON format.       |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | Team icons with transparency will be filled with a white background in the Team sidebar.                                                                         |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | Those servers with SAML authentication enabled should upgrade during non-peak hours. SAML email addresses are migrated to lowercase to prevent login issues,     |
|                                                    | which could result in longer than usual upgrade time.                                                                                                            |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | If you use PostgreSQL database and the password contains special characters (e.g. ``[]``), escape them in your password, e.g., xxx[]xxx will be xxx%5B%5Dxxx.    |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v4.9.0                                             | To improve the production use of Mattermost with Docker, the Docker image is now running a as non-root user and listening on port 8000. Please read the          |
|                                                    | `upgrade instructions <https://github.com/mattermost/mattermost-docker#upgrading-mattermost-to-49>`__ for important changes to existing installations.           |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | Several configuration settings have been migrated to roles in the database and changing their ``config.json`` values no longer takes effect. These permissions   |
|                                                    | can still be modified by their respective System Console settings as before. The affected ``config.json`` settings are:                                          |
|                                                    |                                                                                                                                                                  |
|                                                    | ``RestrictPublicChannelManagement``,                                                                                                                             |
|                                                    | ``RestrictPrivateChannelManagement``,                                                                                                                            |
|                                                    | ``RestrictPublicChannelCreation``,                                                                                                                               |
|                                                    | ``RestrictPrivateChannelCreation``,                                                                                                                              |
|                                                    | ``RestrictPublicChannelDeletion``,                                                                                                                               |
|                                                    | ``RestrictPrivateChannelDeletion``,                                                                                                                              |
|                                                    | ``RestrictPrivateChannelManageMembers``,                                                                                                                         |
|                                                    | ``EnableTeamCreation``,                                                                                                                                          |
|                                                    | ``EnableOnlyAdminIntegrations``,                                                                                                                                 |
|                                                    | ``RestrictPostDelete``,                                                                                                                                          |
|                                                    | ``AllowEditPost``,                                                                                                                                               |
|                                                    | ``RestrictTeamInvite``,                                                                                                                                          |
|                                                    | ``RestrictCustomEmojiCreation``.                                                                                                                                 |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | The behavior of the ``config.json`` setting ``PostEditTimeLimit`` has been updated to accommodate the migration to a roles based permission system.              |
|                                                    | When post editing is permitted, set ``"PostEditTimeLimit": -1`` to allow editing anytime, or set ``"PostEditTimeLimit"`` to a positive integer to restrict       | 
|                                                    | editing time in seconds. If post editing is disabled, this setting does not apply.                                                                               |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | If using Let's Encrypt without a proxy server, the server will fail to start with an error message unless the `Forward80To443                                    |
|                                                    | <https://docs.mattermost.com/administration/config-settings.html#forward-port-80-to-443>`__ ``config.json`` setting is set to ``true``.                          |
|                                                    |                                                                                                                                                                  |
|                                                    | If forwarding port 80 to 443, the server will fail to start with an error message unless the `ListenAddress                                                      |
|                                                    | <https://docs.mattermost.com/administration/config-settings.html#listen-address>`__ ``config.json`` setting is set to listen on port 443.                        |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v4.6.2                                             | If using Let's Encrypt without a proxy server, forward port 80 through a firewall, with the `Forward80To443                                                      |
|                                                    | <https://docs.mattermost.com/administration/config-settings.html#forward-port-80-to-443>`__ ``config.json`` setting set to ``true`` to complete the Let's        |
|                                                    | Encrypt certification.                                                                                                                                           |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v4.4.0                                             | Composite database indexes were added to the ``Posts`` table. This may lead to longer upgrade times for servers with more than one million messages.             |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | LDAP sync now depends on email. Make sure all users on your AD/LDAP server have an email address or that their account is deactivated in Mattermost.             |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v4.2.0                                             | Mattermost now handles multiple content types for integrations, including plaintext content type. If your integration suddenly prints the JSON payload data      |
|                                                    | instead of rendering the generated message, make sure your integration is returning the ``application/json`` content-type to retain previous behavior.           |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | By default, user-supplied URLs such as those used for Open Graph metadata, webhooks, or slash commands will no longer be allowed to connect to reserved IP       |
|                                                    | addresses including loopback or link-local addresses used for internal networks.                                                                                 |
|                                                    |                                                                                                                                                                  |
|                                                    | This change may cause private integrations to break in testing environments, which may point to a URL such as http://127.0.0.1:1021/my-command.                  |
|                                                    |                                                                                                                                                                  |
|                                                    | If you point private integrations to such URLs, you may whitelist such domains, IP addresses, or CIDR notations via the                                          |
|                                                    | `AllowedUntrustedInternalConnections config setting <https://docs.mattermost.com/administration/config-settings.html#allow-untrusted-internal-connections-to>`__ |
|                                                    | in your local environment. Although not recommended, you may also whitelist the addresses in your production environments. See                                   |
|                                                    | `documentation to learn more <https://docs.mattermost.com/administration/config-settings.html#allow-untrusted-internal-connections-to>`__.                       |
|                                                    |                                                                                                                                                                  |
|                                                    | Push notification, OAuth 2.0 and WebRTC server URLs are trusted and not affected by this setting.                                                                |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | Uploaded file attachments are now grouped by day and stored in ``/data/<date-of-upload-as-YYYYMMDD>/teams/...`` of your file storage system.                     |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | Mattermost `/platform`` repo has been separated to ``/mattermost-webapp`` and ``/mattermost-server``. This may affect you if you have a private fork of the      |
|                                                    | ``/platform`` repo. `More details here <https://forum.mattermost.com/t/mattermost-separating-platform-into-two-repositories-on-september-6th/3708>`__.           |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v4.0.0                                             | (High Availability only)                                                                                                                                         |
|                                                    |                                                                                                                                                                  |
|                                                    | You must manually add new items to the ``ClusterSettings`` section of your existing ``config.json``.                                                             |
|                                                    | See the *Upgrading to Version 4.0 and Later* section of :doc:`../scale/high-availability-cluster` for details.                                                   |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v3.9.0                                             | Old email invitation links, password reset links, and email verification links will no longer work due to a security change.                                     |
|                                                    | Team invite links copied from the Team Invite Link dialog are not affected and are still valid.                                                                  |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v3.8.0                                             | A change is required in the proxy configuration.                                                                                                                 |
|                                                    | If you’re using NGINX:                                                                                                                                           |
|                                                    |                                                                                                                                                                  |
|                                                    |   1. Open the NGINX configuration file as root. The file is usually ``/etc/nginx/sites-available/mattermost`` but might be different on your system.             |
|                                                    |   2. Locate the line: ``location /api/v3/users/websocket {``                                                                                                     |
|                                                    |   3. Replace the line with ``location ~ /api/v[0-9]+/(users/)?websocket$ {``                                                                                     |
|                                                    |                                                                                                                                                                  |
|                                                    | If you are using a proxy other than NGINX, make the equivalent change to that proxy's configuration.                                                             |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | You need to verify settings in the System Console due to a security-related change.                                                                              |
|                                                    |                                                                                                                                                                  |
|                                                    |   1. Go to the the GENERAL section of the System Console                                                                                                         |
|                                                    |   2. Click **Logging**                                                                                                                                           |
|                                                    |   3. Make sure that the **File Log Directory** field is either empty or has a directory path only. It must not have a filename as part of the path.              |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | Backwards compatibility with the old CLI tool was removed. If you have any scripts that rely on the old CLI, they must be revised to use the                     |
|                                                    | `new CLI  <../administration/command-line-tools.html>`__.                                                                                                        |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v3.6.0                                             | Update the maximum number of files that can be open.                                                                                                             |
|                                                    |                                                                                                                                                                  |
|                                                    | On RHEL6 and Ubuntu 14.04:                                                                                                                                       |
|                                                    |   - Verify that the line ``limit nofile 50000 50000`` is included in the ``/etc/init/mattermost.conf`` file.                                                     |
|                                                    | On RHEL7 and Ubuntu 16.04:                                                                                                                                       |
|                                                    |   - Verify that the line ``LimitNOFILE=49152`` is included in the ``/etc/systemd/system/mattermost.service`` file.                                               |
|                                                    +------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                    | (Enterprise Only)                                                                                                                                                |
|                                                    |                                                                                                                                                                  |
|                                                    | Previous ``config.json`` values for restricting Public and Private channel management will be used as the default values for new settings for restricting        |
|                                                    | Public and Private channel creation and deletion.                                                                                                                |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v3.4.0                                             | If public links are enabled, existing public links will no longer be valid. This is because in earlier versions, existing public links were not invalidated      |
|                                                    | when the Public Link Salt was regenerated. You must update any place where you have published these links.                                                       |
+----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+

source/upgrade/extended-support-release.rst METASEP
Extended Support Release
========================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

What is an Extended Support Release?
------------------------------------

During each monthly release, Mattermost backports high severity or high impact security fixes to the previous three monthly releases. Extended Support Releases (ESRs) are releases that will receive backports for security fixes and major bug fixes for the length of their life cycle.

.. important::
  Support for Mattermost Server v6.3 Extended Support Release is coming to the end of its life cycle on October 15, 2022. Upgrading to Mattermost Server v7.1 Extended Support Release or later is recommended.

What is the life cycle of an Extended Support Release?
------------------------------------------------------

Mattermost provides an ESR when a significant number of new features and improvements have been added to the product, and have had sufficient time to stabilize. A new ESR is released twice a year, every January and July release. An ESR is supported for nine months to provide customers with enough time to test and upgrade to the next ESR.

When an ESR is at the end of its life cycle, there will be announcements ahead of time to provide time for people to test, certify, and deploy a newer ESR version before support ends. There will be a clear upgrade path provided between ESR versions. 

After a release reaches its end-of-life, no further updates will be provided for that version.

Please see `Release Lifecycle documentation <https://docs.mattermost.com/upgrade/release-lifecycle.html>`_ for full list of lifecycles for each Mattermost release.

To receive updates about Extended Support Releases, sign up for our mailing list `here <https://eepurl.com/dCKn2P>`__.

.. image:: ../images/esr.graphic.2.png
   :alt: Timeline-based chart showing the lifecycle of Mattermost Extended Support Releases and feature releases from last year and this year.

What is included in an Extended Support Release dot release? 
------------------------------------------------------------

Dot releases for ESR versions will contain high severity or high impact security fixes and bug fixes. They will not include changes to product functionality or new features. 

Who should use an Extended Support Release? 
-------------------------------------------

ESRs are intended for organizations who value stability over having the newest features and improvements, or who have a long internal testing and certification process to undergo when upgrading.

If your organization prefers to have the newest features and improvements, Extended Support Releases may not be the best fit for you.

How do I install the Extended Support Release?
----------------------------------------------

Follow our normal `install <https://docs.mattermost.com/guides/deployment.html#install-guides>`__ or `upgrade <https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html>`__ guides. Please follow the `important upgrade notes <https://docs.mattermost.com/upgrade/important-upgrade-notes.html>`_ for all the versions since the current ESR version you have currently installed. Please also see `the changelog <https://docs.mattermost.com/install/self-managed-changelog.html>`_ for list of database, API and config.json updates for each release.

When downloading the Mattermost version, choose an Extended Support Release from the list below.

What are the current supported Extended Support Release versions? 
-----------------------------------------------------------------

+-------------+----------------+------------------+------------------+--------------------------------------------------------------------------------------------+-----------------------------------------------------+
| Version     | Type           | Release Date     | End of Support   | Latest Dot Release Download link                                                           | Upgrade Notes                                       |
+=============+================+==================+==================+============================================================================================+=====================================================+
| 7.1         | Feature        | July 15, 2022    | April 15, 2023   | `7.1.3 <https://releases.mattermost.com/7.1.3/mattermost-7.1.3-linux-amd64.tar.gz>`_       |                                                     |
+-------------+----------------+------------------+------------------+--------------------------------------------------------------------------------------------+-----------------------------------------------------+
| 6.3         | Feature        | January 16, 2022 | October 15, 2022 | `6.3.10 <https://releases.mattermost.com/6.3.10/mattermost-6.3.10-linux-amd64.tar.gz>`_    |                                                     |
+-------------+----------------+------------------+------------------+--------------------------------------------------------------------------------------------+-----------------------------------------------------+
| 5.37        | Feature        | July 16, 2021    | April 15, 2022   | `5.37.10 <https://releases.mattermost.com/5.37.10/mattermost-5.37.10-linux-amd64.tar.gz>`_ |                                                     |
+-------------+----------------+------------------+------------------+--------------------------------------------------------------------------------------------+-----------------------------------------------------+
| 5.31        | Feature        | January 16, 2021 | October 15, 2021 | `5.31.9 <https://releases.mattermost.com/5.31.9/mattermost-5.31.9-linux-amd64.tar.gz>`_    |                                                     |
+-------------+----------------+------------------+------------------+--------------------------------------------------------------------------------------------+-----------------------------------------------------+
| 5.25        | Quality        | July 16, 2020    | April 15, 2021   | `5.25.7 <https://releases.mattermost.com/5.25.7/mattermost-5.25.7-linux-amd64.tar.gz>`_    | The xmlsec1-based SAML library was disabled in      |
|             |                |                  |                  |                                                                                            | favor of the re-enabled and improved SAML library   |
+-------------+----------------+------------------+------------------+--------------------------------------------------------------------------------------------+-----------------------------------------------------+
| 5.19        | Quality        | January 16, 2020 | October 15, 2020 | `5.19.3 <https://releases.mattermost.com/5.19.3/mattermost-5.19.3-linux-amd64.tar.gz>`_    |                                                     |
+-------------+----------------+------------------+------------------+--------------------------------------------------------------------------------------------+-----------------------------------------------------+
| 5.9         | Quality        | April 16, 2019   | April 15, 2020   | `5.9.8 <https://releases.mattermost.com/5.9.8/mattermost-5.9.8-linux-amd64.tar.gz>`_       | Please upgrade to 5.0 prior to upgrading to 5.9     |
+-------------+----------------+------------------+------------------+--------------------------------------------------------------------------------------------+-----------------------------------------------------+
| 4.10        | Quality        | May 16, 2018     | July 15, 2019    | `4.10.10 <https://releases.mattermost.com/4.10.10/mattermost-4.10.10-linux-amd64.tar.gz>`_ |                                                     |
+-------------+----------------+------------------+------------------+--------------------------------------------------------------------------------------------+-----------------------------------------------------+

How do I restore a previous Extended Support Release?
-----------------------------------------------------

Before you perform an upgrade, please ensure you have done a full back up of your current version.  You can restore the database and previous version if you need to revert an upgrade.  Please note that previous ESR versions are subject to an end of support date.

Why is an Extended Support Release supported for nine months and not longer?
----------------------------------------------------------------------------

We chose nine months because the overhead for maintaining an ESR is high (and becomes higher the longer the support window is).
If we increase the support window, it decreases how much we can develop the product. We specifically chose "ESR" instead of "LTS", since it is not intended to be a multi-year long term support release. The nine months support timeframe will not be extended in any case.

Can customers pay for extended support?
---------------------------------------

At this point, we are not planning on letting customers pay for extended support, but we are open to discuss options for this. Please speak to your Customer Success Manager if you have additional requirements for extended support.

How do we notify customers about new and deprecated Extended Support Releases?
------------------------------------------------------------------------------

For a new upcoming ESR, we send out an email announcement on or close to release day. We also add a reminder on our release announcement, changelog, and via a Forum post (`see example <https://forum.mattermost.com/t/upcoming-extended-support-release-updates/8526>`_).

For a deprecated ESR, we send out an email announcement three months in advance. We also add reminders on our release announcements, changelogs, `important upgrade notes <https://docs.mattermost.com/upgrade/important-upgrade-notes.html>`_, and our `Forum site <https://forum.mattermost.com/>`_.

To receive updates about Extended Support Releases, sign up for our mailing list `here <https://eepurl.com/dCKn2P>`_.

If we upgrade Mobile or Desktop Apps before we upgrade to the latest ESR, will we have compatibility issues?
------------------------------------------------------------------------------------------------------------

Mattermost Desktop and Mobile Apps must be used with the latest Extended Support Release or a newer version of Mattermost Server.

What Mobile and Desktop App versions are compatible with the latest ESR?
-------------------------------------------------------------------------

Earlier 4.x versions of Mattermost Desktop App and earlier v1.x versions of the Mobile App are backwards compatible and are supported with our supported Extended Support Releases. However, for an optimal user experience and for latest security fixes, we strongly recommend upgrading both your Mattermost Desktop and Mobile Apps to the latest version.

Please review the `Desktop App changelog <https://docs.mattermost.com/install/desktop-app-changelog.html>`_ and the `Mobile App changelog <https://docs.mattermost.com/deploy/mobile-app-changelog.html>`_ notes for any self-hosted version requirements for features and functionalities, as well as notes on security fixes.

+-------------+------------------+-----------------------------------------+----------------------------------------+
| ESR Version | Release Date     | Desktop App Minimum Supported Version   | Mobile App Minimum Supported Version   |
+=============+==================+=========================================+========================================+
| 7.1         | July 15, 2022    | 5.1.0                                   | 1.54.0                                 |
+-------------+------------------+-----------------------------------------+----------------------------------------+
| 6.3         | January 16, 2022 | 5.0.0                                   | 1.48.0                                 |
+-------------+------------------+-----------------------------------------+----------------------------------------+
| 5.37        | July 16, 2021    | 4.7.0                                   | 1.45.0                                 |
+-------------+------------------+-----------------------------------------+----------------------------------------+

See more details in our `release lifecycle documentation <https://docs.mattermost.com/upgrade/release-lifecycle.html#desktop-and-mobile-app-server-compatibility>`_.

source/upgrade/downgrading-mattermost-server.rst METASEP
Downgrade Mattermost Server
===========================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

In most cases you can downgrade Mattermost Server using the same steps as :doc:`upgrading-mattermost-server`. The binaries can be found in the :doc:`version-archive`. We do not recommend downgrading more than one version back from your current installation.

Downgrade from v6.0 to v5.38
-----------------------------

Run the following set of queries, specific to your database, to downgrade the schema from v6.0 to v5.38.

.. important::

  The performance impact of a downgrade from v6.0 is similar to the v6.0 database migration. See the `Upgrading Mattermost Server <https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html#preparing-to-upgrade-to-the-latest-version>`__ documentation for details.

.. tabs::

  .. tab:: MySQL

    .. code-block:: sh
     
        INSERT INTO Systems (Name,Value) VALUES ('Version','5.38.0') ON DUPLICATE KEY UPDATE Value = '5.38.0';

        CREATE INDEX idx_status_status ON Status (Status);
        DROP INDEX idx_status_status_dndendtime ON Status;
        CREATE INDEX idx_channelmembers_user_id ON ChannelMembers (UserId);
        DROP INDEX idx_channelmembers_channel_id_scheme_guest_user_id ON ChannelMembers;
        DROP INDEX idx_channelmembers_user_id_channel_id_last_viewed_at ON ChannelMembers;
        CREATE INDEX idx_threads_channel_id ON Threads (ChannelId);
        DROP INDEX idx_threads_channel_id_last_reply_at ON Threads;
        CREATE INDEX idx_channels_team_id ON Channels (TeamId);
        DROP INDEX idx_channels_team_id_type ON Channels;
        DROP INDEX idx_channels_team_id_display_name ON Channels;
        CREATE INDEX idx_posts_root_id ON Posts (RootId);
        DROP INDEX idx_posts_root_id_delete_at ON Posts;

        ALTER TABLE CommandWebhooks ADD COLUMN ParentId varchar(26);
        UPDATE CommandWebhooks SET ParentId = '';
        ALTER TABLE Posts ADD COLUMN ParentId varchar(26);
        UPDATE Posts SET ParentId = '';

        ALTER TABLE Users MODIFY Timezone text;
        ALTER TABLE Users MODIFY NotifyProps text;
        ALTER TABLE Users MODIFY Props text;
        ALTER TABLE Threads MODIFY Participants longtext;
        ALTER TABLE Sessions MODIFY Props text;
        ALTER TABLE Posts MODIFY Props text;
        ALTER TABLE Jobs MODIFY Data text;
        ALTER TABLE LinkMetadata MODIFY Data text;
        ALTER TABLE ChannelMembers MODIFY NotifyProps text;

    .. note:: 
      
        The inverse of `the final v6.0 upgrade query <https://gist.github.com/streamer45/59b3582118913d4fc5e8ff81ea78b055#mysql-1>`__ is intentionally omitted from these downgrade queries because its result is backwards compatible, and running the query would unnecessarily delay the downgrade process.

  .. tab:: PostgreSQL

    .. code-block:: sh

        INSERT INTO Systems (Name,Value) VALUES ('Version','5.38.0') ON CONFLICT (name) DO UPDATE SET Value = '5.38.0';

        CREATE INDEX idx_status_status ON Status (Status);
        DROP INDEX idx_status_status_dndendtime;
        CREATE INDEX idx_channelmembers_user_id ON ChannelMembers (UserId);
        DROP INDEX idx_channelmembers_user_id_channel_id_last_viewed_at;
        DROP INDEX idx_channelmembers_channel_id_scheme_guest_user_id;
        CREATE INDEX idx_threads_channel_id ON Threads (ChannelId);
        DROP INDEX idx_threads_channel_id_last_reply_at;
        CREATE INDEX idx_channels_team_id ON Channels (TeamId);
        DROP INDEX idx_channels_team_id_type;
        DROP INDEX idx_channels_team_id_display_name;
        CREATE INDEX idx_posts_root_id ON Posts (RootId);
        DROP INDEX idx_posts_root_id_delete_at;

        ALTER TABLE CommandWebhooks ADD COLUMN ParentId varchar(26);
        UPDATE CommandWebhooks SET ParentId = '';
        ALTER TABLE Posts ADD COLUMN ParentId varchar(26);
        UPDATE Posts SET ParentId = '';

        ALTER TABLE users ALTER COLUMN timezone TYPE varchar(256);
        ALTER TABLE users ALTER COLUMN notifyprops TYPE varchar(2000);
        ALTER TABLE users ALTER COLUMN props TYPE varchar(4000);
        ALTER TABLE threads ALTER COLUMN participants TYPE text;
        ALTER TABLE sessions ALTER COLUMN props TYPE varchar(1000);
        ALTER TABLE posts ALTER COLUMN props TYPE varchar(8000);
        ALTER TABLE linkmetadata ALTER COLUMN data TYPE varchar(4096);
        ALTER TABLE jobs ALTER COLUMN data TYPE varchar(1024);
        ALTER TABLE channelmembers ALTER COLUMN notifyprops TYPE varchar(2000);

    .. note:: 
        
        The inverse of `the final v6.0 upgrade query <https://gist.github.com/streamer45/59b3582118913d4fc5e8ff81ea78b055#postgresql-1>`__ is intentionally omitted from these downgrade queries because its result is backwards compatible, and running the query would unnecessarily delay the downgrade process.
source/templates/versions.html METASEP
{# Support for Sphinx 1.3+ page_source_suffix, but don't break old builds. #}
{% if page_source_suffix %} 
{% set suffix = page_source_suffix %}
{% else %}
{% set suffix = source_suffix %}
{% endif %}

{% if display_github %}
<div class="rst-versions" data-toggle="rst-versions" role="note" aria-label="versions">
    <span class="rst-current-version" data-toggle="rst-current-version">
        <span class="fa fa-cog">&nbsp;&nbsp;Options</span>&nbsp;
        <span class="fa fa-angle-up"></span>
    </span>
    <div class="rst-other-versions">
        <dl>
            <dt>Contribute</dt>
            <dd>
                <a href="https://github.com/{{ github_user }}/{{ github_repo }}/issues">Report a Problem</a>
            </dd>
            {% if pagename != "search" and suffix %}
            <dd>
                <a href="https://github.com/{{ github_user }}/{{ github_repo }}/blob/{{ github_version }}{{ conf_py_path }}{{ pagename }}{{ suffix }}"> Edit on GitHub</a>
            </dd>
            {% endif %}
        </dl>
    </div>
</div>
{% endif %}
source/templates/layout.html METASEP
{# TEMPLATE VAR SETTINGS #}
{%- set url_root = pathto('', 1) %}
{%- if url_root == '#' %}{% set url_root = '' %}{% endif %}
{%- if not embedded and docstitle %}
  {%- set titlesuffix = " &mdash; "|safe + docstitle|e %}
{%- else %}
  {%- set titlesuffix = "" %}
{%- endif %}
{%- set lang_attr = 'en' if language == None else (language | replace('_', '-')) %}
{%- set sphinx_writer = 'writer-html5' if html5_doctype else 'writer-html4' %}

<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
  <meta charset="utf-8">
  {{ metatags }}
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  {% block htmltitle %}
  <title>{{ title|striptags|e }}{{ titlesuffix }}</title>
  {% endblock %}

  {# Performance: Preload Theme Font #}
  <link rel="preload" as="font" href="{{ pathto('_static/css/fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e', 1) }}" crossorigin>
  <link rel="preload" href="https://p.typekit.net" crossorigin>
  <link rel="preload" href="https://use.typekit.net" crossorigin>
  <link rel="preload" href="https://fonts.googleapis.com" crossorigin>
  <link rel="preload" href="https://fonts.gstatic.com" crossorigin>

  {# CSS #}
  <link rel="stylesheet" href="{{ pathto('_static/' + style, 1) }}" type="text/css" />
  {%- for css in css_files %}
    {%- if css|attr("rel") %}
  <link rel="{{ css.rel }}" href="{{ pathto(css.filename, 1) }}" type="text/css"{% if css.title is not none %} title="{{ css.title }}"{% endif %} />
    {%- else %}
  <link rel="stylesheet" href="{{ pathto(css, 1) }}" type="text/css" />
    {%- endif %}
  {%- endfor %}

  {%- for cssfile in extra_css_files %}
    <link rel="stylesheet" href="{{ pathto(cssfile, 1) }}" type="text/css" />
  {%- endfor %}

  {# FAVICON #}
  {% if favicon %}
    <link rel="shortcut icon" href="{{ pathto('_static/' + favicon, 1) }}"/>
  {% endif %}

  {# CANONICAL URL (deprecated) #}
  {% if theme_canonical_url and not pageurl %}
    <link rel="canonical" href="{{ theme_canonical_url }}{{ pagename }}.html"/>
  {% endif %}

  {# CANONICAL URL #}
  {%- if pageurl %}
    <link rel="canonical" href="{{ pageurl|e }}" />
  {%- endif %}

  {%- block linktags %}
    {%- if hasdoc('about') %}
    <link rel="author" title="{{ _('About these documents') }}" href="{{ pathto('about') }}" />
    {%- endif %}
    {%- if hasdoc('genindex') %}
    <link rel="index" title="{{ _('Index') }}" href="{{ pathto('genindex') }}" />
    {%- endif %}
    {%- if hasdoc('search') %}
    <link rel="search" title="{{ _('Search') }}" href="{{ pathto('search') }}" />
    {%- endif %}
    {%- if hasdoc('copyright') %}
    <link rel="copyright" title="{{ _('Copyright') }}" href="{{ pathto('copyright') }}" />
    {%- endif %}
    {%- if next %}
    <link rel="next" title="{{ next.title|striptags|e }}" href="{{ next.link|e }}" />
    {%- endif %}
    {%- if prev %}
    <link rel="prev" title="{{ prev.title|striptags|e }}" href="{{ prev.link|e }}" />
    {%- endif %}
  {%- endblock %}

  	<!-- Google Tag Manager -->
	<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
	new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
	j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
	'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
	})(window,document,'script','dataLayer','GTM-K874RWM');</script>
	<!-- End Google Tag Manager -->

</head>

<body class="wy-body-for-nav">

	<!-- Google Tag Manager (noscript) -->
	<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-K874RWM"
	height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
	<!-- End Google Tag Manager (noscript) -->

  {% block extrabody %} {% endblock %}
  <div class="wy-grid-for-nav">
    {# SIDE NAV, TOGGLES ON MOBILE #}
    <nav data-swiftype-index=false data-toggle="wy-nav-shift" class="wy-nav-side">
      <div class="wy-side-scroll">
        <div class="wy-side-nav-search" {% if theme_style_nav_header_background %} style="background: {{theme_style_nav_header_background}}" {% endif %}>
          {% block sidebartitle %}

          {% if logo and theme_logo_only %}
            <a href="{{ pathto(master_doc) }}">
          {% else %}
            <a href="{{ pathto(master_doc) }}" class="icon icon-home"> {{ project }}
          {% endif %}

          {% if logo %}
            {# Not strictly valid HTML, but it's the only way to display/scale
               it properly, without weird scripting or heaps of work
            #}
            <img src="{{ pathto('_static/' + logo, 1) }}" class="logo" alt="{{ _('Logo') }}"/>
          {% endif %}
          </a>

          {% if theme_display_version %}
            {%- set nav_version = version %}
            {% if READTHEDOCS and current_version %}
              {%- set nav_version = current_version %}
            {% endif %}
            {% if nav_version %}
              <div class="version">
                {{ nav_version }}
              </div>
            {% endif %}
          {% endif %}

          {% include "searchbox.html" %}

          {% endblock %}
        </div>

        {% block navigation %}
        <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
          {% block menu %}
            {#
              The singlehtml builder doesn't handle this toctree call when the
              toctree is empty. Skip building this for now.
            #}
            {% if 'singlehtml' not in builder %}
              {% set global_toc = toctree(maxdepth=theme_navigation_depth|int,
                                          collapse=theme_collapse_navigation|tobool,
                                          includehidden=theme_includehidden|tobool,
                                          titles_only=theme_titles_only|tobool) %}
            {% endif %}
            {% if global_toc %}
              {{ global_toc }}
            {% else %}
              <!-- Local TOC -->
              <div class="local-toc">{{ toc }}</div>
            {% endif %}
          {% endblock %}
        </div>
        {% endblock %}
      </div>
    </nav>

    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">

      {# MOBILE NAV, TRIGGLES SIDE NAV ON TOGGLE #}
      <nav class="wy-nav-top" aria-label="top navigation">
        {% block mobile_nav %}
          <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
          <a href="{{ pathto(master_doc) }}">{{ project }}</a>
        {% endblock %}
      </nav>


      <div class="wy-nav-content">
      {%- block content %}
        {% if theme_style_external_links|tobool %}
        <div class="rst-content style-external-links">
        {% else %}
        <div class="rst-content">
        {% endif %}
          {% include "breadcrumbs.html" %}
          <article data-swiftype-index=false class="document" itemscope="itemscope" itemtype="https://schema.org/Article">
          {%- block document %}
           <div data-swiftype-index=true itemprop="articleBody" role="main">
            {% block body %}{% endblock %}
           </div>
           {% if self.comments()|trim %}
           <div data-swiftype-index=false class="articleComments">
            {% block comments %}{% endblock %}
           </div>
           {% endif%}
          </article>
          {%- endblock %}
          {% include "footer.html" %}
        </div>
      {%- endblock %}
      </div>

    </section>

  </div>
  {% include "versions.html" %}

  {% include "header.html" %}

  {# JAVASCRIPTS #}
  {%- block scripts %}
    <!--[if lt IE 9]>
      <script src="{{ pathto('_static/js/html5shiv.min.js', 1) }}"></script>
    <![endif]-->
    {%- if not embedded %}
    {# XXX Sphinx 1.8.0 made this an external js-file, quick fix until we refactor the template to inherert more blocks directly from sphinx #}
      {% if sphinx_version >= "1.8.0" %}
        <script type="text/javascript" id="documentation_options" data-url_root="{{ url_root }}" src="{{ pathto('_static/documentation_options.js', 1) }}"></script>
        {%- for scriptfile in script_files %}
          {{ js_tag(scriptfile) }}
        {%- endfor %}
      {% else %}
        <script type="text/javascript">
            var DOCUMENTATION_OPTIONS = {
                URL_ROOT:'{{ url_root }}',
                VERSION:'{{ release|e }}',
                LANGUAGE:'{{ language }}',
                COLLAPSE_INDEX:false,
                FILE_SUFFIX:'{{ '' if no_search_suffix else file_suffix }}',
                HAS_SOURCE:  {{ has_source|lower }},
                SOURCELINK_SUFFIX: '{{ sourcelink_suffix }}'
            };
        </script>
        {%- for scriptfile in script_files %}
          <script type="text/javascript" src="{{ pathto(scriptfile, 1) }}"></script>
        {%- endfor %}
      {% endif %}
      <script type="text/javascript" src="{{ pathto('_static/js/theme.js', 1) }}"></script>

      {# OPENSEARCH #}
      {%- if use_opensearch %}
      <link rel="search" type="application/opensearchdescription+xml"
            title="{% trans docstitle=docstitle|e %}Search within {{ docstitle }}{% endtrans %}"
            href="{{ pathto('_static/opensearch.xml', 1) }}"/>
      {%- endif %}
    {%- endif %}
  {%- endblock %}

	<script type="text/javascript">
		jQuery(function () {
			SphinxRtdTheme.Navigation.enable({{ 'true' if theme_sticky_navigation|tobool else 'false' }});
		});
	</script>

  {%- block footer %} {% endblock %}

</body>
</html>

source/templates/layout-notoc.html METASEP
{# TEMPLATE VAR SETTINGS #}
{%- set url_root = pathto('', 1) %}
{%- if url_root == '#' %}{% set url_root = '' %}{% endif %}
{%- if not embedded and docstitle %}
  {%- set titlesuffix = " &mdash; "|safe + docstitle|e %}
{%- else %}
  {%- set titlesuffix = "" %}
{%- endif %}

<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
  <meta charset="utf-8">
  {{ metatags }}
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  {% block htmltitle %}
  <title>{{ title|striptags|e }}{{ titlesuffix }}</title>
  {% endblock %}

  {# FAVICON #}
  {% if favicon %}
    <link rel="shortcut icon" href="{{ pathto('_static/' + favicon, 1) }}"/>
  {% endif %}

  {# Performance: Preload Theme Font #}
  <link rel="preload" as="font" href="{{ pathto('_static/css/fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e', 1) }}" crossorigin>
  <link rel="preload" href="https://p.typekit.net" crossorigin>
  <link rel="preload" href="https://use.typekit.net" crossorigin>
  <link rel="preload" href="https://fonts.googleapis.com" crossorigin>
  <link rel="preload" href="https://fonts.gstatic.com" crossorigin>

  {# RTD hosts this file, so just load on non RTD builds #}
  {% if not READTHEDOCS %}
    <link rel="stylesheet" href="{{ pathto('_static/' + style, 1) }}" type="text/css" />
  {% endif %}

  {% for cssfile in css_files %}
    <link rel="stylesheet" href="{{ pathto(cssfile, 1) }}" type="text/css" />
  {% endfor %}

  {% for cssfile in extra_css_files %}
    <link rel="stylesheet" href="{{ pathto(cssfile, 1) }}" type="text/css" />
  {% endfor %}

  {%- block linktags %}
    {%- if hasdoc('about') %}
        <link rel="author" title="{{ _('About these documents') }}"
              href="{{ pathto('about') }}"/>
    {%- endif %}
    {%- if hasdoc('genindex') %}
        <link rel="index" title="{{ _('Index') }}"
              href="{{ pathto('genindex') }}"/>
    {%- endif %}
    {%- if hasdoc('search') %}
        <link rel="search" title="{{ _('Search') }}" href="{{ pathto('search') }}"/>
    {%- endif %}
    {%- if hasdoc('copyright') %}
        <link rel="copyright" title="{{ _('Copyright') }}" href="{{ pathto('copyright') }}"/>
    {%- endif %}
    <link rel="top" title="{{ docstitle|e }}" href="{{ pathto('index') }}"/>
    {%- if parents %}
        <link rel="up" title="{{ parents[-1].title|striptags|e }}" href="{{ parents[-1].link|e }}"/>
    {%- endif %}
    {%- if next %}
        <link rel="next" title="{{ next.title|striptags|e }}" href="{{ next.link|e }}"/>
    {%- endif %}
    {%- if prev %}
        <link rel="prev" title="{{ prev.title|striptags|e }}" href="{{ prev.link|e }}"/>
    {%- endif %}
  {%- endblock %}
  {%- block extrahead %}

    <!-- Google Tag Manager -->
    <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
    new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
    j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
    'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
    })(window,document,'script','dataLayer','GTM-K874RWM');</script>
    <!-- End Google Tag Manager -->

  {% endblock %}

  <style type="text/css">

    .wy-nav-content {
        max-width: none;
    }

    .wy-nav-content .document {
        max-width: none;
    }

    .wy-nav-content-wrap {
        margin-left: 0px;
    }

  </style>

</head>

<body class="wy-body-for-nav" role="document">

  <!-- Google Tag Manager (noscript) -->
  <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-K874RWM"
  height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
  <!-- End Google Tag Manager (noscript) -->

  {% block menu %} {% endblock %}
  {% block extrabody %} {% endblock %}

  <div class="wy-grid-for-nav">

    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">

      {# MOBILE NAV, TRIGGLES SIDE NAV ON TOGGLE #}
      <nav class="wy-nav-top" role="navigation" aria-label="top navigation">
        {% block mobile_nav %}
          <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
          <a href="{{ pathto(master_doc) }}">{{ project }}</a>
        {% endblock %}
      </nav>

      {# PAGE CONTENT #}
      <div class="wy-nav-content">
        <div class="rst-content">
          <div role="main" class="document" itemscope="itemscope" itemtype="https://schema.org/Article">
           <div data-swiftype-index=true itemprop="articleBody">
            {% block body %}{% endblock %}
           </div>
          </div>
          {% include "footer.html" %}
        </div>
      </div>

    </section>

  </div>

  {% include "header.html" %}

  {% if not embedded %}
    <script type="text/javascript">
        var DOCUMENTATION_OPTIONS = {
            URL_ROOT:'{{ url_root }}',
            VERSION:'{{ release|e }}',
            COLLAPSE_INDEX:false,
            FILE_SUFFIX:'{{ '' if no_search_suffix else file_suffix }}',
            HAS_SOURCE:  {{ has_source|lower }}
        };
    </script>
    {%- for scriptfile in script_files %}
      <script type="text/javascript" src="{{ pathto(scriptfile, 1) }}"></script>
    {%- endfor %}
  {% endif %}

  {# RTD hosts this file, so just load on non RTD builds #}
  {% if not READTHEDOCS %}
    <script type="text/javascript" src="{{ pathto('_static/js/theme.js', 1) }}"></script>
  {% endif %}

  {# STICKY NAVIGATION #}
  {% if theme_sticky_navigation %}
  <script type="text/javascript">
      jQuery(function () {
          SphinxRtdTheme.StickyNav.enable();
      });
  </script>
  {% endif %}

  {% block footer %}

  {% endblock %}

</body>
</html>

source/templates/index.html METASEP
{# Overrides the output of converting index.rst to enable a custom landing page for the docs #}
{# Ensure that all links found within the index.rst are transposed here as well. #}

{%- extends "layout-notoc.html" %}
{% set title = _('Mattermost Documentation') %}

{% block body %}

    <style>
    @import url("https://use.typekit.net/cng2uup.css");
    </style>
    <style type="text/css">
        .wy-nav-content {
            padding: 0 !important;
        }
        footer {
            overflow-x: hidden;
        }
        .header__logo img {
            height: 40px !important;
            width: auto !important;
        }
        .redesign-landing .masthead, .redesign-landing .home-cards {
            font-family: 'trade-gothic-next',sans-serif !important;
        }
        .redesign-landing .masthead .container--small {
            position: relative;
            z-index: 10;
        }
        .redesign-landing .masthead-pattern {
            display: block;
            position: absolute;
            z-index: 5;
            bottom: 0;
            left: -50vw;
            width: 200vw;
            max-width: none;
            height: auto;
        }
        .redesign-landing .container,
        .site-footer .container {
            max-width: 1100px;
            margin: 0 auto;
        }
        .redesign-landing .bg--gray {
            background-color: #EBEBEF;
        }
        .redesign-landing h1 {
            font-family: 'trade-gothic-next',sans-serif !important;
            font-style: normal;
            font-weight: 800;
            font-size: 45px;
            line-height: 130%;
            color: white;
            margin-bottom: 20px;
        }
        .redesign-landing h2 {
            font-family: 'trade-gothic-next',sans-serif !important;
            font-style: normal;
            font-weight: 800;
            font-size: 32px;
            line-height: 135%;
            color: #1E325C;
        }
        .redesign-landing .subhead {
            font-family: 'trade-gothic-next',sans-serif !important;
            font-style: normal;
            font-weight: normal;
            font-size: 24px;
            line-height: 150%;
            color: #C5D2EC;
        }
        .redesign-landing .card-single h3 {
            font-family: 'trade-gothic-next',sans-serif !important;
            font-style: normal;
            font-weight: bold;
            font-size: 24px;
            line-height: 130%;
            color: #363A45;
        }
        .redesign-landing .container--small {
            max-width: 800px;
            margin: 0 auto;
        }
        .redesign-landing .padding-tb--large {
            padding: 50px 0;
        }
        .redesign-landing .padding-b--large {
            padding-bottom: 50px;
        }
        .redesign-landing .masthead {
            background-color: #1E325C;
            background-position: bottom center;
            background-size: 1500px;
            background-repeat: no-repeat;
        }
        @media (max-width: 991.98px) {
            .home-cards.padding-tb--large {
                padding-top: 100px;
            }
            .redesign-landing .masthead {
                padding-bottom: 0;
            }
        }
        .redesign-landing .card-grid {
            display: grid;
            row-gap: 40px;
            margin-top: 40px;
        }
        .redesign-landing .card-grid a {
            display: block;
            transition: all .6s cubic-bezier(.23,1,.32,1);
        }
        .redesign-landing .card-grid a:hover {
            transform: translateY(-10px);
        }
        .redesign-landing .card-single {
            padding: 30px;
            background: white;
            border-radius: 5px;
        }
        .redesign-landing .card-single img {
            margin-bottom: 40px;
            width: auto;
            height: auto;
            max-width: 50px;
            max-height: 50px;
        }
        .redesign-landing .card-single svg {
            width: auto !important;
            height: 50px !important;
            margin-bottom: 30px;
        }
        .redesign-landing .card-single p {
            font-style: normal;
            font-weight: normal;
            font-size: 18px;
            line-height: 150%;
            color: #363A45;
        }
        footer:not(.site-footer) {
            display: none;
        }
        @media (min-width: 992px) {
            .redesign-landing .masthead {
                background-size: 90vw;
            }
            .redesign-landing .padding-tb--large {
                padding: 100px 0;
            }
            .redesign-landing .padding-tb--large.masthead {
                padding: 100px 0 80px;
            }
            .redesign-landing .padding-b--large {
                padding-bottom: 100px;
            }
            .redesign-landing .masthead.padding-tb--large {
                padding: 100px 0 0;
            }
            .redesign-landing .container--small {
                text-align: center;
            }
            .redesign-landing h1 {
                font-size: 52px;
            }
            .redesign-landing h2 {
                text-align: center;
            }
            .redesign-landing .card-grid {
                grid-template-columns: 1fr 1fr 1fr;
                column-gap: 40px;
            }
            .redesign-landing .masthead-pattern {
                left: calc(50% - 40vw);
                width: 80vw;
                max-width: 80vw;
            }
        }
        @media (max-width: 1100px) {
            .redesign-landing .container,
            .redesign-landing .masthead .container--small,
            footer.site-footer .container {
                padding: 0 20px;
            }
        }
        footer.site-footer {
            background: linear-gradient(180deg,rgba(19,30,57,.9),#1e325c 20%);
            padding: 50px 0;
            font-family: 'trade-gothic-next',sans-serif;
            overflow-x: hidden;
        }
        @media (min-width: 992px) {
            footer.site-footer {
                padding:100px 0 50px
            }
        }
        footer.site-footer .container {
            display: grid;
            grid-template-columns: repeat(2,minmax(0,1fr))
        }
        @media (max-width: 1199.98px) {
            footer.site-footer .container {
                row-gap:30px;
                -moz-column-gap: 50px;
                column-gap: 50px
            }
        }
        @media (min-width: 992px) {
            footer.site-footer .container {
                grid-template-columns:repeat(5,minmax(0,1fr));
                -moz-column-gap: 30px;
                column-gap: 30px
            }
        }
        footer.site-footer ul {
            list-style-type: none;
            padding: 0;
            margin: 0
        }
        footer.site-footer .footer-menu__heading {
            color: #ffbc1f;
            font-family: 'Fira Mono',monospace;
            font-size: 16px
        }
        footer.site-footer .footer-menu__single a,footer.site-footer .footer-menu__single a:visited {
            color: #fff;
            font-size: 15px
        }

        footer.site-footer .footer-menu__single a:focus,footer.site-footer .footer-menu__single a:hover {
            color: #7e96c8
        }

        footer.site-footer .footer-menu__single li {
            margin-bottom: 20px
        }

        footer.site-footer .footer-menu__single ul {
            margin-top: 20px
        }

        footer.site-footer a {
            text-decoration: none
        }

        footer.site-footer small,footer.site-footer small a, footer.site-footer small a:visited {
            color: #c5d2ec
        }

        footer.site-footer .secondary-footer__copy {
            font-size: 15px
        }

        footer.site-footer .secondary-footer__copy a:focus,footer.site-footer .secondary-footer__copy a:hover {
            color: #ffbc1f
        }

        footer.site-footer .secondary-footer__social li {
            display: inline-block
        }

        footer.site-footer .secondary-footer__social li:focus svg path,footer.site-footer .secondary-footer__social li:hover svg path {
            fill: #7e96c8
        }

        @media (max-width: 991.98px) {
            footer.site-footer .secondary-footer__social li {
                width:45%;
                margin-bottom: 25px;
            }

            footer.site-footer .secondary-footer__social li img {
                width: 50px
            }
            footer.site-footer .secondary-footer__copy {
                order:6;
                grid-column: 1/span 2
            }
            .mm-copyright {
			    display: block;
		    }
        }

        @media (min-width: 992px) {
            footer.site-footer .secondary-footer__copy,footer.site-footer .secondary-footer__social {
                margin-top:50px
            }

            footer.site-footer .secondary-footer__copy {
                grid-column: 1/span 2;
                place-self: end start
            }

            footer.site-footer .secondary-footer__social {
                grid-column: 4/span 2;
                place-self: end end
            }

            footer.site-footer .secondary-footer__social li {
                margin-left: 25px
            }
        }
        .c-thermometer-popup,
        .c-thermometer-modal__container,
        .c-thermometer {
            display: none;
        }
        .redesign-landing .landing-search {
            overflow: hidden;
            width: 90vw;
            display: flex;
			justify-content: center;
			align-items: center;
			position: relative;
            z-index: 20;
			bottom: -2.5rem;
            border-radius: 5px;
            margin: 0 auto;
            padding: 20px 20px 15px;
            background-color: white;
            box-shadow: 0px 0px 33px 2px rgba(0, 0, 0, 0.2);
        }

        .redesign-landing .landing-search input[type="text"] {
            border: 2px solid #BABEC9;
			font-weight: 400;
			font-size: 16px;
			border-radius: 0;
			padding: 20px;
            width: 78vw;
        }

        @media screen and (min-width: 728px) {
            .redesign-landing .landing-search {
                width: 640px;
                padding: 20px;
            }
            .redesign-landing .landing-search input[type="text"] {
                width: 600px;
                padding: 10px 20px;
            }
        }
    </style>

    <main class="redesign-landing">
        <section class="masthead padding-tb--large" style="background-image: url({{ pathto('_static/images/home/Hero_Stipple_Bottom.png', 1) }});">
            <div class="container--small">
                <h1>Mattermost Documentation</h1>
                <p class="subhead">Technical resources to help admins, users, and developers leverage Mattermost.</p>
            </div>
            <div class="landing-search" role="search">
                <form id="rtd-search-form" class="wy-form" action="{{ pathto('search') }}" method="get">
                    <input type="text" name="q" placeholder="What are you looking for?" />
                    <input type="hidden" name="check_keywords" value="yes" />
                    <input type="hidden" name="area" value="default" />
                </form>
            </div>
        </section>
    
        <section class="home-cards padding-tb--large bg--gray">
            <div class="container">
                <div class="home-cards__group padding-b--large">
                    <h2>Setup and Administration Guides</h2>
                    <div class="card-grid">
                        <a href="overview/index.html" class="card-single">
                            <img src="{{ pathto('_static/images/home/Overview.svg', 1) }}" alt="" width="50" height="50">                         
                            <h3>Overview</h3>
                            <p>Learn about Mattermost products, capabilities, features, and licensing.</p>
                        </a>
                        <a href="guides/deployment.html" class="card-single">
                            <img src="{{ pathto('_static/images/home/Deploy.svg', 1) }}" alt="" width="50" height="50">   
                            <h3>Deploy</h3>
                            <p>Install Mattermost and scale it to meet your needs.</p>
                        </a>
                        <a href="guides/administration.html" class="card-single">
                            <img src="{{ pathto('_static/images/home/Admin-Guide.svg', 1) }}" alt="" width="50" height="50">                                 
                            <h3>Admin Guide</h3>
                            <p>Setup, manage, and configure your Mattermost server.</p>
                        </a>
                    </div>
                </div>
                <div class="home-cards__group padding-b--large">
                    <h2>User Guides</h2>
                    <div class="card-grid">
                        <a href="guides/channels.html" class="card-single">
                            <img src="{{ pathto('_static/images/home/Channels.svg', 1) }}" alt="" width="50" height="50">   
                            <h3>Channels</h3>
                            <p>Bring your team together with modern messaging and collaboration.</p>
                        </a>
                        <a href="guides/playbooks.html" class="card-single">
                            <img src="{{ pathto('_static/images/home/Playbooks.svg', 1) }}" alt="" width="50" height="50">   
                            <h3>Playbooks</h3>
                            <p>Build reliable and repeatable responses for workflow and process automation.</p>
                        </a>
                        <a href="guides/boards.html" class="card-single">
                            <img src="{{ pathto('_static/images/home/Boards.svg', 1) }}" alt="" width="50" height="50">   
                            <h3>Boards</h3>
                            <p>Keep your team aligned on project planning and execution.</p>
                        </a>
                    </div>
                </div>
                <div class="home-cards__group">
                    <h2>Other Resources</h2>
                    <div class="card-grid">
                        <a href="https://developers.mattermost.com/contribute/getting-started/" class="card-single">
                            <img src="{{ pathto('_static/images/home/Contribute.svg', 1) }}" alt="" width="50" height="50">   
                            <h3>Contribute</h3>
                            <p>Contribute code to help make Mattermost better.</p>
                        </a>
                        <a href="https://developers.mattermost.com/integrate/getting-started/" class="card-single">
                            <img src="{{ pathto('_static/images/home/Integrate-Extend.svg', 1) }}" alt="" width="50" height="50">   
                            <h3>Integrate and Extend</h3>
                            <p>Extend Mattermost capabilities via Apps, Plugins, Webhooks, or APIs.</p>
                        </a>
                        <a href="https://docs.mattermost.com/guides/get-help.html" class="card-single">
                            <img src="{{ pathto('_static/images/home/Help.svg', 1) }}" alt="" width="50" height="50">   
                            <h3>Get Help</h3>
                            <p>Connect with our community, or leverage our premium support services.</p>
                        </a>
                    </div>
                </div>
            </div>
        </section>
    </main>
</div>

<footer aria-label="Mattermost Footer" class="site-footer">
	<div class="container">
		<ul class="footer-menu__single">
			<li><span class="footer-menu__heading">Company</span>
				<ul id="menu-footer-company" class="menu">
                    <li id="menu-item-25352" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-25352"><a href="https://mattermost.com/about-us/" data-ol-has-click-handler="">About Us</a></li>
                    <li id="menu-item-25353" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-25353"><a href="https://mattermost.com/newsroom/" data-ol-has-click-handler="">Newsroom</a></li>
                    <li id="menu-item-25354" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-25354"><a href="https://mattermost.com/partners/" data-ol-has-click-handler="">Partners</a></li>
                    <li id="menu-item-25355" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-25355"><a href="https://mattermost.com/events/" data-ol-has-click-handler="">Events</a></li>
                    <li id="menu-item-25356" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-25356"><a href="https://mattermost.com/careers/" data-ol-has-click-handler="">Careers</a></li>
                    <li id="menu-item-28328" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-28328"><a href="https://mattermost.com/contact-sales/" data-ol-has-click-handler="">Contact Us</a></li>
                </ul>		
            </li>
		</ul>
		<ul class="footer-menu__single">
			<li><span class="footer-menu__heading">Platform</span>
			    <ul id="menu-footer-platform" class="menu"><li id="menu-item-27084" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27084"><a href="https://mattermost.com/platform-overview/" data-ol-has-click-handler="">Platform Overview</a></li>
                    <li id="menu-item-27085" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27085"><a href="https://mattermost.com/channels/" data-ol-has-click-handler="">Channels</a></li>
                    <li id="menu-item-27087" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27087"><a href="https://mattermost.com/playbooks/" data-ol-has-click-handler="">Playbooks</a></li>
                    <li id="menu-item-27086" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27086"><a href="https://mattermost.com/boards/" data-ol-has-click-handler="">Boards</a></li>
                    <li id="menu-item-27088" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27088"><a href="https://mattermost.com/integrations-overview/" data-ol-has-click-handler="">Integrations</a></li>
                    <li id="menu-item-25358" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-25358"><a href="https://mattermost.com/security/" data-ol-has-click-handler="">Security</a></li>
                </ul>
            </li>
		</ul>
		<ul class="footer-menu__single">
			<li><span class="footer-menu__heading">Documentation</span>
				<ul id="menu-footer-documentation" class="menu">
                    <li id="menu-item-25359" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-25359"><a href="https://docs.mattermost.com/guides/deployment.html" data-ol-has-click-handler="">Deployment</a></li>
                    <li id="menu-item-25360" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-25360"><a href="https://docs.mattermost.com/guides/channels.html" data-ol-has-click-handler="">Channels Guide</a></li>
                    <li id="menu-item-10392" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-25360"><a href="https://docs.mattermost.com/guides/playbooks.html" data-ol-has-click-handler="">Playbooks Guide</a></li>
                    <li id="menu-item-25246" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-25360"><a href="https://docs.mattermost.com/guides/boards.html" data-ol-has-click-handler="">Boards Guide</a></li>
                    <li id="menu-item-25362" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-25362"><a href="https://docs.mattermost.com/guides/administration.html" data-ol-has-click-handler="">Admin</a></li>
                    <li id="menu-item-25363" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-25363"><a href="https://api.mattermost.com/" data-ol-has-click-handler="">API Reference</a></li>
                    <li id="menu-item-25364" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-25364"><a href="https://docs.mattermost.com/" data-ol-has-click-handler="">All Docs</a></li>
                </ul>			
            </li>
		</ul>
		<ul class="footer-menu__single">
			<li><span class="footer-menu__heading">Download</span>
				<ul id="menu-footer-download" class="menu">
                    <li id="menu-item-25365" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-25365"><a href="https://mattermost.com/apps/" data-ol-has-click-handler="">Mobile &amp; Desktop Apps</a></li>
                    <li id="menu-item-25366" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-25366"><a href="https://mattermost.com/deploy/" data-ol-has-click-handler="">Mattermost Server</a></li>
                    <li id="menu-item-27089" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-27089"><a href="https://mattermost.com/trial/" data-ol-has-click-handler="">Enterprise Trial License</a></li>
                    <li id="menu-item-27090" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-27090"><a href="https://customers.mattermost.com/cloud/signup" data-ol-has-click-handler="">Cloud Trial</a></li>
                </ul>
            </li>
		</ul>
		<ul class="footer-menu__single">
			<li><span class="footer-menu__heading">Support</span>
				<ul id="menu-footer-support" class="menu">
                    <li id="menu-item-25369" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-25369"><a href="https://community.mattermost.com/login" data-ol-has-click-handler="">Community Chat Server</a></li>
                    <li id="menu-item-25370" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-25370"><a href="https://forum.mattermost.com/" data-ol-has-click-handler="">Forums</a></li>
                    <li id="menu-item-25371" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-25371"><a href="https://handbook.mattermost.com/contributors/contributors/ways-to-contribute#report-a-bug" data-ol-has-click-handler="">Report an Issue</a></li>
                    <li id="menu-item-25372" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-25372"><a href="https://handbook.mattermost.com/contributors/contributors/ways-to-contribute#propose-new-features" data-ol-has-click-handler="">Nominate a Feature</a></li>
                    <li id="menu-item-28329" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-28329"><a href="https://support.mattermost.com/hc/en-us" data-ol-has-click-handler="">Help Center</a></li>
                    <li id="menu-item-28329" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-28329"><a href="https://mattermost.com/support/" data-ol-has-click-handler="">Terms</a></li>
                </ul>
            </li>
		</ul>
		<div class="secondary-footer__copy">
			<small class="disclaimer"><span class="mm-copyright" style="margin-right: 1rem;">© Mattermost, Inc. 2022.</span> <span><a href="https://mattermost.com/terms-of-use/" title="Terms of Service" data-ol-has-click-handler="">Terms
				of Use</a> <span style="margin: 0 0.5rem;">|</span> <a href="https://mattermost.com/privacy-policy/" title="Privacy Policy" data-ol-has-click-handler="">Privacy Policy</a> <span style="margin: 0 0.5rem;">|</span> <a href="https://mattermost.com/privacy-policy/cookies/" title="Cookie Policy" data-ol-has-click-handler="">Cookie Policy</a> </span></small>
		</div>
		<ul class="secondary-footer__social">
			<li>
				<a href="https://github.com/mattermost/mattermost-server" target="_blank" rel="noopener noreferrer" data-ol-has-click-handler="">
					<svg width="35" height="35" viewBox="0 0 35 35" fill="none" xmlns="http://www.w3.org/2000/svg">
						<title>GitHub icon</title>
						<path d="M17.5 0C7.83232 0 0 7.83232 0 17.5C0 27.1677 7.83232 35 17.5 35C27.1677 35 35 27.1677 35 17.5C35 7.83232 27.1677 0 17.5 0ZM20.8293 27.2317C20.5945 27.061 20.3384 26.8262 20.3384 26.5061C20.3384 26.1433 20.3598 25.9299 20.3598 24.3293C20.3598 22.7287 20.1463 22.1524 19.3994 21.6829C21.7043 21.4482 23.1555 20.872 23.8384 19.3567L23.9024 19.2073C23.9665 19.0793 24.0091 18.9299 24.0091 18.9299L24.0945 18.6311C24.2439 18.0549 24.3293 17.372 24.3506 16.561C24.3506 14.3841 23.2835 13.5945 23.0915 13.2317C23.3902 11.5671 23.0488 10.8201 22.878 10.564C22.2805 10.3506 20.8079 11.0976 19.997 11.6311C18.6738 11.247 15.8994 11.2896 14.8537 11.7378C12.9329 10.372 11.9085 10.5854 11.9085 10.5854C11.9085 10.5854 11.247 11.7591 11.7378 13.4665C11.0976 14.2774 10.628 14.8323 10.628 16.3476C10.628 17.2012 10.7348 17.9482 10.9482 18.6098L11.0122 18.7591L11.2043 19.1646L11.2896 19.314C12.0152 20.6159 13.4024 21.4268 15.7713 21.6616C15.4299 21.9177 15.0244 22.3872 14.9817 22.9634C14.5549 23.2409 13.7012 23.3262 13.0396 23.1128C12.122 22.814 11.7591 21 10.372 21.2561C10.0732 21.3201 10.1372 21.5122 10.3933 21.6829C10.8201 21.9604 11.2043 22.3018 11.5244 23.0274C11.7591 23.5823 12.25 24.5854 13.8293 24.5854C14.4482 24.5854 14.8963 24.5213 14.8963 24.5213C14.8963 24.5213 14.9177 25.9299 14.9177 26.4848C14.9177 26.8476 14.6402 27.061 14.4055 27.2317C10.4787 25.8872 7.64024 22.1524 7.64024 17.7561C7.64024 12.2073 12.122 7.72561 17.6707 7.72561C23.2195 7.72561 27.7012 12.2073 27.7012 17.7561C27.6372 22.1311 24.7774 25.8872 20.8293 27.2317Z" fill="#FFFFFF"></path>
					</svg>
				</a>
			</li>
			<li>
				<a href="https://www.linkedin.com/company/mattermost/" target="_blank" rel="noopener noreferrer" data-ol-has-click-handler="">
                    <svg width="35" height="35" viewBox="0 0 35 35" fill="none" xmlns="http://www.w3.org/2000/svg">
                        <title>LinkedIn icon</title>
                        <g clip-path="url(#clip0_5:29)">
                        <path d="M17.5 0C14.0388 0 10.6554 1.02635 7.77754 2.94927C4.89968 4.8722 2.65665 7.60532 1.33211 10.803C0.00758061 14.0007 -0.338975 17.5194 0.336266 20.9141C1.01151 24.3087 2.67822 27.4269 5.12564 29.8744C7.57306 32.3218 10.6913 33.9885 14.0859 34.6637C17.4806 35.339 20.9993 34.9924 24.197 33.6679C27.3947 32.3433 30.1278 30.1003 32.0507 27.2225C33.9737 24.3446 35 20.9612 35 17.5C35 12.8587 33.1563 8.40751 29.8744 5.12562C26.5925 1.84374 22.1413 0 17.5 0ZM13.6287 24.9033C13.6281 24.9734 13.6001 25.0403 13.5505 25.0898C13.501 25.1394 13.4341 25.1674 13.364 25.168H10.2887C10.2185 25.168 10.1512 25.1401 10.1016 25.0905C10.052 25.0408 10.0241 24.9735 10.0241 24.9033V15.0073C10.0247 14.9373 10.0527 14.8703 10.1022 14.8208C10.1517 14.7713 10.2187 14.7432 10.2887 14.7427H13.364C13.4341 14.7432 13.501 14.7713 13.5505 14.8208C13.6001 14.8703 13.6281 14.9373 13.6287 15.0073V24.9033ZM11.8317 13.9104C11.4263 13.9108 11.0299 13.7909 10.6927 13.566C10.3554 13.341 10.0925 13.021 9.93716 12.6466C9.78183 12.2721 9.74108 11.86 9.82006 11.4624C9.89904 11.0648 10.0942 10.6995 10.3809 10.4129C10.6675 10.1262 11.0328 9.93105 11.4304 9.85207C11.828 9.77308 12.2402 9.81383 12.6146 9.96916C12.9891 10.1245 13.309 10.3874 13.534 10.7247C13.7589 11.0619 13.8788 11.4583 13.8784 11.8637C13.8772 12.4062 13.6613 12.9261 13.2777 13.3097C12.8941 13.6932 12.3742 13.9092 11.8317 13.9104ZM25.1488 24.8948C25.1482 24.9648 25.1202 25.0318 25.0707 25.0813C25.0212 25.1308 24.9542 25.1589 24.8842 25.1594H21.811C21.7408 25.1594 21.6735 25.1316 21.6239 25.0819C21.5742 25.0323 21.5464 24.965 21.5464 24.8948V20.0994C21.5464 18.6759 21.4503 17.7412 20.1805 17.7412C18.9107 17.7412 18.6332 18.6119 18.6332 20.0161V24.9119C18.6327 24.9819 18.6046 25.0489 18.5551 25.0984C18.5056 25.1479 18.4386 25.176 18.3686 25.1765H15.2976C15.2626 25.1768 15.228 25.1702 15.1957 25.157C15.1633 25.1438 15.1339 25.1244 15.1091 25.0998C15.0843 25.0752 15.0646 25.0459 15.0511 25.0136C15.0377 24.9814 15.0308 24.9468 15.0308 24.9119V15.0073C15.0314 14.9369 15.0597 14.8696 15.1097 14.8201C15.1596 14.7705 15.2272 14.7427 15.2976 14.7427H18.2448C18.3152 14.7427 18.3827 14.7705 18.4327 14.8201C18.4827 14.8696 18.511 14.9369 18.5116 15.0073V15.528C19.1134 14.9689 20.1015 14.6253 21.2284 14.6253C24.7028 14.6253 25.1488 17.2183 25.1488 19.4741V24.8948Z" fill="white"/>
                        </g>
                        <defs>
                        <clipPath id="clip0_5:29">
                        <rect width="35" height="35" fill="white"/>
                        </clipPath>
                        </defs>
                    </svg>
				</a>
			</li>
			<li>
				<a href="https://www.facebook.com/Mattermost-2300985916642531/" target="_blank" rel="noopener noreferrer" data-ol-has-click-handler="">
				<svg width="35" height="35" viewBox="0 0 35 35" fill="none" xmlns="http://www.w3.org/2000/svg">
					<title>Facebook icon</title>
					<path d="M17.5 0C7.83232 0 0 7.83232 0 17.5C0 27.1677 7.83232 35 17.5 35C27.1677 35 35 27.1677 35 17.5C35 7.83232 27.1677 0 17.5 0ZM21.7043 11.7378H20.0183C18.9085 11.7378 18.8445 12.1433 18.8445 12.9329V14.5549H21.4909L21.1707 17.4573H18.8445V26.0579H14.9604V17.4573H13.4451V14.5549H14.9604V12.6982C14.9604 10.2866 15.9634 8.83537 18.8232 8.83537H21.7043V11.7378Z" fill="#FFFFFF"></path>
				</svg>
				</a>
			</li>
			<li>
				<a href="https://twitter.com/mattermost" target="_blank" rel="noopener noreferrer" data-ol-has-click-handler="">
				<svg width="35" height="35" viewBox="0 0 35 35" fill="none" xmlns="http://www.w3.org/2000/svg">
					<title>Twitter icon</title>
					<path d="M17.5 0C7.83232 0 0 7.83232 0 17.5C0 27.1677 7.83232 35 17.5 35C27.1677 35 35 27.1677 35 17.5C35 7.83232 27.1677 0 17.5 0ZM24.0091 14.1494C24.0091 14.2988 24.0091 14.4268 24.0091 14.5762C24.0091 18.9726 20.6799 24.0305 14.5549 24.0305C12.6768 24.0305 10.9268 23.4756 9.47561 22.5366C9.73171 22.5579 10.0091 22.5793 10.2652 22.5793C11.8232 22.5793 13.253 22.0457 14.3841 21.1494C12.9543 21.128 11.7378 20.1677 11.311 18.8445C11.503 18.8872 11.7165 18.9085 11.9299 18.9085C12.2287 18.9085 12.5274 18.8659 12.8049 18.8018C11.2896 18.503 10.1372 17.1585 10.1372 15.5366C10.1372 15.5152 10.1372 15.5152 10.1372 15.4939C10.5854 15.75 11.0976 15.8994 11.6311 15.8994C10.7348 15.3018 10.1585 14.2774 10.1585 13.1463C10.1585 12.5274 10.3293 11.9726 10.6067 11.4817C12.25 13.4878 14.6829 14.811 17.4573 14.9604C17.3933 14.7256 17.372 14.4695 17.372 14.2134C17.372 12.378 18.8659 10.8841 20.7012 10.8841C21.6616 10.8841 22.5152 11.2896 23.1341 11.9299C23.8811 11.7805 24.6067 11.503 25.247 11.1189C24.9909 11.8872 24.4787 12.5488 23.7957 12.9543C24.4573 12.8689 25.0976 12.6982 25.6951 12.4421C25.2256 13.0823 24.6707 13.6799 24.0091 14.1494Z" fill="#FFFFFF"></path>
				</svg>
				</a>
			</li>
		</ul>
	</div>
</footer>

{% endblock %}
source/templates/header.html METASEP
<div data-swiftype-index=false class="notification-bar sticky-top">
    <div class="notification-bar__content">
        <a class="notification-bar__close" data-ol-has-click-handler="">
            <span aria-hidden="true">×</span>
        </a>
	    <div>
		    <div>Share your documentation feedback. If a page isn't helpful, we want to know!</div>
		</div>
    </div>
</div>
{%- if pagename == 'index' %}
<header class="site-header" itemscope="" itemtype="https://schema.org/WebSite">
{%- else %}
<header class="site-header site-header--not-home" itemscope="" itemtype="https://schema.org/WebSite">
{% endif %}
	<div class="nav-container site-header__container">
		<div class="row site-header__row">
			<div class="col-9 col-md-3 col-lg-2 site-header__col--logo">
				<a href="/" data-ol-has-click-handler=""><img src="{{ pathto('_static/images/Mattermost-Logo-Denim.svg', 1) }}" alt="Mattermost Logo"></a>
			</div>
			<div class="col-3 col-md-9 site-header__mobile-menu" id="hamburger" data-ol-has-click-handler="">
				<svg class="hamburger-open" width="25" height="20" viewBox="0 0 25 20" fill="none" xmlns="http://www.w3.org/2000/svg">
					<line y1="1.5" x2="25" y2="1.5" stroke="#1B1D22" stroke-width="3"></line>
					<line y1="9.83325" x2="25" y2="9.83325" stroke="#1B1D22" stroke-width="3"></line>
					<line y1="18.1667" x2="25" y2="18.1667" stroke="#1B1D22" stroke-width="3"></line>
				</svg>
				<svg class="hamburger-close" width="21" height="20" viewBox="0 0 21 20" fill="none" xmlns="http://www.w3.org/2000/svg">
					<line x1="2.06066" y1="1.93934" x2="19.0607" y2="18.9393" stroke="#1B1D22" stroke-width="3"></line>
					<line y1="-1.5" x2="24.0416" y2="-1.5" transform="matrix(-0.707107 0.707107 0.707107 0.707107 20 3)" stroke="#1B1D22" stroke-width="3"></line>
				</svg>
			</div>
			<div class="col-12 col-lg-10 site-header__col--menu">
				<ul class="site-nav" id="navigation">
					<li class="site-nav__toplink site-nav__hassubnav">
						<a href="javascript:void(0);" data-ol-has-click-handler="">Platform
							<span>
								<svg width="11" height="7" viewBox="0 0 11 7" fill="none" xmlns="http://www.w3.org/2000/svg">
									<path d="M1 1.50262L5.5 5.97313L10 1.50262" stroke="#BABEC9" stroke-width="1.5" stroke-linejoin="round"></path>
								</svg>
							</span>
						</a>
						<div class="sub-menu sub-menu__products">
							<figure class="sub-menu__block">
								<a href="https://mattermost.com/channels/" data-ol-has-click-handler="">
									<div class="sub-menu__block--icon">
										<img src="{{ pathto('_static/images/nav/channels-icon.svg', 1) }}">
									</div>
									<div class="sub-menu__block--text">
										<span class="sub-menu__block--text_title">Channels</span>
										<span class="sub-menu__block--text_learnmore">Learn More</span>
									</div>
								</a>
							</figure>
							<div class="sub-menu__block">
								<a href="https://mattermost.com/playbooks/" data-ol-has-click-handler="">
									<div class="sub-menu__block--icon">
										<img src="{{ pathto('_static/images/nav/playbooks-icon.svg', 1) }}">
									</div>
									<div class="sub-menu__block--text">
										<span class="sub-menu__block--text_title">Playbooks</span>
										<span class="sub-menu__block--text_learnmore">Learn More</span>
									</div>
								</a>
							</div>
							<figure class="sub-menu__block">
								<a href="https://mattermost.com/boards/" data-ol-has-click-handler="">
									<div class="sub-menu__block--icon">
										<img src="{{ pathto('_static/images/nav/boards-icon.svg', 1) }}">
									</div>
									<div class="sub-menu__block--text">
										<span class="sub-menu__block--text_title">Boards</span>
										<span class="sub-menu__block--text_learnmore">Learn More</span>
									</div>
								</a>
							</figure>
							<figure class="sub-menu__links">
								<ul>
									<li class="sub-menu__links--single">
										<a href="https://mattermost.com/platform-overview/" data-ol-has-click-handler="">
											<span class="sub-menu__links--icon"><img src="{{ pathto('_static/images/nav/ProductOverview.svg', 1) }}"></span>Product Overview
										</a>
									</li>
									<li class="sub-menu__links--single">
										<a href="https://mattermost.com/integrations-overview/" data-ol-has-click-handler="">
											<span class="sub-menu__links--icon"><img src="{{ pathto('_static/images/nav/Integrations.svg', 1) }}"></span>Integrations
										</a>
									</li>
									<li class="sub-menu__links--single">
										<a href="https://mattermost.com/security/" data-ol-has-click-handler="">
											<span class="sub-menu__links--icon"><img src="{{ pathto('_static/images/nav/Security.svg', 1) }}"></span>Security
										</a>
									</li>
								</ul>
							</figure>
						</div>
					</li>
					<li class="site-nav__toplink site-nav__hassubnav">
						<a href="javascript:void(0);" data-ol-has-click-handler="">Solutions
							<span>
								<svg width="11" height="7" viewBox="0 0 11 7" fill="none" xmlns="http://www.w3.org/2000/svg">
									<path d="M1 1.50262L5.5 5.97313L10 1.50262" stroke="#BABEC9" stroke-width="1.5" stroke-linejoin="round"></path>
								</svg>
							</span>
						</a>
						<div class="sub-menu sub-menu__solutions">
							<div class="sub-menu__col sub-menu__solutions--leftcol">
								<figure class="sub-menu__block">
									<a href="https://mattermost.com/solutions/" data-ol-has-click-handler="">
										<div class="sub-menu__block--icon">
											<img src="{{ pathto('_static/images/nav/SolutionsOverview.svg', 1) }}">
										</div>
										<div class="sub-menu__block--text">
											<span class="sub-menu__block--text_title">Solutions Overview</span>
											<span class="sub-menu__block--text_learnmore">Read More</span>
										</div>
									</a>
								</figure>
								<p class="sub-menu__col--title">
									USE CASES
								</p>
								<div class="sub-menu__links">
									<ul>
										<li class="sub-menu__links--single">
											<a href="https://mattermost.com/solutions/use-cases/secure-collaboration/" data-ol-has-click-handler="">
												<span class="sub-menu__links--icon"><img src="{{ pathto('_static/images/nav/SecureCollaboration.svg', 1) }}"></span>Secure Collaboration
											</a>
										</li>
										<li class="sub-menu__links--single">
											<a href="https://mattermost.com/solutions/use-cases/devops/" data-ol-has-click-handler="">
												<span class="sub-menu__links--icon"><img src="{{ pathto('_static/images/nav/DevOps.svg', 1) }}"></span>DevOps
											</a>
										</li>
										<li class="sub-menu__links--single">
											<a href="https://mattermost.com/solutions/use-cases/workflow-orchestration/" data-ol-has-click-handler="">
												<span class="sub-menu__links--icon"><img src="{{ pathto('_static/images/nav/WorkflowOrchestration.svg', 1) }}"></span>Workflow Orchestration
											</a>
										</li>
										<li class="sub-menu__links--single">
											<a href="https://mattermost.com/solutions/use-cases/incident-resolution/" data-ol-has-click-handler="">
												<span class="sub-menu__links--icon"><img src="{{ pathto('_static/images/nav/IncidentCollaboration.svg', 1) }}"></span>Incident Resolution
											</a>
										</li>
										<li class="sub-menu__links--single">
											<a href="https://mattermost.com/solutions/use-cases/ci-cd/" data-ol-has-click-handler="">
												<span class="sub-menu__links--icon"><img src="{{ pathto('_static/images/nav/CICD.svg', 1) }}"></span>CI/CD
											</a>
										</li>
										<li class="sub-menu__links--single">
											<a href="https://mattermost.com/solutions/use-cases/test-qa/" data-ol-has-click-handler="">
												<span class="sub-menu__links--icon"><img src="{{ pathto('_static/images/nav/TestQA.svg', 1) }}"></span>Test/QA
											</a>
										</li>
										<li class="sub-menu__links--single">
											<a href="https://mattermost.com/solutions/use-cases/it-service-desk/" data-ol-has-click-handler="">
												<span class="sub-menu__links--icon"><img src="{{ pathto('_static/images/nav/ITServiceDesk.svg', 1) }}"></span>IT Service Desk
											</a>
										</li>
										<li class="sub-menu__links--single">
											<a href="https://mattermost.com/solutions/use-cases/apm-npm/" data-ol-has-click-handler="">
												<span class="sub-menu__links--icon"><img src="{{ pathto('_static/images/nav/APM_NPM.svg', 1) }}"></span>APM/NPM
											</a>
										</li>
									</ul>
								</div>
								<div class="sub-menu__bar">
									<a href="https://mattermost.com/solutions/" data-ol-has-click-handler="">
										Solutions Overview »
									</a>
								</div>
							</div>
							<div class="sub-menu__col sub-menu__solutions--rightcol">
								<p class="sub-menu__col--title">
									INDUSTRIES
								</p>
								<div class="sub-menu__links">
									<ul>
										<li class="sub-menu__links--single">
											<a href="https://mattermost.com/solutions/industries/government/" data-ol-has-click-handler="">
												<span class="sub-menu__links--icon"><img src="{{ pathto('_static/images/nav/Government.svg', 1) }}"></span>Government
											</a>
										</li>
										<li class="sub-menu__links--single">
											<a href="https://mattermost.com/solutions/industries/financial-services/" data-ol-has-click-handler="">
												<span class="sub-menu__links--icon"><img src="{{ pathto('_static/images/nav/FinancialServices.svg', 1) }}"></span>Financial Services
											</a>
										</li>
										<li class="sub-menu__links--single">
											<a href="https://mattermost.com/solutions/industries/media-entertainment/" data-ol-has-click-handler="">
												<span class="sub-menu__links--icon"><img src="{{ pathto('_static/images/nav/MediaEntertainment.svg', 1) }}"></span>Media &amp; Entertainment
											</a>
										</li>
										<li class="sub-menu__links--single">
											<a href="https://mattermost.com/solutions/industries/legal/" data-ol-has-click-handler="">
												<span class="sub-menu__links--icon"><img src="{{ pathto('_static/images/nav/Legal.svg', 1) }}"></span>Legal
											</a>
										</li>
										<li class="sub-menu__links--single">
											<a href="https://mattermost.com/solutions/industries/healthcare/" data-ol-has-click-handler="">
												<span class="sub-menu__links--icon"><img src="{{ pathto('_static/images/nav/Healthcare.svg', 1) }}"></span>Healthcare
											</a>
										</li>
									</ul>
								</div>
							</div>
						</div>
					</li>
					<li class="site-nav__toplink">
						<a href="https://mattermost.com/pricing/" data-ol-has-click-handler="">Pricing</a>
					</li>
					<li class="site-nav__toplink site-nav__hassubnav">
						<a href="javascript:void(0);" data-ol-has-click-handler="">Developers
							<span>
								<svg width="11" height="7" viewBox="0 0 11 7" fill="none" xmlns="http://www.w3.org/2000/svg">
									<path d="M1 1.50262L5.5 5.97313L10 1.50262" stroke="#BABEC9" stroke-width="1.5" stroke-linejoin="round"></path>
								</svg>
							</span>
						</a>
						<div class="sub-menu sub-menu__community">
							<figure class="sub-menu__block">
								<a href="https://mattermost.com/deploy/" data-ol-has-click-handler="">
									<div class="sub-menu__block--icon">
										<img src="{{ pathto('_static/images/nav/Server.svg', 1) }}">
									</div>
									<div class="sub-menu__block--text">
										<span class="sub-menu__block--text_title">Deploy</span>
										<span class="sub-menu__block--text_learnmore">Run Your Server Now</span>
									</div>
								</a>
							</figure>
							<figure class="sub-menu__block">
								<a href="https://developers.mattermost.com/integrate/getting-started/" data-ol-has-click-handler="">
									<div class="sub-menu__block--icon">
										<img src="{{ pathto('_static/images/nav/Integrate.svg', 1) }}">
									</div>
									<div class="sub-menu__block--text">
										<span class="sub-menu__block--text_title">Integrate</span>
										<span class="sub-menu__block--text_learnmore">Learn More</span>
									</div>
								</a>
							</figure>
							<figure class="sub-menu__block">
								<a href="https://mattermost.com/contribute/" data-ol-has-click-handler="">
									<div class="sub-menu__block--icon">
										<img src="{{ pathto('_static/images/nav/Contribute.svg', 1) }}">
									</div>
									<div class="sub-menu__block--text">
										<span class="sub-menu__block--text_title">Contribute</span>
										<span class="sub-menu__block--text_learnmore">Learn More</span>
									</div>
								</a>
							</figure>
							<div class="sub-menu__links">
								<ul>
									<li class="sub-menu__links--single">
										<a href="https://mattermost.com/blog/" data-ol-has-click-handler="">
											<span class="sub-menu__links--icon"><img src="{{ pathto('_static/images/nav/Blog.svg', 1) }}"></span>Blog
										</a>
									</li>
									<li class="sub-menu__links--single">
										<a href="https://mattermost.com/resources/" data-ol-has-click-handler="">
											<span class="sub-menu__links--icon"><img src="{{ pathto('_static/images/nav/Resources.svg', 1) }}"></span>Resources
										</a>
									</li>
									<li class="sub-menu__links--single">
										<a href="https://mattermost.com/community/" data-ol-has-click-handler="">
											<span class="sub-menu__links--icon"><img src="{{ pathto('_static/images/nav/Community.svg', 1) }}"></span>Community
										</a>
									</li>
								</ul>
							</div>
							<div class="sub-menu__links">
								<ul>
									<li class="sub-menu__links--single">
										<a href="https://docs.mattermost.com/" data-ol-has-click-handler="">
											<span class="sub-menu__links--icon"><img src="{{ pathto('_static/images/nav/Docs.svg', 1) }}"></span>Docs
										</a>
									</li>
									<li class="sub-menu__links--single">
										<a href="https://api.mattermost.com/" data-ol-has-click-handler="">
											<span class="sub-menu__links--icon"><img src="{{ pathto('_static/images/nav/APIReference.svg', 1) }}"></span>API Reference
										</a>
									</li>
									<li class="sub-menu__links--single">
										<a href="https://docs.mattermost.com/install/self-managed-changelog.html" data-ol-has-click-handler="">
											<span class="sub-menu__links--icon"><img src="{{ pathto('_static/images/nav/ReleaseNotes.svg', 1) }}"></span>Release Notes
										</a>
									</li>
								</ul>
							</div>
						</div>
					</li>
					<li class="site-nav__toplink">
						<a href="https://mattermost.com/customers/" data-ol-has-click-handler="">Customers</a>
					</li>
					<li class="site-nav__toplink site-nav__hassubnav">
						<a href="javascript:void(0);" data-ol-has-click-handler="">Login
							<span>
								<svg width="11" height="7" viewBox="0 0 11 7" fill="none" xmlns="http://www.w3.org/2000/svg">
									<path d="M1 1.50262L5.5 5.97313L10 1.50262" stroke="#BABEC9" stroke-width="1.5" stroke-linejoin="round"></path>
								</svg>
							</span>
						</a>
						<div class="sub-menu sub-menu__login">
							<figure class="sub-menu__block">
								<a href="https://customers.mattermost.com/cloud/connect-workspace" data-ol-has-click-handler="">
									<div class="sub-menu__block--icon">
										<img src="{{ pathto('_static/images/nav/my-workspace.svg', 1) }}">
									</div>
									<div class="sub-menu__block--text">
										<span class="sub-menu__block--text_title">My Workspace</span>
										<span class="sub-menu__block--text_learnmore">Login</span>
									</div>
								</a>
							</figure>
							<figure class="sub-menu__block">
								<a href="https://customers.mattermost.com/login/" data-ol-has-click-handler="">
									<div class="sub-menu__block--icon">
										<img src="{{ pathto('_static/images/nav/my-account.svg', 1) }}">
									</div>
									<div class="sub-menu__block--text">
										<span class="sub-menu__block--text_title">My Account</span>
										<span class="sub-menu__block--text_learnmore">Login</span>
									</div>
								</a>
							</figure>
							<figure class="sub-menu__block">
								<a href="https://mattermost.com/apps/" data-ol-has-click-handler="">
									<div class="sub-menu__block--icon">
										<img src="{{ pathto('_static/images/nav/apps.svg', 1) }}">
									</div>
									<div class="sub-menu__block--text">
										<span class="sub-menu__block--text_title">Apps</span>
										<span class="sub-menu__block--text_learnmore">Download</span>
									</div>
								</a>
							</figure>
							<figure class="sub-menu__block">
								<a href="https://support.mattermost.com/hc/en-us/" data-ol-has-click-handler="">
									<div class="sub-menu__block--icon">
										<img src="{{ pathto('_static/images/nav/support.svg', 1) }}">
									</div>
									<div class="sub-menu__block--text">
										<span class="sub-menu__block--text_title">Support</span>
										<span class="sub-menu__block--text_learnmore">Help Center</span>
									</div>
								</a>
							</figure>
						</div>
					</li>
					<li class="site-nav__toplink site-nav__button">
						<a class="mm-button mm-button-solid mm-button-blue" href="https://mattermost.com/trial/" data-ol-has-click-handler="">Free Trial</a>
					</li>
					<li class="site-nav__toplink site-nav__button site-nav__button--secondary">
						<a class="mm-button mm-button-outline--thin mm-button-outline--thin-blue" href="https://mattermost.com/contact-sales/" data-ol-has-click-handler="">Contact Sales</a>
					</li>
				</ul>
			</div>
		</div>
	</div>
	{%- if pagename != 'index' %}
	<div class="header__searchbar">
		<form id="rtd-search-form" class="wy-form" action="{{ pathto('search') }}" method="get">
			<input type="text" name="q" placeholder="Search by keyword" autofocus />
			<input type="hidden" name="check_keywords" value="yes" />
			<input type="hidden" name="area" value="default" />
		</form>
	</div>
	{% endif %}
</header>

source/templates/breadcrumbs.html METASEP
{# Support for Sphinx 1.3+ page_source_suffix, but don't break old builds. #}

{% if page_source_suffix %}
  {% set suffix = page_source_suffix %}
{% else %}
  {% set suffix = source_suffix %}
{% endif %}

<div data-swiftype-index=false role="navigation" aria-label="breadcrumbs navigation">
  <ul class="wy-breadcrumbs">
    <li><a href="{{ pathto(master_doc) }}">Docs</a> &raquo;</li>
    {% for doc in parents %}
      <li><a href="{{ doc.link|e }}">{{ doc.title }}</a> &raquo;</li>
    {% endfor %}
    <li>{{ title }}</li>
    <li class="wy-breadcrumbs-aside">
      <div class="search__icon">
        <i class="fa fa-search"></i> <span>Search</span>
      </div>
      {% if pagename != "search" %}
        {% if display_github %}
          <a href="https://{{ github_host|default("github.com") }}/{{ github_user }}/{{ github_repo }}/blob/{{ github_version }}{{ conf_py_path }}{{ pagename }}{{ suffix }}" class="fa fa-github"> Edit</a>
        {% elif display_bitbucket %}
          <a href="https://bitbucket.org/{{ bitbucket_user }}/{{ bitbucket_repo }}/src/{{ bitbucket_version}}{{ conf_py_path }}{{ pagename }}{{ suffix }}" class="fa fa-bitbucket"> Edit</a>
        {% elif show_source and source_url_prefix %}
          <a href="{{ source_url_prefix }}{{ pagename }}{{ suffix }}">View page source</a>
        {% elif show_source and has_source and sourcename %}
          <a href="{{ pathto('_sources/' + sourcename, true)|e }}" rel="nofollow"> View page source</a>
        {% endif %}
      {% endif %}
    </li> 
  </ul>
  <hr/>
</div>

source/templates/404.html METASEP
<!DOCTYPE html>
<html lang="en">
<head>
  <title>404 Page Not Found</title>
  <meta http-equiv="refresh" content="0;url=https://docs.mattermost.com"/>
</head>
<body>
</body>
</html>

source/scale/scaling-for-enterprise.rst METASEP
Scaling for Enterprise 
======================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Mattermost is designed to scale from small teams hosted on a single server to large enterprises running in cluster-based, highly available deployment configurations.

Server requirements vary based on usage and it is highly recommended that pilots are run before enterprise-wide deployments in order to estimate full scale usage based on your specific organizational needs.

Single machine deployment
-------------------------

Organizations can typically run Mattermost on a single server with up to 2,000 users, though more users have been observed based on different usage and server configurations.

- See `install guides for step-by-step configuration instructions for single machine setup <https://docs.mattermost.com/guides/deployment.html#install-mattermost>`__.
- See `hardware and software requirements for hardware sizing <https://docs.mattermost.com/install/software-hardware-requirements.html>`__.

Multi machine deployment
------------------------

Deployments between 2,000 and 10,000 registered users with moderate usage can run on a standard three-machine Mattermost deployment with a proxy, an application server and a database server. At this scale, demands of larger organizations can typically be met by using powerful hardware in a standard configuration.

- See `install guides for step-by-step configuration instructions for multi-machine setup <https://docs.mattermost.com/guides/deployment.html#install-mattermost>`__.
- See `hardware and software requirements for hardware sizing <https://docs.mattermost.com/install/software-hardware-requirements.html>`__.

Cluster-based deployment
------------------------

.. include:: ../_static/badges/ent-only.rst
  :start-after: :nosearch:

*Available in legacy Mattermost Enterprise Edition E20*

Deployments over 10,000 registered users with moderate usage can be supported by adding additional servers in cluster-based, High Availability configuration. To date, the largest simulation included `70,000 concurrent users on a single Mattermost instance <https://mattermost.com/blog/performance-scale-mattermost/>`__.

This configuration uses a load balancer to distribute requests from users across multiple Mattermost application servers, allowing the system to scale beyond the limits of any single server.

For more information, see `High Availability deployment guide for horizontal scaling setup <https://docs.mattermost.com/scale/high-availability-cluster.html>`__.

Sample scaling guide
--------------------

This guide demonstrates how to budget for, and build, large-scale Mattermost deployments.

Mattermost can be deployed on-premises or on the cloud platform of your choice, including AWS, Google Cloud, Microsoft Azure, and Oracle Cloud. This guide uses AWS as an example.

Based on the `hardware requirements <https://docs.mattermost.com/install/software-hardware-requirements.html#hardware-requirements>`__, here’s what Mattermost’s server architecture looks like for a 10,000-user deployment:

.. image:: ../images/scaling-1.png
   :alt: Mattermost server architecture for a 10,000 user deployment

**Sizing guide using AWS**

On AWS, we recommend using the following EC2 server types as a baseline:

* App servers: m5.xlarge
* Database servers: r4.xlarge

For the purposes of this guide, we'll assume medium usage (10 MB/user/month with a 2x safety factor) for `storage estimates <https://docs.mattermost.com/install/software-hardware-requirements.html#alternate-storage-calculations>`__ and 200 MB/user/month for data transfer estimates. We will also assume on-demand pricing with no upfront payments, though more savings (typically 40% or more) can be achieved with reserved servers on 1–3 year commitments and upfront payments.

As deployments scale above 5,000 users, additional servers are added for performance load-balancing and for providing additional redundancy (see our `High Availability Cluster guide <https://docs.mattermost.com/scale/high-availability-cluster.html#mattermost-server-configuration>`__).

`This spreadsheet <https://docs.google.com/spreadsheets/u/1/d/e/2PACX-1vRkhRPFsf1_91AXFbqnmUT0UnpdZ1ZagbiTw9sfuBAL21ncnu7fynZ3yDrp22-LXCeXh0-xF_NFFPp3/pubhtml>`__ shows how much hardware you’ll need for different-sized Mattermost deployments and provides an estimate of how much each will cost. It includes links to AWS’s cost calculator for various deployment sizes. The smaller deployment examples (i.e., 1,000 users and 5,000 users) are on the conservative side, with separate servers per function that can easily be scaled out as Mattermost is rolled out.

Here’s an example of the hardware you’ll need for a 10,000-user deployment:

.. image:: ../images/scaling-3.png
   :alt: Hardware needed for a 10,000 user deployment

For more information, check out our `Administrator Onboarding Tasks <https://docs.mattermost.com/getting-started/admin-onboarding-tasks.html#administrator-tasks>`__ documentation.

Hosting recommendation for 100,000+ users
-----------------------------------------

The following matrix presents key features for a successful multi-region Mattermost implementation that scales to 100,000 users with support for high availability and geographically based traffic routing in on premises, AWS, and Azure deployments.

To scale to 100,000 users and above, we recommended using `the Mattermost open source load testing framework <https://github.com/mattermost/mattermost-load-test-ng>`__ to simulate usage of your system at full scale.

.. csv-table::
    :header: "Feature", "Self-Hosted", "Amazon AWS", "Azure"

    "Multi-region/data center support", "Yes", "Regions: 16", "Regions: 54"
    "Auto scaling for Mattermost nodes", "Yes - using a solution like Kubernetes", "`AWS Auto Scaling <https://aws.amazon.com/ec2/autoscaling/>`__", "`Azure Autoscale <https://azure.microsoft.com/en-us/features/autoscale/>`__"
    "Geographic based traffic routing", "Yes", "`Route 53 <https://aws.amazon.com/route53/>`__", "`Azure DNS <https://azure.microsoft.com/en-us/services/dns/>`__"
    "Load balancing", "Yes", "`Elastic Load Balancer <https://aws.amazon.com/elasticloadbalancing/>`__", "`Azure Load Balancer <https://azure.microsoft.com/en-us/services/load-balancer/>`__"
    "Multi-region, HA storage", "Yes", "`S3 <https://aws.amazon.com/s3/>`__", "?"
    "Multi-region, HA MySQL", "Yes - using a solution like Galera", "`Aurora <https://aws.amazon.com/rds/aurora/>`__ / `RDS for MySQL <https://aws.amazon.com/rds/mysql/>`__", "`Azure MySQL <https://azure.microsoft.com/en-us/services/mysql/>`__"
    "Multi-region, HA PostgreSQL", "Yes", "`Aurora <https://aws.amazon.com/rds/aurora/>`__ / `RDS for PostgreSQL <https://aws.amazon.com/rds/postgresql/>`__", "`Azure PostgreSQL <https://azure.microsoft.com/en-us/services/postgresql/>`__"
    "Multi-region, HA elasticsearch", "Yes", "`Amazon Elasticsearch Service <https://aws.amazon.com/opensearch-service/>`__", "No"

source/scale/performance-monitoring.rst METASEP
Performance monitoring
======================

.. include:: ../_static/badges/ent-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Mattermost Enterprise Edition E20*

Performance monitoring support enables a Mattermost server to track system health for large Enterprise deployments through integrations with `Prometheus <https://prometheus.io/>`__ and `Grafana <https://grafana.org/>`__. The integration supports data collection from several Mattermost servers, particularly useful if you're running Mattermost `in high availability mode <https://docs.mattermost.com/scale/high-availability-cluster.html>`__.

Install Prometheus
-------------------

1. `Download a precompiled binary for Prometheus <https://prometheus.io/download/>`__. Binaries are provided for many popular distributions, including Darwin, Linux, and Windows. For installation instructions, see the `Prometheus install guides <https://prometheus.io/docs/introduction/getting_started/>`__.

2. The following settings are recommended in the Prometheus configuration file named ``prometheus.yml``:

.. code:: yaml

    # my global config
    global:
      scrape_interval:     60s # By default, scrape targets every 15 seconds.
      evaluation_interval: 60s # By default, scrape targets every 15 seconds.
      # scrape_timeout is set to the global default (10s).

      # Attach these labels to any time series or alerts when communicating with
      # external systems (federation, remote storage, Alertmanager).
      external_labels:
          monitor: 'mattermost-monitor'

    # Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
    rule_files:
      # - "first.rules"
      # - "second.rules"

    # A scrape configuration containing exactly one endpoint to scrape:
    # Here it's Prometheus itself.
    scrape_configs:
      # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
      - job_name: 'prometheus'

        # Override the global default and scrape targets from this job every five seconds.
        # scrape_interval: 5s

        # metrics_path defaults to '/metrics'
        # scheme defaults to 'http'.

        static_configs:
          - targets: ["<hostname1>:<port>", "<hostname2>:<port>"]

Replace the ``<hostname1>:<port>`` parameter with your Mattermost host IP address and port to scrape the data. It connects to ``/metrics`` using HTTP. 

3. In the Mattermost System Console, go to **Environment > Performance Monitoring** to set **Enable Performance Monitoring** to **true**, then specify the **Listen Address** and select **Save**. See our `Configuration Settings <https://docs.mattermost.com/configure/configuration-settings.html#performance-monitoring>`__ documentation for details.

.. image:: ../images/perf_monitoring_system_console.png
  :scale: 70
  :alt: Enable performance monitoring options in the System Console by going to Environment > Performance Monitoring, then specifying a listen address.

4. To test that the server is running, go to ``<ip>:<port>/metrics``.

.. note::
   A Mattermost Enterprise license is required to connect to ``/metrics`` using HTTP.

5. Finally, run ``vi prometheus.yml`` to finish configuring Prometheus. For starting the Prometheus service, read the `comprehensive guides provided by Prometheus <https://prometheus.io/docs/introduction/getting_started/#starting-prometheus>`__.

6. Once the service has started, you can access the data in ``<localhost>:<port>/graph``. While you can use the Prometheus service to create graphs, we'll focus on creating metric and analytics dashboards in Grafana.

.. note:: 
  For troubleshooting advice, check the `Prometheus FAQ page <https://prometheus.io/docs/introduction/faq/>`__.

Install Grafana
----------------

1. `Download a precompiled binary for Grafana <https://grafana.com/docs/grafana/latest/installation/debian/>`__ on Ubuntu or Debian. Binaries are also available for other distributions, including Redhat, Windows and Mac. For install instructions, see `Grafana install guides <https://grafana.com/docs/grafana/latest/installation/debian/>`__

2. The Grafana package is installed as a service, so it is easy to start the server. See their `install guides <https://grafana.com/docs/grafana/latest/installation/debian/>`__ to learn more.

3. The default HTTP port is ``3000`` and default username and password are ``admin``.

4. Add a Mattermost data source with the following settings as defined in the screenshot below

.. image:: ../images/mattermost_datasource.png
   :alt: Mattermost data source configuration settings for a Grafana installation.

.. note:: 

  - For troubleshooting advice, check the `Grafana Troubleshooting page <https://grafana.com/docs/grafana/latest/troubleshooting/>`__. 
  - For user guides and tutorials, check the `Grafana documentation to learn more <https://grafana.com/docs/grafana/latest/>`__.

Getting started
---------------

To help you get started, you can download three sample dashboards shared in Grafana:

- `Mattermost Performance Monitoring v2 <https://grafana.com/grafana/dashboards/15582>`__, which contains detailed charts for performance monitoring including application, cluster, job server, and system metrics.
- `Mattermost Collapsed Reply Threads Metrics <https://grafana.com/grafana/dashboards/15581>`__, which contains detailed metrics on the queries involved in our Collapsed Reply Threads feature.
- `Mattermost Performance KPI Metrics <https://grafana.com/grafana/dashboards/2539>`__, which contains key metrics for monitoring performance and system health.
- `Mattermost Performance Monitoring (Bonus Metrics) <https://grafana.com/grafana/dashboards/2545>`__, which contains additional metrics such as emails sent or files uploaded, which may be important to monitor in some deployments.

See `this guide <https://grafana.com/docs/grafana/v7.5/dashboards/export-import/>`__ to learn how to import Grafana dashboards either from the UI or from the HTTP API.

Statistics
----------

Mattermost provides the following performance monitoring statistics to integrate with Prometheus and Grafana.

Custom Mattermost metrics
~~~~~~~~~~~~~~~~~~~~~~~~~

The following is a list of custom Mattermost metrics that can be used to monitor your system's performance:

API metrics
^^^^^^^^^^^

- ``mattermost_api_time``: The total time in seconds to execute a given API handler.

Caching metrics
^^^^^^^^^^^^^^^

- ``mattermost_cache_etag_hit_total``: The total number of ETag cache hits for a specific cache.
- ``mattermost_cache_etag_miss_total``: The total number of ETag cache misses for an API call.
- ``mattermost_cache_mem_hit_total``: The total number of memory cache hits for a specific cache.
- ``mattermost_cache_mem_invalidation_total``: The total number of memory cache invalidations for a specific cache.
- ``mattermost_cache_mem_miss_total``: The total number of cache misses for a specific cache.

The above metrics can be used to calculate ETag and memory cache hit rates over time.

.. image:: ../images/perf_monitoring_caching_metrics.png
   :alt: Example caching metrics, including Etag hit rate and mem cache hit rate, in a self-hosted Mattermost deployment.

Cluster metrics
^^^^^^^^^^^^^^^

- ``mattermost_cluster_cluster_request_duration_seconds``:  The total duration in seconds of the inter-node cluster requests.
- ``mattermost_cluster_cluster_requests_total``: The total number of inter-node requests.
- ``mattermost_cluster_event_type_totals``: The total number of cluster requests sent for any type.

Database metrics
^^^^^^^^^^^^^^^^

- ``mattermost_db_master_connections_total``: The total number of connections to the master database.
- ``mattermost_db_read_replica_connections_total``: The total number of connections to all the read replica databases.
- ``mattermost_db_search_replica_connections_total``: The total number of connections to all the search replica databases.
- ``mattermost_db_store_time``: The total time in seconds to execute a given database store method.
- ``mattermost_db_replica_lag_abs``: Absolute lag time based on binlog distance/transaction queue length.
- ``mattermost_db_replica_lag_time``: The time taken for the replica to catch up.

HTTP metrics
^^^^^^^^^^^^

- ``mattermost_http_errors_total``: The total number of http API errors.
- ``mattermost_http_request_duration_seconds``: The total duration in seconds of the http API requests.
- ``mattermost_http_requests_total``: The total number of http API requests.

.. image:: ../images/perf_monitoring_http_metrics.png
   :alt: Example HTTP metrics, including number of API errors per minute, number of API requests per minute, and mean request time per minute, in a self-hosted Mattermost deployment.

Login and session metrics
^^^^^^^^^^^^^^^^^^^^^^^^^

- ``mattermost_http_websockets_total`` The total number of WebSocket connections to the server.
- ``mattermost_login_logins_fail_total``: The total number of failed logins.
- ``mattermost_login_logins_total``: The total number of successful logins.

Mattermost Channels metrics
^^^^^^^^^^^^^^^^^^^^^^^^^^^

- ``mattermost_post_broadcasts_total``: The total number of WebSocket broadcasts sent because a post was created.
- ``mattermost_post_emails_sent_total``: The total number of emails sent because a post was created.
- ``mattermost_post_file_attachments_total``: The total number of file attachments created because a post was created.
- ``mattermost_post_pushes_sent_total``: The total number of mobile push notifications sent because a post was created.
- ``mattermost_post_total``: The total number of posts created.
- ``mattermost_post_webhooks_totals``: The total number of webhook posts created.

.. image:: ../images/perf_monitoring_messaging_metrics.png
   :alt: Example Mattermost Channels metrics, including messages per minute, broadcasts per minute, emails sent per minute, mobile push notifications per minute, and number of file attachments per minute, in a self-hosted Mattermost deployment.

Process metrics
^^^^^^^^^^^^^^^

- ``mattermost_process_cpu_seconds_total``: Total user and system CPU time spent in seconds.
- ``mattermost_process_max_fds``: Maximum number of open file descriptors.
- ``mattermost_process_open_fds``: Number of open file descriptors.
- ``mattermost_process_resident_memory_bytes``: Resident memory size in bytes.
- ``mattermost_process_start_time_seconds``: Start time of the process since unix epoch in seconds.
- ``mattermost_process_virtual_memory_bytes``: Virtual memory size in bytes.

Search metrics
^^^^^^^^^^^^^^

- ``mattermost_search_posts_searches_duration_seconds_sum``: The total duration, in seconds, of search query requests.
- ``mattermost_search_posts_searches_duration_seconds_count``: The total number of search query requests.

WebSocket metrics
^^^^^^^^^^^^^^^^^

- ``mattermost_websocket_broadcasts_total``: The total number of WebSocket broadcasts sent by type.
- ``mattermost_websocket_event_total``: The total number of WebSocket events sent by type.
    
Logging metrics
^^^^^^^^^^^^^^^

- ``logger_queue_used``: Current logging queue level(s).
- ``logger_logged_total``: The total number of logging records emitted.
- ``logger_error_total``: The total number of logging errors.
- ``logger_dropped_total``: The total number of logging records dropped.
- ``logger_blocked_total``: The total number of logging records blocked.
    
Debugging metrics
^^^^^^^^^^^^^^^^^

- ``mattermost_system_server_start_time``: Server start time. Set to the current time on server start. 
- ``mattermost_jobs_active``: Increment when a job starts and decrement when the job ends. 
    
Use ``mattermost_system_server_start_time`` to dynamically add an annotation corresponding to the event.

.. image:: ../images/mattermost_system_server_start_time.png
   :alt: Example debugging metrics, including number of messages per second, in a self-hosted Mattermost deployment.

Use ``mattermost_jobs_active`` to display an active jobs chart.

.. image:: ../images/mattermost_active_jobs_chart.png
   :alt: Example debugging metrics, including active jobs, in a self-hosted Mattermost deployment.

Or, use ``mattermost_jobs_active`` to dynamically add a range annotation corresponding to jobs being active.

.. image:: ../images/mattermost_dynamic_range_annotation.png
   :alt: Example debugging metrics, including number of messages per second, in a self-hosted Mattermost deployment.

Use annotations to streamline analysis when a job is long running, such as an LDAP synchronization job. 

.. note:: 
  Jobs where the runtime is less than the Prometheus polling interval are unlikely to be visible because Grafana is performing range queries over the raw Prometheus timeseries data, and rendering an event each time the value changes.

Standard Go metrics
~~~~~~~~~~~~~~~~~~~

The performance monitoring feature provides standard Go metrics for HTTP server runtime profiling data and system monitoring, such as:

- ``go_memstats_alloc_bytes`` for memory usage
- ``go_goroutines`` for number of goroutines
- ``go_gc_duration_seconds`` for garbage collection duration
- ``go_memstats_heap_objects`` for object tracking on the heap

.. note::
  Profile reports are available to Team Edition and Enterprise Edition users.

To learn how to set up runtime profiling, see the `pprof package Go documentation <https://pkg.go.dev/net/http/pprof>`__. You can also visit the ``ip:port`` page for a complete list of metrics with descriptions.

.. note::
   A Mattermost Enterprise license is required to connect to ``/metrics`` using HTTP.

If enabled, you can run the profiler by

``go tool pprof channel http://localhost:<port>/debug/pprof/profile``

where you can replace ``localhost`` with the server name. The profiling reports are available at ``<ip>:<port>``, which include:

- ``/debug/pprof/`` for CPU profiling
- ``/debug/pprof/cmdline/`` for command line profiling
- ``/debug/pprof/symbol/`` for symbol profiling
- ``/debug/pprof/goroutine/`` for GO routine profiling
- ``/debug/pprof/heap/`` for heap profiling
- ``/debug/pprof/threadcreate/`` for threads profiling
- ``/debug/pprof/block/`` for block profiling

.. image:: ../images/perf_monitoring_go_metrics.png
   :alt: Example Go metrics for HTTP server runtime profiling data and system monitoring, including memory usage, Go routines, and garbage collection duration, in a self-hosted Mattermost deployment.

Frequently asked questions
--------------------------

Why are chart labels difficult to distinguish?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The chart labels used in server filters and legends are based on the hostname of your machines. If the hostnames are similar, then it will be difficult to distinguish the labels.

You can either set more descriptive hostnames for your machines or change the display name with a ``relabel_config`` in  `Prometheus configuration <https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config>`__.

source/scale/performance-alerting.rst METASEP
Mattermost performance alerting guide
======================================

.. include:: ../_static/badges/ent-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Mattermost Enterprise Edition E20*

Mattermost recommends using Prometheus and Grafana to track performance metrics of the Mattermost application servers. The purpose of this guide is to help you set up alerts on your Grafana dashboard.  

.. note:: 
  We highly recommend setting up performance alerting for deployments above 5,000 users, where additional servers have been added for performance load-balancing.

**Prerequisites**

Set up performance monitoring for Mattermost. See our `Performance Monitoring <https://docs.mattermost.com/scale/performance-monitoring.html>`__ documentation to learn more.

To get alerts, first set up a Notification Channel in Grafana. Here’s how you can set it up to automatically post alerts in Mattermost:

1. In Mattermost:

  a. Create an Alerts channel.
  b. Create an `incoming webhook <https://developers.mattermost.com/integrate/admin-guide/admin-webhooks-incoming/>`__ for the Alerts channel and copy the URL.

2. In Grafana:

  a. Under the alert icon in the sidebar, select **Notification channels**.
  b. Select **Add channel**.
  c. Enter **Mattermost Alerts Channel** as the name.
  d. For type, select **Slack**.
  e. Paste your webhook URL into the URL field.
  f. Include an @ mention in the mention field, if you want to send mentions when an alert is posted to Mattermost.
  g. Press **Send Test** to test the alert.

If you would also like to get email alerts, you can follow `these instructions <https://grafana.com/docs/grafana/latest/alerting/>`__ to set that up.

**Configuring alerts**

The `Mattermost dashboards <https://grafana.com/dashboards?search=mattermost>`__ for Grafana come with some partially pre-configured alerts on the following charts:

* CPU Utilization Rate
* Memory Usage
* Number of Goroutines
* Number of API Errors per Second
* Mean API Request Time

To configure alerts, set an appropriate threshold and enable notifications. Enabling notifications is the same for each chart, but setting the correct threshold can have some variances that are better handled on a per-chart basis.

1. For each chart, select the chart name, then select **Edit**:

.. image:: ../images/perf-1.png
   :alt: Configure Grafana dashboard alerts for each chart by selecting the chart name then selecting Edit.

2. Select the **Alert** tab:

.. image:: ../images/perf-2.png 
   :alt: Switch to the Alert tab to access and configure Grafana dashboard alerts for the current chart.

3. The alert threshold, which will be discussed in the sections below, is the last field under **Conditions** (the one set to 600 in the screenshot above).

See the sections below for how to set the threshold for each individual chart. If you would like to add your own custom alert conditions, configure them here.

.. image:: ../images/perf-3.png
   :alt: When configuring Grafana dashboard alerts, set custom threshold conditions in the Conditions section of the screen.

4. To enable the notifications for any alerts, select the **Notification** tab on the left, then select **Mattermost Alerts Channel** under **Send to**:

.. image:: ../images/perf-4.png
   :alt: When configuring Grafana dashboard alerts, set notifications for any alerts by switching to the Notification tab, selecting Send to, then selecting by Mattermost Alerts Channel. 

Enter a message if you would like to add more context to the alert.

By default, the alerts are configured to check the average of a chart over the last minute to see if that value is above a threshold. If it’s above the threshold, the alert will be triggered. Since it’s an average over the last minute, small spikes that go past the threshold won’t necessarily cause an alert. This helps prevent false positives that would result from natural spikes in usage. The alert state for each chart is evaluated every minute.

The sections below describe each chart in more detail.

CPU utilization rate
---------------------

CPU Utilization Rate is fairly straightforward. CPU Utilization Rate tracks the CPU usage of the app servers as a percentage. The maximum percentage is based on the number of CPU cores or vCPUs your app server has. For example, if you have four CPU cores and your app server was at 100% utilization rate on all four cores, the graph would show 400% for that app server.

It’s best to set the alert threshold based on your average CPU utilization and how many cores/vCPUs your app servers have. Take a look at the chart over the last seven days. You’ll want to set the threshold somewhere between your maximum CPU usage (cores * 100) and the CPU usage you see. The lower you set the threshold, the more alerts, and therefore the more false positives, you will get. Set the threshold too high and you may not receive an alert for an incident until it’s gotten worse. The same principle applies to all alerts, regardless of the chart.

For example, on our community server, we have the threshold set to 15%:

.. image:: ../images/perf-5.png
   :alt: Example CPU utilization rate metrics for the Mattermost Community Server, where the threshold is set to 15%. System Admins should set the threshold between the maximum CPU usage and the CPU usage observed in metrics.

This value is below our maximum CPU usage and above our average usage at peak times. Therefore, we will get alerts if we begin experiencing unusually high CPU usage.

Memory usage
-------------

Memory Usage tracks the megabytes of RAM that your app servers are using. Set the threshold similar to the CPU Utilization Rate: below maximum available memory and above your average usage during peak times.

Here’s how we have the alert set on our Community server: 

.. image:: ../images/perf-6.png
   :alt: Example memory usage metrics for the Mattermost Community Server, where the threshold is configured similarly to the CPU utilization rate.

Number of Goroutines
---------------------

Goroutines are functions or methods that run concurrently with other functions and methods. Goroutines are like lightweight threads with low-creation costs. A rising number of goroutines can be a good measure of the performance of your app servers. A continuous increase indicates your app server can't keep up and is creating goroutines faster than they can complete their tasks and stop.

Set the threshold somewhere above the average number of goroutines you see during peak load times. Small spikes are usually nothing to worry about. It’s the uncontrolled climbing of goroutines that you want to watch out for.

Here’s how we have it set on our Community server:

.. image:: ../images/perf-7.png
   :alt: Example Goroutines metrics for the Mattermost Community Server, where the threshold is configured above the average number of Goroutines observed during peak load times.

Number of API errors per second
--------------------------------

Any 4xx or 5xx HTTP response status codes are counted as a REST API error. API errors themselves are not necessarily a problem. There are many legitimate reasons for an API error to occur, such as users’ sessions expiring or clients requesting to see if a resource exists and is being given a ``404 Not Found`` response. It is normal to have some API errors that scale with your installation base.

That said, errors against the REST API can be indicative of deployment and other issues. For example, if one of your app servers did not deploy correctly for whatever reason, it may begin returning a high number of API errors. Another example would be a rogue bot spamming the API with bad requests. Alerts on API errors per second would help catch these and other issues.

Here’s how it’s set on our Community server:

.. image:: ../images/perf-8.png
   :alt: Example metrics of the number of API errors per second for the Mattermost Community Server, where it's normal to have some API errors that scale with an installation base, but that can be indicative of deployment issues or other issues.

Mean API request time
----------------------

The Mean API Request Time is the average amount of time a REST API request to the Mattermost app server takes to complete. If an app server starts to perform poorly, you’ll likely see a rise in the mean request time as it takes longer to complete requests. This could also happen if your database can’t sustain the load from the app servers. It may also be indicative of an issue between the app servers and your proxy.

You’ll want to set the alert threshold a little above what the mean request time is during your peak load times.

Here’s how it’s set on our community server:

.. image:: ../images/perf-9-b.png
   :alt: Example mean API request time metrics for the Mattermost Community Server, where the alert threshold is configured a bit above the mean request time during peak load times.

Plugin hooks
-------------

You can trace hooks and plugin API calls with Prometheus. Below are some examples of hooks and API Prometheus metrics that you may want to be aware of when troubleshooting or monitoring your server's performance.

.. code-block:: none

  # HELP mattermost_plugin_hook_time Time to execute plugin hook handler in seconds.
  # TYPE mattermost_plugin_hook_time histogram
  mattermost_plugin_hook_time_bucket{hook_name="ChannelHasBeenCreated",plugin_id="com.mattermost.demo-plugin",success="true",le="0.005"} 0
  mattermost_plugin_hook_time_bucket{hook_name="ChannelHasBeenCreated",plugin_id="com.mattermost.demo-plugin",success="true",le="0.01"} 0

.. code-block:: none

  # HELP mattermost_plugin_multi_hook_time Time to execute multiple plugin hook handler in seconds.
  # TYPE mattermost_plugin_multi_hook_time histogram
  mattermost_plugin_multi_hook_time_bucket{plugin_id="com.mattermost.custom-attributes",le="0.005"} 100
  mattermost_plugin_multi_hook_time_bucket{plugin_id="com.mattermost.custom-attributes",le="0.01"} 100

.. code-block:: none

  # HELP mattermost_plugin_multi_hook_server_time Time for the server to execute multiple plugin hook handlers in seconds.
  # TYPE mattermost_plugin_multi_hook_server_time histogram
  mattermost_plugin_multi_hook_server_time_bucket{le="0.005"} 1043
  
.. code-block:: none

  # HELP mattermost_plugin_api_time Time to execute plugin API handlers in seconds.
  # TYPE mattermost_plugin_api_time histogram
  mattermost_plugin_api_time_bucket{api_name="AddUserToChannel",plugin_id="com.mattermost.plugin-incident-response",success="true",le="0.005"} 0
  mattermost_plugin_api_time_bucket{api_name="AddUserToChannel",plugin_id="com.mattermost.plugin-incident-response",success="true",le="0.01"} 0

Other alerts
-------------

If you want more alerts, you can set them up on any of the Grafana charts you'd like. We recommend reviewing custom metrics listed on our `Performance Monitoring feature documentation <https://docs.mattermost.com/scale/performance-monitoring.html#statistics>`_.

source/scale/high-availability-cluster.rst METASEP
High Availability cluster
=========================

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Mattermost Enterprise Edition E20*

A High Availability cluster enables a Mattermost system to maintain service during outages and hardware failures through the use of redundant infrastructure.

High Availability in Mattermost consists of running redundant Mattermost application servers, redundant database servers, and redundant load balancers. The failure of any one of these components does not interrupt operation of the system.

.. note::
  
  This document applies to Mattermost Server v4.0 and later.

Requirements for continuous operation
-------------------------------------

To enable continuous operation at all times, including during server updates and server upgrades, you must make sure that the redundant components are properly sized and that you follow the correct sequence for updating each of the system's components.

Redundancy at anticipated scale
  Upon failure of one component, the remaining application servers, database servers, and load balancers must be sized and configured to carry the full load of the system. If this requirement is not met, an outage of one component can result in an overload of the remaining components, causing a complete system outage.

Update sequence for continuous operation
  You can apply most configuration changes and dot release security updates without interrupting service, provided that you update the system components in the correct sequence. See the `Upgrade Guide`_ for instructions on how to do this.

  **Exception:** Changes to configuration settings that require a server restart, and server version upgrades that involve a change to the database schema, require a short period of downtime. Downtime for a server restart is around five seconds. For a database schema update, downtime can be up to 30 seconds.

Deployment guide
----------------

Deployment guide to set up and maintain High Availability on your Mattermost servers. This document does not cover the configuration of databases in terms of disaster recovery, however, you can refer to the `Frequently Asked Questions (FAQ)`_ section for our recommendations.

Initial setup guide for High Availability
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

To ensure your instance and configuration are compatible with High Availability, please review the `Configuration and Compatibility`_ section.

.. note::
  
  Back up your Mattermost database and file storage locations before configuring High Availability. For more information about backing up, see :doc:`../deploy/backup-disaster-recovery`.

1. Upgrade Mattermost Server to version 4.0 or later. See :doc:`../upgrade/upgrading-mattermost-server`.
2. Set up a new Mattermost server with version 4.0 or later by following one of our **Install Guides**. This server must use an identical copy of the configuration file, ``config.json``. Verify the servers are functioning by hitting each independent server through its private IP address.
3. Modify the ``config.json`` files on both servers to add ``ClusterSettings``. See the `high availability configuration settings <https://docs.mattermost.com/configure/environment-configuration-settings.html#high-availability>`__ documentation for details.
4. Verify the configuration files are identical on both servers then restart each machine in the cluster.
5. Modify your NGINX setup so that it proxies to both servers. For more information about this, see `Proxy Server Configuration`_.
6. Open **System Console > Environment > High Availability** to verify that each machine in the cluster is communicating as expected with green status indicators. If not, investigate the log files for any extra information.

Add a server to the cluster
~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Back up your Mattermost database and the file storage location. For more information about backing up, see :doc:`../deploy/backup-disaster-recovery`.
2. Set up a new Mattermost server. This server must use an identical copy of the configuration file, ``config.json``. Verify the server is functioning by hitting the private IP address.
3. Modify your NGINX setup to add the new server. For information about this, see `Proxy Server Configuration`_.
4. Open **System Console > Environment > High Availability** to verify that all the machines in the cluster are communicating as expected with green status indicators. If not, investigate the log files for any extra information.

Remove a server from the cluster
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Back up your Mattermost database and the file storage location. For more information about backing up, see :doc:`../deploy/backup-disaster-recovery`.
2. Modify your NGINX setup to remove the server. For information about this, see `Proxy Server Configuration`_.
3. Open **System Console > Environment > High Availability** to verify that all the machines remaining in the cluster are communicating as expected with green status indicators. If not, investigate the log files for any extra information.

Configuration and compatibility
-------------------------------

Details on configuring your system for High Availability.

Mattermost Server configuration
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Configuration settings
^^^^^^^^^^^^^^^^^^^^^^

1. High Availability is configured in the ``ClusterSettings`` section of ``config.json`` and the settings are viewable in the System Console. When High Availability is enabled, the System Console is set to read-only mode to ensure all the ``config.json`` files on the Mattermost servers are always identical. However, for testing and validating a High Availability setup, you can set ``ReadOnlyConfig`` to ``false``, which allows changes made in the System Console to be saved back to the configuration file.

  .. code-block:: none

    "ClusterSettings": {
            "Enable": false,
            "ClusterName": "production",
            "OverrideHostname": "",
            "UseIpAddress": true,
            "UseGossip": true,
            "ReadOnlyConfig": true,
            "GossipPort": 8074,
            "StreamingPort": 8075
    }

  For more details on these settings, see the `high availability configuration settings <https://docs.mattermost.com/configure/environment-configuration-settings.html#high-availability>`__ documentation.

2. Change the process limit to 8192 and the maximum number of open files to 65536.

  Modify ``/etc/security/limits.conf`` on each machine that hosts a Mattermost server by adding the following lines:

  .. code-block:: none

    * soft nofile 65536
    * hard nofile 65536
    * soft nproc 8192
    * hard nproc 8192

3. Increase the number of WebSocket connections:

  Modify ``/etc/sysctl.conf`` on each machine that hosts a Mattermost server by adding the following lines:

  .. code-block:: none

    net.ipv4.ip_local_port_range = 1025 65000
    net.ipv4.tcp_fin_timeout = 30
    net.ipv4.tcp_tw_reuse = 1
    net.core.somaxconn = 4096
    net.ipv4.tcp_max_syn_backlog = 8192

You can do the same for the proxy server.

Cluster discovery
^^^^^^^^^^^^^^^^^

If you have non-standard (i.e. complex) network configurations, then you may need to use the `Override Hostname <https://docs.mattermost.com/configure/configuration-settings.html#override-hostname>`_ setting to help the cluster nodes discover each other. The cluster settings in the config are removed from the config file hash for this reason, meaning you can have ``config.json`` files that are slightly different in High Availability mode. The `Override Hostname <https://docs.mattermost.com/configure/configuration-settings.html#override-hostname>`_ is intended to be different for each clustered node in ``config.json`` if you need to force discovery.

If ``UseIpAddress`` is set to ``true``, it attempts to obtain the IP address by searching for the first non-local IP address (non-loop-back, non-localunicast, non-localmulticast network interface). It enumerates the network interfaces using the built-in go function `net.InterfaceAddrs() <https://golang.org/pkg/net/#InterfaceAddrs>`_. Otherwise it tries to get the hostname using the `os.Hostname() <https://golang.org/pkg/os/#Hostname>`_ built-in go function.

You can also run ``SELECT * FROM ClusterDiscovery`` against your database to see how it has filled in the **Hostname** field. That field will be the hostname or IP address the server will use to attempt contact with other nodes in the cluster. We attempt to make a connection to the ``url Hostname:Port`` and ``Hostname:PortGossipPort``. You must also make sure you have all the correct ports open so the cluster can gossip correctly. These ports are under ``ClusterSettings`` in your configuration.

In short, you should use:

1. IP address discovery if the first non-local address can be seen from the other machines.
2. Override Hostname on the operating system so that it's a proper discoverable name for the other nodes in the cluster.
3. Override Hostname in ``config.json`` if the above steps do not work. You can put an IP address in this field if needed. The ``config.json`` will be different for each cluster node.

Time synchronization
^^^^^^^^^^^^^^^^^^^^

Each server in the cluster must have the Network Time Protocol daemon ``ntpd`` running so that messages are posted in the correct order.

State
^^^^^

The Mattermost Server is designed to have very little state to allow for horizontal scaling. The items in state considered for scaling Mattermost are listed below:

- In memory session cache for quick validation and channel access.
- In memory online/offline cache for quick response.
- System configuration file that is loaded and stored in memory.
- WebSocket connections from clients used to send messages.

When the Mattermost server is configured for High Availability, the servers  use an inter-node communication protocol on a different listening address to keep the state in sync. When a state changes it is written back to the database and an inter-node message is sent to notify the other servers of the state change. The true state of the items can always be read from the database. Mattermost also uses inter-node communication to forward WebSocket messages to the other servers in the cluster for real-time messages such as “[User X] is typing.”

Proxy server configuration
^^^^^^^^^^^^^^^^^^^^^^^^^^

The proxy server exposes the cluster of Mattermost servers to the outside world. The Mattermost servers are designed for use with a proxy server such as NGINX, a hardware load balancer, or a cloud service like Amazon Elastic Load Balancer.

If you want to monitor the server with a health check you can use ``http://10.10.10.2/api/v4/system/ping`` and check the response for ``Status 200``, indicating success. Use this health check route to mark the server *in-service* or *out-of-service*.

A sample configuration for NGINX is provided below. It assumes that you have two Mattermost servers running on private IP addresses of ``10.10.10.2`` and ``10.10.10.4``.

.. code-block:: none

    upstream backend {
            server 10.10.10.2:8065;
            server 10.10.10.4:8065;
      }

      server {
          server_name mattermost.example.com;

          location ~ /api/v[0-9]+/(users/)?websocket$ {
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
                client_max_body_size 50M;
                proxy_set_header Host $http_host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header X-Frame-Options SAMEORIGIN;
                proxy_buffers 256 16k;
                proxy_buffer_size 16k;
                proxy_read_timeout 600s;
                proxy_http_version 1.1;
                proxy_pass http://backend;
          }

          location / {
                client_max_body_size 50M;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
                proxy_set_header Host $http_host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header X-Frame-Options SAMEORIGIN;
                proxy_pass http://backend;
          }
    }

You can use multiple proxy servers to limit a single point of failure, but that is beyond the scope of this documentation.

File storage configuration
^^^^^^^^^^^^^^^^^^^^^^^^^^

.. note::

  1. File storage is assumed to be shared between all the machines that are using services such as NAS or Amazon S3.
  2. If ``"DriverName": "local"`` is used then the directory at ``"FileSettings":`` ``"Directory": "./data/"`` is expected to be a NAS location mapped as a local directory, otherwise high availability will not function correctly and may corrupt your file storage.
  3. If you’re using Amazon S3 or MinIO for file storage then no other configuration is required.

If you’re using the Compliance Reports feature in Mattermost Enterprise Edition, you need to configure the ``"ComplianceSettings":`` ``"Directory": "./data/",`` to share between all machines or the reports will only be available from the System Console on the local Mattermost server.

Migrating to NAS or S3 from local storage is beyond the scope of this document.

Database configuration
^^^^^^^^^^^^^^^^^^^^^^

Use the read replica feature to scale the database. The Mattermost server can be set up to use one master database and multiple read replica databases. Mattermost distributes read requests across all databases, and sends write requests to the master database, and those changes are then sent to update the read replicas.

On large deployments, consider using the search replica feature to isolate search queries onto one or more database servers. A search replica is similar to a read replica, but is used only for handling search queries.

If there are no search replicas, the server uses the read replicas instead. Similarly, if there are no read replicas, the server falls back to master.

Size the databases
``````````````````

For information about sizing database servers, see :ref:`hardware-sizing-for-enterprise`.

In a master/slave environment, make sure to size the slave machine to take 100% of the load in the event that the master machine goes down and you need to fail over.

Deploy a multi-database configuration
``````````````````````````````````````

To configure a multi-database Mattermost server:

1. Update the ``DataSource`` setting in ``config.json`` with a connection string to your master database server. The connection string is based on the database type set in ``DriverName``, either ``postgres`` or ``mysql``.
2. Update the ``DataSourceReplicas`` setting in ``config.json`` with a series of connection strings to your database read replica servers in the format ``["readreplica1", "readreplica2"]``. Each connection should also be compatible with the ``DriverName`` setting.

Here's an example ``SqlSettings`` block for one master and two read replicas:

.. code-block:: none

  "SqlSettings": {
        "DriverName": "mysql",
        "DataSource": "master_user:master_password@tcp(master.server)/mattermost?charset=utf8mb4,utf8\u0026readTimeout=30s\u0026writeTimeout=30s",
        "DataSourceReplicas": ["slave_user:slave_password@tcp(replica1.server)/mattermost?charset=utf8mb4,utf8\u0026readTimeout=30s\u0026writeTimeout=30s","slave_user:slave_password@tcp(replica2.server)/mattermost?charset=utf8mb4,utf8\u0026readTimeout=30s\u0026writeTimeout=30s"],
        "DataSourceSearchReplicas": [],
        "MaxIdleConns": 20,
        "MaxOpenConns": 300,
        "Trace": false,
        "AtRestEncryptKey": "",
        "QueryTimeout": 30
    }  

The new settings can be applied by either stopping and starting the server, or by loading the configuration settings as described in the next section.

Once loaded, database write requests are sent to the master database and read requests are distributed among the other databases in the list.

Load a multi-database configuration onto an active server
`````````````````````````````````````````````````````````

After a multi-database configuration has been defined in ``config.json``, the following procedure can be used to apply the settings without shutting down the Mattermost server:

1. Go to **System Console > Environment > Web Server**, then select **Reload Configuration from Disk** to reload configuration settings for the Mattermost server from ``config.json``.
2. Go to **System Console > Environment > Database**, then select **Recycle Database Connections** to take down existing database connections and set up new connections in the multi-database configuration.

While the connection settings are changing, there might be a brief moment when writes to the master database are unsuccessful. The process waits for all existing connections to finish and starts serving new requests with the new connections. End users attempting to send messages while the switch is happening will have an experience similar to losing connection to the Mattermost server.

Manual failover for master database
```````````````````````````````````

If the need arises to switch from the current master database - for example, if it is running out of disk space, or requires maintenance updates, or for other reasons - you can switch Mattermost server to use one of its read replicas as a master database by updating ``DataSource`` in ``config.json``.

To apply the settings without shutting down the Mattermost server:

1. Go to **System Console > Environment > Web Server**, then select **Reload Configuration from Disk** to reload configuration settings for the Mattermost server from ``config.json``.
2. Go to **System Console > Environment > Database**, then select **Recycle Database Connections** to take down existing database connections and set up new connections in the multi-database configuration.

While the connection settings are changing, there might be a brief moment when writes to the master database are unsuccessful. The process waits for all existing connections to finish and starts serving new requests with the new connections. End users attempting to send messages while the switch is happening can have an experience similar to losing connection to the Mattermost server.

Transparent failover
````````````````````

The database can be configured for High Availability and transparent failover use the existing database technologies. We recommend MySQL Clustering, Postgres Clustering, or Amazon Aurora. Database transparent failover is beyond the scope of this documentation.

Recommended configuration settings for PostgreSQL
``````````````````````````````````````````````````

If you're using PostgreSQL as the choice of database, we recommend the following configuration optimizations on your Mattermost server. These  configurations were tested on an AWS Aurora r5.xlarge instance of PostgreSQL 11.7. There are also some general optimizations mentioned which requires servers with higher specifications.

1. **max_connections**: If you are using read-replicas, set reader connections to 1024, and set writer connections to 256. If you are using a single instance, then only setting reader connections to 1024 should be sufficient. If the instance is lower capacity than r5.xlarge, then set it to a lower number. Also tune the ``MaxOpenConns`` setting under the ``SqlSettings`` of the Mattermost app accordingly.

2. **random_page_cost**: Set it to 1.1, unless the DB is using spinning disks.

3. **work_mem**: Set it to 16MB for readers, and 32MB for writers. If it's a single instance, 16MB should be sufficient. If the instance is of a lower capacity than r5.xlarge, then set it to a lower number.

4. **effective_cache_size**: Set it to 65% of total memory. For a 32GB instance, it should be 21GB.

5. **shared_buffers**: Set it to 65% of total memory. For a 32GB instance, it should be 21GB.

6. **tcp_keepalives_count**: 5

7. **tcp_keepalives_idle**: 5

8. **tcp_keepalives_interval**: 1

9. If you have more than 32 CPUs, please set the following options to utilize more CPU for your server:

  - **max_worker_processes**: 12
  - **max_parallel_workers_per_gather**: 4
  - **max_parallel_workers**: 12
  - **max_parallel_maintenance_workers**: 4

10. **autovacuum_max_workers**: 4

11. **maintenance_work_mem**: 1GB (reduce this to 512MB if your server has less than 32GB of RAM)

12. **autovacuum_vacuum_cost_limit**: 500

.. note::
  
   If you are using pgbouncer, or any similar connection pooling proxy, in front of your DB, then apply the keepalive settings to the proxy instead, and revert the keepalive settings for the DB back to defaults.

Recommended configuration settings for MySQL
````````````````````````````````````````````

For MySQL, we recommend the following configuration options for high performance:

1. **innodb_buffer_pool_size**: Set to about 70% of your total RAM.
2. **innodb_log_file_size**: Set to 256MB. Increasing this helps in write intensive operations. Downside is that recovery times will be longer.
3. **innodb_flush_log_at_trx_commit**: 2. Note that this can potentially cause up to 1 second of loss of transaction data.
4. **max_heap_table_size**: 64MB.
5. **tmp_table_size**: 64MB.

Leader election
^^^^^^^^^^^^^^^^

From Mattermost v4.2, a cluster leader election process assigns any scheduled task such as LDAP sync to run on a single node in a multi-node cluster environment.

The process is based on a widely used `bully leader election algorithm <https://en.wikipedia.org/wiki/Bully_algorithm>`__ where the process with the lowest node ID number from amongst the non-failed processes is selected as the leader.

Job server
^^^^^^^^^^^

Mattermost runs periodic tasks via the `job server <https://docs.mattermost.com/configure/configuration-settings.html#jobs>`__. These tasks include:

- LDAP sync
- Data retention
- Compliance exports
- Elasticsearch indexing

Make sure you have set ``JobSettings.RunScheduler`` to ``true`` in ``config.json`` for all app and job servers in the cluster. The cluster leader will then be responsible for scheduling recurring jobs.

.. note::

  It is strongly recommended not to change this setting from the default setting of ``true`` as this prevents the ``ClusterLeader`` from being able to run the scheduler. As a result, recurring jobs such as LDAP sync, Compliance Export, and data retention will no longer be scheduled.

In previous Mattermost Server versions, and this documentation, the instructions stated to run the Job Server with ``RunScheduler: false``. The cluster design has evolved and this is no longer the case.

Plugins and High Availability
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

From Mattermost v5.14, when you install or upgrade a plugin, it is propagated across the servers in the cluster automatically. File storage is assumed to be shared between all the servers, using services such as NAS or Amazon S3.

If ``"DriverName": "local"`` is used then the directory at ``"FileSettings":`` ``"Directory": "./data/"`` is expected to be a NAS location mapped as a local directory. If this is not the case High Availability will not function correctly and may corrupt your file storage.

Note a slight behavior change from Mattermost v5.15: When you reinstall a plugin in v5.14, the previous **Enabled** or **Disabled** state is retained. As of v5.15, a reinstalled plugin's initial state is **Disabled**.

CLI and High Availability
^^^^^^^^^^^^^^^^^^^^^^^^^

The CLI is run in a single node which bypasses the mechanisms that a `High Availability environment <https://docs.mattermost.com/scale/high-availability-cluster.html>`__ uses to perform actions across all nodes in the cluster. As a result, when running `CLI commands <https://docs.mattermost.com/manage/command-line-tools.html>`__ in a High Availability environment, tasks such as updating and deleting users or changing configuration settings require a server restart.

We recommend using `mmctl <https://docs.mattermost.com/manage/mmctl-command-line-tool.html>`__ in a High Availability environment instead since a server restart is not required. These changes are made through the API layer, so the node receiving the change request notifies all other nodes in the cluster.

Upgrade guide
-------------

An update is an incremental change to Mattermost server that fixes bugs or performance issues. An upgrade adds new or improved functionality to the server.

Update configuration changes while operating continuously
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

A service interruption is not required for most configuration updates. See the section below for details on upgrades requiring service interruption. You can apply updates during a period of low load, but if your High Availability cluster is sized correctly, you can do it at any time. The system downtime is brief, and depends on the number of Mattermost servers in your cluster. Note that you are not restarting the machines, only the Mattermost server applications. A Mattermost server restart generally takes about five seconds.

.. note::

  Do not modify configuration settings through the System Console. Otherwise you will have two servers with different ``config.json`` files in a High Availability cluster causing a refresh every time a user connects to a different app server.

1. Make a backup of your existing ``config.json`` file.
2. For one of the Mattermost servers, make the configuration changes to ``config.json`` and save the file. Do not reload the file yet.
3. Copy the ``config.json`` file to the other servers.
4. Shut down Mattermost on all but one server.
5. Reload the configuration file on the server that is still running. Go to **System Console > Environment > Web Server**, then select **Reload Configuration from Disk**.
6. Start the other servers.

Update the Server version while operating continuously
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

A service interruption is not required for security patch dot releases of the Mattermost server. You can apply updates during a period when the anticipated load is small enough that one server can carry the full load of the system during the update.

.. note::

  Mattermost supports one minor version difference between the server versions when performing a rolling upgrade (for example v5.27.1 + v5.27.2 or v5.26.4 + v5.27.1 is supported, whereas v5.25.5 + v5.27.0 is not supported). Running two different versions of Mattermost in your cluster should not be done outside of an upgrade scenario.

When restarting, you aren't restarting the machines, only the Mattermost server applications. A Mattermost server restart generally takes about five seconds.

1. Review the upgrade procedure in the *Upgrade Enterprise Edition* section of :doc:`../upgrade/upgrading-mattermost-server`.
2. Make a backup of your existing ``config.json`` file.
3. Set your proxy to move all new requests to a single server. If you are using NGINX and it's configured with an upstream backend section in ``/etc/nginx/sites-available/mattermost`` then comment out all but the one server that you intend to update first, and reload NGINX.
4. Shut down Mattermost on each server except the one that you are updating first.
5. Update each Mattermost instance that is shut down.
6. On each server, replace the new ``config.json`` file with your backed up copy.
7. Start the Mattermost servers.
8. Repeat the update procedure for the server that was left running.

Server upgrades requiring service interruption
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

A service interruption is required when the upgrade includes a change to the database schema or when a change to ``config.json`` requires a server restart, such as when making the following changes:

- Default Server Language
- Rate Limiting
- Webserver Mode
- Database
- High Availability

If the upgrade includes a change to the database schema, the database is upgraded by the first server that starts.

Apply upgrades during a period of low load. The system downtime is brief, and depends on the number of Mattermost servers in your cluster. Note that you are not restarting the machines, only the Mattermost server applications.

1. Review the upgrade procedure in the *Upgrade Enterprise Edition* section of :doc:`../upgrade/upgrading-mattermost-server`.
2. Make a backup of your existing ``config.json`` file.
3. Stop NGINX.
4. Upgrade each Mattermost instance.
5. On each server, replace the new ``config.json`` file with your backed up copy.
6. Start one of the Mattermost servers.
7. When the server is running, start the other servers.
8. Restart NGINX.

Upgrade to version 4.0 and later
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

From Mattermost Server v4.0, when a server starts up, it can automatically discover other servers in the same cluster. You can add and remove servers without the need to make changes to the configuration file, ``config.json``. To support this capability, new items were added to the ``ClusterSettings`` section of ``config.json``. When upgrading from v3.10 or earlier to v4.0 or later, you must manually add the new items to your existing ``config.json``.

1. Review the upgrade procedure in :doc:`../upgrade/upgrading-mattermost-server`.
2. Make a backup of your existing ``config.json`` file.
3. Revise your existing ``config.json`` to update the ``ClusterSettings`` section. The following settings should work in most cases:

  .. code-block:: none

    "ClusterSettings": {
        "Enable": true,
        "ClusterName": "production",
        "OverrideHostname": "",
        "UseIpAddress": true,
        "UseGossip": true,
        "ReadOnlyConfig": true,
        "GossipPort": 8074,
        "StreamingPort": 8075
    },

  For more information about these settings, see the `high availability configuration settings <https://docs.mattermost.com/configure/environment-configuration-settings.html#high-availability>`__ documentation.

4. Stop NGINX.
5. Upgrade each Mattermost instance.
6. On each server, replace the new ``config.json`` file with your modified version.
7. Start one of the Mattermost servers.
8. When the server is running, start the other servers.
9. Restart NGINX.

All cluster nodes must use a single protocol
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

All cluster traffic uses the gossip protocol. From Mattermost Server v5.36, `gossip clustering can no longer be disabled <https://docs.mattermost.com/configure/configuration-settings.html#use-gossip>`__.

When upgrading a High Availability cluster, you can't upgrade other nodes in the cluster when one node isn't using the gossip protocol. You must use gossip to complete a High Availability upgrade. Alternatively you can shut down all nodes and bring them all up individually following an upgrade.

Frequently asked questions (FAQ)
---------------------------------

Does Mattermost support multi-region High Availability deployment?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Yes. Although not officially tested, you can set up a cluster across AWS regions, for example, and it should work without issues.

What does Mattermost recommend for disaster recovery of the databases?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

When deploying Mattermost in a High Availability configuration, we recommend using a database load balancer between Mattermost and your database. Depending on your deployment this needs more or less consideration.

For example, if you're deploying Mattermost on AWS with Amazon Aurora we recommend utilizing multiple Availability Zones. If you're deploying Mattermost on your own cluster please consult with your IT team for a solution best suited for your existing architecture.

Troubleshooting
---------------

Capture High Availability troubleshooting data
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

When deploying Mattermost in a High Availability configuration, we recommend that you keep Prometheus and Grafana metrics as well as cluster server logs for as long as possible - and at minimum two weeks. 

You may be asked to provide this data to Mattermost for analysis and troubleshooting purposes.

.. note::

  - Ensure that server log files are being created. You can find more on working with Mattermost logs `here <https://docs.mattermost.com/install/troubleshooting.html#review-mattermost-logs>`__.
  - When investigating and replicating issues, we recommend opening **System Console > Environment > Logging** and setting **File Log Level** to **DEBUG** for more complete logs. Make sure to revert to **INFO** after troubleshooting to save disk space. 
  - Each server has its own server log file, so make sure to provide server logs for all servers in your High Availability cluster.

Red Server status
~~~~~~~~~~~~~~~~~

When High Availability is enabled, the System Console displays the server status as red or green, indicating if the servers are communicating correctly with the cluster. The servers use inter-node communication to ping the other machines in the cluster, and once a ping is established the servers exchange information, such as server version and configuration files.

A server status of red can occur for the following reasons:

- **Configuration file mismatch:** Mattermost will still attempt the inter-node communication, but the System Console will show a red status for the server since the High Availability feature assumes the same configuration file to function properly.
- **Server version mismatch:** Mattermost will still attempt the inter-node communication, but the System Console will show a red status for the server since the High Availability feature assumes the same version of Mattermost is installed on each server in the cluster. It is recommended to use the `latest version of Mattermost <https://mattermost.com/download/>`__ on all servers. Follow the upgrade procedure in :doc:`../upgrade/upgrading-mattermost-server` for any server that needs to be upgraded.
- **Server is down:** If an inter-node communication fails to send a message it makes another attempt in 15 seconds. If the second attempt fails, the server is assumed to be down. An error message is written to the logs and the System Console shows a status of red for that server. The inter-node communication continues to ping the down server in 15 second intervals. When the server comes back up, any new messages are sent to it.

WebSocket disconnect
~~~~~~~~~~~~~~~~~~~~

When a client WebSocket receives a disconnect it will automatically attempt to re-establish a connection every three seconds with a backoff. After the connection is established, the client attempts to receive any messages that were sent while it was disconnected.

App refreshes continuously
~~~~~~~~~~~~~~~~~~~~~~~~~~~

When configuration settings are modified through the System Console, the client refreshes every time a user connects to a different app server. This occurs because the servers have different ``config.json`` files in a High Availability cluster.

Modify configuration settings directly through ``config.json`` `following these steps <https://docs.mattermost.com/scale/high-availability-cluster.html#updating-configuration-changes-while-operating-continuously>`__.

Messages do not post until after reloading
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

When running in High Availability mode, make sure all Mattermost application servers are running the same version of Mattermost. If they are running different versions, it can lead to a state where the lower version app server cannot handle a request and the request will not be sent until the frontend application is refreshed and sent to a server with a valid Mattermost version. Symptoms to look for include requests failing seemingly at random or a single application server having a drastic rise in goroutines and API errors.

source/scale/elasticsearch.rst METASEP
Elasticsearch
=============

.. include:: ../_static/badges/ent-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Mattermost Enterprise Edition E20*

Elasticsearch provides enterprise-scale deployments with optimized search performance and prevents performance degradation and timeouts. The implementation uses `Elasticsearch <https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html>`__ as a distributed, RESTful search engine supporting highly efficient database searches in a `cluster environment <https://docs.mattermost.com/scale/high-availability-cluster.html>`__. 

.. important::
  The default Mattermost database search starts to show performance degradation at around 2.5 million posts, depending on the specifications for the database server. If you expect your Mattermost server to have more than 2.5 million posts, we recommend using Elasticsearch for optimum search performance. For deployments with over five million posts, Elasticsearch is required to avoid significant performance issues (such as timeouts) with search and at-mentions.

  For Mattermost v6.0, Elasticsearch v7.x is supported. Previous versions of Mattermost, including v5.38 and earlier releases, support Elasticsearch v5.x, v6.x, and v7.x. 
    
Deployment guide
----------------

Elasticsearch allows you to search large volumes of data quickly, in near real-time, by creating and managing an index of post data. The indexing process can be managed from the System Console after setting up and connecting an Elasticsearch server. The post index is stored on the Elasticsearch server and updated constantly after new posts are made. In order to index existing posts, a bulk index of the entire post database must be generated.

.. note::
    From Mattermost v5.26, you can filter inactive users, search by user role, and also search for terms inside links. This update introduces a breaking change which affects the "from" part of the search. To avoid this, reindex your Elasticsearch instance/cluster prior to upgrading to Mattermost v.5.26 or later.
    
Set up an Elasticsearch server
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The set up process for the Elasticsearch server is documented in the `official Elasticsearch documentation <https://www.elastic.co/guide/en/elasticsearch/reference/current/setup.html>`__.

.. important::
  You must install the `ICU Analyzer Plugin <https://www.elastic.co/guide/en/elasticsearch/plugins/current/analysis-icu.html>`__ when setting up Elasticsearch for Mattermost.

Configure Elasticsearch in Mattermost
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Follow these steps to connect your Elasticsearch server to Mattermost and to generate the post index.

1. Go to **System Console > Environment > Elasticsearch**.
2. Set **Enable Elasticsearch Indexing** to ``true`` to enable the other the settings on the page. Once the configuration is saved, new posts made to the database are automatically indexed on the Elasticsearch server.
3. Set the Elasticsearch server connection details:

  a. Enter **Server Connection Address** for the Elasticsearch server you set up earlier.
  b. (Optional) Enter **Server Username** used to access the Elasticsearch server. For AWS Elasticsearch, leave this field blank.
  c. (Optional) Enter **Server Password** associated with the username. For AWS Elasticsearch, leave this field blank.
  d. Set **Enable Cluster Sniffing** (Optional). Sniffing finds and connects to all data nodes in your cluster automatically. For AWS Elasticsearch, this field should be set to ``false``.

4. Select **Test Connection** and then select **Save**. If the server connection is unsuccessful you won't be able to save the configuration or enable searching with Elasticsearch.

5. Select **Build Index** to build the post index of existing posts. This process can take up to a few hours depending on the size of the post database and number of messages. The progress percentage can be seen as the index is created. To avoid downtime, set **Enable Elasticsearch for search queries** to ``false`` so that database search is available during the indexing process.

  .. important::

    Complete bulk indexing before enabling Elasticsearch in the next step. Otherwise, search results will be incomplete.

6. Enable Elasticsearch by setting **Enable Elasticsearch for search queries** to ``true``. When this setting is ``false``, database search is used for all search queries.

7. Restart the Mattermost server.

.. note::

   - Additional advanced Elasticsearch settings for large deployments can be configured outside the System Console in the ``config.json`` file. Read the `documentation to learn more <https://docs.mattermost.com/configure/configuration-settings.html#elasticsearch>`__.
   - If your deployment has a large number of posts (typically in excess of one million but not strictly defined), the reindexing progress percentage may stay at 99% for a long time. The size of the data to be indexed is estimated, and on large databases, estimations can become inaccurate. While progress estimates may be inaccurate, and the progress percentage may appear stuck at near completion, indexing will continue behind the scenes until complete.
   - Search results for files shared before upgrading to Mattermost Server v5.35 may be incomplete until an extraction command is run using the `CLI <https://docs.mattermost.com/manage/command-line-tools.html#mattermost-extract-documents-content>`__, or using the `mmctl <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-extract>`__. After running this command, the search index must be rebuilt. Go to **System Console > Environment > Elasticsearch > Bulk Indexing**, then select **Index Now** to rebuild the search index to include older file contents.
    
Limitations
------------

1. Elasticsearch uses a standard selection of "stop words" to keep search results relevant. Results for the following words will not be returned: "a", "an", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", and "with".
2. Searching stop words in quotes returns more results than just the searched terms (`ticket <https://mattermost.atlassian.net/browse/MM-7216>`__).
3. AWS Elasticsearch implementations have a limit of 1000 days of post history that is searchable.
4. Search results are limited to a user's team and channel membership. This is enforced by the Mattermost server. The entities are indexed in Elasticsearch in a way that allows Mattermost to filter them when querying, so the Mattermost server narrows down the results on every Elasticsearch request applying those filters.

Frequently asked questions (FAQ)
--------------------------------

Do I need to use Elasticsearch?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The Elasticsearch engine is designed for large Enterprise deployments to run highly efficient database searches in a cluster environment. The default Mattermost database search starts to show performance degradation at around 2.5 million posts, depending on the specifications for the database server. If you expect your Mattermost server to have more than 2.5 million posts, we recommend using Elasticsearch for optimum search performance.

What types of indexes are created?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost creates three types of indexes: users, channels, and posts. Users and channels have one index each. Posts are aggregated by date, into multiple indexes.

Can I pause an Elasticsearch indexing job?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Yes. From Mattermost v.6.7, the Elasticsearch indexing job is resumable. Stopping a server while the Elasticsearch indexing job is running puts the job in pending status. The job resumes when the server restarts. System Admins can cancel an indexing job through the System Console.

Can an index rollover policy be defined?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The `AggregatePostsAfterDays <https://docs.mattermost.com/configure/configuration-settings.html#aggregate-search-indexes>`__ configuration setting defines a cutoff value. All posts preceding this value are reindexed and aggregated into new and bigger indexes. The default setting is 365 days.

Are there any new search features offered with Elasticsearch?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The current implementation of Elasticsearch matches the search features currently available with database search. The Mattermost team is working on extending the Elasticsearch feature set with file name and content search, date filters, and operators and modifiers.

Are my files stored in Elasticsearch?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

No, files and attachments are not stored.

How do I monitor system health of an Elasticsearch server?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

You can use this Prometheus exporter to monitor `various metrics <https://github.com/justwatchcom/elasticsearch_exporter#metrics>`__ about Elasticsearch: `justwatchcom/elasticsearch_exporter <https://github.com/justwatchcom/elasticsearch_exporter>`__.

You can also refer to this `article about Elasticsearch performance monitoring <https://www.datadoghq.com/blog/monitor-elasticsearch-performance-metrics/#key-elasticsearch-performance-metrics-to-monitor>`__. It's not written specifically for Prometheus, which `Mattermost's performance monitoring <https://docs.mattermost.com/scale/performance-monitoring.html>`__ system uses, but has several tips and best practices.

Why does a 25,000 post database take a long time to index in Elasticsearch?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

There are a few possible reasons:

- Querying the posts out of the database is resource limited (i.e., the machine the database is on is not powerful enough).
- The Elasticsearch cluster is performance limited (i.e., the machines are not powerful enough).
- The 25,000 messages are spread out over a long time window, and the ``BulkIndexingTimeWindowSeconds`` configuration value is too low for efficient indexing of such a "sparse" database. The value of that config should ideally be set so that the median number of posts falling within any period of that time in the database is around 700 to 800. The default value is one hour, so if you are doing a lot less than 800 posts an hour on average, then the indexing will be much slower in terms of "posts per unit time". This can be sped up by increasing that time window.
 
What form of data is sent to Elasticsearch?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost communicates with Elasticsearch through its REST API using JSON messages for indexing and querying entities.

How much data is sent to Elasticsearch and when?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Every time a message is published, a channel is created, or a user changes, (either because their properties change e.g.: change of the first name or because they join/leave a channel), the data associated with that event is sent to Elasticsearch.

If search via Elasticsearch is enabled, every search will generate a query. If autocompletion is enabled, every user or channel autocompletion associated with writing a message or user search will generate a query.

How do I know if an Elasticsearch job fails?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost provides the status of each Elasticsearch indexing job in **System Console > Environment > Elasticsearch**. Here you can see if the job succeeded or failed, including the details of the error.

Failures are returned in the server logs. The error log begins with the string ``Failed job`` and includes a job_id key/value pair. Elasticsearch job failures are identified with worker name ``EnterpriseElasticsearchAggregator`` and ``EnterpriseElasticsearchIndexer``. You can optionally create a script that programmatically queries for such failures and notifies the appropriate system.

My Elasticsearch indexes won't complete, what should I do?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

If you have an Elasticsearch indexing job that's paused, it's likely your Elasticsearch server has restarted. If you restart your Elasticsearch server, you must also restart Mattermost to ensure jobs are completed. If restarting the Mattermost server does not resolve the issue, please contact Mattermost support.

source/samples/sample-logger-config.json METASEP
{
    "sample-console": {
        "type": "console",
        "options": {
            "out": "stdout"
        },
        "format": "plain",
        "format_options": {
            "delim": " | "
        },
        "levels": [
            {"id": 5, "name": "debug"},
            {"id": 4, "name": "info", "color": 36},
            {"id": 3, "name": "warn"},
            {"id": 2, "name": "error", "stacktrace": true, "color": 31},
            {"id": 1, "name": "fatal", "stacktrace": true},
            {"id": 0, "name": "panic", "stacktrace": true}
        ],
        "maxqueuesize": 1000
    },
    "sample-file": {
        "type": "file",
        "options": {
            "filename": "test.log",
            "max_size": 1000000,
            "max_age": 1,
            "max_backups": 10,
            "compress": true
        },
        "format": "json",
        "format_options": {
        },
        "levels": [
            {"id": 5, "name": "debug"},
            {"id": 4, "name": "info"},
            {"id": 3, "name": "warn"},
            {"id": 2, "name": "error", "stacktrace": true},
            {"id": 1, "name": "fatal", "stacktrace": true},
            {"id": 0, "name": "panic", "stacktrace": true}
        ],
        "maxqueuesize": 1000
    },
    "sample-tcp": {
        "type": "tcp",
        "options": {
            "host": "localhost",
            "port": 18066,
            "tls": false,
            "cert": "",
            "insecure": false
        },
        "format": "gelf",
        "format_options": {
            "hostname": "server01"
        },
        "levels": [
            {"id": 5, "name": "debug"},
            {"id": 4, "name": "info"},
            {"id": 3, "name": "warn"},
            {"id": 2, "name": "error", "stacktrace": true},
            {"id": 1, "name": "fatal", "stacktrace": true},
            {"id": 0, "name": "panic", "stacktrace": true}
        ],
        "maxqueuesize": 1000
    },
    "sample-syslog": {
        "type": "syslog",
        "options": {
            "host": "localhost",
            "port": 18066,
            "tls": false,
            "cert": "",
            "insecure": false,
            "tag": "testapp"
        },
        "format": "plain",
        "format_options": {
            "delim": "  "
        },
        "levels": [
            {"id": 5, "name": "debug"},
            {"id": 4, "name": "info"},
            {"id": 3, "name": "warn"},
            {"id": 2, "name": "error", "stacktrace": true},
            {"id": 1, "name": "fatal", "stacktrace": true},
            {"id": 0, "name": "panic", "stacktrace": true}
        ],
        "maxqueuesize": 1000
    }
}

source/samples/index.rst METASEP
:orphan:

The ``samples`` folder contains example outputs of features.

source/samples/csv_export.zip METASEP

source/samples/advanced-logging-options-sample-json.zip METASEP

source/samples/actiance_export.xml METASEP
<?xml version="1.0" encoding="UTF-8"?>
<FileDump xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
  <Conversation Perspective="Off-Topic">
    <RoomID>public - yqzkxzmoobdxickjfemnkjr1de</RoomID>
    <StartTimeUTC>1534533541869</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>george+452@mattermost.com</LoginName>
      <DateTimeUTC>1512824739484</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jonathan.fritz+test1@mattermost.com</LoginName>
      <DateTimeUTC>1513026916398</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>asaad+9@mattermost.com</LoginName>
      <DateTimeUTC>1513043562110</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jason+3@mattermost.com</LoginName>
      <DateTimeUTC>1515193388879</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>george+46@mattermost.com</LoginName>
      <DateTimeUTC>1515411551508</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1518094256019</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1518097348563</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jason+12344321@mattermost.com</LoginName>
      <DateTimeUTC>1518120516499</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jason+1234554321@mattermost.com</LoginName>
      <DateTimeUTC>1518120621416</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+ldap@mattermost.com</LoginName>
      <DateTimeUTC>1518133783533</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>test1@mattermost.com</LoginName>
      <DateTimeUTC>1518200316505</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>martin+test5@mattermost.com</LoginName>
      <DateTimeUTC>1518200399508</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>joram+1@mattermost.com</LoginName>
      <DateTimeUTC>1518212463054</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>george+48@mattermost.com</LoginName>
      <DateTimeUTC>1521036347509</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+b6i58un7e38npfd35a7p9edrfy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694879041</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+zgtdea7p6fnwpx7hx8ofmr55ir@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694879511</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+eiizcc9rp78i3xpkz5abcskptr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694879975</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+e1ese484dfgubpac6as16rafhw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694880570</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+4wq5skd9ofdojqsoyuunjt7mdr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694880992</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+tqak3npdbid4mc5hzxtqh73wrw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694881519</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+t8iqgaa9t38azqr6ms3w7rqtbr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694882445</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+69tbkw5e8tg9t8a4abijz8rmta@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694882958</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+5zydt4yhufn47cod5j8nkiqp3c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694883455</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+4jm7qnp43id3xgwa4in8ow3aoe@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694884000</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+dbhzok7drbniddzrqrnw5i6tnc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694884446</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+sfj95m6zd3gymfw4ko7ycyee1o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694884921</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+zjx8d3qoyirejjn48y4ykogz8a@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694885375</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+dgnneanah3nmjru7zow5zaxg1c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694885788</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+yhjzab185bbyxdbrds4yes4kro@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694886310</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+curk9ueyciyj7fexjukby64yhh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694886718</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+pkfxjzjibtbbxq53fekx48kagr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694887156</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+c5sebzedspbkzy7who8qb3gf1o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694887754</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+whq7cqdy9bd3fbdw7uurte6g7e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694888229</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+3asf6egnip8hjdk7b369pk5qyo@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694888727</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+g9fmc35jg78y3e6q1uf7awkdba@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694889313</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+6iypex6jat8xietgkkf1htx4fy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694889869</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+oxni5dwrwpft8psedt4hphcg3e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694890331</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+gb6rpcr5ntygxgcr1rep37qfay@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694890843</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+unbu9hxq53r7dys33pmwqu1amy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694891348</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+7thynb6zjb8kmnngu3nr4rsaee@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694891837</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+m5uquhcwupbjicjp87emirjh1c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694892244</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+ixmah9qsi3ge7xmsrnhu9z9o5e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694892736</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+dx45haz8kjrxmnahhcpmyo6whe@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694893174</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+c6djwgwtu38yjb1tjho35mpjio@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694893618</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+r9rm3cyoetfm5mojgwojybdado@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694894060</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+ungcjtnm7p8yixjra6uk1iq9ah@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694894562</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+1t7ffrnektgu7jyhcp17oubn1a@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694894598</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+xskoj8s9h3gyz8rxqykhxsu7hh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694895095</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+c1im4r19b7buxen1b8b8hb1jbh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694895102</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+x9mst3xmuif8be7mk1xi97957h@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694895751</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+noehgawh5jyc5xt3ywofqxtd6y@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694895777</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+o35cxhtoxbgcmxzgg9bsnf1t5r@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694896242</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+k95y7gjpa3gk3yf1gpqdtqwa1w@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694896278</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+y16rmsr5rff5bcu8zu487p4kxo@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694896783</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+1zz5akufobye5gcapsifs3nk4e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694896790</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+neiao6h57386bxbwp3ejy6xcoc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694897299</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+ztby31z8yjbefx9y6uqq3ocuur@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694897333</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+xmhksuze7i867pc8zmg5mipx3e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694897871</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+j1e4zpx3qtfumpdpd1yz7ewana@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694897885</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+ycmjsht84ifa9rku6xe438e63a@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694898380</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+bbzua1yrpjby885861k44okm8o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694898416</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+xadj5xeur7gi9gn3eg7k3rw67w@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694898888</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+bj7ker7ntprwfqjbrz5eoe7a3o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694898914</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+95x4ca7zniddjnt4tew1aqnt4h@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694899474</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+14xec4mrrjdubqohzjfh1toq1h@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694899506</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+yea5jwj4ctbn8g3exgd8xd8zjh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694899995</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+6og1wweckbg83n1nm8ba8b5arw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694900032</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+hojeqb3bgige8bffbxno5985sw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694900626</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+b64o5iqs7jg99gyobms3g3cu7c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694900629</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+yr7ji7x9mpnn8pt8a391et1z5r@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694901192</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+68j8ejpx93biuk8i1euwbh6n9y@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694901218</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+r1m7zkdcq78rim3j9jugw4iuwa@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694901742</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+w4sxwn38si8xtkqurquqaywanh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694901766</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+qdnqsw8kbtfxpgpq3z6c81iaic@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694902247</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+5tso7cskft8qzdmop6cqaq5azo@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694902322</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+6kzhg7e8h7ga8qe847s8qwf46c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694902838</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+7ptjcezuoiym9bwb45cerk55qh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694902873</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+iqp9g319hfbjuyparipudcwmfe@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694903396</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+t91oxeg38jbipei1a4wchx3f1o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694903437</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+rou7y755ttbcug1e8xwanaqwor@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694904019</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+bjegnnb4y7fbzcgpjbdz7j9jio@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694904037</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+p8qfkx9zopg88eqmz6p95th3ur@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694904598</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+j3zm7zczhpdi8q4sb3uapeik5a@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694904659</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+j94x31y5dpf6dp633n1qmzmh9c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694905014</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+ty1aggby5bystjbjaypdw9n7be@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694905473</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+4ihuad1p6fghbeykkcxzqeg7wa@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694905957</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+rz4kohuu7bgqxdyybx1qohgu4r@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694906626</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+zr6renr5ijgm9jmwfx9jfffbcr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694907007</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+astuy8b8yp8j5qkferxdo537wr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694907419</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+xp16is97spr3tqdscd4icqos6o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694907858</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+gzyiupo4zfyf8jbxjx4fww4gpy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694908334</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+w1sabjfu57rexxynjux7bahazc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694908791</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+m6qk51nui7g53fwhfmmo3ihfsr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694909229</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+a1616cw883yg7ctgqgfwk4obuh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694909672</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+cihr5a3j8indtd8dwrf9s735fh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694910153</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+7j6msnn5jid8dpz186uhzfgsee@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694910736</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+qd5fu7ixmirsxbjpuk5wdmtz1w@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694911187</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+qsf3hma14jdcmnp4csrubmxzrc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694911640</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+g9crhsfwhty98k7e6wdci8bwbw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694912187</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+cmxeex7ytbyepy8or35xwkdebc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694912629</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+843f9qbjhtgfdfsmeuc17euxmc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694913167</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+u886uag7cjgtbjru13cttxd5fw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694913545</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+auecjinokfy69ebm9dots3ejea@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694914106</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+44ajec86hbniur3kbut1tjxt6c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694914524</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+9co11fc1efyaurkzo88tx73ife@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694915011</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+8yhu71kipt893qwndhwe7nmsua@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694915433</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+soogdrkrx3rp7rccy9e5nnwq4o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694915807</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+dy56gamzetff8b5d1dssqq781h@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694916367</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+etew4mkajjgeinjxxzyrrsgxnc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694916819</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+31tcmp8qsbnbfxw99o76z4hp4y@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694917342</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+dd5cjzy99fnxfpd7gn67cnrkoa@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694917864</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+oggf6j1zjjbijrgh1dqtc6dwiy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694918324</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+tdrqco68xbr5xrwzte1nk3khmr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694918740</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+99paszs3w7nn8kyijwkmmzthdy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694919156</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+8gquaj4cijr38qiygaezcfxc7e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694919638</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+ubpszg8rjinkuqgjba4ikkr19c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694920092</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+zy8w4zwnjby55e9mmn56hc1wio@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694920538</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+d7y1dmxpc3ypjyaxh918cu1t3y@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694920979</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+rauudt7xtpgh8jx9z3y3sh44dh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694921350</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+ustc3hzbpj8x8c7arjm14m6tqa@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694921890</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+3p9ocj8h8fysfq75t6cktckobo@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694922383</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+wqir77z8wfrpjg7e533mntes4o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694922770</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+n3icdmsontredyyekgs336fk6e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694923245</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+nrnzrzu9cfdwujtz19f8amwyjc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694923707</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+5ztwom83e7bu98pqi5fs4jxexo@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694924137</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+h1hm9z5ccpyrmmrgnaaitex35e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694924560</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+kxwneaxtz7gpinigcqc9ja1bwc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694925000</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+6uyqtm11bbnguqssyuqdxxuuec@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694925431</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+7eq1ryf7u38ufqcozwb7o4u8zy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694925934</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+scrsatmi8pnk7jsbu56b9xg4qw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694926446</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+6exwexedcfb9dr1ykswffinuua@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694926836</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+i98stoyedbdh5dzws6fmwmjsxh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694927213</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+5mqnbdy4ifdajkx5hem9sgjbqe@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694927634</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+4tzo6dd1a7bnbdn8j15j4fdb6y@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694928063</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+sb64tapbjffobeutdrxgnwwjgw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694928570</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+4tcy19r5hidrbpqg4uhoyyw4dh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694929085</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+nrah6qsfj7fu9jfik9a4uww79a@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694929499</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+5fcbis73z7b6fydazancgys3gc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694929964</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+1tnb7sngkif85d8ur3usccipqw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694930387</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+9jkomtxhepgepe73kj817hyrue@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694930849</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+eruami83wjywxrqq354wz7gcxy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694931258</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+8ba3887n17gxp8tye6ywjsub1w@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694931641</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+f1n9qnef7f8g3xd9688xg5c8ry@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694932058</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+wb6c394ihtyxmq3f9t1c1piojc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694932450</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+zzgfhhfoz7grfjuhhxyuw6hach@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694932838</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+wmggrb4ziig3zkznifayfucgza@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694933243</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+jodoephek7d8d88ac6u6eh9c3r@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694933705</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+ycyb8stnw3gjzfncniy4mtyx9c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694934087</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+a957ee6w5f86up5jchsygc6zuc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694934518</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+4cht4adn6pr9xqazcybuheoqkw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694934980</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+mnnooxykrpgqix1tqzxz87cmuh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694935378</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+p7fzz7d77pnr7cfcgrh9z8rchr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694935810</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+ony1dxoyap8yik1u6crgk5g7dr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694936273</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+6t6nhamjt3gb9eb1k58ihsey5e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694936697</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+o6u4o6ehnbgt7nppgwe3rix8ih@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694937134</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+3cpcg5nr7i8dbfomhoigpd1i6a@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694937614</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+tiph1dysipy1pddtpa53tt66bo@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694938022</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+5dkcraoo7tdn8kxz8cgx8p4dhr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694938455</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+oew8d6cqo78n5kcgfe3gh4sqic@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694938858</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+emfsb6pmrfbrmmu1tbsa5zwxfc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694939311</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+n8pyg37fefd6imgh4cy7786uce@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694939756</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+oaep1nr6rjnqpgf5s1a7a8nggh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694940224</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+n393dtrsn3rejqwgqcg7bwamkc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694940686</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+k793mwzrmbgc5rwduyt8q1awqo@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694941156</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+7hmez5xzrfy1u8oze83apk33ta@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694941813</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+jyyg8hijfjdu7yk5igqojme93a@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694942548</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+thu1zebw3in6z8bnc9sz5jr6kr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694942968</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+6zeoxzjmeb85dykd1f59jjobrc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694943414</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+4uuejz7ctbbgug4mdt13j51g9o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694943932</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+t7ndac4u6tr6zyfwsgk1q7f9by@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694944397</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+g45bnj98jtbq8jjkupiupac9xc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694944850</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+4c5pigczht8iuraieqma3fk88c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694945275</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+igakdne9hprfj8xphufgkoro3o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694945841</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+sjezud6smtbdb8jooe98sgwx6w@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694946245</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+mozz86d87ir6bpor9513guwz8w@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694946767</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+csgyn99rmjga9x57xcutsjih1h@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694947214</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+5nc5o6f8sfbm8deswkjfpnrady@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694947689</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+obgkpz7ubtrq7mcx7fsr45xwaw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694948097</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+csbrztnqi7rgbneucxn64c33sr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694948628</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+haufqfcyepntfqy7dxd9b473do@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694949070</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+g39d4dfrwjr48cm686d51wc1ge@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694949564</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+gzenif5xd7gcb8runh1tjpwh6c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694950071</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+fi9pwo6nejdp7nma3picmopumc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694950481</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+sc75jebrd7f3tr8xxouknzbpdy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694950882</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+4bc6i6cfk38fbxircttympnskw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694951323</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+d9kpp6jdi7yb98utpexq6718sa@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694951912</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+sfjjdebowbgk5ddrueiopckmtw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694952349</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+pnb6a7ozpbr69dpfzwaa88bcpr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694952800</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+enzo7zyuyjf5prhp11fpcfc81e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694953270</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+xj3fc6pou7gp5dkxudr6593qrw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694953697</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+kyma43yr63gazcfkyh6qztwfse@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694954186</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+8fymowq3o7819dgse6s9ffoy9o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694954657</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+4188xiuyjigdpgk7mftsaw1pbe@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694955114</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+jr4x57ogj3re383o7ntek9atse@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694955605</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+itwwdkwhxpyriq4c7u3wz15hnc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694956023</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+bj6d54o1c78i585zqkxuyzsg9a@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694956558</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+nx8ce9eq4tdsubnyyunrmaoq4e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694957039</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+qsa6ufn1p38bjjzr1qcgjijfsa@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694957566</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+cw6awotpz7f4t8jrsm5c46uzpc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694957988</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+o6qsksztb3ncfbabiadfan57jc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694958423</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+1wrt878j1tnf8kedbti6pjkw3o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694958846</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+89sho1c8gjfqfrcoff7ypm31me@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694959260</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+6ctxdiw6zpnb8m5id3t8mrg8ka@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694959684</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+bj3d5rkgf7bopnb6guakt4nr3h@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694960101</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+afds3o7zf3f5me41hgmxy858bw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694960619</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+aiof7q67siyf3e5imc7amj75cr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694961069</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+qm966it8mtrodjqxo6jodxkspa@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694961594</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+fd56e6gt5jyzuraib9o769opgr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694962053</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+bnxdj99okf8jjxb6o3ncskqytr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694962758</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+oxy1zb1877d6tq6q4r4anfjtky@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694963257</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+ck1sgrgns7rq9kpr7hmsyh75by@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694963707</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+tjxzau9axtn43pjab6rko8ezme@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694964166</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+q9pryt97ztrstemt6aidkus3se@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694964573</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+78mfzgemebdjtdgedmfj6yxjih@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694965054</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1525890360854</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>asaad+1@mattermost.com</LoginName>
      <DateTimeUTC>1525890679928</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+mysql@mattermost.com</LoginName>
      <DateTimeUTC>1526073357490</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+onel@mattermost.com</LoginName>
      <DateTimeUTC>1526074001598</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+sysad1jun@mattermost.com</LoginName>
      <DateTimeUTC>1527898352853</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1528374970144</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1528378179268</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1528411083313</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais+6@mattermost.com</LoginName>
      <DateTimeUTC>1528808015951</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1528937760468</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+dkh-teamjoinuser@mattermost.com</LoginName>
      <DateTimeUTC>1529433449764</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>george+rn@mattermost.com</LoginName>
      <DateTimeUTC>1530094835903</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>george+51@mattermost.com</LoginName>
      <DateTimeUTC>1530783151527</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1530789066721</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1530862612406</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>harrison+bw@mattermost.com</LoginName>
      <DateTimeUTC>1530886149585</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+4j6oifu37pr5dmdtpp48jmqteesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1531849429077</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1532451190892</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais+1@mattermost.com</LoginName>
      <DateTimeUTC>1532451254817</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jason+2111@mattermost.com</LoginName>
      <DateTimeUTC>1533677384325</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>asaad+1@mattermost.com</LoginName>
      <DateTimeUTC>1533716934624</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>asaad+1@mattermost.com</LoginName>
      <DateTimeUTC>1533717355270</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jason+2113@mattermost.com</LoginName>
      <DateTimeUTC>1533750264445</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+dkhlogintest@mattermost.com</LoginName>
      <DateTimeUTC>1533854423019</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+edgetest@mattermost.com</LoginName>
      <DateTimeUTC>1533876166026</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1536181273406</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1536182326904</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1536574489054</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1534533541869</DateTimeUTC>
      <Content>[A Relative Link](/static/files/5b4a7904a3e041018526a00dba59ee48.png)</Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1534533541869</DateTimeUTC>
      <Content>[A Relative Link](/static/files/5b4a7904a3e041018526a00dba59ee48.png)</Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1534543743763</DateTimeUTC>
      <Content>@amy2 </Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1534543743763</DateTimeUTC>
      <Content>@amy2 </Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1534543775421</DateTimeUTC>
      <Content>@amy_blais </Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1534543866537</DateTimeUTC>
      <Content>@amy_blais </Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1534543902713</DateTimeUTC>
      <Content>@amy_blais </Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1534543926615</DateTimeUTC>
      <Content>@amy2 </Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1535118882954</DateTimeUTC>
      <Content></Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1535118882954</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1535118882954</DateTimeUTC>
      <UserFileName>blue-icon@2x.png</UserFileName>
      <FileName>20180824/teams/noteam/channels/yqzkxzmoobdxickjfemnkjr1de/users/yphfragmx7rsjg1u97853uw5pe/yqyinkijb7d3fbndzetxzk3h4h/blue-icon@2x.png</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1535118882954</DateTimeUTC>
      <UserFileName>blue-icon@2x.png</UserFileName>
      <FileName>20180824/teams/noteam/channels/yqzkxzmoobdxickjfemnkjr1de/users/yphfragmx7rsjg1u97853uw5pe/yqyinkijb7d3fbndzetxzk3h4h/blue-icon@2x.png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1535129437376</DateTimeUTC>
      <Content>https://www.dropbox.com/s/uyhaanh0aglo900/Screenshot%202018-08-17%2011.22.19.png?dl=0</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1535129439308</DateTimeUTC>
      <Content>https://www.dropbox.com/s/uyhaanh0aglo900/Screenshot%202018-08-17%2011.22.19.png?dl=0</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1535129447818</DateTimeUTC>
      <Content>https://www.dropbox.com/s/uyhaanh0aglo900/Screenshot%202018-08-17%2011.22.19.png?dl=0</Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1535148984898</DateTimeUTC>
      <Content>@anu-leenonen </Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1535149010702</DateTimeUTC>
      <Content>@anu-leenonen </Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1535151388538</DateTimeUTC>
      <Content>mmmm</Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1535151470959</DateTimeUTC>
      <Content>mmmm</Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1536099684080</DateTimeUTC>
      <Content>m&#xA;m&#xA;m</Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1536099852485</DateTimeUTC>
      <Content>mm&#xA;m</Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1536159374593</DateTimeUTC>
      <Content>h</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1536161210250</DateTimeUTC>
      <Content>h</Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1536161459207</DateTimeUTC>
      <Content>@anu-leenonen </Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1536161486132</DateTimeUTC>
      <Content>h</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181468436</DateTimeUTC>
      <Content>@paul Test message</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1537364961951</DateTimeUTC>
      <Content>https://www.dropbox.com/s/uyhaanh0aglo900/Screenshot%202018-08-17%2011.22.19.png?dl=0</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1537364973114</DateTimeUTC>
      <Content>https://www.dropbox.com/s/uyhaanh0aglo900/Screenshot%202018-08-17%2011.22.19.png?dl=0</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1537365022971</DateTimeUTC>
      <Content>https://www.dropbox.com/s/uyhaanh0aglo900/Screenshot%202018-08-17%2011.22.19.png?dl=0</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1537365038016</DateTimeUTC>
      <Content>https://pre-release.mattermost.com/files/r1zem456o3do3gqkzdg1sbfz5c/public?h=JeeypNwoZxuVBcKfGt46-pVMRrTi5oT7FOMFySyhUsM</Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1537365486479</DateTimeUTC>
      <Content>https://pre-release.mattermost.com/files/r1zem456o3do3gqkzdg1sbfz5c/public?h=JeeypNwoZxuVBcKfGt46-pVMRrTi5oT7FOMFySyhUsM</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1537366874601</DateTimeUTC>
      <Content>https://docs.mattermost.com/_images/icon-76x76.png</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1537366874601</DateTimeUTC>
      <UserFileName>Image Pasted at 2018-9-19 10-21.png</UserFileName>
      <FileName>20180919/teams/noteam/channels/yqzkxzmoobdxickjfemnkjr1de/users/yphfragmx7rsjg1u97853uw5pe/crgjz9j7niyh7be13sf1s6h37h/Image Pasted at 2018-9-19 10-21.png</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1537366874601</DateTimeUTC>
      <UserFileName>Image Pasted at 2018-9-19 10-21.png</UserFileName>
      <FileName>20180919/teams/noteam/channels/yqzkxzmoobdxickjfemnkjr1de/users/yphfragmx7rsjg1u97853uw5pe/crgjz9j7niyh7be13sf1s6h37h/Image Pasted at 2018-9-19 10-21.png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1537366932602</DateTimeUTC>
      <Content>https://docs.mattermost.com/_images/icon-76x76.png</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1537449128788</DateTimeUTC>
      <Content>Hey look at this great site: https://github.com/mattermost</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1537800810400</DateTimeUTC>
      <Content>https://pre-release.mattermost.com/files/yjkyezknnbfadnhj6ie69bdgpr/public?h=OERw4HfURLkq6szp9Te_Pm9ig7tr-0OyD_eRE1fiBUs</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1537801680804</DateTimeUTC>
      <Content>https://user-images.githubusercontent.com/8113443/44163136-d310e700-a0c2-11e8-9eb2-a993605e86b7.jpg</Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1538001505631</DateTimeUTC>
      <Content>@amyt </Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1538001544948</DateTimeUTC>
      <Content>@anu-leenonen </Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1538003813122</DateTimeUTC>
      <Content>@anu-leenonen </Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1538003840589</DateTimeUTC>
      <Content>@anu-leenonen </Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538003845653</DateTimeUTC>
      <Content>Km</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538003845653</DateTimeUTC>
      <Content>K</Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1538003863980</DateTimeUTC>
      <Content>@anu-leenonen </Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538003870832</DateTimeUTC>
      <Content>Cn</Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1538003903371</DateTimeUTC>
      <Content>@anu-leenonen </Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538003915861</DateTimeUTC>
      <Content>Dnbs</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538687843958</DateTimeUTC>
      <Content>h</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538687874591</DateTimeUTC>
      <Content>h</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538688312682</DateTimeUTC>
      <Content>https://ci-linux-mysql.mattermost.com/yourteamhere/pl/s7u7gugfrintj8andpdudj33bo</Content>
    </Message>
    <Message>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538767406425</DateTimeUTC>
      <Content>a message</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
      <Content>```&#xA;code&#xA;```</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>amy.blais+1@mattermost.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy.blais+6@mattermost.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>asaad+1@mattermost.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>asaad+9@mattermost.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+dkh-teamjoinuser@mattermost.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+dkhlogintest@mattermost.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+edgetest@mattermost.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>george+452@mattermost.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>george+46@mattermost.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>george+48@mattermost.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>george+51@mattermost.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>george+rn@mattermost.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>harrison+bw@mattermost.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jason+12344321@mattermost.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jason+1234554321@mattermost.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jason+2111@mattermost.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jason+2113@mattermost.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jason+3@mattermost.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jonathan.fritz+test1@mattermost.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>joram+1@mattermost.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+ldap@mattermost.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+mysql@mattermost.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+onel@mattermost.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+sysad1jun@mattermost.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>martin+test5@mattermost.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+14xec4mrrjdubqohzjfh1toq1h@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+1t7ffrnektgu7jyhcp17oubn1a@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+1tnb7sngkif85d8ur3usccipqw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+1wrt878j1tnf8kedbti6pjkw3o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+1zz5akufobye5gcapsifs3nk4e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+31tcmp8qsbnbfxw99o76z4hp4y@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+3asf6egnip8hjdk7b369pk5qyo@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+3cpcg5nr7i8dbfomhoigpd1i6a@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+3p9ocj8h8fysfq75t6cktckobo@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4188xiuyjigdpgk7mftsaw1pbe@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+44ajec86hbniur3kbut1tjxt6c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4bc6i6cfk38fbxircttympnskw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4c5pigczht8iuraieqma3fk88c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4cht4adn6pr9xqazcybuheoqkw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4ihuad1p6fghbeykkcxzqeg7wa@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4j6oifu37pr5dmdtpp48jmqteesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4jm7qnp43id3xgwa4in8ow3aoe@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4tcy19r5hidrbpqg4uhoyyw4dh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4tzo6dd1a7bnbdn8j15j4fdb6y@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4uuejz7ctbbgug4mdt13j51g9o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4wq5skd9ofdojqsoyuunjt7mdr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+5dkcraoo7tdn8kxz8cgx8p4dhr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+5fcbis73z7b6fydazancgys3gc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+5mqnbdy4ifdajkx5hem9sgjbqe@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+5nc5o6f8sfbm8deswkjfpnrady@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+5tso7cskft8qzdmop6cqaq5azo@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+5ztwom83e7bu98pqi5fs4jxexo@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+5zydt4yhufn47cod5j8nkiqp3c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+68j8ejpx93biuk8i1euwbh6n9y@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+69tbkw5e8tg9t8a4abijz8rmta@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+6ctxdiw6zpnb8m5id3t8mrg8ka@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+6exwexedcfb9dr1ykswffinuua@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+6iypex6jat8xietgkkf1htx4fy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+6kzhg7e8h7ga8qe847s8qwf46c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+6og1wweckbg83n1nm8ba8b5arw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+6t6nhamjt3gb9eb1k58ihsey5e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+6uyqtm11bbnguqssyuqdxxuuec@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+6zeoxzjmeb85dykd1f59jjobrc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+78mfzgemebdjtdgedmfj6yxjih@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+7eq1ryf7u38ufqcozwb7o4u8zy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+7hmez5xzrfy1u8oze83apk33ta@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+7j6msnn5jid8dpz186uhzfgsee@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+7ptjcezuoiym9bwb45cerk55qh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+7thynb6zjb8kmnngu3nr4rsaee@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+843f9qbjhtgfdfsmeuc17euxmc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+89sho1c8gjfqfrcoff7ypm31me@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+8ba3887n17gxp8tye6ywjsub1w@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+8fymowq3o7819dgse6s9ffoy9o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+8gquaj4cijr38qiygaezcfxc7e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+8yhu71kipt893qwndhwe7nmsua@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+95x4ca7zniddjnt4tew1aqnt4h@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+99paszs3w7nn8kyijwkmmzthdy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+9co11fc1efyaurkzo88tx73ife@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+9jkomtxhepgepe73kj817hyrue@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+a1616cw883yg7ctgqgfwk4obuh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+a957ee6w5f86up5jchsygc6zuc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+afds3o7zf3f5me41hgmxy858bw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+aiof7q67siyf3e5imc7amj75cr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+astuy8b8yp8j5qkferxdo537wr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+auecjinokfy69ebm9dots3ejea@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+b64o5iqs7jg99gyobms3g3cu7c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+b6i58un7e38npfd35a7p9edrfy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+bbzua1yrpjby885861k44okm8o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+bj3d5rkgf7bopnb6guakt4nr3h@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+bj6d54o1c78i585zqkxuyzsg9a@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+bj7ker7ntprwfqjbrz5eoe7a3o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+bjegnnb4y7fbzcgpjbdz7j9jio@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+bnxdj99okf8jjxb6o3ncskqytr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+c1im4r19b7buxen1b8b8hb1jbh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+c5sebzedspbkzy7who8qb3gf1o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+c6djwgwtu38yjb1tjho35mpjio@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+cihr5a3j8indtd8dwrf9s735fh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+ck1sgrgns7rq9kpr7hmsyh75by@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+cmxeex7ytbyepy8or35xwkdebc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+csbrztnqi7rgbneucxn64c33sr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+csgyn99rmjga9x57xcutsjih1h@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+curk9ueyciyj7fexjukby64yhh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+cw6awotpz7f4t8jrsm5c46uzpc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+d7y1dmxpc3ypjyaxh918cu1t3y@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+d9kpp6jdi7yb98utpexq6718sa@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+dbhzok7drbniddzrqrnw5i6tnc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+dd5cjzy99fnxfpd7gn67cnrkoa@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+dgnneanah3nmjru7zow5zaxg1c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+dx45haz8kjrxmnahhcpmyo6whe@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+dy56gamzetff8b5d1dssqq781h@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+e1ese484dfgubpac6as16rafhw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+eiizcc9rp78i3xpkz5abcskptr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+emfsb6pmrfbrmmu1tbsa5zwxfc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+enzo7zyuyjf5prhp11fpcfc81e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+eruami83wjywxrqq354wz7gcxy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+etew4mkajjgeinjxxzyrrsgxnc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+f1n9qnef7f8g3xd9688xg5c8ry@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+fd56e6gt5jyzuraib9o769opgr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+fi9pwo6nejdp7nma3picmopumc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+g39d4dfrwjr48cm686d51wc1ge@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+g45bnj98jtbq8jjkupiupac9xc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+g9crhsfwhty98k7e6wdci8bwbw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+g9fmc35jg78y3e6q1uf7awkdba@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+gb6rpcr5ntygxgcr1rep37qfay@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+gzenif5xd7gcb8runh1tjpwh6c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+gzyiupo4zfyf8jbxjx4fww4gpy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+h1hm9z5ccpyrmmrgnaaitex35e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+haufqfcyepntfqy7dxd9b473do@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+hojeqb3bgige8bffbxno5985sw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+i98stoyedbdh5dzws6fmwmjsxh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+igakdne9hprfj8xphufgkoro3o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+iqp9g319hfbjuyparipudcwmfe@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+itwwdkwhxpyriq4c7u3wz15hnc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+ixmah9qsi3ge7xmsrnhu9z9o5e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+j1e4zpx3qtfumpdpd1yz7ewana@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+j3zm7zczhpdi8q4sb3uapeik5a@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+j94x31y5dpf6dp633n1qmzmh9c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+jodoephek7d8d88ac6u6eh9c3r@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+jr4x57ogj3re383o7ntek9atse@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+jyyg8hijfjdu7yk5igqojme93a@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+k793mwzrmbgc5rwduyt8q1awqo@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+k95y7gjpa3gk3yf1gpqdtqwa1w@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+kxwneaxtz7gpinigcqc9ja1bwc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+kyma43yr63gazcfkyh6qztwfse@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+m5uquhcwupbjicjp87emirjh1c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+m6qk51nui7g53fwhfmmo3ihfsr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+mnnooxykrpgqix1tqzxz87cmuh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+mozz86d87ir6bpor9513guwz8w@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+n393dtrsn3rejqwgqcg7bwamkc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+n3icdmsontredyyekgs336fk6e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+n8pyg37fefd6imgh4cy7786uce@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+neiao6h57386bxbwp3ejy6xcoc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+noehgawh5jyc5xt3ywofqxtd6y@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+nrah6qsfj7fu9jfik9a4uww79a@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+nrnzrzu9cfdwujtz19f8amwyjc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+nx8ce9eq4tdsubnyyunrmaoq4e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+o35cxhtoxbgcmxzgg9bsnf1t5r@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+o6qsksztb3ncfbabiadfan57jc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+o6u4o6ehnbgt7nppgwe3rix8ih@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+oaep1nr6rjnqpgf5s1a7a8nggh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+obgkpz7ubtrq7mcx7fsr45xwaw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+oew8d6cqo78n5kcgfe3gh4sqic@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+oggf6j1zjjbijrgh1dqtc6dwiy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+ony1dxoyap8yik1u6crgk5g7dr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+oxni5dwrwpft8psedt4hphcg3e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+oxy1zb1877d6tq6q4r4anfjtky@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+p7fzz7d77pnr7cfcgrh9z8rchr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+p8qfkx9zopg88eqmz6p95th3ur@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+pkfxjzjibtbbxq53fekx48kagr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+pnb6a7ozpbr69dpfzwaa88bcpr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+q9pryt97ztrstemt6aidkus3se@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+qd5fu7ixmirsxbjpuk5wdmtz1w@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+qdnqsw8kbtfxpgpq3z6c81iaic@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+qm966it8mtrodjqxo6jodxkspa@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+qsa6ufn1p38bjjzr1qcgjijfsa@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+qsf3hma14jdcmnp4csrubmxzrc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+r1m7zkdcq78rim3j9jugw4iuwa@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+r9rm3cyoetfm5mojgwojybdado@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+rauudt7xtpgh8jx9z3y3sh44dh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+rou7y755ttbcug1e8xwanaqwor@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+rz4kohuu7bgqxdyybx1qohgu4r@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+sb64tapbjffobeutdrxgnwwjgw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+sc75jebrd7f3tr8xxouknzbpdy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+scrsatmi8pnk7jsbu56b9xg4qw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+sfj95m6zd3gymfw4ko7ycyee1o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+sfjjdebowbgk5ddrueiopckmtw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+sjezud6smtbdb8jooe98sgwx6w@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+soogdrkrx3rp7rccy9e5nnwq4o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+t7ndac4u6tr6zyfwsgk1q7f9by@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+t8iqgaa9t38azqr6ms3w7rqtbr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+t91oxeg38jbipei1a4wchx3f1o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+tdrqco68xbr5xrwzte1nk3khmr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+thu1zebw3in6z8bnc9sz5jr6kr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+tiph1dysipy1pddtpa53tt66bo@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+tjxzau9axtn43pjab6rko8ezme@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+tqak3npdbid4mc5hzxtqh73wrw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+ty1aggby5bystjbjaypdw9n7be@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+u886uag7cjgtbjru13cttxd5fw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+ubpszg8rjinkuqgjba4ikkr19c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+unbu9hxq53r7dys33pmwqu1amy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+ungcjtnm7p8yixjra6uk1iq9ah@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+ustc3hzbpj8x8c7arjm14m6tqa@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+w1sabjfu57rexxynjux7bahazc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+w4sxwn38si8xtkqurquqaywanh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+wb6c394ihtyxmq3f9t1c1piojc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+whq7cqdy9bd3fbdw7uurte6g7e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+wmggrb4ziig3zkznifayfucgza@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+wqir77z8wfrpjg7e533mntes4o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+x9mst3xmuif8be7mk1xi97957h@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+xadj5xeur7gi9gn3eg7k3rw67w@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+xj3fc6pou7gp5dkxudr6593qrw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+xmhksuze7i867pc8zmg5mipx3e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+xp16is97spr3tqdscd4icqos6o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+xskoj8s9h3gyz8rxqykhxsu7hh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+y16rmsr5rff5bcu8zu487p4kxo@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+ycmjsht84ifa9rku6xe438e63a@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+ycyb8stnw3gjzfncniy4mtyx9c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+yea5jwj4ctbn8g3exgd8xd8zjh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+yhjzab185bbyxdbrds4yes4kro@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+yr7ji7x9mpnn8pt8a391et1z5r@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+zgtdea7p6fnwpx7hx8ofmr55ir@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+zjx8d3qoyirejjn48y4ykogz8a@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+zr6renr5ijgm9jmwfx9jfffbcr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+ztby31z8yjbefx9y6uqq3ocuur@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+zy8w4zwnjby55e9mmn56hc1wio@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+zzgfhhfoz7grfjuhhxyuw6hach@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>test1@mattermost.com</LoginName>
      <DateTimeUTC>1538767518609</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538767518609</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Channel">
    <RoomID>private - bqs7sbgo3pr19k45iunf9su49c</RoomID>
    <StartTimeUTC>1537984400728</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>lindsay@mattermost.com</LoginName>
      <DateTimeUTC>1536173158435</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindsay+deuwue@mattermost.com</LoginName>
      <DateTimeUTC>1536173280344</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536173320791</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindsay@mattermost.com</LoginName>
      <DateTimeUTC>1537984400728</DateTimeUTC>
      <Content>post</Content>
    </Message>
    <Message>
      <LoginName>lindsay@mattermost.com</LoginName>
      <DateTimeUTC>1538680042791</DateTimeUTC>
      <Content>sunlight in the sky</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538680042791</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindsay+deuwue@mattermost.com</LoginName>
      <DateTimeUTC>1538680042791</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindsay@mattermost.com</LoginName>
      <DateTimeUTC>1538680042791</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538680042791</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="toarchive3">
    <RoomID>public - mjmk1d9mgjbu7gs75bgepjz6zy</RoomID>
    <StartTimeUTC>1538127917615</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538127901784</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538127917615</DateTimeUTC>
      <Content>Test testing to archive</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538127917615</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538127917615</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Town Square">
    <RoomID>public - gfzqpuraa3nauxdg46zer8icfo</RoomID>
    <StartTimeUTC>1538750799354</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>asaad+test@mattermost.com</LoginName>
      <DateTimeUTC>1538750799354</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1538750799354</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>asaad+test@mattermost.com</LoginName>
      <DateTimeUTC>1538750799354</DateTimeUTC>
      <Content>Hey</Content>
    </Message>
    <Message>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1538750942784</DateTimeUTC>
      <Content>Hey</Content>
    </Message>
    <Message>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1538750942784</DateTimeUTC>
      <Content>Hey now.</Content>
    </Message>
    <Message>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1538755508735</DateTimeUTC>
      <Content>Hey</Content>
    </Message>
    <Message>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1538755540244</DateTimeUTC>
      <Content>Hey</Content>
    </Message>
    <Message>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1538755568613</DateTimeUTC>
      <Content>Hey</Content>
    </Message>
    <Message>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1538755604383</DateTimeUTC>
      <Content># Basic Markdown Testing&#xA;Tests for text style, code blocks, in-line code and images, lines, block quotes, and headings.&#xA;&#xA;### Text Style&#xA;&#xA;**The following text should render as:**  &#xA;_Italics_&#xA;_Ita_lics_&#xA;*Italics*&#xA;**Bold**&#xA;***Bold-italics***&#xA;**_Bold-italics_**&#xA;~~Strikethrough~~&#xA;&#xA;This sentence contains **bold**, _italic_, ***bold-italic***, and ~~stikethrough~~ text.  &#xA;&#xA;**The following should render as normal text:**  &#xA;Normal Text_  &#xA;_Normal Text  &#xA;_Normal Text*&#xA;&#xA;### Carriage Return  &#xA;&#xA;Line #1 followed by one blank line &#xA;&#xA;Line #2 followed by one blank line&#xA;&#xA;Line #3 followed by Line #4&#xA;Line #4 &#xA;&#xA;&#xA;### Code Blocks&#xA;&#xA;```&#xA;This text should render in a code block&#xA;```&#xA;&#xA;**The following markdown should not render:**  &#xA;```&#xA;_Italics_  &#xA;*Italics*  &#xA;**Bold**  &#xA;***Bold-italics***  &#xA;**Bold-italics_**  &#xA;~~Strikethrough~~&#xA;:) :-) ;) ;-) :o :O :-o :-O &#xA;:bamboo: :gift_heart: :dolls: :school_satchel: :mortar_board:&#xA;# Heading 1&#xA;## Heading 2&#xA;### Heading 3&#xA;#### Heading 4&#xA;##### Heading 5&#xA;###### Heading 6&#xA;&gt; Block Quote&#xA;- List&#xA;  - List Sub-item&#xA;[Link](https://i.giphy.com/xNrM4cGJ8u3ao.gif)&#xA;[![Github](https://assets-cdn.github.com/favicon.ico)](https://github.com/mattermost/platform)&#xA;| Left-Aligned Text | Center Aligned Text | Right Aligned Text |&#xA;| :------------ |:---------------:| -----:|&#xA;| Left column 1 | this text       |  $100 |&#xA;```&#xA;&#xA;**The following links should not auto-link or generate previews:**  &#xA;```&#xA;GIF: https://i.giphy.com/xNrM4cGJ8u3ao.gif&#xA;Website: https://en.wikipedia.org/wiki/Dolphin&#xA;```&#xA;&#xA;**The following should appear as a carriage return separating two lines of text:**&#xA;```&#xA;Line #1 followed by a blank line&#xA;&#xA;Line #2 following a blank line&#xA;```&#xA;&#xA;### In-line Code&#xA;&#xA;The word `monospace` should render as in-line code.  &#xA;&#xA;The following markdown in-line code should not render:  &#xA;`_Italics_`, `*Italics*`, `**Bold**`, `***Bold-italics***`, `**Bold-italics_**`, `~~Strikethrough~~`, `:)` , `:-)` , `;)` , `:-O` , `:bamboo:` , `:gift_heart:` , `:dolls:` , `# Heading 1`, `## Heading 2`, `### Heading 3`, `#### Heading 4`, `##### Heading 5`, `###### Heading 6`&#xA;&#xA;This GIF link should not preview: `https://i.giphy.com/xNrM4cGJ8u3ao.gif`  &#xA;This link should not auto-link: `https://en.wikipedia.org/wiki/Dolphin`  &#xA;&#xA;This sentence with `&#xA;in-line code&#xA;` should appear on one line.&#xA;&#xA;### In-line Images&#xA;&#xA;Mattermost/platform build status:  [![Build Status](https://travis-ci.org/mattermost/platform.svg?branch=master)](https://travis-ci.org/mattermost/platform)  &#xA;&#xA;GitHub favicon:  ![Github](https://assets-cdn.github.com/favicon.ico)&#xA;&#xA;GIF Image:  &#xA;![gif](https://i.giphy.com/xNrM4cGJ8u3ao.gif)&#xA;&#xA;4K Wallpaper Image (11Mb):  &#xA;![4K Image](https://images.wallpaperscraft.com/image/starry_sky_shine_glitter_118976_3840x2160.jpg)&#xA;&#xA;Panorama Image:  &#xA;![Pano](http://amardeepphotography.com/wp-content/uploads/2012/11/Untitled_Panorama6small.jpg)&#xA;&#xA;Tall Portrait Image:  &#xA;![Portrait](http://www.maniacworld.com/now-this-is-a-tall-building.jpg)&#xA;&#xA;Tall Portrait Image (resized):  &#xA;![Portrait](http://www.maniacworld.com/now-this-is-a-tall-building.jpg =x200)&#xA;&#xA;Tall Portrait Image (resized to a square):  &#xA;![Portrait](http://www.maniacworld.com/now-this-is-a-tall-building.jpg =200x200)&#xA;&#xA;### Lines&#xA;&#xA;Three lines should render with text between them:  &#xA;&#xA;Text above line&#xA;&#xA;***&#xA;&#xA;Text between lines&#xA;&#xA;---  &#xA;&#xA;Text between lines&#xA;___  &#xA;&#xA;Text below line&#xA;&#xA;### Block Quotes&#xA;&#xA;&gt;This text should render in a block quote.&#xA;&#xA;**The following markdown should render within the block quote:**  &#xA;&gt; #### Heading 4  &#xA;&gt; _Italics_, *Italics*, **Bold**, ***Bold-italics***, **_Bold-italics_**, ~~Strikethrough~~  &#xA;&gt; :) :-) ;) :-O :bamboo: :gift_heart: :dolls:  &#xA;&#xA;**The following text should render in two block quotes separated by one line of text:**&#xA;&gt; Block quote 1&#xA;&#xA;Text between block quotes&#xA;&#xA;&gt; Block quote 2&#xA;&#xA;### Headings&#xA;&#xA;# Heading 1 font size  &#xA;## Heading 2 font size   &#xA;### Heading 3 font size  &#xA;#### Heading 4 font size  &#xA;##### Heading 5 font size  &#xA;###### Heading 6 font size  &#xA;&#xA;&#xA;### Escaped Characters&#xA;&#xA;**The following text should render the same as the raw text:**&#xA;Raw: `\\teamlinux\IT-Stuff\WorkingStuff`&#xA;Markdown: \\teamlinux\IT-Stuff\WorkingStuff&#xA;&#xA;&#xA;**The following text should escape out the first backslash so only one backslash appears:**&#xA;Raw: \\()#&#xA;Markdown: \\()#</Content>
    </Message>
    <Message>
      <LoginName>asaad+test@mattermost.com</LoginName>
      <DateTimeUTC>1538755730043</DateTimeUTC>
      <Content>The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Hello this is a long post, with more than 4000 characters, plus multiple attachments.</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>asaad+test@mattermost.com</LoginName>
      <DateTimeUTC>1538755730043</DateTimeUTC>
      <UserFileName>Screen Shot 2018-10-05 at 9.08.41 PM.png</UserFileName>
      <FileName>20181005/teams/noteam/channels/gfzqpuraa3nauxdg46zer8icfo/users/aktiazhaofgj9xy1u1wgwjm8kc/rfut34kwgpn7xfcejkjpaito4o/Screen Shot 2018-10-05 at 9.08.41 PM.png</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>asaad+test@mattermost.com</LoginName>
      <DateTimeUTC>1538755730043</DateTimeUTC>
      <UserFileName>Screen Shot 2018-10-05 at 9.08.41 PM.png</UserFileName>
      <FileName>20181005/teams/noteam/channels/gfzqpuraa3nauxdg46zer8icfo/users/aktiazhaofgj9xy1u1wgwjm8kc/1oss3nzmsib3z8m35isb4a6n4e/Screen Shot 2018-10-05 at 9.08.41 PM.png</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>asaad+test@mattermost.com</LoginName>
      <DateTimeUTC>1538755730043</DateTimeUTC>
      <UserFileName>Screen Shot 2018-10-05 at 9.08.41 PM.png</UserFileName>
      <FileName>20181005/teams/noteam/channels/gfzqpuraa3nauxdg46zer8icfo/users/aktiazhaofgj9xy1u1wgwjm8kc/iktrtcr6hin9dk8rxhri95et1y/Screen Shot 2018-10-05 at 9.08.41 PM.png</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>asaad+test@mattermost.com</LoginName>
      <DateTimeUTC>1538755730043</DateTimeUTC>
      <UserFileName>Screen Shot 2018-10-05 at 9.08.41 PM.png</UserFileName>
      <FileName>20181005/teams/noteam/channels/gfzqpuraa3nauxdg46zer8icfo/users/aktiazhaofgj9xy1u1wgwjm8kc/h1xrr5yr6pb3irmk1a5nk8tpow/Screen Shot 2018-10-05 at 9.08.41 PM.png</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>asaad+test@mattermost.com</LoginName>
      <DateTimeUTC>1538755730043</DateTimeUTC>
      <UserFileName>Screen Shot 2018-10-05 at 9.08.41 PM.png</UserFileName>
      <FileName>20181005/teams/noteam/channels/gfzqpuraa3nauxdg46zer8icfo/users/aktiazhaofgj9xy1u1wgwjm8kc/rfut34kwgpn7xfcejkjpaito4o/Screen Shot 2018-10-05 at 9.08.41 PM.png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>asaad+test@mattermost.com</LoginName>
      <DateTimeUTC>1538755730043</DateTimeUTC>
      <UserFileName>Screen Shot 2018-10-05 at 9.08.41 PM.png</UserFileName>
      <FileName>20181005/teams/noteam/channels/gfzqpuraa3nauxdg46zer8icfo/users/aktiazhaofgj9xy1u1wgwjm8kc/1oss3nzmsib3z8m35isb4a6n4e/Screen Shot 2018-10-05 at 9.08.41 PM.png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>asaad+test@mattermost.com</LoginName>
      <DateTimeUTC>1538755730043</DateTimeUTC>
      <UserFileName>Screen Shot 2018-10-05 at 9.08.41 PM.png</UserFileName>
      <FileName>20181005/teams/noteam/channels/gfzqpuraa3nauxdg46zer8icfo/users/aktiazhaofgj9xy1u1wgwjm8kc/iktrtcr6hin9dk8rxhri95et1y/Screen Shot 2018-10-05 at 9.08.41 PM.png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>asaad+test@mattermost.com</LoginName>
      <DateTimeUTC>1538755730043</DateTimeUTC>
      <UserFileName>Screen Shot 2018-10-05 at 9.08.41 PM.png</UserFileName>
      <FileName>20181005/teams/noteam/channels/gfzqpuraa3nauxdg46zer8icfo/users/aktiazhaofgj9xy1u1wgwjm8kc/h1xrr5yr6pb3irmk1a5nk8tpow/Screen Shot 2018-10-05 at 9.08.41 PM.png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>asaad+test@mattermost.com</LoginName>
      <DateTimeUTC>1538755767858</DateTimeUTC>
      <Content>Hey</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>asaad+test@mattermost.com</LoginName>
      <DateTimeUTC>1538755767858</DateTimeUTC>
      <UserFileName>IMG_66DA7167F7DF-1.jpeg</UserFileName>
      <FileName>20181005/teams/noteam/channels/gfzqpuraa3nauxdg46zer8icfo/users/aktiazhaofgj9xy1u1wgwjm8kc/9hman67yz7ywmg36qgkfox75he/IMG_66DA7167F7DF-1.jpeg</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>asaad+test@mattermost.com</LoginName>
      <DateTimeUTC>1538755767858</DateTimeUTC>
      <UserFileName>IMG_66DA7167F7DF-1.jpeg</UserFileName>
      <FileName>20181005/teams/noteam/channels/gfzqpuraa3nauxdg46zer8icfo/users/aktiazhaofgj9xy1u1wgwjm8kc/9hman67yz7ywmg36qgkfox75he/IMG_66DA7167F7DF-1.jpeg</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1538756051330</DateTimeUTC>
      <Content> Dhhdhdhdhhdhdbbsbbbdbbdbdbbsbdbbdbsbbsbsb Dhhdhdhdhhdhdbbsbbbdbbdbdbbsbdbbdbsbbsbsb Dhhdhdhdhhdhdbbsbbbdbbdbdbbsbdbbdbsbbsbsbhhjj</Content>
    </Message>
    <Message>
      <LoginName>asaad+test@mattermost.com</LoginName>
      <DateTimeUTC>1538756202687</DateTimeUTC>
      <Content> | A  | B  | C  |&#xA; |:---|:---|:---|&#xA; | 1  | Name | Toast |&#xA; | 2  | Name | Server |</Content>
    </Message>
    <Message>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1538756383102</DateTimeUTC>
      <Content>Hey</Content>
    </Message>
    <Message>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1538756592504</DateTimeUTC>
      <Content>Hey</Content>
    </Message>
    <Message>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1538756596926</DateTimeUTC>
      <Content>Hey</Content>
    </Message>
    <Message>
      <LoginName>asaad+test@mattermost.com</LoginName>
      <DateTimeUTC>1538756658970</DateTimeUTC>
      <Content>Hey</Content>
    </Message>
    <Message>
      <LoginName>asaad+test@mattermost.com</LoginName>
      <DateTimeUTC>1538756661251</DateTimeUTC>
      <Content>Hey</Content>
    </Message>
    <Message>
      <LoginName>asaad+test@mattermost.com</LoginName>
      <DateTimeUTC>1538756673211</DateTimeUTC>
      <Content>https://media1.giphy.com/media/l41lM6sJvwmZNruLe/giphy.gif</Content>
    </Message>
    <Message>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1538756721260</DateTimeUTC>
      <Content>One</Content>
    </Message>
    <Message>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1538756723070</DateTimeUTC>
      <Content>Teo</Content>
    </Message>
    <Message>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1538756724831</DateTimeUTC>
      <Content>Three</Content>
    </Message>
    <Message>
      <LoginName>asaad+test@mattermost.com</LoginName>
      <DateTimeUTC>1538756864362</DateTimeUTC>
      <Content>@asaad </Content>
    </Message>
    <Message>
      <LoginName>asaad+test@mattermost.com</LoginName>
      <DateTimeUTC>1538756909879</DateTimeUTC>
      <Content>@asaad </Content>
    </Message>
    <Message>
      <LoginName>asaad+test@mattermost.com</LoginName>
      <DateTimeUTC>1538756911087</DateTimeUTC>
      <Content>@Asaad </Content>
    </Message>
    <Message>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1538759103986</DateTimeUTC>
      <Content> 안녕하세요</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>asaad+test@mattermost.com</LoginName>
      <DateTimeUTC>1538759103986</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1538759103986</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538759103986</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Off-Topic">
    <RoomID>public - cob7xtzz6bf1tbjoxf9wgqq19h</RoomID>
    <StartTimeUTC>1538760604038</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538759838067</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760604038</DateTimeUTC>
      <Content>https://ci-linux-mysql.mattermost.com/harrison1/pl/nc63wswg7bd37rz3z7pod3d5dw</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760604038</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538760604038</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Group Message">
    <RoomID>group - 9jwxih5t6ifn3gb9xe3aqis3tc</RoomID>
    <StartTimeUTC>1538768626455</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>success+zw3aekuaaffs5c5wnncjq5ag3hsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538768610008</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+1rae4yficinqffw3ygypqf35nhsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538768610039</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+k163actt7fynpexxp37r1d8rkcsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538768610055</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+djh77mgwd3nw9bsj8fjxgee6posimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538768610072</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+ryk18mxjp7njdy75x97j9y6zdasimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538768610088</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1538768610105</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+9phitiyni3n9zyqtyn7qe7gzhesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538768610123</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+4j6oifu37pr5dmdtpp48jmqteesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538768610140</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1538768626455</DateTimeUTC>
      <Content>adsf</Content>
    </Message>
    <Message>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1538768627692</DateTimeUTC>
      <Content>asdf</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1538768627692</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+1rae4yficinqffw3ygypqf35nhsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538768627692</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4j6oifu37pr5dmdtpp48jmqteesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538768627692</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+9phitiyni3n9zyqtyn7qe7gzhesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538768627692</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+djh77mgwd3nw9bsj8fjxgee6posimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538768627692</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+k163actt7fynpexxp37r1d8rkcsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538768627692</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+ryk18mxjp7njdy75x97j9y6zdasimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538768627692</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+zw3aekuaaffs5c5wnncjq5ag3hsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538768627692</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538768627692</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="another test">
    <RoomID>public - ojndm9krabbybksz4p3bkgq45o</RoomID>
    <StartTimeUTC>1536180702689</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1536179169607</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+5jul@mattermost.com</LoginName>
      <DateTimeUTC>1536179181736</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1536179181753</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536180689228</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+jun6@mattermost.com</LoginName>
      <DateTimeUTC>1536180771335</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1536180702689</DateTimeUTC>
      <Content>Test</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536192789966</DateTimeUTC>
      <Content>posting a message</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1536180849217</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie+5jul@mattermost.com</LoginName>
      <DateTimeUTC>1536192789966</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie+jun6@mattermost.com</LoginName>
      <DateTimeUTC>1536192789966</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1536192789966</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536192789966</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536192789966</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="test">
    <RoomID>public - oxeo57b5ztrxfkpc19rxhdiwah</RoomID>
    <StartTimeUTC>1536291936709</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536291856585</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536291861006</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536291904990</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536291936709</DateTimeUTC>
      <Content>@channel hey channel</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536291936709</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536291936709</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536291936709</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536291936709</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="test">
    <RoomID>public - uy3furd13fgpfjdda45tp18j5e</RoomID>
    <StartTimeUTC>1533908507100</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1515509550293</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesus@mattermost.com</LoginName>
      <DateTimeUTC>1515509802552</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesus+6@mattermost.com</LoginName>
      <DateTimeUTC>1525950606330</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesus+2@mattermost.com</LoginName>
      <DateTimeUTC>1533819276916</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1533819290928</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesus.espino@mattermost.com</LoginName>
      <DateTimeUTC>1536267549004</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1533908507100</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1533908507100</DateTimeUTC>
      <UserFileName>IMG_2505.MOV</UserFileName>
      <FileName>20180810/teams/noteam/channels/uy3furd13fgpfjdda45tp18j5e/users/wp9wrf3i4tnkb8gagnyid1opir/4oyz4sb7jtymxrfhzbf17dxtur/IMG_2505.MOV</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1533908507100</DateTimeUTC>
      <UserFileName>IMG_2505.MOV</UserFileName>
      <FileName>20180810/teams/noteam/channels/uy3furd13fgpfjdda45tp18j5e/users/wp9wrf3i4tnkb8gagnyid1opir/4oyz4sb7jtymxrfhzbf17dxtur/IMG_2505.MOV</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>jesus.espino@mattermost.com</LoginName>
      <DateTimeUTC>1536267568381</DateTimeUTC>
      <Content>test</Content>
    </Message>
    <Message>
      <LoginName>jesus.espino@mattermost.com</LoginName>
      <DateTimeUTC>1536267576996</DateTimeUTC>
      <Content>@jespino test</Content>
    </Message>
    <Message>
      <LoginName>jesus.espino@mattermost.com</LoginName>
      <DateTimeUTC>1536267663062</DateTimeUTC>
      <Content>@jespino test2</Content>
    </Message>
    <Message>
      <LoginName>jesus.espino@mattermost.com</LoginName>
      <DateTimeUTC>1536268582022</DateTimeUTC>
      <Content>@jespino Another test more</Content>
    </Message>
    <Message>
      <LoginName>jesus.espino@mattermost.com</LoginName>
      <DateTimeUTC>1536268622441</DateTimeUTC>
      <Content>@jespino Another test more 2</Content>
    </Message>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1538771138902</DateTimeUTC>
      <Content>https://ci-linux-mysql.mattermost.com/jespino/pl/aik7hmqtmibkjpr51yut9hb8te</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1538771138902</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesus+2@mattermost.com</LoginName>
      <DateTimeUTC>1538771138902</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesus+6@mattermost.com</LoginName>
      <DateTimeUTC>1538771138902</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesus.espino@mattermost.com</LoginName>
      <DateTimeUTC>1538771138902</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesus@mattermost.com</LoginName>
      <DateTimeUTC>1538771138902</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538771138902</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - dom1pgkt8ifn5mcgtoc8ttqs4e</RoomID>
    <StartTimeUTC>1536182212808</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1536181743870</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+zw3aekuaaffs5c5wnncjq5ag3hsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536181743875</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1536182212808</DateTimeUTC>
      <Content>@alice was here</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1536182212808</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+zw3aekuaaffs5c5wnncjq5ag3hsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536182212808</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536182212808</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="private k">
    <RoomID>private - 5s4e4y8eypguzbfuky8xcyimja</RoomID>
    <StartTimeUTC>1536192865583</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1530893775776</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1530893895470</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+5jul@mattermost.com</LoginName>
      <DateTimeUTC>1530894459620</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536192865583</DateTimeUTC>
      <Content>posting a message</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>katie+5jul@mattermost.com</LoginName>
      <DateTimeUTC>1536192865583</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1536192865583</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536192865583</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536192865583</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="DKH Channel 2">
    <RoomID>private - jdpo9kxzn3rbp8sxstdx7fds4y</RoomID>
    <StartTimeUTC>1538185539702</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>dylan.haussermann@mattermost.com</LoginName>
      <DateTimeUTC>1525705209095</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1525721035715</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+05072018-c@mattermost.com</LoginName>
      <DateTimeUTC>1525723513920</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1528384951546</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1538185539702</DateTimeUTC>
      <Content>steak</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1538185539702</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+05072018-c@mattermost.com</LoginName>
      <DateTimeUTC>1538185539702</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan.haussermann@mattermost.com</LoginName>
      <DateTimeUTC>1538185539702</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1538185539702</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538185539702</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Group Message">
    <RoomID>group - 6dqzauxmeib19ehyeheyap9qqo</RoomID>
    <StartTimeUTC>1538690137650</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1538690131025</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538690131042</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+dojjf4o7ppyrudbewb7z8r98tesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538690131058</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+5k9tstziw7dqpf1em9h6dapuewsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538690131075</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1538690137650</DateTimeUTC>
      <Content>Hdrg</Content>
    </Message>
    <Message>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1538690149817</DateTimeUTC>
      <Content>Ddc</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538690297690</DateTimeUTC>
      <Content>hey</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538690306262</DateTimeUTC>
      <Content>@jason </Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538935804717</DateTimeUTC>
      <Content>@jason </Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538935916552</DateTimeUTC>
      <Content>@jason </Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538935928650</DateTimeUTC>
      <Content>@jason in hm</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538935944995</DateTimeUTC>
      <Content>@jason in hm</Content>
    </Message>
    <Message>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1538936459617</DateTimeUTC>
      <Content>jason</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538936559669</DateTimeUTC>
      <Content>@channel </Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538936561143</DateTimeUTC>
      <Content>@all </Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538936586120</DateTimeUTC>
      <Content>jasonblais</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538936592943</DateTimeUTC>
      <Content>hey</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538936719367</DateTimeUTC>
      <Content>hey</Content>
    </Message>
    <Message>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1538936732210</DateTimeUTC>
      <Content>ghey</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538936735811</DateTimeUTC>
      <Content>hey</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538936741941</DateTimeUTC>
      <Content>hey</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538936770367</DateTimeUTC>
      <Content>hey</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538936787773</DateTimeUTC>
      <Content>hhaa</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538936854871</DateTimeUTC>
      <Content>@jason </Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538936981729</DateTimeUTC>
      <Content>ha</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538936982850</DateTimeUTC>
      <Content>ho</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538936983413</DateTimeUTC>
      <Content>he</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538936983413</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1538936983413</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+5k9tstziw7dqpf1em9h6dapuewsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936983413</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+dojjf4o7ppyrudbewb7z8r98tesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936983413</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538936983413</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Group Message">
    <RoomID>group - 937bsr4o7f8iijn8mapk8nakje</RoomID>
    <StartTimeUTC>1536272057341</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>sudheer+testing@mattermost.com</LoginName>
      <DateTimeUTC>1536272051867</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1536272051883</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1536272051899</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1536272057341</DateTimeUTC>
      <Content>Hello</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1536272140636</DateTimeUTC>
      <Content>@sudheer-testing </Content>
    </Message>
    <Message>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1536272208093</DateTimeUTC>
      <Content>blah</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1536272258837</DateTimeUTC>
      <Content>Oj</Content>
    </Message>
    <Message>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1536272423581</DateTimeUTC>
      <Content>haan</Content>
    </Message>
    <Message>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1536272451415</DateTimeUTC>
      <Content>sa</Content>
    </Message>
    <Message>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1536272473193</DateTimeUTC>
      <Content>@sudheerdev </Content>
    </Message>
    <ParticipantLeft>
      <LoginName>sudheer+testing@mattermost.com</LoginName>
      <DateTimeUTC>1536272473193</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1536272473193</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1536272473193</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536272473193</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="testarchive">
    <RoomID>public - yyhthtyj83yfzkik1ntserd4jc</RoomID>
    <StartTimeUTC>1537285778261</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537285758685</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+5jul@mattermost.com</LoginName>
      <DateTimeUTC>1537285794658</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1537285794659</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>kwiersgalla@example.com</LoginName>
      <DateTimeUTC>1537285794661</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1537285794668</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>sweetkatiejo@example.com</LoginName>
      <DateTimeUTC>1537285794672</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537285778261</DateTimeUTC>
      <Content>asparagus</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537285799384</DateTimeUTC>
      <Content>pickle</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>katie+5jul@mattermost.com</LoginName>
      <DateTimeUTC>1537285799384</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1537285799384</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1537285799384</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537285799384</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>kwiersgalla@example.com</LoginName>
      <DateTimeUTC>1537285799384</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>sweetkatiejo@example.com</LoginName>
      <DateTimeUTC>1537285799384</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1537285799384</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - om7sr6epgi83pgk4s5xpwq8g3y</RoomID>
    <StartTimeUTC>1538724934476</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538724928633</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1538724928640</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538724934476</DateTimeUTC>
      <Content>just testing</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1538724934476</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538724934476</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538724934476</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="tesitng\\">
    <RoomID>private - pg6k5pudq7nfur57136sje4joa</RoomID>
    <StartTimeUTC>1534875471693</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1534875467357</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1534875471693</DateTimeUTC>
      <Content>test</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1534875471693</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1534875471693</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="DKHArcEmoji">
    <RoomID>public - k3zz1fx3kjgc3e38npq1bzbnuy</RoomID>
    <StartTimeUTC>1536007841431</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536007750566</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536007833034</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536007841431</DateTimeUTC>
      <Content>Post abouct clown</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536007848050</DateTimeUTC>
      <Content>Post about Tacos</Content>
    </Message>
    <Message>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536007865461</DateTimeUTC>
      <Content>Post about Heros</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536007865461</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536007865461</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536007865461</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Off-Topic">
    <RoomID>public - f875u5pshbyqi8ww6tbhatinxc</RoomID>
    <StartTimeUTC>1536192846529</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1528308789256</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1528315585069</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1528318267663</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+jun6@mattermost.com</LoginName>
      <DateTimeUTC>1528318729978</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+5jul@mattermost.com</LoginName>
      <DateTimeUTC>1530889339475</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1530889339586</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1530889339694</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>sweetkatiejo@example.com</LoginName>
      <DateTimeUTC>1533243778445</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>kwiersgalla@example.com</LoginName>
      <DateTimeUTC>1533243778644</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>slackimportuser_4ad7z1kt93gq7fquby39kkweqr@localhost</LoginName>
      <DateTimeUTC>1533243778905</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>slackimportuser_5ebgh7t1btfp3fgf9arydxqkhw@localhost</LoginName>
      <DateTimeUTC>1533247782287</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536192846529</DateTimeUTC>
      <Content>posting a message</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536192846529</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie+5jul@mattermost.com</LoginName>
      <DateTimeUTC>1536192846529</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie+jun6@mattermost.com</LoginName>
      <DateTimeUTC>1536192846529</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1536192846529</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1536192846529</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536192846529</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>kwiersgalla@example.com</LoginName>
      <DateTimeUTC>1536192846529</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>slackimportuser_4ad7z1kt93gq7fquby39kkweqr@localhost</LoginName>
      <DateTimeUTC>1536192846529</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>slackimportuser_5ebgh7t1btfp3fgf9arydxqkhw@localhost</LoginName>
      <DateTimeUTC>1536192846529</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>sweetkatiejo@example.com</LoginName>
      <DateTimeUTC>1536192846529</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536192846529</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="private l">
    <RoomID>private - q5psw666zbyb788ikqcikkbcah</RoomID>
    <StartTimeUTC>1536192871743</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1530893779814</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1530893898041</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536192871743</DateTimeUTC>
      <Content>posting a message</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1536192871743</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536192871743</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536192871743</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="ThisIsMYChannel">
    <RoomID>private - 4cgixwpu9pfsmq4x3ky4d3okpc</RoomID>
    <StartTimeUTC>1538076364754</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1538074918791</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1538076364754</DateTimeUTC>
      <Content>test.test@test.com&#xA;test.test-test.com</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1538076364754</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538076364754</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="NotListed">
    <RoomID>private - dprfy6h33ira7gkoc4uneqpmfr</RoomID>
    <StartTimeUTC>1538184958609</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538184937982</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538184958609</DateTimeUTC>
      <Content>maple</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538184958609</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538184958609</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Group Message">
    <RoomID>group - 7yceysh6m3rgd86xan5o7ih86c</RoomID>
    <StartTimeUTC>1538725191819</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1538725143684</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1538725143702</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy+13@mattermost.com</LoginName>
      <DateTimeUTC>1538725143721</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+8n75ck3iw7yjimoodeamcutwmasimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538725143738</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538725143757</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538725191819</DateTimeUTC>
      <Content>this is a group message</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538725334637</DateTimeUTC>
      <Content>@alice @mikenew </Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1539251466575</DateTimeUTC>
      <Content>Hi @brett</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1539251489739</DateTimeUTC>
      <Content>@alice-mail </Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1539251581942</DateTimeUTC>
      <Content>@alice-mail </Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1539251596479</DateTimeUTC>
      <Content>@joram</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1539251596479</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy+13@mattermost.com</LoginName>
      <DateTimeUTC>1539251596479</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1539251596479</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1539251596479</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+8n75ck3iw7yjimoodeamcutwmasimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539251596479</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1539251596479</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="abxdfhf">
    <RoomID>private - rwsgbptrwtfrim5nzyh63z5nfa</RoomID>
    <StartTimeUTC>1539120087275</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1539120066975</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>eric+4@mattermost.com</LoginName>
      <DateTimeUTC>1539120071541</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1539120087275</DateTimeUTC>
      <Content>@HERE </Content>
    </Message>
    <ParticipantLeft>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1539120087275</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>eric+4@mattermost.com</LoginName>
      <DateTimeUTC>1539120087275</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1539120087275</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="toarchive5">
    <RoomID>public - ao1jzs7ir7r6uk5s1rsyykfair</RoomID>
    <StartTimeUTC>1539250930345</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1539250920830</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1539250930345</DateTimeUTC>
      <Content>pineapple sauce test archive</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1539250930345</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1539250930345</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - oy7thyydf78dmkjpjomws9yatw</RoomID>
    <StartTimeUTC>1536262644332</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1530868040755</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1530868040760</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1536262644332</DateTimeUTC>
      <Content>hi</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1536262653023</DateTimeUTC>
      <Content>Test</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1536262653023</DateTimeUTC>
      <Content>Test. test</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1536270259105</DateTimeUTC>
      <Content>@sudheer-new </Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1536270293353</DateTimeUTC>
      <Content>@sudheer-test</Content>
    </Message>
    <Message>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1536270594466</DateTimeUTC>
      <Content>hello</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1536270604938</DateTimeUTC>
      <Content>Test</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1536270700120</DateTimeUTC>
      <Content> Haha</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538657668936</DateTimeUTC>
      <Content> ## I *meant* to link to [this](http://example.com) :facepalm: ![Mattermost](https://mattermost.com/wp-content/uploads/2022/02/logoHorizontal.png)&#xA;</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538657682834</DateTimeUTC>
      <Content>1</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538657691930</DateTimeUTC>
      <Content>hello</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538657731934</DateTimeUTC>
      <Content> ## I *meant* to link to [this](http://example.com) :facepalm: ![Mattermost](https://mattermost.com/wp-content/uploads/2022/02/logoHorizontal.png)</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538657746100</DateTimeUTC>
      <Content>:facepalm</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538657774930</DateTimeUTC>
      <Content> ## I *meant* to link to [this](http://example.com) :facepalm: ![Mattermost](https://mattermost.com/wp-content/uploads/2022/02/logoHorizontal.png)</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538657781131</DateTimeUTC>
      <Content>:man_facepalming: </Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538657795230</DateTimeUTC>
      <Content> ## I *meant* to link to [this](http://example.com) ::man_facepalming: ![Mattermost](https://mattermost.com/wp-content/uploads/2022/02/logoHorizontal.png)</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538666415924</DateTimeUTC>
      <Content>:green_apple: </Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538666776041</DateTimeUTC>
      <Content>a</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538666781234</DateTimeUTC>
      <Content>a</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538666786170</DateTimeUTC>
      <Content>1</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538725173986</DateTimeUTC>
      <Content>~~asdsad~~</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538725173986</DateTimeUTC>
      <Content>asdsad</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538725240776</DateTimeUTC>
      <Content>sadsd</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538725240776</DateTimeUTC>
      <Content>sadsdasdasd</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538725240776</DateTimeUTC>
      <UserFileName>Screen Shot 2018-10-05 at 11.35.04 AM.png</UserFileName>
      <FileName>20181005/teams/noteam/channels/oy7thyydf78dmkjpjomws9yatw/users/jrcr9qg89f868qidmrk7yspkiw/ubk4h847upgi5qy1fqnx7ase8c/Screen Shot 2018-10-05 at 11.35.04 AM.png</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538725240776</DateTimeUTC>
      <UserFileName>Screen Shot 2018-10-05 at 11.35.04 AM.png</UserFileName>
      <FileName>20181005/teams/noteam/channels/oy7thyydf78dmkjpjomws9yatw/users/jrcr9qg89f868qidmrk7yspkiw/ubk4h847upgi5qy1fqnx7ase8c/Screen Shot 2018-10-05 at 11.35.04 AM.png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538725282967</DateTimeUTC>
      <Content>[A Relative Link](/static/files/5b4a7904a3e041018526a00dba59ee48.png)</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538725381134</DateTimeUTC>
      <Content>asdsad haha</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538725381134</DateTimeUTC>
      <Content>asdsad</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538725385517</DateTimeUTC>
      <Content>asdasdasd</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538725385517</DateTimeUTC>
      <Content>asdasd</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538725480809</DateTimeUTC>
      <Content>adsa</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538725538008</DateTimeUTC>
      <Content># Basic Markdown Testing&#xA;Tests for text style, code blocks, in-line code and images, lines, block quotes, and headings.&#xA;&#xA;### Text Style&#xA;&#xA;**The following text should render as:**  &#xA;_Italics_&#xA;_Ita_lics_&#xA;*Italics*&#xA;**Bold**&#xA;***Bold-italics***&#xA;**_Bold-italics_**&#xA;~~Strikethrough~~&#xA;&#xA;This sentence contains **bold**, _italic_, ***bold-italic***, and ~~stikethrough~~ text.  &#xA;&#xA;**The following should render as normal text:**  &#xA;Normal Text_  &#xA;_Normal Text  &#xA;_Normal Text*&#xA;&#xA;### Carriage Return  &#xA;&#xA;Line #1 followed by one blank line &#xA;&#xA;Line #2 followed by one blank line&#xA;&#xA;Line #3 followed by Line #4&#xA;Line #4 &#xA;&#xA;&#xA;### Code Blocks&#xA;&#xA;```&#xA;This text should render in a code block&#xA;```&#xA;&#xA;**The following markdown should not render:**  &#xA;```&#xA;_Italics_  &#xA;*Italics*  &#xA;**Bold**  &#xA;***Bold-italics***  &#xA;**Bold-italics_**  &#xA;~~Strikethrough~~&#xA;:) :-) ;) ;-) :o :O :-o :-O &#xA;:bamboo: :gift_heart: :dolls: :school_satchel: :mortar_board:&#xA;# Heading 1&#xA;## Heading 2&#xA;### Heading 3&#xA;#### Heading 4&#xA;##### Heading 5&#xA;###### Heading 6&#xA;&gt; Block Quote&#xA;- List&#xA;  - List Sub-item&#xA;[Link](https://i.giphy.com/xNrM4cGJ8u3ao.gif)&#xA;[![Github](https://assets-cdn.github.com/favicon.ico)](https://github.com/mattermost/platform)&#xA;| Left-Aligned Text | Center Aligned Text | Right Aligned Text |&#xA;| :------------ |:---------------:| -----:|&#xA;| Left column 1 | this text       |  $100 |&#xA;```&#xA;&#xA;**The following links should not auto-link or generate previews:**  &#xA;```&#xA;GIF: https://i.giphy.com/xNrM4cGJ8u3ao.gif&#xA;Website: https://en.wikipedia.org/wiki/Dolphin&#xA;```&#xA;&#xA;**The following should appear as a carriage return separating two lines of text:**&#xA;```&#xA;Line #1 followed by a blank line&#xA;&#xA;Line #2 following a blank line&#xA;```&#xA;&#xA;### In-line Code&#xA;&#xA;The word `monospace` should render as in-line code.  &#xA;&#xA;The following markdown in-line code should not render:  &#xA;`_Italics_`, `*Italics*`, `**Bold**`, `***Bold-italics***`, `**Bold-italics_**`, `~~Strikethrough~~`, `:)` , `:-)` , `;)` , `:-O` , `:bamboo:` , `:gift_heart:` , `:dolls:` , `# Heading 1`, `## Heading 2`, `### Heading 3`, `#### Heading 4`, `##### Heading 5`, `###### Heading 6`&#xA;&#xA;This GIF link should not preview: `https://i.giphy.com/xNrM4cGJ8u3ao.gif`  &#xA;This link should not auto-link: `https://en.wikipedia.org/wiki/Dolphin`  &#xA;&#xA;This sentence with `&#xA;in-line code&#xA;` should appear on one line.&#xA;&#xA;### In-line Images&#xA;&#xA;Mattermost/platform build status:  [![Build Status](https://travis-ci.org/mattermost/platform.svg?branch=master)](https://travis-ci.org/mattermost/platform)  &#xA;&#xA;GitHub favicon:  ![Github](https://assets-cdn.github.com/favicon.ico)&#xA;&#xA;GIF Image:  &#xA;![gif](https://i.giphy.com/xNrM4cGJ8u3ao.gif)&#xA;&#xA;4K Wallpaper Image (11Mb):  &#xA;![4K Image](https://images.wallpaperscraft.com/image/starry_sky_shine_glitter_118976_3840x2160.jpg)&#xA;&#xA;Panorama Image:  &#xA;![Pano](http://amardeepphotography.com/wp-content/uploads/2012/11/Untitled_Panorama6small.jpg)&#xA;&#xA;Tall Portrait Image:  &#xA;![Portrait](http://www.maniacworld.com/now-this-is-a-tall-building.jpg)&#xA;&#xA;Tall Portrait Image (resized):  &#xA;![Portrait](http://www.maniacworld.com/now-this-is-a-tall-building.jpg =x200)&#xA;&#xA;Tall Portrait Image (resized to a square):  &#xA;![Portrait](http://www.maniacworld.com/now-this-is-a-tall-building.jpg =200x200)&#xA;&#xA;### Lines&#xA;&#xA;Three lines should render with text between them:  &#xA;&#xA;Text above line&#xA;&#xA;***&#xA;&#xA;Text between lines&#xA;&#xA;---  &#xA;&#xA;Text between lines&#xA;___  &#xA;&#xA;Text below line&#xA;&#xA;### Block Quotes&#xA;&#xA;&gt;This text should render in a block quote.&#xA;&#xA;**The following markdown should render within the block quote:**  &#xA;&gt; #### Heading 4  &#xA;&gt; _Italics_, *Italics*, **Bold**, ***Bold-italics***, **_Bold-italics_**, ~~Strikethrough~~  &#xA;&gt; :) :-) ;) :-O :bamboo: :gift_heart: :dolls:  &#xA;&#xA;**The following text should render in two block quotes separated by one line of text:**&#xA;&gt; Block quote 1&#xA;&#xA;Text between block quotes&#xA;&#xA;&gt; Block quote 2&#xA;&#xA;### Headings&#xA;&#xA;# Heading 1 font size  &#xA;## Heading 2 font size   &#xA;### Heading 3 font size  &#xA;#### Heading 4 font size  &#xA;##### Heading 5 font size  &#xA;###### Heading 6 font size  &#xA;&#xA;&#xA;### Escaped Characters&#xA;&#xA;**The following text should render the same as the raw text:**&#xA;Raw: `\\teamlinux\IT-Stuff\WorkingStuff`&#xA;Markdown: \\teamlinux\IT-Stuff\WorkingStuff&#xA;&#xA;&#xA;**The following text should escape out the first backslash so only one backslash appears:**&#xA;Raw: \\()#&#xA;Markdown: \\()#</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538725628320</DateTimeUTC>
      <Content>The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Hello this is a long post, with more than 4000 characters, plus multiple attachments.</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538725628320</DateTimeUTC>
      <UserFileName>Screen Shot 2018-10-03 at 6.37.20 PM.png</UserFileName>
      <FileName>20181005/teams/noteam/channels/oy7thyydf78dmkjpjomws9yatw/users/jrcr9qg89f868qidmrk7yspkiw/mrqio4xui7bhfdw6msxuamhbyw/Screen Shot 2018-10-03 at 6.37.20 PM.png</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538725628320</DateTimeUTC>
      <UserFileName>Screen Shot 2018-10-03 at 7.34.20 PM.png</UserFileName>
      <FileName>20181005/teams/noteam/channels/oy7thyydf78dmkjpjomws9yatw/users/jrcr9qg89f868qidmrk7yspkiw/i6ksodqxspb6ixbr79bkuuc5eh/Screen Shot 2018-10-03 at 7.34.20 PM.png</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538725628320</DateTimeUTC>
      <UserFileName>Screen Shot 2018-10-03 at 7.25.51 PM.png</UserFileName>
      <FileName>20181005/teams/noteam/channels/oy7thyydf78dmkjpjomws9yatw/users/jrcr9qg89f868qidmrk7yspkiw/o5ogw6ko6bfcxdc5zjhxumncdo/Screen Shot 2018-10-03 at 7.25.51 PM.png</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538725628320</DateTimeUTC>
      <UserFileName>Screen Shot 2018-10-02 at 1.00.24 AM.png</UserFileName>
      <FileName>20181005/teams/noteam/channels/oy7thyydf78dmkjpjomws9yatw/users/jrcr9qg89f868qidmrk7yspkiw/ayhwyxrbtpn8zpq9poemqytqwh/Screen Shot 2018-10-02 at 1.00.24 AM.png</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538725628320</DateTimeUTC>
      <UserFileName>Screen Shot 2018-10-03 at 6.37.20 PM.png</UserFileName>
      <FileName>20181005/teams/noteam/channels/oy7thyydf78dmkjpjomws9yatw/users/jrcr9qg89f868qidmrk7yspkiw/mrqio4xui7bhfdw6msxuamhbyw/Screen Shot 2018-10-03 at 6.37.20 PM.png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538725628320</DateTimeUTC>
      <UserFileName>Screen Shot 2018-10-03 at 7.34.20 PM.png</UserFileName>
      <FileName>20181005/teams/noteam/channels/oy7thyydf78dmkjpjomws9yatw/users/jrcr9qg89f868qidmrk7yspkiw/i6ksodqxspb6ixbr79bkuuc5eh/Screen Shot 2018-10-03 at 7.34.20 PM.png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538725628320</DateTimeUTC>
      <UserFileName>Screen Shot 2018-10-03 at 7.25.51 PM.png</UserFileName>
      <FileName>20181005/teams/noteam/channels/oy7thyydf78dmkjpjomws9yatw/users/jrcr9qg89f868qidmrk7yspkiw/o5ogw6ko6bfcxdc5zjhxumncdo/Screen Shot 2018-10-03 at 7.25.51 PM.png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538725628320</DateTimeUTC>
      <UserFileName>Screen Shot 2018-10-02 at 1.00.24 AM.png</UserFileName>
      <FileName>20181005/teams/noteam/channels/oy7thyydf78dmkjpjomws9yatw/users/jrcr9qg89f868qidmrk7yspkiw/ayhwyxrbtpn8zpq9poemqytqwh/Screen Shot 2018-10-02 at 1.00.24 AM.png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538725795088</DateTimeUTC>
      <Content>https://ci-linux-mysql.mattermost.com/b-team/pl/jedwxdj6r3gf9r4bt3rsabb4sy</Content>
    </Message>
    <Message>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1538728579560</DateTimeUTC>
      <Content>1</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538728645142</DateTimeUTC>
      <Content>One</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538728645142</DateTimeUTC>
      <Content>One</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538728645142</DateTimeUTC>
      <Content>One</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538728645142</DateTimeUTC>
      <Content>One</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538728646836</DateTimeUTC>
      <Content>two</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538728648125</DateTimeUTC>
      <Content>three</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538729561963</DateTimeUTC>
      <Content>as</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538729561963</DateTimeUTC>
      <Content>as</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538730517062</DateTimeUTC>
      <Content>https://www.bbc.com/news/uk-wales-45142614</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538730517062</DateTimeUTC>
      <Content>https://www.bbc.com/news/uk-wales-45142614</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538730568687</DateTimeUTC>
      <Content>https://www.bbc.com/news/uk-wales-45142614</Content>
    </Message>
    <Message>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1539108521344</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1539108521344</DateTimeUTC>
      <UserFileName>Screen Shot 2018-10-09 at 8.33.04 PM.png</UserFileName>
      <FileName>20181009/teams/noteam/channels/oy7thyydf78dmkjpjomws9yatw/users/r5ad7j51kf8x9ji7tr8e9eqg9e/u8ss391wn3dgmkn5g7unqr8fiw/Screen Shot 2018-10-09 at 8.33.04 PM.png</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1539108521344</DateTimeUTC>
      <UserFileName>Screen Shot 2018-10-09 at 8.33.04 PM.png</UserFileName>
      <FileName>20181009/teams/noteam/channels/oy7thyydf78dmkjpjomws9yatw/users/r5ad7j51kf8x9ji7tr8e9eqg9e/u8ss391wn3dgmkn5g7unqr8fiw/Screen Shot 2018-10-09 at 8.33.04 PM.png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1539108533262</DateTimeUTC>
      <Content>as</Content>
    </Message>
    <Message>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1539108541906</DateTimeUTC>
      <Content>asdfsad</Content>
    </Message>
    <Message>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1539108548436</DateTimeUTC>
      <Content>asdfsd</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1539108548436</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1539108548436</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1539108548436</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Group Message">
    <RoomID>group - nx4jua15fpg77dhx3d1g6wmoea</RoomID>
    <StartTimeUTC>1538679049687</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>lindsay@mattermost.com</LoginName>
      <DateTimeUTC>1525806552317</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindsay+abc@mattermost.com</LoginName>
      <DateTimeUTC>1525806552337</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1525806552356</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1538679049687</DateTimeUTC>
      <Content>post</Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1538679178366</DateTimeUTC>
      <Content>@lindsay.abcde </Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1538679196906</DateTimeUTC>
      <Content>@lindsay.abcde </Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1538679208378</DateTimeUTC>
      <Content>@lindsay.abcde </Content>
    </Message>
    <Message>
      <LoginName>lindsay+abc@mattermost.com</LoginName>
      <DateTimeUTC>1538679404944</DateTimeUTC>
      <Content>post</Content>
    </Message>
    <Message>
      <LoginName>lindsay+abc@mattermost.com</LoginName>
      <DateTimeUTC>1538679431337</DateTimeUTC>
      <Content>post</Content>
    </Message>
    <Message>
      <LoginName>lindsay+abc@mattermost.com</LoginName>
      <DateTimeUTC>1538679436245</DateTimeUTC>
      <Content>@alindsay </Content>
    </Message>
    <ParticipantLeft>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1538679436245</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindsay+abc@mattermost.com</LoginName>
      <DateTimeUTC>1538679436245</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindsay@mattermost.com</LoginName>
      <DateTimeUTC>1538679436245</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538679436245</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="joram2">
    <RoomID>public - ycm4judyibgb5n98x5i1z3xiuh</RoomID>
    <StartTimeUTC>1538749952014</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>joram@mattermost.com</LoginName>
      <DateTimeUTC>1538749847188</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>joram@mattermost.com</LoginName>
      <DateTimeUTC>1538749952014</DateTimeUTC>
      <Content>test</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>joram@mattermost.com</LoginName>
      <DateTimeUTC>1538749952014</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538749952014</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Group Message">
    <RoomID>group - zc3pbxxo8jggpjhaho1kkur4wh</RoomID>
    <StartTimeUTC>1538935992171</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>jason+13@mattermost.com</LoginName>
      <DateTimeUTC>1538935990084</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538935990100</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1538935990115</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538935992171</DateTimeUTC>
      <Content>@jason </Content>
    </Message>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538935992171</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jason+13@mattermost.com</LoginName>
      <DateTimeUTC>1538935992171</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1538935992171</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538935992171</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="test 6">
    <RoomID>public - qbiuzxxb37b9uycizhkt8j9oce</RoomID>
    <StartTimeUTC>1536274676328</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1533669062699</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1533752919537</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1537303594826</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536274676328</DateTimeUTC>
      <Content>https://ci-linux-mysql.mattermost.com/dkh-team/pl/upctogas5bfixkpqirybeqcoyw</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1538185142359</DateTimeUTC>
      <Content>salsa</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1538185142359</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1538185142359</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1538185142359</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538185142359</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - n6eses7c1pgg7cz6ggybsq7mra</RoomID>
    <StartTimeUTC>1538725214314</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538725214314</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538725214314</DateTimeUTC>
      <Content>message</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538725214314</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538725214314</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Town Square">
    <RoomID>public - ygeidihx8tf5jbp1aidpggkz6e</RoomID>
    <StartTimeUTC>1538750611178</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>jesse+alternate@mattermost.com</LoginName>
      <DateTimeUTC>1530888988575</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>jesse+alternate@mattermost.com</LoginName>
      <DateTimeUTC>1538750611178</DateTimeUTC>
      <Content>test</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>jesse+alternate@mattermost.com</LoginName>
      <DateTimeUTC>1538750611178</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538750611178</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="d channel">
    <RoomID>public - hbxhhxwrytrgicn4716fanzf9y</RoomID>
    <StartTimeUTC>1536192795299</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1530893726978</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1530893812473</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536192795299</DateTimeUTC>
      <Content>posting a message</Content>
    </Message>
    <Message>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1536194071938</DateTimeUTC>
      <Content>[title](www.google.com)</Content>
    </Message>
    <Message>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1536194184461</DateTimeUTC>
      <Content>Replying </Content>
    </Message>
    <FileTransferStarted>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1536194184461</DateTimeUTC>
      <UserFileName>IMG_2120.JPG</UserFileName>
      <FileName>20180906/teams/noteam/channels/hbxhhxwrytrgicn4716fanzf9y/users/chxcpdqp43rimrt1g7dszk9qea/rg8z9ixcnjdk7gn445fbntgieh/IMG_2120.JPG</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1536194184461</DateTimeUTC>
      <UserFileName>IMG_2120.JPG</UserFileName>
      <FileName>20180906/teams/noteam/channels/hbxhhxwrytrgicn4716fanzf9y/users/chxcpdqp43rimrt1g7dszk9qea/rg8z9ixcnjdk7gn445fbntgieh/IMG_2120.JPG</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <ParticipantLeft>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1536194184461</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536194184461</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536194184461</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="private h">
    <RoomID>private - q4jckp8idpyjf8uxg8yamhkn5w</RoomID>
    <StartTimeUTC>1536193034554</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1530893761736</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1530893885417</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536193034554</DateTimeUTC>
      <Content>ghjg</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1536193034554</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536193034554</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536193034554</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - wnde4i5f6br7zb6nyeaip8kunr</RoomID>
    <StartTimeUTC>1536193738506</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1528318315858</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1528318315863</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536193738506</DateTimeUTC>
      <Content>test</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1536193738506</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536193738506</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536193738506</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="test 8">
    <RoomID>public - bm7j1awooiytzjk57odscwdj1e</RoomID>
    <StartTimeUTC>1537303796572</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1537303787715</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1537303796572</DateTimeUTC>
      <Content>Pickles</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1537303796572</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1537303796572</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="archived-test">
    <RoomID>public - sntufqtn4j8idr464xhkm3adze</RoomID>
    <StartTimeUTC>1538499893305</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1538499889926</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1538499893305</DateTimeUTC>
      <Content>hola</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1538499893305</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538499893305</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="archive2">
    <RoomID>public - 1dzm4byyhjgfiyru66zx5wdf5a</RoomID>
    <StartTimeUTC>1534360404765</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1534360402914</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1534360404765</DateTimeUTC>
      <Content>post</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1534360404765</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1534360404765</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Group Message">
    <RoomID>group - 98a7fdkq1tfq9b5jukbh6dpjfr</RoomID>
    <StartTimeUTC>1536182741415</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1536182713449</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+qzkhdqezoi84jgxyroegmhwqcrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536182713466</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+4j6oifu37pr5dmdtpp48jmqteesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536182713490</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1536182741415</DateTimeUTC>
      <Content>a message </Content>
    </Message>
    <Message>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1536182877924</DateTimeUTC>
      <Content>@1189jsh17fru9yun3q1rnikcsh </Content>
    </Message>
    <Message>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1536182891380</DateTimeUTC>
      <Content>@alice.miller </Content>
    </Message>
    <Message>
      <LoginName>success+4j6oifu37pr5dmdtpp48jmqteesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536183082380</DateTimeUTC>
      <Content>@paul </Content>
    </Message>
    <Message>
      <LoginName>success+4j6oifu37pr5dmdtpp48jmqteesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536183135333</DateTimeUTC>
      <Content>in the channel</Content>
    </Message>
    <Message>
      <LoginName>success+4j6oifu37pr5dmdtpp48jmqteesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536183148789</DateTimeUTC>
      <Content>post</Content>
    </Message>
    <Message>
      <LoginName>success+4j6oifu37pr5dmdtpp48jmqteesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536183160896</DateTimeUTC>
      <Content>@paul </Content>
    </Message>
    <ParticipantLeft>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1536183160896</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4j6oifu37pr5dmdtpp48jmqteesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536183160896</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+qzkhdqezoi84jgxyroegmhwqcrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536183160896</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536183160896</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Town Square">
    <RoomID>public - 8n9m774jetdpijgqckbauekbbo</RoomID>
    <StartTimeUTC>1538731537550</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1518203735410</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1523472609264</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy+test@mattermost.com</LoginName>
      <DateTimeUTC>1523601145433</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1525804366601</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1527840643903</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+aqhc4uqjzjru383wnyx1jt5kgwsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1533109628324</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1538731537550</DateTimeUTC>
      <Content>hello</Content>
    </Message>
    <Message>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1538731677097</DateTimeUTC>
      <Content>@HERE</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538731806441</DateTimeUTC>
      <Content>@here </Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538731871791</DateTimeUTC>
      <Content>hello</Content>
    </Message>
    <Message>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1538731880863</DateTimeUTC>
      <Content>hi</Content>
    </Message>
    <Message>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1538732378227</DateTimeUTC>
      <Content>@here </Content>
    </Message>
    <Message>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1538733841786</DateTimeUTC>
      <Content>@here</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1538733841786</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538733841786</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1538733841786</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy+test@mattermost.com</LoginName>
      <DateTimeUTC>1538733841786</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538733841786</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+aqhc4uqjzjru383wnyx1jt5kgwsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538733841786</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538733841786</EndTimeUTC>
  </Conversation>
  <Conversation Perspective=" Eagle Squad">
    <RoomID>public - 1g4xb64q87g5xe1cnm8xor61oc</RoomID>
    <StartTimeUTC>1535728761482</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1535728659491</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+demo@mattermost.com</LoginName>
      <DateTimeUTC>1535728679814</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+5jul@mattermost.com</LoginName>
      <DateTimeUTC>1535728707651</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1535728707660</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1535728761482</DateTimeUTC>
      <Content>The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sugar-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. &#xA;</Content>
    </Message>
    <Message>
      <LoginName>katie+demo@mattermost.com</LoginName>
      <DateTimeUTC>1535728812353</DateTimeUTC>
      <Content>The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sugar-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. &#xA;</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1535728834340</DateTimeUTC>
      <Content>Is this the content you were looking for?  </Content>
    </Message>
    <Message>
      <LoginName>katie+demo@mattermost.com</LoginName>
      <DateTimeUTC>1535728859120</DateTimeUTC>
      <Content>Yes thank you very much that was indeed what I was looking for.  I appreciate you providing it to me so quickly. </Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1535728883063</DateTimeUTC>
      <Content>What time is your appointment this afternoon?   </Content>
    </Message>
    <Message>
      <LoginName>katie+demo@mattermost.com</LoginName>
      <DateTimeUTC>1535728953997</DateTimeUTC>
      <Content>It is at 13:00. I will need to factor in some travel time as well, so I will be leaving prior to that time.  Likely 12:30.  Please let me know if you need anything from me prior to that time. </Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1535731743525</DateTimeUTC>
      <Content>@joe.johnson Can we being discussions for preparation for our mission for next month? </Content>
    </Message>
    <Message>
      <LoginName>katie+demo@mattermost.com</LoginName>
      <DateTimeUTC>1535731766442</DateTimeUTC>
      <Content>I agree that is a good idea</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1535731845271</DateTimeUTC>
      <Content># Field Mission 2018-09-30&#xA;### Mission Purpose</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1535731845271</DateTimeUTC>
      <Content># Field Mission 2018-09-30&#xA;###Mission Purpose</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1535731877861</DateTimeUTC>
      <Content>This is the agenda </Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1535731912896</DateTimeUTC>
      <Content>[Testing](www.google.com)</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1535731912896</DateTimeUTC>
      <UserFileName>PPT copy 2.pptx</UserFileName>
      <FileName>20180831/teams/noteam/channels/1g4xb64q87g5xe1cnm8xor61oc/users/jiwfp5bf6fymbrgi6czdqhs6fw/1u95ekt9c3fyf8msmb33rtp7gh/PPT copy 2.pptx</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1535731912896</DateTimeUTC>
      <UserFileName>PPT copy 2.pptx</UserFileName>
      <FileName>20180831/teams/noteam/channels/1g4xb64q87g5xe1cnm8xor61oc/users/jiwfp5bf6fymbrgi6czdqhs6fw/1u95ekt9c3fyf8msmb33rtp7gh/PPT copy 2.pptx</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <ParticipantLeft>
      <LoginName>katie+5jul@mattermost.com</LoginName>
      <DateTimeUTC>1535731912896</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie+demo@mattermost.com</LoginName>
      <DateTimeUTC>1535731912896</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1535731912896</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1535731912896</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1535731912896</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Town Square">
    <RoomID>public - pxkrqee367f78kbqxf3sa96aty</RoomID>
    <StartTimeUTC>1536265081139</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1533673651981</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536265077994</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536291541649</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536265081139</DateTimeUTC>
      <Content>test</Content>
    </Message>
    <Message>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536270380933</DateTimeUTC>
      <Content>@jesse </Content>
    </Message>
    <Message>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536291037232</DateTimeUTC>
      <Content>charles</Content>
    </Message>
    <Message>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536291061197</DateTimeUTC>
      <Content>charles</Content>
    </Message>
    <Message>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536291062819</DateTimeUTC>
      <Content>jesse</Content>
    </Message>
    <Message>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536291068913</DateTimeUTC>
      <Content>@jesse </Content>
    </Message>
    <Message>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536291129833</DateTimeUTC>
      <Content>@jesse </Content>
    </Message>
    <Message>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536291226215</DateTimeUTC>
      <Content>@jesse?</Content>
    </Message>
    <Message>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536291296911</DateTimeUTC>
      <Content>test</Content>
    </Message>
    <Message>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536291305807</DateTimeUTC>
      <Content>charles</Content>
    </Message>
    <Message>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536291329528</DateTimeUTC>
      <Content>bob?</Content>
    </Message>
    <Message>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536291330980</DateTimeUTC>
      <Content>charles</Content>
    </Message>
    <Message>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536291365330</DateTimeUTC>
      <Content>bob</Content>
    </Message>
    <Message>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536291366928</DateTimeUTC>
      <Content>charles</Content>
    </Message>
    <Message>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536291410979</DateTimeUTC>
      <Content>charles</Content>
    </Message>
    <Message>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536291544286</DateTimeUTC>
      <Content>test</Content>
    </Message>
    <Message>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536291657118</DateTimeUTC>
      <Content>test</Content>
    </Message>
    <Message>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536291659126</DateTimeUTC>
      <Content>jesse</Content>
    </Message>
    <Message>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536291660712</DateTimeUTC>
      <Content>charles</Content>
    </Message>
    <Message>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536291661973</DateTimeUTC>
      <Content>Charles?</Content>
    </Message>
    <Message>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536291667512</DateTimeUTC>
      <Content>@jesse!</Content>
    </Message>
    <Message>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536292406771</DateTimeUTC>
      <Content>keyword!</Content>
    </Message>
    <Message>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536292522871</DateTimeUTC>
      <Content>town square!</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536292522871</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536292522871</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536292522871</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536292522871</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="dkhuser9">
    <RoomID>public - y3e7dmppkjfodd71pr6m77zpqy</RoomID>
    <StartTimeUTC>1534216422094</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1533669158480</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1533671929112</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1534216422094</DateTimeUTC>
      <Content>URL Encoded Space</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1534216422094</DateTimeUTC>
      <UserFileName>MP4%20File%20with Spaces.mp4</UserFileName>
      <FileName>20180814/teams/noteam/channels/y3e7dmppkjfodd71pr6m77zpqy/users/7n8rz76dk3n88ydfzh5d7fny4r/kpcitewk33nyfeodykgsfo6z1y/MP4%20File%20with Spaces.mp4</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1534216422094</DateTimeUTC>
      <UserFileName>MP4%20File%20with Spaces.mp4</UserFileName>
      <FileName>20180814/teams/noteam/channels/y3e7dmppkjfodd71pr6m77zpqy/users/7n8rz76dk3n88ydfzh5d7fny4r/kpcitewk33nyfeodykgsfo6z1y/MP4%20File%20with Spaces.mp4</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1534216446638</DateTimeUTC>
      <Content>Spaces in MP4</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1534216446638</DateTimeUTC>
      <UserFileName>MP4 File with Spaces.mp4</UserFileName>
      <FileName>20180814/teams/noteam/channels/y3e7dmppkjfodd71pr6m77zpqy/users/7n8rz76dk3n88ydfzh5d7fny4r/ftyfdykor7nyfrzybpmdb94jph/MP4 File with Spaces.mp4</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1534216446638</DateTimeUTC>
      <UserFileName>MP4 File with Spaces.mp4</UserFileName>
      <FileName>20180814/teams/noteam/channels/y3e7dmppkjfodd71pr6m77zpqy/users/7n8rz76dk3n88ydfzh5d7fny4r/ftyfdykor7nyfrzybpmdb94jph/MP4 File with Spaces.mp4</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536088550385</DateTimeUTC>
      <Content>Screen</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536088550385</DateTimeUTC>
      <UserFileName>Screenshot_20180904-151456.png</UserFileName>
      <FileName>20180904/teams/noteam/channels/y3e7dmppkjfodd71pr6m77zpqy/users/ytj99mb1tbgfmpzzcnzw734tdo/ws1dmycj338kpyoe5te5oikbwa/Screenshot_20180904-151456.png</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536088550385</DateTimeUTC>
      <UserFileName>Screenshot_20180904-151456.png</UserFileName>
      <FileName>20180904/teams/noteam/channels/y3e7dmppkjfodd71pr6m77zpqy/users/ytj99mb1tbgfmpzzcnzw734tdo/ws1dmycj338kpyoe5te5oikbwa/Screenshot_20180904-151456.png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536206357145</DateTimeUTC>
      <Content>Post made at 11:59 EST</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536206357145</DateTimeUTC>
      <Content>Post made at 12:00 EST</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536206357145</DateTimeUTC>
      <Content>Post made at 11:59 EST</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536206412571</DateTimeUTC>
      <Content>Post made at 12:00 EST</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536206412571</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536206412571</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536206412571</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Off-Topic">
    <RoomID>public - 1s78isuo47gijxg9zxbi6gfkxa</RoomID>
    <StartTimeUTC>1536178183020</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1520556786530</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>alice+1@mattermost.com</LoginName>
      <DateTimeUTC>1526335777002</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>alice+3@mattermost.com</LoginName>
      <DateTimeUTC>1526335777087</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>alice+4@mattermost.com</LoginName>
      <DateTimeUTC>1526335777177</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1526335777263</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>alice+5@mattermost.com</LoginName>
      <DateTimeUTC>1526335777351</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>alice+6@mattermost.com</LoginName>
      <DateTimeUTC>1526335777439</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>alice+7@mattermost.com</LoginName>
      <DateTimeUTC>1526335777525</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>alice+8@mattermost.com</LoginName>
      <DateTimeUTC>1526335777633</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>bopeng101@mattermost.com</LoginName>
      <DateTimeUTC>1526335777719</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>conrad@mattermost.com</LoginName>
      <DateTimeUTC>1526335777918</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>corey@mattermost.com</LoginName>
      <DateTimeUTC>1526335778007</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dmaas@mattermost.com</LoginName>
      <DateTimeUTC>1526335778093</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>vfxart.ds@mattermost.com</LoginName>
      <DateTimeUTC>1526335778179</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dickie@mattermost.com</LoginName>
      <DateTimeUTC>1526335778264</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>doo@mattermost.com</LoginName>
      <DateTimeUTC>1526335778352</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>earl@mattermost.com</LoginName>
      <DateTimeUTC>1526335778445</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>gaurav@mattermost.com</LoginName>
      <DateTimeUTC>1526335778632</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>github@example.com</LoginName>
      <DateTimeUTC>1526335778717</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1526335778807</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>saxah.jean@mattermost.com</LoginName>
      <DateTimeUTC>1526335779099</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>combs05@mattermost.com</LoginName>
      <DateTimeUTC>1526335779189</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>joseph@mattermost.com</LoginName>
      <DateTimeUTC>1526335779386</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>kelvinshiu@mattermost.com</LoginName>
      <DateTimeUTC>1526335779471</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lee@mattermost.com</LoginName>
      <DateTimeUTC>1526335779561</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lf.brock@mattermost.com</LoginName>
      <DateTimeUTC>1526335779652</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1526335779740</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>richy@mattermost.com</LoginName>
      <DateTimeUTC>1526335779838</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>will@mattermost.com</LoginName>
      <DateTimeUTC>1526335779927</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>slackimportuser_q4ch3rqcqidu3mhawopm6753wc@localhost</LoginName>
      <DateTimeUTC>1526335780134</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais+5@mattermost.com</LoginName>
      <DateTimeUTC>1528473475822</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>martin+test6@mattermost.com</LoginName>
      <DateTimeUTC>1528720180157</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>michael.gamble@mattermost.com</LoginName>
      <DateTimeUTC>1528736645828</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>mike@mattermost.com</LoginName>
      <DateTimeUTC>1528736928255</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+dkh-teamjoinuser@mattermost.com</LoginName>
      <DateTimeUTC>1529433231351</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais+10@mattermost.com</LoginName>
      <DateTimeUTC>1529948728384</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1531240649360</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+mysql@mattermost.com</LoginName>
      <DateTimeUTC>1534438742905</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>carlos@mattermost.com</LoginName>
      <DateTimeUTC>1535558535345</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1536106109113</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536178183020</DateTimeUTC>
      <Content>@mikenew test</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536178259719</DateTimeUTC>
      <Content>@mikenew test</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536178269185</DateTimeUTC>
      <Content>@mikenew test</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536178357871</DateTimeUTC>
      <Content>@mikenew test</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536178424590</DateTimeUTC>
      <Content>@mikenew email test</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536178525633</DateTimeUTC>
      <Content>@mikenew batch test 1</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536178531557</DateTimeUTC>
      <Content>@mikenew batch test 2</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536180409028</DateTimeUTC>
      <Content>Mike hey whats up</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536180432153</DateTimeUTC>
      <Content>mike hey whats up</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536180912298</DateTimeUTC>
      <Content>posting a message</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181005358</DateTimeUTC>
      <Content>another message</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>alice+1@mattermost.com</LoginName>
      <DateTimeUTC>1536181005358</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>alice+3@mattermost.com</LoginName>
      <DateTimeUTC>1536181005358</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>alice+4@mattermost.com</LoginName>
      <DateTimeUTC>1536181005358</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>alice+5@mattermost.com</LoginName>
      <DateTimeUTC>1536181005358</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>alice+6@mattermost.com</LoginName>
      <DateTimeUTC>1536181005358</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>alice+7@mattermost.com</LoginName>
      <DateTimeUTC>1536181005358</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>alice+8@mattermost.com</LoginName>
      <DateTimeUTC>1536181005358</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1536181005358</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy.blais+10@mattermost.com</LoginName>
      <DateTimeUTC>1536181005358</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy.blais+5@mattermost.com</LoginName>
      <DateTimeUTC>1536181005358</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1536181005358</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>bopeng101@mattermost.com</LoginName>
      <DateTimeUTC>1536181005358</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181005358</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>carlos@mattermost.com</LoginName>
      <DateTimeUTC>1536181005358</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>combs05@mattermost.com</LoginName>
      <DateTimeUTC>1536181005358</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>conrad@mattermost.com</LoginName>
      <DateTimeUTC>1536181005358</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>corey@mattermost.com</LoginName>
      <DateTimeUTC>1536181005358</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dickie@mattermost.com</LoginName>
      <DateTimeUTC>1536181005358</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dmaas@mattermost.com</LoginName>
      <DateTimeUTC>1536181005358</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>doo@mattermost.com</LoginName>
      <DateTimeUTC>1536181005358</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+dkh-teamjoinuser@mattermost.com</LoginName>
      <DateTimeUTC>1536181005358</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>earl@mattermost.com</LoginName>
      <DateTimeUTC>1536181005358</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>gaurav@mattermost.com</LoginName>
      <DateTimeUTC>1536181005358</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>github@example.com</LoginName>
      <DateTimeUTC>1536181005358</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1536181005358</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>joseph@mattermost.com</LoginName>
      <DateTimeUTC>1536181005358</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>kelvinshiu@mattermost.com</LoginName>
      <DateTimeUTC>1536181005358</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lee@mattermost.com</LoginName>
      <DateTimeUTC>1536181005358</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lf.brock@mattermost.com</LoginName>
      <DateTimeUTC>1536181005358</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+mysql@mattermost.com</LoginName>
      <DateTimeUTC>1536181005358</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536181005358</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536181005358</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>martin+test6@mattermost.com</LoginName>
      <DateTimeUTC>1536181005358</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>michael.gamble@mattermost.com</LoginName>
      <DateTimeUTC>1536181005358</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>mike@mattermost.com</LoginName>
      <DateTimeUTC>1536181005358</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>richy@mattermost.com</LoginName>
      <DateTimeUTC>1536181005358</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>saxah.jean@mattermost.com</LoginName>
      <DateTimeUTC>1536181005358</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>slackimportuser_q4ch3rqcqidu3mhawopm6753wc@localhost</LoginName>
      <DateTimeUTC>1536181005358</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>vfxart.ds@mattermost.com</LoginName>
      <DateTimeUTC>1536181005358</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>will@mattermost.com</LoginName>
      <DateTimeUTC>1536181005358</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536181005358</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Group Message">
    <RoomID>group - urbcreqsjfr5zdk4zxksnmhcdy</RoomID>
    <StartTimeUTC>1536245811419</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>jesus+2@mattermost.com</LoginName>
      <DateTimeUTC>1536245761649</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1536245761668</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+4j6oifu37pr5dmdtpp48jmqteesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536245761688</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1536245811419</DateTimeUTC>
      <Content>Test</Content>
    </Message>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1536246392607</DateTimeUTC>
      <Content>@jesus.espino Test2</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1536246392607</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesus+2@mattermost.com</LoginName>
      <DateTimeUTC>1536246392607</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4j6oifu37pr5dmdtpp48jmqteesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536246392607</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536246392607</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Group Message">
    <RoomID>group - by4rzhmsup8spxtppgswhgn1eo</RoomID>
    <StartTimeUTC>1536270070283</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536270052636</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536270052653</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+dojjf4o7ppyrudbewb7z8r98tesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536270052672</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+5k9tstziw7dqpf1em9h6dapuewsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536270052695</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536270070283</DateTimeUTC>
      <Content>Handful&#xA;</Content>
    </Message>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536270143749</DateTimeUTC>
      <Content>Hi @jesse0 </Content>
    </Message>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536270164277</DateTimeUTC>
      <Content>Hi @jesse-alternate</Content>
    </Message>
    <Message>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536270192310</DateTimeUTC>
      <Content>kjhlkjhlkjh</Content>
    </Message>
    <Message>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536270200155</DateTimeUTC>
      <Content>,kjhkjhg</Content>
    </Message>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536270204525</DateTimeUTC>
      <Content>Shehr</Content>
    </Message>
    <Message>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536270337498</DateTimeUTC>
      <Content>khlkjhlkjh</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536270337498</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536270337498</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+5k9tstziw7dqpf1em9h6dapuewsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536270337498</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+dojjf4o7ppyrudbewb7z8r98tesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536270337498</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536270337498</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="toarchive22">
    <RoomID>public - fisfj9ewsi86xnt9ws3nt9hmrc</RoomID>
    <StartTimeUTC>1537642525074</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1537642516896</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1537642525074</DateTimeUTC>
      <Content>another channel to archive test testing</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1537642525074</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1537642525074</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - 9ntx3b48ufgp9e9zf477i5jixy</RoomID>
    <StartTimeUTC>1538675802997</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1538675599841</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindsay+v32@mattermost.com</LoginName>
      <DateTimeUTC>1538675599847</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1538675802997</DateTimeUTC>
      <Content>@lindsay.abcde </Content>
    </Message>
    <ParticipantLeft>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1538675802997</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindsay+v32@mattermost.com</LoginName>
      <DateTimeUTC>1538675802997</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538675802997</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Channel3">
    <RoomID>public - hgnukex9u3fi5ns9jae7ie6e3y</RoomID>
    <StartTimeUTC>1536173455993</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>jonathan.fritz+46@mattermost.com</LoginName>
      <DateTimeUTC>1515428476654</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jonathan.fritz+4.7@mattermost.com</LoginName>
      <DateTimeUTC>1518462802922</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindsay+abc@mattermost.com</LoginName>
      <DateTimeUTC>1525798701087</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindsay+deuwue@mattermost.com</LoginName>
      <DateTimeUTC>1525798710887</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindsay@mattermost.com</LoginName>
      <DateTimeUTC>1536173409478</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1536173414951</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1536173449405</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais+1@mattermost.com</LoginName>
      <DateTimeUTC>1536173464791</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindsay@mattermost.com</LoginName>
      <DateTimeUTC>1536173959668</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1536173455993</DateTimeUTC>
      <Content>post</Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1536174055711</DateTimeUTC>
      <Content>post</Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1536186426408</DateTimeUTC>
      <Content>reply</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>lindsay@mattermost.com</LoginName>
      <DateTimeUTC>1536173503344</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy.blais+1@mattermost.com</LoginName>
      <DateTimeUTC>1536186426408</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1536186426408</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jonathan.fritz+4.7@mattermost.com</LoginName>
      <DateTimeUTC>1536186426408</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jonathan.fritz+46@mattermost.com</LoginName>
      <DateTimeUTC>1536186426408</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1536186426408</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindsay+abc@mattermost.com</LoginName>
      <DateTimeUTC>1536186426408</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindsay+deuwue@mattermost.com</LoginName>
      <DateTimeUTC>1536186426408</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindsay@mattermost.com</LoginName>
      <DateTimeUTC>1536186426408</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536186426408</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="dkh test chan 4 ">
    <RoomID>public - dzxdtreo4pr7fe4hpq73ifdw3e</RoomID>
    <StartTimeUTC>1537846420702</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1537846409390</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1537846420702</DateTimeUTC>
      <Content>Ketchup</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1537846424740</DateTimeUTC>
      <Content>Mayo</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1537846429920</DateTimeUTC>
      <Content>mustard</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1537846429920</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1537846429920</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="newlm">
    <RoomID>public - e4fhwpefa3ffzyhn5348azrfpr</RoomID>
    <StartTimeUTC>1534203146988</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>linda+mysql@mattermost.com</LoginName>
      <DateTimeUTC>1523316416220</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+whatever@mattermost.com</LoginName>
      <DateTimeUTC>1523316427950</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+12jun@mattermost.com</LoginName>
      <DateTimeUTC>1527823763102</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+test.one@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1527823763114</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+email@mattermost.com</LoginName>
      <DateTimeUTC>1527873936318</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+onel@mattermost.com</LoginName>
      <DateTimeUTC>1528863352976</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>linda+mysql@mattermost.com</LoginName>
      <DateTimeUTC>1534203146988</DateTimeUTC>
      <Content>Test</Content>
    </Message>
    <Message>
      <LoginName>linda+mysql@mattermost.com</LoginName>
      <DateTimeUTC>1535577109892</DateTimeUTC>
      <Content>#CASE</Content>
    </Message>
    <Message>
      <LoginName>linda+mysql@mattermost.com</LoginName>
      <DateTimeUTC>1536644055760</DateTimeUTC>
      <Content>@linda-nonadmin </Content>
    </Message>
    <ParticipantLeft>
      <LoginName>linda+12jun@mattermost.com</LoginName>
      <DateTimeUTC>1536644055760</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+email@mattermost.com</LoginName>
      <DateTimeUTC>1536644055760</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+mysql@mattermost.com</LoginName>
      <DateTimeUTC>1536644055760</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+onel@mattermost.com</LoginName>
      <DateTimeUTC>1536644055760</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+whatever@mattermost.com</LoginName>
      <DateTimeUTC>1536644055760</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+test.one@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1536644055760</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536644055760</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Example">
    <RoomID>public - y5mfczbq6bg3deaitgf9r6s1sw</RoomID>
    <StartTimeUTC>1538750725324</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1525788929680</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesse+alternate@mattermost.com</LoginName>
      <DateTimeUTC>1538750718648</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538750725324</DateTimeUTC>
      <Content>test</Content>
    </Message>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538750830005</DateTimeUTC>
      <Content>~doesnotexist</Content>
    </Message>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538750837937</DateTimeUTC>
      <Content>@doesnotexist</Content>
    </Message>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538750943818</DateTimeUTC>
      <Content>test</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>jesse+alternate@mattermost.com</LoginName>
      <DateTimeUTC>1538750943818</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538750943818</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538750943818</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - wgjacprxhfbqzq4x3jheq7ge8w</RoomID>
    <StartTimeUTC>1536181389131</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1536181357434</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181357440</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1536181389131</DateTimeUTC>
      <Content>Test</Content>
    </Message>
    <Message>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1536181389131</DateTimeUTC>
      <Content>Testing</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536182315255</DateTimeUTC>
      <Content>Testing</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536182376478</DateTimeUTC>
      <Content>Reply</Content>
    </Message>
    <Message>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1536182408350</DateTimeUTC>
      <Content>A message</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536182408350</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1536182408350</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536182408350</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Abc">
    <RoomID>public - mrryjids7bf9pfqoi6ny97wrfy</RoomID>
    <StartTimeUTC>1536192969665</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1536181183489</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536192965537</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536192969665</DateTimeUTC>
      <Content>lkjh</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537466895973</DateTimeUTC>
      <Content>test</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537466905182</DateTimeUTC>
      <Content>192.168.1.0</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537466906141</DateTimeUTC>
      <Content>matter</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537467077455</DateTimeUTC>
      <Content>blog</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1537467077455</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537467077455</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1537467077455</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - 5ztyser6dbbtbpxj51znztnd8r</RoomID>
    <StartTimeUTC>1536237682527</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1523292259136</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesus+2@mattermost.com</LoginName>
      <DateTimeUTC>1523292259141</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1536237682527</DateTimeUTC>
      <Content>test</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1536237682527</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesus+2@mattermost.com</LoginName>
      <DateTimeUTC>1536237682527</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536237682527</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="dkh test chan 9">
    <RoomID>public - tibb1qdodibzmnt8fhrixsfw1a</RoomID>
    <StartTimeUTC>1538184287917</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1538184270183</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1538184287917</DateTimeUTC>
      <Content>pickles</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1538184287917</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538184287917</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Town Square">
    <RoomID>public - kn46ebwxg7be58gnx69qfn67ge</RoomID>
    <StartTimeUTC>1538521172841</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>linda+mysql@mattermost.com</LoginName>
      <DateTimeUTC>1522717759788</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+onel8may@mattermost.com</LoginName>
      <DateTimeUTC>1522717777434</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+whatever@mattermost.com</LoginName>
      <DateTimeUTC>1522991163192</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+8may@mattermost.com</LoginName>
      <DateTimeUTC>1523435226536</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+test.one@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1524793029993</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+12jun@mattermost.com</LoginName>
      <DateTimeUTC>1525834803050</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+onel@mattermost.com</LoginName>
      <DateTimeUTC>1525836123853</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+email@mattermost.com</LoginName>
      <DateTimeUTC>1527871931740</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+nonadmin@mattermost.com</LoginName>
      <DateTimeUTC>1527871959529</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+admin@mattermost.com</LoginName>
      <DateTimeUTC>1527888376070</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+9jul@mattermost.com</LoginName>
      <DateTimeUTC>1528851555780</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+changed2@mattermost.com</LoginName>
      <DateTimeUTC>1530853160255</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+7aug@mattermost.com</LoginName>
      <DateTimeUTC>1531181585603</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+nope@mattermost.com</LoginName>
      <DateTimeUTC>1531197503425</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+0000@mattermost.com</LoginName>
      <DateTimeUTC>1533708674890</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+8oct18@mattermost.com</LoginName>
      <DateTimeUTC>1536338619016</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>linda+8oct18@mattermost.com</LoginName>
      <DateTimeUTC>1538521172841</DateTimeUTC>
      <Content>![Mattermost](https://mattermost.com/wp-content/uploads/2022/02/logoHorizontal.png)</Content>
    </Message>
    <Message>
      <LoginName>linda+8oct18@mattermost.com</LoginName>
      <DateTimeUTC>1538521177380</DateTimeUTC>
      <Content>![Mattermost](https://mattermost.com/wp-content/uploads/2022/02/logoHorizontal.png)</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>linda+0000@mattermost.com</LoginName>
      <DateTimeUTC>1538521177380</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+12jun@mattermost.com</LoginName>
      <DateTimeUTC>1538521177380</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+7aug@mattermost.com</LoginName>
      <DateTimeUTC>1538521177380</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+8may@mattermost.com</LoginName>
      <DateTimeUTC>1538521177380</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+8oct18@mattermost.com</LoginName>
      <DateTimeUTC>1538521177380</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+9jul@mattermost.com</LoginName>
      <DateTimeUTC>1538521177380</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+admin@mattermost.com</LoginName>
      <DateTimeUTC>1538521177380</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+changed2@mattermost.com</LoginName>
      <DateTimeUTC>1538521177380</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+email@mattermost.com</LoginName>
      <DateTimeUTC>1538521177380</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+mysql@mattermost.com</LoginName>
      <DateTimeUTC>1538521177380</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+nonadmin@mattermost.com</LoginName>
      <DateTimeUTC>1538521177380</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+nope@mattermost.com</LoginName>
      <DateTimeUTC>1538521177380</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+onel8may@mattermost.com</LoginName>
      <DateTimeUTC>1538521177380</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+onel@mattermost.com</LoginName>
      <DateTimeUTC>1538521177380</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+whatever@mattermost.com</LoginName>
      <DateTimeUTC>1538521177380</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+test.one@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538521177380</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538521177380</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Off-Topic">
    <RoomID>public - wmg1ueqhbjnwjebqxxf61f5jbw</RoomID>
    <StartTimeUTC>1538750489288</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>joram+8@mattermost.com</LoginName>
      <DateTimeUTC>1538750409291</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>joram+8@mattermost.com</LoginName>
      <DateTimeUTC>1538751335019</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>joram@mattermost.com</LoginName>
      <DateTimeUTC>1538750489288</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>joram@mattermost.com</LoginName>
      <DateTimeUTC>1538750489288</DateTimeUTC>
      <Content>yo</Content>
    </Message>
    <Message>
      <LoginName>joram@mattermost.com</LoginName>
      <DateTimeUTC>1538750492738</DateTimeUTC>
      <Content>@joram8 </Content>
    </Message>
    <Message>
      <LoginName>joram@mattermost.com</LoginName>
      <DateTimeUTC>1538750498900</DateTimeUTC>
      <Content>@joram8 </Content>
    </Message>
    <Message>
      <LoginName>joram+8@mattermost.com</LoginName>
      <DateTimeUTC>1538750632037</DateTimeUTC>
      <Content>@joram </Content>
    </Message>
    <Message>
      <LoginName>joram+8@mattermost.com</LoginName>
      <DateTimeUTC>1538750634445</DateTimeUTC>
      <Content>dsgsdg</Content>
    </Message>
    <Message>
      <LoginName>joram+8@mattermost.com</LoginName>
      <DateTimeUTC>1538750654941</DateTimeUTC>
      <Content>joram</Content>
    </Message>
    <Message>
      <LoginName>joram+8@mattermost.com</LoginName>
      <DateTimeUTC>1538750656974</DateTimeUTC>
      <Content>@joram </Content>
    </Message>
    <Message>
      <LoginName>joram@mattermost.com</LoginName>
      <DateTimeUTC>1538751074385</DateTimeUTC>
      <Content>@ALL </Content>
    </Message>
    <Message>
      <LoginName>joram@mattermost.com</LoginName>
      <DateTimeUTC>1538751087281</DateTimeUTC>
      <Content>@Here </Content>
    </Message>
    <Message>
      <LoginName>joram@mattermost.com</LoginName>
      <DateTimeUTC>1538751094178</DateTimeUTC>
      <Content>@channEl </Content>
    </Message>
    <Message>
      <LoginName>joram@mattermost.com</LoginName>
      <DateTimeUTC>1538751265387</DateTimeUTC>
      <Content>@joram8 </Content>
    </Message>
    <Message>
      <LoginName>joram+8@mattermost.com</LoginName>
      <DateTimeUTC>1538751345803</DateTimeUTC>
      <Content>@joram</Content>
    </Message>
    <Message>
      <LoginName>joram+8@mattermost.com</LoginName>
      <DateTimeUTC>1538751673848</DateTimeUTC>
      <Content>@all </Content>
    </Message>
    <ParticipantLeft>
      <LoginName>joram+8@mattermost.com</LoginName>
      <DateTimeUTC>1538750955749</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>joram+8@mattermost.com</LoginName>
      <DateTimeUTC>1538751673848</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>joram@mattermost.com</LoginName>
      <DateTimeUTC>1538751673848</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538751673848</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Town Square">
    <RoomID>public - si9kxe8y9tyqxdbfwx9oxhjmnh</RoomID>
    <StartTimeUTC>1534356108091</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>george+452@mattermost.com</LoginName>
      <DateTimeUTC>1512824739439</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jonathan.fritz+test1@mattermost.com</LoginName>
      <DateTimeUTC>1513026916349</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>asaad+9@mattermost.com</LoginName>
      <DateTimeUTC>1513043562057</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jason+3@mattermost.com</LoginName>
      <DateTimeUTC>1515193388832</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>george+46@mattermost.com</LoginName>
      <DateTimeUTC>1515411551460</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1518094255976</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1518097348517</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jason+12344321@mattermost.com</LoginName>
      <DateTimeUTC>1518120516458</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jason+1234554321@mattermost.com</LoginName>
      <DateTimeUTC>1518120621376</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+ldap@mattermost.com</LoginName>
      <DateTimeUTC>1518133783492</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>test1@mattermost.com</LoginName>
      <DateTimeUTC>1518200316465</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>martin+test5@mattermost.com</LoginName>
      <DateTimeUTC>1518200399468</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1518200601394</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>joram+1@mattermost.com</LoginName>
      <DateTimeUTC>1518212463009</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>george+48@mattermost.com</LoginName>
      <DateTimeUTC>1521036347468</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+b6i58un7e38npfd35a7p9edrfy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694878999</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+zgtdea7p6fnwpx7hx8ofmr55ir@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694879471</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+eiizcc9rp78i3xpkz5abcskptr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694879931</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+e1ese484dfgubpac6as16rafhw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694880528</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+4wq5skd9ofdojqsoyuunjt7mdr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694880950</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+tqak3npdbid4mc5hzxtqh73wrw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694881443</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+t8iqgaa9t38azqr6ms3w7rqtbr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694882355</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+69tbkw5e8tg9t8a4abijz8rmta@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694882911</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+5zydt4yhufn47cod5j8nkiqp3c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694883410</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+4jm7qnp43id3xgwa4in8ow3aoe@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694883952</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+dbhzok7drbniddzrqrnw5i6tnc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694884400</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+sfj95m6zd3gymfw4ko7ycyee1o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694884875</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+zjx8d3qoyirejjn48y4ykogz8a@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694885331</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+dgnneanah3nmjru7zow5zaxg1c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694885740</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+yhjzab185bbyxdbrds4yes4kro@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694886262</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+curk9ueyciyj7fexjukby64yhh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694886673</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+pkfxjzjibtbbxq53fekx48kagr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694887115</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+c5sebzedspbkzy7who8qb3gf1o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694887708</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+whq7cqdy9bd3fbdw7uurte6g7e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694888182</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+3asf6egnip8hjdk7b369pk5qyo@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694888684</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+g9fmc35jg78y3e6q1uf7awkdba@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694889271</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+6iypex6jat8xietgkkf1htx4fy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694889828</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+oxni5dwrwpft8psedt4hphcg3e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694890289</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+gb6rpcr5ntygxgcr1rep37qfay@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694890803</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+unbu9hxq53r7dys33pmwqu1amy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694891306</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+7thynb6zjb8kmnngu3nr4rsaee@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694891796</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+m5uquhcwupbjicjp87emirjh1c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694892203</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+ixmah9qsi3ge7xmsrnhu9z9o5e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694892693</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+dx45haz8kjrxmnahhcpmyo6whe@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694893126</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+c6djwgwtu38yjb1tjho35mpjio@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694893577</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+r9rm3cyoetfm5mojgwojybdado@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694894016</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+ungcjtnm7p8yixjra6uk1iq9ah@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694894520</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+1t7ffrnektgu7jyhcp17oubn1a@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694894552</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+xskoj8s9h3gyz8rxqykhxsu7hh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694895050</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+c1im4r19b7buxen1b8b8hb1jbh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694895063</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+x9mst3xmuif8be7mk1xi97957h@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694895698</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+noehgawh5jyc5xt3ywofqxtd6y@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694895718</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+o35cxhtoxbgcmxzgg9bsnf1t5r@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694896201</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+k95y7gjpa3gk3yf1gpqdtqwa1w@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694896232</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+1zz5akufobye5gcapsifs3nk4e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694896738</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+y16rmsr5rff5bcu8zu487p4kxo@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694896741</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+neiao6h57386bxbwp3ejy6xcoc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694897256</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+ztby31z8yjbefx9y6uqq3ocuur@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694897288</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+xmhksuze7i867pc8zmg5mipx3e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694897822</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+j1e4zpx3qtfumpdpd1yz7ewana@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694897843</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+ycmjsht84ifa9rku6xe438e63a@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694898335</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+bbzua1yrpjby885861k44okm8o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694898367</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+xadj5xeur7gi9gn3eg7k3rw67w@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694898839</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+bj7ker7ntprwfqjbrz5eoe7a3o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694898874</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+95x4ca7zniddjnt4tew1aqnt4h@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694899430</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+14xec4mrrjdubqohzjfh1toq1h@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694899462</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+yea5jwj4ctbn8g3exgd8xd8zjh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694899945</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+6og1wweckbg83n1nm8ba8b5arw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694899979</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+hojeqb3bgige8bffbxno5985sw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694900576</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+b64o5iqs7jg99gyobms3g3cu7c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694900579</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+yr7ji7x9mpnn8pt8a391et1z5r@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694901148</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+68j8ejpx93biuk8i1euwbh6n9y@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694901177</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+r1m7zkdcq78rim3j9jugw4iuwa@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694901698</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+w4sxwn38si8xtkqurquqaywanh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694901727</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+qdnqsw8kbtfxpgpq3z6c81iaic@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694902121</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+5tso7cskft8qzdmop6cqaq5azo@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694902277</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+6kzhg7e8h7ga8qe847s8qwf46c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694902791</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+7ptjcezuoiym9bwb45cerk55qh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694902826</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+iqp9g319hfbjuyparipudcwmfe@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694903352</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+t91oxeg38jbipei1a4wchx3f1o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694903383</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+rou7y755ttbcug1e8xwanaqwor@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694903969</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+bjegnnb4y7fbzcgpjbdz7j9jio@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694903981</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+p8qfkx9zopg88eqmz6p95th3ur@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694904554</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+j3zm7zczhpdi8q4sb3uapeik5a@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694904586</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+j94x31y5dpf6dp633n1qmzmh9c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694904970</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+ty1aggby5bystjbjaypdw9n7be@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694905430</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+4ihuad1p6fghbeykkcxzqeg7wa@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694905915</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+rz4kohuu7bgqxdyybx1qohgu4r@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694906578</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+zr6renr5ijgm9jmwfx9jfffbcr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694906962</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+astuy8b8yp8j5qkferxdo537wr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694907376</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+xp16is97spr3tqdscd4icqos6o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694907815</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+gzyiupo4zfyf8jbxjx4fww4gpy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694908291</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+w1sabjfu57rexxynjux7bahazc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694908748</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+m6qk51nui7g53fwhfmmo3ihfsr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694909184</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+a1616cw883yg7ctgqgfwk4obuh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694909628</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+cihr5a3j8indtd8dwrf9s735fh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694910110</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+7j6msnn5jid8dpz186uhzfgsee@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694910693</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+qd5fu7ixmirsxbjpuk5wdmtz1w@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694911144</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+qsf3hma14jdcmnp4csrubmxzrc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694911597</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+g9crhsfwhty98k7e6wdci8bwbw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694912140</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+cmxeex7ytbyepy8or35xwkdebc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694912585</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+843f9qbjhtgfdfsmeuc17euxmc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694913124</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+u886uag7cjgtbjru13cttxd5fw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694913501</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+auecjinokfy69ebm9dots3ejea@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694914062</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+44ajec86hbniur3kbut1tjxt6c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694914482</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+9co11fc1efyaurkzo88tx73ife@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694914966</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+8yhu71kipt893qwndhwe7nmsua@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694915390</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+soogdrkrx3rp7rccy9e5nnwq4o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694915763</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+dy56gamzetff8b5d1dssqq781h@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694916324</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+etew4mkajjgeinjxxzyrrsgxnc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694916776</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+31tcmp8qsbnbfxw99o76z4hp4y@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694917290</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+dd5cjzy99fnxfpd7gn67cnrkoa@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694917820</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+oggf6j1zjjbijrgh1dqtc6dwiy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694918281</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+tdrqco68xbr5xrwzte1nk3khmr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694918696</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+99paszs3w7nn8kyijwkmmzthdy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694919111</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+8gquaj4cijr38qiygaezcfxc7e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694919593</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+ubpszg8rjinkuqgjba4ikkr19c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694919980</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+zy8w4zwnjby55e9mmn56hc1wio@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694920495</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+d7y1dmxpc3ypjyaxh918cu1t3y@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694920934</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+rauudt7xtpgh8jx9z3y3sh44dh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694921305</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+ustc3hzbpj8x8c7arjm14m6tqa@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694921846</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+3p9ocj8h8fysfq75t6cktckobo@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694922339</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+wqir77z8wfrpjg7e533mntes4o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694922724</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+n3icdmsontredyyekgs336fk6e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694923200</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+nrnzrzu9cfdwujtz19f8amwyjc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694923663</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+5ztwom83e7bu98pqi5fs4jxexo@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694924092</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+h1hm9z5ccpyrmmrgnaaitex35e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694924516</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+kxwneaxtz7gpinigcqc9ja1bwc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694924956</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+6uyqtm11bbnguqssyuqdxxuuec@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694925386</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+7eq1ryf7u38ufqcozwb7o4u8zy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694925889</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+scrsatmi8pnk7jsbu56b9xg4qw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694926402</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+6exwexedcfb9dr1ykswffinuua@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694926792</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+i98stoyedbdh5dzws6fmwmjsxh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694927169</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+5mqnbdy4ifdajkx5hem9sgjbqe@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694927590</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+4tzo6dd1a7bnbdn8j15j4fdb6y@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694928018</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+sb64tapbjffobeutdrxgnwwjgw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694928525</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+4tcy19r5hidrbpqg4uhoyyw4dh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694929040</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+nrah6qsfj7fu9jfik9a4uww79a@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694929455</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+5fcbis73z7b6fydazancgys3gc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694929917</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+1tnb7sngkif85d8ur3usccipqw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694930342</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+9jkomtxhepgepe73kj817hyrue@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694930803</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+eruami83wjywxrqq354wz7gcxy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694931213</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+8ba3887n17gxp8tye6ywjsub1w@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694931594</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+f1n9qnef7f8g3xd9688xg5c8ry@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694932014</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+wb6c394ihtyxmq3f9t1c1piojc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694932404</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+zzgfhhfoz7grfjuhhxyuw6hach@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694932779</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+wmggrb4ziig3zkznifayfucgza@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694933197</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+jodoephek7d8d88ac6u6eh9c3r@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694933661</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+ycyb8stnw3gjzfncniy4mtyx9c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694934042</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+a957ee6w5f86up5jchsygc6zuc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694934473</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+4cht4adn6pr9xqazcybuheoqkw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694934935</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+mnnooxykrpgqix1tqzxz87cmuh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694935332</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+p7fzz7d77pnr7cfcgrh9z8rchr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694935764</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+ony1dxoyap8yik1u6crgk5g7dr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694936229</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+6t6nhamjt3gb9eb1k58ihsey5e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694936651</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+o6u4o6ehnbgt7nppgwe3rix8ih@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694937090</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+3cpcg5nr7i8dbfomhoigpd1i6a@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694937538</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+tiph1dysipy1pddtpa53tt66bo@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694937975</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+5dkcraoo7tdn8kxz8cgx8p4dhr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694938408</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+oew8d6cqo78n5kcgfe3gh4sqic@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694938810</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+emfsb6pmrfbrmmu1tbsa5zwxfc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694939266</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+n8pyg37fefd6imgh4cy7786uce@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694939710</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+oaep1nr6rjnqpgf5s1a7a8nggh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694940176</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+n393dtrsn3rejqwgqcg7bwamkc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694940639</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+k793mwzrmbgc5rwduyt8q1awqo@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694941108</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+7hmez5xzrfy1u8oze83apk33ta@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694941692</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+jyyg8hijfjdu7yk5igqojme93a@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694942498</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+thu1zebw3in6z8bnc9sz5jr6kr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694942920</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+6zeoxzjmeb85dykd1f59jjobrc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694943365</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+4uuejz7ctbbgug4mdt13j51g9o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694943885</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+t7ndac4u6tr6zyfwsgk1q7f9by@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694944349</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+g45bnj98jtbq8jjkupiupac9xc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694944800</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+4c5pigczht8iuraieqma3fk88c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694945219</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+igakdne9hprfj8xphufgkoro3o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694945792</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+sjezud6smtbdb8jooe98sgwx6w@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694946197</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+mozz86d87ir6bpor9513guwz8w@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694946718</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+csgyn99rmjga9x57xcutsjih1h@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694947167</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+5nc5o6f8sfbm8deswkjfpnrady@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694947643</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+obgkpz7ubtrq7mcx7fsr45xwaw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694948051</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+csbrztnqi7rgbneucxn64c33sr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694948581</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+haufqfcyepntfqy7dxd9b473do@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694949023</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+g39d4dfrwjr48cm686d51wc1ge@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694949516</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+gzenif5xd7gcb8runh1tjpwh6c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694950012</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+fi9pwo6nejdp7nma3picmopumc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694950433</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+sc75jebrd7f3tr8xxouknzbpdy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694950831</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+4bc6i6cfk38fbxircttympnskw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694951278</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+d9kpp6jdi7yb98utpexq6718sa@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694951865</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+sfjjdebowbgk5ddrueiopckmtw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694952299</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+pnb6a7ozpbr69dpfzwaa88bcpr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694952751</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+enzo7zyuyjf5prhp11fpcfc81e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694953221</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+xj3fc6pou7gp5dkxudr6593qrw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694953648</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+kyma43yr63gazcfkyh6qztwfse@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694954136</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+8fymowq3o7819dgse6s9ffoy9o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694954610</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+4188xiuyjigdpgk7mftsaw1pbe@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694955065</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+jr4x57ogj3re383o7ntek9atse@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694955556</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+itwwdkwhxpyriq4c7u3wz15hnc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694955973</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+bj6d54o1c78i585zqkxuyzsg9a@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694956497</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+nx8ce9eq4tdsubnyyunrmaoq4e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694956991</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+qsa6ufn1p38bjjzr1qcgjijfsa@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694957519</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+cw6awotpz7f4t8jrsm5c46uzpc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694957941</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+o6qsksztb3ncfbabiadfan57jc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694958373</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+1wrt878j1tnf8kedbti6pjkw3o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694958798</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+89sho1c8gjfqfrcoff7ypm31me@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694959212</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+6ctxdiw6zpnb8m5id3t8mrg8ka@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694959637</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+bj3d5rkgf7bopnb6guakt4nr3h@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694960053</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+afds3o7zf3f5me41hgmxy858bw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694960573</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+aiof7q67siyf3e5imc7amj75cr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694961024</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+qm966it8mtrodjqxo6jodxkspa@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694961546</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+fd56e6gt5jyzuraib9o769opgr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694962006</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+bnxdj99okf8jjxb6o3ncskqytr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694962709</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+oxy1zb1877d6tq6q4r4anfjtky@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694963211</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+ck1sgrgns7rq9kpr7hmsyh75by@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694963660</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+tjxzau9axtn43pjab6rko8ezme@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694964119</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+q9pryt97ztrstemt6aidkus3se@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694964521</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+78mfzgemebdjtdgedmfj6yxjih@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1525694965006</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1525890360803</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>asaad+1@mattermost.com</LoginName>
      <DateTimeUTC>1525890679890</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+mysql@mattermost.com</LoginName>
      <DateTimeUTC>1526073357416</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+onel@mattermost.com</LoginName>
      <DateTimeUTC>1526074001548</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+sysad1jun@mattermost.com</LoginName>
      <DateTimeUTC>1527898352773</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1528374970090</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1528378179233</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1528411083258</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais+6@mattermost.com</LoginName>
      <DateTimeUTC>1528808015890</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1528937760421</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+dkh-teamjoinuser@mattermost.com</LoginName>
      <DateTimeUTC>1529433449715</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>george+rn@mattermost.com</LoginName>
      <DateTimeUTC>1530094835854</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>george+51@mattermost.com</LoginName>
      <DateTimeUTC>1530783151478</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1530789066669</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1530862612360</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>harrison+bw@mattermost.com</LoginName>
      <DateTimeUTC>1530886149540</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+4j6oifu37pr5dmdtpp48jmqteesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1531849429024</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1532451190836</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais+1@mattermost.com</LoginName>
      <DateTimeUTC>1532451254764</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jason+2111@mattermost.com</LoginName>
      <DateTimeUTC>1533677384278</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>asaad+1@mattermost.com</LoginName>
      <DateTimeUTC>1533716934578</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>asaad+1@mattermost.com</LoginName>
      <DateTimeUTC>1533717355236</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jason+2113@mattermost.com</LoginName>
      <DateTimeUTC>1533750264397</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+dkhlogintest@mattermost.com</LoginName>
      <DateTimeUTC>1533854422969</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+edgetest@mattermost.com</LoginName>
      <DateTimeUTC>1533876165975</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1536181273356</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1536182326872</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1536574489003</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1534356108091</DateTimeUTC>
      <Content>:shaky:</Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1534544830677</DateTimeUTC>
      <Content>@amy2 </Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1534545201060</DateTimeUTC>
      <Content>@amy2 </Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1534855987509</DateTimeUTC>
      <Content>:bug:</Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1536100090847</DateTimeUTC>
      <Content>m&#xA;m&#xA;m</Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1536100094108</DateTimeUTC>
      <Content>m&#xA;m</Content>
    </Message>
    <Message>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536164197402</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536164197402</DateTimeUTC>
      <UserFileName>1176px-Vector-based_example.svg.png</UserFileName>
      <FileName>20180905/teams/noteam/channels/si9kxe8y9tyqxdbfwx9oxhjmnh/users/r5posm7wt7y7jp1eo4zfoomfjc/buwm3h6mdbfp7d1o673zsjkdaa/1176px-Vector-based_example.svg.png</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536164197402</DateTimeUTC>
      <UserFileName>1176px-Vector-based_example.svg.png</UserFileName>
      <FileName>20180905/teams/noteam/channels/si9kxe8y9tyqxdbfwx9oxhjmnh/users/r5posm7wt7y7jp1eo4zfoomfjc/buwm3h6mdbfp7d1o673zsjkdaa/1176px-Vector-based_example.svg.png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536164953740</DateTimeUTC>
      <Content>https://www.traveller.com.au/content/dam/images/g/u/n/q/h/0/image.related.articleLeadwide.620x349.gunpvd.png/1488330286332.png</Content>
    </Message>
    <Message>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536166786648</DateTimeUTC>
      <Content>https://www.traveller.com.au/content/dam/images/g/u/n/q/h/0/image.related.articleLeadwide.620x349.gunpvd.png/1488330286332.png</Content>
    </Message>
    <Message>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536166894846</DateTimeUTC>
      <Content>https://www.traveller.com.au/content/dam/images/g/u/n/q/h/0/image.related.articleLeadwide.620x349.gunpvd.png/1488330286332.png</Content>
    </Message>
    <Message>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536167176377</DateTimeUTC>
      <Content>https://bit.ly/2NlYsOr</Content>
    </Message>
    <Message>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536167184075</DateTimeUTC>
      <Content>https://bit.ly/2wqEbjw</Content>
    </Message>
    <Message>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536168700860</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536168700860</DateTimeUTC>
      <UserFileName>1176px-Vector-based_example.svg (1).png</UserFileName>
      <FileName>20180905/teams/noteam/channels/si9kxe8y9tyqxdbfwx9oxhjmnh/users/r5posm7wt7y7jp1eo4zfoomfjc/tkg74jdubt8w5xcntmo4gzbeay/1176px-Vector-based_example.svg (1).png</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536168700860</DateTimeUTC>
      <UserFileName>1176px-Vector-based_example.svg.png</UserFileName>
      <FileName>20180905/teams/noteam/channels/si9kxe8y9tyqxdbfwx9oxhjmnh/users/r5posm7wt7y7jp1eo4zfoomfjc/pbjbjw1qa3bjd8bsgfy8renx4r/1176px-Vector-based_example.svg.png</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536168700860</DateTimeUTC>
      <UserFileName>localhost_8065_ (7).png</UserFileName>
      <FileName>20180905/teams/noteam/channels/si9kxe8y9tyqxdbfwx9oxhjmnh/users/r5posm7wt7y7jp1eo4zfoomfjc/69pow13ffjft7yicsmms7bofzw/localhost_8065_ (7).png</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536168700860</DateTimeUTC>
      <UserFileName>1176px-Vector-based_example.svg (1).png</UserFileName>
      <FileName>20180905/teams/noteam/channels/si9kxe8y9tyqxdbfwx9oxhjmnh/users/r5posm7wt7y7jp1eo4zfoomfjc/tkg74jdubt8w5xcntmo4gzbeay/1176px-Vector-based_example.svg (1).png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536168700860</DateTimeUTC>
      <UserFileName>1176px-Vector-based_example.svg.png</UserFileName>
      <FileName>20180905/teams/noteam/channels/si9kxe8y9tyqxdbfwx9oxhjmnh/users/r5posm7wt7y7jp1eo4zfoomfjc/pbjbjw1qa3bjd8bsgfy8renx4r/1176px-Vector-based_example.svg.png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536168700860</DateTimeUTC>
      <UserFileName>localhost_8065_ (7).png</UserFileName>
      <FileName>20180905/teams/noteam/channels/si9kxe8y9tyqxdbfwx9oxhjmnh/users/r5posm7wt7y7jp1eo4zfoomfjc/69pow13ffjft7yicsmms7bofzw/localhost_8065_ (7).png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536168846889</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536168846889</DateTimeUTC>
      <UserFileName>localhost_8065_ (4).png</UserFileName>
      <FileName>20180905/teams/noteam/channels/si9kxe8y9tyqxdbfwx9oxhjmnh/users/r5posm7wt7y7jp1eo4zfoomfjc/r665g7zrkidymk5g1u69xbnbrw/localhost_8065_ (4).png</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536168846889</DateTimeUTC>
      <UserFileName>localhost_8065_ (4).png</UserFileName>
      <FileName>20180905/teams/noteam/channels/si9kxe8y9tyqxdbfwx9oxhjmnh/users/r5posm7wt7y7jp1eo4zfoomfjc/b3pzoa7tp78xumwg17kao18par/localhost_8065_ (4).png</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536168846889</DateTimeUTC>
      <UserFileName>localhost_8065_ (4).png</UserFileName>
      <FileName>20180905/teams/noteam/channels/si9kxe8y9tyqxdbfwx9oxhjmnh/users/r5posm7wt7y7jp1eo4zfoomfjc/f3ps5ugjf3rq8kceatm6dsdocc/localhost_8065_ (4).png</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536168846889</DateTimeUTC>
      <UserFileName>localhost_8065_ (4).png</UserFileName>
      <FileName>20180905/teams/noteam/channels/si9kxe8y9tyqxdbfwx9oxhjmnh/users/r5posm7wt7y7jp1eo4zfoomfjc/43efq4s9i3f4dqg5tmigmw9bme/localhost_8065_ (4).png</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536168846889</DateTimeUTC>
      <UserFileName>localhost_8065_ (4).png</UserFileName>
      <FileName>20180905/teams/noteam/channels/si9kxe8y9tyqxdbfwx9oxhjmnh/users/r5posm7wt7y7jp1eo4zfoomfjc/qpm767b31pfy7ed5onzdqmb5pe/localhost_8065_ (4).png</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536168846889</DateTimeUTC>
      <UserFileName>localhost_8065_ (4).png</UserFileName>
      <FileName>20180905/teams/noteam/channels/si9kxe8y9tyqxdbfwx9oxhjmnh/users/r5posm7wt7y7jp1eo4zfoomfjc/r665g7zrkidymk5g1u69xbnbrw/localhost_8065_ (4).png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536168846889</DateTimeUTC>
      <UserFileName>localhost_8065_ (4).png</UserFileName>
      <FileName>20180905/teams/noteam/channels/si9kxe8y9tyqxdbfwx9oxhjmnh/users/r5posm7wt7y7jp1eo4zfoomfjc/b3pzoa7tp78xumwg17kao18par/localhost_8065_ (4).png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536168846889</DateTimeUTC>
      <UserFileName>localhost_8065_ (4).png</UserFileName>
      <FileName>20180905/teams/noteam/channels/si9kxe8y9tyqxdbfwx9oxhjmnh/users/r5posm7wt7y7jp1eo4zfoomfjc/f3ps5ugjf3rq8kceatm6dsdocc/localhost_8065_ (4).png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536168846889</DateTimeUTC>
      <UserFileName>localhost_8065_ (4).png</UserFileName>
      <FileName>20180905/teams/noteam/channels/si9kxe8y9tyqxdbfwx9oxhjmnh/users/r5posm7wt7y7jp1eo4zfoomfjc/43efq4s9i3f4dqg5tmigmw9bme/localhost_8065_ (4).png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536168846889</DateTimeUTC>
      <UserFileName>localhost_8065_ (4).png</UserFileName>
      <FileName>20180905/teams/noteam/channels/si9kxe8y9tyqxdbfwx9oxhjmnh/users/r5posm7wt7y7jp1eo4zfoomfjc/qpm767b31pfy7ed5onzdqmb5pe/localhost_8065_ (4).png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536170734769</DateTimeUTC>
      <Content># Search Testing&#xA;&#xA;### Basic Search Testing&#xA;&#xA;This post is used by the core team to test search. It should be returned for the test cases for search, with proper highlighting in the search results. &#xA;&#xA;**Basic word search:** Hello world!  &#xA;**Emoji search:** :strawberry:  &#xA;**Accent search:** Crème fraîche  &#xA;**Non-latin search:**  &#xA;您好吗  &#xA;您好  &#xA;**Email search:** person@domain.org  &#xA;**Link search:** www.dropbox.com  &#xA;**Markdown search:**  &#xA;##### Hello  &#xA;```  &#xA;Hello  &#xA;```  &#xA;`Hello`  &#xA;&#xA;&#xA;### Hashtags:&#xA;&#xA;Click on the linked hashtags below, and confirm that the search results match the linked hashtags. Confirm that the highlighting in the search results is correct. &#xA;&#xA;#### Basic Hashtags&#xA;&#xA;#hello #world&#xA;&#xA;#### Hashtags containing punctuation:&#xA;&#xA;*Note: Make a separate post containing only the word “hashtag”, and confirm the hashtags below do not return the separate post.*&#xA;&#xA;#hashtag #hashtag-dash #hashtag_underscore #hashtag.dot&#xA;&#xA;#### Punctuation following a hashtag:&#xA;&#xA;#colon: #slash/ #backslash\ #percent% #dollar$ #semicolon; #ampersand&amp;  #bracket( #bracket) #lessthan&lt; #greaterthan&gt; #dash- #plus+ #equals=  #caret^ #hashtag# #asterisk* #verticalbar| #invertedquestion¿ #atsign@ #quote” #apostrophe&#39; #curlybracket{ #curlybracket} #squarebracket[ #squarebracket] &#xA;&#xA;#### Markdown surrounding a hashtag:&#xA;&#xA;*#markdown* **#markdown** ~~#markdown~~&#xA;##### #markdown&#xA;&#xA;#### Accents and non-Latin characters in a hashtag:&#xA;&#xA;#crèmeglacée #테스트&#xA;</Content>
    </Message>
    <Message>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536171801228</DateTimeUTC>
      <Content>apple banana</Content>
    </Message>
    <Message>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536171828256</DateTimeUTC>
      <Content>asparagus</Content>
    </Message>
    <Message>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536171846999</DateTimeUTC>
      <Content>Replying to asparagus.</Content>
    </Message>
    <Message>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1536181770950</DateTimeUTC>
      <Content>a message</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181857067</DateTimeUTC>
      <Content>@paul </Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181867985</DateTimeUTC>
      <Content>@paul </Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536182024255</DateTimeUTC>
      <Content>test</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536182028320</DateTimeUTC>
      <Content>@paul </Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536182043122</DateTimeUTC>
      <Content>message</Content>
    </Message>
    <Message>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1536260360216</DateTimeUTC>
      <Content>Bananas!</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536260454599</DateTimeUTC>
      <Content>love em</Content>
    </Message>
    <Message>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1536262872819</DateTimeUTC>
      <Content>testing</Content>
    </Message>
    <Message>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1536262878995</DateTimeUTC>
      <Content>haha</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536278927009</DateTimeUTC>
      <Content>fsdgsdgsdgfdsgd</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1536574499071</DateTimeUTC>
      <Content>1</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1536574501821</DateTimeUTC>
      <Content>2</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1536574505160</DateTimeUTC>
      <Content>2</Content>
    </Message>
    <Message>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1536575035940</DateTimeUTC>
      <Content>1</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1536575284421</DateTimeUTC>
      <Content>testing</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1536575289390</DateTimeUTC>
      <Content>hello</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1536575295593</DateTimeUTC>
      <Content>testing count</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1536575327551</DateTimeUTC>
      <Content>haha</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538003820451</DateTimeUTC>
      <Content>Dja</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538657243582</DateTimeUTC>
      <Content>Test reply</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538657243582</DateTimeUTC>
      <UserFileName>Screen Shot 2018-10-03 at 10.51.57 PM.png</UserFileName>
      <FileName>20181004/teams/noteam/channels/si9kxe8y9tyqxdbfwx9oxhjmnh/users/jrcr9qg89f868qidmrk7yspkiw/ssz74sygq7bfuybby6nxuuiazc/Screen Shot 2018-10-03 at 10.51.57 PM.png</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538657243582</DateTimeUTC>
      <UserFileName>Screen Shot 2018-10-03 at 10.51.57 PM.png</UserFileName>
      <FileName>20181004/teams/noteam/channels/si9kxe8y9tyqxdbfwx9oxhjmnh/users/jrcr9qg89f868qidmrk7yspkiw/ssz74sygq7bfuybby6nxuuiazc/Screen Shot 2018-10-03 at 10.51.57 PM.png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538660533775</DateTimeUTC>
      <Content>~~:file_folder:~~&#xA;</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538660533775</DateTimeUTC>
      <Content>:file_folder: </Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538688239300</DateTimeUTC>
      <Content>hey</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538688511625</DateTimeUTC>
      <Content>https://small.chat/</Content>
    </Message>
    <Message>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538766104824</DateTimeUTC>
      <Content>a message</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538766178355</DateTimeUTC>
      <Content>a message</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538767236834</DateTimeUTC>
      <Content>@doesnotex</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538767244520</DateTimeUTC>
      <Content>@doesnotexist</Content>
    </Message>
    <Message>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1538767764434</DateTimeUTC>
      <Content>asdf</Content>
    </Message>
    <Message>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538770408001</DateTimeUTC>
      <Content>```&#xA;Neat this is a code block.&#xA;&#xA;```</Content>
    </Message>
    <Message>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538770416815</DateTimeUTC>
      <Content>This is a sweet feature</Content>
    </Message>
    <Message>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538771276675</DateTimeUTC>
      <Content>The progress bar didn&#39;t show up for this post.</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538771276675</DateTimeUTC>
      <UserFileName>mattermost-4.4.0-linux-amd64.tar.gz</UserFileName>
      <FileName>20181005/teams/noteam/channels/si9kxe8y9tyqxdbfwx9oxhjmnh/users/8itpscu7itb59y5trr37quikyo/axuuozksaibo5jnshs4dxepbjr/mattermost-4.4.0-linux-amd64.tar.gz</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538771276675</DateTimeUTC>
      <UserFileName>mattermost-4.4.0-linux-amd64.tar.gz</UserFileName>
      <FileName>20181005/teams/noteam/channels/si9kxe8y9tyqxdbfwx9oxhjmnh/users/8itpscu7itb59y5trr37quikyo/axuuozksaibo5jnshs4dxepbjr/mattermost-4.4.0-linux-amd64.tar.gz</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538772384414</DateTimeUTC>
      <Content>Message</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538772384414</DateTimeUTC>
      <UserFileName>Screen Shot 2018-06-13 at 11.39.34 PM.png</UserFileName>
      <FileName>20181005/teams/noteam/channels/si9kxe8y9tyqxdbfwx9oxhjmnh/users/8itpscu7itb59y5trr37quikyo/zf7qddbsk785ijpufeao1af9qw/Screen Shot 2018-06-13 at 11.39.34 PM.png</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538772384414</DateTimeUTC>
      <UserFileName>Screen Shot 2018-10-01 at 2.37.27 PM.png</UserFileName>
      <FileName>20181005/teams/noteam/channels/si9kxe8y9tyqxdbfwx9oxhjmnh/users/8itpscu7itb59y5trr37quikyo/u66nyhptgtyodk63ff4gbdinme/Screen Shot 2018-10-01 at 2.37.27 PM.png</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538772384414</DateTimeUTC>
      <UserFileName>Screen Shot 2018-09-25 at 4.00.35 PM.png</UserFileName>
      <FileName>20181005/teams/noteam/channels/si9kxe8y9tyqxdbfwx9oxhjmnh/users/8itpscu7itb59y5trr37quikyo/8m6be9p3jbb7zer4bae49heywh/Screen Shot 2018-09-25 at 4.00.35 PM.png</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538772384414</DateTimeUTC>
      <UserFileName>Screen Shot 2018-06-18 at 5.56.43 PM.png</UserFileName>
      <FileName>20181005/teams/noteam/channels/si9kxe8y9tyqxdbfwx9oxhjmnh/users/8itpscu7itb59y5trr37quikyo/9dpb4pn47i8zx8sf7o4ka7dj8c/Screen Shot 2018-06-18 at 5.56.43 PM.png</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538772384414</DateTimeUTC>
      <UserFileName>Screen Shot 2018-06-13 at 11.47.10 PM.png</UserFileName>
      <FileName>20181005/teams/noteam/channels/si9kxe8y9tyqxdbfwx9oxhjmnh/users/8itpscu7itb59y5trr37quikyo/bzqpf4aa8p8epb7dxmiht6onga/Screen Shot 2018-06-13 at 11.47.10 PM.png</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538772384414</DateTimeUTC>
      <UserFileName>Screen Shot 2018-06-13 at 11.39.34 PM.png</UserFileName>
      <FileName>20181005/teams/noteam/channels/si9kxe8y9tyqxdbfwx9oxhjmnh/users/8itpscu7itb59y5trr37quikyo/zf7qddbsk785ijpufeao1af9qw/Screen Shot 2018-06-13 at 11.39.34 PM.png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538772384414</DateTimeUTC>
      <UserFileName>Screen Shot 2018-10-01 at 2.37.27 PM.png</UserFileName>
      <FileName>20181005/teams/noteam/channels/si9kxe8y9tyqxdbfwx9oxhjmnh/users/8itpscu7itb59y5trr37quikyo/u66nyhptgtyodk63ff4gbdinme/Screen Shot 2018-10-01 at 2.37.27 PM.png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538772384414</DateTimeUTC>
      <UserFileName>Screen Shot 2018-09-25 at 4.00.35 PM.png</UserFileName>
      <FileName>20181005/teams/noteam/channels/si9kxe8y9tyqxdbfwx9oxhjmnh/users/8itpscu7itb59y5trr37quikyo/8m6be9p3jbb7zer4bae49heywh/Screen Shot 2018-09-25 at 4.00.35 PM.png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538772384414</DateTimeUTC>
      <UserFileName>Screen Shot 2018-06-18 at 5.56.43 PM.png</UserFileName>
      <FileName>20181005/teams/noteam/channels/si9kxe8y9tyqxdbfwx9oxhjmnh/users/8itpscu7itb59y5trr37quikyo/9dpb4pn47i8zx8sf7o4ka7dj8c/Screen Shot 2018-06-18 at 5.56.43 PM.png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538772384414</DateTimeUTC>
      <UserFileName>Screen Shot 2018-06-13 at 11.47.10 PM.png</UserFileName>
      <FileName>20181005/teams/noteam/channels/si9kxe8y9tyqxdbfwx9oxhjmnh/users/8itpscu7itb59y5trr37quikyo/bzqpf4aa8p8epb7dxmiht6onga/Screen Shot 2018-06-13 at 11.47.10 PM.png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538772862438</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538772862438</DateTimeUTC>
      <UserFileName>Word.docx</UserFileName>
      <FileName>20181005/teams/noteam/channels/si9kxe8y9tyqxdbfwx9oxhjmnh/users/8itpscu7itb59y5trr37quikyo/b4o7t8wm9brzmfmdcd1ui8u8ko/Word.docx</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538772862438</DateTimeUTC>
      <UserFileName>PPT.pptx</UserFileName>
      <FileName>20181005/teams/noteam/channels/si9kxe8y9tyqxdbfwx9oxhjmnh/users/8itpscu7itb59y5trr37quikyo/cozzapkfwiyw9yfkwq6n3r5zac/PPT.pptx</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538772862438</DateTimeUTC>
      <UserFileName>Screen Shot 2018-06-18 at 5.56.43 PM.png</UserFileName>
      <FileName>20181005/teams/noteam/channels/si9kxe8y9tyqxdbfwx9oxhjmnh/users/8itpscu7itb59y5trr37quikyo/4pshpterpi8d8qh95wnd7sesjo/Screen Shot 2018-06-18 at 5.56.43 PM.png</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538772862438</DateTimeUTC>
      <UserFileName>Word.docx</UserFileName>
      <FileName>20181005/teams/noteam/channels/si9kxe8y9tyqxdbfwx9oxhjmnh/users/8itpscu7itb59y5trr37quikyo/b4o7t8wm9brzmfmdcd1ui8u8ko/Word.docx</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538772862438</DateTimeUTC>
      <UserFileName>PPT.pptx</UserFileName>
      <FileName>20181005/teams/noteam/channels/si9kxe8y9tyqxdbfwx9oxhjmnh/users/8itpscu7itb59y5trr37quikyo/cozzapkfwiyw9yfkwq6n3r5zac/PPT.pptx</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538772862438</DateTimeUTC>
      <UserFileName>Screen Shot 2018-06-18 at 5.56.43 PM.png</UserFileName>
      <FileName>20181005/teams/noteam/channels/si9kxe8y9tyqxdbfwx9oxhjmnh/users/8itpscu7itb59y5trr37quikyo/4pshpterpi8d8qh95wnd7sesjo/Screen Shot 2018-06-18 at 5.56.43 PM.png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538935828037</DateTimeUTC>
      <Content>@jason </Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538935863385</DateTimeUTC>
      <Content>@jason </Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538935901451</DateTimeUTC>
      <Content>@jason </Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538936472890</DateTimeUTC>
      <Content>jason</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
      <Content>@jason </Content>
    </Message>
    <ParticipantLeft>
      <LoginName>amy.blais+1@mattermost.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy.blais+6@mattermost.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>asaad+1@mattermost.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>asaad+9@mattermost.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+dkh-teamjoinuser@mattermost.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+dkhlogintest@mattermost.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+edgetest@mattermost.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>george+452@mattermost.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>george+46@mattermost.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>george+48@mattermost.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>george+51@mattermost.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>george+rn@mattermost.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>harrison+bw@mattermost.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jason+12344321@mattermost.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jason+1234554321@mattermost.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jason+2111@mattermost.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jason+2113@mattermost.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jason+3@mattermost.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jonathan.fritz+test1@mattermost.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>joram+1@mattermost.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+ldap@mattermost.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+mysql@mattermost.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+onel@mattermost.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+sysad1jun@mattermost.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>martin+test5@mattermost.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+14xec4mrrjdubqohzjfh1toq1h@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+1t7ffrnektgu7jyhcp17oubn1a@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+1tnb7sngkif85d8ur3usccipqw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+1wrt878j1tnf8kedbti6pjkw3o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+1zz5akufobye5gcapsifs3nk4e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+31tcmp8qsbnbfxw99o76z4hp4y@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+3asf6egnip8hjdk7b369pk5qyo@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+3cpcg5nr7i8dbfomhoigpd1i6a@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+3p9ocj8h8fysfq75t6cktckobo@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4188xiuyjigdpgk7mftsaw1pbe@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+44ajec86hbniur3kbut1tjxt6c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4bc6i6cfk38fbxircttympnskw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4c5pigczht8iuraieqma3fk88c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4cht4adn6pr9xqazcybuheoqkw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4ihuad1p6fghbeykkcxzqeg7wa@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4j6oifu37pr5dmdtpp48jmqteesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4jm7qnp43id3xgwa4in8ow3aoe@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4tcy19r5hidrbpqg4uhoyyw4dh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4tzo6dd1a7bnbdn8j15j4fdb6y@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4uuejz7ctbbgug4mdt13j51g9o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4wq5skd9ofdojqsoyuunjt7mdr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+5dkcraoo7tdn8kxz8cgx8p4dhr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+5fcbis73z7b6fydazancgys3gc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+5mqnbdy4ifdajkx5hem9sgjbqe@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+5nc5o6f8sfbm8deswkjfpnrady@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+5tso7cskft8qzdmop6cqaq5azo@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+5ztwom83e7bu98pqi5fs4jxexo@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+5zydt4yhufn47cod5j8nkiqp3c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+68j8ejpx93biuk8i1euwbh6n9y@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+69tbkw5e8tg9t8a4abijz8rmta@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+6ctxdiw6zpnb8m5id3t8mrg8ka@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+6exwexedcfb9dr1ykswffinuua@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+6iypex6jat8xietgkkf1htx4fy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+6kzhg7e8h7ga8qe847s8qwf46c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+6og1wweckbg83n1nm8ba8b5arw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+6t6nhamjt3gb9eb1k58ihsey5e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+6uyqtm11bbnguqssyuqdxxuuec@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+6zeoxzjmeb85dykd1f59jjobrc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+78mfzgemebdjtdgedmfj6yxjih@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+7eq1ryf7u38ufqcozwb7o4u8zy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+7hmez5xzrfy1u8oze83apk33ta@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+7j6msnn5jid8dpz186uhzfgsee@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+7ptjcezuoiym9bwb45cerk55qh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+7thynb6zjb8kmnngu3nr4rsaee@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+843f9qbjhtgfdfsmeuc17euxmc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+89sho1c8gjfqfrcoff7ypm31me@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+8ba3887n17gxp8tye6ywjsub1w@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+8fymowq3o7819dgse6s9ffoy9o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+8gquaj4cijr38qiygaezcfxc7e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+8yhu71kipt893qwndhwe7nmsua@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+95x4ca7zniddjnt4tew1aqnt4h@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+99paszs3w7nn8kyijwkmmzthdy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+9co11fc1efyaurkzo88tx73ife@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+9jkomtxhepgepe73kj817hyrue@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+a1616cw883yg7ctgqgfwk4obuh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+a957ee6w5f86up5jchsygc6zuc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+afds3o7zf3f5me41hgmxy858bw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+aiof7q67siyf3e5imc7amj75cr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+astuy8b8yp8j5qkferxdo537wr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+auecjinokfy69ebm9dots3ejea@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+b64o5iqs7jg99gyobms3g3cu7c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+b6i58un7e38npfd35a7p9edrfy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+bbzua1yrpjby885861k44okm8o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+bj3d5rkgf7bopnb6guakt4nr3h@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+bj6d54o1c78i585zqkxuyzsg9a@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+bj7ker7ntprwfqjbrz5eoe7a3o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+bjegnnb4y7fbzcgpjbdz7j9jio@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+bnxdj99okf8jjxb6o3ncskqytr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+c1im4r19b7buxen1b8b8hb1jbh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+c5sebzedspbkzy7who8qb3gf1o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+c6djwgwtu38yjb1tjho35mpjio@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+cihr5a3j8indtd8dwrf9s735fh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+ck1sgrgns7rq9kpr7hmsyh75by@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+cmxeex7ytbyepy8or35xwkdebc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+csbrztnqi7rgbneucxn64c33sr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+csgyn99rmjga9x57xcutsjih1h@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+curk9ueyciyj7fexjukby64yhh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+cw6awotpz7f4t8jrsm5c46uzpc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+d7y1dmxpc3ypjyaxh918cu1t3y@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+d9kpp6jdi7yb98utpexq6718sa@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+dbhzok7drbniddzrqrnw5i6tnc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+dd5cjzy99fnxfpd7gn67cnrkoa@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+dgnneanah3nmjru7zow5zaxg1c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+dx45haz8kjrxmnahhcpmyo6whe@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+dy56gamzetff8b5d1dssqq781h@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+e1ese484dfgubpac6as16rafhw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+eiizcc9rp78i3xpkz5abcskptr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+emfsb6pmrfbrmmu1tbsa5zwxfc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+enzo7zyuyjf5prhp11fpcfc81e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+eruami83wjywxrqq354wz7gcxy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+etew4mkajjgeinjxxzyrrsgxnc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+f1n9qnef7f8g3xd9688xg5c8ry@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+fd56e6gt5jyzuraib9o769opgr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+fi9pwo6nejdp7nma3picmopumc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+g39d4dfrwjr48cm686d51wc1ge@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+g45bnj98jtbq8jjkupiupac9xc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+g9crhsfwhty98k7e6wdci8bwbw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+g9fmc35jg78y3e6q1uf7awkdba@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+gb6rpcr5ntygxgcr1rep37qfay@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+gzenif5xd7gcb8runh1tjpwh6c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+gzyiupo4zfyf8jbxjx4fww4gpy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+h1hm9z5ccpyrmmrgnaaitex35e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+haufqfcyepntfqy7dxd9b473do@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+hojeqb3bgige8bffbxno5985sw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+i98stoyedbdh5dzws6fmwmjsxh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+igakdne9hprfj8xphufgkoro3o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+iqp9g319hfbjuyparipudcwmfe@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+itwwdkwhxpyriq4c7u3wz15hnc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+ixmah9qsi3ge7xmsrnhu9z9o5e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+j1e4zpx3qtfumpdpd1yz7ewana@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+j3zm7zczhpdi8q4sb3uapeik5a@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+j94x31y5dpf6dp633n1qmzmh9c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+jodoephek7d8d88ac6u6eh9c3r@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+jr4x57ogj3re383o7ntek9atse@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+jyyg8hijfjdu7yk5igqojme93a@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+k793mwzrmbgc5rwduyt8q1awqo@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+k95y7gjpa3gk3yf1gpqdtqwa1w@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+kxwneaxtz7gpinigcqc9ja1bwc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+kyma43yr63gazcfkyh6qztwfse@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+m5uquhcwupbjicjp87emirjh1c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+m6qk51nui7g53fwhfmmo3ihfsr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+mnnooxykrpgqix1tqzxz87cmuh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+mozz86d87ir6bpor9513guwz8w@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+n393dtrsn3rejqwgqcg7bwamkc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+n3icdmsontredyyekgs336fk6e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+n8pyg37fefd6imgh4cy7786uce@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+neiao6h57386bxbwp3ejy6xcoc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+noehgawh5jyc5xt3ywofqxtd6y@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+nrah6qsfj7fu9jfik9a4uww79a@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+nrnzrzu9cfdwujtz19f8amwyjc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+nx8ce9eq4tdsubnyyunrmaoq4e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+o35cxhtoxbgcmxzgg9bsnf1t5r@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+o6qsksztb3ncfbabiadfan57jc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+o6u4o6ehnbgt7nppgwe3rix8ih@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+oaep1nr6rjnqpgf5s1a7a8nggh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+obgkpz7ubtrq7mcx7fsr45xwaw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+oew8d6cqo78n5kcgfe3gh4sqic@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+oggf6j1zjjbijrgh1dqtc6dwiy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+ony1dxoyap8yik1u6crgk5g7dr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+oxni5dwrwpft8psedt4hphcg3e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+oxy1zb1877d6tq6q4r4anfjtky@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+p7fzz7d77pnr7cfcgrh9z8rchr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+p8qfkx9zopg88eqmz6p95th3ur@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+pkfxjzjibtbbxq53fekx48kagr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+pnb6a7ozpbr69dpfzwaa88bcpr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+q9pryt97ztrstemt6aidkus3se@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+qd5fu7ixmirsxbjpuk5wdmtz1w@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+qdnqsw8kbtfxpgpq3z6c81iaic@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+qm966it8mtrodjqxo6jodxkspa@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+qsa6ufn1p38bjjzr1qcgjijfsa@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+qsf3hma14jdcmnp4csrubmxzrc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+r1m7zkdcq78rim3j9jugw4iuwa@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+r9rm3cyoetfm5mojgwojybdado@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+rauudt7xtpgh8jx9z3y3sh44dh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+rou7y755ttbcug1e8xwanaqwor@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+rz4kohuu7bgqxdyybx1qohgu4r@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+sb64tapbjffobeutdrxgnwwjgw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+sc75jebrd7f3tr8xxouknzbpdy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+scrsatmi8pnk7jsbu56b9xg4qw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+sfj95m6zd3gymfw4ko7ycyee1o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+sfjjdebowbgk5ddrueiopckmtw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+sjezud6smtbdb8jooe98sgwx6w@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+soogdrkrx3rp7rccy9e5nnwq4o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+t7ndac4u6tr6zyfwsgk1q7f9by@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+t8iqgaa9t38azqr6ms3w7rqtbr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+t91oxeg38jbipei1a4wchx3f1o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+tdrqco68xbr5xrwzte1nk3khmr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+thu1zebw3in6z8bnc9sz5jr6kr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+tiph1dysipy1pddtpa53tt66bo@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+tjxzau9axtn43pjab6rko8ezme@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+tqak3npdbid4mc5hzxtqh73wrw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+ty1aggby5bystjbjaypdw9n7be@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+u886uag7cjgtbjru13cttxd5fw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+ubpszg8rjinkuqgjba4ikkr19c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+unbu9hxq53r7dys33pmwqu1amy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+ungcjtnm7p8yixjra6uk1iq9ah@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+ustc3hzbpj8x8c7arjm14m6tqa@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+w1sabjfu57rexxynjux7bahazc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+w4sxwn38si8xtkqurquqaywanh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+wb6c394ihtyxmq3f9t1c1piojc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+whq7cqdy9bd3fbdw7uurte6g7e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+wmggrb4ziig3zkznifayfucgza@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+wqir77z8wfrpjg7e533mntes4o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+x9mst3xmuif8be7mk1xi97957h@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+xadj5xeur7gi9gn3eg7k3rw67w@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+xj3fc6pou7gp5dkxudr6593qrw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+xmhksuze7i867pc8zmg5mipx3e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+xp16is97spr3tqdscd4icqos6o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+xskoj8s9h3gyz8rxqykhxsu7hh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+y16rmsr5rff5bcu8zu487p4kxo@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+ycmjsht84ifa9rku6xe438e63a@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+ycyb8stnw3gjzfncniy4mtyx9c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+yea5jwj4ctbn8g3exgd8xd8zjh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+yhjzab185bbyxdbrds4yes4kro@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+yr7ji7x9mpnn8pt8a391et1z5r@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+zgtdea7p6fnwpx7hx8ofmr55ir@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+zjx8d3qoyirejjn48y4ykogz8a@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+zr6renr5ijgm9jmwfx9jfffbcr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+ztby31z8yjbefx9y6uqq3ocuur@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+zy8w4zwnjby55e9mmn56hc1wio@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+zzgfhhfoz7grfjuhhxyuw6hach@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>test1@mattermost.com</LoginName>
      <DateTimeUTC>1538936516816</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538936516816</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Group Message">
    <RoomID>group - fbwse4u5ubni78qq8dxcce3sco</RoomID>
    <StartTimeUTC>1536249380795</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>success+k163actt7fynpexxp37r1d8rkcsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536249322813</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536249322830</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+qzkhdqezoi84jgxyroegmhwqcrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536249322846</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+1rae4yficinqffw3ygypqf35nhsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536249322862</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536249322878</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536249380795</DateTimeUTC>
      <Content>post</Content>
    </Message>
    <Message>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536249393549</DateTimeUTC>
      <Content>Post here</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536249393549</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536249393549</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+1rae4yficinqffw3ygypqf35nhsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536249393549</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+k163actt7fynpexxp37r1d8rkcsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536249393549</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+qzkhdqezoi84jgxyroegmhwqcrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536249393549</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536249393549</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Town Square">
    <RoomID>public - cf8dh6g8a7b55gnuhz9pir9hao</RoomID>
    <StartTimeUTC>1536262788661</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1530779638962</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1530781234404</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1530862037418</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1530864840218</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1530865932329</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>saturnino@mattermost.com</LoginName>
      <DateTimeUTC>1533120419776</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>vladdy.moses@mattermost.com</LoginName>
      <DateTimeUTC>1536247185939</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1536262788661</DateTimeUTC>
      <Content>@sudheerdev </Content>
    </Message>
    <Message>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1536262799038</DateTimeUTC>
      <Content>@sudheerdev hey</Content>
    </Message>
    <Message>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1536262907753</DateTimeUTC>
      <Content>blah</Content>
    </Message>
    <Message>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1536269980818</DateTimeUTC>
      <Content>@sudheerdev </Content>
    </Message>
    <Message>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1536269987262</DateTimeUTC>
      <Content>@sudheerdev hello</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1536269987262</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1536269987262</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536269987262</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>saturnino@mattermost.com</LoginName>
      <DateTimeUTC>1536269987262</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1536269987262</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1536269987262</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>vladdy.moses@mattermost.com</LoginName>
      <DateTimeUTC>1536269987262</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536269987262</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Group Message">
    <RoomID>group - o81gqh59h7napbxajn7pjkp6fy</RoomID>
    <StartTimeUTC>1536270031389</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536267019534</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+5pcbjcto9bgipfbb4hb6qxrq7asimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536267019550</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+4j6oifu37pr5dmdtpp48jmqteesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536267019567</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+dojjf4o7ppyrudbewb7z8r98tesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536267019583</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+ga7c6f1b9tncpc7yc9cezp3dnr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1536267019599</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+zw3aekuaaffs5c5wnncjq5ag3hsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536267019615</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+qzkhdqezoi84jgxyroegmhwqcrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536267019630</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+5k9tstziw7dqpf1em9h6dapuewsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536267019646</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536270031389</DateTimeUTC>
      <Content>Shshd</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536270031389</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4j6oifu37pr5dmdtpp48jmqteesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536270031389</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+5k9tstziw7dqpf1em9h6dapuewsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536270031389</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+5pcbjcto9bgipfbb4hb6qxrq7asimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536270031389</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+dojjf4o7ppyrudbewb7z8r98tesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536270031389</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+ga7c6f1b9tncpc7yc9cezp3dnr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1536270031389</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+qzkhdqezoi84jgxyroegmhwqcrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536270031389</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+zw3aekuaaffs5c5wnncjq5ag3hsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536270031389</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536270031389</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Town Square">
    <RoomID>public - ae5gsjeip3rabgsoaghd7d7sno</RoomID>
    <StartTimeUTC>1538752296981</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1518204962794</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesse+1@mattermost.com</LoginName>
      <DateTimeUTC>1518205154269</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesse+2@mattermost.com</LoginName>
      <DateTimeUTC>1518205435654</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>jesse+2@mattermost.com</LoginName>
      <DateTimeUTC>1538752296981</DateTimeUTC>
      <Content>test</Content>
    </Message>
    <Message>
      <LoginName>jesse+2@mattermost.com</LoginName>
      <DateTimeUTC>1538752301712</DateTimeUTC>
      <Content>test ```&#xA;asdasd&#xA;asdasd&#xA;```</Content>
    </Message>
    <Message>
      <LoginName>jesse+2@mattermost.com</LoginName>
      <DateTimeUTC>1538752304115</DateTimeUTC>
      <Content>test </Content>
    </Message>
    <Message>
      <LoginName>jesse+2@mattermost.com</LoginName>
      <DateTimeUTC>1538752311911</DateTimeUTC>
      <Content>test&#xA;```&#xA;asasfas&#xA;asfasfasf&#xA;```&#xA;afasf&#xA;```&#xA;asfasfafsa&#xA;```</Content>
    </Message>
    <Message>
      <LoginName>jesse+2@mattermost.com</LoginName>
      <DateTimeUTC>1538752750961</DateTimeUTC>
      <Content>test</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>jesse+2@mattermost.com</LoginName>
      <DateTimeUTC>1538752750961</DateTimeUTC>
      <UserFileName>IMG_0390.JPG</UserFileName>
      <FileName>20181005/teams/noteam/channels/ae5gsjeip3rabgsoaghd7d7sno/users/pimm6gfpui8sznnpx61ed5jbpy/yyhqbjmhupnb9mamcbbzsbyd6w/IMG_0390.JPG</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>jesse+2@mattermost.com</LoginName>
      <DateTimeUTC>1538752750961</DateTimeUTC>
      <UserFileName>IMG_0390.JPG</UserFileName>
      <FileName>20181005/teams/noteam/channels/ae5gsjeip3rabgsoaghd7d7sno/users/pimm6gfpui8sznnpx61ed5jbpy/yyhqbjmhupnb9mamcbbzsbyd6w/IMG_0390.JPG</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <ParticipantLeft>
      <LoginName>jesse+1@mattermost.com</LoginName>
      <DateTimeUTC>1538752750961</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesse+2@mattermost.com</LoginName>
      <DateTimeUTC>1538752750961</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538752750961</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538752750961</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Town Square">
    <RoomID>public - 5gw6x7595bgojeukaufho3ieoh</RoomID>
    <StartTimeUTC>1538759665353</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538759590462</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538759665353</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538759665353</DateTimeUTC>
      <UserFileName>IMG_1832.JPG</UserFileName>
      <FileName>20181005/teams/noteam/channels/5gw6x7595bgojeukaufho3ieoh/users/zdgjbwi89tnrtdb3wk8pxmymie/tfxhuqaexbbqfc87whmz79wfoa/IMG_1832.JPG</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538759665353</DateTimeUTC>
      <UserFileName>IMG_1832.JPG</UserFileName>
      <FileName>20181005/teams/noteam/channels/5gw6x7595bgojeukaufho3ieoh/users/zdgjbwi89tnrtdb3wk8pxmymie/tfxhuqaexbbqfc87whmz79wfoa/IMG_1832.JPG</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538759800314</DateTimeUTC>
      <Content>Using camera</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538759800314</DateTimeUTC>
      <UserFileName>IMG_1833.JPG</UserFileName>
      <FileName>20181005/teams/noteam/channels/5gw6x7595bgojeukaufho3ieoh/users/zdgjbwi89tnrtdb3wk8pxmymie/kabnjx4a4bgh5qq3f3gynggyzr/IMG_1833.JPG</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538759800314</DateTimeUTC>
      <UserFileName>IMG_1833.JPG</UserFileName>
      <FileName>20181005/teams/noteam/channels/5gw6x7595bgojeukaufho3ieoh/users/zdgjbwi89tnrtdb3wk8pxmymie/kabnjx4a4bgh5qq3f3gynggyzr/IMG_1833.JPG</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538759864419</DateTimeUTC>
      <Content>Using shared extension</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538759864419</DateTimeUTC>
      <UserFileName>IMG_1833.JPG</UserFileName>
      <FileName>20181005/teams/noteam/channels/5gw6x7595bgojeukaufho3ieoh/users/zdgjbwi89tnrtdb3wk8pxmymie/q4bq599g1frptpq1uyjgb5xcnw/IMG_1833.JPG</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538759864419</DateTimeUTC>
      <UserFileName>IMG_1833.JPG</UserFileName>
      <FileName>20181005/teams/noteam/channels/5gw6x7595bgojeukaufho3ieoh/users/zdgjbwi89tnrtdb3wk8pxmymie/q4bq599g1frptpq1uyjgb5xcnw/IMG_1833.JPG</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538760030047</DateTimeUTC>
      <Content>Taken from library</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538760030047</DateTimeUTC>
      <UserFileName>IMG_1833.JPG</UserFileName>
      <FileName>20181005/teams/noteam/channels/5gw6x7595bgojeukaufho3ieoh/users/zdgjbwi89tnrtdb3wk8pxmymie/7gzokgdbqfbotxsxkybw9xjo4h/IMG_1833.JPG</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538760030047</DateTimeUTC>
      <UserFileName>IMG_1833.JPG</UserFileName>
      <FileName>20181005/teams/noteam/channels/5gw6x7595bgojeukaufho3ieoh/users/zdgjbwi89tnrtdb3wk8pxmymie/7gzokgdbqfbotxsxkybw9xjo4h/IMG_1833.JPG</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538995260462</DateTimeUTC>
      <Content>Hey</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538995279435</DateTimeUTC>
      <Content>https://ci-linux-mysql.mattermost.com/sa-team-54/pl/oy9x1xtorpdb5xiyuufj5ruepr</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538995279435</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538995279435</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Off-Topic">
    <RoomID>public - p35gz7spatrdz8zdce1spe1yza</RoomID>
    <StartTimeUTC>1539120141064</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536281015584</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy+13@mattermost.com</LoginName>
      <DateTimeUTC>1536281038472</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy+12@mattermost.com</LoginName>
      <DateTimeUTC>1536281038563</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy+10@mattermost.com</LoginName>
      <DateTimeUTC>1536281038653</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindsay@mattermost.com</LoginName>
      <DateTimeUTC>1536281038750</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536281038877</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy+14@mattermost.com</LoginName>
      <DateTimeUTC>1536281038977</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy+11@mattermost.com</LoginName>
      <DateTimeUTC>1536281039072</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy+3@mattermost.com</LoginName>
      <DateTimeUTC>1536281039175</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy+2@mattermost.com</LoginName>
      <DateTimeUTC>1536281039267</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>slackimportuser_qjbnc9b5ojbj5pmahg6gwkb38h@localhost</LoginName>
      <DateTimeUTC>1536281039465</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>eric+4@mattermost.com</LoginName>
      <DateTimeUTC>1539120057901</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1539120141064</DateTimeUTC>
      <Content>@channel </Content>
    </Message>
    <ParticipantLeft>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1539120141064</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>eric+4@mattermost.com</LoginName>
      <DateTimeUTC>1539120141064</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindsay@mattermost.com</LoginName>
      <DateTimeUTC>1539120141064</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy+10@mattermost.com</LoginName>
      <DateTimeUTC>1539120141064</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy+11@mattermost.com</LoginName>
      <DateTimeUTC>1539120141064</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy+12@mattermost.com</LoginName>
      <DateTimeUTC>1539120141064</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy+13@mattermost.com</LoginName>
      <DateTimeUTC>1539120141064</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy+14@mattermost.com</LoginName>
      <DateTimeUTC>1539120141064</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy+2@mattermost.com</LoginName>
      <DateTimeUTC>1539120141064</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy+3@mattermost.com</LoginName>
      <DateTimeUTC>1539120141064</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1539120141064</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>slackimportuser_qjbnc9b5ojbj5pmahg6gwkb38h@localhost</LoginName>
      <DateTimeUTC>1539120141064</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1539120141064</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Off-Topic">
    <RoomID>public - trosdtcmgpr1uj3ywzdmyxdq3o</RoomID>
    <StartTimeUTC>1535966599515</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1533286271489</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1534360771168</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1535966599515</DateTimeUTC>
      <Content>mp4</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1535966599515</DateTimeUTC>
      <UserFileName>MP4.mp4</UserFileName>
      <FileName>20180903/teams/noteam/channels/trosdtcmgpr1uj3ywzdmyxdq3o/users/qqu7z5pcbtycdczx4jetogekro/1g7hxzj3rjnh9gtqt7fwpuekqw/MP4.mp4</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1535966599515</DateTimeUTC>
      <UserFileName>MP4.mp4</UserFileName>
      <FileName>20180903/teams/noteam/channels/trosdtcmgpr1uj3ywzdmyxdq3o/users/qqu7z5pcbtycdczx4jetogekro/1g7hxzj3rjnh9gtqt7fwpuekqw/MP4.mp4</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536310320720</DateTimeUTC>
      <Content>1</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536310322019</DateTimeUTC>
      <Content>2</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536310322907</DateTimeUTC>
      <Content>3</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536310323851</DateTimeUTC>
      <Content>4</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536310336193</DateTimeUTC>
      <Content>5</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536310428542</DateTimeUTC>
      <Content>1</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536310429392</DateTimeUTC>
      <Content>2</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536310430252</DateTimeUTC>
      <Content>3</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536310431025</DateTimeUTC>
      <Content>4</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536310435950</DateTimeUTC>
      <Content>¯\\\_(ツ)\_/¯</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536310550185</DateTimeUTC>
      <Content>¯\\\_(ツ)\_/¯</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536310581670</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536310581670</DateTimeUTC>
      <UserFileName>SEPTEMBER 2018 MINI EXAMINATION TIMETABLE (1).docx</UserFileName>
      <FileName>20180907/teams/noteam/channels/trosdtcmgpr1uj3ywzdmyxdq3o/users/qqu7z5pcbtycdczx4jetogekro/sm9yc1kjbfgd3qhb9c9of8ar4y/SEPTEMBER 2018 MINI EXAMINATION TIMETABLE (1).docx</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536310581670</DateTimeUTC>
      <UserFileName>SEPTEMBER 2018 MINI EXAMINATION TIMETABLE (1).docx</UserFileName>
      <FileName>20180907/teams/noteam/channels/trosdtcmgpr1uj3ywzdmyxdq3o/users/qqu7z5pcbtycdczx4jetogekro/sm9yc1kjbfgd3qhb9c9of8ar4y/SEPTEMBER 2018 MINI EXAMINATION TIMETABLE (1).docx</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536310581670</DateTimeUTC>
      <Content></Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536310581670</DateTimeUTC>
      <Content>attachment no text edit</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536310722607</DateTimeUTC>
      <Content>text and attach</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536310722607</DateTimeUTC>
      <Content>hello</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536310722607</DateTimeUTC>
      <Content></Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536310722607</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536310722607</DateTimeUTC>
      <UserFileName>SEPTEMBER 2018 MINI EXAMINATION TIMETABLE (1).docx</UserFileName>
      <FileName>20180907/teams/noteam/channels/trosdtcmgpr1uj3ywzdmyxdq3o/users/qqu7z5pcbtycdczx4jetogekro/pguy1xti97g6zkgj6nr5xz8zzr/SEPTEMBER 2018 MINI EXAMINATION TIMETABLE (1).docx</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536310722607</DateTimeUTC>
      <UserFileName>SEPTEMBER 2018 MINI EXAMINATION TIMETABLE (1).docx</UserFileName>
      <FileName>20180907/teams/noteam/channels/trosdtcmgpr1uj3ywzdmyxdq3o/users/qqu7z5pcbtycdczx4jetogekro/pguy1xti97g6zkgj6nr5xz8zzr/SEPTEMBER 2018 MINI EXAMINATION TIMETABLE (1).docx</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536310820171</DateTimeUTC>
      <Content>message to delete</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536310850043</DateTimeUTC>
      <Content>message</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536310854535</DateTimeUTC>
      <Content>reply</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536310952135</DateTimeUTC>
      <Content>:macau: </Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536310973269</DateTimeUTC>
      <Content>:baby: </Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536310982769</DateTimeUTC>
      <Content>:back: </Content>
    </Message>
    <ParticipantLeft>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1536310982769</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536310982769</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536310982769</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="H Channel">
    <RoomID>public - kns6n5csf3gyjj56shbcd3u7ao</RoomID>
    <StartTimeUTC>1536192834138</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1530893750725</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1530893819992</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536192834138</DateTimeUTC>
      <Content>posting a message</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537466832457</DateTimeUTC>
      <Content>red</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537466834220</DateTimeUTC>
      <Content>blue</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537466836262</DateTimeUTC>
      <Content>red blue</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537466837908</DateTimeUTC>
      <Content>red and blue</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537466837908</DateTimeUTC>
      <Content>red and blue</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537466838909</DateTimeUTC>
      <Content>blog</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537466840676</DateTimeUTC>
      <Content>something other</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537466851885</DateTimeUTC>
      <Content>www.wikipedia.org</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537466858132</DateTimeUTC>
      <Content>:star:</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537466867357</DateTimeUTC>
      <Content>192.168.1.0</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537466873517</DateTimeUTC>
      <Content>black</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537466875332</DateTimeUTC>
      <Content>red black</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537466876953</DateTimeUTC>
      <Content>mattermost</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1537466876953</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537466876953</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1537466876953</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="DKHPrChan1">
    <RoomID>private - kt359oqwep8cffwikha6m3j49o</RoomID>
    <StartTimeUTC>1538184626924</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538184580743</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1538184594974</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1538184626924</DateTimeUTC>
      <Content>mustard</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538184626924</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1538184626924</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538184626924</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Town Square">
    <RoomID>public - h5c3xjcqkbynfxdazq4dyhf5nh</RoomID>
    <StartTimeUTC>1539120118582</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536281015549</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy+13@mattermost.com</LoginName>
      <DateTimeUTC>1536281038436</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy+12@mattermost.com</LoginName>
      <DateTimeUTC>1536281038527</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy+10@mattermost.com</LoginName>
      <DateTimeUTC>1536281038618</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindsay@mattermost.com</LoginName>
      <DateTimeUTC>1536281038709</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536281038804</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy+14@mattermost.com</LoginName>
      <DateTimeUTC>1536281038941</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy+11@mattermost.com</LoginName>
      <DateTimeUTC>1536281039033</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy+3@mattermost.com</LoginName>
      <DateTimeUTC>1536281039129</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy+2@mattermost.com</LoginName>
      <DateTimeUTC>1536281039230</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>slackimportuser_qjbnc9b5ojbj5pmahg6gwkb38h@localhost</LoginName>
      <DateTimeUTC>1536281039429</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>eric+4@mattermost.com</LoginName>
      <DateTimeUTC>1539120057865</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1539120118582</DateTimeUTC>
      <Content>@here </Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1539120125290</DateTimeUTC>
      <Content>@here </Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1539120129806</DateTimeUTC>
      <Content>@channel </Content>
    </Message>
    <Message>
      <LoginName>eric+4@mattermost.com</LoginName>
      <DateTimeUTC>1539120281690</DateTimeUTC>
      <Content>sadg</Content>
    </Message>
    <Message>
      <LoginName>eric+4@mattermost.com</LoginName>
      <DateTimeUTC>1539120281895</DateTimeUTC>
      <Content>sdfg</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1539120288617</DateTimeUTC>
      <Content>dsfg</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1539120288998</DateTimeUTC>
      <Content>dsfg</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1539120289352</DateTimeUTC>
      <Content>dsfg</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1539120289736</DateTimeUTC>
      <Content>dfsg</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1539120290047</DateTimeUTC>
      <Content>dsfg</Content>
    </Message>
    <Message>
      <LoginName>eric+4@mattermost.com</LoginName>
      <DateTimeUTC>1539120308027</DateTimeUTC>
      <Content>dshds</Content>
    </Message>
    <Message>
      <LoginName>eric+4@mattermost.com</LoginName>
      <DateTimeUTC>1539120313739</DateTimeUTC>
      <Content>fgdhfgdhfgh</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1539120319327</DateTimeUTC>
      <Content>fdghfgdh</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1539120326377</DateTimeUTC>
      <Content>fgdhfdghfgd</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1539120346666</DateTimeUTC>
      <Content>dsfgsdf</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1539120346666</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>eric+4@mattermost.com</LoginName>
      <DateTimeUTC>1539120346666</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindsay@mattermost.com</LoginName>
      <DateTimeUTC>1539120346666</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy+10@mattermost.com</LoginName>
      <DateTimeUTC>1539120346666</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy+11@mattermost.com</LoginName>
      <DateTimeUTC>1539120346666</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy+12@mattermost.com</LoginName>
      <DateTimeUTC>1539120346666</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy+13@mattermost.com</LoginName>
      <DateTimeUTC>1539120346666</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy+14@mattermost.com</LoginName>
      <DateTimeUTC>1539120346666</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy+2@mattermost.com</LoginName>
      <DateTimeUTC>1539120346666</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy+3@mattermost.com</LoginName>
      <DateTimeUTC>1539120346666</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1539120346666</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>slackimportuser_qjbnc9b5ojbj5pmahg6gwkb38h@localhost</LoginName>
      <DateTimeUTC>1539120346666</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1539120346666</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="private i">
    <RoomID>private - a4ynnmnxtj81fpc7pec5mopkpa</RoomID>
    <StartTimeUTC>1536193036615</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1530893765541</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1530893890346</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536193036615</DateTimeUTC>
      <Content>kjhjkhl</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1536193036615</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536193036615</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536193036615</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Off-Topic">
    <RoomID>public - qn8e6d8cctnotx1s94t9119z4o</RoomID>
    <StartTimeUTC>1536242490615</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1512727660415</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>saturnino.abril@mattermost.com</LoginName>
      <DateTimeUTC>1512740329891</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>saturnino.abril@mattermost.com</LoginName>
      <DateTimeUTC>1512740454353</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>saturnino.abril@mattermost.com</LoginName>
      <DateTimeUTC>1512740467651</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindsay+abc@mattermost.com</LoginName>
      <DateTimeUTC>1512755743295</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1513023173584</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1515193164908</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1517163627744</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>george+47@mattermost.com</LoginName>
      <DateTimeUTC>1518172616890</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1518174261292</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>george+48@mattermost.com</LoginName>
      <DateTimeUTC>1520419300839</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+5pcbjcto9bgipfbb4hb6qxrq7asimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520430995638</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+qzkhdqezoi84jgxyroegmhwqcrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520430995888</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+zw3aekuaaffs5c5wnncjq5ag3hsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520430996010</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+ga7c6f1b9tncpc7yc9cezp3dnr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520430996128</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+5qytzfb53tbcfrtza19bpcxa6esimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520430996245</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+1rae4yficinqffw3ygypqf35nhsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520430996367</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+mmcu65jphfgktruyhiu734t9bwsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520430996489</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+k163actt7fynpexxp37r1d8rkcsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520430996608</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+9phitiyni3n9zyqtyn7qe7gzhesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520430996727</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+jdx1ix41b78dmgn4c9xcz1ij7rsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520430996845</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+dpotox7uqpf7bpquq45op4rbdrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520430996964</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+djh77mgwd3nw9bsj8fjxgee6posimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520430997087</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+gkgi9xoxhfg3icasa1dkxb59qosimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520430997207</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+ryk18mxjp7njdy75x97j9y6zdasimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520430997325</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+kk3browcepyj5j98tehd6rxcjrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520430997446</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+pp739d7mijni8poaef4cob3akasimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520430997569</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+gedtydtgybrgujj6p78zxmbusasimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520430997689</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+69pnrwzp6idq8bra8uui76qjqesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520430997812</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+8dqrdwnds38aiyh11yupnfydkysimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520430997932</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+om9x5fczefrh8n167musb88e7wsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431011065</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+kps45utcqpd7umcm6p3kcwjaiwsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431011183</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+n3udm6jkutgsfqb4xicahpizeasimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431011301</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+6kh3sjkp53898y6fj54gfp578rsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431011420</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+x68birack3yc38b9hio8nz48qesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431011540</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+y8u6pue3apfcbexph1rsxq71sasimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431011658</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+fz3ab3gu5frkjn4y5gg43x57gosimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431011776</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+mkfdg866pjdtjee8d4zazb7pyosimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431011896</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+fgm51hj3o3dd58mg7hm5efjyuosimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431012016</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+4f8ntsigx3b3fxgeqg4gcfahzesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431012137</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+dk6aq3mwttb6ffaz1d6zzuk4zysimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431012254</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+ju61fun65jgmufn6p49w3k4goysimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431012374</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+e3k4icoy3fbkbepzo7pbqf6bnesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431012495</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+ac59mty3cbfibr7ty1wone1ixosimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431012615</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+5ishzszyftbsbg1k9tt14f8m5asimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431012734</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+s9rit3umifbg7kypwc9er6wz7csimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431012856</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+8n1pzxpgebrt9e1z84f9dujjucsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431012976</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+7yp6fbynp7nmfgmc3cryf4pahhsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431013101</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+usrmfcbeeigibryqd74p7de3aosimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431013243</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+8p43f6axepbfudjuenooq1uadhsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431013365</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+wd7wrqw6ety79xypowgxant9ycsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431026816</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+mnytsfzfgf83jnfe78aosgo8khsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431026943</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+i5xqhgctjpdcppfinbiqk57ojcsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431027070</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+5kzzjczzxfdbfdicsp6wdue68osimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431027196</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+oyxobgwxbpf1xpgpz5ffcc18owsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431027318</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+yz6bd3w19jywfrrd3pf4cud6ncsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431027449</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+9c5x7o1od7nymrrcxm58k8mmxysimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431027581</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+xdpkizgj6jyfmjzpwxh85uxohcsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431027714</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+c4bp1itrbpb35mf9348csnzkmosimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431027841</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+nbkzp3dky7nmimrsdffg4ac7ecsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431027967</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+j44d4g4gkjy9xksuha5fpic8masimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431028096</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+do66yw66pfnifmnbtkofymoz8esimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431028221</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+x59pf5c1d7n4fdt1fz6ohrg6mesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431028346</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+gtbaa3pn4jby5e3mb8i5uyyqrcsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431028476</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+au184bsap7dm8n6whn5hnkzcncsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431028614</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+us7jztq7sfyq5mg46z14chkc4wsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431028745</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+aqhc4uqjzjru383wnyx1jt5kgwsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431028868</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+pqopscgezid6tjap97au8zdyncsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431028990</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+1tphin5hr3ftjk89k3hb5tkpwosimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431029113</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+1idonspfkiy7mmt7ohqcfrhzowsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431029234</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>asaad+9@mattermost.com</LoginName>
      <DateTimeUTC>1520438623720</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindsay+v48@mattermost.com</LoginName>
      <DateTimeUTC>1520513034040</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>joram+1@mattermost.com</LoginName>
      <DateTimeUTC>1520607957932</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>eric+3@mattermost.com</LoginName>
      <DateTimeUTC>1523045142738</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>asaad+1@mattermost.com</LoginName>
      <DateTimeUTC>1523264370750</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+05072018-c@mattermost.com</LoginName>
      <DateTimeUTC>1525718194460</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+abc@mattermost.com</LoginName>
      <DateTimeUTC>1525786210838</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+dkhuser9@mattermost.com</LoginName>
      <DateTimeUTC>1525794462426</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>derrick.anderson+datestg3@mattermost.com</LoginName>
      <DateTimeUTC>1525827665828</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>asaad+1@mattermost.com</LoginName>
      <DateTimeUTC>1525891194099</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>asaad+65@mattermost.com</LoginName>
      <DateTimeUTC>1525892200447</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1528126225859</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais+3@mattermost.com</LoginName>
      <DateTimeUTC>1528211735525</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais+4@mattermost.com</LoginName>
      <DateTimeUTC>1528211828236</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1528379450989</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+dkhtsetuser01@mattermost.com</LoginName>
      <DateTimeUTC>1528660773302</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>michael.gamble@mattermost.com</LoginName>
      <DateTimeUTC>1528736673695</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais+7@mattermost.com</LoginName>
      <DateTimeUTC>1528808149764</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>george+rn@mattermost.com</LoginName>
      <DateTimeUTC>1530106523590</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>asaad+test55@mattermost.com</LoginName>
      <DateTimeUTC>1530782564150</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>asaad+56@mattermost.com</LoginName>
      <DateTimeUTC>1530782766913</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>george+51@mattermost.com</LoginName>
      <DateTimeUTC>1530786430701</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+email@mattermost.com</LoginName>
      <DateTimeUTC>1530810829419</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1530831874867</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+severification@mattermost.com</LoginName>
      <DateTimeUTC>1530886617448</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1530889142472</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1530890695279</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1531147186678</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1531221155083</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>asaad+1@mattermost.com</LoginName>
      <DateTimeUTC>1533725541701</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1533753289280</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+4j6oifu37pr5dmdtpp48jmqteesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1533753370340</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>asaad+11@mattermost.com</LoginName>
      <DateTimeUTC>1536172099362</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jason+118@mattermost.com</LoginName>
      <DateTimeUTC>1536241509433</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>rickstokking@mattermost.com</LoginName>
      <DateTimeUTC>1536580889120</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais+8@mattermost.com</LoginName>
      <DateTimeUTC>1537397640766</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais+9@mattermost.com</LoginName>
      <DateTimeUTC>1537397753092</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>joram+8@mattermost.com</LoginName>
      <DateTimeUTC>1536242490615</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536242490615</DateTimeUTC>
      <Content>jason118</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536280025437</DateTimeUTC>
      <Content>https://ci-linux-mysql.mattermost.com/asaads-team/pl/mxwyyg4ktf8zm8x8wokto64gqa</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536280142828</DateTimeUTC>
      <Content>sadfas</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536280144855</DateTimeUTC>
      <Content>sadfsdf</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536280148107</DateTimeUTC>
      <Content>sdfsda</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536280148866</DateTimeUTC>
      <Content>fsdf</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536280149358</DateTimeUTC>
      <Content>sadf</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536280149682</DateTimeUTC>
      <Content>sdf</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536280152535</DateTimeUTC>
      <Content>dsafsda</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536280153234</DateTimeUTC>
      <Content>fdsa</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536280153521</DateTimeUTC>
      <Content>f</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536280153859</DateTimeUTC>
      <Content>sadf</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536280184190</DateTimeUTC>
      <Content>asdg</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536280184190</DateTimeUTC>
      <Content>asdg</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536280184190</DateTimeUTC>
      <Content>asdg</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536280184640</DateTimeUTC>
      <Content>sda</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536280185188</DateTimeUTC>
      <Content>sag</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536280185441</DateTimeUTC>
      <Content>sdag</Content>
    </Message>
    <Message>
      <LoginName>joram+8@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
      <Content>yo</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy.blais+3@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy.blais+4@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy.blais+7@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy.blais+8@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy.blais+9@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>asaad+11@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>asaad+1@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>asaad+56@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>asaad+65@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>asaad+9@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>asaad+test55@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>derrick.anderson+datestg3@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+05072018-c@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+abc@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+dkhtsetuser01@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+dkhuser9@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+severification@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>eric+3@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>george+47@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>george+48@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>george+51@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>george+rn@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jason+118@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>joram+1@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>joram+8@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+email@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindsay+abc@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindsay+v48@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>michael.gamble@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>rickstokking@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>saturnino.abril@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+1idonspfkiy7mmt7ohqcfrhzowsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+1rae4yficinqffw3ygypqf35nhsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+1tphin5hr3ftjk89k3hb5tkpwosimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4f8ntsigx3b3fxgeqg4gcfahzesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4j6oifu37pr5dmdtpp48jmqteesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+5ishzszyftbsbg1k9tt14f8m5asimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+5kzzjczzxfdbfdicsp6wdue68osimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+5pcbjcto9bgipfbb4hb6qxrq7asimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+5qytzfb53tbcfrtza19bpcxa6esimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+69pnrwzp6idq8bra8uui76qjqesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+6kh3sjkp53898y6fj54gfp578rsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+7yp6fbynp7nmfgmc3cryf4pahhsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+8dqrdwnds38aiyh11yupnfydkysimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+8n1pzxpgebrt9e1z84f9dujjucsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+8p43f6axepbfudjuenooq1uadhsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+9c5x7o1od7nymrrcxm58k8mmxysimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+9phitiyni3n9zyqtyn7qe7gzhesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+ac59mty3cbfibr7ty1wone1ixosimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+aqhc4uqjzjru383wnyx1jt5kgwsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+au184bsap7dm8n6whn5hnkzcncsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+c4bp1itrbpb35mf9348csnzkmosimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+djh77mgwd3nw9bsj8fjxgee6posimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+dk6aq3mwttb6ffaz1d6zzuk4zysimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+do66yw66pfnifmnbtkofymoz8esimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+dpotox7uqpf7bpquq45op4rbdrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+e3k4icoy3fbkbepzo7pbqf6bnesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+fgm51hj3o3dd58mg7hm5efjyuosimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+fz3ab3gu5frkjn4y5gg43x57gosimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+ga7c6f1b9tncpc7yc9cezp3dnr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+gedtydtgybrgujj6p78zxmbusasimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+gkgi9xoxhfg3icasa1dkxb59qosimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+gtbaa3pn4jby5e3mb8i5uyyqrcsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+i5xqhgctjpdcppfinbiqk57ojcsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+j44d4g4gkjy9xksuha5fpic8masimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+jdx1ix41b78dmgn4c9xcz1ij7rsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+ju61fun65jgmufn6p49w3k4goysimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+k163actt7fynpexxp37r1d8rkcsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+kk3browcepyj5j98tehd6rxcjrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+kps45utcqpd7umcm6p3kcwjaiwsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+mkfdg866pjdtjee8d4zazb7pyosimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+mmcu65jphfgktruyhiu734t9bwsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+mnytsfzfgf83jnfe78aosgo8khsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+n3udm6jkutgsfqb4xicahpizeasimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+nbkzp3dky7nmimrsdffg4ac7ecsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+om9x5fczefrh8n167musb88e7wsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+oyxobgwxbpf1xpgpz5ffcc18owsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+pp739d7mijni8poaef4cob3akasimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+pqopscgezid6tjap97au8zdyncsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+qzkhdqezoi84jgxyroegmhwqcrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+ryk18mxjp7njdy75x97j9y6zdasimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+s9rit3umifbg7kypwc9er6wz7csimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+us7jztq7sfyq5mg46z14chkc4wsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+usrmfcbeeigibryqd74p7de3aosimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+wd7wrqw6ety79xypowgxant9ycsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+x59pf5c1d7n4fdt1fz6ohrg6mesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+x68birack3yc38b9hio8nz48qesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+xdpkizgj6jyfmjzpwxh85uxohcsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+y8u6pue3apfcbexph1rsxq71sasimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+yz6bd3w19jywfrrd3pf4cud6ncsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+zw3aekuaaffs5c5wnncjq5ag3hsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538750615764</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538750615764</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - w8cs84s8q78fdndre315pbw9yc</RoomID>
    <StartTimeUTC>1538731230828</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1538731230828</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538731230828</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1538731230828</DateTimeUTC>
      <Content>hello</Content>
    </Message>
    <Message>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1538731549008</DateTimeUTC>
      <Content>hello</Content>
    </Message>
    <Message>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1538731656891</DateTimeUTC>
      <Content>@HERE</Content>
    </Message>
    <Message>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1538731950285</DateTimeUTC>
      <Content>hello</Content>
    </Message>
    <Message>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1538732393044</DateTimeUTC>
      <Content>hi</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538732545783</DateTimeUTC>
      <Content>hello</Content>
    </Message>
    <Message>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1538733801947</DateTimeUTC>
      <Content>hello</Content>
    </Message>
    <Message>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1538733849983</DateTimeUTC>
      <Content>good</Content>
    </Message>
    <Message>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1539245909371</DateTimeUTC>
      <Content>hey</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1539245909371</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1539245909371</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1539245909371</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Group Message">
    <RoomID>group - mewh4595ujg3tjpb5n9gzrncae</RoomID>
    <StartTimeUTC>1538768701306</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>asaad+test10@mattermost.com</LoginName>
      <DateTimeUTC>1538768679213</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1538768679230</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+zw3aekuaaffs5c5wnncjq5ag3hsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538768679246</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+4j6oifu37pr5dmdtpp48jmqteesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538768679263</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+1rae4yficinqffw3ygypqf35nhsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538768679278</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+k163actt7fynpexxp37r1d8rkcsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538768679294</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+djh77mgwd3nw9bsj8fjxgee6posimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538768679311</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1538768701306</DateTimeUTC>
      <Content>asdf</Content>
    </Message>
    <Message>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1538768705289</DateTimeUTC>
      <Content>ok</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>asaad+test10@mattermost.com</LoginName>
      <DateTimeUTC>1538768705289</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1538768705289</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+1rae4yficinqffw3ygypqf35nhsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538768705289</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4j6oifu37pr5dmdtpp48jmqteesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538768705289</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+djh77mgwd3nw9bsj8fjxgee6posimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538768705289</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+k163actt7fynpexxp37r1d8rkcsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538768705289</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+zw3aekuaaffs5c5wnncjq5ag3hsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538768705289</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538768705289</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - hbub9k7syjrqpkr8nonzc6ncce</RoomID>
    <StartTimeUTC>1536176279673</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>mike@mattermost.com</LoginName>
      <DateTimeUTC>1536176276317</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536176276322</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>mike@mattermost.com</LoginName>
      <DateTimeUTC>1536176279673</DateTimeUTC>
      <Content>Hey Alice</Content>
    </Message>
    <Message>
      <LoginName>mike@mattermost.com</LoginName>
      <DateTimeUTC>1536176443672</DateTimeUTC>
      <Content>Hey Alice</Content>
    </Message>
    <Message>
      <LoginName>mike@mattermost.com</LoginName>
      <DateTimeUTC>1536176463798</DateTimeUTC>
      <Content>hey alice</Content>
    </Message>
    <Message>
      <LoginName>mike@mattermost.com</LoginName>
      <DateTimeUTC>1536176495930</DateTimeUTC>
      <Content>test hey alice</Content>
    </Message>
    <Message>
      <LoginName>mike@mattermost.com</LoginName>
      <DateTimeUTC>1536176524073</DateTimeUTC>
      <Content>test</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536176524073</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>mike@mattermost.com</LoginName>
      <DateTimeUTC>1536176524073</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536176524073</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Town Square">
    <RoomID>public - 6f6hg3aq3t8ctk1sz8zzeujhqr</RoomID>
    <StartTimeUTC>1538688207451</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1525890293300</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1528945811288</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1531849443431</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jason+2114@mattermost.com</LoginName>
      <DateTimeUTC>1533750477108</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1533751193400</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>vladdy.moses@mattermost.com</LoginName>
      <DateTimeUTC>1536160856711</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+8oct18@mattermost.com</LoginName>
      <DateTimeUTC>1538523049812</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538688207451</DateTimeUTC>
      <Content>@jason </Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538688212554</DateTimeUTC>
      <Content>@jason </Content>
    </Message>
    <ParticipantLeft>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1538688212554</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538688212554</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1538688212554</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jason+2114@mattermost.com</LoginName>
      <DateTimeUTC>1538688212554</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1538688212554</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+8oct18@mattermost.com</LoginName>
      <DateTimeUTC>1538688212554</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>vladdy.moses@mattermost.com</LoginName>
      <DateTimeUTC>1538688212554</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538688212554</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Group Message">
    <RoomID>group - k7sx4u6rtibk3rpsrxcn69nkjw</RoomID>
    <StartTimeUTC>1539073802906</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>success+kk3browcepyj5j98tehd6rxcjrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539073751304</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+dpotox7uqpf7bpquq45op4rbdrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539073751321</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+pp739d7mijni8poaef4cob3akasimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539073751337</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+gkgi9xoxhfg3icasa1dkxb59qosimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539073751353</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+69pnrwzp6idq8bra8uui76qjqesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539073751370</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+gedtydtgybrgujj6p78zxmbusasimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539073751387</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+x68birack3yc38b9hio8nz48qesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539073751403</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1539073751421</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1539073802906</DateTimeUTC>
      <Content>Hello</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1539073802906</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+69pnrwzp6idq8bra8uui76qjqesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539073802906</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+dpotox7uqpf7bpquq45op4rbdrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539073802906</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+gedtydtgybrgujj6p78zxmbusasimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539073802906</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+gkgi9xoxhfg3icasa1dkxb59qosimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539073802906</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+kk3browcepyj5j98tehd6rxcjrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539073802906</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+pp739d7mijni8poaef4cob3akasimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539073802906</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+x68birack3yc38b9hio8nz48qesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539073802906</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1539073802906</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="dkh-test Arc">
    <RoomID>public - zcpnrsm1sjnri8fqmtt4ksxk7r</RoomID>
    <StartTimeUTC>1537303653876</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1537303637003</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1537303653876</DateTimeUTC>
      <Content>Posted</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1537303653876</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1537303653876</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Default Channel">
    <RoomID>public - 85mmqno3ujgc8q9sxuhuird3ic</RoomID>
    <StartTimeUTC>1534201875300</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>dylan.haussermann@mattermost.com</LoginName>
      <DateTimeUTC>1525698834387</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1525699696126</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1525699835105</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1525706998010</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1525707098861</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+05072018-c@mattermost.com</LoginName>
      <DateTimeUTC>1525716399747</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+05072018-c@mattermost.com</LoginName>
      <DateTimeUTC>1525718291744</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1525720510140</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+4j6oifu37pr5dmdtpp48jmqteesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1525724063290</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+zw3aekuaaffs5c5wnncjq5ag3hsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1525724063359</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+qzkhdqezoi84jgxyroegmhwqcrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1525724063433</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+mmcu65jphfgktruyhiu734t9bwsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1525724063500</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+k163actt7fynpexxp37r1d8rkcsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1525724063570</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+1rae4yficinqffw3ygypqf35nhsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1525724191363</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+9phitiyni3n9zyqtyn7qe7gzhesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1525724191437</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+dkhuser10@mattermost.com</LoginName>
      <DateTimeUTC>1525975448328</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+dkhlogintest@mattermost.com</LoginName>
      <DateTimeUTC>1528238425986</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+dkhtsetuser01@mattermost.com</LoginName>
      <DateTimeUTC>1528238552028</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1533752861613</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1534201875300</DateTimeUTC>
      <Content>Test post</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1535738963723</DateTimeUTC>
      <Content>Post</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536206368938</DateTimeUTC>
      <Content>Post made at 11:59 EST</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536206424554</DateTimeUTC>
      <Content>Post made at 12:00 EST</Content>
    </Message>
    <Message>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1536261572408</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1536261572408</DateTimeUTC>
      <UserFileName>Dreamland.mp3</UserFileName>
      <FileName>20180906/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/1ttm5c95rbgo9y7uwq8n1ojagy/ratm8k7uzbnobrepk4npqsqmzh/Dreamland.mp3</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1536261572408</DateTimeUTC>
      <UserFileName>Dreamland.mp3</UserFileName>
      <FileName>20180906/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/1ttm5c95rbgo9y7uwq8n1ojagy/ratm8k7uzbnobrepk4npqsqmzh/Dreamland.mp3</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536261689430</DateTimeUTC>
      <Content> ## I *meant* to link to [this](http://example.com) :facepalm: ![Mattermost](https://mattermost.com/wp-content/uploads/2022/02/logoHorizontal.png)</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536261724946</DateTimeUTC>
      <Content>asdf</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536261731770</DateTimeUTC>
      <Content>asdf repl</Content>
    </Message>
    <Message>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1536261964520</DateTimeUTC>
      <Content>yolo</Content>
    </Message>
    <Message>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1536261964520</DateTimeUTC>
      <Content>You only live once</Content>
    </Message>
    <Message>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1536262097984</DateTimeUTC>
      <Content>original </Content>
    </Message>
    <Message>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1536262104794</DateTimeUTC>
      <Content>reply</Content>
    </Message>
    <Message>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1536262217723</DateTimeUTC>
      <Content>#### The quick, brown fox jumps over a lazy dog. &#xA;&#xA;*DJs flock by when MTV ax quiz prog.* Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sugar-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. &#xA;&#xA;#### A very bad quack might jinx zippy fowls. &#xA;&#xA;**Few quips galvanized the mock jury box.** Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. The end of this long post will be hidden until you choose to `Show More`.&#xA;&#xA;&#xA;&#xA;&#xA;</Content>
    </Message>
    <Message>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1536262441130</DateTimeUTC>
      <Content>hello</Content>
    </Message>
    <Message>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1536262441130</DateTimeUTC>
      <Content>hello&#xA;is&#xA;there&#xA;anybody &#xA;out&#xA;there...&#xA;&#xA;hello&#xA;is&#xA;there&#xA;anybody &#xA;out&#xA;there...&#xA;&#xA;jdjxjdjdjdfj</Content>
    </Message>
    <Message>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1536262735284</DateTimeUTC>
      <Content>;lijk</Content>
    </Message>
    <Message>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1536262742745</DateTimeUTC>
      <Content>asdf</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536266000166</DateTimeUTC>
      <Content>Sample message</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536266549535</DateTimeUTC>
      <Content>https://media1.giphy.com/media/l41lM6sJvwmZNruLe/giphy.gif</Content>
    </Message>
    <Message>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1536266620831</DateTimeUTC>
      <Content>one</Content>
    </Message>
    <Message>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1536266625080</DateTimeUTC>
      <Content>two</Content>
    </Message>
    <Message>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1536266627731</DateTimeUTC>
      <Content>three</Content>
    </Message>
    <Message>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1536266780169</DateTimeUTC>
      <Content>four</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536267172778</DateTimeUTC>
      <Content>@martin.test1 hey dude</Content>
    </Message>
    <Message>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1536267310121</DateTimeUTC>
      <Content>粗は^_^比、差</Content>
    </Message>
    <Message>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1536267341980</DateTimeUTC>
      <Content>ハサミ  ラダは か</Content>
    </Message>
    <Message>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1536267408130</DateTimeUTC>
      <Content>yeah </Content>
    </Message>
    <Message>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1536267416374</DateTimeUTC>
      <Content>🤬</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536267739124</DateTimeUTC>
      <Content>Reply&#xA;</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536267834756</DateTimeUTC>
      <Content>## I *meant* to link to [this](http://example.com) :facepalm: ![Mattermost](https://mattermost.com/wp-content/uploads/2022/02/logoHorizontal.png)</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536267898896</DateTimeUTC>
      <Content>Another message</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536267923593</DateTimeUTC>
      <Content>Reply&#xA;</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536273162917</DateTimeUTC>
      <Content>post</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536273162917</DateTimeUTC>
      <Content>post modified</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536273415271</DateTimeUTC>
      <Content>Post&#xA;</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536273445255</DateTimeUTC>
      <Content>Post</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536273456443</DateTimeUTC>
      <Content>Reply to post</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536273567168</DateTimeUTC>
      <Content>#### The quick, brown fox jumps over a lazy dog. &#xA;&#xA;*DJs flock by when MTV ax quiz prog.* Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sugar-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. &#xA;&#xA;#### A very bad quack might jinx zippy fowls. &#xA;&#xA;**Few quips galvanized the mock jury box.** Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. The end of this long post will be hidden until you choose to `Show More`.</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536273629297</DateTimeUTC>
      <Content>Post</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536274101878</DateTimeUTC>
      <Content>Permalink test</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536275558233</DateTimeUTC>
      <Content>Post here</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536346562864</DateTimeUTC>
      <Content>Post</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536346562864</DateTimeUTC>
      <UserFileName>file with space.jpg</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/ytj99mb1tbgfmpzzcnzw734tdo/73tj9xc39pf9bd3g5t4syajora/file with space.jpg</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536346562864</DateTimeUTC>
      <UserFileName>file with space.jpg</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/ytj99mb1tbgfmpzzcnzw734tdo/73tj9xc39pf9bd3g5t4syajora/file with space.jpg</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536346808329</DateTimeUTC>
      <Content>Post from iOS</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536346808329</DateTimeUTC>
      <UserFileName>IMG_0146.JPG</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/ytj99mb1tbgfmpzzcnzw734tdo/7z6uxzkqq7ny7nwhr3ik8hyqmc/IMG_0146.JPG</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536346808329</DateTimeUTC>
      <UserFileName>IMG_0146.JPG</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/ytj99mb1tbgfmpzzcnzw734tdo/7z6uxzkqq7ny7nwhr3ik8hyqmc/IMG_0146.JPG</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536347129153</DateTimeUTC>
      <Content>Has spaces</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536347129153</DateTimeUTC>
      <UserFileName>file with space.jpg</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/ytj99mb1tbgfmpzzcnzw734tdo/egmd85ueafbuugybrp83ympnxy/file with space.jpg</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536347129153</DateTimeUTC>
      <UserFileName>file with space.jpg</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/ytj99mb1tbgfmpzzcnzw734tdo/egmd85ueafbuugybrp83ympnxy/file with space.jpg</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536347251913</DateTimeUTC>
      <Content>Share extension with spaces</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536347251913</DateTimeUTC>
      <UserFileName>file with space.jpg</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/ytj99mb1tbgfmpzzcnzw734tdo/c4i87j4nebbmx8heksmka3fr4y/file with space.jpg</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536347251913</DateTimeUTC>
      <UserFileName>file with space.jpg</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/ytj99mb1tbgfmpzzcnzw734tdo/c4i87j4nebbmx8heksmka3fr4y/file with space.jpg</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536347545666</DateTimeUTC>
      <Content>Share test 1</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536347545666</DateTimeUTC>
      <UserFileName>MP4 File with Spaces.mp4</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/ytj99mb1tbgfmpzzcnzw734tdo/ecs3u3873jr6bpu47ed813x65w/MP4 File with Spaces.mp4</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536347545666</DateTimeUTC>
      <UserFileName>MP4 File with Spaces.mp4</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/ytj99mb1tbgfmpzzcnzw734tdo/ecs3u3873jr6bpu47ed813x65w/MP4 File with Spaces.mp4</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536347655222</DateTimeUTC>
      <Content>Share test 2</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536347655222</DateTimeUTC>
      <UserFileName>MP4%20File%20with Spaces.mp4</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/ytj99mb1tbgfmpzzcnzw734tdo/eo3e86psubrku81d8zzfrwu8ph/MP4%20File%20with Spaces.mp4</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536347655222</DateTimeUTC>
      <UserFileName>MP4%20File%20with Spaces.mp4</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/ytj99mb1tbgfmpzzcnzw734tdo/eo3e86psubrku81d8zzfrwu8ph/MP4%20File%20with Spaces.mp4</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536347848670</DateTimeUTC>
      <Content>File preview mixer pack 1</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536347848670</DateTimeUTC>
      <UserFileName>M4A.m4a</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/7n8rz76dk3n88ydfzh5d7fny4r/xkpzr44w33bhmkfpkg1xj8xb4h/M4A.m4a</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536347848670</DateTimeUTC>
      <UserFileName>MP3.mp3</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/7n8rz76dk3n88ydfzh5d7fny4r/786gfxhauiyo7bcc5f6jyyf5ta/MP3.mp3</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536347848670</DateTimeUTC>
      <UserFileName>Excel.xlsx</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/7n8rz76dk3n88ydfzh5d7fny4r/g39zejrtd7rqmq97j6xu8nsqza/Excel.xlsx</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536347848670</DateTimeUTC>
      <UserFileName>PPT.pptx</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/7n8rz76dk3n88ydfzh5d7fny4r/bq3ibim4wjbpbnyxpo93oywweo/PPT.pptx</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536347848670</DateTimeUTC>
      <UserFileName>PDF.pdf</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/7n8rz76dk3n88ydfzh5d7fny4r/bgq64rshz3brfeuf3zi6ixm9fr/PDF.pdf</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536347848670</DateTimeUTC>
      <UserFileName>M4A.m4a</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/7n8rz76dk3n88ydfzh5d7fny4r/xkpzr44w33bhmkfpkg1xj8xb4h/M4A.m4a</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536347848670</DateTimeUTC>
      <UserFileName>MP3.mp3</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/7n8rz76dk3n88ydfzh5d7fny4r/786gfxhauiyo7bcc5f6jyyf5ta/MP3.mp3</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536347848670</DateTimeUTC>
      <UserFileName>Excel.xlsx</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/7n8rz76dk3n88ydfzh5d7fny4r/g39zejrtd7rqmq97j6xu8nsqza/Excel.xlsx</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536347848670</DateTimeUTC>
      <UserFileName>PPT.pptx</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/7n8rz76dk3n88ydfzh5d7fny4r/bq3ibim4wjbpbnyxpo93oywweo/PPT.pptx</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536347848670</DateTimeUTC>
      <UserFileName>PDF.pdf</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/7n8rz76dk3n88ydfzh5d7fny4r/bgq64rshz3brfeuf3zi6ixm9fr/PDF.pdf</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536347883611</DateTimeUTC>
      <Content>File preview mixer pack 2</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536347883611</DateTimeUTC>
      <UserFileName>GIF.gif</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/7n8rz76dk3n88ydfzh5d7fny4r/z7ik543yo78bdpa1q15nuuofjw/GIF.gif</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536347883611</DateTimeUTC>
      <UserFileName>JPG.jpg</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/7n8rz76dk3n88ydfzh5d7fny4r/6ndpu1uwsjg6pf8judemjwjqfy/JPG.jpg</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536347883611</DateTimeUTC>
      <UserFileName>TIFF.tif</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/7n8rz76dk3n88ydfzh5d7fny4r/y98tisdykbrmuk8krd7uzbfhyo/TIFF.tif</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536347883611</DateTimeUTC>
      <UserFileName>car.svg</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/7n8rz76dk3n88ydfzh5d7fny4r/p7y3bnmaq7dnfnf1egz57mwwxr/car.svg</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536347883611</DateTimeUTC>
      <UserFileName>GIF.gif</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/7n8rz76dk3n88ydfzh5d7fny4r/z7ik543yo78bdpa1q15nuuofjw/GIF.gif</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536347883611</DateTimeUTC>
      <UserFileName>JPG.jpg</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/7n8rz76dk3n88ydfzh5d7fny4r/6ndpu1uwsjg6pf8judemjwjqfy/JPG.jpg</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536347883611</DateTimeUTC>
      <UserFileName>TIFF.tif</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/7n8rz76dk3n88ydfzh5d7fny4r/y98tisdykbrmuk8krd7uzbfhyo/TIFF.tif</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536347883611</DateTimeUTC>
      <UserFileName>car.svg</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/7n8rz76dk3n88ydfzh5d7fny4r/p7y3bnmaq7dnfnf1egz57mwwxr/car.svg</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536347917767</DateTimeUTC>
      <Content>File preview mixer pack 3</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536347917767</DateTimeUTC>
      <UserFileName>AVI.avi</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/7n8rz76dk3n88ydfzh5d7fny4r/f7k4bkzcpbbb8bmrtzbzwoyg3h/AVI.avi</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536347917767</DateTimeUTC>
      <UserFileName>MOV.mov</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/7n8rz76dk3n88ydfzh5d7fny4r/ewn6obscu3y6bx6nk45hxus7ny/MOV.mov</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536347917767</DateTimeUTC>
      <UserFileName>MP4.mp4</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/7n8rz76dk3n88ydfzh5d7fny4r/xwwgeapgtbnb3gni6uq77xbcsh/MP4.mp4</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536347917767</DateTimeUTC>
      <UserFileName>AVI.avi</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/7n8rz76dk3n88ydfzh5d7fny4r/f7k4bkzcpbbb8bmrtzbzwoyg3h/AVI.avi</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536347917767</DateTimeUTC>
      <UserFileName>MOV.mov</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/7n8rz76dk3n88ydfzh5d7fny4r/ewn6obscu3y6bx6nk45hxus7ny/MOV.mov</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536347917767</DateTimeUTC>
      <UserFileName>MP4.mp4</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/7n8rz76dk3n88ydfzh5d7fny4r/xwwgeapgtbnb3gni6uq77xbcsh/MP4.mp4</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536350184504</DateTimeUTC>
      <Content>PDF post</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536350184504</DateTimeUTC>
      <UserFileName>bgq64rshz3brfeuf3zi6ixm9fr-PDF.pdf</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/ytj99mb1tbgfmpzzcnzw734tdo/dgn6huyyrbn7xqn6gm5kmitqqa/bgq64rshz3brfeuf3zi6ixm9fr-PDF.pdf</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536350184504</DateTimeUTC>
      <UserFileName>bgq64rshz3brfeuf3zi6ixm9fr-PDF.pdf</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/ytj99mb1tbgfmpzzcnzw734tdo/dgn6huyyrbn7xqn6gm5kmitqqa/bgq64rshz3brfeuf3zi6ixm9fr-PDF.pdf</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536350246364</DateTimeUTC>
      <Content>Post again</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536350246364</DateTimeUTC>
      <UserFileName>IMG_0146.JPG</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/ytj99mb1tbgfmpzzcnzw734tdo/huxnktj36j85pp1mnf39eyp1bc/IMG_0146.JPG</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536350246364</DateTimeUTC>
      <UserFileName>IMG_0146.JPG</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/ytj99mb1tbgfmpzzcnzw734tdo/huxnktj36j85pp1mnf39eyp1bc/IMG_0146.JPG</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536350523887</DateTimeUTC>
      <Content>Yaris Manual</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536350523887</DateTimeUTC>
      <UserFileName>2009 Toyota Yaris Sedan Owners Manual.pdf</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/7n8rz76dk3n88ydfzh5d7fny4r/rhr7tc7rd3dmp849adaiskq7yo/2009 Toyota Yaris Sedan Owners Manual.pdf</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536350523887</DateTimeUTC>
      <UserFileName>2009 Toyota Yaris Sedan Owners Manual.pdf</UserFileName>
      <FileName>20180907/teams/noteam/channels/85mmqno3ujgc8q9sxuhuird3ic/users/7n8rz76dk3n88ydfzh5d7fny4r/rhr7tc7rd3dmp849adaiskq7yo/2009 Toyota Yaris Sedan Owners Manual.pdf</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536471525294</DateTimeUTC>
      <Content>~dkh-test-chan-2 </Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536471678805</DateTimeUTC>
      <Content>~dkh-channel-1 </Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1537968167940</DateTimeUTC>
      <Content>:kissing_smiling_eyes: </Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1537968176601</DateTimeUTC>
      <Content>blah :+1: </Content>
    </Message>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1537968176601</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1537968176601</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1537968176601</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+05072018-c@mattermost.com</LoginName>
      <DateTimeUTC>1537968176601</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+dkhlogintest@mattermost.com</LoginName>
      <DateTimeUTC>1537968176601</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+dkhtsetuser01@mattermost.com</LoginName>
      <DateTimeUTC>1537968176601</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+dkhuser10@mattermost.com</LoginName>
      <DateTimeUTC>1537968176601</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan.haussermann@mattermost.com</LoginName>
      <DateTimeUTC>1537968176601</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1537968176601</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1537968176601</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+1rae4yficinqffw3ygypqf35nhsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1537968176601</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4j6oifu37pr5dmdtpp48jmqteesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1537968176601</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+9phitiyni3n9zyqtyn7qe7gzhesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1537968176601</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+k163actt7fynpexxp37r1d8rkcsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1537968176601</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+mmcu65jphfgktruyhiu734t9bwsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1537968176601</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+qzkhdqezoi84jgxyroegmhwqcrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1537968176601</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+zw3aekuaaffs5c5wnncjq5ag3hsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1537968176601</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1537968176601</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="lindy test">
    <RoomID>private - bnzgeo6m33yypg1sise3mtqdha</RoomID>
    <StartTimeUTC>1537898113498</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>lindy+ms@mattermost.com</LoginName>
      <DateTimeUTC>1537897615681</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindy+ms@mattermost.com</LoginName>
      <DateTimeUTC>1537898113498</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>lindy+ms@mattermost.com</LoginName>
      <DateTimeUTC>1537898113498</DateTimeUTC>
      <UserFileName>Screenshot_20180925-195444.png</UserFileName>
      <FileName>20180925/teams/noteam/channels/bnzgeo6m33yypg1sise3mtqdha/users/sn151et61jn9t8dz9bu643jj5y/5swh88sjj38yzy1buucucys6da/Screenshot_20180925-195444.png</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>lindy+ms@mattermost.com</LoginName>
      <DateTimeUTC>1537898113498</DateTimeUTC>
      <UserFileName>Screenshot_20180925-195444.png</UserFileName>
      <FileName>20180925/teams/noteam/channels/bnzgeo6m33yypg1sise3mtqdha/users/sn151et61jn9t8dz9bu643jj5y/5swh88sjj38yzy1buucucys6da/Screenshot_20180925-195444.png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <ParticipantLeft>
      <LoginName>lindy+ms@mattermost.com</LoginName>
      <DateTimeUTC>1537898113498</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1537898113498</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Off-Topic">
    <RoomID>public - tje5wu5trbr9zy7ddf8oxoo5mc</RoomID>
    <StartTimeUTC>1538730804591</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1518203735452</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1523472609329</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy+test@mattermost.com</LoginName>
      <DateTimeUTC>1523601145475</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1525804366648</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1527840643940</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+aqhc4uqjzjru383wnyx1jt5kgwsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1533109628370</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1538730804591</DateTimeUTC>
      <Content>@here</Content>
    </Message>
    <Message>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1538731121101</DateTimeUTC>
      <Content>test</Content>
    </Message>
    <Message>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1538731310710</DateTimeUTC>
      <Content>hello</Content>
    </Message>
    <Message>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1538731349328</DateTimeUTC>
      <Content>test</Content>
    </Message>
    <Message>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1538731532526</DateTimeUTC>
      <Content>@lindy</Content>
    </Message>
    <Message>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1538732035577</DateTimeUTC>
      <Content>hello</Content>
    </Message>
    <Message>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1538733836472</DateTimeUTC>
      <Content>hello</Content>
    </Message>
    <Message>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1539072732098</DateTimeUTC>
      <Content>@lindy </Content>
    </Message>
    <Message>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1539245903024</DateTimeUTC>
      <Content>hello @lindy</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1539245903024</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1539245903024</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1539245903024</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy+test@mattermost.com</LoginName>
      <DateTimeUTC>1539245903024</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1539245903024</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+aqhc4uqjzjru383wnyx1jt5kgwsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539245903024</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1539245903024</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Town Square">
    <RoomID>public - huwqcob6k7bs7fq1bn4kzr31ua</RoomID>
    <StartTimeUTC>1538750520747</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>joram+8@mattermost.com</LoginName>
      <DateTimeUTC>1538750409253</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>joram@mattermost.com</LoginName>
      <DateTimeUTC>1538750520747</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>joram@mattermost.com</LoginName>
      <DateTimeUTC>1538750520747</DateTimeUTC>
      <Content>sup</Content>
    </Message>
    <Message>
      <LoginName>joram@mattermost.com</LoginName>
      <DateTimeUTC>1538750522461</DateTimeUTC>
      <Content>@joram8 </Content>
    </Message>
    <Message>
      <LoginName>joram+8@mattermost.com</LoginName>
      <DateTimeUTC>1538751544040</DateTimeUTC>
      <Content>Joram</Content>
    </Message>
    <Message>
      <LoginName>joram+8@mattermost.com</LoginName>
      <DateTimeUTC>1538751566186</DateTimeUTC>
      <Content>Joram</Content>
    </Message>
    <Message>
      <LoginName>joram+8@mattermost.com</LoginName>
      <DateTimeUTC>1538751589457</DateTimeUTC>
      <Content>joram</Content>
    </Message>
    <Message>
      <LoginName>joram+8@mattermost.com</LoginName>
      <DateTimeUTC>1538751595681</DateTimeUTC>
      <Content>joram</Content>
    </Message>
    <Message>
      <LoginName>joram+8@mattermost.com</LoginName>
      <DateTimeUTC>1538751657982</DateTimeUTC>
      <Content>@channel </Content>
    </Message>
    <Message>
      <LoginName>joram@mattermost.com</LoginName>
      <DateTimeUTC>1538751718387</DateTimeUTC>
      <Content>yo</Content>
    </Message>
    <Message>
      <LoginName>joram+8@mattermost.com</LoginName>
      <DateTimeUTC>1538751723774</DateTimeUTC>
      <Content>sup</Content>
    </Message>
    <Message>
      <LoginName>joram+8@mattermost.com</LoginName>
      <DateTimeUTC>1538751768644</DateTimeUTC>
      <Content>my dude</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>joram+8@mattermost.com</LoginName>
      <DateTimeUTC>1538751768644</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>joram@mattermost.com</LoginName>
      <DateTimeUTC>1538751768644</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538751768644</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - w18onhb1bfyimprbranu7riogw</RoomID>
    <StartTimeUTC>1538936097237</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1523285974257</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1523285974262</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538936097237</DateTimeUTC>
      <Content>@jason </Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538936596094</DateTimeUTC>
      <Content>hey</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538937023054</DateTimeUTC>
      <Content>:wave:</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538937080377</DateTimeUTC>
      <Content>ha</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538937086307</DateTimeUTC>
      <Content>ha</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538937092834</DateTimeUTC>
      <Content>h</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538937096541</DateTimeUTC>
      <Content>ha</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538937107320</DateTimeUTC>
      <Content>ha</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538937157279</DateTimeUTC>
      <Content>ha</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538937164072</DateTimeUTC>
      <Content>ha</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538937171237</DateTimeUTC>
      <Content>ha</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538937205075</DateTimeUTC>
      <Content>ha</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538937215425</DateTimeUTC>
      <Content>ha</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538937221513</DateTimeUTC>
      <Content>ha</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538937221880</DateTimeUTC>
      <Content>ha</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538937227431</DateTimeUTC>
      <Content>ha</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538937227862</DateTimeUTC>
      <Content>ha</Content>
    </Message>
    <Message>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1538937279133</DateTimeUTC>
      <Content>Hey</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538937337052</DateTimeUTC>
      <Content>heyy</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538937337052</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1538937337052</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538937337052</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="new test">
    <RoomID>public - 13xat3wsatnfmxr9p4arfa1tbw</RoomID>
    <StartTimeUTC>1534228368857</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1533538906678</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1533538947227</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1534228368857</DateTimeUTC>
      <Content>post</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1534228368857</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1534228368857</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1534228368857</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Town Square">
    <RoomID>public - 9t3r8jyp93ye7qtyxo5uukuigh</RoomID>
    <StartTimeUTC>1535582552689</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>linda+and8oct@mattermost.com</LoginName>
      <DateTimeUTC>1535582530251</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>linda+and8oct@mattermost.com</LoginName>
      <DateTimeUTC>1535582552689</DateTimeUTC>
      <Content>Here&#39;s some history for linda-onelogin.</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>linda+and8oct@mattermost.com</LoginName>
      <DateTimeUTC>1535582552689</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1535582552689</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Group Message">
    <RoomID>group - kiy1nuxmjjdufcdizpo7qqkhwc</RoomID>
    <StartTimeUTC>1536167032891</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536165716434</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+zw3aekuaaffs5c5wnncjq5ag3hsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536165716451</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+qzkhdqezoi84jgxyroegmhwqcrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536165716472</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+mmcu65jphfgktruyhiu734t9bwsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536165716489</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+4j6oifu37pr5dmdtpp48jmqteesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536165716505</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+1rae4yficinqffw3ygypqf35nhsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536165716520</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+k163actt7fynpexxp37r1d8rkcsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536165716536</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1536165716557</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1536167032891</DateTimeUTC>
      <Content>m&#xA;</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1536167032891</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536167032891</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+1rae4yficinqffw3ygypqf35nhsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536167032891</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4j6oifu37pr5dmdtpp48jmqteesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536167032891</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+k163actt7fynpexxp37r1d8rkcsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536167032891</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+mmcu65jphfgktruyhiu734t9bwsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536167032891</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+qzkhdqezoi84jgxyroegmhwqcrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536167032891</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+zw3aekuaaffs5c5wnncjq5ag3hsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536167032891</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536167032891</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - kbcjufrf9jy7ujy1h8kyst65uc</RoomID>
    <StartTimeUTC>1538675722952</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538675707104</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+4mnry4pjxpnrpxbhw3ez1f1snasimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538675707111</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538675722952</DateTimeUTC>
      <Content>post</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538675722952</DateTimeUTC>
      <Content>postabc</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538675722952</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4mnry4pjxpnrpxbhw3ez1f1snasimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538675722952</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538675722952</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - 1qjpfxfnkirrpda3i3oky9njma</RoomID>
    <StartTimeUTC>1538751428677</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>joram+8@mattermost.com</LoginName>
      <DateTimeUTC>1538751428677</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>joram+8@mattermost.com</LoginName>
      <DateTimeUTC>1538751428677</DateTimeUTC>
      <Content>yo</Content>
    </Message>
    <Message>
      <LoginName>joram+8@mattermost.com</LoginName>
      <DateTimeUTC>1538751450974</DateTimeUTC>
      <Content>yo</Content>
    </Message>
    <Message>
      <LoginName>joram+8@mattermost.com</LoginName>
      <DateTimeUTC>1538751479115</DateTimeUTC>
      <Content>yo</Content>
    </Message>
    <Message>
      <LoginName>joram+8@mattermost.com</LoginName>
      <DateTimeUTC>1538751497977</DateTimeUTC>
      <Content>yo</Content>
    </Message>
    <Message>
      <LoginName>joram+8@mattermost.com</LoginName>
      <DateTimeUTC>1538751539281</DateTimeUTC>
      <Content>Joram</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>joram+8@mattermost.com</LoginName>
      <DateTimeUTC>1538751539281</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538751539281</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Off-Topic">
    <RoomID>public - 9udu1mj5kiyabqhwah8xz3bcrc</RoomID>
    <StartTimeUTC>1534203306417</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>linda+mysql@mattermost.com</LoginName>
      <DateTimeUTC>1522717759827</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+onel8may@mattermost.com</LoginName>
      <DateTimeUTC>1522717777473</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+whatever@mattermost.com</LoginName>
      <DateTimeUTC>1522991163238</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+8may@mattermost.com</LoginName>
      <DateTimeUTC>1523435226577</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+test.one@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1524793030048</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+12jun@mattermost.com</LoginName>
      <DateTimeUTC>1525834803252</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+onel@mattermost.com</LoginName>
      <DateTimeUTC>1525836123895</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+email@mattermost.com</LoginName>
      <DateTimeUTC>1527871931784</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+nonadmin@mattermost.com</LoginName>
      <DateTimeUTC>1527871959565</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+admin@mattermost.com</LoginName>
      <DateTimeUTC>1527888376134</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+9jul@mattermost.com</LoginName>
      <DateTimeUTC>1528851555835</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+changed2@mattermost.com</LoginName>
      <DateTimeUTC>1530853160298</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+7aug@mattermost.com</LoginName>
      <DateTimeUTC>1531181585650</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+nope@mattermost.com</LoginName>
      <DateTimeUTC>1531197503461</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+0000@mattermost.com</LoginName>
      <DateTimeUTC>1533708674926</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>linda+email@mattermost.com</LoginName>
      <DateTimeUTC>1534203306417</DateTimeUTC>
      <Content>@lindamitchell hihi</Content>
    </Message>
    <Message>
      <LoginName>linda+email@mattermost.com</LoginName>
      <DateTimeUTC>1534203347763</DateTimeUTC>
      <Content>@lindamitchell hihi</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>linda+0000@mattermost.com</LoginName>
      <DateTimeUTC>1534203347763</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+12jun@mattermost.com</LoginName>
      <DateTimeUTC>1534203347763</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+7aug@mattermost.com</LoginName>
      <DateTimeUTC>1534203347763</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+8may@mattermost.com</LoginName>
      <DateTimeUTC>1534203347763</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+9jul@mattermost.com</LoginName>
      <DateTimeUTC>1534203347763</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+admin@mattermost.com</LoginName>
      <DateTimeUTC>1534203347763</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+changed2@mattermost.com</LoginName>
      <DateTimeUTC>1534203347763</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+email@mattermost.com</LoginName>
      <DateTimeUTC>1534203347763</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+mysql@mattermost.com</LoginName>
      <DateTimeUTC>1534203347763</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+nonadmin@mattermost.com</LoginName>
      <DateTimeUTC>1534203347763</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+nope@mattermost.com</LoginName>
      <DateTimeUTC>1534203347763</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+onel8may@mattermost.com</LoginName>
      <DateTimeUTC>1534203347763</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+onel@mattermost.com</LoginName>
      <DateTimeUTC>1534203347763</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+whatever@mattermost.com</LoginName>
      <DateTimeUTC>1534203347763</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+test.one@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1534203347763</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1534203347763</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Newchannel">
    <RoomID>private - u8bhtmxk83g6fn6oz6n814frxr</RoomID>
    <StartTimeUTC>1536173733053</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>lindsay@mattermost.com</LoginName>
      <DateTimeUTC>1536173564195</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindsay+abc@mattermost.com</LoginName>
      <DateTimeUTC>1536173709249</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1536173728370</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1536173733053</DateTimeUTC>
      <Content>post</Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1536173737303</DateTimeUTC>
      <Content>@lindsay </Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1536186332813</DateTimeUTC>
      <Content>lindsay</Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1536186336695</DateTimeUTC>
      <Content>Lindsay</Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1536186373374</DateTimeUTC>
      <Content>lindsay</Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1536186376149</DateTimeUTC>
      <Content>@lindsay </Content>
    </Message>
    <Message>
      <LoginName>lindsay@mattermost.com</LoginName>
      <DateTimeUTC>1536186406565</DateTimeUTC>
      <Content>post</Content>
    </Message>
    <Message>
      <LoginName>lindsay@mattermost.com</LoginName>
      <DateTimeUTC>1536186410036</DateTimeUTC>
      <Content>reply</Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1536186416863</DateTimeUTC>
      <Content>pst</Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1536186435136</DateTimeUTC>
      <Content>reply</Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1536186438984</DateTimeUTC>
      <Content>reply</Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1536186445095</DateTimeUTC>
      <Content>reply</Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1537984451720</DateTimeUTC>
      <Content>post</Content>
    </Message>
    <Message>
      <LoginName>lindsay+abc@mattermost.com</LoginName>
      <DateTimeUTC>1538675349019</DateTimeUTC>
      <Content>@alindsay </Content>
    </Message>
    <ParticipantLeft>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1537984468676</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindsay+abc@mattermost.com</LoginName>
      <DateTimeUTC>1538675349019</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindsay@mattermost.com</LoginName>
      <DateTimeUTC>1538675349019</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538675349019</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Town Square">
    <RoomID>public - ipimjiyow7nbmb1qxg8ancxade</RoomID>
    <StartTimeUTC>1536173856549</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1520556786467</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>alice+1@mattermost.com</LoginName>
      <DateTimeUTC>1526335776969</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>alice+3@mattermost.com</LoginName>
      <DateTimeUTC>1526335777053</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>alice+4@mattermost.com</LoginName>
      <DateTimeUTC>1526335777139</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1526335777229</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>alice+5@mattermost.com</LoginName>
      <DateTimeUTC>1526335777315</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>alice+6@mattermost.com</LoginName>
      <DateTimeUTC>1526335777403</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>alice+7@mattermost.com</LoginName>
      <DateTimeUTC>1526335777490</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>alice+8@mattermost.com</LoginName>
      <DateTimeUTC>1526335777583</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>bopeng101@mattermost.com</LoginName>
      <DateTimeUTC>1526335777685</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>conrad@mattermost.com</LoginName>
      <DateTimeUTC>1526335777882</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>corey@mattermost.com</LoginName>
      <DateTimeUTC>1526335777969</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dmaas@mattermost.com</LoginName>
      <DateTimeUTC>1526335778058</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>vfxart.ds@mattermost.com</LoginName>
      <DateTimeUTC>1526335778144</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dickie@mattermost.com</LoginName>
      <DateTimeUTC>1526335778231</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>doo@mattermost.com</LoginName>
      <DateTimeUTC>1526335778317</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>earl@mattermost.com</LoginName>
      <DateTimeUTC>1526335778409</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>gaurav@mattermost.com</LoginName>
      <DateTimeUTC>1526335778600</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>github@example.com</LoginName>
      <DateTimeUTC>1526335778684</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1526335778772</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>saxah.jean@mattermost.com</LoginName>
      <DateTimeUTC>1526335779063</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>combs05@mattermost.com</LoginName>
      <DateTimeUTC>1526335779154</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>joseph@mattermost.com</LoginName>
      <DateTimeUTC>1526335779349</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>kelvinshiu@mattermost.com</LoginName>
      <DateTimeUTC>1526335779438</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lee@mattermost.com</LoginName>
      <DateTimeUTC>1526335779523</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lf.brock@mattermost.com</LoginName>
      <DateTimeUTC>1526335779614</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1526335779701</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>richy@mattermost.com</LoginName>
      <DateTimeUTC>1526335779804</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>will@mattermost.com</LoginName>
      <DateTimeUTC>1526335779891</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>slackimportuser_q4ch3rqcqidu3mhawopm6753wc@localhost</LoginName>
      <DateTimeUTC>1526335780098</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais+5@mattermost.com</LoginName>
      <DateTimeUTC>1528473475785</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>martin+test6@mattermost.com</LoginName>
      <DateTimeUTC>1528720180120</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>michael.gamble@mattermost.com</LoginName>
      <DateTimeUTC>1528736645779</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>mike@mattermost.com</LoginName>
      <DateTimeUTC>1528736928218</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+dkh-teamjoinuser@mattermost.com</LoginName>
      <DateTimeUTC>1529433231312</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais+10@mattermost.com</LoginName>
      <DateTimeUTC>1529948728346</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1531240649321</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+mysql@mattermost.com</LoginName>
      <DateTimeUTC>1534438742863</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>carlos@mattermost.com</LoginName>
      <DateTimeUTC>1535558535302</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1536106109076</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>mike@mattermost.com</LoginName>
      <DateTimeUTC>1536173856549</DateTimeUTC>
      <Content>test</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536176123881</DateTimeUTC>
      <Content>@ALL</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536176151767</DateTimeUTC>
      <Content>@channEL</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536176162495</DateTimeUTC>
      <Content>@Here</Content>
    </Message>
    <Message>
      <LoginName>mike@mattermost.com</LoginName>
      <DateTimeUTC>1536176189266</DateTimeUTC>
      <Content>test</Content>
    </Message>
    <Message>
      <LoginName>mike@mattermost.com</LoginName>
      <DateTimeUTC>1536176212665</DateTimeUTC>
      <Content>test</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181135676</DateTimeUTC>
      <Content>reply message</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181237459</DateTimeUTC>
      <Content>@channel hey</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181299565</DateTimeUTC>
      <Content>asdfasdf</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181300284</DateTimeUTC>
      <Content>asdfasdf</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181300629</DateTimeUTC>
      <Content>asdf</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181300972</DateTimeUTC>
      <Content>asdf</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181301196</DateTimeUTC>
      <Content>asdf</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181301388</DateTimeUTC>
      <Content>asd</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181301563</DateTimeUTC>
      <Content>fa</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181301733</DateTimeUTC>
      <Content>sdf</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181301954</DateTimeUTC>
      <Content>asdf</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181302144</DateTimeUTC>
      <Content>asdf</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181302373</DateTimeUTC>
      <Content>asd</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181302592</DateTimeUTC>
      <Content>fas</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181302774</DateTimeUTC>
      <Content>df</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181302967</DateTimeUTC>
      <Content>asdf</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181303733</DateTimeUTC>
      <Content>asdf]asdf]asdf</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181303923</DateTimeUTC>
      <Content>asdf</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181304132</DateTimeUTC>
      <Content>adsf</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181304330</DateTimeUTC>
      <Content>asdf</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181304536</DateTimeUTC>
      <Content>asdf</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181304713</DateTimeUTC>
      <Content>a</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181304885</DateTimeUTC>
      <Content>sdf</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181305072</DateTimeUTC>
      <Content>asdf</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181305327</DateTimeUTC>
      <Content>asdf</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181305534</DateTimeUTC>
      <Content>asd</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181305716</DateTimeUTC>
      <Content>f</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181305895</DateTimeUTC>
      <Content>asdf</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181306068</DateTimeUTC>
      <Content>asdf</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181306261</DateTimeUTC>
      <Content>asdf</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181306486</DateTimeUTC>
      <Content>a</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181306631</DateTimeUTC>
      <Content>sdf</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181306810</DateTimeUTC>
      <Content>asdf</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181306969</DateTimeUTC>
      <Content>asd</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181307204</DateTimeUTC>
      <Content>f</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181307430</DateTimeUTC>
      <Content>asdf</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181307625</DateTimeUTC>
      <Content>adf</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181307813</DateTimeUTC>
      <Content>a</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181308066</DateTimeUTC>
      <Content>dsf</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181308267</DateTimeUTC>
      <Content>asdf</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181308417</DateTimeUTC>
      <Content>asdf</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181308564</DateTimeUTC>
      <Content>asd</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>alice+1@mattermost.com</LoginName>
      <DateTimeUTC>1536181308564</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>alice+3@mattermost.com</LoginName>
      <DateTimeUTC>1536181308564</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>alice+4@mattermost.com</LoginName>
      <DateTimeUTC>1536181308564</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>alice+5@mattermost.com</LoginName>
      <DateTimeUTC>1536181308564</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>alice+6@mattermost.com</LoginName>
      <DateTimeUTC>1536181308564</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>alice+7@mattermost.com</LoginName>
      <DateTimeUTC>1536181308564</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>alice+8@mattermost.com</LoginName>
      <DateTimeUTC>1536181308564</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1536181308564</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy.blais+10@mattermost.com</LoginName>
      <DateTimeUTC>1536181308564</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy.blais+5@mattermost.com</LoginName>
      <DateTimeUTC>1536181308564</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1536181308564</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>bopeng101@mattermost.com</LoginName>
      <DateTimeUTC>1536181308564</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181308564</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>carlos@mattermost.com</LoginName>
      <DateTimeUTC>1536181308564</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>combs05@mattermost.com</LoginName>
      <DateTimeUTC>1536181308564</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>conrad@mattermost.com</LoginName>
      <DateTimeUTC>1536181308564</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>corey@mattermost.com</LoginName>
      <DateTimeUTC>1536181308564</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dickie@mattermost.com</LoginName>
      <DateTimeUTC>1536181308564</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dmaas@mattermost.com</LoginName>
      <DateTimeUTC>1536181308564</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>doo@mattermost.com</LoginName>
      <DateTimeUTC>1536181308564</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+dkh-teamjoinuser@mattermost.com</LoginName>
      <DateTimeUTC>1536181308564</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>earl@mattermost.com</LoginName>
      <DateTimeUTC>1536181308564</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>gaurav@mattermost.com</LoginName>
      <DateTimeUTC>1536181308564</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>github@example.com</LoginName>
      <DateTimeUTC>1536181308564</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1536181308564</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>joseph@mattermost.com</LoginName>
      <DateTimeUTC>1536181308564</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>kelvinshiu@mattermost.com</LoginName>
      <DateTimeUTC>1536181308564</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lee@mattermost.com</LoginName>
      <DateTimeUTC>1536181308564</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lf.brock@mattermost.com</LoginName>
      <DateTimeUTC>1536181308564</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+mysql@mattermost.com</LoginName>
      <DateTimeUTC>1536181308564</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536181308564</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536181308564</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>martin+test6@mattermost.com</LoginName>
      <DateTimeUTC>1536181308564</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>michael.gamble@mattermost.com</LoginName>
      <DateTimeUTC>1536181308564</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>mike@mattermost.com</LoginName>
      <DateTimeUTC>1536181308564</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>richy@mattermost.com</LoginName>
      <DateTimeUTC>1536181308564</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>saxah.jean@mattermost.com</LoginName>
      <DateTimeUTC>1536181308564</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>slackimportuser_q4ch3rqcqidu3mhawopm6753wc@localhost</LoginName>
      <DateTimeUTC>1536181308564</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>vfxart.ds@mattermost.com</LoginName>
      <DateTimeUTC>1536181308564</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>will@mattermost.com</LoginName>
      <DateTimeUTC>1536181308564</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536181308564</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Bchannel">
    <RoomID>public - 4yfy9ygigtnzd8kj5x1xipfbah</RoomID>
    <StartTimeUTC>1536192793005</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1530882489642</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1530893809625</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536192793005</DateTimeUTC>
      <Content>posting a message</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1536192793005</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536192793005</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536192793005</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="private j">
    <RoomID>private - 6nwdoieqnf8rdm8y7mrk56cnac</RoomID>
    <StartTimeUTC>1536193038848</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1530893770669</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1530893893083</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536193038848</DateTimeUTC>
      <Content>hjlkjh</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1536193038848</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536193038848</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536193038848</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="martintest1">
    <RoomID>public - g1pwehsuiifj5mts1t5iopr15o</RoomID>
    <StartTimeUTC>1538420710037</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1527853177476</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1533750547229</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+jr4x57ogj3re383o7ntek9atse@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1533751674219</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+7hmez5xzrfy1u8oze83apk33ta@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1533751674224</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+xskoj8s9h3gyz8rxqykhxsu7hh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1533751765815</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+yhjzab185bbyxdbrds4yes4kro@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1533751765817</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+sfjjdebowbgk5ddrueiopckmtw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1533751765818</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+qd5fu7ixmirsxbjpuk5wdmtz1w@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1533751765822</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+k793mwzrmbgc5rwduyt8q1awqo@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1533753195228</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538420710037</DateTimeUTC>
      <Content>new</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538420710037</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1538420710037</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+7hmez5xzrfy1u8oze83apk33ta@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538420710037</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+jr4x57ogj3re383o7ntek9atse@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538420710037</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+k793mwzrmbgc5rwduyt8q1awqo@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538420710037</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+qd5fu7ixmirsxbjpuk5wdmtz1w@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538420710037</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+sfjjdebowbgk5ddrueiopckmtw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538420710037</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+xskoj8s9h3gyz8rxqykhxsu7hh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538420710037</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+yhjzab185bbyxdbrds4yes4kro@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538420710037</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538420710037</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Search tests">
    <RoomID>public - ypdyfzeq7ir45f68aykk4ixf3h</RoomID>
    <StartTimeUTC>1538759852919</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538759848586</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538759852919</DateTimeUTC>
      <Content># Search Testing&#xA;&#xA;### Basic Search Testing&#xA;&#xA;This post is used by the core team to test search. It should be returned for the test cases for search, with proper highlighting in the search results. &#xA;&#xA;**Basic word search:** Hello world!  &#xA;**Emoji search:** :strawberry:  &#xA;**Accent search:** Crème fraîche  &#xA;**Non-latin search:**  &#xA;您好吗  &#xA;您好  &#xA;**Email search:** person@domain.org  &#xA;**Link search:** www.dropbox.com  &#xA;**Markdown search:**  &#xA;##### Hello  &#xA;```  &#xA;Hello  &#xA;```  &#xA;`Hello`  &#xA;&#xA;&#xA;### Hashtags:&#xA;&#xA;Click on the linked hashtags below, and confirm that the search results match the linked hashtags. Confirm that the highlighting in the search results is correct. &#xA;&#xA;#### Basic Hashtags&#xA;&#xA;#hello #world&#xA;&#xA;#### Hashtags containing punctuation:&#xA;&#xA;*Note: Make a separate post containing only the word “hashtag”, and confirm the hashtags below do not return the separate post.*&#xA;&#xA;#hashtag #hashtag-dash #hashtag_underscore #hashtag.dot&#xA;&#xA;#### Punctuation following a hashtag:&#xA;&#xA;#colon: #slash/ #backslash\ #percent% #dollar$ #semicolon; #ampersand&amp;  #bracket( #bracket) #lessthan&lt; #greaterthan&gt; #dash- #plus+ #equals=  #caret^ #hashtag# #asterisk* #verticalbar| #invertedquestion¿ #atsign@ #quote” #apostrophe&#39; #curlybracket{ #curlybracket} #squarebracket[ #squarebracket] &#xA;&#xA;#### Markdown surrounding a hashtag:&#xA;&#xA;*#markdown* **#markdown** ~~#markdown~~&#xA;##### #markdown&#xA;&#xA;#### Accents and non-Latin characters in a hashtag:&#xA;&#xA;#crèmeglacée #테스트&#xA;</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538759870274</DateTimeUTC>
      <Content>do you know a tool for detecting SQLi in a whole website¿? I mean, I want it to crawl it and then just test a few payloads (&#39;, %27, waitfor delay &#39;0:0:05&#39;) , and detect which URL, parameter is vulnerable. Best thing I found is this thing https://nmap.org/nsedoc/scripts/http-sql-injection.html but doesn&#39;t work like a charm</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760303547</DateTimeUTC>
      <Content>@here </Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760306076</DateTimeUTC>
      <Content>@channel </Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760307982</DateTimeUTC>
      <Content>@all </Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760674325</DateTimeUTC>
      <Content>a</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760674544</DateTimeUTC>
      <Content>b</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760674729</DateTimeUTC>
      <Content>c</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760674914</DateTimeUTC>
      <Content>d</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760675103</DateTimeUTC>
      <Content>e</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760675294</DateTimeUTC>
      <Content>f</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760675525</DateTimeUTC>
      <Content>g</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760675718</DateTimeUTC>
      <Content>h</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760676188</DateTimeUTC>
      <Content>i</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760676501</DateTimeUTC>
      <Content>j</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760676771</DateTimeUTC>
      <Content>k</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760676981</DateTimeUTC>
      <Content>l</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760677182</DateTimeUTC>
      <Content>m</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760677418</DateTimeUTC>
      <Content>n</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760677682</DateTimeUTC>
      <Content>o</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760677899</DateTimeUTC>
      <Content>p</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760678224</DateTimeUTC>
      <Content>q</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760678629</DateTimeUTC>
      <Content>r</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760679033</DateTimeUTC>
      <Content>s</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760679289</DateTimeUTC>
      <Content>t</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760679531</DateTimeUTC>
      <Content>u</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760679776</DateTimeUTC>
      <Content>v</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760680275</DateTimeUTC>
      <Content>w</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760680657</DateTimeUTC>
      <Content>x</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760680921</DateTimeUTC>
      <Content>y</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760681153</DateTimeUTC>
      <Content>z</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760681581</DateTimeUTC>
      <Content>a</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760681848</DateTimeUTC>
      <Content>b</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760682085</DateTimeUTC>
      <Content>c</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760682476</DateTimeUTC>
      <Content>d</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760682742</DateTimeUTC>
      <Content>e</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760682979</DateTimeUTC>
      <Content>f</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760683231</DateTimeUTC>
      <Content>g</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760683668</DateTimeUTC>
      <Content>h</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760683996</DateTimeUTC>
      <Content>i</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760684318</DateTimeUTC>
      <Content>j</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760684568</DateTimeUTC>
      <Content>k</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760684885</DateTimeUTC>
      <Content>l</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760685291</DateTimeUTC>
      <Content>m</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760685514</DateTimeUTC>
      <Content>n</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760685860</DateTimeUTC>
      <Content>o</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760686103</DateTimeUTC>
      <Content>p</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760686493</DateTimeUTC>
      <Content>q</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760687510</DateTimeUTC>
      <Content>r</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760687765</DateTimeUTC>
      <Content>s</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760688073</DateTimeUTC>
      <Content>t</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760688306</DateTimeUTC>
      <Content>u</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760688576</DateTimeUTC>
      <Content>v</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760689001</DateTimeUTC>
      <Content>w</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760689642</DateTimeUTC>
      <Content>x</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760690081</DateTimeUTC>
      <Content>y</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760690643</DateTimeUTC>
      <Content>z</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760690643</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538760690643</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Town Square">
    <RoomID>public - wm5trjekcfdsjn85dtf55bghbc</RoomID>
    <StartTimeUTC>1536181064690</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>michael.gamble@mattermost.com</LoginName>
      <DateTimeUTC>1528736656520</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>mike@mattermost.com</LoginName>
      <DateTimeUTC>1528737018635</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181064690</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181064690</DateTimeUTC>
      <Content>@mikenew mention post</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536181064690</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>michael.gamble@mattermost.com</LoginName>
      <DateTimeUTC>1536181064690</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>mike@mattermost.com</LoginName>
      <DateTimeUTC>1536181064690</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536181064690</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="A Channel">
    <RoomID>public - jgx8nqbktirtdyhauwtqruaz3y</RoomID>
    <StartTimeUTC>1536192778796</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1530882482105</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536192778796</DateTimeUTC>
      <Content>posting a message</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536192778796</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536192778796</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="private f">
    <RoomID>private - 1p1esouchif6jjbm1ji5jbniza</RoomID>
    <StartTimeUTC>1536193031516</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1530893719533</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1530893882787</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536193031516</DateTimeUTC>
      <Content>kjjh</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1536193031516</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536193031516</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536193031516</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="moit">
    <RoomID>private - 1ctnn4d71ff73dq1hti3y7ingh</RoomID>
    <StartTimeUTC>1536841311692</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1536841298286</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1536841311692</DateTimeUTC>
      <Content>moi</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1536841311692</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536841311692</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="random">
    <RoomID>public - y4n3oxingffopx3rornpqjexwa</RoomID>
    <StartTimeUTC>1538076586608</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>sweetkatiejo@example.com</LoginName>
      <DateTimeUTC>1533243779266</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>kwiersgalla@example.com</LoginName>
      <DateTimeUTC>1533243779286</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536192998471</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1538076586608</DateTimeUTC>
      <Content>test.test@test.com</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1538076590096</DateTimeUTC>
      <Content>test.test-test.com</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1538076590096</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>kwiersgalla@example.com</LoginName>
      <DateTimeUTC>1538076590096</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>sweetkatiejo@example.com</LoginName>
      <DateTimeUTC>1538076590096</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538076590096</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - zyzh6891ofn1tn9w73xz5pjfch</RoomID>
    <StartTimeUTC>1538759904824</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538759904824</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538759904824</DateTimeUTC>
      <Content>asdf</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538759906604</DateTimeUTC>
      <Content>ewr</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760261460</DateTimeUTC>
      <Content>ggg</Content>
    </Message>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760299700</DateTimeUTC>
      <Content>@harrison</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538760299700</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538760299700</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - rjwgh3qm9tbkbbf8sudz4ose7c</RoomID>
    <StartTimeUTC>1537397695044</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>amy.blais+8@mattermost.com</LoginName>
      <DateTimeUTC>1537397691925</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1537397691931</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>amy.blais+8@mattermost.com</LoginName>
      <DateTimeUTC>1537397695044</DateTimeUTC>
      <Content>h</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>amy.blais+8@mattermost.com</LoginName>
      <DateTimeUTC>1537397695044</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1537397695044</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1537397695044</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="aaaaaaaa">
    <RoomID>public - 1gmr7okefjbqbk7rb11iynadbr</RoomID>
    <StartTimeUTC>1538750736017</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1523283735922</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>george+48@mattermost.com</LoginName>
      <DateTimeUTC>1523283945919</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>joram@mattermost.com</LoginName>
      <DateTimeUTC>1538750689049</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>joram+8@mattermost.com</LoginName>
      <DateTimeUTC>1538750731745</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>joram+8@mattermost.com</LoginName>
      <DateTimeUTC>1538750736017</DateTimeUTC>
      <Content>sup</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1538750736017</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>george+48@mattermost.com</LoginName>
      <DateTimeUTC>1538750736017</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>joram+8@mattermost.com</LoginName>
      <DateTimeUTC>1538750736017</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>joram@mattermost.com</LoginName>
      <DateTimeUTC>1538750736017</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538750736017</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Group Message">
    <RoomID>group - zjp9f756y3yd5k6zehwag5191a</RoomID>
    <StartTimeUTC>1538769151205</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>martin+test2@mattermost.com</LoginName>
      <DateTimeUTC>1538769114040</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1538769114062</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>martin+release48-4@mattermost.com</LoginName>
      <DateTimeUTC>1538769114078</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1538769151205</DateTimeUTC>
      <Content>@martin.test2 </Content>
    </Message>
    <Message>
      <LoginName>martin+test2@mattermost.com</LoginName>
      <DateTimeUTC>1538769158694</DateTimeUTC>
      <Content>test</Content>
    </Message>
    <Message>
      <LoginName>martin+test2@mattermost.com</LoginName>
      <DateTimeUTC>1538769164713</DateTimeUTC>
      <Content>test2</Content>
    </Message>
    <Message>
      <LoginName>martin+test2@mattermost.com</LoginName>
      <DateTimeUTC>1538769191542</DateTimeUTC>
      <Content>@martin.test1 test3</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>martin+release48-4@mattermost.com</LoginName>
      <DateTimeUTC>1538769191542</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1538769191542</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>martin+test2@mattermost.com</LoginName>
      <DateTimeUTC>1538769191542</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538769191542</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Group Message">
    <RoomID>group - 9f4k17k5apbx7gpdujyc5g611e</RoomID>
    <StartTimeUTC>1539074407235</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>success+8n75ck3iw7yjimoodeamcutwmasimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538725269244</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy+13@mattermost.com</LoginName>
      <DateTimeUTC>1538725269262</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy+5@mattermost.com</LoginName>
      <DateTimeUTC>1538725269278</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1538725269295</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538725269311</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1538725269327</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1539074407235</DateTimeUTC>
      <Content>Hello</Content>
    </Message>
    <Message>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1539074429220</DateTimeUTC>
      <Content>hello lindy!</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1539074429220</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy+13@mattermost.com</LoginName>
      <DateTimeUTC>1539074429220</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1539074429220</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy+5@mattermost.com</LoginName>
      <DateTimeUTC>1539074429220</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1539074429220</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+8n75ck3iw7yjimoodeamcutwmasimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539074429220</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1539074429220</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - fkzwrqezk7nhmc7otr67efmcqo</RoomID>
    <StartTimeUTC>1535065291723</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1535065284354</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1535065284359</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1535065291723</DateTimeUTC>
      <Content>&gt;m&#xA;&gt;m&#xA;&gt;m</Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1535500517306</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1535500517306</DateTimeUTC>
      <UserFileName>test.jpg</UserFileName>
      <FileName>20180828/teams/noteam/channels/fkzwrqezk7nhmc7otr67efmcqo/users/ysjt6yesdjb6mx1de4u7wmnwow/d74zoe7eq3fruyaqbaasdcyoqc/test.jpg</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1535500517306</DateTimeUTC>
      <UserFileName>test.jpg</UserFileName>
      <FileName>20180828/teams/noteam/channels/fkzwrqezk7nhmc7otr67efmcqo/users/ysjt6yesdjb6mx1de4u7wmnwow/d74zoe7eq3fruyaqbaasdcyoqc/test.jpg</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <ParticipantLeft>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1535500517306</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1535500517306</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="asdfasdf">
    <RoomID>public - g3szhzprbjdqiebugahsay1yfa</RoomID>
    <StartTimeUTC>1538843858069</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1538767419217</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1538843671593</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+dkhuser10@mattermost.com</LoginName>
      <DateTimeUTC>1538843853475</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>dylan+dkhuser10@mattermost.com</LoginName>
      <DateTimeUTC>1538843858069</DateTimeUTC>
      <Content>post</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1538843858069</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+dkhuser10@mattermost.com</LoginName>
      <DateTimeUTC>1538843858069</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1538843858069</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538843858069</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Town Square">
    <RoomID>public - o343sfgywpgm58agjeuj518qfe</RoomID>
    <StartTimeUTC>1535103358665</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>saturnino+testing52@mattermost.com</LoginName>
      <DateTimeUTC>1533730997215</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>saturnino@mattermost.com</LoginName>
      <DateTimeUTC>1533731015164</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>saturnino@mattermost.com</LoginName>
      <DateTimeUTC>1535103358665</DateTimeUTC>
      <Content>https://ci-linux-mysql.mattermost.com/sa-team-52/pl/oaiyqxnga7nwudmk53rcpny4uo</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>saturnino+testing52@mattermost.com</LoginName>
      <DateTimeUTC>1535103358665</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>saturnino@mattermost.com</LoginName>
      <DateTimeUTC>1535103358665</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1535103358665</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="joram">
    <RoomID>public - 3eb5wuwg4irbbe69wzws4rqdec</RoomID>
    <StartTimeUTC>1536237826909</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1512818457140</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536237826909</DateTimeUTC>
      <Content>reply</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536237826909</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536237826909</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - 88qfk3gb7fyfzbm7qtdun3hz7r</RoomID>
    <StartTimeUTC>1537397526838</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>amy.blais+7@mattermost.com</LoginName>
      <DateTimeUTC>1537397523083</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1537397523088</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>amy.blais+7@mattermost.com</LoginName>
      <DateTimeUTC>1537397526838</DateTimeUTC>
      <Content>h</Content>
    </Message>
    <Message>
      <LoginName>amy.blais+7@mattermost.com</LoginName>
      <DateTimeUTC>1537397597617</DateTimeUTC>
      <Content>h</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>amy.blais+7@mattermost.com</LoginName>
      <DateTimeUTC>1537397597617</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1537397597617</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1537397597617</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="MikeG Test">
    <RoomID>private - 9o9wee14tjgx7g6figsa3tf9th</RoomID>
    <StartTimeUTC>1536173909284</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536173248992</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1536173537305</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>alice+1@mattermost.com</LoginName>
      <DateTimeUTC>1536173537306</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>mike@mattermost.com</LoginName>
      <DateTimeUTC>1536173887043</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>carlos@mattermost.com</LoginName>
      <DateTimeUTC>1536173936738</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>mike@mattermost.com</LoginName>
      <DateTimeUTC>1536173909284</DateTimeUTC>
      <Content>post a message</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536175270805</DateTimeUTC>
      <Content>no mention post</Content>
    </Message>
    <Message>
      <LoginName>mike@mattermost.com</LoginName>
      <DateTimeUTC>1536175314545</DateTimeUTC>
      <Content>no mention post</Content>
    </Message>
    <Message>
      <LoginName>mike@mattermost.com</LoginName>
      <DateTimeUTC>1536175337872</DateTimeUTC>
      <Content>@alice.miller mention post</Content>
    </Message>
    <Message>
      <LoginName>mike@mattermost.com</LoginName>
      <DateTimeUTC>1536175847247</DateTimeUTC>
      <Content>test</Content>
    </Message>
    <Message>
      <LoginName>mike@mattermost.com</LoginName>
      <DateTimeUTC>1536175857571</DateTimeUTC>
      <Content>@alice.miller </Content>
    </Message>
    <ParticipantLeft>
      <LoginName>alice+1@mattermost.com</LoginName>
      <DateTimeUTC>1536175857571</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1536175857571</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536175857571</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>carlos@mattermost.com</LoginName>
      <DateTimeUTC>1536175857571</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>mike@mattermost.com</LoginName>
      <DateTimeUTC>1536175857571</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536175857571</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - 3zy9ie9ha7n6zn8i1ibt4msxxy</RoomID>
    <StartTimeUTC>1538676523310</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1538675585686</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1538675585696</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1538676523310</DateTimeUTC>
      <Content>post</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1538676523310</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538676523310</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="DKH Convert Test">
    <RoomID>private - wrfof1wtf3b5mj8xh14kx34qma</RoomID>
    <StartTimeUTC>1538842618162</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1538841727678</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538841740097</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+dkhlogintest@mattermost.com</LoginName>
      <DateTimeUTC>1538841751287</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+05072018-c@mattermost.com</LoginName>
      <DateTimeUTC>1538841755919</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+dkhuser10@mattermost.com</LoginName>
      <DateTimeUTC>1538842573353</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>dylan+dkhuser10@mattermost.com</LoginName>
      <DateTimeUTC>1538842618162</DateTimeUTC>
      <Content>Post</Content>
    </Message>
    <Message>
      <LoginName>dylan+dkhuser10@mattermost.com</LoginName>
      <DateTimeUTC>1538842699930</DateTimeUTC>
      <Content>Opps mention for @dkh-sysadmin </Content>
    </Message>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538842699930</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1538842699930</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+05072018-c@mattermost.com</LoginName>
      <DateTimeUTC>1538842699930</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+dkhlogintest@mattermost.com</LoginName>
      <DateTimeUTC>1538842699930</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+dkhuser10@mattermost.com</LoginName>
      <DateTimeUTC>1538842699930</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538842699930</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="test 8">
    <RoomID>public - zyrh9yompigjzkwcot7buxykbo</RoomID>
    <StartTimeUTC>1533950643695</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1533656119611</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1533671695998</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1533950643695</DateTimeUTC>
      <Content>Mp4 with paces</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1533950643695</DateTimeUTC>
      <UserFileName>MP4 File with Spaces.mp4</UserFileName>
      <FileName>20180811/teams/noteam/channels/zyrh9yompigjzkwcot7buxykbo/users/7n8rz76dk3n88ydfzh5d7fny4r/zfces6kjbbdi9xbfgnhurogg3w/MP4 File with Spaces.mp4</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1533950643695</DateTimeUTC>
      <UserFileName>MP4 File with Spaces.mp4</UserFileName>
      <FileName>20180811/teams/noteam/channels/zyrh9yompigjzkwcot7buxykbo/users/7n8rz76dk3n88ydfzh5d7fny4r/zfces6kjbbdi9xbfgnhurogg3w/MP4 File with Spaces.mp4</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <ParticipantLeft>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1533950643695</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1533950643695</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1533950643695</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - zrxz4q9d87fzmc111h73rycw4a</RoomID>
    <StartTimeUTC>1534152064995</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>saturnino+remind@mattermost.com</LoginName>
      <DateTimeUTC>1532964720720</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>scottleedavis@mattermost.com</LoginName>
      <DateTimeUTC>1532964720725</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>scottleedavis@mattermost.com</LoginName>
      <DateTimeUTC>1534152064995</DateTimeUTC>
      <Content>0.0.4</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>saturnino+remind@mattermost.com</LoginName>
      <DateTimeUTC>1534152064995</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>scottleedavis@mattermost.com</LoginName>
      <DateTimeUTC>1534152064995</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1534152064995</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Town Square">
    <RoomID>public - qju51nzn1bnttbtsfcnbapzjer</RoomID>
    <StartTimeUTC>1534185137647</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1533286271453</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1534360771125</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>alice+mail@mattermost.com</LoginName>
      <DateTimeUTC>1537525231274</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1534185137647</DateTimeUTC>
      <Content>The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. The end of this long post will be hidden until you choose to `Show More`.</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1535217899804</DateTimeUTC>
      <Content>:saying: </Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1535474226747</DateTimeUTC>
      <Content>mp4</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1535474226747</DateTimeUTC>
      <UserFileName>mp4.mp4</UserFileName>
      <FileName>20180828/teams/noteam/channels/qju51nzn1bnttbtsfcnbapzjer/users/qqu7z5pcbtycdczx4jetogekro/4i8scp6nfpydjc8hytagz8iahe/mp4.mp4</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1535474226747</DateTimeUTC>
      <UserFileName>mp4.mp4</UserFileName>
      <FileName>20180828/teams/noteam/channels/qju51nzn1bnttbtsfcnbapzjer/users/qqu7z5pcbtycdczx4jetogekro/4i8scp6nfpydjc8hytagz8iahe/mp4.mp4</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536083918046</DateTimeUTC>
      <Content>pdf</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536083918046</DateTimeUTC>
      <UserFileName>PDF.pdf</UserFileName>
      <FileName>20180904/teams/noteam/channels/qju51nzn1bnttbtsfcnbapzjer/users/qqu7z5pcbtycdczx4jetogekro/j711q93ra3n7ufz93uy85xd97e/PDF.pdf</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536083918046</DateTimeUTC>
      <UserFileName>PDF.pdf</UserFileName>
      <FileName>20180904/teams/noteam/channels/qju51nzn1bnttbtsfcnbapzjer/users/qqu7z5pcbtycdczx4jetogekro/j711q93ra3n7ufz93uy85xd97e/PDF.pdf</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536084546287</DateTimeUTC>
      <Content>#2142</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536084570076</DateTimeUTC>
      <Content>#abc2142</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536222517421</DateTimeUTC>
      <Content>oewNzEP1TiIbeYuP9aGMJjVzzMT6H7af</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1537530337694</DateTimeUTC>
      <Content>~doesnotexist</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1537530377363</DateTimeUTC>
      <Content>~doesnotexist&#xA;</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1537530435161</DateTimeUTC>
      <Content>@doesnotexist&#xA;</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1537530441605</DateTimeUTC>
      <Content>@doesnotexist</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1537530446029</DateTimeUTC>
      <Content>@does&#xA;</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1537530496240</DateTimeUTC>
      <Content>@alices&#xA;</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538128347419</DateTimeUTC>
      <Content>~~hello~~</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538128347419</DateTimeUTC>
      <Content>~~hello~~</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538128493862</DateTimeUTC>
      <Content>~~} {{]} ~~</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651780202</DateTimeUTC>
      <Content>:aa: :bb:0 :cc: :dd: :ee: :ff: :gg: :hh: :ii: :jj: :kk:</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538653151552</DateTimeUTC>
      <Content>~~hello~~</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538653197762</DateTimeUTC>
      <Content>po(edited)st</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538653197762</DateTimeUTC>
      <UserFileName>Lindy Practice Test.html</UserFileName>
      <FileName>20181004/teams/noteam/channels/qju51nzn1bnttbtsfcnbapzjer/users/qqu7z5pcbtycdczx4jetogekro/ezxbibo7jbdffdyw9ao6kpbw9y/Lindy Practice Test.html</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538653197762</DateTimeUTC>
      <UserFileName>Lindy Practice Test.html</UserFileName>
      <FileName>20181004/teams/noteam/channels/qju51nzn1bnttbtsfcnbapzjer/users/qqu7z5pcbtycdczx4jetogekro/ezxbibo7jbdffdyw9ao6kpbw9y/Lindy Practice Test.html</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538653197762</DateTimeUTC>
      <Content>post</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538653274944</DateTimeUTC>
      <Content>This is line one with a break after&#xA;&#xA;This is the 3rd line editing hello</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538653274944</DateTimeUTC>
      <Content>This is line one with a break after&#xA;&#xA;This is the 3rd line editing</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538653274944</DateTimeUTC>
      <Content>This is line one with a break after&#xA;&#xA;This is the 3rd line</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538653537166</DateTimeUTC>
      <Content>&gt;this is a quotea&#39;jsdflkjasdfkljfa</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538653537166</DateTimeUTC>
      <Content>&gt;this is a quote</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538653537166</DateTimeUTC>
      <Content>&gt;this is a quotea&#39;jsdflkjasdfkljaaaaaaaa</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538653537166</DateTimeUTC>
      <Content>&gt;this is a quotea&#39;jsdflkjasdfklj</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>alice+mail@mattermost.com</LoginName>
      <DateTimeUTC>1538653537166</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1538653537166</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538653537166</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538653537166</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Off-Topic">
    <RoomID>public - nrqs6zacwtnrm8awz7hi9c3mwy</RoomID>
    <StartTimeUTC>1537897650022</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1512727808815</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>george+45@mattermost.com</LoginName>
      <DateTimeUTC>1512824458831</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>elias+icu@mattermost.com</LoginName>
      <DateTimeUTC>1518091634897</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>saturnino.mmost48@mattermost.com</LoginName>
      <DateTimeUTC>1520441509488</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>george+48@mattermost.com</LoginName>
      <DateTimeUTC>1521036266089</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>george+48@mattermost.com</LoginName>
      <DateTimeUTC>1523276454572</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan.haussermann@mattermost.com</LoginName>
      <DateTimeUTC>1525703092127</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1528221571296</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1528376699278</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1528377519297</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1528380024402</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>michael.gamble@mattermost.com</LoginName>
      <DateTimeUTC>1528736700507</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy+ms@mattermost.com</LoginName>
      <DateTimeUTC>1537891821542</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindy+ms@mattermost.com</LoginName>
      <DateTimeUTC>1537897650022</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>lindy+ms@mattermost.com</LoginName>
      <DateTimeUTC>1537897650022</DateTimeUTC>
      <UserFileName>Screenshot_20180925-194636.png</UserFileName>
      <FileName>20180925/teams/noteam/channels/nrqs6zacwtnrm8awz7hi9c3mwy/users/sn151et61jn9t8dz9bu643jj5y/i3nofuqemiyr7b4ufz1jheccpw/Screenshot_20180925-194636.png</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>lindy+ms@mattermost.com</LoginName>
      <DateTimeUTC>1537897650022</DateTimeUTC>
      <UserFileName>Screenshot_20180925-194636.png</UserFileName>
      <FileName>20180925/teams/noteam/channels/nrqs6zacwtnrm8awz7hi9c3mwy/users/sn151et61jn9t8dz9bu643jj5y/i3nofuqemiyr7b4ufz1jheccpw/Screenshot_20180925-194636.png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>lindy+ms@mattermost.com</LoginName>
      <DateTimeUTC>1537899370148</DateTimeUTC>
      <Content>https://ci-linux-mysql.mattermost.com/a-team/pl/hscdnbymepd77jtd3hfstk4ace</Content>
    </Message>
    <Message>
      <LoginName>lindy+ms@mattermost.com</LoginName>
      <DateTimeUTC>1538075701160</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>lindy+ms@mattermost.com</LoginName>
      <DateTimeUTC>1538075701160</DateTimeUTC>
      <UserFileName>EFA4FEC7-3729-4139-A1DF-C859C3D14B25.jpg</UserFileName>
      <FileName>20180927/teams/noteam/channels/nrqs6zacwtnrm8awz7hi9c3mwy/users/sn151et61jn9t8dz9bu643jj5y/41bf5drstigkdpj7m8nmz9e6yo/EFA4FEC7-3729-4139-A1DF-C859C3D14B25.jpg</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>lindy+ms@mattermost.com</LoginName>
      <DateTimeUTC>1538075701160</DateTimeUTC>
      <UserFileName>EFA4FEC7-3729-4139-A1DF-C859C3D14B25.jpg</UserFileName>
      <FileName>20180927/teams/noteam/channels/nrqs6zacwtnrm8awz7hi9c3mwy/users/sn151et61jn9t8dz9bu643jj5y/41bf5drstigkdpj7m8nmz9e6yo/EFA4FEC7-3729-4139-A1DF-C859C3D14B25.jpg</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>lindy+ms@mattermost.com</LoginName>
      <DateTimeUTC>1538075797417</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>lindy+ms@mattermost.com</LoginName>
      <DateTimeUTC>1538075797417</DateTimeUTC>
      <UserFileName>FF1F6969-569B-447E-9FEC-B156266E9722.jpg</UserFileName>
      <FileName>20180927/teams/noteam/channels/nrqs6zacwtnrm8awz7hi9c3mwy/users/sn151et61jn9t8dz9bu643jj5y/upmmosdu6jrt3yuhfniyyyqfty/FF1F6969-569B-447E-9FEC-B156266E9722.jpg</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>lindy+ms@mattermost.com</LoginName>
      <DateTimeUTC>1538075797417</DateTimeUTC>
      <UserFileName>FF1F6969-569B-447E-9FEC-B156266E9722.jpg</UserFileName>
      <FileName>20180927/teams/noteam/channels/nrqs6zacwtnrm8awz7hi9c3mwy/users/sn151et61jn9t8dz9bu643jj5y/upmmosdu6jrt3yuhfniyyyqfty/FF1F6969-569B-447E-9FEC-B156266E9722.jpg</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>lindy+ms@mattermost.com</LoginName>
      <DateTimeUTC>1538076238349</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>lindy+ms@mattermost.com</LoginName>
      <DateTimeUTC>1538076238349</DateTimeUTC>
      <UserFileName>37308B7D-B544-472D-A198-DCA475E175E0.jpg</UserFileName>
      <FileName>20180927/teams/noteam/channels/nrqs6zacwtnrm8awz7hi9c3mwy/users/sn151et61jn9t8dz9bu643jj5y/f93p1dwfotfnxdgfyfw1omtifa/37308B7D-B544-472D-A198-DCA475E175E0.jpg</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>lindy+ms@mattermost.com</LoginName>
      <DateTimeUTC>1538076238349</DateTimeUTC>
      <UserFileName>37308B7D-B544-472D-A198-DCA475E175E0.jpg</UserFileName>
      <FileName>20180927/teams/noteam/channels/nrqs6zacwtnrm8awz7hi9c3mwy/users/sn151et61jn9t8dz9bu643jj5y/f93p1dwfotfnxdgfyfw1omtifa/37308B7D-B544-472D-A198-DCA475E175E0.jpg</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <ParticipantLeft>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1538076238349</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan.haussermann@mattermost.com</LoginName>
      <DateTimeUTC>1538076238349</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>elias+icu@mattermost.com</LoginName>
      <DateTimeUTC>1538076238349</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>george+45@mattermost.com</LoginName>
      <DateTimeUTC>1538076238349</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>george+48@mattermost.com</LoginName>
      <DateTimeUTC>1538076238349</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1538076238349</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy+ms@mattermost.com</LoginName>
      <DateTimeUTC>1538076238349</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538076238349</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>michael.gamble@mattermost.com</LoginName>
      <DateTimeUTC>1538076238349</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>saturnino.mmost48@mattermost.com</LoginName>
      <DateTimeUTC>1538076238349</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538076238349</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - 3ws6z4uktpdrfd3nzm5ybn6b3r</RoomID>
    <StartTimeUTC>1538689832090</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1538689827745</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538689827750</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1538689832090</DateTimeUTC>
      <Content>Hey</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538689832090</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1538689832090</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538689832090</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - eoe6u4ee43bytfikafmdhu36oa</RoomID>
    <StartTimeUTC>1536174004771</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>lindsay@mattermost.com</LoginName>
      <DateTimeUTC>1528402000496</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1528402000502</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindsay@mattermost.com</LoginName>
      <DateTimeUTC>1536174004771</DateTimeUTC>
      <Content>post</Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1536174025123</DateTimeUTC>
      <Content>post</Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1536174035141</DateTimeUTC>
      <Content>post</Content>
    </Message>
    <Message>
      <LoginName>lindsay@mattermost.com</LoginName>
      <DateTimeUTC>1536185159165</DateTimeUTC>
      <Content>https://google.com</Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1536186100532</DateTimeUTC>
      <Content>messages</Content>
    </Message>
    <Message>
      <LoginName>lindsay@mattermost.com</LoginName>
      <DateTimeUTC>1538679789336</DateTimeUTC>
      <Content>sunlight in the sky </Content>
    </Message>
    <ParticipantLeft>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1538679789336</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindsay@mattermost.com</LoginName>
      <DateTimeUTC>1538679789336</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538679789336</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Miketest">
    <RoomID>private - ffbu5eebs7ftf8cm19hkz3oi5o</RoomID>
    <StartTimeUTC>1536180616671</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536180515593</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>mike@mattermost.com</LoginName>
      <DateTimeUTC>1536180527868</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536180616671</DateTimeUTC>
      <Content>@channel test</Content>
    </Message>
    <Message>
      <LoginName>mike@mattermost.com</LoginName>
      <DateTimeUTC>1536180744691</DateTimeUTC>
      <Content>Im replying now</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536180767133</DateTimeUTC>
      <Content>continued</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536180767133</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>mike@mattermost.com</LoginName>
      <DateTimeUTC>1536180767133</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536180767133</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="dkh test chan 5">
    <RoomID>public - y58tsyw8tbn7tn1ymmas15tusy</RoomID>
    <StartTimeUTC>1537847304204</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1537847290065</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1537847304204</DateTimeUTC>
      <Content>hotdog</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1537847304204</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1537847304204</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - 1nn84aos3jby7mcnfpkw6k45mw</RoomID>
    <StartTimeUTC>1538675821121</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>lindsay+abc@mattermost.com</LoginName>
      <DateTimeUTC>1525806584848</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1525806584854</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1538675821121</DateTimeUTC>
      <Content>post</Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1538675821121</DateTimeUTC>
      <Content>postedit</Content>
    </Message>
    <Message>
      <LoginName>lindsay+abc@mattermost.com</LoginName>
      <DateTimeUTC>1538675865029</DateTimeUTC>
      <Content>post</Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1538675894606</DateTimeUTC>
      <Content>DM</Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1538675898048</DateTimeUTC>
      <Content>reply</Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1538675944173</DateTimeUTC>
      <Content>message</Content>
    </Message>
    <Message>
      <LoginName>lindsay+abc@mattermost.com</LoginName>
      <DateTimeUTC>1538679233564</DateTimeUTC>
      <Content>message</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1538679233564</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindsay+abc@mattermost.com</LoginName>
      <DateTimeUTC>1538679233564</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538679233564</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Town Square">
    <RoomID>public - y7dod1q91i8h5rdffzebjz113e</RoomID>
    <StartTimeUTC>1536236739775</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1512727808768</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>george+45@mattermost.com</LoginName>
      <DateTimeUTC>1512824458788</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>elias+icu@mattermost.com</LoginName>
      <DateTimeUTC>1518091634856</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>saturnino.mmost48@mattermost.com</LoginName>
      <DateTimeUTC>1520441509447</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>george+48@mattermost.com</LoginName>
      <DateTimeUTC>1521036266049</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>george+48@mattermost.com</LoginName>
      <DateTimeUTC>1523276454527</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan.haussermann@mattermost.com</LoginName>
      <DateTimeUTC>1525703092087</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1528221571259</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1528376699235</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1528377519262</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1528380024365</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>michael.gamble@mattermost.com</LoginName>
      <DateTimeUTC>1528736700464</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy+ms@mattermost.com</LoginName>
      <DateTimeUTC>1537891821503</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536236739775</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536236739775</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>joram+8@mattermost.com</LoginName>
      <DateTimeUTC>1536236739775</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536236739775</DateTimeUTC>
      <Content>stuff</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536237948607</DateTimeUTC>
      <Content>msg</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536241576812</DateTimeUTC>
      <Content>```&#xA;code&#xA;```</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536248538806</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536248538806</DateTimeUTC>
      <UserFileName>emojibroken.png</UserFileName>
      <FileName>20180906/teams/noteam/channels/y7dod1q91i8h5rdffzebjz113e/users/yh4s7wnjebnypexesijwhfw8dr/o977g3jmtpnw8kd5bxp1pbq5aw/emojibroken.png</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536248538806</DateTimeUTC>
      <UserFileName>emojibroken.png</UserFileName>
      <FileName>20180906/teams/noteam/channels/y7dod1q91i8h5rdffzebjz113e/users/yh4s7wnjebnypexesijwhfw8dr/o977g3jmtpnw8kd5bxp1pbq5aw/emojibroken.png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536248645622</DateTimeUTC>
      <Content>## I *meant* to link to [this](http://example.com) :facepalm: ![Mattermost](https://mattermost.com/wp-content/uploads/2022/02/logoHorizontal.png)</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536248649061</DateTimeUTC>
      <Content>asd</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536248663836</DateTimeUTC>
      <Content>reply</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252860553</DateTimeUTC>
      <Content> #evasive above otter shuddered courageous plankton  @george43  # #wrung monkey and and methodically wrung  #wrung evasive  #this  #otter ig  @george43 dhearted this astride</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252860595</DateTimeUTC>
      <Content>where wherever much sniffled on  @joram6 leopard annoying much.&#xA;Jeeper that adventurous  @amy_blais  #annoying jeez and mandrill remote weasel immaturely correctly</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252860654</DateTimeUTC>
      <Content>endearingly the  @george some struck ouch  #input  #where goodness wrote  @george44444 ouch where aside smooched wildebeest ouch  @george48 hummingbird saddled a un from input  @eric together  #ouch beside the opposite shrugged much dear on crane</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252860745</DateTimeUTC>
      <Content> #this  @joram5 brusque llama.&#xA;Up inventoried pill without  @joram5  @eric alas  #more and squid this  @jason that more ely to on and sp hey rapidly</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252860803</DateTimeUTC>
      <Content>hooted alas and  @george positively strict browbe armadillo pled nutria  @michael.gamble grizzly  dolphin after  #koala  @dylan.haussermann more  #koala falcon koala next goat oh</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252860867</DateTimeUTC>
      <Content> @harrison11 spread seriously alas irrespective this brusque on and imprecisely the some hey and more that   #irrespective to more rapidly without squid pill rooster inventoried llama.&#xA;Up well excep</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252860913</DateTimeUTC>
      <Content>much  @jason far  @george43 far more  @george44444 t far pending as browbeat set the  #distant some distant  #set this before mastodon split depending antagonistic  @george45 since more dropped sheared  @musikpolice jeepers infinites up lingering</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252860977</DateTimeUTC>
      <Content>ouch  #dear panther sang in dear shark instead versus vivid regardless one one that goldfinch yikes until before  #before  #one  #alas much salamander  #swore tolerable m swore alas</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252861016</DateTimeUTC>
      <Content> @harrison11 jellyfish the well across mighty  @dylan.haussermann gregariously  # since  @someone t objective reciprocating  #glaringly fatuously  #far glaringly goodness unnecessary goodness alas less  #mighty much  #reciprocating  @joram8 a  one far placed hello far pridefully less  #mighty  # #</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252861077</DateTimeUTC>
      <Content> @george44444 brusque squid and without  #ive  @dylan.haussermann  imprecisely  @joram5 spread hey  #piquant inventoried piquant  #wove llama.&#xA;Up this on excepting aristocratically  #  @joram rapidly pill wove that  #that  #wove and the ive  @harrison11 more well  #imprecisely due alas more to</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252861149</DateTimeUTC>
      <Content>during mongoose merrily confessedly jeepers heron beyond robin shined proudly ntial far according and a  #merrily less suggestively the since dismounted essential inside</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252861188</DateTimeUTC>
      <Content>more jeepers the  #less  @dylan.haussermann octopus pending on jolly placed hey  #the apart heated some bit less fearless hardheadedly the h cuddled.&#xA;Caterpillar that  @musikpolice</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252861245</DateTimeUTC>
      <Content>dismounted  @dylan.haussermann extensively after express when came merry closed rn tranquil armadillo yawned  #dismounted far interminably less  #this jaded  #rn much airily  @george44444 one  #one hello boundless  @joram8 far  #came this much for p  @musikpolice  @dylan.haussermann wept</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252861313</DateTimeUTC>
      <Content>less more a hey cefully where  #more a that  # # #far rose pithy disbanded kookaburra  @joram8  #and furrowed hey circuitous so  # #far ouch far feverish far  #far unique under normal  #far criminal and for the one</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252861363</DateTimeUTC>
      <Content>pled strict falcon  #far grizzly  @musikpolice nutria hooted browbeat interminably far positively fa next  @george432 more oh s after far and dolphin  @testaccount goat armadillo split koala more alas one</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252861417</DateTimeUTC>
      <Content>much abortive re-laid hey  #darn hey hare that  @george432 turned solent goodness compassionate dear a warmly poignantly darn the yet sped  @someone scooped  @musikpolice</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252861473</DateTimeUTC>
      <Content> @joram8 tily brightly jeez then loyal bald across more  #brought  @joram since the hence less bluebird brought amidst  @joram some by  @harrison11 left logic</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252861546</DateTimeUTC>
      <Content>seal  #more  #seal lynx across plankton pre-set radical the and fla jeepers  @joram5 smooched but on  #on hence alas  # #more onto nasty  #onto sneered  @joram6 pangolin ut more rich  @george44444  #pangolin</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252861610</DateTimeUTC>
      <Content>wow fit inscr far therefore much far upon this dachshund far irritably partook  #demonstrably temperately some  #temperately mallard yikes squirrel.&#xA;Some  @george43 that kindhearted considering by reset whispered  @george45  #this d demonstrably clung  @testaccount</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252861664</DateTimeUTC>
      <Content>logic  @joram8 hence  #stylistic  # #stylistic a left jeez gazed and  stylistic since  #a then by  @jason  @joram6 lamely less amidst brought some the more across far one.&#xA;Hey much excepting naughtily bald rethought procating  @george48 bluebird</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252861736</DateTimeUTC>
      <Content> #began  @dylan.haussermann  @someone began  #the cowered ceremonially  #burst  #when one stiffly soothingly when noffensively.&#xA;Snorted affirmatively  #f  #f tidy f revealed fiendishly  @george  #ceremonially  @george44444 a the against burst hey beside</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252861804</DateTimeUTC>
      <Content>infallibly pangolin and yikes  #the smooched while one across seal strategic while lynx reliably  #orca less  #hello rich lorikeet without supp plankton beat hello orca accurately pre-set but jeepers hello the sneered set  #plankton</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252861843</DateTimeUTC>
      <Content>crud inside informally as  @joram  @amy_blais  @george43 and z more oversold leaned spoke much so hey save went  @harrison11 that close  @joram8 after marginal li and aboard far much showed and much</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252861912</DateTimeUTC>
      <Content>far woodchuck outside exotic resolute and snug woolly far  #loving sprang past fabulous rashly under crud alas less th drank and ladybug indecisive untruthful  @george43 adjusted  #one one  @harrison11  @eric  #and following loving  @joram8 cunning  #outside ard</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252861973</DateTimeUTC>
      <Content>jeez  #logic  # #since  #the capit hence since brightly loyal bald across jeez some logic less left the brought  #since amidst by bluebird then more naughtily</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252862016</DateTimeUTC>
      <Content> @jason more and far crud jeez  @george44444  @george432 and following stolidly adjusted under far loving as woodchuck sprang the  #crud hence inset drank less resolute ladybug  #and co fabulous exotic the indecisive spaciously passably  #ladybug</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252862079</DateTimeUTC>
      <Content> @joram8 much  @musikpolice lizard  powerlessly  @testaccount far more and rooster coughed yikes indiscriminate et one excited opposite  #far brought jeez  #one tiger  @george48 far  #one forcefully expedient  @someone</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252862142</DateTimeUTC>
      <Content> @amy_blais under furrowed tarantula despite e flamingo far  #rose  #well unique until gazelle koala criminal easy more  #tarantula rose ungracefully well  #well less that  #criminal hey</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252862195</DateTimeUTC>
      <Content>gradually strived a behind   #and  # # gosh ry crud  #gosh and cordial and dear  # moodily awesome mounted jeez off mocking that and komodo iguanodon shrewd the nutria regarding well strove and because staunchly sought</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252862233</DateTimeUTC>
      <Content>annoying leopard baboon wherever darn  #that  #the correctly giraf on  # #jeez before spitefully that reset moth  buoyant adventurous jeez mandrill much the  #jeez concentric a decidedly sniffled much.&#xA;Jeepers</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252862271</DateTimeUTC>
      <Content>th honey cockatoo so greyhound  @michael.gamble far far so insolently raucously one far tently dear more above this while  #one a but squid thankful abjectly echidna goodness halfhearted one.&#xA;Raccoon between</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252862320</DateTimeUTC>
      <Content>bluntly pathetically oh mildly  @joram5  #much less  @jason opposite less badly on ow.&#xA;Less  @musikpolice  @george48 cat purred  @joram goodness  at much a much jeez panther</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252862380</DateTimeUTC>
      <Content>scornfully one one dived groaned scowled scra past outside therefore dachshund pounded prior tenable lynx this hence before</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252862419</DateTimeUTC>
      <Content>jeez  #much hey far dalmatian more less the where far a  @george432 marginal  leaned aboard salmon.&#xA;Then alongside  @george48  @george45 oversol yet much ouch  #a as  @george48 a  @george</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252862504</DateTimeUTC>
      <Content>since until upon  #under up that unique  @joram5 tarantula  one well more koala  # #under so hey one despite ungracefully contrary flamingo criminal guinea.&#xA;Irksomely amicably easy for rose gazelle furrowed  #flamingo  #unique under far less disb</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252862546</DateTimeUTC>
      <Content>far however wallaby jeepers foretold as therefore across  #far alongside  #imminently in foul  #far off much  @joram5 underlay instantaneous imminently a  #a  # #far  #yikes evidently  #foul yikes far</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252862588</DateTimeUTC>
      <Content> @eric fitted the hello static ceremonially soothingly  @harrison11 beside cowered affirmatively  #a  @dylan.haussermann a st  @george48 when e this  @dylan.haussermann revealed hey</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252862657</DateTimeUTC>
      <Content> @eric  #up beat antagonistic more as well before sheared much  @joram6 depending shark far up lingering set jeepers grasshopper infinitesimal some since this far  @amy_blais the pending mastodon split more dropped far distant</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252862731</DateTimeUTC>
      <Content>far hatchet yellow  @jason that  @george432 flapped the thus understandable shook goodness hence more this howev wrote euphemistically behind so mindfully so hence that atee wayward bat or thanks after</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252862785</DateTimeUTC>
      <Content>excepting bald rethought  #left then  #by  #across bluebird less since the lamely and listic logic brought more gazed one.&#xA;Hey amidst naughtily jeez much across some  # #by left by hence  #brought</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252862830</DateTimeUTC>
      <Content>wretched s hey scallop abortive alongside much  #scallop alas definitely  #alas turned the before one that obdurately monumentally raptly revealed hare ouch poigna insolent much a titilatingly  #hare  #spoke spoke</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252862869</DateTimeUTC>
      <Content>during  #much  # #subconsciously athletic  #crud one arguable  #much much much one  #subconsciously cynically  #generously spurious jeez oh generously much attractively far unfitting baneful  # #subconsciously forthrigh  @dylan.haussermann far toneless subconsciously meadowlark crud</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252862920</DateTimeUTC>
      <Content> #this one outside a ouch man  @george43 yet.&#xA;Less vulture classically this and  @eric along quit goodhearted after handsomely  @eric serenely t  #classically  @joram5 excitedly  # #classically more this</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252862977</DateTimeUTC>
      <Content> @testaccount rarely earthworm parrot less  @george less pathetically rose immaturely wow.&#xA;Less panther jollily a then honey purred cat bluntly much jeez  @joram5 ba oh at goodness mildly this opposite and irresistible</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252863034</DateTimeUTC>
      <Content>that and immaturely via al well  #much  @george44444 hey much wherever  # #much correctly one mandrill leopard fishy shark sniffled grasshopper remote where weasel as some annoying</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252863099</DateTimeUTC>
      <Content>tic as dropped pending sheared the up depending  @musikpolice more  @george432 distant lingering before jeepers since mastodon this</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252863153</DateTimeUTC>
      <Content>handsomely a  @harrison11 one  #after goodhearted  #vulture yet.&#xA;Less  @joram8 and manat  # #a along  # # #a  #this this  # #a quit after more  @testaccount s excitedly vulture  @george48  #a outside serenely classically ouch</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252863215</DateTimeUTC>
      <Content> #much excepting much that and unicorn piquant in  @amy_blais  more enticingly beneath due  @joram5 ore aristocratically grimaced wove jeez until  @dylan.haussermann  @dylan.haussermann far macaw some  @jason</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252863277</DateTimeUTC>
      <Content>hooted  @george432 nutria  @joram koala strict split goat positively next more far far and grizzly more  #grizzly falcon  @michael.gamble  #more oh  @george44444  #split alas after browbeat  @george</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252863364</DateTimeUTC>
      <Content> @george44444 w aside  #titilatingly oriously revealed titilatingly definitely far much raptly  # #alongside  #alongside far oriole and wistful one scallop  @joram5 yikes monumentally  #obdurately spilled obdurately alongside  #wistful  @joram8 newt ouch immeasurably</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252863425</DateTimeUTC>
      <Content>far  #sheared far  antagonistic up  #antagonistic falcon next before depending hooted the lingering since more  @joram6  #antagonistic goat  #more  #more strict jeepers  split  # #more pending browbeat  @harrison11  #hooted sheared</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252863479</DateTimeUTC>
      <Content>limpet  @eric  #boundless woolly  @joram6 up boundless  # #much this  @musikpolice  #much this  #this hence one well.&#xA;Unicorn much much hello however expres  @michael.gamble much shot  #however ble yawned angry knitted up when yikes</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252863551</DateTimeUTC>
      <Content>well zebra  @joram8 more spoil wow one  #went  #zebra furrowed  #specially lantern gosh that much credible fetchingly  #since rry much inescapably dear so due  #inescapably  #inescapably and since specially went</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252863601</DateTimeUTC>
      <Content>one  @joram  and far loving outside indecisive snug crud  #indecisive exot and  @george past cunning fabulous  @george48  @dylan.haussermann  #and untruthful rashly adjusted woodchuck</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252863672</DateTimeUTC>
      <Content>crud sought regarding and behind staunchly mounted mocking hat iguanodon  #the the komodo strived gosh a off jeez well  #well  #iguanodon strove and dear c and moodily and aboard shrewd</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252863712</DateTimeUTC>
      <Content> #nt away more outrageously one showed nt groundhog overslept less at so decidedly on much immatur the on rattlesnake the  #concentric  #nt hysteric  #overslept worm and reset darn  #the moth baboon giraffe a far  # #nt gosh concentric far</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252863753</DateTimeUTC>
      <Content>up more sheared remote whe since before immaturely this  #e depending some distant e set  #immaturely fishy dropped via one and as  #up  #fishy well far  #since infinitesimal  #more much as shark mastodon pending hey grasshopper jeepers some</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252863794</DateTimeUTC>
      <Content> #hello ceremonially  #while soothingly stiffly fiendishly  @joram fa assenting  #fiendishly ed when  #cowered static  @george43 the however affirmatively  #hello  # #while hello began  @eric one while  #began burst fitted revealed emoted a  @joram6 tidy against cowered this beside hey</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252863865</DateTimeUTC>
      <Content>glaringly but goodness objective hello exultingly mighty less  #goodness  busted much since across alas the fatuously  @dylan.haussermann idst reined komodo gregariously</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252863916</DateTimeUTC>
      <Content> @eric ass  #against the against when emoted one began beside this hey  # #affirmatively a static soothingly hello  @dylan.haussermann ceremonially revealed fiendishly &#xA;Snorted affirmatively  #affirmatively tidy burst fitted  @jason cowered stiffly  @george43</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252863984</DateTimeUTC>
      <Content>howled  @michael.gamble the  #some egregiously komodo weirdly hello much after  #jeez and  @dylan.haussermann fabulous flagrantly jeez crud therefore  @george48 jeering much  #the thus some  @george45 scratched darn oh a  # #the  cow much less the  #weirdly</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252864071</DateTimeUTC>
      <Content>and eined shuddered  #evasive  #above  @musikpolice this evasive  #tranquil tranquil above  #otter wrung kindhearted and methodically plankton astride otter less  because monkey  @george44444  #plankton</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252864125</DateTimeUTC>
      <Content>hysteric on much at and hence  #far gosh one showed  #the dhog worm more away  #baneful baneful  #gosh yikes immature far on rattlesnake  #worm the overslept less so far  #far</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252864166</DateTimeUTC>
      <Content>less objective but pridefully busted tee we one reined  #komodo fatuously glaringly mighty since  # #reined the goodness komodo much exultingly  #since  #much alas hello some across amidst  #exultingly gregariously  #reined  #one much</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252864207</DateTimeUTC>
      <Content>went far crud and much  @musikpolice inside spoke and as jeez that li oversold save aboard hey  @eric close much and more after showed marginal much so informally leaned Then  #aboard</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252864267</DateTimeUTC>
      <Content>squid far thankful  #echidna  #goodness but  #so goodness far so between above echidna this insolently greyhound one.&#xA;Raccoon  #so halfhearted this  @eric honey raucously cockatoo  #while a a while so more far</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252864320</DateTimeUTC>
      <Content>exclusively this then  #so pled polite  #polite crud a cantankerous circu far  # #so far  @someone this misheard  #crud so inanimately.&#xA;Beside and  #to  to</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252864365</DateTimeUTC>
      <Content>far  # one expedient lizard this  @amy_blais  opposite onto  #onto yikes hatchet far jeez powerlessly forcefully  #much  #and more and indiscriminate far during excited  #opposite brought coughed sank on much rooster  #jeez tiger  #this more</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252864415</DateTimeUTC>
      <Content> #much leopard as well much grasshopper set where as annoyi one more some weasel hey  @joram8 ropped this infinitesimal far immaturely some shark  @jason and remote fishy via</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252864470</DateTimeUTC>
      <Content> #rarely this  #irresistible that babbled ess far  @jason romantically positively honey irresistible in much jollily rarely immaturely then parro ravenously  @george earthworm and some  @dylan.haussermann rose  #positively</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252864530</DateTimeUTC>
      <Content>nce so that shook the mindfully  @joram thanks after wrote understandable hence or flapped thus more wayward h behind this so yellow that  @george48 far  @joram  @harrison11 bat</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252864591</DateTimeUTC>
      <Content>and hey caribou ruthlessly d  #much tacky near gosh black shrewdly a yikes sexy scallop alas as  #alas much on yet  @michael.gamble sane wrongly  @someone  #hey the more far  #balked  #gosh  @joram8  # #much a far  #alas balked hello</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252864654</DateTimeUTC>
      <Content>less lion so spoke and and after went  @george45 save e commendably informally that inside crud sold and showed  @dylan.haussermann close oh conductive much much</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252864728</DateTimeUTC>
      <Content>dachshund drank scratched therefore hey  #utside utside  @amy_blais scowled  #prior prior added  @amy_blais  # #utside  @michael.gamble  #drank one  @joram5  #hey while much  # #drank before  @george  #dachshund tenable much</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252864799</DateTimeUTC>
      <Content>d classically  #d one quit exultingly serenely more less after yet.&#xA;Less and mighty  #vulture some  #but  #ob vulture ouch  @george this fatuously  #classically reined amidst busted much goodness across komodo ob but  #some manatee a outside handsomely  @someone</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252864799</DateTimeUTC>
      <Content>d classically  #d one quit exultingly serenely more less after yet.&#xA;Less and mighty  #vulture some  #but  #ob vulture ouch  @george this fatuously  #classically reined amidst busted much goodness across komodo ob but  #some manatee a outside handsomely  @someone</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536252864799</DateTimeUTC>
      <Content>d classically  #d one quit exultingly serenely more less after yet.&#xA;Less and mighty  #vulture some  #but  #ob vulture ouch  @george this fatuously  #classically reined amidst busted much goodness across komodo ob but  #some manatee a outside handsomely  @someone</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536253035166</DateTimeUTC>
      <Content>:cricket: </Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536253151607</DateTimeUTC>
      <Content>asd fgjl</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536253151607</DateTimeUTC>
      <UserFileName>emojibroken.png</UserFileName>
      <FileName>20180906/teams/noteam/channels/y7dod1q91i8h5rdffzebjz113e/users/6k3gafg3sjnfip4w44ighu19yo/f4q7gmsygtnyirmimqzmzb1nxe/emojibroken.png</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536253151607</DateTimeUTC>
      <UserFileName>emojibroken.png</UserFileName>
      <FileName>20180906/teams/noteam/channels/y7dod1q91i8h5rdffzebjz113e/users/6k3gafg3sjnfip4w44ighu19yo/f4q7gmsygtnyirmimqzmzb1nxe/emojibroken.png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536253166748</DateTimeUTC>
      <Content>asdf https://github.com/grundleborg gdfdf sssss</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536253166748</DateTimeUTC>
      <UserFileName>Firefox-jointeams.png</UserFileName>
      <FileName>20180906/teams/noteam/channels/y7dod1q91i8h5rdffzebjz113e/users/yh4s7wnjebnypexesijwhfw8dr/scmepnuo47nh3ku6qgjutmhd7w/Firefox-jointeams.png</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536253166748</DateTimeUTC>
      <UserFileName>Firefox-jointeams.png</UserFileName>
      <FileName>20180906/teams/noteam/channels/y7dod1q91i8h5rdffzebjz113e/users/yh4s7wnjebnypexesijwhfw8dr/scmepnuo47nh3ku6qgjutmhd7w/Firefox-jointeams.png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536253166748</DateTimeUTC>
      <Content>asdf gdfdf</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536253166748</DateTimeUTC>
      <Content>asdf https://github.com/grundleborg gdfdf</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536253233811</DateTimeUTC>
      <Content>asdfasd</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536253244218</DateTimeUTC>
      <Content>asd</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536253270795</DateTimeUTC>
      <Content>asdfasd</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536253270795</DateTimeUTC>
      <Content>asdfasdffffffasd</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536253596417</DateTimeUTC>
      <Content>asdf</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536253599361</DateTimeUTC>
      <Content>gfdgfg</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536253766586</DateTimeUTC>
      <Content>asfsad</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536253816585</DateTimeUTC>
      <Content>a</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536253819334</DateTimeUTC>
      <Content>b</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536253829768</DateTimeUTC>
      <Content>https://media1.giphy.com/media/l41lM6sJvwmZNruLe/giphy.gif</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536253887236</DateTimeUTC>
      <Content>One</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536253887236</DateTimeUTC>
      <Content>One</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536253887236</DateTimeUTC>
      <Content>One</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536253888873</DateTimeUTC>
      <Content>Two</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536253889864</DateTimeUTC>
      <Content>Three</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536254094165</DateTimeUTC>
      <Content>asd</Content>
    </Message>
    <Message>
      <LoginName>lindy+ms@mattermost.com</LoginName>
      <DateTimeUTC>1537897139664</DateTimeUTC>
      <Content>Reply&#xA;</Content>
    </Message>
    <Message>
      <LoginName>lindy+ms@mattermost.com</LoginName>
      <DateTimeUTC>1537897229058</DateTimeUTC>
      <Content>Replying</Content>
    </Message>
    <Message>
      <LoginName>lindy+ms@mattermost.com</LoginName>
      <DateTimeUTC>1537897433683</DateTimeUTC>
      <Content>Replying</Content>
    </Message>
    <Message>
      <LoginName>lindy+ms@mattermost.com</LoginName>
      <DateTimeUTC>1537898044629</DateTimeUTC>
      <Content>Hello</Content>
    </Message>
    <Message>
      <LoginName>lindy+ms@mattermost.com</LoginName>
      <DateTimeUTC>1537898400671</DateTimeUTC>
      <Content>Hi there</Content>
    </Message>
    <Message>
      <LoginName>lindy+ms@mattermost.com</LoginName>
      <DateTimeUTC>1537898427403</DateTimeUTC>
      <Content>Test</Content>
    </Message>
    <Message>
      <LoginName>lindy+ms@mattermost.com</LoginName>
      <DateTimeUTC>1537898449398</DateTimeUTC>
      <Content>Test2</Content>
    </Message>
    <Message>
      <LoginName>lindy+ms@mattermost.com</LoginName>
      <DateTimeUTC>1537898473326</DateTimeUTC>
      <Content>Test3</Content>
    </Message>
    <Message>
      <LoginName>joram+8@mattermost.com</LoginName>
      <DateTimeUTC>1538751284355</DateTimeUTC>
      <Content>@joram </Content>
    </Message>
    <ParticipantLeft>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1538751284355</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538751284355</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan.haussermann@mattermost.com</LoginName>
      <DateTimeUTC>1538751284355</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>elias+icu@mattermost.com</LoginName>
      <DateTimeUTC>1538751284355</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1538751284355</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>george+45@mattermost.com</LoginName>
      <DateTimeUTC>1538751284355</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>george+48@mattermost.com</LoginName>
      <DateTimeUTC>1538751284355</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1538751284355</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>joram+8@mattermost.com</LoginName>
      <DateTimeUTC>1538751284355</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy+ms@mattermost.com</LoginName>
      <DateTimeUTC>1538751284355</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538751284355</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>michael.gamble@mattermost.com</LoginName>
      <DateTimeUTC>1538751284355</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>saturnino.mmost48@mattermost.com</LoginName>
      <DateTimeUTC>1538751284355</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538751284355</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="eating-out">
    <RoomID>public - nixr47qxcbrpzmjbtde94x9fso</RoomID>
    <StartTimeUTC>1536281076422</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536281039695</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy+2@mattermost.com</LoginName>
      <DateTimeUTC>1536281039716</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy+3@mattermost.com</LoginName>
      <DateTimeUTC>1536281039736</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536281073444</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536281076422</DateTimeUTC>
      <Content>fsdgdgs</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536281076422</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy+2@mattermost.com</LoginName>
      <DateTimeUTC>1536281076422</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy+3@mattermost.com</LoginName>
      <DateTimeUTC>1536281076422</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536281076422</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536281076422</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="DKH test Chan">
    <RoomID>public - ncwmaujwmtrh5qtra8zbobzsue</RoomID>
    <StartTimeUTC>1536350759562</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536350746114</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536350845859</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+dkhuser10@mattermost.com</LoginName>
      <DateTimeUTC>1538843292366</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+cilinux@mattermost.com</LoginName>
      <DateTimeUTC>1539202297103</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536350759562</DateTimeUTC>
      <Content>https://bit.ly/2NlYsOr</Content>
    </Message>
    <Message>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536350768699</DateTimeUTC>
      <Content>https://bit.ly/2wqEbjw</Content>
    </Message>
    <Message>
      <LoginName>dylan+dkhuser10@mattermost.com</LoginName>
      <DateTimeUTC>1538843302626</DateTimeUTC>
      <Content>regular post</Content>
    </Message>
    <Message>
      <LoginName>dylan+dkhuser10@mattermost.com</LoginName>
      <DateTimeUTC>1538843313038</DateTimeUTC>
      <Content>mention for @dkh-sysadmin </Content>
    </Message>
    <Message>
      <LoginName>dylan+dkhuser10@mattermost.com</LoginName>
      <DateTimeUTC>1538843393147</DateTimeUTC>
      <Content>post</Content>
    </Message>
    <Message>
      <LoginName>dylan+dkhuser10@mattermost.com</LoginName>
      <DateTimeUTC>1538843417026</DateTimeUTC>
      <Content>post</Content>
    </Message>
    <Message>
      <LoginName>dylan+dkhuser10@mattermost.com</LoginName>
      <DateTimeUTC>1538843448445</DateTimeUTC>
      <Content>mention for @dkh-sysadmin </Content>
    </Message>
    <Message>
      <LoginName>dylan+dkhuser10@mattermost.com</LoginName>
      <DateTimeUTC>1538843460067</DateTimeUTC>
      <Content>mention for @dkh-sysadmin </Content>
    </Message>
    <Message>
      <LoginName>dylan+dkhuser10@mattermost.com</LoginName>
      <DateTimeUTC>1538843814673</DateTimeUTC>
      <Content>Post</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1539202319897</DateTimeUTC>
      <Content>https://github.com/wix/react-native-calendars/pull/620</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1539202618477</DateTimeUTC>
      <Content>https://github.com/wix/react-native-calendars/pull/620</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1539230132488</DateTimeUTC>
      <Content>:taco: </Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1539230136287</DateTimeUTC>
      <Content>:taco: </Content>
    </Message>
    <ParticipantLeft>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1539230136287</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+cilinux@mattermost.com</LoginName>
      <DateTimeUTC>1539230136287</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+dkhuser10@mattermost.com</LoginName>
      <DateTimeUTC>1539230136287</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1539230136287</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1539230136287</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Town Square2">
    <RoomID>public - kohuy37qdjgitnxh6heojrbsoy</RoomID>
    <StartTimeUTC>1536186103236</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>lindsay+abc@mattermost.com</LoginName>
      <DateTimeUTC>1512755751410</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindsay+abc@mattermost.com</LoginName>
      <DateTimeUTC>1512755764475</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>christopher+mycrazynewteam@mattermost.com</LoginName>
      <DateTimeUTC>1512763872572</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindsay+abc@mattermost.com</LoginName>
      <DateTimeUTC>1512763941657</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>christopher+mycrazynewteam@mattermost.com</LoginName>
      <DateTimeUTC>1512764120699</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>christopher+mycrazynewteam@mattermost.com</LoginName>
      <DateTimeUTC>1512764153070</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1513026314355</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1515193204607</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jonathan.fritz+46@mattermost.com</LoginName>
      <DateTimeUTC>1515420068309</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jonathan.fritz+464@mattermost.com</LoginName>
      <DateTimeUTC>1515422612347</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jonathan.fritz+462@mattermost.com</LoginName>
      <DateTimeUTC>1515428126319</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jonathan.fritz+463@mattermost.com</LoginName>
      <DateTimeUTC>1515429124880</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>saturnino.abril@mattermost.com</LoginName>
      <DateTimeUTC>1515531256382</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1517163915188</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jason+3@mattermost.com</LoginName>
      <DateTimeUTC>1518058932891</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jonathan.fritz+4.7@mattermost.com</LoginName>
      <DateTimeUTC>1518192754739</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jonathan.fritz+4.7nomfa@mattermost.com</LoginName>
      <DateTimeUTC>1518193162804</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>joram+1@mattermost.com</LoginName>
      <DateTimeUTC>1518212483377</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindsay+deuwue@mattermost.com</LoginName>
      <DateTimeUTC>1520513575864</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1523372700413</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais+1@mattermost.com</LoginName>
      <DateTimeUTC>1524752980699</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais+2@mattermost.com</LoginName>
      <DateTimeUTC>1524753155410</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1525710420171</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1528417293641</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais+5@mattermost.com</LoginName>
      <DateTimeUTC>1528473579890</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1528496705266</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>michael.gamble@mattermost.com</LoginName>
      <DateTimeUTC>1528736709638</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1529372489506</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1531475497337</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1531475525805</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1533760280183</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindsay@mattermost.com</LoginName>
      <DateTimeUTC>1536173145091</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1536173375871</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1536270045161</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>sudheer+testing@mattermost.com</LoginName>
      <DateTimeUTC>1536272026961</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1538675933131</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1536186103236</DateTimeUTC>
      <Content>message</Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1536186108477</DateTimeUTC>
      <Content>@lindsay </Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1536186121990</DateTimeUTC>
      <Content>@lindsay </Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1536186135896</DateTimeUTC>
      <Content>@lindsay </Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1536186183771</DateTimeUTC>
      <Content>@lindsay </Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1536186194055</DateTimeUTC>
      <Content>@lindsay </Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1536186236106</DateTimeUTC>
      <Content>@lindsay this is testing immediate email notification </Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1536186276332</DateTimeUTC>
      <Content>@lindsay this is testing immediate email notification </Content>
    </Message>
    <Message>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1536270061241</DateTimeUTC>
      <Content>hello</Content>
    </Message>
    <Message>
      <LoginName>lindsay+abc@mattermost.com</LoginName>
      <DateTimeUTC>1538675355720</DateTimeUTC>
      <Content>@alindsay </Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1538679212707</DateTimeUTC>
      <Content>@lindsay.abcde </Content>
    </Message>
    <ParticipantLeft>
      <LoginName>amy.blais+1@mattermost.com</LoginName>
      <DateTimeUTC>1538679212707</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy.blais+2@mattermost.com</LoginName>
      <DateTimeUTC>1538679212707</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy.blais+5@mattermost.com</LoginName>
      <DateTimeUTC>1538679212707</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538679212707</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1538679212707</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538679212707</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>christopher+mycrazynewteam@mattermost.com</LoginName>
      <DateTimeUTC>1538679212707</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1538679212707</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jason+3@mattermost.com</LoginName>
      <DateTimeUTC>1538679212707</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1538679212707</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1538679212707</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jonathan.fritz+4.7@mattermost.com</LoginName>
      <DateTimeUTC>1538679212707</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jonathan.fritz+4.7nomfa@mattermost.com</LoginName>
      <DateTimeUTC>1538679212707</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jonathan.fritz+462@mattermost.com</LoginName>
      <DateTimeUTC>1538679212707</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jonathan.fritz+463@mattermost.com</LoginName>
      <DateTimeUTC>1538679212707</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jonathan.fritz+464@mattermost.com</LoginName>
      <DateTimeUTC>1538679212707</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jonathan.fritz+46@mattermost.com</LoginName>
      <DateTimeUTC>1538679212707</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>joram+1@mattermost.com</LoginName>
      <DateTimeUTC>1538679212707</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1538679212707</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindsay+abc@mattermost.com</LoginName>
      <DateTimeUTC>1538679212707</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindsay+deuwue@mattermost.com</LoginName>
      <DateTimeUTC>1538679212707</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindsay@mattermost.com</LoginName>
      <DateTimeUTC>1538679212707</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538679212707</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>michael.gamble@mattermost.com</LoginName>
      <DateTimeUTC>1538679212707</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>saturnino.abril@mattermost.com</LoginName>
      <DateTimeUTC>1538679212707</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>sudheer+testing@mattermost.com</LoginName>
      <DateTimeUTC>1538679212707</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538679212707</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1538679212707</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538679212707</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Town Square">
    <RoomID>public - cq5cx1sscfb4udku8krthqqogh</RoomID>
    <StartTimeUTC>1536265045000</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1512727626834</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1512727636315</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>derrick.anderson@mattermost.com</LoginName>
      <DateTimeUTC>1515443983836</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1518211148528</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesse+alternate@mattermost.com</LoginName>
      <DateTimeUTC>1520438639098</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesse+alternate2@mattermost.com</LoginName>
      <DateTimeUTC>1520618879894</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesse+alternate3@mattermost.com</LoginName>
      <DateTimeUTC>1520618939982</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1525786755468</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1525804667452</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1528356845425</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>andruwa13@mattermost.com</LoginName>
      <DateTimeUTC>1529088599675</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1530217449918</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536265026262</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536265045000</DateTimeUTC>
      <Content>hey, @jesse </Content>
    </Message>
    <Message>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536269318479</DateTimeUTC>
      <Content>hey @jesse </Content>
    </Message>
    <Message>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536269336698</DateTimeUTC>
      <Content>yo @jesse </Content>
    </Message>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538751008528</DateTimeUTC>
      <Content>kindara</Content>
    </Message>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538751132982</DateTimeUTC>
      <Content>```&#xA;test&#xA;```</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>andruwa13@mattermost.com</LoginName>
      <DateTimeUTC>1538751132982</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538751132982</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>derrick.anderson@mattermost.com</LoginName>
      <DateTimeUTC>1538751132982</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesse+alternate2@mattermost.com</LoginName>
      <DateTimeUTC>1538751132982</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesse+alternate3@mattermost.com</LoginName>
      <DateTimeUTC>1538751132982</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesse+alternate@mattermost.com</LoginName>
      <DateTimeUTC>1538751132982</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538751132982</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1538751132982</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1538751132982</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1538751132982</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538751132982</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538751132982</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - pikup9sb3jggpdoqdkne4mqcjy</RoomID>
    <StartTimeUTC>1536309700344</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536309700344</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1536309700344</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536309700344</DateTimeUTC>
      <Content>test</Content>
    </Message>
    <Message>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1536311618150</DateTimeUTC>
      <Content>three</Content>
    </Message>
    <Message>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1536311649605</DateTimeUTC>
      <Content>one</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538129117353</DateTimeUTC>
      <Content>test</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538129117353</DateTimeUTC>
      <UserFileName>Image Pasted at 2018-8-23 20-15 (1).png</UserFileName>
      <FileName>20180928/teams/noteam/channels/pikup9sb3jggpdoqdkne4mqcjy/users/qqu7z5pcbtycdczx4jetogekro/3ab9jhqowbnqujy589itduew4e/Image Pasted at 2018-8-23 20-15 (1).png</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538129117353</DateTimeUTC>
      <UserFileName>Image Pasted at 2018-8-23 20-15 (1).png</UserFileName>
      <FileName>20180928/teams/noteam/channels/pikup9sb3jggpdoqdkne4mqcjy/users/qqu7z5pcbtycdczx4jetogekro/3ab9jhqowbnqujy589itduew4e/Image Pasted at 2018-8-23 20-15 (1).png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538129127688</DateTimeUTC>
      <Content>test</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538129127688</DateTimeUTC>
      <UserFileName>PNG.png</UserFileName>
      <FileName>20180928/teams/noteam/channels/pikup9sb3jggpdoqdkne4mqcjy/users/qqu7z5pcbtycdczx4jetogekro/nc3bq1cxrprgxkhpoecrpgkrhe/PNG.png</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538129127688</DateTimeUTC>
      <UserFileName>PNG.png</UserFileName>
      <FileName>20180928/teams/noteam/channels/pikup9sb3jggpdoqdkne4mqcjy/users/qqu7z5pcbtycdczx4jetogekro/nc3bq1cxrprgxkhpoecrpgkrhe/PNG.png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538129152326</DateTimeUTC>
      <Content>test</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538129152326</DateTimeUTC>
      <UserFileName>Image Pasted at 2018-9-11 15-38.png</UserFileName>
      <FileName>20180928/teams/noteam/channels/pikup9sb3jggpdoqdkne4mqcjy/users/qqu7z5pcbtycdczx4jetogekro/rxjif3647fre9e8xsik5bjwcuc/Image Pasted at 2018-9-11 15-38.png</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538129152326</DateTimeUTC>
      <UserFileName>Image Pasted at 2018-9-11 15-38.png</UserFileName>
      <FileName>20180928/teams/noteam/channels/pikup9sb3jggpdoqdkne4mqcjy/users/qqu7z5pcbtycdczx4jetogekro/rxjif3647fre9e8xsik5bjwcuc/Image Pasted at 2018-9-11 15-38.png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538129165591</DateTimeUTC>
      <Content>test</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538129165591</DateTimeUTC>
      <UserFileName>JPG.jpg</UserFileName>
      <FileName>20180928/teams/noteam/channels/pikup9sb3jggpdoqdkne4mqcjy/users/qqu7z5pcbtycdczx4jetogekro/jmfde758qtdf8g77cmftafp15c/JPG.jpg</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538129165591</DateTimeUTC>
      <UserFileName>JPG.jpg</UserFileName>
      <FileName>20180928/teams/noteam/channels/pikup9sb3jggpdoqdkne4mqcjy/users/qqu7z5pcbtycdczx4jetogekro/jmfde758qtdf8g77cmftafp15c/JPG.jpg</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538129204681</DateTimeUTC>
      <Content>test</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538129204681</DateTimeUTC>
      <UserFileName>Image Pasted at 2018-9-28 12-06.png</UserFileName>
      <FileName>20180928/teams/noteam/channels/pikup9sb3jggpdoqdkne4mqcjy/users/qqu7z5pcbtycdczx4jetogekro/aaedsawkx7ypjn6ot4f8166wte/Image Pasted at 2018-9-28 12-06.png</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538129204681</DateTimeUTC>
      <UserFileName>Image Pasted at 2018-9-28 12-06.png</UserFileName>
      <FileName>20180928/teams/noteam/channels/pikup9sb3jggpdoqdkne4mqcjy/users/qqu7z5pcbtycdczx4jetogekro/aaedsawkx7ypjn6ot4f8166wte/Image Pasted at 2018-9-28 12-06.png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538157402520</DateTimeUTC>
      <Content># Basic Markdown Testing&#xA;Tests for text style, code blocks, in-line code and images, lines, block quotes, and headings.&#xA;&#xA;### Text Style&#xA;&#xA;**The following text should render as:**  &#xA;_Italics_&#xA;_Ita_lics_&#xA;*Italics*&#xA;**Bold**&#xA;***Bold-italics***&#xA;**_Bold-italics_**&#xA;~~Strikethrough~~&#xA;&#xA;This sentence contains **bold**, _italic_, ***bold-italic***, and ~~stikethrough~~ text.  &#xA;&#xA;**The following should render as normal text:**  &#xA;Normal Text_  &#xA;_Normal Text  &#xA;_Normal Text*&#xA;&#xA;### Carriage Return  &#xA;&#xA;Line #1 followed by one blank line &#xA;&#xA;Line #2 followed by one blank line&#xA;&#xA;Line #3 followed by Line #4&#xA;Line #4 &#xA;&#xA;&#xA;### Code Blocks&#xA;&#xA;```&#xA;This text should render in a code block&#xA;```&#xA;&#xA;**The following markdown should not render:**  &#xA;```&#xA;_Italics_  &#xA;*Italics*  &#xA;**Bold**  &#xA;***Bold-italics***  &#xA;**Bold-italics_**  &#xA;~~Strikethrough~~&#xA;:) :-) ;) ;-) :o :O :-o :-O &#xA;:bamboo: :gift_heart: :dolls: :school_satchel: :mortar_board:&#xA;# Heading 1&#xA;## Heading 2&#xA;### Heading 3&#xA;#### Heading 4&#xA;##### Heading 5&#xA;###### Heading 6&#xA;&gt; Block Quote&#xA;- List&#xA;  - List Sub-item&#xA;[Link](https://i.giphy.com/xNrM4cGJ8u3ao.gif)&#xA;[![Github](https://assets-cdn.github.com/favicon.ico)](https://github.com/mattermost/platform)&#xA;| Left-Aligned Text | Center Aligned Text | Right Aligned Text |&#xA;| :------------ |:---------------:| -----:|&#xA;| Left column 1 | this text       |  $100 |&#xA;```&#xA;&#xA;**The following links should not auto-link or generate previews:**  &#xA;```&#xA;GIF: https://i.giphy.com/xNrM4cGJ8u3ao.gif&#xA;Website: https://en.wikipedia.org/wiki/Dolphin&#xA;```&#xA;&#xA;**The following should appear as a carriage return separating two lines of text:**&#xA;```&#xA;Line #1 followed by a blank line&#xA;&#xA;Line #2 following a blank line&#xA;```&#xA;&#xA;### In-line Code&#xA;&#xA;The word `monospace` should render as in-line code.  &#xA;&#xA;The following markdown in-line code should not render:  &#xA;`_Italics_`, `*Italics*`, `**Bold**`, `***Bold-italics***`, `**Bold-italics_**`, `~~Strikethrough~~`, `:)` , `:-)` , `;)` , `:-O` , `:bamboo:` , `:gift_heart:` , `:dolls:` , `# Heading 1`, `## Heading 2`, `### Heading 3`, `#### Heading 4`, `##### Heading 5`, `###### Heading 6`&#xA;&#xA;This GIF link should not preview: `https://i.giphy.com/xNrM4cGJ8u3ao.gif`  &#xA;This link should not auto-link: `https://en.wikipedia.org/wiki/Dolphin`  &#xA;&#xA;This sentence with `&#xA;in-line code&#xA;` should appear on one line.&#xA;&#xA;### In-line Images&#xA;&#xA;Mattermost/platform build status:  [![Build Status](https://travis-ci.org/mattermost/platform.svg?branch=master)](https://travis-ci.org/mattermost/platform)  &#xA;&#xA;GitHub favicon:  ![Github](https://assets-cdn.github.com/favicon.ico)&#xA;&#xA;GIF Image:  &#xA;![gif](https://i.giphy.com/xNrM4cGJ8u3ao.gif)&#xA;&#xA;4K Wallpaper Image (11Mb):  &#xA;![4K Image](https://images.wallpaperscraft.com/image/starry_sky_shine_glitter_118976_3840x2160.jpg)&#xA;&#xA;Panorama Image:  &#xA;![Pano](http://amardeepphotography.com/wp-content/uploads/2012/11/Untitled_Panorama6small.jpg)&#xA;&#xA;Tall Portrait Image:  &#xA;![Portrait](http://www.maniacworld.com/now-this-is-a-tall-building.jpg)&#xA;&#xA;Tall Portrait Image (resized):  &#xA;![Portrait](http://www.maniacworld.com/now-this-is-a-tall-building.jpg =x200)&#xA;&#xA;Tall Portrait Image (resized to a square):  &#xA;![Portrait](http://www.maniacworld.com/now-this-is-a-tall-building.jpg =200x200)&#xA;&#xA;### Lines&#xA;&#xA;Three lines should render with text between them:  &#xA;&#xA;Text above line&#xA;&#xA;***&#xA;&#xA;Text between lines&#xA;&#xA;---  &#xA;&#xA;Text between lines&#xA;___  &#xA;&#xA;Text below line&#xA;&#xA;### Block Quotes&#xA;&#xA;&gt;This text should render in a block quote.&#xA;&#xA;**The following markdown should render within the block quote:**  &#xA;&gt; #### Heading 4  &#xA;&gt; _Italics_, *Italics*, **Bold**, ***Bold-italics***, **_Bold-italics_**, ~~Strikethrough~~  &#xA;&gt; :) :-) ;) :-O :bamboo: :gift_heart: :dolls:  &#xA;&#xA;**The following text should render in two block quotes separated by one line of text:**&#xA;&gt; Block quote 1&#xA;&#xA;Text between block quotes&#xA;&#xA;&gt; Block quote 2&#xA;&#xA;### Headings&#xA;&#xA;# Heading 1 font size  &#xA;## Heading 2 font size   &#xA;### Heading 3 font size  &#xA;#### Heading 4 font size  &#xA;##### Heading 5 font size  &#xA;###### Heading 6 font size  &#xA;&#xA;&#xA;### Escaped Characters&#xA;&#xA;**The following text should render the same as the raw text:**&#xA;Raw: `\\teamlinux\IT-Stuff\WorkingStuff`&#xA;Markdown: \\teamlinux\IT-Stuff\WorkingStuff&#xA;&#xA;&#xA;**The following text should escape out the first backslash so only one backslash appears:**&#xA;Raw: \\()#&#xA;Markdown: \\()#</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538157426515</DateTimeUTC>
      <Content># Markdown List Testing&#xA;Verify that all list types render as expected.&#xA;&#xA;### Single-Item Ordered List&#xA;&#xA;**Expected:**&#xA;```&#xA;7. Single Item&#xA;```&#xA;&#xA;**Actual:**&#xA;7. Single Item&#xA;&#xA;### Multi-Item Ordered List&#xA;&#xA;**Expected:**&#xA;```&#xA;1. One&#xA;2. Two&#xA;3. Three&#xA;```&#xA;&#xA;**Actual:**&#xA;&#xA;1. One&#xA;1. Two&#xA;1. Three&#xA;&#xA;### Nested Ordered List&#xA;&#xA;**Expected:**&#xA;```&#xA;1. Alpha&#xA;    1. Bravo&#xA;2. Charlie&#xA;3. Delta&#xA;    1. Echo&#xA;    2. Foxtrot&#xA;```&#xA;&#xA;**Actual:**&#xA;&#xA;1. Alpha&#xA;  1. Bravo&#xA;1. Charlie&#xA;1. Delta&#xA;  1. Echo&#xA;  1. Foxtrot&#xA;&#xA;### Single-Item Unordered List&#xA;&#xA;**Expected:**&#xA;```&#xA;• Single Item&#xA;```&#xA;&#xA;**Actual:**&#xA;* Single Item&#xA;&#xA;### Multi-Item Unordered List&#xA;&#xA;**Expected:**&#xA;```&#xA;• One&#xA;• Two&#xA;• Three&#xA;```&#xA;&#xA;**Actual:**&#xA;* One&#xA;- Two&#xA;+ Three&#xA;&#xA;### Multi-Item Unordered List with Line Break (Break should not render)&#xA;&#xA;**Expected:**&#xA;```&#xA;• Item A&#xA;• Item B&#xA;• Item C&#xA;• Item D&#xA;```&#xA;&#xA;**Actual:**&#xA;* Item A&#xA;+ Item B&#xA;&#xA;- Item C&#xA;- Item D&#xA;&#xA;### Nested Unordered List&#xA;&#xA;**Expected:**&#xA;```&#xA;• Alpha&#xA;    • Bravo&#xA;• Charlie&#xA;• Delta&#xA;    • Echo&#xA;    • Foxtrot&#xA;```&#xA;&#xA;**Actual:**&#xA;+ Alpha&#xA;    * Bravo&#xA;- Charlie&#xA;* Delta&#xA;    + Echo&#xA;    - Foxtrot&#xA;&#xA;### Mixed List Starting Ordered&#xA;&#xA;**Expected:**&#xA;```&#xA;1. One&#xA;2. Two&#xA;3. Three&#xA;```&#xA;&#xA;**Actual:**&#xA;&#xA;1. One&#xA;+ Two&#xA;- Three&#xA;&#xA;### Mixed List Starting Unordered&#xA;&#xA;**Expected:**&#xA;```&#xA;• Monday&#xA;• Tuesday&#xA;• Wednesday&#xA;```&#xA;&#xA;**Actual:**&#xA;+ Monday&#xA;1. Tuesday&#xA;* Wednesday&#xA;&#xA;### Nested Mixed List&#xA;&#xA;**Expected:**&#xA;```&#xA;• Alpha&#xA;    1. Bravo&#xA;        • Charlie&#xA;        • Delta&#xA;• Echo&#xA;• Foxtrot&#xA;    • Golf&#xA;        1. Hotel&#xA;    • India&#xA;        1. Juliet&#xA;        2. Kilo&#xA;    • Lima&#xA;• Mike&#xA;    1. November&#xA;        4. Oscar&#xA;            5. Papa&#xA;```&#xA;&#xA;**Actual:**&#xA;- Alpha&#xA;    1. Bravo&#xA;        * Charlie&#xA;        + Delta&#xA;- Echo&#xA;* Foxtrot&#xA;    + Golf&#xA;        1. Hotel&#xA;    - India&#xA;        1. Juliet&#xA;        2. Kilo&#xA;    * Lima&#xA;1. Mike&#xA;    1. November&#xA;        4. Oscar&#xA;            5. Papa&#xA;&#xA;### Ordered Lists Separated by Carriage Returns&#xA;&#xA;**Expected:**&#xA;```&#xA;1. One&#xA;  • Two&#xA;2. Two&#xA;3. Three&#xA;```&#xA;&#xA;**Actual:**&#xA;&#xA;1. One&#xA;    - Two&#xA;&#xA;2. Two&#xA;3. Three&#xA;&#xA;### New Line After a List&#xA;&#xA;**Expected:**&#xA;```&#xA;1. One&#xA;2. Two&#xA;&#xA;This text should be on a new line.&#xA;```&#xA;&#xA;**Actual:**&#xA;&#xA;1. One&#xA;2. Two&#xA;This text should be on a new line.&#xA;&#xA;### Task Lists&#xA;&#xA;**Expected:**&#xA;```&#xA;[ ] One&#xA;  [ ] Subpoint one&#xA;  - Normal Bullet&#xA;[ ] Two&#xA;[x] Completed item&#xA;```&#xA;&#xA;**Actual:**&#xA;&#xA;- [ ] One&#xA;  - [ ] Subpoint one&#xA;  - Normal Bullet&#xA;- [ ] Two&#xA;- [x] Completed item&#xA;&#xA;### Numbered Task Lists&#xA;&#xA;**Expected:**&#xA;```&#xA;1. [ ] One&#xA;2. [ ] Two&#xA;3. [x] Completed item&#xA;```&#xA;&#xA;**Actual:**&#xA;&#xA;1. [ ] One&#xA;2. [ ] Two&#xA;3. [x] Completed item&#xA;&#xA;### Multiple Lists&#xA;&#xA;**Expected:**&#xA;```&#xA;List A:&#xA;&#xA;1. One&#xA;&#xA;List B:&#xA;&#xA;2. Two&#xA;```&#xA;&#xA;List A:&#xA;&#xA;1. One&#xA;&#xA;List B:&#xA;&#xA;2. Two&#xA;&#xA;### Lists with blank lines before and after &#xA;&#xA;**Expected:**&#xA;&#xA;```&#xA;Line with blank line after &#xA;&#xA;Line with blank line after and before &#xA;&#xA;1. Bullet &#xA;2. Bullet &#xA;3. Bullet &#xA;&#xA;Line with blank line after and before &#xA;&#xA;Line with blank line before&#xA;```&#xA;Line with blank line after &#xA;&#xA;Line with blank line after and before &#xA;&#xA;1. Bullet &#xA;2. Bullet &#xA;3. Bullet &#xA;&#xA;Line with blank line after and before &#xA;&#xA;Line with blank line before&#xA;</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538419364623</DateTimeUTC>
      <Content>hi</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538419364623</DateTimeUTC>
      <Content>hi</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538653835052</DateTimeUTC>
      <Content>https://ci-linux-mysql.mattermost.com/lindys-team-1/pl/hfb6c7c463r4fqsocys5fbgrzw</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538724808132</DateTimeUTC>
      <Content>this is a dm</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538724814423</DateTimeUTC>
      <Content>this is a reply</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538724893785</DateTimeUTC>
      <Content>post</Content>
    </Message>
    <Message>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1539072721493</DateTimeUTC>
      <Content>hello</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1539073348169</DateTimeUTC>
      <Content>Hi</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1539073348169</DateTimeUTC>
      <Content>Hi edited</Content>
    </Message>
    <Message>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1539073406365</DateTimeUTC>
      <Content>hello </Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1539073461543</DateTimeUTC>
      <Content>Reply</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1539073522525</DateTimeUTC>
      <Content>Hi</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1539073522525</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1539073522525</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1539073522525</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - 4ww9r8wqajrrpqa4z861ikdsza</RoomID>
    <StartTimeUTC>1538724963904</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538724963904</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538724963904</DateTimeUTC>
      <Content>dm self</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538724963904</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538724963904</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="wed1">
    <RoomID>public - cjcxoefizb86uf3uyz7xjyx4ph</RoomID>
    <StartTimeUTC>1538768259766</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1533750299889</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1533750695795</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>martin+test2@mattermost.com</LoginName>
      <DateTimeUTC>1538768272038</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1538768259766</DateTimeUTC>
      <Content>asdf</Content>
    </Message>
    <Message>
      <LoginName>martin+test2@mattermost.com</LoginName>
      <DateTimeUTC>1538768277268</DateTimeUTC>
      <Content>agreed</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538768277268</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1538768277268</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>martin+test2@mattermost.com</LoginName>
      <DateTimeUTC>1538768277268</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538768277268</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - pe1mwwsmd7gpzxwifee3o3b87c</RoomID>
    <StartTimeUTC>1536105382833</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1533680730684</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais+1@mattermost.com</LoginName>
      <DateTimeUTC>1533680730689</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1536105382833</DateTimeUTC>
      <Content>Mm</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>amy.blais+1@mattermost.com</LoginName>
      <DateTimeUTC>1536105382833</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1536105382833</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536105382833</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="toarchive2">
    <RoomID>public - ciaosep713d3ucruczp5sbmz3c</RoomID>
    <StartTimeUTC>1538127728410</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538127703761</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538127728410</DateTimeUTC>
      <Content>test testing toarchive to archive</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538127728410</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538127728410</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="TimeZone Test">
    <RoomID>public - 1knaf5ayffb4pfzkx7ya5k9wba</RoomID>
    <StartTimeUTC>1534201934083</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1534201919986</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+dkhlogintest@mattermost.com</LoginName>
      <DateTimeUTC>1534202243137</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1534201934083</DateTimeUTC>
      <Content>post from desktop</Content>
    </Message>
    <Message>
      <LoginName>dylan+dkhlogintest@mattermost.com</LoginName>
      <DateTimeUTC>1534202257902</DateTimeUTC>
      <Content>Post from a second user</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1534203651311</DateTimeUTC>
      <Content>iOS post</Content>
    </Message>
    <Message>
      <LoginName>dylan+dkhlogintest@mattermost.com</LoginName>
      <DateTimeUTC>1534208225320</DateTimeUTC>
      <Content>な原田郁子やすい</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1534208225320</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+dkhlogintest@mattermost.com</LoginName>
      <DateTimeUTC>1534208225320</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1534208225320</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - 4a6hpn7k4tyo9xu1834e5dnzgc</RoomID>
    <StartTimeUTC>1534883010244</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>saturnino+remind@mattermost.com</LoginName>
      <DateTimeUTC>1534875695697</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1534875695703</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1534883010244</DateTimeUTC>
      <Content>Sorry, I didn’t quite get that. I’m easily confused. Perhaps try the words in a different order? This usually works: `/remind [@someone or ~channel] [what] [when]`.&#xA;</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1534883016762</DateTimeUTC>
      <Content>Sorry, I didn’t quite get that. I’m easily confused. Perhaps try the words in a different order? This usually works: `/remind [@someone or ~channel] [what] [when]`.&#xA;</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1534883016762</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>saturnino+remind@mattermost.com</LoginName>
      <DateTimeUTC>1534883016762</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1534883016762</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="September Testing now">
    <RoomID>public - qgd5kxgyaig4pxngkehy6sdj1w</RoomID>
    <StartTimeUTC>1536192840441</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1536178396207</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536178957582</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536192840441</DateTimeUTC>
      <Content>posting a message</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1536192840441</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536192840441</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536192840441</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - dgu1fd476jyz5m3oiopmjm9fmy</RoomID>
    <StartTimeUTC>1536182438034</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1536182429910</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1536182429916</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1536182438034</DateTimeUTC>
      <Content>Hello</Content>
    </Message>
    <Message>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1536183281880</DateTimeUTC>
      <Content>https://ci-linux-mysql.mattermost.com/yourteamhere/messages/50242871f540ceb09ede02004ec6619880b374e9</Content>
    </Message>
    <Message>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538771365850</DateTimeUTC>
      <Content>https://www.traveller.com.au/content/dam/images/g/u/n/q/h/0/image.related.articleLeadwide.620x349.gunpvd.png/1488330286332.png&#xA;</Content>
    </Message>
    <Message>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538771375127</DateTimeUTC>
      <Content>![Mattermost](https://docs.mattermost.com/_images/icon-76x76.png =76x76 &#34;Mattermost Icon&#34;)</Content>
    </Message>
    <Message>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538771511519</DateTimeUTC>
      <Content>https://www.traveller.com.au/content/dam/images/g/u/n/q/h/0/image.related.articleLeadwide.620x349.gunpvd.png/1488330286332.png</Content>
    </Message>
    <Message>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538771609999</DateTimeUTC>
      <Content>text</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538771609999</DateTimeUTC>
      <UserFileName>rename-channels.mp4</UserFileName>
      <FileName>20181005/teams/noteam/channels/dgu1fd476jyz5m3oiopmjm9fmy/users/8itpscu7itb59y5trr37quikyo/cb1wqjqbsfg9mbftpq3bo1ezdr/rename-channels.mp4</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538771609999</DateTimeUTC>
      <UserFileName>how to find system console.mov</UserFileName>
      <FileName>20181005/teams/noteam/channels/dgu1fd476jyz5m3oiopmjm9fmy/users/8itpscu7itb59y5trr37quikyo/u6xtn4jngt8edpp8okj1z1ckoc/how to find system console.mov</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538771609999</DateTimeUTC>
      <UserFileName>rename-channels.mp4</UserFileName>
      <FileName>20181005/teams/noteam/channels/dgu1fd476jyz5m3oiopmjm9fmy/users/8itpscu7itb59y5trr37quikyo/cb1wqjqbsfg9mbftpq3bo1ezdr/rename-channels.mp4</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538771609999</DateTimeUTC>
      <UserFileName>how to find system console.mov</UserFileName>
      <FileName>20181005/teams/noteam/channels/dgu1fd476jyz5m3oiopmjm9fmy/users/8itpscu7itb59y5trr37quikyo/u6xtn4jngt8edpp8okj1z1ckoc/how to find system console.mov</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538771625111</DateTimeUTC>
      <Content>Message</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538771625111</DateTimeUTC>
      <UserFileName>Edit Posts Setting in Schemes.mov</UserFileName>
      <FileName>20181005/teams/noteam/channels/dgu1fd476jyz5m3oiopmjm9fmy/users/8itpscu7itb59y5trr37quikyo/u8htraasqjdi3f7oipgkatac7w/Edit Posts Setting in Schemes.mov</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538771625111</DateTimeUTC>
      <UserFileName>how to find system console.mov</UserFileName>
      <FileName>20181005/teams/noteam/channels/dgu1fd476jyz5m3oiopmjm9fmy/users/8itpscu7itb59y5trr37quikyo/43skqnp1jfy7jmum7o98regkqr/how to find system console.mov</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538771625111</DateTimeUTC>
      <UserFileName>Edit Posts Setting in Schemes.mov</UserFileName>
      <FileName>20181005/teams/noteam/channels/dgu1fd476jyz5m3oiopmjm9fmy/users/8itpscu7itb59y5trr37quikyo/u8htraasqjdi3f7oipgkatac7w/Edit Posts Setting in Schemes.mov</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538771625111</DateTimeUTC>
      <UserFileName>how to find system console.mov</UserFileName>
      <FileName>20181005/teams/noteam/channels/dgu1fd476jyz5m3oiopmjm9fmy/users/8itpscu7itb59y5trr37quikyo/43skqnp1jfy7jmum7o98regkqr/how to find system console.mov</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538771679410</DateTimeUTC>
      <Content>an image</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538771679410</DateTimeUTC>
      <UserFileName>Screen Shot 2018-06-18 at 5.56.43 PM.png</UserFileName>
      <FileName>20181005/teams/noteam/channels/dgu1fd476jyz5m3oiopmjm9fmy/users/8itpscu7itb59y5trr37quikyo/iaiuk1dwa3rrurkgwnfcubwzjy/Screen Shot 2018-06-18 at 5.56.43 PM.png</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538771679410</DateTimeUTC>
      <UserFileName>Screen Shot 2018-06-18 at 5.56.43 PM.png</UserFileName>
      <FileName>20181005/teams/noteam/channels/dgu1fd476jyz5m3oiopmjm9fmy/users/8itpscu7itb59y5trr37quikyo/iaiuk1dwa3rrurkgwnfcubwzjy/Screen Shot 2018-06-18 at 5.56.43 PM.png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <ParticipantLeft>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1538771679410</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538771679410</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="MoreChannels2 hbhjb">
    <RoomID>public - 11acipo6qtn7pdabbstya78sfo</RoomID>
    <StartTimeUTC>1536185645456</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>jonathan.fritz+4.7@mattermost.com</LoginName>
      <DateTimeUTC>1518462819789</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindsay@mattermost.com</LoginName>
      <DateTimeUTC>1536173970657</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindsay@mattermost.com</LoginName>
      <DateTimeUTC>1536185645456</DateTimeUTC>
      <Content>~3 channels</Content>
    </Message>
    <Message>
      <LoginName>lindsay@mattermost.com</LoginName>
      <DateTimeUTC>1536185652420</DateTimeUTC>
      <Content>~300 channels </Content>
    </Message>
    <ParticipantLeft>
      <LoginName>jonathan.fritz+4.7@mattermost.com</LoginName>
      <DateTimeUTC>1536185652420</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindsay@mattermost.com</LoginName>
      <DateTimeUTC>1536185652420</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536185652420</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="E channel">
    <RoomID>public - 1m1ke6dwjbbidrxjgjgpjf5mpy</RoomID>
    <StartTimeUTC>1536192684041</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1530893739656</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1530893814959</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1536178802173</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+5jul@mattermost.com</LoginName>
      <DateTimeUTC>1536178802173</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>kwiersgalla@example.com</LoginName>
      <DateTimeUTC>1536178809168</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536192684041</DateTimeUTC>
      <Content>@katieplustest </Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536192709829</DateTimeUTC>
      <Content>@katieplustest </Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536192800649</DateTimeUTC>
      <Content>posting a message</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536192944850</DateTimeUTC>
      <Content>fhjhgf</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>katie+5jul@mattermost.com</LoginName>
      <DateTimeUTC>1536192944850</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1536192944850</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1536192944850</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536192944850</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>kwiersgalla@example.com</LoginName>
      <DateTimeUTC>1536192944850</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536192944850</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Group Message">
    <RoomID>group - 6msty19k1prf7ygyj5g913ji5a</RoomID>
    <StartTimeUTC>1536292241708</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536292238970</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+qzkhdqezoi84jgxyroegmhwqcrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536292238989</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536292239004</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536292241708</DateTimeUTC>
      <Content>hubert?</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536292241708</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536292241708</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+qzkhdqezoi84jgxyroegmhwqcrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536292241708</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536292241708</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="toarchive6">
    <RoomID>public - mszysafrr7y4pbdzye8dgt1rne</RoomID>
    <StartTimeUTC>1539251071524</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1539251062903</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1539251071524</DateTimeUTC>
      <Content>pineapple pie test archive</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1539251071524</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1539251071524</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="DKH Channel 3">
    <RoomID>private - iyw936ziatrhpbaum56eqi9phy</RoomID>
    <StartTimeUTC>1536274785722</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1525805484653</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan.haussermann@mattermost.com</LoginName>
      <DateTimeUTC>1525805954876</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1525807098074</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+1rae4yficinqffw3ygypqf35nhsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1528335466368</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+zw3aekuaaffs5c5wnncjq5ag3hsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1528335466397</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+qzkhdqezoi84jgxyroegmhwqcrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1528335466401</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536274785722</DateTimeUTC>
      <Content>post</Content>
    </Message>
    <Message>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536274798902</DateTimeUTC>
      <Content>https://ci-linux-mysql.mattermost.com/dkh-team/pl/dhxujzotki8buqb41nkwbino1c</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1538185276878</DateTimeUTC>
      <Content>coffee</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1538185276878</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan.haussermann@mattermost.com</LoginName>
      <DateTimeUTC>1538185276878</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1538185276878</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+1rae4yficinqffw3ygypqf35nhsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538185276878</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+qzkhdqezoi84jgxyroegmhwqcrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538185276878</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+zw3aekuaaffs5c5wnncjq5ag3hsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538185276878</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538185276878</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="authorize">
    <RoomID>private - 563fxkj9epfbzd93te66qsooxh</RoomID>
    <StartTimeUTC>1536245918936</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1528126212237</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1528126254357</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1528297357246</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>asaad+1@mattermost.com</LoginName>
      <DateTimeUTC>1528297549570</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+4j6oifu37pr5dmdtpp48jmqteesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1528297570714</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1528654689981</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jason+118@mattermost.com</LoginName>
      <DateTimeUTC>1536242506350</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536245918936</DateTimeUTC>
      <Content>@HERE </Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536245932305</DateTimeUTC>
      <Content>@HERE </Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536245937580</DateTimeUTC>
      <Content>@here </Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536245941821</DateTimeUTC>
      <Content>@HERE </Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536245954935</DateTimeUTC>
      <Content>@here </Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536245957498</DateTimeUTC>
      <Content>@channel </Content>
    </Message>
    <ParticipantLeft>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1536245957498</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>asaad+1@mattermost.com</LoginName>
      <DateTimeUTC>1536245957498</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536245957498</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536245957498</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536245957498</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jason+118@mattermost.com</LoginName>
      <DateTimeUTC>1536245957498</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4j6oifu37pr5dmdtpp48jmqteesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536245957498</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536245957498</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="toarchive4">
    <RoomID>public - f39x44tf83rh7ktz49u8obhyqw</RoomID>
    <StartTimeUTC>1534360685316</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1534360677118</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1534360685316</DateTimeUTC>
      <Content>post in toarchive4</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1534360685316</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1534360685316</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="file downloads off">
    <RoomID>public - garhrout7ifm3c3fjth9ck158y</RoomID>
    <StartTimeUTC>1535962782590</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1535962719758</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536311818278</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1535962782590</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1535962782590</DateTimeUTC>
      <UserFileName>MP3.mp3</UserFileName>
      <FileName>20180903/teams/noteam/channels/garhrout7ifm3c3fjth9ck158y/users/qqu7z5pcbtycdczx4jetogekro/665tj3zh8f8d7q1pgkxmgqrk3o/MP3.mp3</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1535962782590</DateTimeUTC>
      <UserFileName>JSON</UserFileName>
      <FileName>20180903/teams/noteam/channels/garhrout7ifm3c3fjth9ck158y/users/qqu7z5pcbtycdczx4jetogekro/8tx16gh7wbngincefsnkqsyhnc/JSON</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1535962782590</DateTimeUTC>
      <UserFileName>Excel.xlsx</UserFileName>
      <FileName>20180903/teams/noteam/channels/garhrout7ifm3c3fjth9ck158y/users/qqu7z5pcbtycdczx4jetogekro/755xbkb5apgi9k9nouwrnidmyo/Excel.xlsx</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1535962782590</DateTimeUTC>
      <UserFileName>PDF.pdf</UserFileName>
      <FileName>20180903/teams/noteam/channels/garhrout7ifm3c3fjth9ck158y/users/qqu7z5pcbtycdczx4jetogekro/dqb9s697kjbwz85kpty114sxza/PDF.pdf</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1535962782590</DateTimeUTC>
      <UserFileName>PPT.pptx</UserFileName>
      <FileName>20180903/teams/noteam/channels/garhrout7ifm3c3fjth9ck158y/users/qqu7z5pcbtycdczx4jetogekro/j6a3f5ciibghb8uesupmryprzw/PPT.pptx</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1535962782590</DateTimeUTC>
      <UserFileName>MP3.mp3</UserFileName>
      <FileName>20180903/teams/noteam/channels/garhrout7ifm3c3fjth9ck158y/users/qqu7z5pcbtycdczx4jetogekro/665tj3zh8f8d7q1pgkxmgqrk3o/MP3.mp3</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1535962782590</DateTimeUTC>
      <UserFileName>JSON</UserFileName>
      <FileName>20180903/teams/noteam/channels/garhrout7ifm3c3fjth9ck158y/users/qqu7z5pcbtycdczx4jetogekro/8tx16gh7wbngincefsnkqsyhnc/JSON</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1535962782590</DateTimeUTC>
      <UserFileName>Excel.xlsx</UserFileName>
      <FileName>20180903/teams/noteam/channels/garhrout7ifm3c3fjth9ck158y/users/qqu7z5pcbtycdczx4jetogekro/755xbkb5apgi9k9nouwrnidmyo/Excel.xlsx</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1535962782590</DateTimeUTC>
      <UserFileName>PDF.pdf</UserFileName>
      <FileName>20180903/teams/noteam/channels/garhrout7ifm3c3fjth9ck158y/users/qqu7z5pcbtycdczx4jetogekro/dqb9s697kjbwz85kpty114sxza/PDF.pdf</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1535962782590</DateTimeUTC>
      <UserFileName>PPT.pptx</UserFileName>
      <FileName>20180903/teams/noteam/channels/garhrout7ifm3c3fjth9ck158y/users/qqu7z5pcbtycdczx4jetogekro/j6a3f5ciibghb8uesupmryprzw/PPT.pptx</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1535962820502</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1535962820502</DateTimeUTC>
      <UserFileName>Word.docx</UserFileName>
      <FileName>20180903/teams/noteam/channels/garhrout7ifm3c3fjth9ck158y/users/qqu7z5pcbtycdczx4jetogekro/s3jgwum5kiyp8nxi8n6dmb6djr/Word.docx</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1535962820502</DateTimeUTC>
      <UserFileName>JPG.jpg</UserFileName>
      <FileName>20180903/teams/noteam/channels/garhrout7ifm3c3fjth9ck158y/users/qqu7z5pcbtycdczx4jetogekro/xjmjmrbgbif9drr7gua18yq94e/JPG.jpg</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1535962820502</DateTimeUTC>
      <UserFileName>PPT.pptx</UserFileName>
      <FileName>20180903/teams/noteam/channels/garhrout7ifm3c3fjth9ck158y/users/qqu7z5pcbtycdczx4jetogekro/4anfxjp3i3fxz8zp8sncxecafo/PPT.pptx</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1535962820502</DateTimeUTC>
      <UserFileName>MP4.mp4</UserFileName>
      <FileName>20180903/teams/noteam/channels/garhrout7ifm3c3fjth9ck158y/users/qqu7z5pcbtycdczx4jetogekro/sqgs1m1bxig5fjar9x81sruwfo/MP4.mp4</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1535962820502</DateTimeUTC>
      <UserFileName>Word.docx</UserFileName>
      <FileName>20180903/teams/noteam/channels/garhrout7ifm3c3fjth9ck158y/users/qqu7z5pcbtycdczx4jetogekro/s3jgwum5kiyp8nxi8n6dmb6djr/Word.docx</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1535962820502</DateTimeUTC>
      <UserFileName>JPG.jpg</UserFileName>
      <FileName>20180903/teams/noteam/channels/garhrout7ifm3c3fjth9ck158y/users/qqu7z5pcbtycdczx4jetogekro/xjmjmrbgbif9drr7gua18yq94e/JPG.jpg</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1535962820502</DateTimeUTC>
      <UserFileName>PPT.pptx</UserFileName>
      <FileName>20180903/teams/noteam/channels/garhrout7ifm3c3fjth9ck158y/users/qqu7z5pcbtycdczx4jetogekro/4anfxjp3i3fxz8zp8sncxecafo/PPT.pptx</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1535962820502</DateTimeUTC>
      <UserFileName>MP4.mp4</UserFileName>
      <FileName>20180903/teams/noteam/channels/garhrout7ifm3c3fjth9ck158y/users/qqu7z5pcbtycdczx4jetogekro/sqgs1m1bxig5fjar9x81sruwfo/MP4.mp4</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1535995202068</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1535995202068</DateTimeUTC>
      <UserFileName>7F91835F-5D3B-411A-9607-8D7A7624FE11.jpg</UserFileName>
      <FileName>20180903/teams/noteam/channels/garhrout7ifm3c3fjth9ck158y/users/qqu7z5pcbtycdczx4jetogekro/uw8dmfi69frntqxkf6cks9k1oh/7F91835F-5D3B-411A-9607-8D7A7624FE11.jpg</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1535995202068</DateTimeUTC>
      <UserFileName>7F91835F-5D3B-411A-9607-8D7A7624FE11.jpg</UserFileName>
      <FileName>20180903/teams/noteam/channels/garhrout7ifm3c3fjth9ck158y/users/qqu7z5pcbtycdczx4jetogekro/uw8dmfi69frntqxkf6cks9k1oh/7F91835F-5D3B-411A-9607-8D7A7624FE11.jpg</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1535995645197</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1535995645197</DateTimeUTC>
      <UserFileName>FBC2AED2-6919-45E3-9F7E-63F8484A2377.jpg</UserFileName>
      <FileName>20180903/teams/noteam/channels/garhrout7ifm3c3fjth9ck158y/users/qqu7z5pcbtycdczx4jetogekro/9cb8tikd13dfdmwqs9a8bkxcpo/FBC2AED2-6919-45E3-9F7E-63F8484A2377.jpg</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1535995645197</DateTimeUTC>
      <UserFileName>FBC2AED2-6919-45E3-9F7E-63F8484A2377.jpg</UserFileName>
      <FileName>20180903/teams/noteam/channels/garhrout7ifm3c3fjth9ck158y/users/qqu7z5pcbtycdczx4jetogekro/9cb8tikd13dfdmwqs9a8bkxcpo/FBC2AED2-6919-45E3-9F7E-63F8484A2377.jpg</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538675474650</DateTimeUTC>
      <Content>https://ci-linux-mysql.mattermost.com/lindys-team-1/pl/iyazh8nt6pgsjf5gfhgpsns9nr</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536311813257</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538675474650</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538675474650</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Off-Topic">
    <RoomID>public - fzieuipr4jrrmjsazzj6s6sceo</RoomID>
    <StartTimeUTC>1536106132291</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1534373053726</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1534373225892</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1536106126303</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1536106132291</DateTimeUTC>
      <Content>PROBLEM srvnagios at 10.4.1.74/MYSQL_threads-connected is WARNING</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1536106132291</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1536106132291</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536106132291</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536106132291</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - 7x5hzozt73ykxmymhsxkgwdeky</RoomID>
    <StartTimeUTC>1536161517326</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1536161517326</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1536161517326</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1536161517326</DateTimeUTC>
      <Content>h</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1536161525724</DateTimeUTC>
      <Content>h</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1536161777677</DateTimeUTC>
      <Content>https://ci-linux-mysql.mattermost.com/eh/pl/hkgm3qk1xfb7dr6pzmp9a711jh</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1536161906724</DateTimeUTC>
      <Content>h</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1536180462679</DateTimeUTC>
      <Content>mm :shaky: </Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1536180610509</DateTimeUTC>
      <Content>```latex&#xA;X_k = \sum_{n=0}^{2N-1} x_n \cos \left[\frac{\pi}{N} \left(n+\frac{1}{2}+\frac{N}{2}\right) \left(k+\frac{1}{2}\right) \right]&#xA;```</Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1537397929518</DateTimeUTC>
      <Content>m</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1537397929518</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1537397929518</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1537397929518</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Group Message">
    <RoomID>group - azuphgmw5jym7qzt4ef1g41q7a</RoomID>
    <StartTimeUTC>1536166387907</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>success+zw3aekuaaffs5c5wnncjq5ag3hsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536166384044</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+qzkhdqezoi84jgxyroegmhwqcrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536166384062</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais+1@mattermost.com</LoginName>
      <DateTimeUTC>1536166384081</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+mmcu65jphfgktruyhiu734t9bwsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536166384098</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+4j6oifu37pr5dmdtpp48jmqteesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536166384115</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+1rae4yficinqffw3ygypqf35nhsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536166384135</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1536166384153</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1536166384172</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1536166387907</DateTimeUTC>
      <Content>h</Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1536166396490</DateTimeUTC>
      <Content>h</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>amy.blais+1@mattermost.com</LoginName>
      <DateTimeUTC>1536166396490</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1536166396490</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1536166396490</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+1rae4yficinqffw3ygypqf35nhsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536166396490</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4j6oifu37pr5dmdtpp48jmqteesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536166396490</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+mmcu65jphfgktruyhiu734t9bwsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536166396490</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+qzkhdqezoi84jgxyroegmhwqcrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536166396490</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+zw3aekuaaffs5c5wnncjq5ag3hsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536166396490</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536166396490</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="J Channel">
    <RoomID>public - jhjs79u76td9jb8u1uf4jkde4o</RoomID>
    <StartTimeUTC>1536192837194</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1530907441309</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536192837194</DateTimeUTC>
      <Content>posting a message</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536192837194</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536192837194</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="private a">
    <RoomID>private - pj756czfstn6beb6fm3mc63e7r</RoomID>
    <StartTimeUTC>1536192851086</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1530893691350</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1530893868981</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536192851086</DateTimeUTC>
      <Content>posting a message</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1536192851086</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536192851086</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536192851086</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="mine">
    <RoomID>public - at7ed54j7tr6bfj811p9zedcna</RoomID>
    <StartTimeUTC>1538660225611</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1538419829836</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538419841912</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538660225611</DateTimeUTC>
      <Content>:aa: :bb:0 :cc: :dd: :ee: :ff: :gg: :hh: :ii: :jj: :kk:</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538664296363</DateTimeUTC>
      <Content>~~h~~</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538664296363</DateTimeUTC>
      <Content>h</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538664364067</DateTimeUTC>
      <Content>h</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538664950232</DateTimeUTC>
      <Content>&gt;this is&#xA;&#xA;&gt;really&#xA;&#xA;&gt;three quotes</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538665025198</DateTimeUTC>
      <Content>m</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538665310359</DateTimeUTC>
      <Content>h</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538665558648</DateTimeUTC>
      <Content># Basic Markdown Testing&#xA;Tests for text style, code blocks, in-line code and images, lines, block quotes, and headings.&#xA;&#xA;### Text Style&#xA;&#xA;**The following text should render as:**  &#xA;_Italics_&#xA;_Ita_lics_&#xA;*Italics*&#xA;**Bold**&#xA;***Bold-italics***&#xA;**_Bold-italics_**&#xA;~~Strikethrough~~&#xA;&#xA;This sentence contains **bold**, _italic_, ***bold-italic***, and ~~stikethrough~~ text.  &#xA;&#xA;**The following should render as normal text:**  &#xA;Normal Text_  &#xA;_Normal Text  &#xA;_Normal Text*&#xA;&#xA;### Carriage Return  &#xA;&#xA;Line #1 followed by one blank line &#xA;&#xA;Line #2 followed by one blank line&#xA;&#xA;Line #3 followed by Line #4&#xA;Line #4 &#xA;&#xA;&#xA;### Code Blocks&#xA;&#xA;```&#xA;This text should render in a code block&#xA;```&#xA;&#xA;**The following markdown should not render:**  &#xA;```&#xA;_Italics_  &#xA;*Italics*  &#xA;**Bold**  &#xA;***Bold-italics***  &#xA;**Bold-italics_**  &#xA;~~Strikethrough~~&#xA;:) :-) ;) ;-) :o :O :-o :-O &#xA;:bamboo: :gift_heart: :dolls: :school_satchel: :mortar_board:&#xA;# Heading 1&#xA;## Heading 2&#xA;### Heading 3&#xA;#### Heading 4&#xA;##### Heading 5&#xA;###### Heading 6&#xA;&gt; Block Quote&#xA;- List&#xA;  - List Sub-item&#xA;[Link](https://i.giphy.com/xNrM4cGJ8u3ao.gif)&#xA;[![Github](https://assets-cdn.github.com/favicon.ico)](https://github.com/mattermost/platform)&#xA;| Left-Aligned Text | Center Aligned Text | Right Aligned Text |&#xA;| :------------ |:---------------:| -----:|&#xA;| Left column 1 | this text       |  $100 |&#xA;```&#xA;&#xA;**The following links should not auto-link or generate previews:**  &#xA;```&#xA;GIF: https://i.giphy.com/xNrM4cGJ8u3ao.gif&#xA;Website: https://en.wikipedia.org/wiki/Dolphin&#xA;```&#xA;&#xA;**The following should appear as a carriage return separating two lines of text:**&#xA;```&#xA;Line #1 followed by a blank line&#xA;&#xA;Line #2 following a blank line&#xA;```&#xA;&#xA;### In-line Code&#xA;&#xA;The word `monospace` should render as in-line code.  &#xA;&#xA;The following markdown in-line code should not render:  &#xA;`_Italics_`, `*Italics*`, `**Bold**`, `***Bold-italics***`, `**Bold-italics_**`, `~~Strikethrough~~`, `:)` , `:-)` , `;)` , `:-O` , `:bamboo:` , `:gift_heart:` , `:dolls:` , `# Heading 1`, `## Heading 2`, `### Heading 3`, `#### Heading 4`, `##### Heading 5`, `###### Heading 6`&#xA;&#xA;This GIF link should not preview: `https://i.giphy.com/xNrM4cGJ8u3ao.gif`  &#xA;This link should not auto-link: `https://en.wikipedia.org/wiki/Dolphin`  &#xA;&#xA;This sentence with `&#xA;in-line code&#xA;` should appear on one line.&#xA;&#xA;### In-line Images&#xA;&#xA;Mattermost/platform build status:  [![Build Status](https://travis-ci.org/mattermost/platform.svg?branch=master)](https://travis-ci.org/mattermost/platform)  &#xA;&#xA;GitHub favicon:  ![Github](https://assets-cdn.github.com/favicon.ico)&#xA;&#xA;GIF Image:  &#xA;![gif](https://i.giphy.com/xNrM4cGJ8u3ao.gif)&#xA;&#xA;4K Wallpaper Image (11Mb):  &#xA;![4K Image](https://images.wallpaperscraft.com/image/starry_sky_shine_glitter_118976_3840x2160.jpg)&#xA;&#xA;Panorama Image:  &#xA;![Pano](http://amardeepphotography.com/wp-content/uploads/2012/11/Untitled_Panorama6small.jpg)&#xA;&#xA;Tall Portrait Image:  &#xA;![Portrait](http://www.maniacworld.com/now-this-is-a-tall-building.jpg)&#xA;&#xA;Tall Portrait Image (resized):  &#xA;![Portrait](http://www.maniacworld.com/now-this-is-a-tall-building.jpg =x200)&#xA;&#xA;Tall Portrait Image (resized to a square):  &#xA;![Portrait](http://www.maniacworld.com/now-this-is-a-tall-building.jpg =200x200)&#xA;&#xA;### Lines&#xA;&#xA;Three lines should render with text between them:  &#xA;&#xA;Text above line&#xA;&#xA;***&#xA;&#xA;Text between lines&#xA;&#xA;---  &#xA;&#xA;Text between lines&#xA;___  &#xA;&#xA;Text below line&#xA;&#xA;### Block Quotes&#xA;&#xA;&gt;This text should render in a block quote.&#xA;&#xA;**The following markdown should render within the block quote:**  &#xA;&gt; #### Heading 4  &#xA;&gt; _Italics_, *Italics*, **Bold**, ***Bold-italics***, **_Bold-italics_**, ~~Strikethrough~~  &#xA;&gt; :) :-) ;) :-O :bamboo: :gift_heart: :dolls:  &#xA;&#xA;**The following text should render in two block quotes separated by one line of text:**&#xA;&gt; Block quote 1&#xA;&#xA;Text between block quotes&#xA;&#xA;&gt; Block quote 2&#xA;&#xA;### Headings&#xA;&#xA;# Heading 1 font size  &#xA;## Heading 2 font size   &#xA;### Heading 3 font size  &#xA;#### Heading 4 font size  &#xA;##### Heading 5 font size  &#xA;###### Heading 6 font size  &#xA;&#xA;&#xA;### Escaped Characters&#xA;&#xA;**The following text should render the same as the raw text:**&#xA;Raw: `\\teamlinux\IT-Stuff\WorkingStuff`&#xA;Markdown: \\teamlinux\IT-Stuff\WorkingStuff&#xA;&#xA;&#xA;**The following text should escape out the first backslash so only one backslash appears:**&#xA;Raw: \\()#&#xA;Markdown: \\()#</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538665880771</DateTimeUTC>
      <Content>The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Hello this is a long post, with more than 4000 characters, plus multiple attachments.</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538665880771</DateTimeUTC>
      <UserFileName>blue-icon@2x.png</UserFileName>
      <FileName>20181004/teams/noteam/channels/at7ed54j7tr6bfj811p9zedcna/users/yphfragmx7rsjg1u97853uw5pe/r66i79xgopn13rxcjw1gnpj4fc/blue-icon@2x.png</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538665880771</DateTimeUTC>
      <UserFileName>AD-LDAP.png</UserFileName>
      <FileName>20181004/teams/noteam/channels/at7ed54j7tr6bfj811p9zedcna/users/yphfragmx7rsjg1u97853uw5pe/ydf5nqyj1fy6ukr96eaq5abqdr/AD-LDAP.png</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538665880771</DateTimeUTC>
      <UserFileName>calendar2.png</UserFileName>
      <FileName>20181004/teams/noteam/channels/at7ed54j7tr6bfj811p9zedcna/users/yphfragmx7rsjg1u97853uw5pe/xc91cbcj5fd79cpd4ejs4s5d7w/calendar2.png</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538665880771</DateTimeUTC>
      <UserFileName>AccountAnalytics.pdf</UserFileName>
      <FileName>20181004/teams/noteam/channels/at7ed54j7tr6bfj811p9zedcna/users/yphfragmx7rsjg1u97853uw5pe/gnh7gzcr67boje1ek7cd7ditoy/AccountAnalytics.pdf</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538665880771</DateTimeUTC>
      <UserFileName>blue-icon@2x.png</UserFileName>
      <FileName>20181004/teams/noteam/channels/at7ed54j7tr6bfj811p9zedcna/users/yphfragmx7rsjg1u97853uw5pe/r66i79xgopn13rxcjw1gnpj4fc/blue-icon@2x.png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538665880771</DateTimeUTC>
      <UserFileName>AD-LDAP.png</UserFileName>
      <FileName>20181004/teams/noteam/channels/at7ed54j7tr6bfj811p9zedcna/users/yphfragmx7rsjg1u97853uw5pe/ydf5nqyj1fy6ukr96eaq5abqdr/AD-LDAP.png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538665880771</DateTimeUTC>
      <UserFileName>calendar2.png</UserFileName>
      <FileName>20181004/teams/noteam/channels/at7ed54j7tr6bfj811p9zedcna/users/yphfragmx7rsjg1u97853uw5pe/xc91cbcj5fd79cpd4ejs4s5d7w/calendar2.png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538665880771</DateTimeUTC>
      <UserFileName>AccountAnalytics.pdf</UserFileName>
      <FileName>20181004/teams/noteam/channels/at7ed54j7tr6bfj811p9zedcna/users/yphfragmx7rsjg1u97853uw5pe/gnh7gzcr67boje1ek7cd7ditoy/AccountAnalytics.pdf</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538666092381</DateTimeUTC>
      <Content>https://ci-linux-mysql.mattermost.com/yourteamhere/pl/jo9sd3rekirjtp5qpofwyo538a</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538687951228</DateTimeUTC>
      <Content>`one`</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538687954558</DateTimeUTC>
      <Content>`two`</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538687957995</DateTimeUTC>
      <Content>`three`</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538687957995</DateTimeUTC>
      <Content>`three`</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538687957995</DateTimeUTC>
      <Content>`three`</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538687957995</DateTimeUTC>
      <Content>`three`</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538687957995</DateTimeUTC>
      <Content>`three`</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538687993705</DateTimeUTC>
      <Content>`one`</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538687999360</DateTimeUTC>
      <Content>`t`</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538688376441</DateTimeUTC>
      <Content>https://pre-release.mattermost.com/core/pl/e3jwpour8bb9myzc55nnrfxsgh</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538688529008</DateTimeUTC>
      <Content>https://small.chat/</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538688529008</DateTimeUTC>
      <Content>https://small.chat/</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538688565833</DateTimeUTC>
      <Content>https://small.chat/</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538691819796</DateTimeUTC>
      <Content>:bamboo: </Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538691851105</DateTimeUTC>
      <Content>:+1: nn</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538691867952</DateTimeUTC>
      <Content>aa :stuck_out_tongue_closed_eyes: hh</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538691943992</DateTimeUTC>
      <Content>:stuck_out_tongue_closed_eyes: </Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538691970233</DateTimeUTC>
      <Content>:stuck_out_tongue: </Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538691982389</DateTimeUTC>
      <Content>:relieved: &#xA;&#xA;&#xA;&#xA;:zipper_mouth_face: </Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538692213596</DateTimeUTC>
      <Content>mm</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538692228489</DateTimeUTC>
      <Content>mm</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538692398428</DateTimeUTC>
      <Content>mmm                                                                                         </Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538692443852</DateTimeUTC>
      <Content>mm&#xA;&#xA;mmm&#xA;&#xA;m&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;m&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;mm</Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1538693179079</DateTimeUTC>
      <Content>m</Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1538693187362</DateTimeUTC>
      <Content>m</Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1538693189150</DateTimeUTC>
      <Content>https://media1.giphy.com/media/l41lM6sJvwmZNruLe/giphy.gif</Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1538694015405</DateTimeUTC>
      <Content>mm</Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1538694079393</DateTimeUTC>
      <Content>mmm&#xA;```&#xA;mmm&#xA;```</Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1538694133250</DateTimeUTC>
      <Content>&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;:stuck_out_tongue_closed_eyes: </Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1538694217533</DateTimeUTC>
      <Content>mm&#xA;```&#xA;mm&#xA;```</Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1538695166929</DateTimeUTC>
      <Content>っっっm</Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1538695187351</DateTimeUTC>
      <Content>っっっっm</Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1538695266357</DateTimeUTC>
      <Content>っっmんんん密密麻麻👩っっっっmんgっhfhf</Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1538695294537</DateTimeUTC>
      <Content>ㅇㅏㄴ녀ㅎ핫ㅔ요</Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1538695338170</DateTimeUTC>
      <Content>안녀ㅎ핫ㅔ요</Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1538753466951</DateTimeUTC>
      <Content>Hey all, back from vacation!</Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1538753506242</DateTimeUTC>
      <Content>:grinning: </Content>
    </Message>
    <ParticipantLeft>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538753506242</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1538753506242</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538753506242</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Group Message">
    <RoomID>group - ca883n3gw3np3qsechgbtqo5gy</RoomID>
    <StartTimeUTC>1538768760544</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1538768756146</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>martin+test2@mattermost.com</LoginName>
      <DateTimeUTC>1538768756162</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>martin+test4@mattermost.com</LoginName>
      <DateTimeUTC>1538768756178</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1538768760544</DateTimeUTC>
      <Content>hi martins</Content>
    </Message>
    <Message>
      <LoginName>martin+test2@mattermost.com</LoginName>
      <DateTimeUTC>1538768800953</DateTimeUTC>
      <Content>adsf</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1538768800953</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>martin+test2@mattermost.com</LoginName>
      <DateTimeUTC>1538768800953</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>martin+test4@mattermost.com</LoginName>
      <DateTimeUTC>1538768800953</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538768800953</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="private b">
    <RoomID>private - wymdwaf7wtfjtmyb9hmhf14qyo</RoomID>
    <StartTimeUTC>1536192854910</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1530893696894</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1530893872502</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536192854910</DateTimeUTC>
      <Content>posting a message</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1536192854910</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536192854910</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536192854910</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="2nd edited">
    <RoomID>public - 6sbndtqhkpyobpkba18ja3ywqw</RoomID>
    <StartTimeUTC>1536269968562</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1530779717885</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1530781260676</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1530862367721</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1530864857403</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1536269968562</DateTimeUTC>
      <Content>@sudheerdev </Content>
    </Message>
    <Message>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1536269974166</DateTimeUTC>
      <Content>@sudheerdev </Content>
    </Message>
    <ParticipantLeft>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1536269974166</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1536269974166</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536269974166</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1536269974166</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536269974166</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - bemkqxutz3ywxgcb61adfsr1gh</RoomID>
    <StartTimeUTC>1537397835908</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>amy.blais+9@mattermost.com</LoginName>
      <DateTimeUTC>1537397829093</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1537397829098</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>amy.blais+9@mattermost.com</LoginName>
      <DateTimeUTC>1537397835908</DateTimeUTC>
      <Content>m</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>amy.blais+9@mattermost.com</LoginName>
      <DateTimeUTC>1537397835908</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1537397835908</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1537397835908</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="new1">
    <RoomID>private - ubrxojki67yq7fey4oqtun9fqr</RoomID>
    <StartTimeUTC>1538731544046</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1528356201798</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1528356214338</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1528458728890</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1528458929806</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy+test@mattermost.com</LoginName>
      <DateTimeUTC>1528458958362</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1538731544046</DateTimeUTC>
      <Content>@lindy</Content>
    </Message>
    <Message>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1538732388524</DateTimeUTC>
      <Content>hi</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538732513974</DateTimeUTC>
      <Content>a;lkasjdfkljasdlfkjas</Content>
    </Message>
    <Message>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1538733797829</DateTimeUTC>
      <Content>post</Content>
    </Message>
    <Message>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1538733846654</DateTimeUTC>
      <Content>hi</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1538733846654</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538733846654</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1538733846654</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy+test@mattermost.com</LoginName>
      <DateTimeUTC>1538733846654</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538733846654</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538733846654</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Announcements">
    <RoomID>public - qixmnd5eujdg3y5mijams3do1w</RoomID>
    <StartTimeUTC>1536192782776</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1528308789196</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1528315585032</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1528318267620</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+jun6@mattermost.com</LoginName>
      <DateTimeUTC>1528318729945</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+5jul@mattermost.com</LoginName>
      <DateTimeUTC>1530889339431</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1530889339541</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1530889339653</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>sweetkatiejo@example.com</LoginName>
      <DateTimeUTC>1533243778405</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>kwiersgalla@example.com</LoginName>
      <DateTimeUTC>1533243778606</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>slackimportuser_4ad7z1kt93gq7fquby39kkweqr@localhost</LoginName>
      <DateTimeUTC>1533243778862</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>slackimportuser_5ebgh7t1btfp3fgf9arydxqkhw@localhost</LoginName>
      <DateTimeUTC>1533247782250</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536192782776</DateTimeUTC>
      <Content>posting a message</Content>
    </Message>
    <Message>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1536194060152</DateTimeUTC>
      <Content>Uploading photo</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1536194060152</DateTimeUTC>
      <UserFileName>IMG_2120.JPG</UserFileName>
      <FileName>20180906/teams/noteam/channels/qixmnd5eujdg3y5mijams3do1w/users/chxcpdqp43rimrt1g7dszk9qea/56eirnuikt8adk4y374i94t46e/IMG_2120.JPG</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1536194060152</DateTimeUTC>
      <UserFileName>IMG_2120.JPG</UserFileName>
      <FileName>20180906/teams/noteam/channels/qixmnd5eujdg3y5mijams3do1w/users/chxcpdqp43rimrt1g7dszk9qea/56eirnuikt8adk4y374i94t46e/IMG_2120.JPG</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537466886736</DateTimeUTC>
      <Content>test</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537466887630</DateTimeUTC>
      <Content>testing</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537466888263</DateTimeUTC>
      <Content>most</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537990982842</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537990982842</DateTimeUTC>
      <UserFileName>PDF.pdf</UserFileName>
      <FileName>20180926/teams/noteam/channels/qixmnd5eujdg3y5mijams3do1w/users/jiwfp5bf6fymbrgi6czdqhs6fw/cb7nbmccx7r17mnonumn4hixme/PDF.pdf</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537990982842</DateTimeUTC>
      <UserFileName>PDF.pdf</UserFileName>
      <FileName>20180926/teams/noteam/channels/qixmnd5eujdg3y5mijams3do1w/users/jiwfp5bf6fymbrgi6czdqhs6fw/cb7nbmccx7r17mnonumn4hixme/PDF.pdf</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1537990982842</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie+5jul@mattermost.com</LoginName>
      <DateTimeUTC>1537990982842</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie+jun6@mattermost.com</LoginName>
      <DateTimeUTC>1537990982842</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1537990982842</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1537990982842</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537990982842</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>kwiersgalla@example.com</LoginName>
      <DateTimeUTC>1537990982842</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>slackimportuser_4ad7z1kt93gq7fquby39kkweqr@localhost</LoginName>
      <DateTimeUTC>1537990982842</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>slackimportuser_5ebgh7t1btfp3fgf9arydxqkhw@localhost</LoginName>
      <DateTimeUTC>1537990982842</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>sweetkatiejo@example.com</LoginName>
      <DateTimeUTC>1537990982842</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1537990982842</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="private e">
    <RoomID>private - nx1f3t1w3bf7uqwwdsbeoam14h</RoomID>
    <StartTimeUTC>1536193029580</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1530893714164</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1530893879956</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536193029580</DateTimeUTC>
      <Content>hlkjh</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1536193029580</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536193029580</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536193029580</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="toarchive11">
    <RoomID>public - m3cqb3pfetdb8qjggmxxixxd9o</RoomID>
    <StartTimeUTC>1537642231429</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1537642221693</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1537642231429</DateTimeUTC>
      <Content>this is a channel to archive test testing</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1537642231429</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1537642231429</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Town Square">
    <RoomID>public - yxyrofsy338xbpxkwatpy69pgo</RoomID>
    <StartTimeUTC>1538674803338</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>martin+test2@mattermost.com</LoginName>
      <DateTimeUTC>1512741228750</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>martin+test3@mattermost.com</LoginName>
      <DateTimeUTC>1512741633655</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>joram+1@mattermost.com</LoginName>
      <DateTimeUTC>1512751108378</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindsay+abc@mattermost.com</LoginName>
      <DateTimeUTC>1512752284434</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>joram+1@mattermost.com</LoginName>
      <DateTimeUTC>1512752381232</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindsay@mattermost.com</LoginName>
      <DateTimeUTC>1512752983910</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+5k9tstziw7dqpf1em9h6dapuewsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1512761215779</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+5pcbjcto9bgipfbb4hb6qxrq7asimulator.amazonses.com</LoginName>
      <DateTimeUTC>1512761215903</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+4j6oifu37pr5dmdtpp48jmqteesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1512761216039</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+qzkhdqezoi84jgxyroegmhwqcrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1512761216163</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+5qytzfb53tbcfrtza19bpcxa6esimulator.amazonses.com</LoginName>
      <DateTimeUTC>1512761216286</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+k163actt7fynpexxp37r1d8rkcsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1512761216409</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+mmcu65jphfgktruyhiu734t9bwsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1512761216533</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+jdx1ix41b78dmgn4c9xcz1ij7rsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1512761216654</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+9phitiyni3n9zyqtyn7qe7gzhesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1512761216774</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+dpotox7uqpf7bpquq45op4rbdrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1512761216896</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+djh77mgwd3nw9bsj8fjxgee6posimulator.amazonses.com</LoginName>
      <DateTimeUTC>1512761217016</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindsay+abc@mattermost.com</LoginName>
      <DateTimeUTC>1512761628821</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1512837384358</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jonathan.fritz+test1@mattermost.com</LoginName>
      <DateTimeUTC>1513026912067</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jonathan.fritz+test1@mattermost.com</LoginName>
      <DateTimeUTC>1513027001530</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jon@jonathanfritz.ca</LoginName>
      <DateTimeUTC>1513088142772</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>joram@mattermost.com</LoginName>
      <DateTimeUTC>1515181957333</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>george+46@mattermost.com</LoginName>
      <DateTimeUTC>1515411000963</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>derrick.anderson@mattermost.com</LoginName>
      <DateTimeUTC>1515444260537</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>derrick.anderson@mattermost.com</LoginName>
      <DateTimeUTC>1515445358696</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>derrick.anderson+test2@mattermost.com</LoginName>
      <DateTimeUTC>1515445471318</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>derrick.anderson+test3@mattermost.com</LoginName>
      <DateTimeUTC>1515445766488</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>elias@mattermost.com</LoginName>
      <DateTimeUTC>1517595409027</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>elias+icu@mattermost.com</LoginName>
      <DateTimeUTC>1518091629792</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1518094199460</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1518097016301</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>chris+201802c@mattermost.com</LoginName>
      <DateTimeUTC>1518186608764</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>stephen@mattermost.com</LoginName>
      <DateTimeUTC>1518207933533</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1518208204239</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>joram+1@mattermost.com</LoginName>
      <DateTimeUTC>1518212410019</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>stephen+test@mattermost.com</LoginName>
      <DateTimeUTC>1518470726511</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindsay+v48secondaccount@mattermost.com</LoginName>
      <DateTimeUTC>1520513393603</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>george+48@mattermost.com</LoginName>
      <DateTimeUTC>1521036261104</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>george+48@mattermost.com</LoginName>
      <DateTimeUTC>1521036327964</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>george+48@mattermost.com</LoginName>
      <DateTimeUTC>1521036342608</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1521038530906</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+mysql@mattermost.com</LoginName>
      <DateTimeUTC>1522717718940</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+test.one@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1522733635956</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lf.brock+a@mattermost.com</LoginName>
      <DateTimeUTC>1522858453739</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>eric@mattermost.com</LoginName>
      <DateTimeUTC>1522858453849</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>eric+1@mattermost.com</LoginName>
      <DateTimeUTC>1522858454095</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>impact.a.one@mattermost.com</LoginName>
      <DateTimeUTC>1522858454306</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lf.brock+c@mattermost.com</LoginName>
      <DateTimeUTC>1522858454409</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+goog11apr@mattermost.com</LoginName>
      <DateTimeUTC>1522858454611</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>slackimportuser_igydaqyeu38hibqzzftz9i3gpo@localhost</LoginName>
      <DateTimeUTC>1522858454822</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>slackimportuser_5u9bnj586jrujnz4tbbgyw6o1a@localhost</LoginName>
      <DateTimeUTC>1522858498449</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>slackimportuser_8mhg49gj37f4m8t8nnysp7edgh@localhost</LoginName>
      <DateTimeUTC>1523125817731</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>saturnino+testing410@mattermost.com</LoginName>
      <DateTimeUTC>1525881772883</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1528401761471</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>george+48@mattermost.com</LoginName>
      <DateTimeUTC>1528468475093</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesse+alternate@mattermost.com</LoginName>
      <DateTimeUTC>1528487781577</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1533752564712</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537818535769</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindsay+abc@mattermost.com</LoginName>
      <DateTimeUTC>1538674803338</DateTimeUTC>
      <Content>@alindsay </Content>
    </Message>
    <Message>
      <LoginName>lindsay+abc@mattermost.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
      <Content>@alindsay </Content>
    </Message>
    <ParticipantLeft>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>chris+201802c@mattermost.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>derrick.anderson+test2@mattermost.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>derrick.anderson+test3@mattermost.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>derrick.anderson@mattermost.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>elias+icu@mattermost.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>elias@mattermost.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>eric+1@mattermost.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>eric@mattermost.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>george+46@mattermost.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>george+48@mattermost.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>impact.a.one@mattermost.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesse+alternate@mattermost.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jon@jonathanfritz.ca</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jonathan.fritz+test1@mattermost.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>joram+1@mattermost.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>joram@mattermost.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lf.brock+a@mattermost.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lf.brock+c@mattermost.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+goog11apr@mattermost.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+mysql@mattermost.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindsay+abc@mattermost.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindsay+v48secondaccount@mattermost.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindsay@mattermost.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>martin+test2@mattermost.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>martin+test3@mattermost.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>saturnino+testing410@mattermost.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>slackimportuser_5u9bnj586jrujnz4tbbgyw6o1a@localhost</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>slackimportuser_8mhg49gj37f4m8t8nnysp7edgh@localhost</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>slackimportuser_igydaqyeu38hibqzzftz9i3gpo@localhost</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>stephen+test@mattermost.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>stephen@mattermost.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4j6oifu37pr5dmdtpp48jmqteesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+5k9tstziw7dqpf1em9h6dapuewsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+5pcbjcto9bgipfbb4hb6qxrq7asimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+5qytzfb53tbcfrtza19bpcxa6esimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+9phitiyni3n9zyqtyn7qe7gzhesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+djh77mgwd3nw9bsj8fjxgee6posimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+dpotox7uqpf7bpquq45op4rbdrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+jdx1ix41b78dmgn4c9xcz1ij7rsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+k163actt7fynpexxp37r1d8rkcsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+mmcu65jphfgktruyhiu734t9bwsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+qzkhdqezoi84jgxyroegmhwqcrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+test.one@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538675341144</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538675341144</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Group Message">
    <RoomID>group - 6165yjz3ipb3jj41aeximhxjbc</RoomID>
    <StartTimeUTC>1536246279583</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>success+4j6oifu37pr5dmdtpp48jmqteesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536246082885</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesus+2@mattermost.com</LoginName>
      <DateTimeUTC>1536246082901</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesus.espino@mattermost.com</LoginName>
      <DateTimeUTC>1536246082916</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1536246082932</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1536246279583</DateTimeUTC>
      <Content>@jesus.espino test</Content>
    </Message>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1536246366446</DateTimeUTC>
      <Content>@jesus.espino Test</Content>
    </Message>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1536246490102</DateTimeUTC>
      <Content>@jesus.espino Test3</Content>
    </Message>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1536246541826</DateTimeUTC>
      <Content>Test</Content>
    </Message>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1536246545485</DateTimeUTC>
      <Content>Test3</Content>
    </Message>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1536246557063</DateTimeUTC>
      <Content>@jesus.espino Another test</Content>
    </Message>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1536246811440</DateTimeUTC>
      <Content>@jesus.espino Test&#xA;</Content>
    </Message>
    <Message>
      <LoginName>jesus.espino@mattermost.com</LoginName>
      <DateTimeUTC>1536267756224</DateTimeUTC>
      <Content>@jespino test</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1536267756224</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesus+2@mattermost.com</LoginName>
      <DateTimeUTC>1536267756224</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesus.espino@mattermost.com</LoginName>
      <DateTimeUTC>1536267756224</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4j6oifu37pr5dmdtpp48jmqteesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536267756224</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536267756224</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="test9">
    <RoomID>private - bbkw6en4dbbzicy9aefc5dup6y</RoomID>
    <StartTimeUTC>1536264514724</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1536264112398</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesus+2@mattermost.com</LoginName>
      <DateTimeUTC>1536264128317</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesus.espino+10@mattermost.com</LoginName>
      <DateTimeUTC>1536264168594</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesus+3@mattermost.com</LoginName>
      <DateTimeUTC>1536264168600</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+af9g73si6bn45qeh3ee5mx1pma@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1536264324932</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesus.espino@mattermost.com</LoginName>
      <DateTimeUTC>1536264488463</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+idztxxyszinbukdqr9wdg5u1ka@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1536264530295</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1536266384876</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1536264514724</DateTimeUTC>
      <Content>Test</Content>
    </Message>
    <Message>
      <LoginName>jesus.espino@mattermost.com</LoginName>
      <DateTimeUTC>1536267297437</DateTimeUTC>
      <Content>test</Content>
    </Message>
    <Message>
      <LoginName>jesus.espino@mattermost.com</LoginName>
      <DateTimeUTC>1536267359762</DateTimeUTC>
      <Content>@jespino test</Content>
    </Message>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1538756525034</DateTimeUTC>
      <Content>Post</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1536264669066</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1538756525034</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesus+2@mattermost.com</LoginName>
      <DateTimeUTC>1538756525034</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesus+3@mattermost.com</LoginName>
      <DateTimeUTC>1538756525034</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesus.espino+10@mattermost.com</LoginName>
      <DateTimeUTC>1538756525034</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesus.espino@mattermost.com</LoginName>
      <DateTimeUTC>1538756525034</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+af9g73si6bn45qeh3ee5mx1pma@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538756525034</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+idztxxyszinbukdqr9wdg5u1ka@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538756525034</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538756525034</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Off-Topic">
    <RoomID>public - 3mc9c6osipy8zekaetq1fih53h</RoomID>
    <StartTimeUTC>1536269368425</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1533673652020</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536265078033</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536291541761</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536269368425</DateTimeUTC>
      <Content>hkjhkjh</Content>
    </Message>
    <Message>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536291414515</DateTimeUTC>
      <Content>bob</Content>
    </Message>
    <Message>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536291438314</DateTimeUTC>
      <Content>test</Content>
    </Message>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536292273837</DateTimeUTC>
      <Content>Mesaage</Content>
    </Message>
    <Message>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536292286927</DateTimeUTC>
      <Content>hagis?</Content>
    </Message>
    <Message>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536292333037</DateTimeUTC>
      <Content>asdasd</Content>
    </Message>
    <Message>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536292630044</DateTimeUTC>
      <Content>@jesse </Content>
    </Message>
    <Message>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536292654469</DateTimeUTC>
      <Content>@jesse hagis?</Content>
    </Message>
    <Message>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536292742111</DateTimeUTC>
      <Content>@jesse hagis!</Content>
    </Message>
    <Message>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536292756390</DateTimeUTC>
      <Content>@jesse you ther?</Content>
    </Message>
    <Message>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536292809613</DateTimeUTC>
      <Content>@jesse yes</Content>
    </Message>
    <Message>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536292879642</DateTimeUTC>
      <Content>@jesse hagis</Content>
    </Message>
    <Message>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536292912129</DateTimeUTC>
      <Content>@jesse why did the chicken cross the road? </Content>
    </Message>
    <Message>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536292912129</DateTimeUTC>
      <Content>@charles why did the chicken cross the road?</Content>
    </Message>
    <Message>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536292933833</DateTimeUTC>
      <Content>@jesse why did the chicken cross?</Content>
    </Message>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536292943683</DateTimeUTC>
      <Content>To get to the other side?</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536292943683</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536292943683</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536292943683</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536292943683</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Long Post test">
    <RoomID>public - garyyoiiejnkjbfkmk6nxra66c</RoomID>
    <StartTimeUTC>1536274543984</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1528226656135</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1528234217740</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+dkhtsetuser01@mattermost.com</LoginName>
      <DateTimeUTC>1528238593360</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1528917220976</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1533752927979</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536274543984</DateTimeUTC>
      <Content>Link https://ci-linux-mysql.mattermost.com/dkh-team/pl/upctogas5bfixkpqirybeqcoyw</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536274549686</DateTimeUTC>
      <Content>https://ci-linux-mysql.mattermost.com/dkh-team/pl/upctogas5bfixkpqirybeqcoyw</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536275577088</DateTimeUTC>
      <Content>Blah</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536275580454</DateTimeUTC>
      <Content>https://ci-linux-mysql.mattermost.com/dkh-team/pl/s4uewzmxei8bfmnbhnxcbahg4c</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536275761642</DateTimeUTC>
      <Content>Post</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536275777357</DateTimeUTC>
      <Content>Reply to post</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536275997787</DateTimeUTC>
      <Content>Post</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536276004077</DateTimeUTC>
      <Content>Reply</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536276046114</DateTimeUTC>
      <Content>https://media1.giphy.com/media/l41lM6sJvwmZNruLe/giphy.gif</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536276502209</DateTimeUTC>
      <Content>One</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536276504702</DateTimeUTC>
      <Content>Two</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536276513620</DateTimeUTC>
      <Content>Three</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536277042583</DateTimeUTC>
      <Content>田那</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536277174524</DateTimeUTC>
      <Content>Test</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536277180093</DateTimeUTC>
      <Content>#### The quick, brown fox jumps over a lazy dog. &#xA;&#xA;*DJs flock by when MTV ax quiz prog.* Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sugar-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. &#xA;&#xA;#### A very bad quack might jinx zippy fowls. &#xA;&#xA;**Few quips galvanized the mock jury box.** Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. The end of this long post will be hidden until you choose to `Show More`.&#xA;</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536277326725</DateTimeUTC>
      <Content>#### The quick, brown fox jumps over a lazy dog. &#xA;&#xA;*DJs flock by when MTV ax quiz prog.* Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sugar-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. &#xA;&#xA;#### A very bad quack might jinx zippy fowls. &#xA;&#xA;**Few quips galvanized the mock jury box.** Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. The end of this long post will be hidden until you choose to `Show More`.&#xA;</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536277366847</DateTimeUTC>
      <Content>#### The quick, brown fox jumps over a lazy dog</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536277405552</DateTimeUTC>
      <Content>#### The quick, brown fox jumps over a lazy dog. &#xA;&#xA;*DJs flock by when MTV ax quiz prog.* Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sugar-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. &#xA;&#xA;#### A very bad quack might jinx zippy fowls. &#xA;&#xA;**Few quips galvanized the mock jury box.** Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. The end of this long post will be hidden until you choose to `Show More`.&#xA;</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536277405552</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536277405552</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+dkhtsetuser01@mattermost.com</LoginName>
      <DateTimeUTC>1536277405552</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536277405552</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1536277405552</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536277405552</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="1 period purpose">
    <RoomID>public - tjpj6omfs78qpko7y65k1f74gy</RoomID>
    <StartTimeUTC>1536311609551</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536309936706</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1536311576226</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1536311609551</DateTimeUTC>
      <Content>one</Content>
    </Message>
    <Message>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1536311653987</DateTimeUTC>
      <Content>two</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1537644633961</DateTimeUTC>
      <Content>post to edit</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1537644633961</DateTimeUTC>
      <Content>post to edit[posieifj&#39;;a</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1537644642261</DateTimeUTC>
      <Content>post to edit 2;aljskjsdf</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1537644642261</DateTimeUTC>
      <Content>post to edit 2</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538650911177</DateTimeUTC>
      <Content>typing a draft</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538650945596</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538650945596</DateTimeUTC>
      <UserFileName>Lindy Practice Test.html</UserFileName>
      <FileName>20181004/teams/noteam/channels/tjpj6omfs78qpko7y65k1f74gy/users/qqu7z5pcbtycdczx4jetogekro/nisyt16rtbyo7yphwfcnnqej1a/Lindy Practice Test.html</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538650945596</DateTimeUTC>
      <UserFileName>Lindy Practice Test.html</UserFileName>
      <FileName>20181004/teams/noteam/channels/tjpj6omfs78qpko7y65k1f74gy/users/qqu7z5pcbtycdczx4jetogekro/nisyt16rtbyo7yphwfcnnqej1a/Lindy Practice Test.html</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651828792</DateTimeUTC>
      <Content>incessantly  @lindy wholeheartedly fire that  @alice-mail and however the one considering neurotically  @alice the wore blushed momentously herefore  @alice a</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651828837</DateTimeUTC>
      <Content>up  #angry limpet nd  @alice shot hence  #hence much knitted much much one up yikes hawk angry however  @alice woolly well.&#xA;U this  #hence tolerable</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651828879</DateTimeUTC>
      <Content>yet  @alice  @alice much spoke compassionate before turned  @lindy  @lindy re-laid a insolent the the  #the hey  @lindy hare  #spoke that h dear tched abortive alas  #the goodness  #that a  #spoke  #alas poignantly</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651828924</DateTimeUTC>
      <Content>invidious foretold and  @alice-mail foul scandal far jeepers evidently as  @lindy  @alice wallaby until  @alice taneous therefore a bearish.&#xA;More</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651828967</DateTimeUTC>
      <Content>hello  @alice-mail gross  #hello assenting static emoted when far affirmatively while cowered this however fitted that emonially b  #fitted</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651829015</DateTimeUTC>
      <Content>ravenously rose this far much and irresistible babbled  @alice-mail  honey then that needless misheard romantically some  @alice-mail and  #ravenously r  @alice-mail in bluebird immaturely  @alice-mail  #fell that jollily fell  @alice overtook less positively</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651829057</DateTimeUTC>
      <Content> #much much yet far oversold  @alice far  #showed leaned jeez the salmon.&#xA;Then  @alice hey m  @alice-mail that  @lindy less as a  #much ouch  #inside ngside  #less  #salmon.&#xA;Then  #marginal marginal inside showed where more spoke aboard dalmatian</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651829098</DateTimeUTC>
      <Content>until slick  @lindy  @alice-mail hummingbird the wake dear input ouch together smooched  #smooched  @alice-mail  #goodness  # #ouch goodness struck a some ouch  #input  #beside the as beside shrugged   #ouch</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651829144</DateTimeUTC>
      <Content>inside fired for prior guinea.&#xA;Irksomely much ngaroo  #upon  #ngaroo contr since  @lindy upon dreadfully amicably as ouch gosh darn extravagantly much one oh up</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651829179</DateTimeUTC>
      <Content>inside that lion informally as much  #commenda  #and spoke marginal after far showed  #commenda much and close so crud more leaned aboard oversold went much lmon.&#xA;Then save hey and and  #much jeez  #crud  #spoke  #after commenda</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651829215</DateTimeUTC>
      <Content>between goodness abjectly a squid above  #far so far greyhound impotently  #greyhound halfhearted far d far insolently  #so one.&#xA;Rac one dear thankful more  @lindy honey echidna raucously  @lindy so</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651829253</DateTimeUTC>
      <Content>one dear  @lindy instead versus regardless s vivid much e sang  @lindy one until hardily swore panther  #swore preparatory tolerable</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651829289</DateTimeUTC>
      <Content>unique that more well criminal furrowed gazelle so rose  ungracefully less easy hey norma disbanded under</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651829326</DateTimeUTC>
      <Content> # #but among cockatoo more balked  #tacky ruthlessly tacky sane on  #ouch far far a black caribou wrongly as gosh  # #tacky and  #but a alas but this near while o ouch scallop yet shrewdly  #black this and much sexy the hey yikes hello  #and</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651829362</DateTimeUTC>
      <Content>and and after informally close  #crud  #much inside crud  @alice  #that spoke  # #much sold went much  @lindy com and that  @alice much save  @lindy  #informally so lion showed  #and  @lindy</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651829404</DateTimeUTC>
      <Content> @alice-mail one nutria more  @lindy koala interminably and far dolphin alas after positively oh grizzly far armadillo vely pled  # less   #more</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651829449</DateTimeUTC>
      <Content>jolly  #jolly as fearless less a.&#xA;Freely bit  @lindy spilled that r the  #on on apart  @alice heated  @lindy the cuddled.&#xA;Caterpillar  @alice-mail placed  #wistful  #less jeepers more hardheadedly laboriously ouch pending wistful  #hey octopus some hey  #the far since  #wistful</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651829491</DateTimeUTC>
      <Content>before a as more  @lindy yikes  #as  # #ouch gosh ouch vivid  #ouch  @alice-mail alas as ratory swore then darn  #instead goldfinch  @alice-mail moth  @lindy guinea.&#xA;Timid salamander shark in goldfinch one dear mislaid instead  @alice-mail versus much that</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651829533</DateTimeUTC>
      <Content>angry when much knitted well.&#xA;Unicorn  @alice yawned up wk boundless  #knitted much shot  @alice-mail  #wk jaded woolly up limpet this hence however tolerable  @alice yikes much hello one express this</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651829577</DateTimeUTC>
      <Content>the oss wore therefore momentously a blushed and  #gro wholeheartedly firefly neurotically and the besides that because however dear.&#xA;Far considering one gro incessantly</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651829613</DateTimeUTC>
      <Content>komodo gosh moodily  #crud crud crud  #spitef shrewd aboard  @alice-mail mounted  @lindy and and sought  #moodily iguanodon strove and  #jeez and  #strove strived  #shrewd jeez spitef well</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651829655</DateTimeUTC>
      <Content>buoyant baboon a  #groundhog  #giraffe concentric giraffe decidedly spitefully darn the on  #spitefully  #spitefully  #spitefully  #reset groundhog  #spitefully one moth outrageously reset at</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651829690</DateTimeUTC>
      <Content>excepting a stylistic placed  @alice jellyfish rethought pridefully goodness one gly much well gazed reciprocating  #much  #jellyfish unnecessary far much the  @alice-mail since far  @lindy lamely less hello  @alice  #unnecessary one.&#xA;Hey gregariously</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651829734</DateTimeUTC>
      <Content>airily merry  #  #far interminably far extensively  #less less for much dolphin  # came alas armadillo dismounted  far much nut  #far one pled</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651829771</DateTimeUTC>
      <Content>irresistible earthworm go  #and much parrot jeez  @lindy immaturely and wow.&#xA;Less less bluntly   @alice-mail  @lindy  #less jollily this  @alice at rarely  #immaturely</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651829815</DateTimeUTC>
      <Content>dear.&#xA;Far  #wholeheartedly  @lindy gross therefore that momentously blushed  # #the  #fitted  #the and hello wholeheartedly because one when  @alice-mail consideri  #dear.&#xA;Far fitted  #this emoted while far the however and assenting a cowered the this static besides however</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651829857</DateTimeUTC>
      <Content>bit  #far jolly oriole newt aside cuddled.&#xA;Caterpillar and  #bit far far spilled yikes  @lindy laboriously hat less immeasurably revealed  @alice-mail rapt wistful  #revealed</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651829899</DateTimeUTC>
      <Content>that  #unfitting hummingbird far far hello unfitting when aboard much considering buoyantly caudal during cr manifestly attractively  @alice   @alice-mail much</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651829940</DateTimeUTC>
      <Content>as bat amicably oh since tarantu  #gosh  #oh until darn  @lindy flamingo prior extravagantly gosh  #guinea.&#xA;Irksomely  @lindy kangaroo for contrary irrespective inside dreadfully guinea.&#xA;Irksomely  @lindy  @alice-mail upon fired one up hungrily much one ouch much</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651829983</DateTimeUTC>
      <Content>up  #well.&#xA;Unicorn well.&#xA;Unicorn yawned when less jaded tranquil  #when however dismounted wept  boundless much came express  @alice hello angry  @lindy extensively much hence closed much woolly  #well.&#xA;Unicorn for interminably after merry  #well.&#xA;Unicorn up airily this</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651830031</DateTimeUTC>
      <Content>far in ad proudly beyond  @lindy  #the shined inside  @lindy  #inside  #and and essential less far.&#xA;The essential the  #heron robin  # #shined confessedly accordi during mongoose heron merrily dismounted jeepers painful  #shined since</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651830065</DateTimeUTC>
      <Content> @lindy octopus  @lindy d  #along wrung the astride prior above since ouch  @alice methodically evasive  @lindy  #cowered courageous along  @alice shuddered iguana  #cowered this and cowered wayward plankton otter monkey a.&#xA;Freely</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651830106</DateTimeUTC>
      <Content>shrugged  @lindy false slick this  @alice  @alice-mail as hed dear the yikes added irksomely.&#xA;Camel thought grimaced or waked sincere more leopard hawk pulled infallibly set  #grimaced supp militant until richly</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651830154</DateTimeUTC>
      <Content>after oversold  #yet showed infor  @alice inside went  @lindy where  @alice-mail so spoke  #spoke far close a save salmon.&#xA;Then hey much and that much  #aboard more leaned  @lindy and  @lindy aboard and jeez marginal as crud yet</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651830200</DateTimeUTC>
      <Content>hence the  @alice-mail scow pounded wow steric dachshund showed hence dived immature lynx this scornfully outside and baneful rattlesnake yikes groaned  #yikes one  #hence past  @alice so on</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651830242</DateTimeUTC>
      <Content>kangaroo one instead far angelfish testy nasty  #dazedly fortuitous worm dazedly  @lindy away  @alice-mail the woodchuck  @lindy yet where parrot so highhanded as</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651830285</DateTimeUTC>
      <Content> #without  #on rich the pangolin hello sneered but radical alas and plankton o less jeepers across  @alice without  #nasty seal pre-set on  #pangolin lynx smooched nasty</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651830328</DateTimeUTC>
      <Content>painful essential opposite proudly  #dismounte merrily  #essential  #proudly ahead jeepers  @lindy essential and  #jeepers  @alice-mail  @lindy  @alice far in  #merrily that far.&#xA;The dismounte less  @alice</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651830370</DateTimeUTC>
      <Content> dear fetchingly or scowled and zebra regal lantern much since much  @alice-mail specially some the merry that wow spoile furrowed  @lindy awesomely more  #merry due  @alice-mail  #scowled inescapably some well  @alice went  #since credible  #so so  @alice-mail one gosh  #merry</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651830413</DateTimeUTC>
      <Content>that thus bat so mindfully this  @alice  @alice-mail or hence hence behind yellow  @lindy understandable that het euphemistically  @alice-mail goodness far after  @lindy shook</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651830460</DateTimeUTC>
      <Content>alas mallard  @alice that temperately yikes f  @lindy some the dachshund squirrel.&#xA;Some flapped and irritably far however therefore demonstrably  #that considering  #squirrel.&#xA;Some reset wow  # #that  #and kindhearted</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651830502</DateTimeUTC>
      <Content>shark  #alas  yikes panther until ouch swore  #goldfinch one salamander  #in  #versus sang  @alice vivid as goldfinch versus  @lindy regardless tolerable alas much instead one  # #alas dear  #in that muc in  #swore before</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651830502</DateTimeUTC>
      <Content>shark  #alas  yikes panther until ouch swore  #goldfinch one salamander  #in  #versus sang  @alice vivid as goldfinch versus  @lindy regardless tolerable alas much instead one  # #alas dear  #in that muc in  #swore before</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651830547</DateTimeUTC>
      <Content>brought much more naughtily lamely amidst left  @alice  @alice-mail  @lindy  #bald  #less  #and stylistic hence  # #and less excepting a jeez  #brought far  @alice-mail one.&#xA;Hey  # #less eciprocating bluebird bald by gazed then and rethought some since</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651830589</DateTimeUTC>
      <Content>far polite  #inanimately.&#xA;Beside and  #then  @lindy misheard crud  @alice-mail this  #and  @alice-mail this exclusively to cantankerous a inanimately.&#xA;Beside  @alice-mail so then orgave</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651830641</DateTimeUTC>
      <Content>bucolically komodo ta when  #a some a  much jeering crud  #komodo  #flagrantly the cow admirably essential and jeepers ouch fabulous  @alice-mail weirdly  @alice-mail egregiously flagrantly a and much jeez</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651830685</DateTimeUTC>
      <Content>wow less lynx this past dachshund rattlesnake on scornfully  #less far hence  # #less and  #past baneful pounded gosh yikes away  @alice  #dachshund hysteric worm  # #away erslept one  #away dived so scowle  #this the showed hence much outside  @alice-mail immature far groaned</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651830729</DateTimeUTC>
      <Content>hello across pangolin  @alice-mail rich but while  without while smooched  @lindy lorikeet strategic  @alice-mail jeepers less the  accurately plankton hello  @alice reliably sneered one seal and</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651830770</DateTimeUTC>
      <Content>but  classically busted exultingly goodhearted serenely and this quit handsomely outside komodo amidst vulture yet.&#xA;Less fatuously one a much  @alice-mail ouch  @alice-mail ac after manatee reined more some less  @alice-mail</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651830812</DateTimeUTC>
      <Content>impotently in dear  @alice-mail one  #far neurotically honey firefly wore grouped antly far goodness so far  #antly  #antly abjectly a that</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651830862</DateTimeUTC>
      <Content>one much  #jeez cynically  #attractively  #athl  @lindy that far  @alice-mail athl unfitting  @alice-mail oh baneful crud attractively  #baneful jeez during  @alice-mail far buoyantly spurious toneless</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651830912</DateTimeUTC>
      <Content>some therefore far dachshund  #reset perately  #far  @alice reset  #kindhearted  #dachshund irritably far  #dachshund kindhearted  #irritably wow squirrel.&#xA;Some demonstrably  # #dachshund whisp considering yikes</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651830954</DateTimeUTC>
      <Content>parrot  panther  #parrot earthworm jollily  #jeez a  @alice wow.&#xA;Less  #oh  #a at  #earthworm bluntly opposite less  @lindy much rarely jeez  @alice purred goodness  @alice-mail  @alice pathe oh irresistible  #at  #opposite</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651830996</DateTimeUTC>
      <Content>far spoke close where far and apart  @lindy marginal a oversold afte aboard alongside as much leaned save hey more yet  #inside  #apart crud that went the dalmatian jeez ed salmon.&#xA;Then so inside less much and a showed ouch</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651831043</DateTimeUTC>
      <Content>burst soothingly beside revealed hey  # #assenting  @alice fitted  @lindy affirmatively ly  #hey cowered the when assenting howe static began  #assenting this hello  @alice-mail  #assenting emoted  @lindy ceremonially a  #when</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651831085</DateTimeUTC>
      <Content>far far nd  # #reset temperately squirrel.&#xA;Some considering reset kindhearted some by demonstrably wow partook that  #therefore therefore  #by irritably whispered  #reset mallard  #nd far dachshund this clung yikes</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651831129</DateTimeUTC>
      <Content>a far much ruthlessly wrongly more  @alice-mail and gosh a caribou sexy shrewdly far  #on near the th balked tacky yet on</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651831171</DateTimeUTC>
      <Content>honey a far  @alice  #far impotently so dear far abjectly far so grouped  @alice  # #insolently above firefly  # # #insolently  #insolently rauc  @alice-mail one  #greyhound insolently greyhound goodness between  # #insolently</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651831212</DateTimeUTC>
      <Content>far man-of-war y alas this  #much some exclusively to then  #less this polite so combed cantankerous mishe crud strident  #a  #mishe much less and  #to a  #cantankerous inanimately.&#xA;Beside forgave and  #to  @alice-mail</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651831256</DateTimeUTC>
      <Content> #this goodness fatuously one  #exultingly a exultingly after across yet.&#xA;Less  @alice-mail manatee this komodo mighty ture busted reined  @alice  # #after some obje handsomely less and amidst ouch much  #after  # #exultingly  # # #exultingly but</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651831299</DateTimeUTC>
      <Content>oh before scratched  #howled  #touched  @lindy at the les therefore howled after.&#xA;Spoke touched much  # #touched darn one the  @lindy barbarously  #oh less l thus</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651831335</DateTimeUTC>
      <Content> #prior  #irrespective  @alice-mail   #ouch ouch much fired kangaroo hungrily longside irrespective prior dreadfully  #bat as  #much inside  #prior extravagantly oh darn bat gosh much</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651831378</DateTimeUTC>
      <Content>more  @alice-mail supp grimaced militant this richly yikes the dear thought  # added irksomely.&#xA;Camel  @alice false  @alice-mail  #false  @alice leopard pulled infal </Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651831422</DateTimeUTC>
      <Content>off far across much alongside  #t  #as the  @lindy and hen more  @alice tamely  # #as however instantaneous  #explicitly  #much  # #explicitly  #explicitly therefore underlay cliquishly across much imminently versus oh as t yikes explicitly</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651831484</DateTimeUTC>
      <Content>came dismounted airily le  #came extensively for express when ess much tranquil jaded wept after this much merry closed</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651831484</DateTimeUTC>
      <Content>came dismounted airily le  #came extensively for express when ess much tranquil jaded wept after this much merry closed</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651831484</DateTimeUTC>
      <Content>came dismounted airily le  #came extensively for express when ess much tranquil jaded wept after this much merry closed</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651831484</DateTimeUTC>
      <Content>came dismounted airily le  #came extensively for express when ess much tranquil jaded wept after this much merry closed</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651831484</DateTimeUTC>
      <Content>came dismounted airily le  #came extensively for express when ess much tranquil jaded wept after this much merry closed</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651831523</DateTimeUTC>
      <Content>far aside one wretched  @lindy  #immeasurably newt raptly oriole  @alice monumentally immeasurably wistful  #yikes far spilled th much  @alice-mail obdurately  #oriole ouch revealed lar  @alice-mail and definitely laboriously titilatingly scallop alongside  @alice yikes</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651831567</DateTimeUTC>
      <Content>against quit goldfinch more vulture  #temperately  #outside  #goldfinch e  #goodhearted serenely oh  # #temperately classically along goodhearted gauche outside temperately excitedly  #excitedly this</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651831626</DateTimeUTC>
      <Content>considering  @lindy the  #dear.&#xA;Far and blushed that dear.&#xA;Far  @lindy therefore gross momentously le that however the because a far incessantly  @lindy  @alice one  @alice wholeheartedly besides wor neurotically and</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651831677</DateTimeUTC>
      <Content>barbarously the touched well less on  @alice-mail far gosh before  @alice-mail at a ruthlessly  @lindy he  #at yet one  @alice a  #before much caribou threw after.&#xA;Spoke</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651831726</DateTimeUTC>
      <Content>much  #by considering inscrutably ar when this and affirmative fit by  @alice-mail manifestly far grinned aboard clung  @alice-mail partook hello  #mu hummingbird mu upon diligently  @alice-mail  @alice caudal so</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651831795</DateTimeUTC>
      <Content>resolute far under following drank exotic  #under stolidly jeez  #following  #jeez  @alice  @alice loving passably sprang the hence crud ladybug e  @alice-mail t less  #ladybug  #sprang as</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651831848</DateTimeUTC>
      <Content>contrary kangaroo up hungrily  #gosh  #kangaroo one gosh  #bat prior fired inside darn much until much ouch oh  #as amicably one dreadfully since extravagantly irrespective bat as guinea.&#xA;Irksomely for upon  e</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651831886</DateTimeUTC>
      <Content> #and  #pre-set rich  #hello  #more the across sneered onto more  @lindy smooched hence seal jeepers strategic  without  #less hello and plankton pre-set lynx  @lindy radical  #hello  @lindy but pangolin alas less on nasty ne</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651831924</DateTimeUTC>
      <Content>the static a therefore cowered besides one while  #monially the fitted whol monially when this that hello emoted however because assenting  #dear.&#xA;Far affirmatively momentously however  #this and gross  # #dear.&#xA;Far dear.&#xA;Far  #however far blushed</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651831960</DateTimeUTC>
      <Content>mongoose merrily  @alice far less inside painful  #far ahead and  @alice  @alice-mail proudly that essential beyon in jeepers  @alice-mail far.&#xA;The  #proudly essential pposite dismounted</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538651832003</DateTimeUTC>
      <Content> #hardheadedly jolly that more immeasurably fearless less and oriole aside some spilled cuddled.&#xA;Caterpillar pending  far  #cuddled.&#xA;Caterpillar bit wistful hardheadedly  #more jeepers laboriously far raptly  #yikes obd placed newt revealed yikes</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538653660092</DateTimeUTC>
      <Content># Basic Markdown Testing&#xA;Tests for text style, code blocks, in-line code and images, lines, block quotes, and headings.&#xA;&#xA;### Text Style&#xA;&#xA;**The following text should render as:**  &#xA;_Italics_&#xA;_Ita_lics_&#xA;*Italics*&#xA;**Bold**&#xA;***Bold-italics***&#xA;**_Bold-italics_**&#xA;~~Strikethrough~~&#xA;&#xA;This sentence contains **bold**, _italic_, ***bold-italic***, and ~~stikethrough~~ text.  &#xA;&#xA;**The following should render as normal text:**  &#xA;Normal Text_  &#xA;_Normal Text  &#xA;_Normal Text*&#xA;&#xA;### Carriage Return  &#xA;&#xA;Line #1 followed by one blank line &#xA;&#xA;Line #2 followed by one blank line&#xA;&#xA;Line #3 followed by Line #4&#xA;Line #4 &#xA;&#xA;&#xA;### Code Blocks&#xA;&#xA;```&#xA;This text should render in a code block&#xA;```&#xA;&#xA;**The following markdown should not render:**  &#xA;```&#xA;_Italics_  &#xA;*Italics*  &#xA;**Bold**  &#xA;***Bold-italics***  &#xA;**Bold-italics_**  &#xA;~~Strikethrough~~&#xA;:) :-) ;) ;-) :o :O :-o :-O &#xA;:bamboo: :gift_heart: :dolls: :school_satchel: :mortar_board:&#xA;# Heading 1&#xA;## Heading 2&#xA;### Heading 3&#xA;#### Heading 4&#xA;##### Heading 5&#xA;###### Heading 6&#xA;&gt; Block Quote&#xA;- List&#xA;  - List Sub-item&#xA;[Link](https://i.giphy.com/xNrM4cGJ8u3ao.gif)&#xA;[![Github](https://assets-cdn.github.com/favicon.ico)](https://github.com/mattermost/platform)&#xA;| Left-Aligned Text | Center Aligned Text | Right Aligned Text |&#xA;| :------------ |:---------------:| -----:|&#xA;| Left column 1 | this text       |  $100 |&#xA;```&#xA;&#xA;**The following links should not auto-link or generate previews:**  &#xA;```&#xA;GIF: https://i.giphy.com/xNrM4cGJ8u3ao.gif&#xA;Website: https://en.wikipedia.org/wiki/Dolphin&#xA;```&#xA;&#xA;**The following should appear as a carriage return separating two lines of text:**&#xA;```&#xA;Line #1 followed by a blank line&#xA;&#xA;Line #2 following a blank line&#xA;```&#xA;&#xA;### In-line Code&#xA;&#xA;The word `monospace` should render as in-line code.  &#xA;&#xA;The following markdown in-line code should not render:  &#xA;`_Italics_`, `*Italics*`, `**Bold**`, `***Bold-italics***`, `**Bold-italics_**`, `~~Strikethrough~~`, `:)` , `:-)` , `;)` , `:-O` , `:bamboo:` , `:gift_heart:` , `:dolls:` , `# Heading 1`, `## Heading 2`, `### Heading 3`, `#### Heading 4`, `##### Heading 5`, `###### Heading 6`&#xA;&#xA;This GIF link should not preview: `https://i.giphy.com/xNrM4cGJ8u3ao.gif`  &#xA;This link should not auto-link: `https://en.wikipedia.org/wiki/Dolphin`  &#xA;&#xA;This sentence with `&#xA;in-line code&#xA;` should appear on one line.&#xA;&#xA;### In-line Images&#xA;&#xA;Mattermost/platform build status:  [![Build Status](https://travis-ci.org/mattermost/platform.svg?branch=master)](https://travis-ci.org/mattermost/platform)  &#xA;&#xA;GitHub favicon:  ![Github](https://assets-cdn.github.com/favicon.ico)&#xA;&#xA;GIF Image:  &#xA;![gif](https://i.giphy.com/xNrM4cGJ8u3ao.gif)&#xA;&#xA;4K Wallpaper Image (11Mb):  &#xA;![4K Image](https://images.wallpaperscraft.com/image/starry_sky_shine_glitter_118976_3840x2160.jpg)&#xA;&#xA;Panorama Image:  &#xA;![Pano](http://amardeepphotography.com/wp-content/uploads/2012/11/Untitled_Panorama6small.jpg)&#xA;&#xA;Tall Portrait Image:  &#xA;![Portrait](http://www.maniacworld.com/now-this-is-a-tall-building.jpg)&#xA;&#xA;Tall Portrait Image (resized):  &#xA;![Portrait](http://www.maniacworld.com/now-this-is-a-tall-building.jpg =x200)&#xA;&#xA;Tall Portrait Image (resized to a square):  &#xA;![Portrait](http://www.maniacworld.com/now-this-is-a-tall-building.jpg =200x200)&#xA;&#xA;### Lines&#xA;&#xA;Three lines should render with text between them:  &#xA;&#xA;Text above line&#xA;&#xA;***&#xA;&#xA;Text between lines&#xA;&#xA;---  &#xA;&#xA;Text between lines&#xA;___  &#xA;&#xA;Text below line&#xA;&#xA;### Block Quotes&#xA;&#xA;&gt;This text should render in a block quote.&#xA;&#xA;**The following markdown should render within the block quote:**  &#xA;&gt; #### Heading 4  &#xA;&gt; _Italics_, *Italics*, **Bold**, ***Bold-italics***, **_Bold-italics_**, ~~Strikethrough~~  &#xA;&gt; :) :-) ;) :-O :bamboo: :gift_heart: :dolls:  &#xA;&#xA;**The following text should render in two block quotes separated by one line of text:**&#xA;&gt; Block quote 1&#xA;&#xA;Text between block quotes&#xA;&#xA;&gt; Block quote 2&#xA;&#xA;### Headings&#xA;&#xA;# Heading 1 font size  &#xA;## Heading 2 font size   &#xA;### Heading 3 font size  &#xA;#### Heading 4 font size  &#xA;##### Heading 5 font size  &#xA;###### Heading 6 font size  &#xA;&#xA;&#xA;### Escaped Characters&#xA;&#xA;**The following text should render the same as the raw text:**&#xA;Raw: `\\teamlinux\IT-Stuff\WorkingStuff`&#xA;Markdown: \\teamlinux\IT-Stuff\WorkingStuff&#xA;&#xA;&#xA;**The following text should escape out the first backslash so only one backslash appears:**&#xA;Raw: \\()#&#xA;Markdown: \\()#</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538653660092</DateTimeUTC>
      <Content># Basic Markdown Testing&#xA;Tests for text style, code blocks, in-line code and images, lines, block quotes, and headings.&#xA;&#xA;### Text Style&#xA;&#xA;**The following text should render as:**  &#xA;_Italics_&#xA;_Ita_lics_&#xA;*Italics*&#xA;**Bold**&#xA;***Bold-italics***&#xA;**_Bold-italics_**&#xA;~~Strikethrough~~&#xA;&#xA;This sentence contains **bold**, _italic_, ***bold-italic***, and ~~stikethrough~~ text.  &#xA;&#xA;**The following should render as normal text:**  &#xA;Normal Text_  &#xA;_Normal Text  &#xA;_Normal Text*&#xA;&#xA;### Carriage Return  &#xA;&#xA;Line #1 followed by one blank line &#xA;&#xA;Line #2 followed by one blank line&#xA;&#xA;Line #3 followed by Line #4&#xA;Line #4 &#xA;&#xA;&#xA;### Code Blocks&#xA;&#xA;```&#xA;This text should render in a code block&#xA;```&#xA;&#xA;**The following markdown should not render:**  &#xA;```&#xA;_Italics_  &#xA;*Italics*  &#xA;**Bold**  &#xA;***Bold-italics***  &#xA;**Bold-italics_**  &#xA;~~Strikethrough~~&#xA;:) :-) ;) ;-) :o :O :-o :-O &#xA;:bamboo: :gift_heart: :dolls: :school_satchel: :mortar_board:&#xA;# Heading 1&#xA;## Heading 2&#xA;### Heading 3&#xA;#### Heading 4&#xA;##### Heading 5&#xA;###### Heading 6&#xA;&gt; Block Quote&#xA;- List&#xA;  - List Sub-item&#xA;[Link](https://i.giphy.com/xNrM4cGJ8u3ao.gif)&#xA;[![Github](https://assets-cdn.github.com/favicon.ico)](https://github.com/mattermost/platform)&#xA;| Left-Aligned Text | Center Aligned Text | Right Aligned Text |&#xA;| :------------ |:---------------:| -----:|&#xA;| Left column 1 | this text       |  $100 |&#xA;```&#xA;&#xA;**The following links should not auto-link or generate previews:**  &#xA;```&#xA;GIF: https://i.giphy.com/xNrM4cGJ8u3ao.gif&#xA;Website: https://en.wikipedia.org/wiki/Dolphin&#xA;```&#xA;&#xA;**The following should appear as a carriage return separating two lines of text:**&#xA;```&#xA;Line #1 followed by a blank line&#xA;&#xA;Line #2 following a blank line&#xA;```&#xA;&#xA;### In-line Code&#xA;&#xA;The word `monospace` should render as in-line code.  &#xA;&#xA;The following markdown in-line code should not render:  &#xA;`_Italics_`, `*Italics*`, `**Bold**`, `***Bold-italics***`, `**Bold-italics_**`, `~~Strikethrough~~`, `:)` , `:-)` , `;)` , `:-O` , `:bamboo:` , `:gift_heart:` , `:dolls:` , `# Heading 1`, `## Heading 2`, `### Heading 3`, `#### Heading 4`, `##### Heading 5`, `###### Heading 6`&#xA;&#xA;This GIF link should not preview: `https://i.giphy.com/xNrM4cGJ8u3ao.gif`  &#xA;This link should not auto-link: `https://en.wikipedia.org/wiki/Dolphin`  &#xA;&#xA;This sentence with `&#xA;in-line code&#xA;` should appear on one line.&#xA;&#xA;### In-line Images&#xA;&#xA;Mattermost/platform build status:  [![Build Status](https://travis-ci.org/mattermost/platform.svg?branch=master)](https://travis-ci.org/mattermost/platform)  &#xA;&#xA;GitHub favicon:  ![Github](https://assets-cdn.github.com/favicon.ico)&#xA;&#xA;GIF Image:  &#xA;![gif](https://i.giphy.com/xNrM4cGJ8u3ao.gif)&#xA;&#xA;4K Wallpaper Image (11Mb):  &#xA;![4K Image](https://images.wallpaperscraft.com/image/starry_sky_shine_glitter_118976_3840x2160.jpg)&#xA;&#xA;Panorama Image:  &#xA;![Pano](http://amardeepphotography.com/wp-content/uploads/2012/11/Untitled_Panorama6small.jpg)&#xA;&#xA;Tall Portrait Image:  &#xA;![Portrait](http://www.maniacworld.com/now-this-is-a-tall-building.jpg)&#xA;&#xA;Tall Portrait Image (resized):  &#xA;![Portrait](http://www.maniacworld.com/now-this-is-a-tall-building.jpg =x200)&#xA;&#xA;Tall Portrait Image (resized to a square):  &#xA;![Portrait](http://www.maniacworld.com/now-this-is-a-tall-building.jpg =200x200)&#xA;&#xA;### Lines&#xA;&#xA;Three lines should render with text between them:  &#xA;&#xA;Text above line&#xA;&#xA;***&#xA;&#xA;Text between lines&#xA;&#xA;---  &#xA;&#xA;Text between lines&#xA;___  &#xA;&#xA;Text below line&#xA;&#xA;### Block Quotes&#xA;&#xA;&gt;This text should render in a block quote.&#xA;&#xA;**The following markdown should render within the block quote:**  &#xA;&gt; #### Heading 4  &#xA;&gt; _Italics_, *Italics*, **Bold**, ***Bold-italics***, **_Bold-italics_**, ~~Strikethrough~~  &#xA;&gt; :) :-) ;) :-O :bamboo: :gift_heart: :dolls:  &#xA;&#xA;**The following text should render in two block quotes separated by one line of text:**&#xA;&gt; Block quote 1&#xA;&#xA;Text between block quotes&#xA;&#xA;&gt; Block quote 2&#xA;&#xA;### Headings&#xA;&#xA;# Heading 1 font size  &#xA;## Heading 2 font size   &#xA;### Heading 3 font size  &#xA;#### Heading 4 font size  &#xA;##### Heading 5 font size  &#xA;###### Heading 6 font size  &#xA;&#xA;&#xA;### Escaped Characters&#xA;&#xA;**The following text should render the same as the raw text:**&#xA;Raw: `\\teamlinux\IT-Stuff\WorkingStuff`&#xA;Markdown: \\teamlinux\IT-Stuff\WorkingStuff&#xA;&#xA;&#xA;**The following text should escape out the first backslash so only one backslash appears:**&#xA;Raw: \\()#&#xA;Markdown: \\()#</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538653720814</DateTimeUTC>
      <Content># Basic Markdown Testing&#xA;Tests for text style, code blocks, in-line code and images, lines, block quotes, and headings.&#xA;&#xA;### Text Style&#xA;&#xA;**The following text should render as:**  &#xA;_Italics_&#xA;_Ita_lics_&#xA;*Italics*&#xA;**Bold**&#xA;***Bold-italics***&#xA;**_Bold-italics_**&#xA;~~Strikethrough~~&#xA;&#xA;This sentence contains **bold**, _italic_, ***bold-italic***, and ~~stikethrough~~ text.  &#xA;&#xA;**The following should render as normal text:**  &#xA;Normal Text_  &#xA;_Normal Text  &#xA;_Normal Text*&#xA;&#xA;### Carriage Return  &#xA;&#xA;Line #1 followed by one blank line &#xA;&#xA;Line #2 followed by one blank line&#xA;&#xA;Line #3 followed by Line #4&#xA;Line #4 &#xA;&#xA;&#xA;### Code Blocks&#xA;&#xA;```&#xA;This text should render in a code block&#xA;```&#xA;&#xA;**The following markdown should not render:**  &#xA;```&#xA;_Italics_  &#xA;*Italics*  &#xA;**Bold**  &#xA;***Bold-italics***  &#xA;**Bold-italics_**  &#xA;~~Strikethrough~~&#xA;:) :-) ;) ;-) :o :O :-o :-O &#xA;:bamboo: :gift_heart: :dolls: :school_satchel: :mortar_board:&#xA;# Heading 1&#xA;## Heading 2&#xA;### Heading 3&#xA;#### Heading 4&#xA;##### Heading 5&#xA;###### Heading 6&#xA;&gt; Block Quote&#xA;- List&#xA;  - List Sub-item&#xA;[Link](https://i.giphy.com/xNrM4cGJ8u3ao.gif)&#xA;[![Github](https://assets-cdn.github.com/favicon.ico)](https://github.com/mattermost/platform)&#xA;| Left-Aligned Text | Center Aligned Text | Right Aligned Text |&#xA;| :------------ |:---------------:| -----:|&#xA;| Left column 1 | this text       |  $100 |&#xA;```&#xA;&#xA;**The following links should not auto-link or generate previews:**  &#xA;```&#xA;GIF: https://i.giphy.com/xNrM4cGJ8u3ao.gif&#xA;Website: https://en.wikipedia.org/wiki/Dolphin&#xA;```&#xA;&#xA;**The following should appear as a carriage return separating two lines of text:**&#xA;```&#xA;Line #1 followed by a blank line&#xA;&#xA;Line #2 following a blank line&#xA;```&#xA;&#xA;### In-line Code&#xA;&#xA;The word `monospace` should render as in-line code.  &#xA;&#xA;The following markdown in-line code should not render:  &#xA;`_Italics_`, `*Italics*`, `**Bold**`, `***Bold-italics***`, `**Bold-italics_**`, `~~Strikethrough~~`, `:)` , `:-)` , `;)` , `:-O` , `:bamboo:` , `:gift_heart:` , `:dolls:` , `# Heading 1`, `## Heading 2`, `### Heading 3`, `#### Heading 4`, `##### Heading 5`, `###### Heading 6`&#xA;&#xA;This GIF link should not preview: `https://i.giphy.com/xNrM4cGJ8u3ao.gif`  &#xA;This link should not auto-link: `https://en.wikipedia.org/wiki/Dolphin`  &#xA;&#xA;This sentence with `&#xA;in-line code&#xA;` should appear on one line.&#xA;&#xA;### In-line Images&#xA;&#xA;Mattermost/platform build status:  [![Build Status](https://travis-ci.org/mattermost/platform.svg?branch=master)](https://travis-ci.org/mattermost/platform)  &#xA;&#xA;GitHub favicon:  ![Github](https://assets-cdn.github.com/favicon.ico)&#xA;&#xA;GIF Image:  &#xA;![gif](https://i.giphy.com/xNrM4cGJ8u3ao.gif)&#xA;&#xA;4K Wallpaper Image (11Mb):  &#xA;![4K Image](https://images.wallpaperscraft.com/image/starry_sky_shine_glitter_118976_3840x2160.jpg)&#xA;&#xA;Panorama Image:  &#xA;![Pano](http://amardeepphotography.com/wp-content/uploads/2012/11/Untitled_Panorama6small.jpg)&#xA;&#xA;Tall Portrait Image:  &#xA;![Portrait](http://www.maniacworld.com/now-this-is-a-tall-building.jpg)&#xA;&#xA;Tall Portrait Image (resized):  &#xA;![Portrait](http://www.maniacworld.com/now-this-is-a-tall-building.jpg =x200)&#xA;&#xA;Tall Portrait Image (resized to a square):  &#xA;![Portrait](http://www.maniacworld.com/now-this-is-a-tall-building.jpg =200x200)&#xA;&#xA;### Lines&#xA;&#xA;Three lines should render with text between them:  &#xA;&#xA;Text above line&#xA;&#xA;***&#xA;&#xA;Text between lines&#xA;&#xA;---  &#xA;&#xA;Text between lines&#xA;___  &#xA;&#xA;Text below line&#xA;&#xA;### Block Quotes&#xA;&#xA;&gt;This text should render in a block quote.&#xA;&#xA;**The following markdown should render within the block quote:**  &#xA;&gt; #### Heading 4  &#xA;&gt; _Italics_, *Italics*, **Bold**, ***Bold-italics***, **_Bold-italics_**, ~~Strikethrough~~  &#xA;&gt; :) :-) ;) :-O :bamboo: :gift_heart: :dolls:  &#xA;&#xA;**The following text should render in two block quotes separated by one line of text:**&#xA;&gt; Block quote 1&#xA;&#xA;Text between block quotes&#xA;&#xA;&gt; Block quote 2&#xA;&#xA;### Headings&#xA;&#xA;# Heading 1 font size  &#xA;## Heading 2 font size   &#xA;### Heading 3 font size  &#xA;#### Heading 4 font size  &#xA;##### Heading 5 font size  &#xA;###### Heading 6 font size  &#xA;&#xA;&#xA;### Escaped Characters&#xA;&#xA;**The following text should render the same as the raw text:**&#xA;Raw: `\\teamlinux\IT-Stuff\WorkingStuff`&#xA;Markdown: \\teamlinux\IT-Stuff\WorkingStuff&#xA;&#xA;&#xA;**The following text should escape out the first backslash so only one backslash appears:**&#xA;Raw: \\()#&#xA;Markdown: \\()#</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538653720814</DateTimeUTC>
      <Content># Basic Markdown Testing&#xA;Tests for text style, code blocks, in-line code and images, lines, block quotes, and headings.&#xA;&#xA;### Text Style&#xA;&#xA;**The following text should render as:**  &#xA;_Italics_&#xA;_Ita_lics_&#xA;*Italics*&#xA;**Bold**&#xA;***Bold-italics***&#xA;**_Bold-italics_**&#xA;~~Strikethrough~~&#xA;&#xA;This sentence contains **bold**, _italic_, ***bold-italic***, and ~~stikethrough~~ text.  &#xA;&#xA;**The following should render as normal text:**  &#xA;Normal Text_  &#xA;_Normal Text  &#xA;_Normal Text*&#xA;&#xA;### Carriage Return  &#xA;&#xA;Line #1 followed by one blank line &#xA;&#xA;Line #2 followed by one blank line&#xA;&#xA;Line #3 followed by Line #4&#xA;Line #4 &#xA;&#xA;&#xA;### Code Blocks&#xA;&#xA;```&#xA;This text should render in a code block&#xA;```&#xA;&#xA;**The following markdown should not render:**  &#xA;```&#xA;_Italics_  &#xA;*Italics*  &#xA;**Bold**  &#xA;***Bold-italics***  &#xA;**Bold-italics_**  &#xA;~~Strikethrough~~&#xA;:) :-) ;) ;-) :o :O :-o :-O &#xA;:bamboo: :gift_heart: :dolls: :school_satchel: :mortar_board:&#xA;# Heading 1&#xA;## Heading 2&#xA;### Heading 3&#xA;#### Heading 4&#xA;##### Heading 5&#xA;###### Heading 6&#xA;&gt; Block Quote&#xA;- List&#xA;  - List Sub-item&#xA;[Link](https://i.giphy.com/xNrM4cGJ8u3ao.gif)&#xA;[![Github](https://assets-cdn.github.com/favicon.ico)](https://github.com/mattermost/platform)&#xA;| Left-Aligned Text | Center Aligned Text | Right Aligned Text |&#xA;| :------------ |:---------------:| -----:|&#xA;| Left column 1 | this text       |  $100 |&#xA;```&#xA;&#xA;**The following links should not auto-link or generate previews:**  &#xA;```&#xA;GIF: https://i.giphy.com/xNrM4cGJ8u3ao.gif&#xA;Website: https://en.wikipedia.org/wiki/Dolphin&#xA;```&#xA;&#xA;**The following should appear as a carriage return separating two lines of text:**&#xA;```&#xA;Line #1 followed by a blank line&#xA;&#xA;Line #2 following a blank line&#xA;```&#xA;&#xA;### In-line Code&#xA;&#xA;The word `monospace` should render as in-line code.  &#xA;&#xA;The following markdown in-line code should not render:  &#xA;`_Italics_`, `*Italics*`, `**Bold**`, `***Bold-italics***`, `**Bold-italics_**`, `~~Strikethrough~~`, `:)` , `:-)` , `;)` , `:-O` , `:bamboo:` , `:gift_heart:` , `:dolls:` , `# Heading 1`, `## Heading 2`, `### Heading 3`, `#### Heading 4`, `##### Heading 5`, `###### Heading 6`&#xA;&#xA;This GIF link should not preview: `https://i.giphy.com/xNrM4cGJ8u3ao.gif`  &#xA;This link should not auto-link: `https://en.wikipedia.org/wiki/Dolphin`  &#xA;&#xA;This sentence with `&#xA;in-line code&#xA;` should appear on one line.&#xA;&#xA;### In-line Images&#xA;&#xA;Mattermost/platform build status:  [![Build Status](https://travis-ci.org/mattermost/platform.svg?branch=master)](https://travis-ci.org/mattermost/platform)  &#xA;&#xA;GitHub favicon:  ![Github](https://assets-cdn.github.com/favicon.ico)&#xA;&#xA;GIF Image:  &#xA;![gif](https://i.giphy.com/xNrM4cGJ8u3ao.gif)&#xA;&#xA;4K Wallpaper Image (11Mb):  &#xA;![4K Image](https://images.wallpaperscraft.com/image/starry_sky_shine_glitter_118976_3840x2160.jpg)&#xA;&#xA;Panorama Image:  &#xA;![Pano](http://amardeepphotography.com/wp-content/uploads/2012/11/Untitled_Panorama6small.jpg)&#xA;&#xA;Tall Portrait Image:  &#xA;![Portrait](http://www.maniacworld.com/now-this-is-a-tall-building.jpg)&#xA;&#xA;Tall Portrait Image (resized):  &#xA;![Portrait](http://www.maniacworld.com/now-this-is-a-tall-building.jpg =x200)&#xA;&#xA;Tall Portrait Image (resized to a square):  &#xA;![Portrait](http://www.maniacworld.com/now-this-is-a-tall-building.jpg =200x200)&#xA;&#xA;### Lines&#xA;&#xA;Three lines should render with text between them:  &#xA;&#xA;Text above line&#xA;&#xA;***&#xA;&#xA;Text between lines&#xA;&#xA;---  &#xA;&#xA;Text between lines&#xA;___  &#xA;&#xA;Text below line&#xA;&#xA;### Block Quotes&#xA;&#xA;&gt;This text should render in a block quote.&#xA;&#xA;**The following markdown should render within the block quote:**  &#xA;&gt; #### Heading 4  &#xA;&gt; _Italics_, *Italics*, **Bold**, ***Bold-italics***, **_Bold-italics_**, ~~Strikethrough~~  &#xA;&gt; :) :-) ;) :-O :bamboo: :gift_heart: :dolls:  &#xA;&#xA;**The following text should render in two block quotes separated by one line of text:**&#xA;&gt; Block quote 1&#xA;&#xA;Text between block quotes&#xA;&#xA;&gt; Block quote 2&#xA;&#xA;### Headings&#xA;&#xA;# Heading 1 font size  &#xA;## Heading 2 font size   &#xA;### Heading 3 font size  &#xA;#### Heading 4 font size  &#xA;##### Heading 5 font size  &#xA;###### Heading 6 font size  &#xA;&#xA;&#xA;### Escaped Characters&#xA;&#xA;**The following text should render the same as the raw text:**&#xA;Raw: `\\teamlinux\IT-Stuff\WorkingStuff`&#xA;Markdown: \\teamlinux\IT-Stuff\WorkingStuff&#xA;&#xA;&#xA;**The following text should escape out the first backslash so only one backslash appears:**&#xA;Raw: \\()#&#xA;Markdown: \\()#&#xA;&#xA;I am editing this</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538653720814</DateTimeUTC>
      <UserFileName>Lindy Practice Test.html</UserFileName>
      <FileName>20181004/teams/noteam/channels/tjpj6omfs78qpko7y65k1f74gy/users/qqu7z5pcbtycdczx4jetogekro/nrrofidzhfnzdqpxzindrth1gh/Lindy Practice Test.html</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538653720814</DateTimeUTC>
      <UserFileName>2018 Blank Calendar - From April.docx</UserFileName>
      <FileName>20181004/teams/noteam/channels/tjpj6omfs78qpko7y65k1f74gy/users/qqu7z5pcbtycdczx4jetogekro/pa89a73ykfydfbznhxgte8ajby/2018 Blank Calendar - From April.docx</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538653720814</DateTimeUTC>
      <UserFileName>2019 School Holidays.png</UserFileName>
      <FileName>20181004/teams/noteam/channels/tjpj6omfs78qpko7y65k1f74gy/users/qqu7z5pcbtycdczx4jetogekro/z3x8qq6yqidotnq4zm3m85ds4c/2019 School Holidays.png</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538653720814</DateTimeUTC>
      <UserFileName>Lindy Practice Test.html</UserFileName>
      <FileName>20181004/teams/noteam/channels/tjpj6omfs78qpko7y65k1f74gy/users/qqu7z5pcbtycdczx4jetogekro/nrrofidzhfnzdqpxzindrth1gh/Lindy Practice Test.html</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538653720814</DateTimeUTC>
      <UserFileName>2018 Blank Calendar - From April.docx</UserFileName>
      <FileName>20181004/teams/noteam/channels/tjpj6omfs78qpko7y65k1f74gy/users/qqu7z5pcbtycdczx4jetogekro/pa89a73ykfydfbznhxgte8ajby/2018 Blank Calendar - From April.docx</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538653720814</DateTimeUTC>
      <UserFileName>2019 School Holidays.png</UserFileName>
      <FileName>20181004/teams/noteam/channels/tjpj6omfs78qpko7y65k1f74gy/users/qqu7z5pcbtycdczx4jetogekro/z3x8qq6yqidotnq4zm3m85ds4c/2019 School Holidays.png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538654028453</DateTimeUTC>
      <Content>reply to delete parent</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538674321071</DateTimeUTC>
      <Content>https://media1.giphy.com/media/l41lM6sJvwmZNruLe/giphy.gif</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538674353145</DateTimeUTC>
      <Content>reply</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538675489999</DateTimeUTC>
      <Content>reply</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538675630869</DateTimeUTC>
      <Content>abc</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538675637701</DateTimeUTC>
      <Content>xyz</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538675812950</DateTimeUTC>
      <Content>:gift_heart: :school_satchel: :bamboo: </Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538675836896</DateTimeUTC>
      <Content>:open_mouth: text</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538675896497</DateTimeUTC>
      <Content>any text</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538675915159</DateTimeUTC>
      <Content>any text rhs</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538675951969</DateTimeUTC>
      <Content>any text </Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538675990383</DateTimeUTC>
      <Content>any text&#xA;```&#xA;text&#xA;```</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538676038541</DateTimeUTC>
      <Content>text&#xA;```&#xA;text&#xA;```</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538676128221</DateTimeUTC>
      <Content>typing&#xA;&#xA;a&#xA;&#xA;long&#xA;&#xA;scrolling&#xA;&#xA;input&#xA;&#xA;Message&#xA;&#xA;Box&#xA;&#xA;now&#xA;&#xA;it&#39;s&#xA;&#xA;scrolling :)&#xA;&#xA;Editing&#xA;&#xA;this&#xA;&#xA;message&#xA;&#xA;:)</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538676128221</DateTimeUTC>
      <Content>typing&#xA;&#xA;a&#xA;&#xA;long&#xA;&#xA;scrolling&#xA;&#xA;input&#xA;&#xA;Message&#xA;&#xA;Box&#xA;&#xA;now&#xA;&#xA;it&#39;s&#xA;&#xA;scrolling :)</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538676218120</DateTimeUTC>
      <Content>post&#xA;&#xA;I am editing&#xA;&#xA;to make this expand&#xA;&#xA;and it&#39;s working&#xA;&#xA;nearly at max height&#xA;&#xA;almost&#xA;&#xA;again</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538676218120</DateTimeUTC>
      <Content>post</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538676218120</DateTimeUTC>
      <Content>post&#xA;&#xA;I am editing&#xA;&#xA;to make this expand&#xA;&#xA;and it&#39;s working&#xA;&#xA;nearly at max height&#xA;&#xA;almost&#xA;&#xA;again&#xA;&#xA;nearly there&#xA;&#xA;still expanding&#xA;&#xA;where is max height&#xA;&#xA;ah, scrolling now</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538676301012</DateTimeUTC>
      <Content>post&#xA;&#xA;I am editing&#xA;&#xA;to make this expand&#xA;&#xA;and it&#39;s working&#xA;&#xA;nearly at max height&#xA;&#xA;almost&#xA;&#xA;again&#xA;&#xA;nearly there&#xA;&#xA;still expanding&#xA;&#xA;where is max height&#xA;&#xA;ah, scrolling now</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538676370991</DateTimeUTC>
      <Content>post&#xA;&#xA;I am editing&#xA;&#xA;to make this expand&#xA;&#xA;and it&#39;s working&#xA;&#xA;nearly at max height&#xA;&#xA;almost&#xA;&#xA;again&#xA;&#xA;nearly there&#xA;&#xA;still expanding&#xA;&#xA;where is max height&#xA;&#xA;ah, scrolling now</Content>
    </Message>
    <Message>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1539072836813</DateTimeUTC>
      <Content>hello</Content>
    </Message>
    <Message>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1539072839087</DateTimeUTC>
      <Content>hi</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1539072839087</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1539072839087</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1539072839087</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="DKH test chan 2">
    <RoomID>public - q1n8r9f88p8e7d6e6zc6r1wibh</RoomID>
    <StartTimeUTC>1536350974138</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536350958715</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536350974138</DateTimeUTC>
      <Content>https://bit.ly/2NlYsOr</Content>
    </Message>
    <Message>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536350984532</DateTimeUTC>
      <Content>https://bit.ly/2wqEbjw</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536350984532</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536350984532</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - u931iqc1uj86b81x7q3wgoka1w</RoomID>
    <StartTimeUTC>1538732904642</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538732822811</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy+-1@mattermost.com</LoginName>
      <DateTimeUTC>1538732822819</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538732904642</DateTimeUTC>
      <Content>test</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1539251356857</DateTimeUTC>
      <Content>@alice hi</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1539251396196</DateTimeUTC>
      <Content>@alice hi</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>lindy+-1@mattermost.com</LoginName>
      <DateTimeUTC>1539251396196</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1539251396196</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1539251396196</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - zq47hzm86fne7c74jiajsmbqfo</RoomID>
    <StartTimeUTC>1538767537154</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1538767499604</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>martin+test2@mattermost.com</LoginName>
      <DateTimeUTC>1538767499610</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>martin+test2@mattermost.com</LoginName>
      <DateTimeUTC>1538767537154</DateTimeUTC>
      <Content>asdf</Content>
    </Message>
    <Message>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1538768015657</DateTimeUTC>
      <Content>aaa</Content>
    </Message>
    <Message>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1538768304967</DateTimeUTC>
      <Content>adsf</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1538768304967</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>martin+test2@mattermost.com</LoginName>
      <DateTimeUTC>1538768304967</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538768304967</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="test3">
    <RoomID>public - e3h9e6ck4p8oufof8eag9g74ty</RoomID>
    <StartTimeUTC>1536291947047</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536291871231</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536291873784</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536291901415</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536291947047</DateTimeUTC>
      <Content>a keyword!</Content>
    </Message>
    <Message>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536291950854</DateTimeUTC>
      <Content>a keyword ?</Content>
    </Message>
    <Message>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536291954903</DateTimeUTC>
      <Content>keyword</Content>
    </Message>
    <Message>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536292214839</DateTimeUTC>
      <Content>a keyword!</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536292214839</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536292214839</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536292214839</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536292214839</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - f5jxg1ndipbppyxxrg68cziuiy</RoomID>
    <StartTimeUTC>1536292229873</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536292227658</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536292227664</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536292229873</DateTimeUTC>
      <Content>Hagas?</Content>
    </Message>
    <Message>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536292546060</DateTimeUTC>
      <Content>hey</Content>
    </Message>
    <Message>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536292547397</DateTimeUTC>
      <Content>you there?</Content>
    </Message>
    <Message>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536292664666</DateTimeUTC>
      <Content>hes?</Content>
    </Message>
    <Message>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536292713670</DateTimeUTC>
      <Content>jkhgkjhg</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536292713670</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536292713670</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536292713670</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - 5uwrmmupt7ns9csnstrbm93khe</RoomID>
    <StartTimeUTC>1536237597998</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1536237597998</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1536237597998</DateTimeUTC>
      <Content>test</Content>
    </Message>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1536237610865</DateTimeUTC>
      <Content>Test2</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1536237610865</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536237610865</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - wx48ikuusfnzzmg5yhukx7z7ih</RoomID>
    <StartTimeUTC>1536162043755</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1536162043755</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1536162043755</DateTimeUTC>
      <Content>h</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1536162043755</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536162043755</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="notlistedPublic">
    <RoomID>public - e47xds7uhfrkujtuau8xsa65nr</RoomID>
    <StartTimeUTC>1538185040666</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538185035968</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538185040666</DateTimeUTC>
      <Content>waffles</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538185040666</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538185040666</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Town Square">
    <RoomID>public - m69it5qgdinyfppi38rwnbo3fa</RoomID>
    <StartTimeUTC>1535120244434</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1515432676436</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesus@mattermost.com</LoginName>
      <DateTimeUTC>1515502387517</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesus.espino@mattermost.com</LoginName>
      <DateTimeUTC>1520605802488</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+fipxcskukidypxdny8pjmnqf3c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607324173</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+4y9zb764rbbr5gc4s85nq69a8r@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607324854</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+3eubgib6z7b4xmk8f49ccjgq4e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607325330</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+61cs34fyatbotcxp33oiubmheh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607325920</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+ghmutxi4r7nmtxeg8n3y81esch@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607326406</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+qw1bo7hut7nyxg5e43ncqdbtqo@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607326966</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+3c15ptwo63gc3bgqezwq3cqqwy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607327560</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+wyhw9x8znfb4bdtz9xioh4oxko@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607328597</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+af9g73si6bn45qeh3ee5mx1pma@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607329099</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+c9743cyhzp8o9kizdkpxbcybiw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607329595</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+hn7a8ntubi8qum5isshqdckjxa@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607330198</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+1usz1m7f6by6pn1zc93y3pc1qr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607330793</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+a136u75zt3grdrer1fq5cbjy4y@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607331325</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+prfwdej8bbn17qd84ojtkmxcnc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607331864</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+k34zwbumr7fmiftwen59hm3g1h@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607332435</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+qpb5bbjq5bypmmrzfnqmq6cc8h@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607333029</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+5br3jerodtrnxge6s9ddmf83fc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607333544</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+5eary63rm7y9tkkzzoj45rnoiy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607334155</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+sq1zwn6y37y8ppduk8cxjb6s8c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607334697</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+hfw1jx1k77bxmnxy8g5no7xzrc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607335215</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+9dskxf7affyiudxfn73cazw8wc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607335718</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+3dzs9x1kubnufbj8gwzaihiw1r@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607336245</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+mbpg7ygm7pdn5djsm9qknsoi6o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607336760</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+idwbhx9bafdsmx3zmodj6ebtze@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607337240</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+m1p4a793mfnjtmj7uiohqqigfh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607337629</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+g9yyaxoo7p88bjcr48q1r3gfdw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607338201</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+urqxhs4q5fd7dgdzw7crkxicbe@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607338738</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+nc67w5tfnb8n9pekjcr4yyynow@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607339313</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+mdnyuu16ftbm9pbjknahqtuc1o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607340064</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+zo9tphxojffeie197d3w4edkkr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607340588</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+d3f3ekbebtno9yjti6regjfepc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607341077</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+ey83b6961pnytkdcx8dd8f44oh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607341628</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+zkjf5sce6bbn8qg81ubtwfjrth@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607342173</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+hs4xigfcujnwjepfpukknt854o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607342551</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+i1qn5df31tg6dqfdpwzqemmb5o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607342994</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+d6qibkxxk3drzfux8g5az5xzpw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607343564</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+i9x89ebtsfn3jrrzj19eo7pjta@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607344233</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+peq5rx37upgsdkdf5biz6psf6o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607344667</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+yhakxzg5tj8u9xt1485whksmpc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607345133</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+jwxyjqzpitnt8khfj6x3awd3sc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607345721</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+4cy3qskjzprdtra3r7sizddxnc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607346245</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+idztxxyszinbukdqr9wdg5u1ka@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607346830</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+i8aq1a79q7deugge5mm5ey7wxw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607347418</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+1ydueh84tt893n3botga4ktsrr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607347879</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+65456kkw63gumni3xiryrxwx8c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607348334</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+cdg9disii7gkmyr9s44hd666jy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607348733</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+p5xutbyiwp8c8xbr84ikxq9d9a@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607349318</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+c73s1pyrepby8r6785khrff69h@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607349809</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+3dgtnfm8npgy5e9ij5tzr497yc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607350365</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+b6r8nojczbb678snnpsdgd5eue@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607350861</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+iqj5xf84d7ytpn49jkw8zskktc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607351355</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+ct4r7g5gr3gn8jadaeiufws5ae@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607351850</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+otiw3i3zn7bejqjg81hykgo4ky@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607352315</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+e9ndx3qf7tf7i8mz18jwm8x6to@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607352874</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+16rsuhzcqjdc9fywa4jpqxd69c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520607353241</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesus.espino@mattermost.com</LoginName>
      <DateTimeUTC>1520608735933</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1520612874138</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesus+1@mattermost.com</LoginName>
      <DateTimeUTC>1523272624173</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesus+3@mattermost.com</LoginName>
      <DateTimeUTC>1523284560172</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1525862864633</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesus+6@mattermost.com</LoginName>
      <DateTimeUTC>1525870988588</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesus+2@mattermost.com</LoginName>
      <DateTimeUTC>1528630400507</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1530888284793</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesus.espino+10@mattermost.com</LoginName>
      <DateTimeUTC>1535738879383</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1535120244434</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1535120244434</DateTimeUTC>
      <UserFileName>lola-nerviosa.mp4</UserFileName>
      <FileName>20180824/teams/noteam/channels/m69it5qgdinyfppi38rwnbo3fa/users/wp9wrf3i4tnkb8gagnyid1opir/zayrnio5xtnq7xwn1pp8h8qczh/lola-nerviosa.mp4</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1535120244434</DateTimeUTC>
      <UserFileName>lola-nerviosa.mp4</UserFileName>
      <FileName>20180824/teams/noteam/channels/m69it5qgdinyfppi38rwnbo3fa/users/wp9wrf3i4tnkb8gagnyid1opir/zayrnio5xtnq7xwn1pp8h8qczh/lola-nerviosa.mp4</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1535454056642</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1535454056642</DateTimeUTC>
      <UserFileName>MP4.mp4</UserFileName>
      <FileName>20180828/teams/noteam/channels/m69it5qgdinyfppi38rwnbo3fa/users/wp9wrf3i4tnkb8gagnyid1opir/7mk717ko7fyk9mr78qowthzzph/MP4.mp4</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1535454056642</DateTimeUTC>
      <UserFileName>MP4.mp4</UserFileName>
      <FileName>20180828/teams/noteam/channels/m69it5qgdinyfppi38rwnbo3fa/users/wp9wrf3i4tnkb8gagnyid1opir/7mk717ko7fyk9mr78qowthzzph/MP4.mp4</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1535454116366</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1535454116366</DateTimeUTC>
      <UserFileName>MP4.mp4</UserFileName>
      <FileName>20180828/teams/noteam/channels/m69it5qgdinyfppi38rwnbo3fa/users/wp9wrf3i4tnkb8gagnyid1opir/iweh7pthrpf75yi9ykox6k1tue/MP4.mp4</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1535454116366</DateTimeUTC>
      <UserFileName>MP4.mp4</UserFileName>
      <FileName>20180828/teams/noteam/channels/m69it5qgdinyfppi38rwnbo3fa/users/wp9wrf3i4tnkb8gagnyid1opir/iweh7pthrpf75yi9ykox6k1tue/MP4.mp4</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>jesus.espino@mattermost.com</LoginName>
      <DateTimeUTC>1536268545829</DateTimeUTC>
      <Content>test</Content>
    </Message>
    <Message>
      <LoginName>jesus.espino@mattermost.com</LoginName>
      <DateTimeUTC>1536268561394</DateTimeUTC>
      <Content>@jespino Another test</Content>
    </Message>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1538736724655</DateTimeUTC>
      <Content>Test</Content>
    </Message>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1538736724655</DateTimeUTC>
      <Content>Test2</Content>
    </Message>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1538757429455</DateTimeUTC>
      <Content>Test</Content>
    </Message>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1538757442353</DateTimeUTC>
      <Content>Hola</Content>
    </Message>
    <Message>
      <LoginName>jesus+2@mattermost.com</LoginName>
      <DateTimeUTC>1538757525712</DateTimeUTC>
      <Content># Basic Markdown Testing&#xA;Tests for text style, code blocks, in-line code and images, lines, block quotes, and headings.&#xA;&#xA;### Text Style&#xA;&#xA;**The following text should render as:**  &#xA;_Italics_&#xA;_Ita_lics_&#xA;*Italics*&#xA;**Bold**&#xA;***Bold-italics***&#xA;**_Bold-italics_**&#xA;~~Strikethrough~~&#xA;&#xA;This sentence contains **bold**, _italic_, ***bold-italic***, and ~~stikethrough~~ text.  &#xA;&#xA;**The following should render as normal text:**  &#xA;Normal Text_  &#xA;_Normal Text  &#xA;_Normal Text*&#xA;&#xA;### Carriage Return  &#xA;&#xA;Line #1 followed by one blank line &#xA;&#xA;Line #2 followed by one blank line&#xA;&#xA;Line #3 followed by Line #4&#xA;Line #4 &#xA;&#xA;&#xA;### Code Blocks&#xA;&#xA;```&#xA;This text should render in a code block&#xA;```&#xA;&#xA;**The following markdown should not render:**  &#xA;```&#xA;_Italics_  &#xA;*Italics*  &#xA;**Bold**  &#xA;***Bold-italics***  &#xA;**Bold-italics_**  &#xA;~~Strikethrough~~&#xA;:) :-) ;) ;-) :o :O :-o :-O &#xA;:bamboo: :gift_heart: :dolls: :school_satchel: :mortar_board:&#xA;# Heading 1&#xA;## Heading 2&#xA;### Heading 3&#xA;#### Heading 4&#xA;##### Heading 5&#xA;###### Heading 6&#xA;&gt; Block Quote&#xA;- List&#xA;  - List Sub-item&#xA;[Link](https://i.giphy.com/xNrM4cGJ8u3ao.gif)&#xA;[![Github](https://assets-cdn.github.com/favicon.ico)](https://github.com/mattermost/platform)&#xA;| Left-Aligned Text | Center Aligned Text | Right Aligned Text |&#xA;| :------------ |:---------------:| -----:|&#xA;| Left column 1 | this text       |  $100 |&#xA;```&#xA;&#xA;**The following links should not auto-link or generate previews:**  &#xA;```&#xA;GIF: https://i.giphy.com/xNrM4cGJ8u3ao.gif&#xA;Website: https://en.wikipedia.org/wiki/Dolphin&#xA;```&#xA;&#xA;**The following should appear as a carriage return separating two lines of text:**&#xA;```&#xA;Line #1 followed by a blank line&#xA;&#xA;Line #2 following a blank line&#xA;```&#xA;&#xA;### In-line Code&#xA;&#xA;The word `monospace` should render as in-line code.  &#xA;&#xA;The following markdown in-line code should not render:  &#xA;`_Italics_`, `*Italics*`, `**Bold**`, `***Bold-italics***`, `**Bold-italics_**`, `~~Strikethrough~~`, `:)` , `:-)` , `;)` , `:-O` , `:bamboo:` , `:gift_heart:` , `:dolls:` , `# Heading 1`, `## Heading 2`, `### Heading 3`, `#### Heading 4`, `##### Heading 5`, `###### Heading 6`&#xA;&#xA;This GIF link should not preview: `https://i.giphy.com/xNrM4cGJ8u3ao.gif`  &#xA;This link should not auto-link: `https://en.wikipedia.org/wiki/Dolphin`  &#xA;&#xA;This sentence with `&#xA;in-line code&#xA;` should appear on one line.&#xA;&#xA;### In-line Images&#xA;&#xA;Mattermost/platform build status:  [![Build Status](https://travis-ci.org/mattermost/platform.svg?branch=master)](https://travis-ci.org/mattermost/platform)  &#xA;&#xA;GitHub favicon:  ![Github](https://assets-cdn.github.com/favicon.ico)&#xA;&#xA;GIF Image:  &#xA;![gif](https://i.giphy.com/xNrM4cGJ8u3ao.gif)&#xA;&#xA;4K Wallpaper Image (11Mb):  &#xA;![4K Image](https://images.wallpaperscraft.com/image/starry_sky_shine_glitter_118976_3840x2160.jpg)&#xA;&#xA;Panorama Image:  &#xA;![Pano](http://amardeepphotography.com/wp-content/uploads/2012/11/Untitled_Panorama6small.jpg)&#xA;&#xA;Tall Portrait Image:  &#xA;![Portrait](http://www.maniacworld.com/now-this-is-a-tall-building.jpg)&#xA;&#xA;Tall Portrait Image (resized):  &#xA;![Portrait](http://www.maniacworld.com/now-this-is-a-tall-building.jpg =x200)&#xA;&#xA;Tall Portrait Image (resized to a square):  &#xA;![Portrait](http://www.maniacworld.com/now-this-is-a-tall-building.jpg =200x200)&#xA;&#xA;### Lines&#xA;&#xA;Three lines should render with text between them:  &#xA;&#xA;Text above line&#xA;&#xA;***&#xA;&#xA;Text between lines&#xA;&#xA;---  &#xA;&#xA;Text between lines&#xA;___  &#xA;&#xA;Text below line&#xA;&#xA;### Block Quotes&#xA;&#xA;&gt;This text should render in a block quote.&#xA;&#xA;**The following markdown should render within the block quote:**  &#xA;&gt; #### Heading 4  &#xA;&gt; _Italics_, *Italics*, **Bold**, ***Bold-italics***, **_Bold-italics_**, ~~Strikethrough~~  &#xA;&gt; :) :-) ;) :-O :bamboo: :gift_heart: :dolls:  &#xA;&#xA;**The following text should render in two block quotes separated by one line of text:**&#xA;&gt; Block quote 1&#xA;&#xA;Text between block quotes&#xA;&#xA;&gt; Block quote 2&#xA;&#xA;### Headings&#xA;&#xA;# Heading 1 font size  &#xA;## Heading 2 font size   &#xA;### Heading 3 font size  &#xA;#### Heading 4 font size  &#xA;##### Heading 5 font size  &#xA;###### Heading 6 font size  &#xA;&#xA;&#xA;### Escaped Characters&#xA;&#xA;**The following text should render the same as the raw text:**&#xA;Raw: `\\teamlinux\IT-Stuff\WorkingStuff`&#xA;Markdown: \\teamlinux\IT-Stuff\WorkingStuff&#xA;&#xA;&#xA;**The following text should escape out the first backslash so only one backslash appears:**&#xA;Raw: \\()#&#xA;Markdown: \\()#</Content>
    </Message>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1538770984703</DateTimeUTC>
      <Content>This is a multilinear message&#xA;This is other line&#xA;&#xA;And other onesuhdhdhdjjfhfhfjhdhfhhfjfjjfjjfbjfjgjjgkgjbfhfjgjjfhfjhfjgjfhhfjgjjfhgjjgjg</Content>
    </Message>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1538771067474</DateTimeUTC>
      <Content> | A  | B  | C  |&#xA; |:---|:---|:---|&#xA; | 1  | Name | Toast |&#xA; | 2  | Name | Server |</Content>
    </Message>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1538771290262</DateTimeUTC>
      <Content>https://ci-linux-mysql.mattermost.com/jespino/pl/5ucabkmfn3y6dg4hzta59na51o</Content>
    </Message>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1538771463539</DateTimeUTC>
      <Content>https://ci-linux-mysql.mattermost.com/jespino/pl/k3ukif5sdbdsmcfurtayo6xfhe</Content>
    </Message>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1538771505292</DateTimeUTC>
      <Content>https://ci-linux-mysql.mattermost.com/jespino/pl/4e5ybi7jaj8q8qfsxw8j14ibto</Content>
    </Message>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1538771869149</DateTimeUTC>
      <Content>Test</Content>
    </Message>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1538771875114</DateTimeUTC>
      <Content>Other</Content>
    </Message>
    <Message>
      <LoginName>jesus+2@mattermost.com</LoginName>
      <DateTimeUTC>1538771920239</DateTimeUTC>
      <Content>test</Content>
    </Message>
    <Message>
      <LoginName>jesus+2@mattermost.com</LoginName>
      <DateTimeUTC>1538771935919</DateTimeUTC>
      <Content>https://media1.giphy.com/media/l41lM6sJvwmZNruLe/giphy.gif</Content>
    </Message>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1538772010727</DateTimeUTC>
      <Content>One</Content>
    </Message>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1538772013386</DateTimeUTC>
      <Content>Two</Content>
    </Message>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1538772019076</DateTimeUTC>
      <Content>Three</Content>
    </Message>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1538772066728</DateTimeUTC>
      <Content>One</Content>
    </Message>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1538772069956</DateTimeUTC>
      <Content>Two</Content>
    </Message>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1538772072921</DateTimeUTC>
      <Content>Three</Content>
    </Message>
    <Message>
      <LoginName>jesus+2@mattermost.com</LoginName>
      <DateTimeUTC>1538772306414</DateTimeUTC>
      <Content>@jespino prueba</Content>
    </Message>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1538772452693</DateTimeUTC>
      <Content>@JespiNo</Content>
    </Message>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1538772463360</DateTimeUTC>
      <Content>@jespino</Content>
    </Message>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1538772829460</DateTimeUTC>
      <Content>真名j.る下さい</Content>
    </Message>
    <Message>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1538772859032</DateTimeUTC>
      <Content>ねつにか下さい</Content>
    </Message>
    <Message>
      <LoginName>jesus+2@mattermost.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
      <Content>The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Bright vixens jump; dozy fowl quack. Quick wafting zephyrs vex bold Jim. Quick zephyrs blow, vexing daft Jim. Sex-charged fop blew my junk TV quiz. How quickly daft jumping zebras vex. Two driven jocks help fax my big quiz. Quick, Baz, get my woven flax jodhpurs! &#34;Now fax quiz Jack!&#34; my brave ghost pled. Five quacking zephyrs jolt my wax bed. Flummoxed by job, kvetching W. zaps Iraq. Cozy sphinx waves quart jug of bad milk. A very bad quack might jinx zippy fowls. Few quips galvanized the mock jury box. Quick brown dogs jump over the lazy fox. The jay, pig, fox, zebra, and my wolves quack! Blowzy red vixens fight for a quick jump. Joaquin Phoenix was gazed by MTV for luck. A wizard’s job is to vex chumps quickly in fog. Watch &#34;Jeopardy!&#34;, Alex Trebek&#39;s fun TV quiz game. Woven silk pyjamas exchanged for blue quartz. Brawny gods just flocked up to quiz and vex him. Adjusting quiver and bow, Zompyc[1] killed the fox. My faxed joke won a pager in the cable TV quiz show. Amazingly few discotheques provide jukeboxes. My girl wove six dozen plaid jackets before she quit. Six big devils from Japan quickly forgot how to waltz. Big July earthquakes confound zany experimental vow. Foxy parsons quiz and cajole the lovably dim wiki-girl. Have a pick: twenty six letters - no forcing a jumbled quiz! Crazy Fredericka bought many very exquisite opal jewels. Sixty zippers were quickly picked from the woven jute bag. A quick movement of the enemy will jeopardize six gunboats. All questions asked by five watch experts amazed the judge. Jack quietly moved up front and seized the big ball of wax. The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs. Waltz, bad nymph, for quick jigs vex! Fox nymphs grab quick-jived waltz. Brick quiz whangs jumpy veldt fox. Hello this is a long post, with more than 4000 characters, plus multiple attachments.</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>jesus+2@mattermost.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
      <UserFileName>IMG_3408.JPG</UserFileName>
      <FileName>20181005/teams/noteam/channels/m69it5qgdinyfppi38rwnbo3fa/users/fem6jeib6p8jdpjfmn39cb9gpy/89m4hkmz3jname4e63jnnwa9bo/IMG_3408.JPG</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>jesus+2@mattermost.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
      <UserFileName>IMG_3409.JPG</UserFileName>
      <FileName>20181005/teams/noteam/channels/m69it5qgdinyfppi38rwnbo3fa/users/fem6jeib6p8jdpjfmn39cb9gpy/q3ddomjxwpd6p8pb63jhtfrzhe/IMG_3409.JPG</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>jesus+2@mattermost.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
      <UserFileName>IMG_6882.JPG</UserFileName>
      <FileName>20181005/teams/noteam/channels/m69it5qgdinyfppi38rwnbo3fa/users/fem6jeib6p8jdpjfmn39cb9gpy/woruw385dtn6zb4s7iqe93d8iw/IMG_6882.JPG</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>jesus+2@mattermost.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
      <UserFileName>IMG_8714.JPG</UserFileName>
      <FileName>20181005/teams/noteam/channels/m69it5qgdinyfppi38rwnbo3fa/users/fem6jeib6p8jdpjfmn39cb9gpy/ssyyezhrbjymm8ntko95313w7r/IMG_8714.JPG</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>jesus+2@mattermost.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
      <UserFileName>IMG_3408.JPG</UserFileName>
      <FileName>20181005/teams/noteam/channels/m69it5qgdinyfppi38rwnbo3fa/users/fem6jeib6p8jdpjfmn39cb9gpy/89m4hkmz3jname4e63jnnwa9bo/IMG_3408.JPG</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>jesus+2@mattermost.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
      <UserFileName>IMG_3409.JPG</UserFileName>
      <FileName>20181005/teams/noteam/channels/m69it5qgdinyfppi38rwnbo3fa/users/fem6jeib6p8jdpjfmn39cb9gpy/q3ddomjxwpd6p8pb63jhtfrzhe/IMG_3409.JPG</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>jesus+2@mattermost.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
      <UserFileName>IMG_6882.JPG</UserFileName>
      <FileName>20181005/teams/noteam/channels/m69it5qgdinyfppi38rwnbo3fa/users/fem6jeib6p8jdpjfmn39cb9gpy/woruw385dtn6zb4s7iqe93d8iw/IMG_6882.JPG</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>jesus+2@mattermost.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
      <UserFileName>IMG_8714.JPG</UserFileName>
      <FileName>20181005/teams/noteam/channels/m69it5qgdinyfppi38rwnbo3fa/users/fem6jeib6p8jdpjfmn39cb9gpy/ssyyezhrbjymm8ntko95313w7r/IMG_8714.JPG</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesus+1@mattermost.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesus+2@mattermost.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesus+3@mattermost.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesus+6@mattermost.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesus.espino+10@mattermost.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesus.espino@mattermost.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesus@mattermost.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+16rsuhzcqjdc9fywa4jpqxd69c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+1usz1m7f6by6pn1zc93y3pc1qr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+1ydueh84tt893n3botga4ktsrr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+3c15ptwo63gc3bgqezwq3cqqwy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+3dgtnfm8npgy5e9ij5tzr497yc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+3dzs9x1kubnufbj8gwzaihiw1r@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+3eubgib6z7b4xmk8f49ccjgq4e@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4cy3qskjzprdtra3r7sizddxnc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4y9zb764rbbr5gc4s85nq69a8r@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+5br3jerodtrnxge6s9ddmf83fc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+5eary63rm7y9tkkzzoj45rnoiy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+61cs34fyatbotcxp33oiubmheh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+65456kkw63gumni3xiryrxwx8c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+9dskxf7affyiudxfn73cazw8wc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+a136u75zt3grdrer1fq5cbjy4y@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+af9g73si6bn45qeh3ee5mx1pma@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+b6r8nojczbb678snnpsdgd5eue@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+c73s1pyrepby8r6785khrff69h@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+c9743cyhzp8o9kizdkpxbcybiw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+cdg9disii7gkmyr9s44hd666jy@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+ct4r7g5gr3gn8jadaeiufws5ae@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+d3f3ekbebtno9yjti6regjfepc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+d6qibkxxk3drzfux8g5az5xzpw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+e9ndx3qf7tf7i8mz18jwm8x6to@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+ey83b6961pnytkdcx8dd8f44oh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+fipxcskukidypxdny8pjmnqf3c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+g9yyaxoo7p88bjcr48q1r3gfdw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+ghmutxi4r7nmtxeg8n3y81esch@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+hfw1jx1k77bxmnxy8g5no7xzrc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+hn7a8ntubi8qum5isshqdckjxa@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+hs4xigfcujnwjepfpukknt854o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+i1qn5df31tg6dqfdpwzqemmb5o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+i8aq1a79q7deugge5mm5ey7wxw@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+i9x89ebtsfn3jrrzj19eo7pjta@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+idwbhx9bafdsmx3zmodj6ebtze@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+idztxxyszinbukdqr9wdg5u1ka@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+iqj5xf84d7ytpn49jkw8zskktc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+jwxyjqzpitnt8khfj6x3awd3sc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+k34zwbumr7fmiftwen59hm3g1h@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+m1p4a793mfnjtmj7uiohqqigfh@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+mbpg7ygm7pdn5djsm9qknsoi6o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+mdnyuu16ftbm9pbjknahqtuc1o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+nc67w5tfnb8n9pekjcr4yyynow@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+otiw3i3zn7bejqjg81hykgo4ky@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+p5xutbyiwp8c8xbr84ikxq9d9a@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+peq5rx37upgsdkdf5biz6psf6o@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+prfwdej8bbn17qd84ojtkmxcnc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+qpb5bbjq5bypmmrzfnqmq6cc8h@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+qw1bo7hut7nyxg5e43ncqdbtqo@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+sq1zwn6y37y8ppduk8cxjb6s8c@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+urqxhs4q5fd7dgdzw7crkxicbe@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+wyhw9x8znfb4bdtz9xioh4oxko@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+yhakxzg5tj8u9xt1485whksmpc@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+zkjf5sce6bbn8qg81ubtwfjrth@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+zo9tphxojffeie197d3w4edkkr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1538772950618</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538772950618</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Town Square">
    <RoomID>public - bgg1xm6gajgx7f99uj8zh7tayw</RoomID>
    <StartTimeUTC>1535557054079</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1525705976274</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan.haussermann@mattermost.com</LoginName>
      <DateTimeUTC>1525706136060</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1525708280779</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+xdpkizgj6jyfmjzpwxh85uxohcsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1525708383567</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+5kzzjczzxfdbfdicsp6wdue68osimulator.amazonses.com</LoginName>
      <DateTimeUTC>1525708383682</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+oyxobgwxbpf1xpgpz5ffcc18owsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1525708383795</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+05072018-c@mattermost.com</LoginName>
      <DateTimeUTC>1525718122533</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1525718407108</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1525718625621</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+dkhuser10@mattermost.com</LoginName>
      <DateTimeUTC>1525795399478</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>elias@mattermost.com</LoginName>
      <DateTimeUTC>1529362365428</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+dkh-teamjoinuser@mattermost.com</LoginName>
      <DateTimeUTC>1530801931324</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>elias+icu@mattermost.com</LoginName>
      <DateTimeUTC>1538741728570</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>elias@mattermost.com</LoginName>
      <DateTimeUTC>1535557054079</DateTimeUTC>
      <Content>https://ci-linux-mysql.mattermost.com/dkh-team-2/pl/4b8zxgk8qidrxexbn5o9g49i5r</Content>
    </Message>
    <Message>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1535594965833</DateTimeUTC>
      <Content>pony</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536206363346</DateTimeUTC>
      <Content>Post made at 11:59 EST</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536206421224</DateTimeUTC>
      <Content>Post made at 12:00 EST</Content>
    </Message>
    <Message>
      <LoginName>elias+icu@mattermost.com</LoginName>
      <DateTimeUTC>1538743216008</DateTimeUTC>
      <Content>testing</Content>
    </Message>
    <Message>
      <LoginName>elias+icu@mattermost.com</LoginName>
      <DateTimeUTC>1538743230918</DateTimeUTC>
      <Content>test number 2</Content>
    </Message>
    <Message>
      <LoginName>elias+icu@mattermost.com</LoginName>
      <DateTimeUTC>1538743252091</DateTimeUTC>
      <Content>@elias test</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538743252091</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1538743252091</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+05072018-c@mattermost.com</LoginName>
      <DateTimeUTC>1538743252091</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+dkh-teamjoinuser@mattermost.com</LoginName>
      <DateTimeUTC>1538743252091</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+dkhuser10@mattermost.com</LoginName>
      <DateTimeUTC>1538743252091</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan.haussermann@mattermost.com</LoginName>
      <DateTimeUTC>1538743252091</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1538743252091</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>elias+icu@mattermost.com</LoginName>
      <DateTimeUTC>1538743252091</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>elias@mattermost.com</LoginName>
      <DateTimeUTC>1538743252091</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+5kzzjczzxfdbfdicsp6wdue68osimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538743252091</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+oyxobgwxbpf1xpgpz5ffcc18owsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538743252091</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+xdpkizgj6jyfmjzpwxh85uxohcsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538743252091</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538743252091</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Test Channel">
    <RoomID>public - z79sngoszibspmdq9yosnsnfky</RoomID>
    <StartTimeUTC>1536169351482</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1528398414437</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1530893731708</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1530893825184</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1536169351482</DateTimeUTC>
      <Content>test editing this post</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536192805268</DateTimeUTC>
      <Content>posting a message</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536193010665</DateTimeUTC>
      <Content>khkjh</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1538749830476</DateTimeUTC>
      <Content>this is a message</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1538749830476</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1538749830476</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538749830476</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="F Channel">
    <RoomID>public - jwr5dk1rstykinzxa6cqmq47wy</RoomID>
    <StartTimeUTC>1536181599139</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1530893817589</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+jun6@mattermost.com</LoginName>
      <DateTimeUTC>1536179109467</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+5jul@mattermost.com</LoginName>
      <DateTimeUTC>1536179109474</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1536179109481</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536192951168</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>katie+jun6@mattermost.com</LoginName>
      <DateTimeUTC>1536181599139</DateTimeUTC>
      <Content>hello @katieplustest </Content>
    </Message>
    <Message>
      <LoginName>katie+jun6@mattermost.com</LoginName>
      <DateTimeUTC>1536181659707</DateTimeUTC>
      <Content>@katieplustest  testing a notification</Content>
    </Message>
    <Message>
      <LoginName>katie+jun6@mattermost.com</LoginName>
      <DateTimeUTC>1536181726140</DateTimeUTC>
      <Content>@katieplustest </Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536192955841</DateTimeUTC>
      <Content>hghjkg</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>katie+5jul@mattermost.com</LoginName>
      <DateTimeUTC>1536192955841</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie+jun6@mattermost.com</LoginName>
      <DateTimeUTC>1536192955841</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1536192955841</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1536192955841</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536192955841</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536192955841</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Test: AAA">
    <RoomID>public - zesisctjjpdguctuahyr98c3to</RoomID>
    <StartTimeUTC>1536253445331</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>joram@mattermost.com</LoginName>
      <DateTimeUTC>1530890731350</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536253543462</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536253445331</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536253445331</DateTimeUTC>
      <Content>https://ci-linux-mysql.mattermost.com/a-team/pl/q8566rtpttfd8rzx9cboaoh4te</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536253525343</DateTimeUTC>
      <Content>https://ci-linux-mysql.mattermost.com/a-team/pl/8o54ad8cmfbwxp64nfdewar65y</Content>
    </Message>
    <Message>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536254080053</DateTimeUTC>
      <Content>https://ci-linux-mysql.mattermost.com/a-team/pl/gncqr1oxdpn7pnkzzwhq9t3ync</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536254080053</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>george+43@mattermost.com</LoginName>
      <DateTimeUTC>1536254080053</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>joram@mattermost.com</LoginName>
      <DateTimeUTC>1536254080053</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536254080053</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Town Square">
    <RoomID>public - 8k6z1ypbeinrbrsbpawbw3wnoe</RoomID>
    <StartTimeUTC>1536280822337</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1532757669448</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>scottleedavis@mattermost.com</LoginName>
      <DateTimeUTC>1532909685961</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>saturnino+remind@mattermost.com</LoginName>
      <DateTimeUTC>1532940402262</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>saturnino@mattermost.com</LoginName>
      <DateTimeUTC>1533746229743</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1533836275060</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536280822337</DateTimeUTC>
      <Content>@HERE </Content>
    </Message>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536280822337</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536280822337</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>saturnino+remind@mattermost.com</LoginName>
      <DateTimeUTC>1536280822337</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>saturnino@mattermost.com</LoginName>
      <DateTimeUTC>1536280822337</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>scottleedavis@mattermost.com</LoginName>
      <DateTimeUTC>1536280822337</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536280822337</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - kw5n3yznm7gr7r51qf9bqzzhqo</RoomID>
    <StartTimeUTC>1538689772080</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1538689541255</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+zw3aekuaaffs5c5wnncjq5ag3hsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538689541267</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1538689772080</DateTimeUTC>
      <Content>Hey hey</Content>
    </Message>
    <Message>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1538689772080</DateTimeUTC>
      <Content>Hey</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1538689772080</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+zw3aekuaaffs5c5wnncjq5ag3hsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538689772080</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538689772080</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="sometestchannel">
    <RoomID>public - ftxf53f8cpb4pqmpf67itzu9mc</RoomID>
    <StartTimeUTC>1536170526484</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1530829800508</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170526484</DateTimeUTC>
      <Content>reply</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170550568</DateTimeUTC>
      <Content>far l far  @christopher50testing more hey versus  #disbanded pithy for  @christopher the one unique and  @christopher50testing  then  @christopher furrowed the feverish  #the  #l where disbanded  @christopher50testing kookaburra a normal  #a ouch  #then circuitous  #for so cliquishly a  #so</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170550598</DateTimeUTC>
      <Content>off  @christopher50testing much  @christopher50testing euphemistically aft in goodness badly hatchet  #manatee  obscure  #on hence manatee from  @christopher understandable or  @christopher  # #on  #hatchet  @christopher50testing much gull  #or on</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170550626</DateTimeUTC>
      <Content>and explicitly as  #oh a one ormal cliquishly far  #therefore  @christopher50testing much oh circuitous hey the then for pithy and far the a feverish tame more ouch across  #oh where kookaburra versus  @christopher therefore  @christopher50testing</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170550656</DateTimeUTC>
      <Content>geous jolly a.&#xA;Freely the bit the  #ouch jeepers octopus heated on less apart placed that since  #the c  #placed hardheadedly ouch along wayward hey more fearless pending  #a.&#xA;Freely iguana some cowered prior</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170550681</DateTimeUTC>
      <Content>set  @christopher50testing  #grasshopper  @christopher some  #pending shark grasshopper as  @christopher50testing much one mastodon depending sheared since as  @christopher   @christopher50testing hey jeepers this up before  #set infinitesimal some far via pending dropped distant well more</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170550712</DateTimeUTC>
      <Content>llama.&#xA;Up  #excepting without  @christopher brusque to spread m inventoried piquant due wove ell this alas  @christopher that  #wove  @christopher squid on excepting and that beneath the hey more imprecisely  @christopher more aristocratically and pill rapidly</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170550738</DateTimeUTC>
      <Content>groundhog a on  #more far decidedly giraffe les baboon  #away  @christopher buoyant far worm at gosh the concentric  #overslept reset  #outrageously before outrageously adventurous  @christopher one spitefully darn jeez  #at more much.&#xA;Jeepers  @christopher on overslept away  #far moth</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170550764</DateTimeUTC>
      <Content>a  @christopher50testing bucolically this tapir and ouch jeepers saddled more a rewrote much  @christopher50testing wildebeest  #essential this  #ouch while wolverine.&#xA;Cm much crane from  @christopher eering egregiously ouch mu where on when and in aside essential admirably</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170550794</DateTimeUTC>
      <Content> #groaned the scornfully far wow dived so this outside rslept showed hysteric on groaned  #the rattlesnake  @christopher scowle away and far much lynx  #and immature one worm less baneful hence  #scornfully pounded dachshund gosh past yikes hence</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170550823</DateTimeUTC>
      <Content>however besides emoted and a blushed dear.&#xA;Far the this because while hello  #the far  #while assenting therefore however static consideri cowered when the fitted  #fitted and one that momentously y gross  @christopher wholeheartedly</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170550848</DateTimeUTC>
      <Content>the outrageously darn moth  #darn reset  @christopher baboon itefully  #darn decidedly a one  #reset on groundhog concentric at buoyant  @christopher50testing giraffe  @christopher</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170550877</DateTimeUTC>
      <Content> @christopher50testing that much.&#xA;Jeepe remote as much wherever via annoying one adventurous jeez some immaturely sniffled fishy  @christopher50testing mandrill weasel correctly pper  @christopher50testing hey leopard on and where</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170550910</DateTimeUTC>
      <Content>bluebird sped a  #scooped that that positively  #sped less scooped oh and more  @christopher overtook and some  #darn ravenously warmly e darn in misheard hey needless fell craven darn far ba romantically</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170550937</DateTimeUTC>
      <Content>while hello lorikeet but  @christopher50testing jeepers and smooched orca  #across beat less  @christopher  #smooched  #strategic  @christopher50testing  @christopher50testing t  @christopher pangolin while strategic set  #less one  # #strategic plankton without nfallibly reliably hello across accurately</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170550969</DateTimeUTC>
      <Content>came much airily much  @christopher50testing after closed armadill far for  @christopher50testing  #much  #less extensively  #wept far xpress jaded tranquil merry  #closed dismounted wept one interminably less</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170550997</DateTimeUTC>
      <Content> #that however shook dable this that behind bat wrote the more yellow so far wayward after  #flapped that thanks hence and   #hence thus  @christopher50testing mindfully alas so flapped</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170551028</DateTimeUTC>
      <Content>goodness  @christopher or  #euphemistically  #in in hence th much from ch hatchet gull after euphemistically manatee  @christopher50testing  #euphemistically understandable on obscure off</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170551057</DateTimeUTC>
      <Content>guinea.&#xA;Irksomely until well ungraceful up s since amicably tarantula flamingo despite  #easy far upon  #amicably koala  #fired easy  #gazelle  @christopher50testing gazelle fired  @christopher for one contrary one</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170551085</DateTimeUTC>
      <Content> dropped much shark as  #as one  #set hey well set infinitesimal more fishy some  some grasshopper  #shark this far via as</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170551113</DateTimeUTC>
      <Content>inescapably so that  @christopher lantern   @christopher more vitally furrowed e  #and dear as spoiled one credible  #e due  #  #furrowed wow much went fetchingly  #as specially  #so much  @christopher  @christopher50testing well the instead and gosh</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170551142</DateTimeUTC>
      <Content>repeated since less a much regal broadcast chose  @christopher scowled more m that  #rebound forward some yikes or confidently dipped the awesomely lly some convulsively when  #some zebra merry rebound</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170551167</DateTimeUTC>
      <Content>a one.&#xA;Raccoon among but and more  @christopher sane this hey chidna this black while squid hello as yikes ouch cockatoo scallop halfhearted  @christopher  #a  @christopher sex alas  @christopher thankful far</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170551195</DateTimeUTC>
      <Content>then oh one  @christopher cliquishly versus hey  #the more  @christopher  @christopher normal across a  ouch and the circuitous feverish the kookaburra and  @christopher far for far where pithy a ded</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170551223</DateTimeUTC>
      <Content>on threw one  #at touched much caribou  #threw   @christopher a far a  @christopher yet barbarously ruthlessly  #after.&#xA;Spoke at well after.&#xA;Spoke gosh less the  @christopher50testing he</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170551254</DateTimeUTC>
      <Content>by rethought some jeez gazed  @christopher excepting bluebird lamely amidst since much  more and  @christopher50testing naughtily tic one.&#xA;Hey then hence bald less</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170551283</DateTimeUTC>
      <Content>prior along this and  #plankton cowered and iguana  @christopher50testing otter methodically  #kindhearted astride plankton monkey a  @christopher50testing kindhearted  @christopher above courageous evasive tranquil wrung shuddered wayward</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170551313</DateTimeUTC>
      <Content>serenely ouch after  #against gauche  @christopher temperately  @christopher along  #gauche  @christopher  @christopher  #re outside classically goodhearted quit one more goldfinch re  #classically excitedly vulture this against  oh</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170551341</DateTimeUTC>
      <Content>hardily goldfinch  @christopher50testing until  @christopher50testing in as that one before tolerable shuddered preparatory coquettish versus where one  shark instead  @christopher50testing far  @christopher regardless ouch dear much swore vivid  #regardless  @christopher50testing sang panther much</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170551371</DateTimeUTC>
      <Content> @christopher50testing alongside scallop alas monumentally  @christopher   @christopher before turned poignant much abortive definitely the wretched spoke obdurately a ouch much insolent one  @christopher raptly titilatingly hey  @christopher hare that</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170551401</DateTimeUTC>
      <Content>forgave suggestively according man-of-war some shined and  @christopher50testing and so much t robin during ly the to less combed alas since heron strident</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170551432</DateTimeUTC>
      <Content>far then left amidst jeez  #some by more stylistic one.&#xA;Hey excepting rethought  #brought naughtily brought gazed hence and bald less some since lamely bluebird much</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170551459</DateTimeUTC>
      <Content>busted yet.&#xA;Less  #a  #fatuousl ouch handsomely amidst and  #manatee but vulture manatee  #ouch komodo  @christopher50testing this after a  #y reined much y exultingly fatuousl  # #a some outside  #a one</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170551489</DateTimeUTC>
      <Content>im that ravenously then far  #honey some honey in rose babbled romantically less needless that  #im  @christopher positively ard</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170551517</DateTimeUTC>
      <Content>preparatory nutria shuddered coquettish  @christopher50testing far where much  #coarsely because that preparatory tolerable exaggerated panther ss cordial  #ss gradually  #where sang coarsely awesome sheep hardily dear</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170551551</DateTimeUTC>
      <Content>tapir ouch and wildeb wolverine.&#xA;Cm cow this essential jeepers jeering aside  @christopher50testing on a much egregiously  #aside while  @christopher ouch admirably a  #tapir from this and much bucolically  when in more rewrote</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170551582</DateTimeUTC>
      <Content>forgave some  #exclusively pled  #man-of-war this man-of-war and much  #strident and this  # #far a cantankerous strident inanimately.&#xA;Beside circuito combed far misheard alas to less polite  #and then far so exclusively  #far crud</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170551612</DateTimeUTC>
      <Content> @christopher50testing specially spoiled inescapably  @christopher as much much wow and  @christopher  lantern fetchingly gosh dear one went due vitally  @christopher50testing well  #much so that furrowed  @christopher</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170551642</DateTimeUTC>
      <Content>dear.&#xA;Far blushed and assenting that the whol however  #emoted a emoted besides llo while  #blushed momentously however far  #far gross  # #emoted because  @christopher50testing the therefore one  #far</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170551672</DateTimeUTC>
      <Content>and rethought less lamely reciprocating gazed much naug stylistic goodness far  @christopher50testing one.&#xA;Hey jellyfish  #excepting far unnecessary aced a excepting  #unnecessary</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170551703</DateTimeUTC>
      <Content> @christopher one.&#xA;R echidna  @christopher50testing insolently thankful so  @christopher50testing far far between greyhound halfhearted squid honey more raucously above</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170551731</DateTimeUTC>
      <Content> #heron during the  #inside suggestively  #during a  #combed  @christopher50testing some shined since unted less beyond  #according strident  @christopher mongoose and combed heron confessedly according robin  @christopher50testing inside</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170551761</DateTimeUTC>
      <Content>angelfish gosh d so  #highhanded  #yet woodchuck the far away  @christopher50testing fortuitous and boa.&#xA;One crud parrot  #and  #one  #mounted where yet nasty one spitefully aboard kangaroo instead worm highhanded  #gosh dazedly  #testy mounted testy as</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170551790</DateTimeUTC>
      <Content>crab  that  #g  #and  #g some in clear unicorn and more  #far until  #jeez excepting far  @christopher50testing far macaw due grimaced aristocratically jeez piquant  #some much enticingly g more more purely  #excepting beneath jeepers groomed wove barring</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170551819</DateTimeUTC>
      <Content>less the on so worm hence hence wow away  #wow  @christopher50testing pounded immature lept showed  #hysteric  @christopher50testing gosh  @christopher50testing lynx much hysteric  @christopher50testing baneful  #outside far yikes outside dived past scornfully far rattlesnake groaned and  @christopher50testing one d this</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170551847</DateTimeUTC>
      <Content> #arguable inoffensively.&#xA;Snorted stiffly  #one  #rk rk subconsciously tidy against  @christopher one  #forthrightly began fiendishly bu hawk forthrightly  #rk much  # #one much one generously  #forthrightly arguable</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170551873</DateTimeUTC>
      <Content>and  #mounted woodchuck mounted crud  #highhanded boa.&#xA;One as and fortuitous  @christopher kangaroo angelfish  #mounted  #ght highhanded  @christopher50testing one so nast dazedly  @christopher gosh aboard ght  @christopher50testing spitefully</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170551903</DateTimeUTC>
      <Content>athletic a one  #one spurious baneful  #much  #a g  #oh  #much jeez much  @christopher50testing one much subconsciously  #jeez  #spurious cynically generously  @christopher50testing oh meadowlark toneless  @christopher50testing crud</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170551931</DateTimeUTC>
      <Content> #rashly  # #snug far  #woolly less  @christopher50testing cunning las woolly woodchuck  @christopher and adjusted crud untruthful past  @christopher50testing outside  #loving indecisive one snug  @christopher50testing  #snug loving fabulous rashly exotic and</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170551961</DateTimeUTC>
      <Content> #a after jeering  @christopher howled flagrantly weirdly a the essential  #less  #oh cow ched much  #much and a oh tap  @christopher when bucolically some komodo  #less and ouch fabulous admirably much the hello jeez much egregiously jeepers less crud  # #less</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170551987</DateTimeUTC>
      <Content>hare re-laid abortive spoke compassionate hey insolent poignantly a  @christopher50testing  before yet a that  @christopher  @christopher  @christopher dear goodness the hey  #alas wretched turned sp alas the scooped much</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170552018</DateTimeUTC>
      <Content>angry hence after merry well.&#xA;Unicorn much boundless  #closed hello however  @christopher50testing came jaded when for up yawned up much less express extensively closed tranquil dismounted  @christopher50testing much interminab wept airily this  @christopher</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170552048</DateTimeUTC>
      <Content>more spilled on far jolly scallop aside bit  #yikes immeasurably revealed raptly newt  #wistful laboriously  #aside far  #cuddled.&#xA;Caterpillar  @christopher that yikes definitely oriole  #wistful cuddled.&#xA;Caterpillar and  #bit less obdurately titilatingly wistful</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170552074</DateTimeUTC>
      <Content>hyena apart s far withdrew wombat rhinoceros nodded much goodness overtook before some dalma  @christopher  #withdrew  @christopher shyly alongside a  @christopher50testing the since far deserved</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170552104</DateTimeUTC>
      <Content>highhanded dazedly spitefully so strived as and nasty in one and  @christopher50testing woodchuck  #dazedly aboard crud and angelfish guanodon strove kangaroo  #aboard boa.&#xA;One mounted gosh fortuitous moodily and sought</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170552132</DateTimeUTC>
      <Content>dear due one gosh went s  #fetchingly  #that zebra  #fetchingly fetchingly that so  @christopher credible more much furrowed  # #fetchingly and inescapably much merry  @christopher lantern  @christopher since wow well scowled</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170552163</DateTimeUTC>
      <Content>where much the input endearingly  #where rewrote hummingbird a the saddled ouch goodness together from aside opposite  @christopher crane ouch smooched on struck ouch some beside  #where shrugged n this wildebeest dear</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170552189</DateTimeUTC>
      <Content> #went much  #inescapably  @christopher50testing much vitally  @christopher due  @christopher50testing fetchingly  #ible  #well lantern ible well inescapably and as  @christopher ins went furrowed wow specially dear spoiled one  #dear  #fetchingly gosh that so</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170552225</DateTimeUTC>
      <Content> #regardless dear  #one swore that panther  #swore regardless much  # #one vivid goldfinch in  #sang versus instead sang one  #goldfinch until one ouch before shark tolerable</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170552250</DateTimeUTC>
      <Content>however  @christopher neurotically the  @christopher  @christopher abjectly  @christopher50testing wholeheartedly therefore and blushed grouped incessantly dear one momentously firefly a because wore dear.&#xA;Far impotently the goodness  that considering one and </Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170552282</DateTimeUTC>
      <Content>actively house wallaby far  #duteous  #more  #poked  @christopher  @christopher petted much oh more duteous that scooped  #that as fter beside this before thrust human  #thrust during walking dear  @christopher caterpillar  #drank weird fl poked much rode  #actively  @christopher50testing  @christopher50testing drank</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170552310</DateTimeUTC>
      <Content>spaciously stolidly more er  #one jeez fishily the  @christopher hey inset the alas  #more pre cozily yikes audible dear following  #the far  #one  #following  @christopher50testing the hence petted  @christopher  #following as passably one</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170552342</DateTimeUTC>
      <Content>insolently  #one a  #that far abjectly so  #so above neurotically one  #far ra wore between  grouped far goodness so honey that greyhound impotently dear far firefly</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170552367</DateTimeUTC>
      <Content> @christopher excepting more  #reciprocating t far  #naughtily naughtily jellyfish one.&#xA;Hey gazed a much rethought lamely amidst  #rethought  #jellyfish goodness and since  # #naughtily stylistic less unnecessary reciprocating jeez</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170552396</DateTimeUTC>
      <Content>ouch  @christopher  @christopher50testing murkily tolerable turtle hence added much onto  @christopher far before and much congenially onto dived outsold hawk  @christopher50testing eccentrically thus  #outbid much lubber alas outbid flabby nasty more ical  @christopher k</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170552426</DateTimeUTC>
      <Content>after far oh rode scooped weird as duteous before  poked much and wallaby that walking caterpillar beside .&#xA;More much petted drank scandalously until this actively  @christopher50testing</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170552458</DateTimeUTC>
      <Content>struck er input the grimaced smooched  #grimaced more dear shrugged leopard a ouch ouch sincere as goodness richly false irksomely.&#xA;Camel tho the hawk the  @christopher slick some  @christopher pulled waked until beside this</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170552485</DateTimeUTC>
      <Content>therefore scowled one much  prior lynx wow hence tenable much pounded this  @christopher50testing outside rabb scornfully drank while scratched dived added before one hey past groaned dachshund</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170552517</DateTimeUTC>
      <Content>beyond jeepers far &#xA;The mongoose  @christopher  @christopher painful less essential essential merrily  #merrily  @christopher50testing confesse dismounted inside  #confesse proudly and  #&#xA;The</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170552517</DateTimeUTC>
      <Content>beyond jeepers far &#xA;The mongoose  @christopher  @christopher painful less essential essential merrily  #merrily  @christopher50testing confesse dismounted inside  #confesse proudly and  #&#xA;The</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170552517</DateTimeUTC>
      <Content>beyond jeepers far &#xA;The mongoose  @christopher  @christopher painful less essential essential merrily  #merrily  @christopher50testing confesse dismounted inside  #confesse proudly and  #&#xA;The</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170552546</DateTimeUTC>
      <Content>much b barbarously a on near one shrewdly yet  #more  @christopher50testing  # #a ruthlessly caribou a far  #threw gosh less  # #a after.&#xA;Spoke well the  #yet  #a the more at touched y threw  @christopher50testing</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170552575</DateTimeUTC>
      <Content> #incessantly grouped impote blushed  #one wore considering incessantly and a  #the the  #impote therefore firefly momentously one neurotically  #grouped wholeheartedly  #neurotically  #a however the that</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170552601</DateTimeUTC>
      <Content>stylistic  #less  #well reciprocating far h unnecessary excepting rethought naught placed a gazed much and well jellyfish lamely far  #much less one.&#xA;Hey goodness</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170552628</DateTimeUTC>
      <Content> #dachshund demonstrably some  @christopher50testing o kindhearted squirrel.&#xA;Some mallard alas temperately  @christopher50testing far  @christopher50testing  @christopher dachshund  #and irritably yikes however that and flapped  #alas considering therefore the reset</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170552628</DateTimeUTC>
      <Content> #dachshund demonstrably some  @christopher50testing o kindhearted squirrel.&#xA;Some mallard alas temperately  @christopher50testing far  @christopher50testing  @christopher dachshund  #and irritably yikes however that and flapped  #alas considering therefore the reset</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170552628</DateTimeUTC>
      <Content> #dachshund demonstrably some  @christopher50testing o kindhearted squirrel.&#xA;Some mallard alas temperately  @christopher50testing far  @christopher50testing  @christopher dachshund  #and irritably yikes however that and flapped  #alas considering therefore the reset</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170552657</DateTimeUTC>
      <Content> #strident since  #shined robin man-of-war forgave less  #alas according onfessedly much t during shined combed  #much heron strident alas  @christopher50testing the suggestively  @christopher so  @christopher50testing and  @christopher some and  @christopher</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170552700</DateTimeUTC>
      <Content> #opposite excited  #hatchet  @christopher50testing  @christopher  @christopher50testing far lizard jeez more hatchet much expedient tige  #scratched.&#xA;Canny coughed  #opposite powerlessly far salmon one indiscriminate yikes opposite scratched.&#xA;Canny forcefully</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170552728</DateTimeUTC>
      <Content>reset at decidedly a giraffe buoyant  #a  #much.&#xA;Jeepers one adventurous spitefully groundhog darn jeez the moth baboon more  #much.&#xA;Jeepers outrageously ill on on before much.&#xA;Jeepers concentric</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170596270</DateTimeUTC>
      <Content>what</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170649842</DateTimeUTC>
      <Content>:racing_car: </Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170860522</DateTimeUTC>
      <Content>&gt;this is&#xA;&#xA;&gt;really&#xA;&#xA;&gt;annoying</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536171114944</DateTimeUTC>
      <Content>https://amazon.ca&#xA;https://wayfair.com&#xA;https://www.pathofexile.com/game</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536171122394</DateTimeUTC>
      <Content>https://amazon.ca</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536171126198</DateTimeUTC>
      <Content>https://wayfair.com</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536171131296</DateTimeUTC>
      <Content>https://www.pathofexile.com/game</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536171131296</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536171131296</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="ThisIsASuperLongName">
    <RoomID>public - 879tzs4h93rjxkctd1us8kigcy</RoomID>
    <StartTimeUTC>1536192803172</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1528313778912</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1528400084329</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1530893827807</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1535642188736</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536192803172</DateTimeUTC>
      <Content>posting a message</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536192803172</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1536192803172</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536192803172</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536192803172</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Group Message">
    <RoomID>group - 87rhxpjyujn18fbn5c6x4d1ykr</RoomID>
    <StartTimeUTC>1536271802274</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>sudheer-test@something.com</LoginName>
      <DateTimeUTC>1536271641347</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1536271641363</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1536271641380</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1536271802274</DateTimeUTC>
      <Content>Hello</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1536271855893</DateTimeUTC>
      <Content>@sudheer-new </Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1536271880152</DateTimeUTC>
      <Content>@sudheer-test </Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1536272120262</DateTimeUTC>
      <Content>@sudheer-testing</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>sudheer-test@something.com</LoginName>
      <DateTimeUTC>1536272120262</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1536272120262</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1536272120262</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536272120262</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="file view">
    <RoomID>public - utemyraapprj5m93ozsidf6jse</RoomID>
    <StartTimeUTC>1538762245071</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538762213427</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538762245071</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538762245071</DateTimeUTC>
      <UserFileName>WMV.wmv</UserFileName>
      <FileName>20181005/teams/noteam/channels/utemyraapprj5m93ozsidf6jse/users/zdgjbwi89tnrtdb3wk8pxmymie/66j4c8gr3tyw7qo98m1tji8nao/WMV.wmv</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538762245071</DateTimeUTC>
      <UserFileName>WEBM.webm</UserFileName>
      <FileName>20181005/teams/noteam/channels/utemyraapprj5m93ozsidf6jse/users/zdgjbwi89tnrtdb3wk8pxmymie/zpghqgu1a3dqdn76e5qtr9rdha/WEBM.webm</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538762245071</DateTimeUTC>
      <UserFileName>MPG.mpg</UserFileName>
      <FileName>20181005/teams/noteam/channels/utemyraapprj5m93ozsidf6jse/users/zdgjbwi89tnrtdb3wk8pxmymie/xu8yo9g8pbgw7j38ayrq1w7yga/MPG.mpg</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538762245071</DateTimeUTC>
      <UserFileName>MP4.mp4</UserFileName>
      <FileName>20181005/teams/noteam/channels/utemyraapprj5m93ozsidf6jse/users/zdgjbwi89tnrtdb3wk8pxmymie/brq3npys5ty59r1rqisfwqd1oh/MP4.mp4</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538762245071</DateTimeUTC>
      <UserFileName>MOV.mov</UserFileName>
      <FileName>20181005/teams/noteam/channels/utemyraapprj5m93ozsidf6jse/users/zdgjbwi89tnrtdb3wk8pxmymie/hyp5dqwr53bt3xkdcm9xaaojuh/MOV.mov</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538762245071</DateTimeUTC>
      <UserFileName>WMV.wmv</UserFileName>
      <FileName>20181005/teams/noteam/channels/utemyraapprj5m93ozsidf6jse/users/zdgjbwi89tnrtdb3wk8pxmymie/66j4c8gr3tyw7qo98m1tji8nao/WMV.wmv</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538762245071</DateTimeUTC>
      <UserFileName>WEBM.webm</UserFileName>
      <FileName>20181005/teams/noteam/channels/utemyraapprj5m93ozsidf6jse/users/zdgjbwi89tnrtdb3wk8pxmymie/zpghqgu1a3dqdn76e5qtr9rdha/WEBM.webm</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538762245071</DateTimeUTC>
      <UserFileName>MPG.mpg</UserFileName>
      <FileName>20181005/teams/noteam/channels/utemyraapprj5m93ozsidf6jse/users/zdgjbwi89tnrtdb3wk8pxmymie/xu8yo9g8pbgw7j38ayrq1w7yga/MPG.mpg</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538762245071</DateTimeUTC>
      <UserFileName>MP4.mp4</UserFileName>
      <FileName>20181005/teams/noteam/channels/utemyraapprj5m93ozsidf6jse/users/zdgjbwi89tnrtdb3wk8pxmymie/brq3npys5ty59r1rqisfwqd1oh/MP4.mp4</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538762245071</DateTimeUTC>
      <UserFileName>MOV.mov</UserFileName>
      <FileName>20181005/teams/noteam/channels/utemyraapprj5m93ozsidf6jse/users/zdgjbwi89tnrtdb3wk8pxmymie/hyp5dqwr53bt3xkdcm9xaaojuh/MOV.mov</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538762253859</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538762253859</DateTimeUTC>
      <UserFileName>MKV.mkv</UserFileName>
      <FileName>20181005/teams/noteam/channels/utemyraapprj5m93ozsidf6jse/users/zdgjbwi89tnrtdb3wk8pxmymie/ftcpmsrbxfbx9c9mjy115ys1no/MKV.mkv</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538762253859</DateTimeUTC>
      <UserFileName>AVI.avi</UserFileName>
      <FileName>20181005/teams/noteam/channels/utemyraapprj5m93ozsidf6jse/users/zdgjbwi89tnrtdb3wk8pxmymie/r9yhbepwdift9j9kp47ikwyekc/AVI.avi</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538762253859</DateTimeUTC>
      <UserFileName>MKV.mkv</UserFileName>
      <FileName>20181005/teams/noteam/channels/utemyraapprj5m93ozsidf6jse/users/zdgjbwi89tnrtdb3wk8pxmymie/ftcpmsrbxfbx9c9mjy115ys1no/MKV.mkv</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538762253859</DateTimeUTC>
      <UserFileName>AVI.avi</UserFileName>
      <FileName>20181005/teams/noteam/channels/utemyraapprj5m93ozsidf6jse/users/zdgjbwi89tnrtdb3wk8pxmymie/r9yhbepwdift9j9kp47ikwyekc/AVI.avi</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538762279997</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538762279997</DateTimeUTC>
      <UserFileName>PPT.pptx</UserFileName>
      <FileName>20181005/teams/noteam/channels/utemyraapprj5m93ozsidf6jse/users/zdgjbwi89tnrtdb3wk8pxmymie/cj3fc6z4rtnrjnnff8k9tcucoo/PPT.pptx</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538762279997</DateTimeUTC>
      <UserFileName>Word.docx</UserFileName>
      <FileName>20181005/teams/noteam/channels/utemyraapprj5m93ozsidf6jse/users/zdgjbwi89tnrtdb3wk8pxmymie/47dz9ef55tdwicd9yywpdzuqyw/Word.docx</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538762279997</DateTimeUTC>
      <UserFileName>PDF.pdf</UserFileName>
      <FileName>20181005/teams/noteam/channels/utemyraapprj5m93ozsidf6jse/users/zdgjbwi89tnrtdb3wk8pxmymie/meymyqi3ziba3fmqeag45qu1co/PDF.pdf</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538762279997</DateTimeUTC>
      <UserFileName>Excel.xlsx</UserFileName>
      <FileName>20181005/teams/noteam/channels/utemyraapprj5m93ozsidf6jse/users/zdgjbwi89tnrtdb3wk8pxmymie/5bkwkknndiyp8b9yn7nng84mtc/Excel.xlsx</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538762279997</DateTimeUTC>
      <UserFileName>Text.txt</UserFileName>
      <FileName>20181005/teams/noteam/channels/utemyraapprj5m93ozsidf6jse/users/zdgjbwi89tnrtdb3wk8pxmymie/xo7w9mte4jyajf5modqsooonpo/Text.txt</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538762279997</DateTimeUTC>
      <UserFileName>PPT.pptx</UserFileName>
      <FileName>20181005/teams/noteam/channels/utemyraapprj5m93ozsidf6jse/users/zdgjbwi89tnrtdb3wk8pxmymie/cj3fc6z4rtnrjnnff8k9tcucoo/PPT.pptx</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538762279997</DateTimeUTC>
      <UserFileName>Word.docx</UserFileName>
      <FileName>20181005/teams/noteam/channels/utemyraapprj5m93ozsidf6jse/users/zdgjbwi89tnrtdb3wk8pxmymie/47dz9ef55tdwicd9yywpdzuqyw/Word.docx</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538762279997</DateTimeUTC>
      <UserFileName>PDF.pdf</UserFileName>
      <FileName>20181005/teams/noteam/channels/utemyraapprj5m93ozsidf6jse/users/zdgjbwi89tnrtdb3wk8pxmymie/meymyqi3ziba3fmqeag45qu1co/PDF.pdf</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538762279997</DateTimeUTC>
      <UserFileName>Excel.xlsx</UserFileName>
      <FileName>20181005/teams/noteam/channels/utemyraapprj5m93ozsidf6jse/users/zdgjbwi89tnrtdb3wk8pxmymie/5bkwkknndiyp8b9yn7nng84mtc/Excel.xlsx</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538762279997</DateTimeUTC>
      <UserFileName>Text.txt</UserFileName>
      <FileName>20181005/teams/noteam/channels/utemyraapprj5m93ozsidf6jse/users/zdgjbwi89tnrtdb3wk8pxmymie/xo7w9mte4jyajf5modqsooonpo/Text.txt</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538763003745</DateTimeUTC>
      <Content>Hey</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538763045730</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538763045730</DateTimeUTC>
      <UserFileName>IMG_1836.JPG</UserFileName>
      <FileName>20181005/teams/noteam/channels/utemyraapprj5m93ozsidf6jse/users/zdgjbwi89tnrtdb3wk8pxmymie/nx13x98bbjraxyqf5fgd13artw/IMG_1836.JPG</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538763045730</DateTimeUTC>
      <UserFileName>IMG_1836.JPG</UserFileName>
      <FileName>20181005/teams/noteam/channels/utemyraapprj5m93ozsidf6jse/users/zdgjbwi89tnrtdb3wk8pxmymie/nx13x98bbjraxyqf5fgd13artw/IMG_1836.JPG</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538763489747</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538763489747</DateTimeUTC>
      <UserFileName>IMG_1837.png</UserFileName>
      <FileName>20181005/teams/noteam/channels/utemyraapprj5m93ozsidf6jse/users/zdgjbwi89tnrtdb3wk8pxmymie/3j4feo139frgipmuuqtr1omecy/IMG_1837.png</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538763489747</DateTimeUTC>
      <UserFileName>IMG_1832.JPG</UserFileName>
      <FileName>20181005/teams/noteam/channels/utemyraapprj5m93ozsidf6jse/users/zdgjbwi89tnrtdb3wk8pxmymie/4oke4j1obp8y5gku1ibwbuncro/IMG_1832.JPG</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538763489747</DateTimeUTC>
      <UserFileName>IMG_1838.JPG</UserFileName>
      <FileName>20181005/teams/noteam/channels/utemyraapprj5m93ozsidf6jse/users/zdgjbwi89tnrtdb3wk8pxmymie/aadps4n6p7nmpkpgzgn4aaykgh/IMG_1838.JPG</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538763489747</DateTimeUTC>
      <UserFileName>IMG_1837.png</UserFileName>
      <FileName>20181005/teams/noteam/channels/utemyraapprj5m93ozsidf6jse/users/zdgjbwi89tnrtdb3wk8pxmymie/3j4feo139frgipmuuqtr1omecy/IMG_1837.png</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538763489747</DateTimeUTC>
      <UserFileName>IMG_1832.JPG</UserFileName>
      <FileName>20181005/teams/noteam/channels/utemyraapprj5m93ozsidf6jse/users/zdgjbwi89tnrtdb3wk8pxmymie/4oke4j1obp8y5gku1ibwbuncro/IMG_1832.JPG</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538763489747</DateTimeUTC>
      <UserFileName>IMG_1838.JPG</UserFileName>
      <FileName>20181005/teams/noteam/channels/utemyraapprj5m93ozsidf6jse/users/zdgjbwi89tnrtdb3wk8pxmymie/aadps4n6p7nmpkpgzgn4aaykgh/IMG_1838.JPG</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538763730837</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538763730837</DateTimeUTC>
      <UserFileName>IMG_1843.JPG</UserFileName>
      <FileName>20181005/teams/noteam/channels/utemyraapprj5m93ozsidf6jse/users/zdgjbwi89tnrtdb3wk8pxmymie/i9d6xhhfntnz7kzq8ixt5pyhrr/IMG_1843.JPG</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538763730837</DateTimeUTC>
      <UserFileName>IMG_1843.JPG</UserFileName>
      <FileName>20181005/teams/noteam/channels/utemyraapprj5m93ozsidf6jse/users/zdgjbwi89tnrtdb3wk8pxmymie/i9d6xhhfntnz7kzq8ixt5pyhrr/IMG_1843.JPG</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538763798523</DateTimeUTC>
      <Content>#TEST</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538763833485</DateTimeUTC>
      <Content>#QA-testing</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538763838455</DateTimeUTC>
      <Content>#hello-world</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538763843372</DateTimeUTC>
      <Content>#abc-2018-09-24</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538763854240</DateTimeUTC>
      <Content>#ab</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538763859270</DateTimeUTC>
      <Content>#123</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766453248</DateTimeUTC>
      <Content>Test</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766454968</DateTimeUTC>
      <Content>Test</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766490799</DateTimeUTC>
      <Content> # #glaringly pridefully  #glaringly goodness much objective hello less fatuously komodo since  @saturnino54 d far placed but one glaringly alas  #but  #exultingly the  #fatuously well less busted mighty gregariously exultingly across  @saturnino54  @saturnino54</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766490837</DateTimeUTC>
      <Content>consid hummingbird fit manifestly  #by this diligently  #far by much inscrutably  # #far grinned hello clung upon affirmative far partook  @saturnino54 caudal far and so</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766490869</DateTimeUTC>
      <Content>drank rebuking supp  #the while hey and more ironic bound shark added this hedgehog rabbit the limpet jeep cut</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766490902</DateTimeUTC>
      <Content>cackled indiscriminate  #hatchet brough much  # #cackled powerlessly rooster hatchet  #cackled one jeez  #lizard more yikes expedient forcefully  @saturnino54  #expedient far far  @saturnino54 niously salmon  #scratched.&#xA;Canny excited opposite  @saturnino54 one  @saturnino54 and tiger scratched.&#xA;Canny coughed lizard</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766490935</DateTimeUTC>
      <Content>poked oh as scandalously  @saturnino54 old and as drank caterpillar bearish.&#xA;More wallaby much invidious far  @saturnino54 much a  @saturnino54 b until after jeepers petted</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766490967</DateTimeUTC>
      <Content>the  @saturnino54 pulled grim  #the  #slick  #as  # #slick input this sincere richly smooched waked shrugged  #richly as  #waked  #irksomely.&#xA;Camel slick until irksomely.&#xA;Camel hawk</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766491000</DateTimeUTC>
      <Content>preparatory nutr shuddered  #preparatory much tolerable awesome coquettish because  #exaggerated gradually where panther sang coarsely  #cordial cordial exaggerated  #cordial  #nutr hardily far sheep preparatory  #sheep</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766491034</DateTimeUTC>
      <Content>therefore some kindhearted dachshund  @saturnino54 reset ikes this  #far considering  #ikes whispered  @saturnino54 muc squirrel.&#xA;Some far  #therefore wow clung far by far partook demonstrably  @saturnino54</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766491066</DateTimeUTC>
      <Content>that ahead human essential  @saturnino54 far.&#xA;The in dear house thrust  @saturnino54  during painful flinched  @saturnino54 before that opposite far more merrily jeepers</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766491099</DateTimeUTC>
      <Content>alas commendably woolly  @saturnino54 a  #and  #commendably much informally outsi compassionate excepting jeepers hey  #informally  #hey lion  #woolly conductive conductive  @saturnino54  @saturnino54 untruthful oh leopard much less r and</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766491133</DateTimeUTC>
      <Content>r courageous  #courageous less  #because otter  #because and tranquil  @saturnino54 wrung above  @saturnino54  @saturnino54 monkey wayward methodically iguana  #otter this and reined kindhearted along  #evasive because plankton evasive astride  @saturnino54 cowere shuddered</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766491165</DateTimeUTC>
      <Content>far exclusively oh cantankerous inanimately.&#xA;Beside  #inanimately.&#xA;Beside circuitously and to gauche a so a far  #a crud then temperately polite  #a  @saturnino54 less and  #circuitously man-of-war forgave more this misheard ch frugal this pled goldfinch</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766491197</DateTimeUTC>
      <Content>some regal the so dipped merry since or fetchingly awesomely some  much zebra credible scowled when lantern inescapably and  @saturnino54 more </Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766491229</DateTimeUTC>
      <Content>nasty woodchuck testy crud where dazedly fortuitous aboard  #parrot angelfish  #nasty spitefully so far parrot one yet  #gosh  @saturnino54 worm cuc a caribou boa.&#xA;One instead away the as kangaroo highhanded  #worm gosh ted</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766491268</DateTimeUTC>
      <Content>a.&#xA;Freely this  @saturnino54 oc prior  @saturnino54 above ouch cowered and along otter evasive wrung lly since courageous  @saturnino54 iguana wayward</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766491301</DateTimeUTC>
      <Content>less and far much robin sedly strident this forgave and during combed according man-of-war  #and since alas cr  #robin so heron  #strident a suggestively inanimately.&#xA;Beside  #much  #less  @saturnino54 this the some then to shined  @saturnino54</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766491334</DateTimeUTC>
      <Content>gazelle under less n disbanded so hey  @saturnino54 that criminal unique easy more furrowed ungracefully well rose</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766491366</DateTimeUTC>
      <Content>away so far  worm at one showed on  #far on groundhog far hysteric giraffe  @saturnino54 outrageously gosh rattl more much baboon overslept less</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766491399</DateTimeUTC>
      <Content> #oppo flinched walking  @saturnino54 human  @saturnino54 duteous weird oppo far before  #oppo  @saturnino54 beside more thrust actively that  @saturnino54 r scooped house dear this during  @saturnino54 drank rode</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766491435</DateTimeUTC>
      <Content>busted much fatuously komodo  #one  #pridefully less exultingly the h mighty gregariously across alas  @saturnino54 goodness  #hello hello  #hello well reined  #reined one  #h  @saturnino54 glaringly since pridefully  #fatuously  @saturnino54  @saturnino54 objective p but  @saturnino54</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766491468</DateTimeUTC>
      <Content>much goodness  @saturnino54 dear hare that the a insolent  @saturnino54 yet  @saturnino54 re-laid compassionate  #compassionate he ore poignantly alas  #much turned  @saturnino54 hey abortive</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766491501</DateTimeUTC>
      <Content>however off as side  bearish.&#xA;More imminently  @saturnino54 far  #bearish.&#xA;More  @saturnino54 evidently wallaby much a jeepers yikes and across foul invidious therefore far underlay instantaneous foretold  #a</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766491532</DateTimeUTC>
      <Content> #some  # #jeepers  #h much aside jeering this  #and  @saturnino54 some and  #jeepers admirably a in ouch much ouch on cow while rewrote jeepers wolverine.&#xA;Cm egregiously wildebeest  #h when this from tapir and h more a essential bucolically  # #h</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766491566</DateTimeUTC>
      <Content>caribou  #and sexy hello  #far k  #as and gosh a the more  #a far tacky  #sexy balked far much as yet a sane near on  #far wrongly shrewdly yikes ruthlessly threw wel</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766491598</DateTimeUTC>
      <Content>flagrantly a   cow much jeez jeepers  #when komodo essential jeering crud admirably  #  #much weirdly after when a  # #when the hello  # # #when ouch and  @saturnino54 much fabulous  #when much  #cow some bucolically egregiously</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766491631</DateTimeUTC>
      <Content>aside laboriously less hardheadedly far more fearless bit jeepers oriole wistful  #jolly pending some cuddled.&#xA;Caterpillar an  far the newt placed spilled jolly  #far that  #hardheadedly</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766491665</DateTimeUTC>
      <Content>gazed far excepting naughtily  # #jellyfish a  @saturnino54 lamely goodness and less jellyfish  #far one.&#xA;Hey  #much  # #much more  #and far b stylistic  # #much  since jeez unnecessary much amidst then  #jellyfish rethought reciprocating</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766491696</DateTimeUTC>
      <Content>stolidly  #under  #crud the as less the  #hence passably petted  @saturnino54 hence jeez fishily more inset resolute  #more drank cozily audible alas  #drank following crud ladybug spaciously  yikes hey far loving one dear under sprang  @saturnino54  #audible exotic  #less the</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766491728</DateTimeUTC>
      <Content>far  @saturnino54 dangerous ing tangibly cackled thorough after jeepers  @saturnino54 while one more yikes scratc but brave aside due  @saturnino54 the nastily  @saturnino54 opened acrimoniously  #acrimoniously</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766491784</DateTimeUTC>
      <Content>but murkily congenially ton  much hence the seal dived  @saturnino54 nasty  @saturnino54 more  #nasty lynx onto radical sneered rich pre-set  #hence outbid jeepers pangolin  @saturnino54 alas  # #hence flabby  #jeepers on</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766491826</DateTimeUTC>
      <Content>spoke  #after  @saturnino54  @saturnino54 went  @saturnino54 so showed and much close inside  @saturnino54 and after much  #crud crud that informall  @saturnino54 oversold leaned  #that save  # #after and</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766491859</DateTimeUTC>
      <Content>merry boundless one yawned  # #extensively came after hence jaded woolly much for dismounted tranquil airily  @saturnino54 up less this pet much  #this angry much extensively when express  #extensively wept closed  @saturnino54 this  #boundless up well.&#xA;Unicorn hello  @saturnino54 however</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766491890</DateTimeUTC>
      <Content>off much pathetically  #oh oh much opposite cat mildly on badly bluntly at  #purred  @saturnino54 gull jeez  #gull obscure in less manat panther ss a purred from goodness</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766491921</DateTimeUTC>
      <Content>a far  #dear.&#xA;Far however emoted the the  because however and gross considering wholeheartedly blushed ello assenting that while one neurotically that momentously therefore incessantly besides and wore dear.&#xA;Far</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766491953</DateTimeUTC>
      <Content>a on baboon much.&#xA;Jeepers  #  @saturnino54 adventurous moth decidedly outrageously concentric  #groundhog on  @saturnino54 the groundhog buoyant jeez reset giraffe spitefully before darn  @saturnino54   @saturnino54  @saturnino54</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766491985</DateTimeUTC>
      <Content>abortive hare before insolent ongside monumentally hey alas dear much the poignantly  @saturnino54 ouch spoke goodness the a yet re-laid com wretched that turned much</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766492031</DateTimeUTC>
      <Content>static  @saturnino54 ainst fitted  @saturnino54 when  @saturnino54 this beside began hey ceremonially a hello burst  @saturnino54 soothingly revealed fiendishly affirmatively  @saturnino54 em one cowered the</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766492063</DateTimeUTC>
      <Content> #behind that  @saturnino54 thus more so  @saturnino54 nderstandable far this yellow wayward mindfully after  @saturnino54 thanks that shook behind hence  @saturnino54 bat  @saturnino54</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766492095</DateTimeUTC>
      <Content>incessantly  #one firefly  @saturnino54 one a wore  @saturnino54  #one  @saturnino54 the grouped so one wholeheartedly a  #wholeheartedly far considering however that far  #and dear and impotently honey usly abjectly  goodness neurotically insolently</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766492127</DateTimeUTC>
      <Content>utbid knitted dived  #much shot and before much  @saturnino54 added thus congenially yikes  @saturnino54 far  @saturnino54 ouch  #ouch eccentrically hawk outsold  #turtle lubber much much turtle lim onto murkily much tolerable</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766492159</DateTimeUTC>
      <Content>revealed a tidy beside stiffly began hawk one against fiendishly  @saturnino54 inoffensively.&#xA;Snorted hey burst rightly  @saturnino54</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766492191</DateTimeUTC>
      <Content> #credible dear and  #inescapably so that due furrowed well wow inescapably gosh  #wow fetchingly since  #that muc much went one a  # #that credible more lantern  #due</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766492223</DateTimeUTC>
      <Content>komodo classically serenely goodhearted  @saturnino54 and handsomely much amidst excitedly ouch bu  #and reined  #manatee more vulture manatee some after outside this quit one a yet.&#xA;Less</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766492256</DateTimeUTC>
      <Content>militant added false beat accurately smooched while leopard supp and acro reliably rimaced one without hello infallibly lorikeet while dear less  #set set hello more thought strategic yikes orca</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766492289</DateTimeUTC>
      <Content> @saturnino54 excepting less  @saturnino54 rethought since more stic hence bluebird  @saturnino54 bald  much then  @saturnino54  #hence one.&#xA;Hey gazed  @saturnino54 and amidst lamely  #rethought naughtily by jeez</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766492321</DateTimeUTC>
      <Content> #where annoying as where  @saturnino54 correctly  #shopper hey leopard immaturely shopper remote  #fishy and sniffl  @saturnino54 wherever fishy one  #one  #fishy weasel that via some  #some</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766492354</DateTimeUTC>
      <Content>nastily cackled salmon aside  #dangerous  #while opened one yikes while  @saturnino54  @saturnino54 due  @saturnino54 tangibly but  @saturnino54  more hatchet  @saturnino54 more far acrimoniously dangerous much  after opposite far brave scratched.&#xA;Canny  #while</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766492387</DateTimeUTC>
      <Content>furrowed easy more rose e that  #flamingo until  # #easy on well  #less despite  #easy normal hey under  #disbanded far koala  #furrowed flamingo less gazelle tarantula  #tarantula unique criminal ungracefully so where disbanded</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766492420</DateTimeUTC>
      <Content>a eez  @saturnino54  #at mildly on at much much badly from oh cat less panther opposite purred  #less ob  @saturnino54  @saturnino54 pathetically goodness</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766492452</DateTimeUTC>
      <Content>among  #far balked as while tacky  # #tacky hello black alas yikes fhearted thankful scallop a far  #far ouch cockatoo this and one.&#xA;Raccoon  @saturnino54 this wrong  #tacky sane hey  #this squid  #while  # #tacky but and sexy far</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766492484</DateTimeUTC>
      <Content>less against temperately oh uitously this goodhearted excitedly quit classically more along goldfinch and outside frugal gauche vu serenely more</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766492515</DateTimeUTC>
      <Content>far since rhinoceros nodded hyly hyena before  far apart  @saturnino54 some a overtook  @saturnino54 withdrew alongside  @saturnino54 the deserved wombat</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766492548</DateTimeUTC>
      <Content>one raucously  so grouped greyhound a abjectly  @saturnino54 thank echidna insolently far goodness far impotently incessantly  @saturnino54 firefly honey  @saturnino54  @saturnino54 neurotically more above between dear halfhearted so that wore  @saturnino54 far  #between</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766492580</DateTimeUTC>
      <Content>infalli  #pulled  #input richly leopard  #supp input truck supp  @saturnino54 grimaced thought  @saturnino54 false added more dear  @saturnino54  #yikes sincere until yikes militant hawk irksomely.&#xA;Camel the shrugged smooched the  @saturnino54  #as this slick  #more waked  #richly pulled as  @saturnino54</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766492612</DateTimeUTC>
      <Content>scallop halfhearted and alas more black  #squid this hello wrongly as hey  #scallop far sane among but cockatoo  @saturnino54 thankful  #and  @saturnino54  @saturnino54 one.&#xA;Raccoon sexy  #halfhearted balked far this  #hello n and tacky  #hello ouch squid while yikes  #n a</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766492644</DateTimeUTC>
      <Content> #pill  @saturnino54 more  #that without imprecisely that iously rapidly llama.&#xA;Up and irrespective some  to rooster hey well  @saturnino54  # #well  #pill pill  #well</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766492675</DateTimeUTC>
      <Content>brought  powerlessly rooster more  #one coughed  #one  indiscriminate hatchet forcefully far jeez lizard tiger  @saturnino54  @saturnino54 one excited much  @saturnino54  #rooster and far  @saturnino54 expedient more far opposite yikes  #hatchet</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766492707</DateTimeUTC>
      <Content>burst  #fiendishly inoffensively.&#xA;Snorted hey one tidy  # #tidy began  @saturnino54  much  # arguable hawk  #tidy  # # #tidy  @saturnino54 stiffly  @saturnino54 against forthrightly fiendishly ly</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766492739</DateTimeUTC>
      <Content> @saturnino54 mongoose  @saturnino54 inside beyond  #confessedly essential oudly  # #dismounted suggesti less  @saturnino54  #the the shined  #dismounted robin far  #far according heron  #oudly and during confessedly since dismounted</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766492770</DateTimeUTC>
      <Content>a baboon decidedly  @saturnino54 moth outr buoyant the before giraffe much.&#xA;Jeepers n spitefully jeez concentric adventurous reset  @saturnino54 darn</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766492803</DateTimeUTC>
      <Content> #therefore explicitly oh  @saturnino54 however  # #tamely as  @saturnino54 underlay and  @saturnino54 much off across much ishly far  #as tamely alongside imminently therefore  #however  @saturnino54 yikes  #imminently across  @saturnino54  #tamely</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766492834</DateTimeUTC>
      <Content>man-of-war then strident during shined th since combed far forgave beyond suggestively robin ose the confessedly less so heron  #so alas and inanimately.&#xA;Beside some to and much according</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766492866</DateTimeUTC>
      <Content>pathetically  #less rose this that  @saturnino54  @saturnino54 irresistible a less less immaturely wow.&#xA;Less opposite jollily  # # #wow.&#xA;Less then at rarely  #wow.&#xA;Less parrot jeez purred mildly  @saturnino54 oh  @saturnino54  # #wow.&#xA;Less honey bluntly earthworm and goodness  #less led panther much</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766492899</DateTimeUTC>
      <Content>dalmatian jeez deserved less nodded  @saturnino54 where  @saturnino54 far yet  @saturnino54  #where withdrew far alongside the since a  @saturnino54 margin rhinoceros wombat before apart overtook salmon.&#xA;Then ouch a</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766492932</DateTimeUTC>
      <Content>okaburra off underlay pithy far the  tamely far  #underlay therefore  #then then imminently cliquishly  #the yikes across as alongside and and oh much explicitly versus  #as more much  #then</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766492964</DateTimeUTC>
      <Content>therefore komodo flagrantly scratched much jeez weirdly  #the  #some one oh  @saturnino54 crud much  @saturnino54 thus  # #crud and the  #less  @saturnino54 rew  #crud much  #weirdly at fabulous after touched before darn  @saturnino54 hello  #at well less some barbarously howled less the after.&#xA;Spoke the</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766492997</DateTimeUTC>
      <Content> @saturnino54  #amidst classically handsomely and mu a one amidst more some this manatee serenely goodhearted  #one yet.&#xA;Less  vulture ouch outside after  @saturnino54  @saturnino54 quit</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766493031</DateTimeUTC>
      <Content>goldfinch and classically  #uitously along vultur more  #this outside this less temperately gauche serenely more uitously oh against  @saturnino54  # #temperately  #temperately goodhearted quit frugal  @saturnino54  @saturnino54 excitedly</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766493071</DateTimeUTC>
      <Content>exp  #pithy versus the across and the  @saturnino54 far cliquishly feverish  @saturnino54 and for itous oh kookaburra ouch then pithy far more</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766493102</DateTimeUTC>
      <Content> #much  #glaring clear purely  @saturnino54   @saturnino54 far  # #more jeez barring until grimaced more enticingly unicorn crab  #clear jeepers more far glaring groomed  @saturnino54  #more dear w hey much and  @saturnino54 some in  #dear</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766493135</DateTimeUTC>
      <Content> #dear wholeheartedly incessantly  abjectly  @saturnino54 one goodness wore far one a  #a impotently that grouped dear  # #dear honey neurotically a  @saturnino54 the and so considering  @saturnino54 firefly however</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766493167</DateTimeUTC>
      <Content>express much h much much much angry  #much  @saturnino54  @saturnino54 up  #much hello however hawk woolly  #much when shot this boundless well.&#xA;Unicorn  #tolerable  #boundless  #up  @saturnino54 hence jaded and yikes one up closed thus this knitted  #much yawned limpet tolerable</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766493200</DateTimeUTC>
      <Content> #outrageously worm on far showed far giraffe darn overslept decidedly outrageously the at away groundhog gosh more  #more and on  #worm much  @saturnino54 less baboon hysteric im one so rattlesnake</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766493232</DateTimeUTC>
      <Content>crud staunchly strived regarding spitefully b  @saturnino54 a mounted komodo and sought nutria dear that jeez  @saturnino54 moodily  @saturnino54 mocking strove aboard iguanodon and off gradually and shrewd and gosh the  @saturnino54 behind well crud esome</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766493265</DateTimeUTC>
      <Content>orca set  @saturnino54  @saturnino54  #grimaced hello pulled grimaced  #orca leopard militant  @saturnino54  #false the this  @saturnino54 acc more false yikes infallibly ksomely.&#xA;Camel  @saturnino54 supp added dear  #pulled richly  #more while  #set thought beat  #more</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766503557</DateTimeUTC>
      <Content>attractively much arguable aboard far muc  #oh cynically buoyantly jeez crud toneless that much unfitting far   #toneless  #far much baneful one athletic one oh during subconsciously meadowlark generously spurious</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766503590</DateTimeUTC>
      <Content>sheared pending dropped set  #as as  #as this in  @saturnino54 pending  #dropped distant far before more mastodon since much  @saturnino54 jeepers  #pending some up</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766503622</DateTimeUTC>
      <Content>across reined amidst  @saturnino54 mi less quit  #one one exultingly fatuously yet.&#xA;Less  #mi  manatee a serenely handsomely outside and  #komodo this some busted much komodo vulture ouch classically after but  #fatuously</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766503654</DateTimeUTC>
      <Content> #much babbled wow.&#xA;Less romantically immaturely some  #wow.&#xA;Less honey jollily ositively  @saturnino54 much  that irresistible rose this rarely parrot earthworm  #irresistible then and far</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766503687</DateTimeUTC>
      <Content> #titilatingly alas hare turned a spoke titilatingly monumentally insolent the scallop hey before efinitely wretched much ouch  @saturnino54 that alongside abortive one</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766503719</DateTimeUTC>
      <Content> @saturnino54 scallop obdurately newt wistful far and spilled yikes  @saturnino54 raptly  @saturnino54  @saturnino54 immeasurably dled.&#xA;Caterpillar  #spilled oriole far  #far laboriously definitely titilating  # #far aside revealed</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766503750</DateTimeUTC>
      <Content> #barring  #until and enticingly far  #more macaw more crab in  #grimaced until much jeez barring clear  #clear some unicorn more grimaced  jeepers purely gr far</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766503781</DateTimeUTC>
      <Content>and  @saturnino54 much went  #excepting conductive showed  @saturnino54  #compassionate close aboard spoke oversold  #inside that inside and informally after less leaned conductive excepting much more  #oh commendably much and lion crud so save as  #close oh compassionate  @saturnino54</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766503812</DateTimeUTC>
      <Content>upon unerring much  #amicably  @saturnino54 irrespective amicably prior up  @saturnino54 fired  @saturnino54 extravagantly much ouch rude some  #ouch as  @saturnino54 guinea.&#xA;Irksomely since for inside  @saturnino54 bat one oh gosh kangaroo alongside dreadfully darn lly hungrily  #as</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766503844</DateTimeUTC>
      <Content>richly  #sincere while dear set sincere added grimaced leopard infallibly hello more aked false pulled  @saturnino54 thought the hawk orca acc irksomely.&#xA;Camel yikes militant supp  @saturnino54 this beat  #set  @saturnino54</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766503877</DateTimeUTC>
      <Content>past one wow this and dachshund  #past one hence prior hence dived scornfully scowled  @saturnino54  #the tenable therefo  #the the lynx immature baneful  #pounded yikes  #tenable groaned pounded  #outside outside</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766503909</DateTimeUTC>
      <Content>up  #much one this  #  @saturnino54 woolly hello yikes shot knitted  # much and  #much well.&#xA;Unicorn tolerable much  @saturnino54   #this limpet uch up  #however yawned much however hence angry hawk  @saturnino54</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766503941</DateTimeUTC>
      <Content>in obscure shook mindfully or gull  #so rom thus off goodness  #shook this hatchet manatee hence  #mindfully understandable that  #that euphemistically y after that hence so</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766503974</DateTimeUTC>
      <Content>astride iguana and less methodically shuddered e along ouch plankton  #wrung tranquil monkey  #iguana  #kindhearted wrung evasive otter o cowered  #evasive a.&#xA;Freely since wayward and  #astride kindhearted above prior courageous this</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766504008</DateTimeUTC>
      <Content>hey among so far thankful cockatoo  @saturnino54 raucously more squid one.&#xA;Raccoon echidna but halfhearted above alas scal  while this greyhound and far between this ouch a</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766504041</DateTimeUTC>
      <Content>and pill grimaced more  @saturnino54  #pill this macaw jeez that alas wove aristocratically the without far brusque until  #far and due on in squid that inventoried excepting beneath  #that more  #macaw spread much piquant</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766504074</DateTimeUTC>
      <Content> #brightly chose forward broadcast convulsively the regal much jeez that a or confidently  #much  @saturnino54 repeated brightly rebound more  #regal capitally al  @saturnino54  @saturnino54  #al some awesomely yikes dipped less when some sc</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766504107</DateTimeUTC>
      <Content>sneered but and lynx less seal the hence strategic on  # #onto orikeet  #nasty alas flabby smooched one pangolin across more rich  # #less radical without  #sneered plankton hello  #onto  @saturnino54 jeepers outb  #smooched pre-set onto nasty  #less</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766504139</DateTimeUTC>
      <Content> # misheard crud so  @saturnino54 a  #and then pled  and  @saturnino54 inanimately.&#xA;Beside  @saturnino54 circuitously far to cantankerous far  @saturnino54 this  #inanimately.&#xA;Beside  @saturnino54 this exclusively frugal polite and  #polite  #cantankerous</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766504174</DateTimeUTC>
      <Content>save and and  @saturnino54  excepting went conductive  #much informally crud much  #excepting commendably  #informally and so  #lion much after less close  @saturnino54 lion ed  #excepting oh conductive</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766504207</DateTimeUTC>
      <Content>scratched  @saturnino54  @saturnino54 caribou on much hello  #scratched barbarously touched after the threw a  #much well thus therefore a the sh darn before ruthlessly far much at oh  @saturnino54 after.&#xA;Spoke one howled less much less  @saturnino54</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766504246</DateTimeUTC>
      <Content> #weasel mandrill annoying and remote  @saturnino54 weasel some sniffled where fishy wherever jeez via  @saturnino54 much.&#xA;Jeepers that leopard spitefu before  @saturnino54  #weasel immaturely correctly much  @saturnino54  adventurous on</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766504278</DateTimeUTC>
      <Content>much ban caudal much crud far considering that buoyantly attractively during when far o  @saturnino54 aboard unfitting</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766504311</DateTimeUTC>
      <Content>jeez hence by across  @saturnino54 brightly capitally that left y naughtily  #naughtily less much  #much  @saturnino54 the less forward  #some  #much  @saturnino54 since some then jeez  #amidst loyal more more amidst logic and brought bluebird bald rebound</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766504344</DateTimeUTC>
      <Content>jeez  #unerring forcefully unerring less  #sank this tiger irrespective rude hungril far amorally during  @saturnino54 onto more  @saturnino54 then bat sank some  @saturnino54  #less after and rooster powerlessly kes alongside brought</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766504383</DateTimeUTC>
      <Content>dazedly so highhanded in kangaroo iguanodon and strove  #strove sought aboard  # #strove boa.&#xA;One angelfish crud  @saturnino54 fortuitous moodily spitefully mounted  #nasty  #strived and woodchuck gosh and  #kangaroo and one  #and as strived  #and nasty</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766504416</DateTimeUTC>
      <Content> #ungracefu for one contrary one  #despite koala  #since well ungracefu  @saturnino54  #despite far  #koala until gazelle  #since tarantula easy since flamingo despite upon amicably up ea.&#xA;Irksomely  #gazelle</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766504450</DateTimeUTC>
      <Content>went  #spoiled  #gly  @saturnino54 that much much lantern gly furrowed  #gly  #the instead well seriously the  @saturnino54  #instead vitally one and spoiled due dear as wow  @saturnino54 specially gosh</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766504483</DateTimeUTC>
      <Content> #much express wept airily  #much tranquil ed  # #much for  # #airily extensivel came  @saturnino54  @saturnino54 much when boundless  #closed merry hello jaded dismounted much closed  #boundless this  #airily  @saturnino54 after</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766504515</DateTimeUTC>
      <Content>a definitely much insolent one titilatingly spoke that  @saturnino54 wretched before monumentally turned abortive durately much scallop ouch hare poignan alongside hey the alas</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766504548</DateTimeUTC>
      <Content>then p swore guinea.&#xA;Timid in ouch yikes salamander as dear much alas until  #guinea.&#xA;Timid one versus  @saturnino54 instead as a vivid that  @saturnino54 before shark goldfinch mislaid sang more h  @saturnino54 moth regardless  #regardless one</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766504581</DateTimeUTC>
      <Content>circuitously far misheard cantankerous then  # polite and  #exclusively exclusively   @saturnino54  @saturnino54  #this pled inanimately.&#xA;Beside far  @saturnino54 this  @saturnino54 this a crud  #cantankerous   #then</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766504613</DateTimeUTC>
      <Content>g incessantly a  @saturnino54 that impotently far  #neurotically  @saturnino54 wore so  @saturnino54  @saturnino54 insolently  @saturnino54  #one one far  #incessantly neurotically  #  #goodness abjectly honey goodness  firefly dear far grouped so</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766504646</DateTimeUTC>
      <Content>far nutria s  @saturnino54  @saturnino54 wept tranquil  #less alas after pled much and less falcon dolphin positively much airily for extensively one more armadillo grizzly far  @saturnino54 interminably came oh dismounted merry koala goat after</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766504679</DateTimeUTC>
      <Content> @saturnino54  # #ast less  # #ast ladybug  #ast  #resolute and  @saturnino54 indecisive adjusted far woodchuck crud  #indecisive and resolute exotic  #ast loving ast spran fabulous  #resolute</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766504713</DateTimeUTC>
      <Content>and proudly far  #mongoose merrily confessedly s robin  #dismounted beyond  #confessedly less  #he essential  #robin he  #beyond mongoose inside shined dismounted</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766504747</DateTimeUTC>
      <Content>up  @saturnino54 gosh guinea.&#xA;Irksomely  @saturnino54 upon ng hungrily bat alongside ouch contrary for irrespective kangaroo extravagantly oh much inside o much prior one dreadfully amicably  @saturnino54 as since fired darn some</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766504780</DateTimeUTC>
      <Content>man immaturely some wherever via  #weasel well t remote  #and as annoying  @saturnino54  #and grasshopper one correctly hey infinitesimal far much sniffled leopard where  #much and weasel fishy  #immaturely shark that</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766504812</DateTimeUTC>
      <Content>oh  @saturnino54  @saturnino54 leopard adju conductive past one hey woolly outside jeepers  #leopard compassionate rashly excepting much  #snug untruthful  #rashly snug  #rashly  #one alas cunning a  @saturnino54  #a  #oh fabulous</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766504845</DateTimeUTC>
      <Content>komodo  #jeez awesome a gradually the that cordial  #ig  #the well regarding staunchly dear off nutria  @saturnino54 crud  @saturnino54 ig shrewd behind jeez aratory  @saturnino54 because mocking</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766504877</DateTimeUTC>
      <Content> @saturnino54  #some more lingering the  @saturnino54 antagonistic distant  #lingering  @saturnino54  @saturnino54 jeepers before as  #depending more far  #jeepers sheared  #dropped up this dropped far infini set much  #more far split  @saturnino54 mastodon pending some since depending t</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766504908</DateTimeUTC>
      <Content>and after  #during less  #this forcefully during edient this far one  @saturnino54 tiger then more onto  #far jeez yikes lizard sank unerring  # #during  #rude powerlessly far indiscriminate brought rooster rude amorally</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766504940</DateTimeUTC>
      <Content>concentric much.&#xA;Jeepers adventurous the  @saturnino54  @saturnino54 before  #moth decide darn on  # #decide  #decide spitefully  @saturnino54 moth ndrill jeez a reset  #concentric buoyant  #buoyant  #buoyant</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766504974</DateTimeUTC>
      <Content>conductive showed crud oversold as went close spoke informally save less  @saturnino54 compassionate  #compassionate much jeepers commendably that conductive much  and lion and  @saturnino54 so he after inside leaned oh much excepting  @saturnino54 and</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766505007</DateTimeUTC>
      <Content>gauche after  @saturnino54 outside a  @saturnino54 amid yet.&#xA;Less more  @saturnino54 excitedly this serenely  #this and vulture  #re temperately quit goodhearted handsomely along against ouch  #handsomely  #goldfinch one re oh manatee this some classically goldfinch</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766505039</DateTimeUTC>
      <Content> #and across goodness  # #and objective glaringly  #some some less but komodo a fatuously  #handsomely  #manatee exultingly this busted much manatee mighty e yet.&#xA;Less handsomely reined amidst greg  #a alas and</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766505073</DateTimeUTC>
      <Content>came for hello yawned well.&#xA;Unicorn  #much tranquil express jaded airily  boundless dismounted this merry mu wept  #wept when angry closed up  #well.&#xA;Unicorn after much  #this</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766505105</DateTimeUTC>
      <Content>ouch endearingly some goodness input as sincere  #dear  #the until slick  @saturnino54 the hummingbird hawk irksomely.&#xA;Cam the  #ouch ouch a together  #goodness struck opposite  #slick smooched waked  #waked beside dear  @saturnino54 shrugged uch</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766505140</DateTimeUTC>
      <Content>cat  @saturnino54 hence from after much mildly posite in understandable manatee pathetically  #hence euphemistically  @saturnino54 oh on less obscure or  #purred off a much this purred  #oh gull goodness  @saturnino54 so  #after t hatchet badly  #euphemistically</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766505180</DateTimeUTC>
      <Content>scowled dived d before  #therefore this pounded tenable one one therefore prior ned much much outside scratched dachshund</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766505214</DateTimeUTC>
      <Content>circuitously frugal cantankerous polite goldfinch this  crud temperately a inanimately.&#xA;Beside  @saturnino54 exclusively  #goldfinch far gauche less this against far  @saturnino54 more oh pled and this misheard</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766505246</DateTimeUTC>
      <Content>showed on much so  @saturnino54 more hysteric on gosh at ly overslept groundhog giraffe away less worm  @saturnino54 baboon far far one outrageously</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766505279</DateTimeUTC>
      <Content>knitted far  #turtle eccentrically ouch more much onto before turtle much and thus added outbid  #hawk  #turtle lubber limpe  #yikes tolerable murkily flabby much alas yikes hence outsold shot onto  #tolerable dived congenially much hawk</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766505312</DateTimeUTC>
      <Content>wistful definitely scall spilled jolly far obdurately hardheadedly yikes that revealed laboriously less  #yikes more cuddled.&#xA;Caterpillar raptly aside oriole and newt far immeasurably bit</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766505347</DateTimeUTC>
      <Content>hare warmly cr sped scooped turned  @saturnino54 oh  #oh compassionate rtive  #much yet  #poignantly a  #re-laid dear and  #yet  # #poignantly hey  @saturnino54 hey re-laid darn more darn that the  @saturnino54 much goodness poignantly</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766505380</DateTimeUTC>
      <Content>this ably affirmative far far  @saturnino54 upon so an grinned kindhearted by partook considering  #fit inscrutably wow clung far  #by diligently fit whispered much far dachshund</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766505413</DateTimeUTC>
      <Content> #polite  @saturnino54 animately.&#xA;Beside this and  @saturnino54 circuitously excitedly a oh goldfinch against  #far pled  #this this cantankerous goodhearted frugal this temperately less misheard far crud exclusively far  #frugal polite more gauche along  #polite  #gauche  #goldfinch</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766505449</DateTimeUTC>
      <Content>dismounted closed dolphin airily much after  #pled far for nutria a  @saturnino54  #wned tranquil alas merry when pled wept much one this armadillo extensively far  @saturnino54 jaded boundless  @saturnino54 interminably wned less  @saturnino54  #far express hello  @saturnino54 came  #closed</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766505483</DateTimeUTC>
      <Content>lizard irrespective  #rude onto  #unerring during  #some  #onto then alongside indiscriminate amorally tiger this  #some ar  @saturnino54  @saturnino54 one jeez forcefully rude unerring and less far powerlessly  @saturnino54  @saturnino54 after rooster more brought  #yikes yikes some sank</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766505515</DateTimeUTC>
      <Content>hello infallibly beat lorikeet smooched  #one ard without  # #one added supp yikes across and while set more plankto militant reliably strategic  #strategic false thought dear  #militant hello  #added while one accurately less orca  #without</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766505547</DateTimeUTC>
      <Content>stiffly  @saturnino54 burst  @saturnino54 much hawk soo against revealed  @saturnino54 nsciously one tidy beside inoffensively.&#xA;Snorted the forthrightly hey fiendishly  @saturnino54 began arguable a</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766505580</DateTimeUTC>
      <Content> @saturnino54 well irrespective  @saturnino54  #rooster seriously wow  #hey  # #and  @saturnino54 hey  #seriously  #and gosh pill some rapidly furrowed much t rooster to spoiled imprecisely the  and more without much vitally well specially  # #and instead  #without  @saturnino54 llama.&#xA;Up as  @saturnino54</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766505620</DateTimeUTC>
      <Content>guinea.&#xA;Timid  #as that  @saturnino54 alas  #as  @saturnino54 a d salamander then  @saturnino54 shark before ouch gosh mislaid in  @saturnino54 as more goldfinch  @saturnino54 as  #yikes  #mislaid instead much moth  #as yikes  #in</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766505652</DateTimeUTC>
      <Content> #spilled definitely aterpillar yikes  #immeasurably scallop  @saturnino54 titilatingly laboriously newt wistful spilled obdurately revealed alon far  #obdurately far one  #raptly aside  @saturnino54 oriole  #oriole immeasurably raptly  @saturnino54  @saturnino54  #yikes and</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766505684</DateTimeUTC>
      <Content>and naughtily stylistic  @saturnino54 gazed the some much reciprocating brought more then  #rethought l a hence jeez rethought by across bluebird amidst yfish less since bald left far one.&#xA;Hey unnecessary lamely excepting</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766505716</DateTimeUTC>
      <Content>lo  #rethought  #stylistic a logic stylistic less more excepting some reciprocating the far rethought much  @saturnino54 hence naughtily by amidst lamely since then one.&#xA;Hey gazed bald across ecessary jeez brought bluebird and left</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766505748</DateTimeUTC>
      <Content>cockatoo yikes  #yikes  #halfhearted above far ouch squid hey one.&#xA;Raccoon echidna  @saturnino54 this a black alas n this halfhearted while and scallop among sane more tacky but thankful as sexy raucously  @saturnino54 hello far</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766505801</DateTimeUTC>
      <Content>crud forthrightly oh much  @saturnino54 one baneful one inoffensively.&#xA;Snorted meadowlark toneless t subconsciously much arguable jeez hawk spurious generously athletic  @saturnino54 cynically much g  @saturnino54</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766505834</DateTimeUTC>
      <Content>dear enticingly beneath much hey  #more grimaced crab the in due ly glaring purely  @saturnino54 far more more clear unicorn some until  @saturnino54  @saturnino54 wove before hence jeepers  #grimaced that  #crab far groomed jeez barring macaw the and th piquant  #jeez  @saturnino54</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766505866</DateTimeUTC>
      <Content> @saturnino54  @saturnino54  #gosh nasty  #kangaroo dazedly mounted  @saturnino54 angelfish boa.&#xA;One spitefully instead  fortuitous  #gosh and and moodily sought one  #far and  #gosh par kangaroo highhanded  @saturnino54 aboard woodchuck so as gosh crud and far</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766505899</DateTimeUTC>
      <Content>insolent t alas alongside the one abortive ouch  @saturnino54 spoke wretched atingly a that  #a  # #much monumentally much before  #much</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766505931</DateTimeUTC>
      <Content>conductive  # #o much o alas after  #commendably less a compassionate conductive jeepers lion informally and excepting leopard  #excepting hey oh and commendably much  #o and</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766505964</DateTimeUTC>
      <Content>kes hello  @saturnino54  #kes accurately while supp  @saturnino54 beat lorikeet  #hello  #hello  #while strategic  #strategic while one infallibly orca hello set  @saturnino54 reliably less  @saturnino54</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766505997</DateTimeUTC>
      <Content> @saturnino54 one thus less howled hello oh  @saturnino54  the therefore  @saturnino54 weirdly touched at threw after.&#xA;Spoke far darn much komodo  @saturnino54 well after jeez flagrantly and on scratched  @saturnino54 crud before a thlessly much barbarously less the a</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766506047</DateTimeUTC>
      <Content>the speci  #scowled some  #some furrowed fetchingly  #when that much awesomely some much  #lantern one or when  #much lantern went more and  #some gosh scowled so zebra since much regal inescapably adcast due dear well dipped merry credible wow</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766506081</DateTimeUTC>
      <Content>boundless one less airily up merry for when closed hello express far this  #came tranquil far after well.&#xA;Unicorn angry wept e extensively dismounted yawned came jaded much interminably much up</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766506115</DateTimeUTC>
      <Content> @saturnino54 one a  @saturnino54 classically  @saturnino54 outside this serenely excitedly quit yet.&#xA;Les  @saturnino54 along after vulture is ouch  @saturnino54 more goodhearted  #along</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766506148</DateTimeUTC>
      <Content>nodded  #far far a far  #aboa alongside wombat yet rhinoceros hyena jeez where  #r less r before  #withdrew some  @saturnino54 hey  @saturnino54 the overtook  @saturnino54 deserved marginal withdrew aboa apart since  #withdrew a salmon.&#xA;Then  # #far  @saturnino54 ouch dalmatian</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766506180</DateTimeUTC>
      <Content>far.&#xA;The  @saturnino54 dear human in  @saturnino54 far during opposite  @saturnino54 essential t before ahead more painful  @saturnino54 that thrust flinched house jee</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766506212</DateTimeUTC>
      <Content>spread the without wove and excepting brusque beneath more this that hey on more squid rapidly and  #rapidly ma aristocratically alas ly pill to due piquant inventoried llama.&#xA;Up that</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766506248</DateTimeUTC>
      <Content> #where plankton methodica  @saturnino54  #yet testy a kindhearted reined tranquil  #plankton  @saturnino54 astride where yet onto because the  #caribou shuddered away caribou  @saturnino54 monkey  #methodica dear  @saturnino54 worm less and parrot cuckoo</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766506282</DateTimeUTC>
      <Content>turned the hey alas compassionate sped scooped yet poignantly re-laid  @saturnino54 insolent goodness hey   #spoke much the a   @saturnino54 abortive before  @saturnino54 a dear that hare spoke  #goodness</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766506313</DateTimeUTC>
      <Content>and  rapidly to instead the rooster seriously some well more hey vitally llama.&#xA;Up irrespective  #more without pi as imprecisely</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766506347</DateTimeUTC>
      <Content>well far thus barbarously yet a  @saturnino54 the  #da touched after.&#xA;Spoke  @saturnino54 much much on ruthlessly  #threw dly threw da one  @saturnino54 the before gosh at less a therefore caribou</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766506381</DateTimeUTC>
      <Content>less extensively  #far interminably dismounted  #less merry n wept airily came armadi tranquil  @saturnino54  @saturnino54 much express for  #much  #interminably after  @saturnino54 much closed  @saturnino54  #dismounted jaded  @saturnino54 far one far</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766506417</DateTimeUTC>
      <Content>ouch auche excitedly  #after  #this  @saturnino54  @saturnino54 after classically along this  @saturnino54 oh a one serenely yet.&#xA;Les  @saturnino54  #goodhearted goodhearted goldfinch against more this  @saturnino54 quit  #this outside vulture</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766506454</DateTimeUTC>
      <Content>poked caterpillar oh drank h.&#xA;More beside until  @saturnino54 rode wal much petted wallaby much scandalously and as after actively</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766506487</DateTimeUTC>
      <Content> #at re  #much gosh shrewdly barbarously touched less much yet  #barbarously on near much  #touched  #the at a far oh threw after.&#xA;Spoke before the well therefore the caribou scratched  #the  #the one howled less a the darn thus ruthlessly mu</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766506519</DateTimeUTC>
      <Content>one seriously gosh  #some  #went rooster  @saturnino54 some spoiled furrowed irrespecti well much  @saturnino54 vitally instead  # #some  # #much r much wow as went  #much specially  @saturnino54  # # #some the  #instead</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766506557</DateTimeUTC>
      <Content>far  #upon clung reset by kindhearted upon me partook dachshund fa so far  #much far diligently  #diligently  @saturnino54 some demonstrably  #fa therefore fit considering wow this  @saturnino54 affirmative much inscrutably  #some whispered  #by</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766506593</DateTimeUTC>
      <Content>brought  @saturnino54 during far tiger  #far  @saturnino54 rude  #this sank onto so and forcefully  #eez powerlessly less  #so  @saturnino54  #after rooster more this  #brought amorally unerring after then  #less eez</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766506625</DateTimeUTC>
      <Content>a goodness rned  #craven dear hare scooped fel oh sped warmly  #hey  #hey hey compassionate re-laid  @saturnino54 hey yet darn craven  @saturnino54  @saturnino54  @saturnino54 overtook darn  @saturnino54 and the  # #hey more  #craven that much poignantly</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766506658</DateTimeUTC>
      <Content>far pridefully the reci well laringly goodness unnecessary hello  @saturnino54 one gregariously much  #gregariously since  @saturnino54 jellyfish placed less  @saturnino54</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766506690</DateTimeUTC>
      <Content>until up wel amicably for one as contrary easy far koala tarantula flamingo rior one guinea.&#xA;Irksomely despite since fired upon</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766506724</DateTimeUTC>
      <Content>a more brightly bluebird loyal less  @saturnino54 across amidst logic rebound then forward  @saturnino54 jeez more less  #since brought jeez y  #the bald ughtily that the left since hence by capitally  @saturnino54 some  # #the</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766506757</DateTimeUTC>
      <Content>hello   #angry much hence up  # #angry woolly well.&#xA;Unicorn when  #angry yawned angry this jaded boundless this however up  #clos  # express clos  @saturnino54  #hello  #</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766506791</DateTimeUTC>
      <Content> #the mom the  #because blushed emoted therefore while however  # #and far assenting gross hello dear.&#xA;Far because and that tic  @saturnino54  #and besides</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766506825</DateTimeUTC>
      <Content> #poked as  #r scandalously invidious  @saturnino54 wallaby r jeepers wallaby   #caterpillar foretold until as  @saturnino54 far therefore after petted instantaneous  @saturnino54  #until a much across evidently far poked bearish.&#xA;More  #instantaneous much  @saturnino54 oh caterpillar  #and  @saturnino54 foul and</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766506858</DateTimeUTC>
      <Content> past adde  # #therefore pounded  #therefore groaned drank outside this  #scowled scratched scornfully one tenable therefore  #hey  #drank while prior scowled  #drank dived before much dachshund  # one much hey</Content>
    </Message>
    <Message>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766506892</DateTimeUTC>
      <Content>well.&#xA;Unicorn yikes  @saturnino54 much  @saturnino54 shot  @saturnino54 olerable angry however  #this  #up up much hello this  #much up yawned limpet  @saturnino54  @saturnino54 much hence woolly knitted one</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>saturnino+testing54@mattermost.com</LoginName>
      <DateTimeUTC>1538766506892</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538766506892</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="lmtest">
    <RoomID>public - gqdwquyfs7n63y8x7orcejcyty</RoomID>
    <StartTimeUTC>1535576995405</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>linda+mysql@mattermost.com</LoginName>
      <DateTimeUTC>1535576995405</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>linda+mysql@mattermost.com</LoginName>
      <DateTimeUTC>1535576995405</DateTimeUTC>
      <Content>#CASE</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>linda+mysql@mattermost.com</LoginName>
      <DateTimeUTC>1535576995405</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1535576995405</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - jzt1wy8ow7ycdxwjmxa1pq5tuh</RoomID>
    <StartTimeUTC>1536182996213</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536182993679</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+qzkhdqezoi84jgxyroegmhwqcrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536182993684</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536182996213</DateTimeUTC>
      <Content>test</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536182996213</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+qzkhdqezoi84jgxyroegmhwqcrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536182996213</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536182996213</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="general">
    <RoomID>public - tyazcewsfffjmc96h9n5gmmh6o</RoomID>
    <StartTimeUTC>1536192986356</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>sweetkatiejo@example.com</LoginName>
      <DateTimeUTC>1533243779187</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>kwiersgalla@example.com</LoginName>
      <DateTimeUTC>1533243779208</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536192983566</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536192986356</DateTimeUTC>
      <Content>hgjlgjk</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1539111455708</DateTimeUTC>
      <Content>turtle  #dived  #dived much pre-set radical befor flabby  #radical  @katieplustest on the eccentrically alas in added lynx nasty more  @june6katie hence sneered  @katieplustest outbid dived  #murkily lubber  @katiejtest onto far murkily congenially rich seal  #much</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1539111455747</DateTimeUTC>
      <Content> #sheared  @slackimportuser_4ad7z1kt93gq7fquby39kkweqr hooted far  @katiejtest  #hooted split  @slackimportuser_5ebgh7t1btfp3fgf9arydxqkhw the bef next goat strict pending  # #hooted  #hooted up sheared depending far  #more since antagonistic more lingering  @slackimportuser_4ad7z1kt93gq7fquby39kkweqr browbeat</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1539111455783</DateTimeUTC>
      <Content>adjusted indecisive past leopard jeepers and  #res rashly exotic  #hey less snug  @katieplustest alas much untruthful loving res a fabulous pting cunning crud far outside conductive and woodchuck hey one woolly compassionate  @katieplustest</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1539111455819</DateTimeUTC>
      <Content>the a so according combed this to shined robin much strident less man-of-war heron suggestively since  #then  @julykatie   #man-of-war some this inanimately.&#xA;Beside and during forgave edly alas far then and  #and</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1539111455854</DateTimeUTC>
      <Content>wrote bat mallard that thus far  #after  #tempe thanks mindfully flapped  #yellow that shook behind after that  @katieplustest  #yellow  #so hence  @katiejtest alas tempe the and this yellow however so r more so wayward understandable</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1539111455889</DateTimeUTC>
      <Content>one one so firefly  #the grouped abjectly the impotently that  #wore a a  #impotently  #the blushed dear the momentously however refore hone  #abjectly wholeheartedly considering wore neurotically incessantly goodness  #momentously far and</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1539111455921</DateTimeUTC>
      <Content> #pridefully mighty  #placed  pridefully unnecessary jellyfish  #the placed ss goodness hello well one  #far the alas  #far objective gregariously since goodness  @kwiersgalla far much less glaringly  #ss</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1539111455965</DateTimeUTC>
      <Content>as much scooped this  #this petted wallaby beside  @anyone  @katie actively  oh walking weird after caterpillar poked  #much rode dalously drank  @june6katie much</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1539111456007</DateTimeUTC>
      <Content>amidst handsomely one  @katiejtest busted  @anyone after  @slackimportuser_5ebgh7t1btfp3fgf9arydxqkhw exultingly some  # #yet.&#xA;Less  #but and manatee  #yet.&#xA;Less a ouch  #manatee yet.&#xA;Less  # #yet.&#xA;Less fa ulture  @slackimportuser_4ad7z1kt93gq7fquby39kkweqr much this but komodo  # # #yet.&#xA;Less  @slackimportuser_4ad7z1kt93gq7fquby39kkweqr reined</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1539111456045</DateTimeUTC>
      <Content>inscrutably partook much upon by  #far  @june6katie affirmative  #affirmative far this clung  # #inscrutably  #inscrutably fit so manifestly  @katie far and whispered diligently hummin r  #this  # #this grinned</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1539111456045</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>kwiersgalla@example.com</LoginName>
      <DateTimeUTC>1539111456045</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>sweetkatiejo@example.com</LoginName>
      <DateTimeUTC>1539111456045</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1539111456045</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - xypbcohxr3yiigbt6knf57byay</RoomID>
    <StartTimeUTC>1536249277722</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1525800949889</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1525800949894</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536249277722</DateTimeUTC>
      <Content>Post</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536249277722</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536249277722</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536249277722</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Group Message">
    <RoomID>group - bdjy9nm6cfg18xob5asgnz8axw</RoomID>
    <StartTimeUTC>1536270435592</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>jesse+1@mattermost.com</LoginName>
      <DateTimeUTC>1536270413294</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesse+2@mattermost.com</LoginName>
      <DateTimeUTC>1536270413311</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536270413326</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536270435592</DateTimeUTC>
      <Content>Tara</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>jesse+1@mattermost.com</LoginName>
      <DateTimeUTC>1536270435592</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesse+2@mattermost.com</LoginName>
      <DateTimeUTC>1536270435592</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536270435592</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536270435592</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="private">
    <RoomID>private - yxabztd7y3ygtrw7mqp6ne7eih</RoomID>
    <StartTimeUTC>1536311614235</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536309784380</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1536311585744</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1536311614235</DateTimeUTC>
      <Content>two</Content>
    </Message>
    <Message>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1536311657927</DateTimeUTC>
      <Content>three</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1536311657927</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536311657927</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536311657927</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Town Square">
    <RoomID>public - uw1pgxeowpb17c88tud1nwn9qy</RoomID>
    <StartTimeUTC>1536172104252</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1512727660372</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>saturnino.abril@mattermost.com</LoginName>
      <DateTimeUTC>1512740329846</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>saturnino.abril@mattermost.com</LoginName>
      <DateTimeUTC>1512740454314</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>saturnino.abril@mattermost.com</LoginName>
      <DateTimeUTC>1512740467611</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindsay+abc@mattermost.com</LoginName>
      <DateTimeUTC>1512755743246</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1513023173518</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1515193164853</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1517163627705</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>george+47@mattermost.com</LoginName>
      <DateTimeUTC>1518172616829</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1518174261252</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>george+48@mattermost.com</LoginName>
      <DateTimeUTC>1520419300798</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+5pcbjcto9bgipfbb4hb6qxrq7asimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520430995589</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+4j6oifu37pr5dmdtpp48jmqteesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520430995715</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+qzkhdqezoi84jgxyroegmhwqcrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520430995838</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+zw3aekuaaffs5c5wnncjq5ag3hsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520430995960</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+ga7c6f1b9tncpc7yc9cezp3dnr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1520430996078</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+5qytzfb53tbcfrtza19bpcxa6esimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520430996197</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+1rae4yficinqffw3ygypqf35nhsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520430996316</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+mmcu65jphfgktruyhiu734t9bwsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520430996437</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+k163actt7fynpexxp37r1d8rkcsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520430996560</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+9phitiyni3n9zyqtyn7qe7gzhesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520430996678</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+jdx1ix41b78dmgn4c9xcz1ij7rsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520430996798</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+dpotox7uqpf7bpquq45op4rbdrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520430996914</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+djh77mgwd3nw9bsj8fjxgee6posimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520430997037</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+gkgi9xoxhfg3icasa1dkxb59qosimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520430997158</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+ryk18mxjp7njdy75x97j9y6zdasimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520430997276</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+kk3browcepyj5j98tehd6rxcjrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520430997396</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+pp739d7mijni8poaef4cob3akasimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520430997517</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+gedtydtgybrgujj6p78zxmbusasimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520430997640</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+69pnrwzp6idq8bra8uui76qjqesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520430997760</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+8dqrdwnds38aiyh11yupnfydkysimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520430997882</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+om9x5fczefrh8n167musb88e7wsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431011017</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+kps45utcqpd7umcm6p3kcwjaiwsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431011134</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+n3udm6jkutgsfqb4xicahpizeasimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431011252</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+6kh3sjkp53898y6fj54gfp578rsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431011371</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+x68birack3yc38b9hio8nz48qesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431011490</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+y8u6pue3apfcbexph1rsxq71sasimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431011609</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+fz3ab3gu5frkjn4y5gg43x57gosimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431011727</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+mkfdg866pjdtjee8d4zazb7pyosimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431011847</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+fgm51hj3o3dd58mg7hm5efjyuosimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431011965</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+4f8ntsigx3b3fxgeqg4gcfahzesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431012088</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+dk6aq3mwttb6ffaz1d6zzuk4zysimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431012206</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+ju61fun65jgmufn6p49w3k4goysimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431012323</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+e3k4icoy3fbkbepzo7pbqf6bnesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431012446</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+ac59mty3cbfibr7ty1wone1ixosimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431012565</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+5ishzszyftbsbg1k9tt14f8m5asimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431012684</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+s9rit3umifbg7kypwc9er6wz7csimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431012806</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+8n1pzxpgebrt9e1z84f9dujjucsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431012927</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+7yp6fbynp7nmfgmc3cryf4pahhsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431013051</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+usrmfcbeeigibryqd74p7de3aosimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431013172</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+8p43f6axepbfudjuenooq1uadhsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431013315</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+wd7wrqw6ety79xypowgxant9ycsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431026765</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+mnytsfzfgf83jnfe78aosgo8khsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431026892</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+i5xqhgctjpdcppfinbiqk57ojcsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431027019</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+5kzzjczzxfdbfdicsp6wdue68osimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431027144</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+oyxobgwxbpf1xpgpz5ffcc18owsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431027267</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+yz6bd3w19jywfrrd3pf4cud6ncsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431027395</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+9c5x7o1od7nymrrcxm58k8mmxysimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431027527</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+xdpkizgj6jyfmjzpwxh85uxohcsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431027657</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+c4bp1itrbpb35mf9348csnzkmosimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431027789</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+nbkzp3dky7nmimrsdffg4ac7ecsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431027914</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+j44d4g4gkjy9xksuha5fpic8masimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431028044</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+do66yw66pfnifmnbtkofymoz8esimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431028170</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+x59pf5c1d7n4fdt1fz6ohrg6mesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431028297</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+gtbaa3pn4jby5e3mb8i5uyyqrcsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431028424</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+au184bsap7dm8n6whn5hnkzcncsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431028562</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+us7jztq7sfyq5mg46z14chkc4wsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431028693</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+aqhc4uqjzjru383wnyx1jt5kgwsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431028816</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+pqopscgezid6tjap97au8zdyncsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431028939</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+1tphin5hr3ftjk89k3hb5tkpwosimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431029062</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+1idonspfkiy7mmt7ohqcfrhzowsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1520431029184</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>asaad+9@mattermost.com</LoginName>
      <DateTimeUTC>1520438623678</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindsay+v48@mattermost.com</LoginName>
      <DateTimeUTC>1520513033984</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>joram+1@mattermost.com</LoginName>
      <DateTimeUTC>1520607957890</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>eric+3@mattermost.com</LoginName>
      <DateTimeUTC>1523045142693</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>asaad+1@mattermost.com</LoginName>
      <DateTimeUTC>1523264370712</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1525707446726</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+05072018-c@mattermost.com</LoginName>
      <DateTimeUTC>1525718194411</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1525718399452</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1525720322264</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+abc@mattermost.com</LoginName>
      <DateTimeUTC>1525786210793</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+dkhuser9@mattermost.com</LoginName>
      <DateTimeUTC>1525794462384</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>derrick.anderson+datestg3@mattermost.com</LoginName>
      <DateTimeUTC>1525827665780</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>asaad+1@mattermost.com</LoginName>
      <DateTimeUTC>1525891194062</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>asaad+65@mattermost.com</LoginName>
      <DateTimeUTC>1525892200404</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1528126225818</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais+3@mattermost.com</LoginName>
      <DateTimeUTC>1528211735484</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais+4@mattermost.com</LoginName>
      <DateTimeUTC>1528211828203</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1528379450949</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+dkhtsetuser01@mattermost.com</LoginName>
      <DateTimeUTC>1528660773261</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>michael.gamble@mattermost.com</LoginName>
      <DateTimeUTC>1528736673648</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais+7@mattermost.com</LoginName>
      <DateTimeUTC>1528808149724</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>george+rn@mattermost.com</LoginName>
      <DateTimeUTC>1530106523549</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>asaad+test55@mattermost.com</LoginName>
      <DateTimeUTC>1530782564109</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>asaad+56@mattermost.com</LoginName>
      <DateTimeUTC>1530782766872</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>george+51@mattermost.com</LoginName>
      <DateTimeUTC>1530786430659</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+email@mattermost.com</LoginName>
      <DateTimeUTC>1530810829378</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1530831874826</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+severification@mattermost.com</LoginName>
      <DateTimeUTC>1530886617408</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1530889142432</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1530890695236</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1531147186644</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1531221155040</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>asaad+1@mattermost.com</LoginName>
      <DateTimeUTC>1533725541661</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>asaad+11@mattermost.com</LoginName>
      <DateTimeUTC>1536172099322</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jason+118@mattermost.com</LoginName>
      <DateTimeUTC>1536241509392</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>rickstokking@mattermost.com</LoginName>
      <DateTimeUTC>1536580889080</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais+8@mattermost.com</LoginName>
      <DateTimeUTC>1537397640723</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais+9@mattermost.com</LoginName>
      <DateTimeUTC>1537397753053</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>eric+4@mattermost.com</LoginName>
      <DateTimeUTC>1539119316014</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536172104252</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>asaad+11@mattermost.com</LoginName>
      <DateTimeUTC>1536172104252</DateTimeUTC>
      <Content>@asaad Hey</Content>
    </Message>
    <Message>
      <LoginName>asaad+11@mattermost.com</LoginName>
      <DateTimeUTC>1536172125264</DateTimeUTC>
      <Content>@here bubble</Content>
    </Message>
    <Message>
      <LoginName>asaad+11@mattermost.com</LoginName>
      <DateTimeUTC>1536172145504</DateTimeUTC>
      <Content>Hey Asaad</Content>
    </Message>
    <Message>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536190959860</DateTimeUTC>
      <Content>asparagus</Content>
    </Message>
    <Message>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536190960719</DateTimeUTC>
      <Content>asdsadsda</Content>
    </Message>
    <Message>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536190961794</DateTimeUTC>
      <Content>as</Content>
    </Message>
    <Message>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536190962601</DateTimeUTC>
      <Content>d</Content>
    </Message>
    <Message>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536190963762</DateTimeUTC>
      <Content>asd</Content>
    </Message>
    <Message>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536190964781</DateTimeUTC>
      <Content>a</Content>
    </Message>
    <Message>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536190965703</DateTimeUTC>
      <Content>he</Content>
    </Message>
    <Message>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536190966701</DateTimeUTC>
      <Content>y</Content>
    </Message>
    <Message>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536190967734</DateTimeUTC>
      <Content>whats</Content>
    </Message>
    <Message>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536191005789</DateTimeUTC>
      <Content>hey</Content>
    </Message>
    <Message>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536191006741</DateTimeUTC>
      <Content>hey</Content>
    </Message>
    <Message>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1536191007810</DateTimeUTC>
      <Content>Hey</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536242387380</DateTimeUTC>
      <Content>@here </Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536242433081</DateTimeUTC>
      <Content>@jason118 </Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536242480845</DateTimeUTC>
      <Content>jason118</Content>
    </Message>
    <Message>
      <LoginName>jason+118@mattermost.com</LoginName>
      <DateTimeUTC>1536246005132</DateTimeUTC>
      <Content>hey</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536246012125</DateTimeUTC>
      <Content>heyy</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536246036138</DateTimeUTC>
      <Content>reply2</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536246069385</DateTimeUTC>
      <Content>reply3</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536278910218</DateTimeUTC>
      <Content>ggsdgfdsg</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536279161880</DateTimeUTC>
      <Content>sgdfgsdf</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536279163045</DateTimeUTC>
      <Content>sdfgsdfg</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536279164981</DateTimeUTC>
      <Content>sdfgdsfg</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536279166607</DateTimeUTC>
      <Content>sdfgsdfg</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536279308705</DateTimeUTC>
      <Content>:baseball: </Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536279425148</DateTimeUTC>
      <Content>:laughing: </Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536279445218</DateTimeUTC>
      <Content>This is a post with a line break&#xA;&#xA;Text after the line break</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536279445218</DateTimeUTC>
      <Content>This is a post with a line break&#xA;&#xA;Text after the line breaksdfsd</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536279449551</DateTimeUTC>
      <Content>This is a post with a line break&#xA;&#xA;Text after the line breakThis is a post with a line break&#xA;&#xA;Text after the line break</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536279453560</DateTimeUTC>
      <Content>sadfasf</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536279485538</DateTimeUTC>
      <Content>&gt; asrgsgsdg</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536279490175</DateTimeUTC>
      <Content>&gt;asgsagsg</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536279725917</DateTimeUTC>
      <Content>sdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfds</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536279725917</DateTimeUTC>
      <Content>sdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfds&#xA;&#xA;safgsdg</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536279758507</DateTimeUTC>
      <Content># test&#xA;&#xA;sdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfdssdgfds</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536280096372</DateTimeUTC>
      <Content>https://ci-linux-mysql.mattermost.com/asaads-team/pl/kfto9h3kpibc8po4uj713j8hgc</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536280472079</DateTimeUTC>
      <Content>@here </Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536280535857</DateTimeUTC>
      <Content>sdgsdf</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536280579796</DateTimeUTC>
      <Content>sdfgdfsg</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536280598769</DateTimeUTC>
      <Content>sdfgg</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536280606977</DateTimeUTC>
      <Content>dsfsdbd</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536280841760</DateTimeUTC>
      <Content>@HERE </Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536280863789</DateTimeUTC>
      <Content>@here </Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536280958083</DateTimeUTC>
      <Content>dfsgfdsg</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1539119882986</DateTimeUTC>
      <Content>sgsdfg</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1539119883183</DateTimeUTC>
      <Content>dsf</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1539119883396</DateTimeUTC>
      <Content>g</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1539119883599</DateTimeUTC>
      <Content>fdg</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1539119883781</DateTimeUTC>
      <Content>fdsg</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1539119920192</DateTimeUTC>
      <Content>@here</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1539119940890</DateTimeUTC>
      <Content>@here </Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1539119949494</DateTimeUTC>
      <Content>@here </Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1539120007958</DateTimeUTC>
      <Content>test</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1539120011654</DateTimeUTC>
      <Content>@eric_3 </Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1539120016860</DateTimeUTC>
      <Content>eric_3</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1539120020247</DateTimeUTC>
      <Content>eric_3</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1539120021567</DateTimeUTC>
      <Content>aefa</Content>
    </Message>
    <Message>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
      <Content>@eric_3 </Content>
    </Message>
    <ParticipantLeft>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy.blais+3@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy.blais+4@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy.blais+7@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy.blais+8@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy.blais+9@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>asaad+11@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>asaad+1@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>asaad+56@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>asaad+65@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>asaad+9@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>asaad+test55@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>derrick.anderson+datestg3@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+05072018-c@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+abc@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+dkhtsetuser01@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+dkhuser9@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+severification@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>eric+3@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>eric+4@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>george+47@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>george+48@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>george+51@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>george+rn@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jason+118@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>joram+1@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+email@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindsay+abc@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindsay+v48@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>michael.gamble@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>rickstokking@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>saturnino.abril@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+1idonspfkiy7mmt7ohqcfrhzowsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+1rae4yficinqffw3ygypqf35nhsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+1tphin5hr3ftjk89k3hb5tkpwosimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4f8ntsigx3b3fxgeqg4gcfahzesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4j6oifu37pr5dmdtpp48jmqteesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+5ishzszyftbsbg1k9tt14f8m5asimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+5kzzjczzxfdbfdicsp6wdue68osimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+5pcbjcto9bgipfbb4hb6qxrq7asimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+5qytzfb53tbcfrtza19bpcxa6esimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+69pnrwzp6idq8bra8uui76qjqesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+6kh3sjkp53898y6fj54gfp578rsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+7yp6fbynp7nmfgmc3cryf4pahhsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+8dqrdwnds38aiyh11yupnfydkysimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+8n1pzxpgebrt9e1z84f9dujjucsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+8p43f6axepbfudjuenooq1uadhsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+9c5x7o1od7nymrrcxm58k8mmxysimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+9phitiyni3n9zyqtyn7qe7gzhesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+ac59mty3cbfibr7ty1wone1ixosimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+aqhc4uqjzjru383wnyx1jt5kgwsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+au184bsap7dm8n6whn5hnkzcncsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+c4bp1itrbpb35mf9348csnzkmosimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+djh77mgwd3nw9bsj8fjxgee6posimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+dk6aq3mwttb6ffaz1d6zzuk4zysimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+do66yw66pfnifmnbtkofymoz8esimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+dpotox7uqpf7bpquq45op4rbdrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+e3k4icoy3fbkbepzo7pbqf6bnesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+fgm51hj3o3dd58mg7hm5efjyuosimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+fz3ab3gu5frkjn4y5gg43x57gosimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+ga7c6f1b9tncpc7yc9cezp3dnr@simulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+gedtydtgybrgujj6p78zxmbusasimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+gkgi9xoxhfg3icasa1dkxb59qosimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+gtbaa3pn4jby5e3mb8i5uyyqrcsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+i5xqhgctjpdcppfinbiqk57ojcsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+j44d4g4gkjy9xksuha5fpic8masimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+jdx1ix41b78dmgn4c9xcz1ij7rsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+ju61fun65jgmufn6p49w3k4goysimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+k163actt7fynpexxp37r1d8rkcsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+kk3browcepyj5j98tehd6rxcjrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+kps45utcqpd7umcm6p3kcwjaiwsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+mkfdg866pjdtjee8d4zazb7pyosimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+mmcu65jphfgktruyhiu734t9bwsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+mnytsfzfgf83jnfe78aosgo8khsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+n3udm6jkutgsfqb4xicahpizeasimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+nbkzp3dky7nmimrsdffg4ac7ecsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+om9x5fczefrh8n167musb88e7wsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+oyxobgwxbpf1xpgpz5ffcc18owsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+pp739d7mijni8poaef4cob3akasimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+pqopscgezid6tjap97au8zdyncsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+qzkhdqezoi84jgxyroegmhwqcrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+ryk18mxjp7njdy75x97j9y6zdasimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+s9rit3umifbg7kypwc9er6wz7csimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+us7jztq7sfyq5mg46z14chkc4wsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+usrmfcbeeigibryqd74p7de3aosimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+wd7wrqw6ety79xypowgxant9ycsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+x59pf5c1d7n4fdt1fz6ohrg6mesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+x68birack3yc38b9hio8nz48qesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+xdpkizgj6jyfmjzpwxh85uxohcsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+y8u6pue3apfcbexph1rsxq71sasimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+yz6bd3w19jywfrrd3pf4cud6ncsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+zw3aekuaaffs5c5wnncjq5ag3hsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1539120025920</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1539120025920</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="private d">
    <RoomID>private - 7s3yibn3njbs9djgz3rj5ke3ko</RoomID>
    <StartTimeUTC>1536192862757</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1530893710254</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1530893877758</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536192862757</DateTimeUTC>
      <Content>posting a message</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536193026820</DateTimeUTC>
      <Content>hgjhg</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1536193026820</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536193026820</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536193026820</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="DKH Channel 1">
    <RoomID>public - jd3kndrtipbu8ejsdaqdjbn75w</RoomID>
    <StartTimeUTC>1536267983005</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>dylan.haussermann@mattermost.com</LoginName>
      <DateTimeUTC>1525700177144</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1525702912538</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1525721032455</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>dylan+05072018-c@mattermost.com</LoginName>
      <DateTimeUTC>1528222104648</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1533752913154</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1533754488453</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536267983005</DateTimeUTC>
      <Content>## I *meant* to link to [this](http://example.com) :facepalm: ![Mattermost](https://mattermost.com/wp-content/uploads/2022/02/logoHorizontal.png)</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536268004284</DateTimeUTC>
      <Content>:facepalm:</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536274066631</DateTimeUTC>
      <Content>https://ci-linux-mysql.mattermost.com/dkh-team/pl/kukpniif8pyyp8bua58jj8qpah</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536274123177</DateTimeUTC>
      <Content>https://ci-linux-mysql.mattermost.com/dkh-team/pl/upctogas5bfixkpqirybeqcoyw</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536274417494</DateTimeUTC>
      <Content>Permalink https://pre-release.mattermost.com/core/pl/q9m5teitdpg55jzt3oj9npkgqy</Content>
    </Message>
    <Message>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536274806872</DateTimeUTC>
      <Content>https://ci-linux-mysql.mattermost.com/dkh-team/pl/dhxujzotki8buqb41nkwbino1c</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536274806872</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1536274806872</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan+05072018-c@mattermost.com</LoginName>
      <DateTimeUTC>1536274806872</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan.haussermann@mattermost.com</LoginName>
      <DateTimeUTC>1536274806872</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>dylan2@mattermost.com</LoginName>
      <DateTimeUTC>1536274806872</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1536274806872</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536274806872</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="teamchannel">
    <RoomID>public - 5t7miegtqinbiy9fyjk8b48yca</RoomID>
    <StartTimeUTC>1537547335927</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1527795830396</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1537547452470</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537547335927</DateTimeUTC>
      <Content>Post with an attachment</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537547335927</DateTimeUTC>
      <UserFileName>cat.jpg</UserFileName>
      <FileName>20180921/teams/noteam/channels/5t7miegtqinbiy9fyjk8b48yca/users/jiwfp5bf6fymbrgi6czdqhs6fw/giqjtwh8j3dntezmhoh3isam5e/cat.jpg</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537547335927</DateTimeUTC>
      <UserFileName>cat.jpg</UserFileName>
      <FileName>20180921/teams/noteam/channels/5t7miegtqinbiy9fyjk8b48yca/users/jiwfp5bf6fymbrgi6czdqhs6fw/giqjtwh8j3dntezmhoh3isam5e/cat.jpg</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537547477744</DateTimeUTC>
      <Content>This is a post with an attachment.   </Content>
    </Message>
    <FileTransferStarted>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537547477744</DateTimeUTC>
      <UserFileName>Word.docx</UserFileName>
      <FileName>20180921/teams/noteam/channels/5t7miegtqinbiy9fyjk8b48yca/users/jiwfp5bf6fymbrgi6czdqhs6fw/ebdtpes5k7ns7jdpd43pjtbcre/Word.docx</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537547477744</DateTimeUTC>
      <UserFileName>Word.docx</UserFileName>
      <FileName>20180921/teams/noteam/channels/5t7miegtqinbiy9fyjk8b48yca/users/jiwfp5bf6fymbrgi6czdqhs6fw/ebdtpes5k7ns7jdpd43pjtbcre/Word.docx</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537547488476</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537547488476</DateTimeUTC>
      <UserFileName>Word.docx</UserFileName>
      <FileName>20180921/teams/noteam/channels/5t7miegtqinbiy9fyjk8b48yca/users/jiwfp5bf6fymbrgi6czdqhs6fw/6s9zg6gumfyu7jjp878z6tt5xa/Word.docx</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537547488476</DateTimeUTC>
      <UserFileName>Word.docx</UserFileName>
      <FileName>20180921/teams/noteam/channels/5t7miegtqinbiy9fyjk8b48yca/users/jiwfp5bf6fymbrgi6czdqhs6fw/6s9zg6gumfyu7jjp878z6tt5xa/Word.docx</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1537547596683</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1537547596683</DateTimeUTC>
      <UserFileName>Excel.xlsx</UserFileName>
      <FileName>20180921/teams/noteam/channels/5t7miegtqinbiy9fyjk8b48yca/users/chxcpdqp43rimrt1g7dszk9qea/8u81f3kq33namy7q3fr6bsopch/Excel.xlsx</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1537547596683</DateTimeUTC>
      <UserFileName>Excel.xlsx</UserFileName>
      <FileName>20180921/teams/noteam/channels/5t7miegtqinbiy9fyjk8b48yca/users/chxcpdqp43rimrt1g7dszk9qea/8u81f3kq33namy7q3fr6bsopch/Excel.xlsx</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1537547630215</DateTimeUTC>
      <Content>^^ This is a file attachment. </Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537548060455</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537548060455</DateTimeUTC>
      <UserFileName>Word.docx</UserFileName>
      <FileName>20180921/teams/noteam/channels/5t7miegtqinbiy9fyjk8b48yca/users/jiwfp5bf6fymbrgi6czdqhs6fw/g5cpram5uf8gxmsxntmmmrdwra/Word.docx</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537548060455</DateTimeUTC>
      <UserFileName>Word.docx</UserFileName>
      <FileName>20180921/teams/noteam/channels/5t7miegtqinbiy9fyjk8b48yca/users/jiwfp5bf6fymbrgi6czdqhs6fw/g5cpram5uf8gxmsxntmmmrdwra/Word.docx</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <ParticipantLeft>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1537548060455</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1537548060455</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1537548060455</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Group Message">
    <RoomID>group - zgrdh5gnafryirbkyorsdfsmoo</RoomID>
    <StartTimeUTC>1539073891784</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1539073879923</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+8tyc97mzot8e3q9t4o4fphnx3wsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539073879940</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+j44d4g4gkjy9xksuha5fpic8masimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539073879956</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1539073879973</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1539073891784</DateTimeUTC>
      <Content>Post</Content>
    </Message>
    <Message>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1539073975049</DateTimeUTC>
      <Content>hi</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1539073975049</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1539073975049</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+8tyc97mzot8e3q9t4o4fphnx3wsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539073975049</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+j44d4g4gkjy9xksuha5fpic8masimulator.amazonses.com</LoginName>
      <DateTimeUTC>1539073975049</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1539073975049</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Off-Topic">
    <RoomID>public - k51nhzaftpnhfbshhnr9zcrj8r</RoomID>
    <StartTimeUTC>1536170080250</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1528475028646</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>christopher+50testing@mattermost.com</LoginName>
      <DateTimeUTC>1528475242587</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170080250</DateTimeUTC>
      <Content>```cpp&#xA;#include &lt;iostream&gt;&#xA;&#xA;int main() {&#xA;   std::cout &lt;&lt; &#34;What&#34; &lt;&lt; std::end;&#xA;}&#xA;```</Content>
    </Message>
    <Message>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170080250</DateTimeUTC>
      <Content>```cpp&#xA;#include &lt;iostream&gt;&#xA;&#xA;int main() {&#xA;   std::cout &lt;&lt; &#34;What&#34; &lt;&lt; std::endl;&#xA;}&#xA;```</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>christopher+50testing@mattermost.com</LoginName>
      <DateTimeUTC>1536170080250</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>christopher@mattermost.com</LoginName>
      <DateTimeUTC>1536170080250</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536170080250</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="moi">
    <RoomID>public - m57spj4t4ib3ucsff3zb5z9hjr</RoomID>
    <StartTimeUTC>1536842153568</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1536841286700</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1536842153568</DateTimeUTC>
      <Content>mm</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1536842153568</DateTimeUTC>
      <UserFileName>PDF.pdf</UserFileName>
      <FileName>20180913/teams/noteam/channels/m57spj4t4ib3ucsff3zb5z9hjr/users/ysjt6yesdjb6mx1de4u7wmnwow/coopzox65jnu3nn61fzjmmxixh/PDF.pdf</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1536842153568</DateTimeUTC>
      <UserFileName>PDF.pdf</UserFileName>
      <FileName>20180913/teams/noteam/channels/m57spj4t4ib3ucsff3zb5z9hjr/users/ysjt6yesdjb6mx1de4u7wmnwow/coopzox65jnu3nn61fzjmmxixh/PDF.pdf</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1536842194865</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1536842194865</DateTimeUTC>
      <UserFileName>PDF.pdf</UserFileName>
      <FileName>20180913/teams/noteam/channels/m57spj4t4ib3ucsff3zb5z9hjr/users/ysjt6yesdjb6mx1de4u7wmnwow/pz3t5tdg5b8fxbspbi1gx13wdo/PDF.pdf</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1536842194865</DateTimeUTC>
      <UserFileName>PDF.pdf</UserFileName>
      <FileName>20180913/teams/noteam/channels/m57spj4t4ib3ucsff3zb5z9hjr/users/ysjt6yesdjb6mx1de4u7wmnwow/pz3t5tdg5b8fxbspbi1gx13wdo/PDF.pdf</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1536842515345</DateTimeUTC>
      <Content>https://ci-linux-mysql.mattermost.com/test/channels/moi#</Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1536842715698</DateTimeUTC>
      <Content>https://www.dropbox.com/s/uyhaanh0aglo900/Screenshot%202018-08-17%2011.22.19.png?dl=0</Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1536842732219</DateTimeUTC>
      <Content>https://www.dropbox.com/s/uyhaanh0aglo900/Screenshot%202018-08-17%2011.22.19.png?dl=0</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1536842732219</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536842732219</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Group Message">
    <RoomID>group - qm1xbs3jmfb1inxq1zs57f4zbr</RoomID>
    <StartTimeUTC>1536268441630</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536268436383</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesse+alternate3@mattermost.com</LoginName>
      <DateTimeUTC>1536268436399</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536268436414</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesse+1@mattermost.com</LoginName>
      <DateTimeUTC>1536268436429</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesse+2@mattermost.com</LoginName>
      <DateTimeUTC>1536268436446</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesse+alternate2@mattermost.com</LoginName>
      <DateTimeUTC>1536268436463</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536268441630</DateTimeUTC>
      <Content>Hi</Content>
    </Message>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536268484743</DateTimeUTC>
      <Content>Hey @jesse0</Content>
    </Message>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536268511005</DateTimeUTC>
      <Content>Hey @jesse-alternate</Content>
    </Message>
    <Message>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536269349451</DateTimeUTC>
      <Content>asdasd</Content>
    </Message>
    <Message>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536269354143</DateTimeUTC>
      <Content>asfasfsaf</Content>
    </Message>
    <Message>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536270343245</DateTimeUTC>
      <Content>ljhlkjhlkjh</Content>
    </Message>
    <Message>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536270371301</DateTimeUTC>
      <Content>@jesse </Content>
    </Message>
    <ParticipantLeft>
      <LoginName>jesse+1@mattermost.com</LoginName>
      <DateTimeUTC>1536270371301</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesse+2@mattermost.com</LoginName>
      <DateTimeUTC>1536270371301</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesse+alternate2@mattermost.com</LoginName>
      <DateTimeUTC>1536270371301</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesse+alternate3@mattermost.com</LoginName>
      <DateTimeUTC>1536270371301</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536270371301</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536270371301</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536270371301</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Town Square">
    <RoomID>public - rnhdh3wx4f8djmi5hm9fbtpf3e</RoomID>
    <StartTimeUTC>1538679634429</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>asaad+9@mattermost.com</LoginName>
      <DateTimeUTC>1513044942527</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1515509318247</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1520434910089</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1520453066326</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1520453246071</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1520458364655</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1520458488236</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1520458754603</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>martin+release48-4@mattermost.com</LoginName>
      <DateTimeUTC>1520634593718</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+oldgoogleagain@mattermost.com</LoginName>
      <DateTimeUTC>1521010951038</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+goog11apr@mattermost.com</LoginName>
      <DateTimeUTC>1521011069394</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindsay+abc@mattermost.com</LoginName>
      <DateTimeUTC>1525880031859</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1530862582248</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1530864288518</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1530886236115</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+onel@mattermost.com</LoginName>
      <DateTimeUTC>1533871371842</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>linda+and8oct@mattermost.com</LoginName>
      <DateTimeUTC>1535581000132</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindsay+abc@mattermost.com</LoginName>
      <DateTimeUTC>1538679634429</DateTimeUTC>
      <Content>https://ci-linux-mysql.mattermost.com/open-team/messages/5a66ce400955654e0aab50e9f6536a22238cd184</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1538679634429</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1538679634429</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>asaad+9@mattermost.com</LoginName>
      <DateTimeUTC>1538679634429</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538679634429</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jespinog@mattermost.com</LoginName>
      <DateTimeUTC>1538679634429</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+and8oct@mattermost.com</LoginName>
      <DateTimeUTC>1538679634429</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+goog11apr@mattermost.com</LoginName>
      <DateTimeUTC>1538679634429</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+oldgoogleagain@mattermost.com</LoginName>
      <DateTimeUTC>1538679634429</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+onel@mattermost.com</LoginName>
      <DateTimeUTC>1538679634429</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindsay+abc@mattermost.com</LoginName>
      <DateTimeUTC>1538679634429</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>martin+release48-4@mattermost.com</LoginName>
      <DateTimeUTC>1538679634429</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538679634429</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>sudheer@mattermost.com</LoginName>
      <DateTimeUTC>1538679634429</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538679634429</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Group Message">
    <RoomID>group - sspd9foowjdm7qwrbezbkkmpaw</RoomID>
    <StartTimeUTC>1538935976317</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>alice+6@mattermost.com</LoginName>
      <DateTimeUTC>1538935974005</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538935974022</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1538935974037</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538935976317</DateTimeUTC>
      <Content>@jason </Content>
    </Message>
    <ParticipantLeft>
      <LoginName>alice+6@mattermost.com</LoginName>
      <DateTimeUTC>1538935976317</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1538935976317</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1538935976317</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538935976317</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="private c">
    <RoomID>private - g8tbghwnff8nfcmw6txhn83b3r</RoomID>
    <StartTimeUTC>1536192858520</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1530893705460</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1530893875254</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536192858520</DateTimeUTC>
      <Content>posting a message</Content>
    </Message>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536193023436</DateTimeUTC>
      <Content>jjhljkh</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1536193023436</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536193023436</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536193023436</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - d3jbgf4z6j8m8j9nm4rjwtqcow</RoomID>
    <StartTimeUTC>1536265754698</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536264949874</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536264949879</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536265754698</DateTimeUTC>
      <Content>Talked to @jesse-alternate recently? huh?</Content>
    </Message>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536265754698</DateTimeUTC>
      <Content>Talked to @jesse-alternate recently?</Content>
    </Message>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536265754698</DateTimeUTC>
      <Content>Talked to @jesse-alternate recently? huh? ko!</Content>
    </Message>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536265859728</DateTimeUTC>
      <Content>Replying</Content>
    </Message>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536265900284</DateTimeUTC>
      <Content>Hey</Content>
    </Message>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536269785875</DateTimeUTC>
      <Content> Ahahsasdd</Content>
    </Message>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536269785875</DateTimeUTC>
      <Content> Ahahs</Content>
    </Message>
    <Message>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536269800983</DateTimeUTC>
      <Content>jkhkjhkjhkhkjgjhkg</Content>
    </Message>
    <Message>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536269800983</DateTimeUTC>
      <Content>jkhkjhkjh</Content>
    </Message>
    <Message>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536269825681</DateTimeUTC>
      <Content>hlkjhlkjh</Content>
    </Message>
    <Message>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536269834575</DateTimeUTC>
      <Content>hjkjhgkjhg</Content>
    </Message>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536269888049</DateTimeUTC>
      <Content>Shshs</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536269888049</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536269888049</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536269888049</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Group Message">
    <RoomID>group - w3gero4cktgftxqciowtchqfbh</RoomID>
    <StartTimeUTC>1539074531419</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>linda+alice@mattermost.com</LoginName>
      <DateTimeUTC>1539074515945</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1539074515961</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1539074515978</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1539074531419</DateTimeUTC>
      <Content>Post</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>alice@mattermost.com</LoginName>
      <DateTimeUTC>1539074531419</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>linda+alice@mattermost.com</LoginName>
      <DateTimeUTC>1539074531419</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1539074531419</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1539074531419</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - s8hoxqpoubdxdcbx79qf9c9oww</RoomID>
    <StartTimeUTC>1536261259940</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1530892014150</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1530892014155</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1536261259940</DateTimeUTC>
      <Content>eggs</Content>
    </Message>
    <Message>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1536262892966</DateTimeUTC>
      <Content>https://ci-linux-mysql.mattermost.com/dkh-team/pl/wpfnyimjzfdgf8w8o7n6wxshue</Content>
    </Message>
    <Message>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1536263055719</DateTimeUTC>
      <Content>yeah!</Content>
    </Message>
    <Message>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1536263093052</DateTimeUTC>
      <Content>eggs </Content>
    </Message>
    <Message>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1536263103850</DateTimeUTC>
      <Content>you better believe!</Content>
    </Message>
    <Message>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1538768355634</DateTimeUTC>
      <Content>note to self: awesome</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1538768355634</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538768355634</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Group Message">
    <RoomID>group - 96phkrc8zjggfk1xkbkar7biaa</RoomID>
    <StartTimeUTC>1538679029662</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>success+gedtydtgybrgujj6p78zxmbusasimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538678990886</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+kk3browcepyj5j98tehd6rxcjrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538678990904</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+1rae4yficinqffw3ygypqf35nhsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538678990921</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1538678990938</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1538679029662</DateTimeUTC>
      <Content>post</Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1538679058749</DateTimeUTC>
      <Content>fndkflknf</Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1538679063595</DateTimeUTC>
      <Content>bfewkbwefk</Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1538679084794</DateTimeUTC>
      <Content>post</Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1538679167952</DateTimeUTC>
      <Content>@lindsay.abcde </Content>
    </Message>
    <ParticipantLeft>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1538679167952</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+1rae4yficinqffw3ygypqf35nhsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538679167952</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+gedtydtgybrgujj6p78zxmbusasimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538679167952</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+kk3browcepyj5j98tehd6rxcjrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538679167952</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538679167952</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Group Message">
    <RoomID>group - rsfudefqq3yimqhjkawionrfgr</RoomID>
    <StartTimeUTC>1538756248763</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>asaad+1@mattermost.com</LoginName>
      <DateTimeUTC>1525893036513</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1525893036533</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>asaad+65@mattermost.com</LoginName>
      <DateTimeUTC>1525893036553</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1538756248763</DateTimeUTC>
      <Content>https://ci-linux-mysql.mattermost.com/main/pl/fcxcjzpn4pftmyurd9a3fjkonc</Content>
    </Message>
    <Message>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1538756398258</DateTimeUTC>
      <Content>https://ci-linux-mysql.mattermost.com/main/pl/wped99nuofrt5drrbzogokjtic</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>asaad+1@mattermost.com</LoginName>
      <DateTimeUTC>1538756398258</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>asaad+65@mattermost.com</LoginName>
      <DateTimeUTC>1538756398258</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>asaad@mattermost.com</LoginName>
      <DateTimeUTC>1538756398258</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538756398258</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Group Message">
    <RoomID>group - uh8p7548ep8qjy6gut7e7fccja</RoomID>
    <StartTimeUTC>1536166886061</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1536166858452</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+zw3aekuaaffs5c5wnncjq5ag3hsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536166858469</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+4j6oifu37pr5dmdtpp48jmqteesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536166858484</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1536166858502</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1536166886061</DateTimeUTC>
      <Content>m</Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1536166899558</DateTimeUTC>
      <Content>m</Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1536166907060</DateTimeUTC>
      <Content>m</Content>
    </Message>
    <Message>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1536166922881</DateTimeUTC>
      <Content>@anu-leenonen </Content>
    </Message>
    <ParticipantLeft>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1536166922881</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>amy_blais@mattermost.com</LoginName>
      <DateTimeUTC>1536166922881</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4j6oifu37pr5dmdtpp48jmqteesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536166922881</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+zw3aekuaaffs5c5wnncjq5ag3hsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536166922881</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536166922881</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - tj45x79dr3fz7pdu3aycizqjue</RoomID>
    <StartTimeUTC>1536269764029</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536267119619</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesse+1@mattermost.com</LoginName>
      <DateTimeUTC>1536267119623</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536269764029</DateTimeUTC>
      <Content>Hey @jesse0</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>jesse+1@mattermost.com</LoginName>
      <DateTimeUTC>1536269764029</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536269764029</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536269764029</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="newchannel">
    <RoomID>public - 4mgpq6bo8tdwbbnmkiuroekrer</RoomID>
    <StartTimeUTC>1538732371583</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>joram@mattermost.com</LoginName>
      <DateTimeUTC>1530890713957</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1536311795805</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1538732307367</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538732788374</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1538732371583</DateTimeUTC>
      <Content>hello</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538732505473</DateTimeUTC>
      <Content>alsdkjfa</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538732509084</DateTimeUTC>
      <Content>alksjdkjfs</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538733168893</DateTimeUTC>
      <Content>1</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538733169613</DateTimeUTC>
      <Content>2</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538733170258</DateTimeUTC>
      <Content>3</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538733170887</DateTimeUTC>
      <Content>4</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538733171516</DateTimeUTC>
      <Content>5</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538733217745</DateTimeUTC>
      <Content>hello</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538733291133</DateTimeUTC>
      <Content>1</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538733291859</DateTimeUTC>
      <Content>2</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538733292537</DateTimeUTC>
      <Content>3</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538733293209</DateTimeUTC>
      <Content>4</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538733307928</DateTimeUTC>
      <Content>¯\\\_(ツ)\_/¯</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538733426387</DateTimeUTC>
      <Content>test</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538733426387</DateTimeUTC>
      <UserFileName>DSC_7932-006.jpg</UserFileName>
      <FileName>20181005/teams/noteam/channels/4mgpq6bo8tdwbbnmkiuroekrer/users/qqu7z5pcbtycdczx4jetogekro/n849ey1fgjg7xnttm5h6kiehur/DSC_7932-006.jpg</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538733426387</DateTimeUTC>
      <UserFileName>DSC_7932-006.jpg</UserFileName>
      <FileName>20181005/teams/noteam/channels/4mgpq6bo8tdwbbnmkiuroekrer/users/qqu7z5pcbtycdczx4jetogekro/n849ey1fgjg7xnttm5h6kiehur/DSC_7932-006.jpg</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538733426387</DateTimeUTC>
      <Content></Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538733588479</DateTimeUTC>
      <Content>message</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538733612611</DateTimeUTC>
      <Content>post</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538733617215</DateTimeUTC>
      <Content>reply</Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538733659733</DateTimeUTC>
      <Content>:lemon: </Content>
    </Message>
    <Message>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538733678795</DateTimeUTC>
      <Content>:memo: </Content>
    </Message>
    <Message>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1538733807447</DateTimeUTC>
      <Content>hi</Content>
    </Message>
    <Message>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1538733832183</DateTimeUTC>
      <Content>hi</Content>
    </Message>
    <Message>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1539245892822</DateTimeUTC>
      <Content>hey @lindy </Content>
    </Message>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1538732780746</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>joram@mattermost.com</LoginName>
      <DateTimeUTC>1539245892822</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy+51@mattermost.com</LoginName>
      <DateTimeUTC>1539245892822</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindy@mattermost.com</LoginName>
      <DateTimeUTC>1539245892822</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1539245892822</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Group Message">
    <RoomID>group - jq3nf48o57gy7fpsb1g1ba8bga</RoomID>
    <StartTimeUTC>1538759929939</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>harrison+11@mattermost.com</LoginName>
      <DateTimeUTC>1538759927223</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>harrison+1@mattermost.com</LoginName>
      <DateTimeUTC>1538759927239</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538759927256</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538759929939</DateTimeUTC>
      <Content>11</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>harrison+11@mattermost.com</LoginName>
      <DateTimeUTC>1538759929939</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>harrison+1@mattermost.com</LoginName>
      <DateTimeUTC>1538759929939</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>harrison@mattermost.com</LoginName>
      <DateTimeUTC>1538759929939</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538759929939</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Another Public Channel">
    <RoomID>public - kmq7iudn67f6deptnpgbwxmm4h</RoomID>
    <StartTimeUTC>1536174067103</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>jonathan.fritz+462@mattermost.com</LoginName>
      <DateTimeUTC>1515428178066</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jonathan.fritz+46@mattermost.com</LoginName>
      <DateTimeUTC>1515428187490</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jonathan.fritz+4.7nomfa@mattermost.com</LoginName>
      <DateTimeUTC>1518462892350</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindsay@mattermost.com</LoginName>
      <DateTimeUTC>1536173957592</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1536174064273</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1536174067103</DateTimeUTC>
      <Content>psot</Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1536185147842</DateTimeUTC>
      <Content>post</Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1536185720231</DateTimeUTC>
      <Content>That&#39;s great! I *meant* to link to [this](http://example.com) :facepalm: ![Mattermost](https://mattermost.com/wp-content/uploads/2022/02/logoHorizontal.png)</Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1536185733950</DateTimeUTC>
      <Content>That&#39;s great! I *meant* to link to [this](http://example.com) :facepalm: ![Mattermost](https://mattermost.com/wp-content/uploads/2022/02/logoHorizontal.png)</Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1536185760952</DateTimeUTC>
      <Content>That&#39;s great! I *meant* to link to [this](http://example.com) :facepalm: ![Mattermost](https://mattermost.com/wp-content/uploads/2022/02/logoHorizontal.png)</Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1536185769403</DateTimeUTC>
      <Content>That&#39;s great! I *meant* to link to [this](http://example.com) :facepalm: ![Mattermost](https://mattermost.com/wp-content/uploads/2022/02/logoHorizontal.png)</Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1536185800265</DateTimeUTC>
      <Content>That&#39;s great! I *meant* to link to [this](http://example.com) :facepalm: ![Mattermost](https://mattermost.com/wp-content/uploads/2022/02/logoHorizontal.png)</Content>
    </Message>
    <Message>
      <LoginName>lindsay@mattermost.com</LoginName>
      <DateTimeUTC>1537984408829</DateTimeUTC>
      <Content>https://ci-linux-mysql.mattermost.com/b-team/pl/kt59spt1f7y58pe3z7moo1eh1o</Content>
    </Message>
    <Message>
      <LoginName>lindsay@mattermost.com</LoginName>
      <DateTimeUTC>1537984415840</DateTimeUTC>
      <Content>https://ci-linux-mysql.mattermost.com/b-team/channels/channel</Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1537984459936</DateTimeUTC>
      <Content>https://ci-linux-mysql.mattermost.com/b-team/pl/xpp5siq4k7y7uba8u7agmxpp7o</Content>
    </Message>
    <Message>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1537984463652</DateTimeUTC>
      <Content>https://ci-linux-mysql.mattermost.com/b-team/channels/newchannel</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>jonathan.fritz+4.7nomfa@mattermost.com</LoginName>
      <DateTimeUTC>1537984463652</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jonathan.fritz+462@mattermost.com</LoginName>
      <DateTimeUTC>1537984463652</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jonathan.fritz+46@mattermost.com</LoginName>
      <DateTimeUTC>1537984463652</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindsay+a@mattermost.com</LoginName>
      <DateTimeUTC>1537984463652</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>lindsay@mattermost.com</LoginName>
      <DateTimeUTC>1537984463652</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1537984463652</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - gp5kx1zdyjgm7xqs9cdjqweqxh</RoomID>
    <StartTimeUTC>1536182254571</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1536181751853</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+c4bp1itrbpb35mf9348csnzkmosimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536181751858</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1536182254571</DateTimeUTC>
      <Content>@alice.miller </Content>
    </Message>
    <ParticipantLeft>
      <LoginName>paul@mattermost.com</LoginName>
      <DateTimeUTC>1536182254571</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+c4bp1itrbpb35mf9348csnzkmosimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536182254571</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536182254571</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Direct Message">
    <RoomID>direct - xmyt5hp58t8ammag6xfy7npdsw</RoomID>
    <StartTimeUTC>1536280631652</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536280628228</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536280628233</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536280631652</DateTimeUTC>
      <Content>asdfass</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536280638373</DateTimeUTC>
      <Content>sfdgsdfg</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536280667705</DateTimeUTC>
      <Content>sdfgsdg</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536280690831</DateTimeUTC>
      <Content>sdfvfds</Content>
    </Message>
    <Message>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536280762592</DateTimeUTC>
      <Content>test batch sent at 5:39</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>bot@mattermost.com</LoginName>
      <DateTimeUTC>1536280762592</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>eric+2@mattermost.com</LoginName>
      <DateTimeUTC>1536280762592</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536280762592</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="test2">
    <RoomID>public - ft7e9qgcwbybud8b737timcgcc</RoomID>
    <StartTimeUTC>1536291940729</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536291865116</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536291868135</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536291903354</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536291940729</DateTimeUTC>
      <Content>@all hey all</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>jesse+5125125asrasr@mattermost.com</LoginName>
      <DateTimeUTC>1536291940729</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1536291940729</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesse@mattermost.com</LoginName>
      <DateTimeUTC>1536291940729</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536291940729</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="C Channel">
    <RoomID>private - rmpwnkg377dktjcs9wtqmckhxr</RoomID>
    <StartTimeUTC>1536193046141</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1530882494375</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+jun6@mattermost.com</LoginName>
      <DateTimeUTC>1530889141413</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1530889370554</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1530889568516</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>katie+5jul@mattermost.com</LoginName>
      <DateTimeUTC>1530889670399</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536193046141</DateTimeUTC>
      <Content>b,jgh</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>katie+5jul@mattermost.com</LoginName>
      <DateTimeUTC>1536193046141</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie+jun6@mattermost.com</LoginName>
      <DateTimeUTC>1536193046141</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1536193046141</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie+test@mattermost.com</LoginName>
      <DateTimeUTC>1536193046141</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>katie@mattermost.com</LoginName>
      <DateTimeUTC>1536193046141</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536193046141</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="DKH test chan 3">
    <RoomID>public - 5c7xreki3bndzmq66hsxg5atta</RoomID>
    <StartTimeUTC>1537846280103</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1537846261115</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1537846280103</DateTimeUTC>
      <Content>Pickles</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1537846287434</DateTimeUTC>
      <Content>Mustard</Content>
    </Message>
    <Message>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1537846290082</DateTimeUTC>
      <Content>Onions</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>dylan+05072018-a@mattermost.com</LoginName>
      <DateTimeUTC>1537846290082</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1537846290082</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="accc">
    <RoomID>public - fn5h9g5597fn8piw4519z8cpih</RoomID>
    <StartTimeUTC>1538753882442</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1525788964668</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jesse+alternate@mattermost.com</LoginName>
      <DateTimeUTC>1525789059843</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538753882442</DateTimeUTC>
      <Content>asdasd</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538753882442</DateTimeUTC>
      <UserFileName>Vector-based_example.svg</UserFileName>
      <FileName>20181005/teams/noteam/channels/fn5h9g5597fn8piw4519z8cpih/users/p9e3xw8dkbrazqnyt1xshmx8qe/sh9gd9fxtiby8kgks9rbrmeh6y/Vector-based_example.svg</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538753882442</DateTimeUTC>
      <UserFileName>Vector-based_example.svg</UserFileName>
      <FileName>20181005/teams/noteam/channels/fn5h9g5597fn8piw4519z8cpih/users/p9e3xw8dkbrazqnyt1xshmx8qe/sh9gd9fxtiby8kgks9rbrmeh6y/Vector-based_example.svg</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538753969897</DateTimeUTC>
      <Content>https://www.traveller.com.au/content/dam/images/g/u/n/q/h/0/image.related.articleLeadwide.620x349.gunpvd.png/1488330286332.png</Content>
    </Message>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538753974589</DateTimeUTC>
      <Content>![Mattermost](https://docs.mattermost.com/_images/icon-76x76.png =76x76 &#34;Mattermost Icon&#34;)&#xA;</Content>
    </Message>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754152314</DateTimeUTC>
      <Content>https://www.traveller.com.au/content/dam/images/g/u/n/q/h/0/image.related.articleLeadwide.620x349.gunpvd.png/1488330286332.png&#xA;</Content>
    </Message>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754160887</DateTimeUTC>
      <Content>https://www.traveller.com.au/content/dam/images/g/u/n/q/h/0/image.related.articleLeadwide.620x349.gunpvd.png/1488330286332.png&#xA;</Content>
    </Message>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754502378</DateTimeUTC>
      <Content>https://images.pexels.com/photos/67636/rose-blue-flower-rose-blooms-67636.jpeg?cs=srgb&amp;dl=beauty-bloom-blue-67636.jpg&amp;fm=jpg</Content>
    </Message>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754505896</DateTimeUTC>
      <Content>https://images.pexels.com/photos/67636/rose-blue-flower-rose-blooms-67636.jpeg?cs=srgb&amp;dl=beauty-bloom-blue-67636.jpg&amp;fm=jpg</Content>
    </Message>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754568263</DateTimeUTC>
      <Content>https://bit.ly/2NlYsOr</Content>
    </Message>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754575950</DateTimeUTC>
      <Content>https://bit.ly/2wqEbjw</Content>
    </Message>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754715433</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754715433</DateTimeUTC>
      <UserFileName>IMG_5681.JPG</UserFileName>
      <FileName>20181005/teams/noteam/channels/fn5h9g5597fn8piw4519z8cpih/users/p9e3xw8dkbrazqnyt1xshmx8qe/p996bnpphbbu7nba4uksgky4uh/IMG_5681.JPG</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754715433</DateTimeUTC>
      <UserFileName>sample.mov</UserFileName>
      <FileName>20181005/teams/noteam/channels/fn5h9g5597fn8piw4519z8cpih/users/p9e3xw8dkbrazqnyt1xshmx8qe/wnrugqnxhtritc8icdwkkzpnoo/sample.mov</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754715433</DateTimeUTC>
      <UserFileName>IMG_5681.JPG</UserFileName>
      <FileName>20181005/teams/noteam/channels/fn5h9g5597fn8piw4519z8cpih/users/p9e3xw8dkbrazqnyt1xshmx8qe/p996bnpphbbu7nba4uksgky4uh/IMG_5681.JPG</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754715433</DateTimeUTC>
      <UserFileName>sample.mov</UserFileName>
      <FileName>20181005/teams/noteam/channels/fn5h9g5597fn8piw4519z8cpih/users/p9e3xw8dkbrazqnyt1xshmx8qe/wnrugqnxhtritc8icdwkkzpnoo/sample.mov</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754725322</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754725322</DateTimeUTC>
      <UserFileName>sample.pdf</UserFileName>
      <FileName>20181005/teams/noteam/channels/fn5h9g5597fn8piw4519z8cpih/users/p9e3xw8dkbrazqnyt1xshmx8qe/iupjf1qgupn6dguycmdqnf67oc/sample.pdf</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754725322</DateTimeUTC>
      <UserFileName>sample.ppt</UserFileName>
      <FileName>20181005/teams/noteam/channels/fn5h9g5597fn8piw4519z8cpih/users/p9e3xw8dkbrazqnyt1xshmx8qe/yjp35scyitrpzrcgk48p4xzudo/sample.ppt</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754725322</DateTimeUTC>
      <UserFileName>sample.pdf</UserFileName>
      <FileName>20181005/teams/noteam/channels/fn5h9g5597fn8piw4519z8cpih/users/p9e3xw8dkbrazqnyt1xshmx8qe/iupjf1qgupn6dguycmdqnf67oc/sample.pdf</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754725322</DateTimeUTC>
      <UserFileName>sample.ppt</UserFileName>
      <FileName>20181005/teams/noteam/channels/fn5h9g5597fn8piw4519z8cpih/users/p9e3xw8dkbrazqnyt1xshmx8qe/yjp35scyitrpzrcgk48p4xzudo/sample.ppt</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754729847</DateTimeUTC>
      <Content>asdasd</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754729847</DateTimeUTC>
      <UserFileName>sample.pdf</UserFileName>
      <FileName>20181005/teams/noteam/channels/fn5h9g5597fn8piw4519z8cpih/users/p9e3xw8dkbrazqnyt1xshmx8qe/7roaufjkd3btpn565n33p46zrw/sample.pdf</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754729847</DateTimeUTC>
      <UserFileName>sample.pdf</UserFileName>
      <FileName>20181005/teams/noteam/channels/fn5h9g5597fn8piw4519z8cpih/users/p9e3xw8dkbrazqnyt1xshmx8qe/7roaufjkd3btpn565n33p46zrw/sample.pdf</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754734864</DateTimeUTC>
      <Content>asgasgasg</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754734864</DateTimeUTC>
      <UserFileName>sample.ppt</UserFileName>
      <FileName>20181005/teams/noteam/channels/fn5h9g5597fn8piw4519z8cpih/users/p9e3xw8dkbrazqnyt1xshmx8qe/18eqrreu1idwm87o95n3j3h8we/sample.ppt</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754734864</DateTimeUTC>
      <UserFileName>sample.ppt</UserFileName>
      <FileName>20181005/teams/noteam/channels/fn5h9g5597fn8piw4519z8cpih/users/p9e3xw8dkbrazqnyt1xshmx8qe/18eqrreu1idwm87o95n3j3h8we/sample.ppt</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754751559</DateTimeUTC>
      <Content>asdasd</Content>
    </Message>
    <FileTransferStarted>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754751559</DateTimeUTC>
      <UserFileName>sample.pdf</UserFileName>
      <FileName>20181005/teams/noteam/channels/fn5h9g5597fn8piw4519z8cpih/users/p9e3xw8dkbrazqnyt1xshmx8qe/knf1e7b3zfygum7bcsikoah89c/sample.pdf</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754751559</DateTimeUTC>
      <UserFileName>sample.ppt</UserFileName>
      <FileName>20181005/teams/noteam/channels/fn5h9g5597fn8piw4519z8cpih/users/p9e3xw8dkbrazqnyt1xshmx8qe/it7wbn1wnb8xmm5ityt1s61fhc/sample.ppt</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754751559</DateTimeUTC>
      <UserFileName>sample.pdf</UserFileName>
      <FileName>20181005/teams/noteam/channels/fn5h9g5597fn8piw4519z8cpih/users/p9e3xw8dkbrazqnyt1xshmx8qe/knf1e7b3zfygum7bcsikoah89c/sample.pdf</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754751559</DateTimeUTC>
      <UserFileName>sample.ppt</UserFileName>
      <FileName>20181005/teams/noteam/channels/fn5h9g5597fn8piw4519z8cpih/users/p9e3xw8dkbrazqnyt1xshmx8qe/it7wbn1wnb8xmm5ityt1s61fhc/sample.ppt</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754785971</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754785971</DateTimeUTC>
      <UserFileName>IMG_5682.JPG</UserFileName>
      <FileName>20181005/teams/noteam/channels/fn5h9g5597fn8piw4519z8cpih/users/p9e3xw8dkbrazqnyt1xshmx8qe/c8971r1qgj8bpbnqmhn7aqotzr/IMG_5682.JPG</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754785971</DateTimeUTC>
      <UserFileName>IMG_5682.JPG</UserFileName>
      <FileName>20181005/teams/noteam/channels/fn5h9g5597fn8piw4519z8cpih/users/p9e3xw8dkbrazqnyt1xshmx8qe/c8971r1qgj8bpbnqmhn7aqotzr/IMG_5682.JPG</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754834776</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754834776</DateTimeUTC>
      <UserFileName>ScreenRecording_09-06-2018 16-32-20.MP4</UserFileName>
      <FileName>20181005/teams/noteam/channels/fn5h9g5597fn8piw4519z8cpih/users/p9e3xw8dkbrazqnyt1xshmx8qe/bmpqukfk6in99gufh97spoa5gw/ScreenRecording_09-06-2018 16-32-20.MP4</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754834776</DateTimeUTC>
      <UserFileName>ScreenRecording_09-06-2018 16-47-38.MP4</UserFileName>
      <FileName>20181005/teams/noteam/channels/fn5h9g5597fn8piw4519z8cpih/users/p9e3xw8dkbrazqnyt1xshmx8qe/cup4txqxu7n68fg1xnidtr796c/ScreenRecording_09-06-2018 16-47-38.MP4</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754834776</DateTimeUTC>
      <UserFileName>ScreenRecording_09-06-2018 17-10-46.MP4</UserFileName>
      <FileName>20181005/teams/noteam/channels/fn5h9g5597fn8piw4519z8cpih/users/p9e3xw8dkbrazqnyt1xshmx8qe/bgsffkgofpn1mq73uth3s7gkce/ScreenRecording_09-06-2018 17-10-46.MP4</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754834776</DateTimeUTC>
      <UserFileName>ScreenRecording_09-06-2018 23-48-33.MP4</UserFileName>
      <FileName>20181005/teams/noteam/channels/fn5h9g5597fn8piw4519z8cpih/users/p9e3xw8dkbrazqnyt1xshmx8qe/bue9c5hao7dcfkfrembcbhunsc/ScreenRecording_09-06-2018 23-48-33.MP4</FileName>
    </FileTransferStarted>
    <FileTransferStarted>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754834776</DateTimeUTC>
      <UserFileName>ScreenRecording_09-06-2018 17-33-20.MP4</UserFileName>
      <FileName>20181005/teams/noteam/channels/fn5h9g5597fn8piw4519z8cpih/users/p9e3xw8dkbrazqnyt1xshmx8qe/ctgrwj1w5tyk38q9yis8wd5znc/ScreenRecording_09-06-2018 17-33-20.MP4</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754834776</DateTimeUTC>
      <UserFileName>ScreenRecording_09-06-2018 16-32-20.MP4</UserFileName>
      <FileName>20181005/teams/noteam/channels/fn5h9g5597fn8piw4519z8cpih/users/p9e3xw8dkbrazqnyt1xshmx8qe/bmpqukfk6in99gufh97spoa5gw/ScreenRecording_09-06-2018 16-32-20.MP4</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754834776</DateTimeUTC>
      <UserFileName>ScreenRecording_09-06-2018 16-47-38.MP4</UserFileName>
      <FileName>20181005/teams/noteam/channels/fn5h9g5597fn8piw4519z8cpih/users/p9e3xw8dkbrazqnyt1xshmx8qe/cup4txqxu7n68fg1xnidtr796c/ScreenRecording_09-06-2018 16-47-38.MP4</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754834776</DateTimeUTC>
      <UserFileName>ScreenRecording_09-06-2018 17-10-46.MP4</UserFileName>
      <FileName>20181005/teams/noteam/channels/fn5h9g5597fn8piw4519z8cpih/users/p9e3xw8dkbrazqnyt1xshmx8qe/bgsffkgofpn1mq73uth3s7gkce/ScreenRecording_09-06-2018 17-10-46.MP4</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754834776</DateTimeUTC>
      <UserFileName>ScreenRecording_09-06-2018 23-48-33.MP4</UserFileName>
      <FileName>20181005/teams/noteam/channels/fn5h9g5597fn8piw4519z8cpih/users/p9e3xw8dkbrazqnyt1xshmx8qe/bue9c5hao7dcfkfrembcbhunsc/ScreenRecording_09-06-2018 23-48-33.MP4</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <FileTransferEnded>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754834776</DateTimeUTC>
      <UserFileName>ScreenRecording_09-06-2018 17-33-20.MP4</UserFileName>
      <FileName>20181005/teams/noteam/channels/fn5h9g5597fn8piw4519z8cpih/users/p9e3xw8dkbrazqnyt1xshmx8qe/ctgrwj1w5tyk38q9yis8wd5znc/ScreenRecording_09-06-2018 17-33-20.MP4</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538754936672</DateTimeUTC>
      <Content>https://ci-linux-mysql.mattermost.com/files/bmpqukfk6in99gufh97spoa5gw/public?h=hvJvFtSs7snIfnLgH9DzJKtNDBPKziricuvCRuPcrHc</Content>
    </Message>
    <Message>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538755143971</DateTimeUTC>
      <Content></Content>
    </Message>
    <FileTransferStarted>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538755143971</DateTimeUTC>
      <UserFileName>ScreenRecording_09-06-2018 16-32-20.MP4</UserFileName>
      <FileName>20181005/teams/noteam/channels/fn5h9g5597fn8piw4519z8cpih/users/p9e3xw8dkbrazqnyt1xshmx8qe/c9g7qid73t8xxpka671t89a6wo/ScreenRecording_09-06-2018 16-32-20.MP4</FileName>
    </FileTransferStarted>
    <FileTransferEnded>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538755143971</DateTimeUTC>
      <UserFileName>ScreenRecording_09-06-2018 16-32-20.MP4</UserFileName>
      <FileName>20181005/teams/noteam/channels/fn5h9g5597fn8piw4519z8cpih/users/p9e3xw8dkbrazqnyt1xshmx8qe/c9g7qid73t8xxpka671t89a6wo/ScreenRecording_09-06-2018 16-32-20.MP4</FileName>
      <Status>Completed</Status>
    </FileTransferEnded>
    <ParticipantLeft>
      <LoginName>jesse+alternate@mattermost.com</LoginName>
      <DateTimeUTC>1538755143971</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>jesse+newest@mattermost.com</LoginName>
      <DateTimeUTC>1538755143971</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538755143971</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="martin_test2">
    <RoomID>public - tyh17ryaeigpprqh85gzsk4iha</RoomID>
    <StartTimeUTC>1538768089632</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1538768089632</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1538768089632</DateTimeUTC>
      <Content>asdf</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>martin+test1@mattermost.com</LoginName>
      <DateTimeUTC>1538768089632</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538768089632</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Group Message">
    <RoomID>group - u6tkbhozfinffdkryxcy3ikxia</RoomID>
    <StartTimeUTC>1536165633654</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>success+4j6oifu37pr5dmdtpp48jmqteesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536165108790</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+qzkhdqezoi84jgxyroegmhwqcrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536165108807</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+zw3aekuaaffs5c5wnncjq5ag3hsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536165108824</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+1rae4yficinqffw3ygypqf35nhsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536165108847</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+mmcu65jphfgktruyhiu734t9bwsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536165108863</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+k163actt7fynpexxp37r1d8rkcsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536165108879</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1536165108895</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1536165633654</DateTimeUTC>
      <Content>h&#xA;</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1536165635300</DateTimeUTC>
      <Content>hh</Content>
    </Message>
    <Message>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1536165636855</DateTimeUTC>
      <Content>h</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>amy.blais@mattermost.com</LoginName>
      <DateTimeUTC>1536165636855</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+1rae4yficinqffw3ygypqf35nhsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536165636855</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+4j6oifu37pr5dmdtpp48jmqteesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536165636855</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+k163actt7fynpexxp37r1d8rkcsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536165636855</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+mmcu65jphfgktruyhiu734t9bwsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536165636855</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+qzkhdqezoi84jgxyroegmhwqcrsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536165636855</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+zw3aekuaaffs5c5wnncjq5ag3hsimulator.amazonses.com</LoginName>
      <DateTimeUTC>1536165636855</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1536165636855</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="Group Message">
    <RoomID>group - z6njxkreobgmmnyh5mbxq5ejhy</RoomID>
    <StartTimeUTC>1538690014662</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>success+dojjf4o7ppyrudbewb7z8r98tesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538689992909</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>success+5pcbjcto9bgipfbb4hb6qxrq7asimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538689992926</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1538689992942</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1538690014662</DateTimeUTC>
      <Content>Vzzbbzb</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>jason@mattermost.com</LoginName>
      <DateTimeUTC>1538690014662</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+5pcbjcto9bgipfbb4hb6qxrq7asimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538690014662</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>success+dojjf4o7ppyrudbewb7z8r98tesimulator.amazonses.com</LoginName>
      <DateTimeUTC>1538690014662</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538690014662</EndTimeUTC>
  </Conversation>
  <Conversation Perspective="sudheer+test">
    <RoomID>public - cr9jbcu4ntn78d3xr38n61frfw</RoomID>
    <StartTimeUTC>1538729606318</StartTimeUTC>
    <ParticipantEntered>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1533751705534</DateTimeUTC>
    </ParticipantEntered>
    <ParticipantEntered>
      <LoginName>lindsay@mattermost.com</LoginName>
      <DateTimeUTC>1536173984849</DateTimeUTC>
    </ParticipantEntered>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538729606318</DateTimeUTC>
      <Content>asas</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538729609655</DateTimeUTC>
      <Content>asdsd</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538729646182</DateTimeUTC>
      <Content>asd</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538730417113</DateTimeUTC>
      <Content>https://amazon.ca</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538730427209</DateTimeUTC>
      <Content>https://wayfair.com</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538730434083</DateTimeUTC>
      <Content>https://www.pathofexile.com/game</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538730441727</DateTimeUTC>
      <Content>https://github.com/wix/react-native-calendars/pull/620</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538730502950</DateTimeUTC>
      <Content>https://www.bbc.com/news/uk-wales-45142614</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538731587425</DateTimeUTC>
      <Content>:man: </Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538731592906</DateTimeUTC>
      <Content>:facepunch: </Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538731608385</DateTimeUTC>
      <Content>asds :facepunch: </Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538731657334</DateTimeUTC>
      <Content>asdsd</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538731660220</DateTimeUTC>
      <Content>asdasd</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538731660220</DateTimeUTC>
      <Content>asdasd&#xA;&#xA;asdasd&#xA;&#xA;asdasd&#xA;&#xA;asdasd&#xA;&#xA;&#xA;asdasd&#xA;&#xA;asdasd&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;asdasd</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538731807026</DateTimeUTC>
      <Content>asdads&#xA;```&#xA;adasd&#xA;asdsd&#xA;```</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538731842519</DateTimeUTC>
      <Content>dasdasd&#xA;```&#xA;asdasd&#xA;dadas&#xA;```</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538731868411</DateTimeUTC>
      <Content>sadasd&#xA;```&#xA;sadasd&#xA;```</Content>
    </Message>
    <Message>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538732018322</DateTimeUTC>
      <Content>asdsd</Content>
    </Message>
    <ParticipantLeft>
      <LoginName>lindsay@mattermost.com</LoginName>
      <DateTimeUTC>1538732018322</DateTimeUTC>
    </ParticipantLeft>
    <ParticipantLeft>
      <LoginName>sudheer.105@mattermost.com</LoginName>
      <DateTimeUTC>1538732018322</DateTimeUTC>
    </ParticipantLeft>
    <EndTimeUTC>1538732018322</EndTimeUTC>
  </Conversation>
</FileDump>
source/recipes/product-vulnerability-incident.rst METASEP
:orphan:

.. This page is intentionally not accessible via the LHS

Mattermost Recipe: How to use Mattermost for product vulnerability incidents
============================================================================

Problem
-------

After getting access to your Mattermost instance, you’d like to set up a workflow for security incident handling using Mattermost. Visit our `deployment section <https://mattermost.com/deploy/>`__ if you want to learn more about how to deploy your own Mattermost instance.

Solution
--------

This guide walks through the set up of a product security incident room using the Mattermost `Playbooks <https://docs.mattermost.com/guides/playbooks.html>`__ and `Channels <https://docs.mattermost.com/guides/channels.html>`__ with voice calling and screen sharing functionalities.

1. Workspace setup
~~~~~~~~~~~~~~~~~~

For Cloud customers, all the functionalities works out-of-the-box with no technical setup. Simply invite your team members to your workspace and move onto the next section. For self-hosted deployments, refer to `the calls configuration documentation <https://docs.mattermost.com/configure/configuration-settings.html#calls-beta>`__ to configure voice calling and screen sharing.

2. Playbooks setup
~~~~~~~~~~~~~~~~~~

Now that your workspace and teammates are ready, the next step is to create a playbook for incident handling. For this recipe, we're using an adapted playbooks template used by the Mattermost Product Security team that's available for `download here <https://github.com/mattermost/mattermost-security/blob/master/product_security/playbooks/security_vulnerability_playbook.json>`__.

After downloading the template above, connect to your Mattermost workspace. Then open the product menu and select **Playbooks**.

.. image:: ../images/recipe/prod-vuln-incident1.png
   :alt: ..

Next, open the **Playbooks** menu, select **Import**, and navigate to the file you downloaded.

.. image:: ../images/recipe/prod-vuln-incident2.png
   :alt: ..

When you've imported the file, you should have a new playbook called **Security Vulnerability Playbook**. Select the three dots to edit the playbook.

.. image:: ../images/recipe/prod-vuln-incident3.png
   :alt: ..

Modify any tasks or actions to suit your use case. In our scenario, we’ve assigned the playbook owner role by default to Alice and added three other team members to be automatically added in the **Actions** tab. We recommend changing these to the members of your security team.

.. image:: ../images/recipe/prod-vuln-incident4.png
   :alt: ..

Select **Save**. Then, hit **Run**.

.. image:: ../images/recipe/prod-vuln-incident5.png
   :alt: ..

Set the title on a scenario that makes sense for your environment and select **Start Run** to create a new channel and invite the members as you’ve predefined.

.. image:: ../images/recipe/prod-vuln-incident6.png
   :alt: ..

3. Using calls for voice chat and screen sharing
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

For Mattermost Professional and Enterprise customers, you can select **Start call** in the run channel header to kick-off a channel call. The call can only be joined by participants of the incident channel.

.. image:: ../images/recipe/prod-vuln-incident7.png
   :alt: ..

In the bottom-left corner of Mattermost, select the expand icon to open a separate pop-out window for the call, with additional options to start presenting.

.. image:: ../images/recipe/prod-vuln-incident8.png
   :alt: ..

For Mattermost Team Edition, only 1:1 calls are supported. Open a direct message with another incident responder and follow the same steps as above. 

.. note:: 
   
   Want to try out calls? Select **Start call** in the incident channel to start a free 30-day trial of Mattermost Enterprise to enable this functionality for all channels.

Discussion
----------

Using Mattermost Playbooks you can ensure a streamlined approach to incident resolution. Our playbook template walks through a typical product vulnerability remediation aims to provide a structure resolution and also keeping the right stakeholder informed.

The playbook starts with a **Triage** stage that verifies the validity of the issue, continues with an **Investigation** of exploitation (if possible) and follows with an active **Remediation** of the issue. After the issue is mitigated, the incident can go into **Resolution** and be closed with an incident post-mortem.

When running the playbook, you can add key events, such as messages, to the timeline for easier reporting. To do so, select the app icon when hovering over a message.

.. image:: ../images/recipe/prod-vuln-incident9.png
   :alt: ..

Give it a short summary that will be shown on the incident overview, with the ability to jump to the message linked.

.. image:: ../images/recipe/prod-vuln-incident10.png
   :alt: ..

The timeline is a great feature to provide an overview of the most significant events for both active and previous events for both responders and for management.

The process and playbook shared here is only the starting point for your unique environment. By `customizing the playbooks <https://mattermost.com/blog/getting-started-with-playbooks/>`__ and `adding additional integrations <https://mattermost.com/blog/how-to-make-your-incident-response-plan-with-mattermost/>`__ to automatically be notified about new incidents you can further accelerate your response times. Additional integrations with SIEM solutions and platforms such as HackerOne will be released in the next months.

source/playbooks/setting-up-playbooks.rst METASEP
Create a playbook
==================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:
  
Playbooks help streamline and manage complex processes while decreasing the risk of forgotten steps or tasks. They also support tool integration, status updates in a dedicated channel, and can be edited on the fly. When a playbook run is finished, you can review the entire run to assess any areas of improvement for the next run.

Playbooks are made up of:

- **Checklists:** The list of tasks to be completed for the run. Checklists can be edited ad-hoc during a run.
- **Templates:** Templates for frequently-used actions such as updates and reminders. You can create your own templates or use default ones.
- **Actions:** Automation options for inviting members, webhooks, welcome messages, channel export settings, and more.
- **Permissions:** Manage permissions at a channel and a playbook level.

Make checklists
----------------

1. Open Playbooks and select the **Playbooks** tab.
2. Start a **Blank Playbook**, or use the built-in template.
3. Name your playbook and provide a description.
4. Select the **Checklists** tab.

  You can start with the default checklist and edit it or you can delete it and select **+ New checklist**.

    * Within each checklist, select **+ New task** to add tasks that are meant to be completed together.
    * Drag and drop to reorganize checklists and tasks.
    * Add task descriptions to give additional context to members of the playbook. Descriptions support a limited form of Markdown, including text styling and hyperlinks.
    * Add a slash command to the task that can be executed by members of the playbook as needed.

5. Choose **Save**.
  
Configure templates
-------------------

Templates are standardized sets of content that are used for communicating reminders and updates. Open Playbooks and select the **Templates** tab.

Broadcast channels
~~~~~~~~~~~~~~~~~~

Setting up a dedicated broadcast channel is an easy way to centralize status updates, decrease noise, and remember where everything is. Configure a broadcast channel to which status updates will be copied. If you are not a member of the configured broadcast channel, **Unknown Channel** is displayed instead of the channel name.

Reminder timers
~~~~~~~~~~~~~~~

Configure the default reminder timer used to prompt for regular updates. The reminder timer may be changed when a status update is written.

Update templates
~~~~~~~~~~~~~~~~

Configure a template to use for the first status update. Subsequent status updates will start with the text of the most recent update.

Define actions
--------------

You can customize actions associated with your playbook by setting up keyword triggers, automate member invites, and add a welcome message for new members.

Select the **Actions** tab to view the automation options available.

Keywords
~~~~~~~~

When you use the **Keywords** action any team member who has access to the playbook and who uses one of the listed keywords will see a message like this:

.. image:: ../images/Playbook-keyword-monitoring.png
   :alt: Set up keyword triggers to run playbooks when specified keywords are detected in Channel posts.

If you find your keywords result in too many false positives, consider refining your list and also consider that URLs used by run members may also contain monitored keywords.

Webhooks
~~~~~~~~

- For information about the webhook payload for run start, see the `PlaybookRunWebhookPayload struct <https://github.com/mattermost/mattermost-plugin-playbooks/blob/b4c8058d8660efe35050bc7eb080e3819c7ab09c/server/app/playbook_run_service.go#L176-L185>`_. An example of the JSON payload for a run start `is available here <https://gist.github.com/icelander/b68f2bf2b4ffefec93400cb050211cf1>`_.
- For information about the webhook payload for status update, see the `PlaybookRunWebhookPayload struct <https://github.com/mattermost/mattermost-plugin-playbooks/blob/b4c8058d8660efe35050bc7eb080e3819c7ab09c/server/app/playbook_run_service.go#L176-L185>`_. An example JSON payload for a status update `is available here <https://gist.github.com/icelander/2f9938ad68d1e0aa656f97969895d080>`_.

Set permissions
---------------

1. Go to **product menu > Playbooks**, and then select **Permissions**.

 * **Channel access**: Decide whether the automatically-created channel should be Public or Private within the team.
 * **Playbook access**: Share this playbook with other members of the team to allow them to use the playbook to start a run, as well as edit the playbook.

Edit a playbook
---------------

You can change a playbook's configuration at any time, but changes will only be applied to future incidents. Ongoing or ended incidents previously started from that playbook remain unchanged.

1. Go to **product menu > Playbooks**.
2. Find the playbook to be edited.

 * Only playbooks of which you are a member are listed. System Admins have unrestricted access to all playbooks on the team.

3. Select the name of the playbook.

 * To edit the playbook directly select the **Actions** menu next to the playbook name, then select **Edit**.
 * To access the playbook dashboard, select the hyperlinked playbook name.

4. Configure the playbook the same way a playbook is created or edited.

Copying and reusing playbooks
-----------------------------

Playbooks are repeatable workflows and sometimes it's easier to copy and improve rather than start from scratch. You can do this by duplicating a playbook in the **Playbooks** screen. Select the **...** under **Actions** and then select **Duplicate**. The copied playbook will have **Copy of** appended to its original name which you can edit.

To import a playbook, go to the **Playbooks** screen, select **Import**. Choose the team you're importing to, then select the JSON file. You can also export any playbook to JSON to easily share with other Mattermost servers.

source/playbooks/running-playbooks.rst METASEP
Run a playbook
==============

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

You can start a playbook run using the **Toggle Playbook List** icon in a channel header. Then, select the **Run** icon next to a playbook name. You will be assigned as the run owner, and taken to a new channel created for your run.


Lastly, if you've configured a broadcast channel and enabled it, when the playbook run is created it's announced in the associated channel by the Playbook Bot.
 

.. image:: ../images/Playbook-dashboard.png
   :alt: View and track playbook information.

Join a playbook run
-------------------

Open Playbooks to see a list of runs, to which you have access. If the channel is public, you can join it without permission.

If the run is private, an existing member must invite you to the corresponding channel.

Work with checklists
~~~~~~~~~~~~~~~~~~~~

Checklists contain tasks - they can be pre-configured task templates and they can also be added, edited, and removed as needed during an active run. Any member of the playbook run can work with tasks. Note that if you edit, add, or delete a task during an active run it applies only to that run. The change isn't applied to the playbook. If you decide to retain that change, edit the playbook's checklist for use with subsequent runs.

If you aren't able to open the checklists to see completed tasks, hover over any area of the checklist. Then in the top right corner, select the filter icon. Under the **Task State** section, select **Show checked tasks**.

* To mark a task as completed, select the unchecked checkbox next to the task. To undo this, clear the checkbox.
* To assign a task to a member of the incident channel, select **No Assignee** (or the existing assignee's username), then select a user.
* To view any description associated with a task, select the information icon to the right of the task name.
* To execute a slash command associated with a task, select **Run** next to the listed slash command. Configured slash commands may be run as often as necessary.

.. image:: ../images/IC-ad-hoc-tasks.gif

Change owners
~~~~~~~~~~~~~

To change playbook owners you can run the ``/playbook owner @username`` slash command from within the run's channel. To change the owner to a user who is not in the channel, first add the user to the channel.

Status updates 
--------------

Status updates ensure that stakeholders remain informed about the playbook run's progress. To post a status update:

1. Select **Toggle Playbook List** from the channel header.
2. Open the run you want to update and select **Go to channel**.
3. Select **Post update**.

 * If this is the first status update and the playbook has a defined template, that template will be pre-populated here.
 * If this is a subsequent status update, the message from the last status update will be pre-populated here.

4. Select a status and add a Markdown-formatted message.
5. Optionally set a reminder to prompt for the next status update.

 * If this is the first status update and the playbook has a defined default reminder timer, that timer will be pre-selected here.
 * If this is a subsequent status update, the last reminder timer will be pre-populated here.

6. Select **Post** to post your status update.

 * Status updates are posted to the run channel as a message from the person posting it.
 * If the playbook has a defined broadcast channel, status updates are copied to the broadcast channel as a message from the Playbooks bot.

The most recent status post will also appear in the right-hand sidebar of the run channel. To correct or remove a status post, edit or delete the post as needed. Note that status updates that are broadcast to another channel won't be updated or removed if the original post is edited or deleted.

End a playbook run
------------------

To end a playbook run, navigate to the run's channel.

1. Select **Toggle Run Details** in the channel header to open the right-hand sidebar.
2. Scroll down to the bottom of the right-hand sidebar.
3. Select **Finish run** and confirm.
4. Next, complete the retrospective.

Ending a playbook run signals to all members of the channel that the playbook run is complete. Team members can continue to post in the channel but no changes can be made.

Slash commands
--------------

Slash commands are available for playbooks. The ``/playbook`` slash command allows interaction with incidents via the post textbox on desktop, browser, and mobile. To run a playbook use the ``/playbook start`` slash command from any channel.

Available slash commands include:

- ``/playbook start`` - Start a playbook run.
- ``/playbook end`` - End a playbook run.
- ``/playbook update`` - Update the current playbook run's status.
- ``/playbook restart`` - Restart an ended playbook run.
- ``/playbook check [checklist item]`` - Check/uncheck the specified task.
- ``/playbook announce ~[channels]`` - Announce the current playbook run in other channels.
- ``/playbook list`` - List all your ongoing playbook runs.
- ``/playbook owner [@username]`` - Show or change the current playbook run owner.
- ``/playbook info`` - Show a summary of the current playbook's activities.

source/playbooks/reusing-and-sharing-playbooks.rst METASEP
Reuse and share playbooks
=========================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Playbooks are repeatable workflows and sometimes it’s easier to copy and improve rather than start from scratch. 

You can do this by duplicating a playbook in the Playbooks screen. Select the **...** under **Actions** and then select **Duplicate**. The copied playbook will have **Copy of** appended to its original name which you can edit.

To import a playbook, go to the Playbooks screen, and select **Import**. Choose the team you’re importing to, then select the JSON file. You can also export any playbook to JSON to easily share with other Mattermost servers.

Channel export
^^^^^^^^^^^^^^

Exporting the contents of a channel requires the channel export plugin. See the `Channel Export plugin documentation <https://mattermost.gitbook.io/channel-export-plugin>`_ for more information.

.. note::

   Channel export is only available to Mattermost Enterprise customers. For more information, visit `https://mattermost.com/pricing <https://mattermost.com/pricing>`_.

source/playbooks/playbook-permissions.rst METASEP
Roles and permissions
=====================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

There are different ways for teams to access and interact with playbooks. This is managed in the System Console using permissions. Permissions can be granted in a variety of ways, to allow for different combinations of access and visibility.

Permissions are provided using:

* **System Scheme:** Applies permissions universally across all teams, channels, and playbooks.
* **Team Override Schemes:** Allow admins to customize permissions for each team (available in Mattermost Professional and Enterprise).

For more information about System and Team Override Schemes, refer to the `Advanced Permissions <https://docs.mattermost.com/onboard/advanced-permissions.html>`__ documentation.

.. note::

   Some permissions functionality is only available to Mattermost Enterprise customers. For more information, visit `https://mattermost.com/pricing <https://mattermost.com/pricing>`__.
   
In the context of Playbooks, members are assigned a role and based on the selected permissions, this determines how they interact with Playbooks. A member can be a member of one playbook, and an admin of another. This allows for granular permissions across teams and departments. For example, setting playbook visibility so only certain teams can view it, or setting permissions to allow an organization to view a playbook but only designated team members can make edits.

Permissions are applied only to playbooks - there are no permissions that are specific to runs.

Playbook roles
---------------

**Member**

In the context of Playbooks, members are users of Mattermost who are added to a playbook.

**Playbook Admin**

In the context of Playbooks, Playbook Admins are also members, and may have elevated permissions to change playbook and run visibility as well as functional settings. They do not have access to the System Console and their privileges are managed by the System Admin. Members need to be promoted to the role from within Playbooks. The Playbook Admin role is applied per playbook.

.. note::

   Before you make system or team changes to permissions, ensure that you don't lose access to your existing playbooks. Navigate to the playbook you're a member of. Select the **Manage Access** icon and change your role from **Member** to **Admin**.

Playbooks permissions
---------------------

The default Playbooks settings are completely open which enable all members to participate in runs, edit playbooks, view runs and playbooks, remove other members from runs, edit actions, and make other changes. Permissions provide better control over confidential runs and playbooks, as well as member management. Note that even with the default settings, private playbooks restrict these actions to members of the playbook.

Create read-only playbooks
~~~~~~~~~~~~~~~~~~~~~~~~~~

In the following example, only Playbook Admins can edit playbooks. Other users can view public playbooks and private playbooks of which they are a member, but can't edit any playbook or change playbook memberships.

1. Go to **System Console > User Management > Permissions**.
2. In the **All Members** section, uncheck **Manage Public Playbooks** and uncheck **Manage Private Playbooks**.
3. Scroll down to the **Playbook Admin** section and confirm that **Manage Public Playbooks** and **Manage Private Playbooks** are checked.
4. Select **Save**.

Restrict who can create playbooks
---------------------------------

You can also set permissions for read-only playbooks that do allow members to create new public or private playbooks.

1. Go to **System Console > User Management > Permissions**.
2. In the **All Members** section, uncheck **Manage Public Playbooks** and uncheck **Manage Private Playbooks**.
3. Then, check **Create Public Playbook** and **Create Private Playbook**.
4. Select **Save**.

I want to restrict who can convert playbooks from public to private
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

You can control whether Members can convert playbooks from public to private.

1. Go to **System Console > User Management > Permissions**.
2. In the **All Members** section, check **Convert Playbooks**.
3. Select **Save**.

Alternatively, to restrict this action so only Playbook Admins can convert playbooks from public to private, uncheck the setting above and:

1. Go to **System Console > User Management > Permissions**.
2. Scroll down to **Playbook Admin**.
3. Check **Convert Playbooks**.
4. Select **Save**.

I want to control who starts a run
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

By default, all Members can start a run using a playbook. You can restrict this so that only Playbook Admins can start a run. Note that with this configuration, Members are not able to start runs or edit playbooks.

1. Go to **System Console > User Management > Permissions**.
2. In the **All Members** section, uncheck **Manage Runs**. This also unchecks **Create Runs**.
3. Scroll down to **Playbook Admin** and ensure that **Manage Runs** is checked.
4. Select **Save**.

If you want to continue to allow Members to edit playbooks, an alternative to this configuration is to make the playbook private.

source/playbooks/overview.rst METASEP
Overview
========

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Mattermost Playbooks is a collaboration tool that defines a repeatable process to enable teams to achieve specific and predictable outcomes. With playbooks, development teams can orchestrate prescribed workflows and define, streamline, and document complex, recurring operations.

Mattermost Playbooks is included in Mattermost self-hosted and Mattermost Cloud workspace. You can access Playbooks via the product menu in the top-left corner of Mattermost.

To find all playbook runs, open **Product menu > Playbooks**, and then select any playbook name. Next, select **Runs** from the navigation bar, then choose a run to view its overview. Select **Go to channel** to open the run’s channel.

Each playbook represents a recurring outcome or specific goal that your teams collaborate on to achieve, such as service outage recovery or customer onboarding. 

Playbooks are made up of:

- **Checklists**: The list of tasks to be completed for the run. `Checklists <https://docs.mattermost.com/playbooks/customize-a-playbook.html#make-checklists>`_ can be edited ad-hoc during a run.
- **Templates**: `Templates <https://docs.mattermost.com/playbooks/overview.html#templates>`_ for frequently-used actions such as updates and reminders. You can create your own templates or use default ones.
- **Actions**: `Automation options <https://docs.mattermost.com/playbooks/customize-a-playbook.html#actions>`_ for inviting members, creating webhooks, editing welcome messages, and more.
- **Permissions**: Manage :doc:`permissions </playbooks/playbook-permissions>` at a channel and a playbook level.

Teams run a playbook every time they want to orchestrate people, tools, and data to achieve that outcome as quickly as possible while providing visibility to stakeholders. 

For participants, it prescribes processes such as task checklists, status updates, and retrospective reports. For integrated tools, it configures the triggers to perform automated actions. And for stakeholders, it provides a single pane of glass for visibility into each run as well as aggregate insights over time.

Playbooks also allow teams to incorporate learnings from the retrospective to tweak and improve the playbook with every iteration.

What’s a playbook?
^^^^^^^^^^^^^^^^^^

A playbook is a checklist of the tasks that make up your processes. These tasks can range from at-mentioning a team member, to using a slash command to start a Zoom call. Tasks can be assigned to users, they can be given due dates.

There are other parts of a playbook, such as automation settings, and metrics. But the very first thing you’ll want to set up is a checklist.

Each time you use the process you’ve documented, such as onboarding a new customer, the playbook is used to start a run - a discrete single use of the process - and that run is captured in a dedicated channel. 

Setting up a playbook includes configuring how the playbook manages the creation of its channel as well as how stakeholders are notified.
To open a playbook and view its statistics, select the playbook name. To begin a run using a specific playbook, select **Run** beside that playbook’s name.

Templates
~~~~~~~~~

Creating a playbook from scratch can be daunting, even if you have the process mapped out. One way to get started quickly is to use one of the pre-configured templates available. These templates are populated with content and settings to provide guidance and are customizable.

Playbook templates are basic workflows that you can use to get started quickly. As you learn more about your workflows, you can customize them into specific playbooks.

What’s a run?
^^^^^^^^^^^^^

To access runs, select the product menu in the top-left corner of Mattermost, then select **Playbooks**. In the runs list, you can select a run to view more details, such as the overview and retrospective. This is an easy way to assess all the active runs to which you have access.

View run details
~~~~~~~~~~~~~~~~

When you’re in a channel with an active run, select the **Toggle Run Details** icon in the channel header to open the right-hand pane to view the run details. Information such as run name and description can be edited in-line, and the checklists can be collapsed and filtered based on their status.

source/playbooks/notifications-and-updates.rst METASEP
Notifications and updates
=========================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

There are multiple ways to receive updates and notifications.

Status updates
--------------

Status updates ensure that stakeholders remain informed about the playbook run’s progress. To post a status update:

1. Select **Toggle Playbook List** from the channel header.
2. Select **Post update**.

   - If this is the first status update and the playbook has a defined template, that template will be pre-populated here.
   - If this is a subsequent status update, the message from the last status update will be pre-populated here.

3. Optionally set a reminder to prompt for the next status update.

   - If this is the first status update and the playbook has a defined default reminder timer, that timer will be pre-selected here.
   - If this is a subsequent status update, the last reminder timer will be pre-populated here.

4. Select **Post update** to post your status update.

If the playbook has a defined broadcast channel, status updates are copied to the broadcast channel as a message from the Playbooks bot.
The most recent status post will also appear in the right-hand sidebar of the run channel. To correct or remove a status post, edit or delete the post as needed. Note that status updates that are broadcast to another channel won’t be updated or removed if the original post is edited or deleted.

Follow runs and playbooks
-------------------------

Follow specific playbooks to receive updates on important events such as when a run is started and finished, as well as status and retrospective updates every time that playbook is run. This is a good option if you’re interested in all instances of a specific workflow, such as an outage resolution playbook.

As a stakeholder, you can also choose to follow only a specific run. This means that while you don’t have to participate in the run, you’ll receive updates and can decide what, if any, actions to take. This is a good option if you’re only interested in a single instance of a procedure. For example, you may want to only follow customer onboarding for one specific customer instead of all onboarding runs.

Daily digest
------------

To help you keep track of your runs, tasks, and statuses, a daily digest is sent via direct message in Mattermost.

Running playbooks in multiple channels can be overwhelming. The daily digest is sent once a day, in the morning. It lists the actionable items for each run, as well as any outstanding tasks or status updates required. Select the run name to move to that channel.

The digest is on by default. To turn it off, use the slash command ``/playbook settings digest off``.

Playbook to do
--------------

As you complete tasks and finish runs, you can update the details in the digest using the slash command ``/playbook todo``. This slash command can be run in any channel, direct message, or group message. Once run, it delivers an updated digest which includes a list of active runs you belong to.

source/playbooks/metrics-and-goals.rst METASEP
Metrics and goals
=================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Retrospectives help teams identify areas of improvement in workflows. Each time a playbook is run you can create and publish a retrospective for the team and stakeholders to review. Retrospective components are customized per playbook.

.. note::

   Some metrics and goals functionality (such as timeline and retrospectives) is only available on a paid plan. For more information, visit `https://mattermost.com/pricing <https://mattermost.com/pricing>`_.

Configure retrospectives before a run
-------------------------------------

Open Playbooks and select the **Playbooks** tab. Locate the playbook you want to modify, select the **...** icon under **Actions** and then select **Edit**. In the next screen, select **Retrospective**. Move the toggle to **Enable Retrospective**.

You can set a reminder to fill out the retrospective after a run is finished. The configured template is pre-populated in the run's retrospective.

Use the run timeline to help write an accurate retrospective. Events such as owner changes, status updates, and task assignments appear automatically. Selected posts may also be added to the timeline by using the post context menu.

.. image:: ../images/Retro.gif
   :alt: Create and publish retrospective reports.

Metrics
-------

Use metrics to identify key areas where you want to extract valuable insights by measuring performance and improvement. Metrics are enabled when you enable retrospectives. Calibrate the type of metric you want to measure, and once a run is finished you can view the output in the retrospective. You can have multiple metrics configured per playbook and you can edit them at any time. Metrics can be configured based on numeric, time, or value input.

These metrics can be anything that's of interest to you and your team. For example, for a software release playbook you might want to have a metric tracking how many bugs were detected during a run. The output of the metrics you've added is provided in the retrospective. Over time, you can use metrics across retrospectives to examine anomalies and refine goals.

Another example is a support incident playbook. The time to resolution metric can be applied and used to identify areas that need more refinement, such as tasks that might work better if they're split up so goals are reached faster.

When you delete configured metrics from a playbook, the data isn't deleted, but you no longer see those metrics in the dashboard. In addition, the corresponding metric field is removed from the retrospective form and from published retrospectives.

Metrics dashboard
^^^^^^^^^^^^^^^^^

For each run, you can enter a value per metric under the retrospective section. This value can be based on whatever you are measuring, such as number of bugs found per run. 

You can edit this value as many times as you'd like - for example to ensure you have the correct parameters for your metric - until you've published the retrospective at which point both the metrics and report are no longer editable. The final value only shows up in the playbook dashboard once the retrospective has been published.

The playbook dashboard reports on each metric for all runs by showing:

- Average value for all runs
- The last 10-run average value and difference with prev 10-run average
- The value range for all runs
- The target value
- The actual values chart for last 10-runs

The lower half of the page shows a list of finished runs with metrics values. You can filter or sort a list by metrics values.

.. image:: ../images/playbook-metrics.png
   :alt: View and assess metrics for your playbook.

Channel export
^^^^^^^^^^^^^^

Exporting the contents of a channel requires the channel export plugin. See the `Channel Export plugin documentation <https://mattermost.gitbook.io/channel-export-plugin>`_ for more information.

source/playbooks/interact-with-playbooks.rst METASEP
Interact with playbooks
=======================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Slash commands
--------------

Slash commands are available for playbooks. The ``/playbook`` slash command allows interaction with incidents via the post textbox on desktop, browser, and mobile. To run a playbook use the ``/playbook start`` slash command from any channel.

Available slash commands include:

- ``/playbook start`` - Start a playbook run.
- ``/playbook end`` - End a playbook run.
- ``/playbook update`` - Update the current playbook run's status.
- ``/playbook restart`` - Restart an ended playbook run.
- ``/playbook check [checklist item]`` - Check/uncheck the specified task.
- ``/playbook announce ~[channels]`` - Announce the current playbook run in other channels.
- ``/playbook list`` - List all your ongoing playbook runs.
- ``/playbook owner [@username]`` - Show or change the current playbook run owner.
- ``/playbook info`` - Show a summary of the current playbook's activities.

API documentation
-----------------

To interact with the data model programmatically, consult the `REST API specification <https://github.com/mattermost/mattermost-plugin-incident-collaboration/blob/master/server/api/api.yaml>`_.

Playbooks help streamline and manage complex processes while decreasing the risk of forgotten steps or tasks. They also support tool integration, status updates in a dedicated channel, and can be edited on the fly. When a playbook run is finished, you can review the entire run to assess any areas of improvement for the next run.

source/playbooks/getting-started.rst METASEP
Getting started 
===============

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:
  
Mattermost Playbooks is included in Mattermost self-hosted and Mattermost Cloud workspace. You can access Playbooks via the product menu in the top-left corner of Mattermost.

Access playbooks and runs
-------------------------

You can access Playbooks within Channels using the **Toggle Playbook List** icon in the channel header to open the right-hand sidebar (RHS). In the RHS, you'll find playbooks you can run as well as templates.

* Playbooks are preconfigured workflows, applied to a specific situation or event, that are refined over time with steps and processes that your team agree on.
* Playbook Templates are basic workflows that you can use to get started quickly. As you learn more about your workflows, you can customize them into specific playbooks.

To open a playbook and view its statistics, select the playbook name. To begin a run using a specific playbook, select **Run** next to that playbook's name.

To access runs, select the Product menu in the top-left corner of Mattermost, then select **Playbooks**. In the runs list, you can select a run to view more details, such as the overview and retrospective. This is an easy way to assess all the active runs to which you have access.

Playbook preview
~~~~~~~~~~~~~~~~

The playbook preview is a landing page that provides a summary of the playbook's components. This gives you insight into the playbook, as it's applied in a run, without having to join a active run.

View run details
~~~~~~~~~~~~~~~~

When you're in a channel with an active run, select the **Toggle Run Details** icon in the channel header to open the RHS to view the run details. Information such as run name and description can be edited in-line, and the checklists can be collapsed and filtered based on their status.

To find all playbook runs, open **product menu > Playbooks**, and then select any playbook name. Next, select **Runs** from the navigation bar. and choose a run to view its overview. Select **Go to channel** to open the run's channel.

API Documentation
~~~~~~~~~~~~~~~~~~

To interact with the data model programmatically, consult the `REST API specification <https://github.com/mattermost/mattermost-plugin-incident-collaboration/blob/master/server/api/api.yaml>`_.

source/playbooks/get-started-with-playbooks.rst METASEP
Get started with Mattermost Playbooks
=====================================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Access Mattermost Playbooks by selecting **Playbooks** from the **product menu** |product-list|.

.. |product-list| image:: ../images/products_E82F.svg
  :height: 24px
  :width: 24px
  :alt: Navigate between Channels, Playbooks, and Boards using the Product list icon.

Playbooks are workflows that can be repeated and refined over time. They can be applied to a range of situations and give stakeholders visibility into progress, process, and metrics. Playbooks are configurable and editable. You can add tasks to checklists, include automation behaviors, and provide insights into your processes in the form of metrics.

When you get started with Playbooks, it helps to have a repeatable process in mind up front. As a working example, we'll refer to an incident response playbook and discuss its moving parts.

Visit the `Mattermost Playbooks documentation <https://docs.mattermost.com/playbooks/setting-up-playbooks.html>`_ to learn more.

Choose a template
-----------------

The first step is to choose the right template for your use case. There are pre-configured templates for specific scenarios. The checklists, actions, status updates, and retrospective settings for these templates may already be filled in and, where appropriate, enabled. You can always edit and adjust these settings - they're there to guide you - removing them doesn't negatively affect the playbook run.

.. tip:: 

    Take a look at the **Learn how to use playbooks** template. This template breaks down the components of a playbook and you can also start a test run to see how everything fits together. If you're taking this option, you can stop reading here and enjoy the test run. You can also choose a blank template and start from scratch - this is a good option if your use case is unique.

In the incident response template, the template contains items that are relevant to incident resolution. These are general items to help you get started.

Keywords
--------

It's important to make it easy to start a run. One way to do this is by setting up keywords. These keywords prompt a user to start the run when they're used. In the incident response playbook, the keywords are specific to critical incidents, for example ``sev-1`` and ``#incident``. It's unlikely that someone would use those terms in general conversation and, even if they do, they can elect not to start the playbook run when prompted.

Welcome message
---------------

Create a welcome message so that when members join your run, it's easy for them to see where they're needed and where to find the relevant information. This is especially important during a time-sensitive incident to eliminate confusion and help members ramp up quickly.

Tasks and checklists
--------------------

Tasks and checklists are the foundation of a template and a workflow. In an incident, it's critical to get stakeholders together as soon as possible, so one of the first tasks is to add the on-call engineer to the channel, followed by starting a bridge call. When you're setting up these tasks, you can add slash commands, at-mentions, and integrations with tools such as Zoom to make the initiation as seamless as possible.

Status updates
--------------

Regular updates are important communication tools, especially in the middle of an incident like an outage. Channels can get very busy and overwhelming, and if you have more than one incident at a time, it's often too noisy for stakeholders to keep track of everything.

Use the **Broadcast update to other channels** option to cut through the noise and share critical information with both channel members and other users in a dedicated channel.

Additionally, set a timer that issues a reminder for updates to be shared.

Retrospective
-------------

When an incident is over, create a retrospective that captures the impact of the event. You can also add metrics, such as how long it took to resolve the incident, which you can apply to other, similar incidents to see where you can improve and refine your workflows.

source/playbooks/customize-a-run.rst METASEP
Customize a run
===============

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Some run actions can be edited while the run is in progress. This increases visibility into the run's progress and can improve accountability.

Change broadcast channels
~~~~~~~~~~~~~~~~~~~~~~~~~

1. In your run, select **Toggle Run Details** to open the right-hand sidebar.
2. Select **Run details**.
3. Next to the **In Progress** indicator, select **Run Actions**.
4. You can delete the current channel or add additional ones. To find channels, start typing the channel name and select it from the list.
    - You can turn off channel broadcast using the togggle.
5. Select **Save**.

Send outgoing webhooks
~~~~~~~~~~~~~~~~~~~~~~

1. In your run, select **Toggle Run Details** to open the right-hand sidebar.
2. Select **Run details**.
3. Next to the **In Progress** indicator, select **Run Actions**.
4. Add your webhook URLs in the field provided.
    - You can turn off this option using the togggle.
5. Select **Save**.

source/playbooks/customize-a-playbook.rst METASEP
Customize your playbook
=======================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Playbooks are highly customizable to align with your workflow.

Edit a playbook
---------------

You can change a playbook’s configuration at any time, but changes will only be applied to future incidents. Ongoing or ended incidents previously started from that playbook remain unchanged.

1. Go to **product menu > Playbooks**.
2. Find the playbook you want to edit.

   - Only public playbooks and private playbooks of which you are a member are listed. System Admins have unrestricted access to all playbooks on the team.

3. Select the name of the playbook.

   - To edit the playbook directly select the actions menu next to the playbook name, then select **Edit**.
   - To access the playbook dashboard, select the hyperlinked playbook name.

4. Select the **Outline** tab. 
5. Edit the text portions of the playbook inline. Use the left-hand menu to navigate to other parts of the playbook that you may want to edit.

Make checklists
----------------

1. Open Playbooks and select the **Playbooks** tab.
2. Start a **Blank Playbook**, or use the built-in template.
3. Name your playbook and provide a description.
4. Select the **Checklists** tab.

  You can start with the default checklist and edit it, or you can delete it and select **+ New checklist**.

    * Within each checklist, select **+ New task** to add tasks that are meant to be completed together.
    * Drag and drop to reorganize checklists and tasks.
    * Add task descriptions to give additional context to members of the playbook. Descriptions support a limited form of Markdown, including text styling and hyperlinks.
    * Add a slash command to the task that can be executed by members of the playbook as needed.

5. Choose **Save**.

Assign tasks and due dates
--------------------------

In some workflows, there are time constraints on tasks and others may have more flexible timeframes. Associating tasks with deliverable dates provides visibility into workloads and helps everyone stay accountable during the run.

To assign a due date to a task, select the **Toggle Run Details** icon to open the **Run Details** screen. Hover over the task you’d like to edit and select the calendar icon to assign a due date. Due dates can be used to sort tasks in the run overview.

When a due date is assigned to a task, and the task is overdue or due today, a reminder is added to the Playbooks daily digest along with tasks that don't have an assigned due date. As tasks are completed, they're removed from the daily digest reminders. You can refresh the list of assigned tasks at any time using the ``/playbooks to-do`` slash command.

Due dates can be entered in text (e.g., "two minutes ago") or numerically (e.g., "15 March 2023").

Broadcast channels
------------------

There may be multiple active runs on any given day.

Setting up a dedicated broadcast channel is an easy way to centralize status updates, decrease noise, and remember where everything is. Configure a broadcast channel to which status updates will be copied. If you're not a member of the configured broadcast channel, **Unknown Channel** is displayed instead of the channel name.

Keywords
--------

You can use keywords to trigger a playbook. Keywords are set in the **Channel Actions** menu and are applicable to a specific channel. When you use the Keywords action any channel member who has access to the playbook and who uses one of the listed keywords will be prompted to run the associated playbook.

If you find your keywords result in too many false positives, consider refining your list and also consider that URLs used by run members may also contain monitored keywords.

Actions
-------

You can customize actions associated with your playbook to ensure a smooth start when starting a run. Select the **Actions** tab to view the automation options available.

Options include: Creating a channel when a run is started, inviting members to the run, sending outgoing webhooks, and automatically adding the run channel to a sidebar category.

Actions such as channel creation and adding the channel to a sidebar category are set per-playbook and applied to each run that uses that playbook.
If you’re a System Admin or Channel Admin of the run channel you can also edit these settings in the run channel, via the channel menu, in **Channel Actions**. Editing the settings in the run channel will only affect that channel and the changes aren’t applied to the playbook.

Only Channel Admins can edit the **Channel Actions** items (such as the welcome message) but members who have access to the playbook can edit the welcome message and run behavior settings. Editing these won’t change the welcome message of a run that’s in progress - it only applies going forward.

If you want to change the behavior of all future runs associated with the playbook, edit the playbook directly in the **Actions** menu.

Run metrics
-----------

The **Usage** tab in the playbooks dashboard provides run metrics for that playbook. These metrics are available to all viewers. It's not possible to edit or add to these metrics.

Webhooks
--------

- For information about the webhook payload for ``run start``, see the `PlaybookRunWebhookPayload <https://github.com/mattermost/mattermost-plugin-playbooks/blob/b4c8058d8660efe35050bc7eb080e3819c7ab09c/server/app/playbook_run_service.go#L176-L185>`_ struct. An example of the JSON payload for a run start is available `here <https://gist.github.com/icelander/b68f2bf2b4ffefec93400cb050211cf1>`_.
- For information about the webhook payload for ``status update``, see the `PlaybookRunWebhookPayload <https://github.com/mattermost/mattermost-plugin-playbooks/blob/b4c8058d8660efe35050bc7eb080e3819c7ab09c/server/app/playbook_run_service.go#L176-L185>`_ struct. An example JSON payload for a status update is available `here <https://gist.github.com/icelander/2f9938ad68d1e0aa656f97969895d080>`_.

source/overview/index.rst METASEP

About Mattermost
================

Mattermost’s mission is to make the world safer and more productive by developing and delivering secure, open source collaboration software that is trusted, flexible, and offers fast time-to-value.

Below is an overview of our products, features, security, integrations, licensing and subscriptions, authentication, and compliance support.

.. toctree::
   :maxdepth: 2
   :hidden:

   /about/product.rst
   /about/security.rst
   /about/integrations.rst
   /about/subscription.rst
   /about/self-hosted-subscriptions.rst
   /about/cloud-subscriptions.rst
   /about/editions-and-offerings.rst
   /about/corporate-directory-integration.rst
   /about/certifications-and-compliance.rst
   /about/frequently-asked-questions.rst

Mattermost is an open source platform for secure communication, collaboration, and orchestration of work across tools and teams. 

Mattermost contains three key tools:

* :doc:`Channels </guides/channels>` - Stay connected with your team via 1:1 and group messaging.
* :doc:`Playbooks </guides/playbooks>` - Build and configure repeatable processes to achieve specific and predictable outcomes.
* :doc:`Boards </guides/boards>` - Manage projects and tasks in a Kanban board structure to help your team hit key milestones.

This section provides an overview of Mattermost products, features, security, integrations, licensing, subscriptions, authentication, and compliance support.

* :doc:`Product overview </about/product>` - Learn about the Mattermost open source project, self-hosted vs. cloud, and premium Mattermost features.
* :doc:`Security </about/security>` - Mattermost can meet the strictest security requirements and provides the highest level of control over user data.
* :doc:`Integrations </about/integrations>` - Mattermost is extensible by design and supports a rich ecosystem of third-party apps and integrations.
* :doc:`Subscription overview </about/subscription>` - Learn about Mattermost subscriptions.
* :doc:`Self-hosted subscriptions </about/self-hosted-subscriptions>` - Learn more about Mattermost self-hosted subscriptions.
* :doc:`Cloud subscriptions </about/cloud-subscriptions>` - Learn more about Mattermost Cloud subscriptions.
* :doc:`Mattermost editions and offerings </about/editions-and-offerings>` - Learn more about Mattermost editions and product offerings.
* :doc:`Corporate directory integrations </about/corporate-directory-integration>` - Mattermost integrates with all major account providers via Active Directory, SAML, and OAuth.
* :doc:`Certifications and compliance </about/certifications-and-compliance>` - Mattermost can meet all major security and compliance requirements.
* :doc:`Frequently asked questions </about/frequently-asked-questions>` - Get answers to common questions about Mattermost.

source/onboard/user-provisioning-workflows.rst METASEP
.. _user-provisoning:

Provisioning workflows
======================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

This document provides an overview of user provisioning and deprovisioning workflows in Mattermost.

User Provisioning
--------------------

There are currently three recommended user provisioning workflows in Mattermost:

1. **On demand:** If user accounts are not pre-provisioned using one of the methods described below, then a new user account will be provisioned when the user first logs in. When the user logs in, they are asked to select a public team to join (all users must belong to at least one team) and then they are added automatically to Town Square and Off-Topic channels. Mattermost also has a default channel setting that allows everyone to be added to additional channels specified by the organization.
2. **Pre-provisioned via bulk import:** Mattermost features a `bulk data loading tool <https://docs.mattermost.com/onboard/bulk-loading-data.html>`__ that can be used for pre-provisioning new users by adding them to teams and channels before their first login to Mattermost. This tool automates the creation of Teams, Channels, Users, and Posts (with file attachments). It can also be used to migrate users and content from an existing system.
3. **Mattermost API:** The Mattermost `RESTful API <https://api.mattermost.com>`__ can be used to pre-provision new user accounts as well as add and remove them from teams and channels. This model is commonly used by enterprises that have central account provisioning applications.

.. note::

  Mattermost plans to release a new feature in early 2019 that will enable organizations to synchronize users to teams and channels based on group membership.

Mattermost user identifier
~~~~~~~~~~~~~~~~~~~~~~~~~~~

The user identifier used to uniquely identify users in Mattermost depends on the method of authentication:

- **Email/password**: Email address or username. Created by the user or previously described account pre-provisioning process.
- **AD/LDAP**: Configure a unique and unchanging ID Attribute from the AD/LDAP server to be used in Mattermost. If a user's ID Attribute changes, it will create a new Mattermost account unassociated with their old one.
- **SAML 2.0**: Selected during configuration. You may use an Id Attribute instead of email to bind the user. We recommend choosing an ID that is unique and will not change over time.

User deprovisioning
--------------------

Users in Mattermost can be deactivated in the following ways:

- **AD/LDAP Synchronization**: AD/LDAP users can be deactivated in Mattermost based on their status in the directory server via synchronization. Learn more in `AD/LDAP documentation <https://docs.mattermost.com/onboard/ad-ldap.html#how-do-i-deactivate-users>`__.
- **System Console**: User management screen in **System Console > Users** allows administrators to deactiveate users with email/password login.
- **RESTful API** The Mattermost API can be used to deactivate users. See `API documentation to learn more <https://api.mattermost.com/#operation/DeleteUser>`__.
- **Command Line Interface**: You can use the Mattermost `CLI <https://docs.mattermost.com/manage/command-line-tools.html#mattermost-user-deactivate>`__ and `mmctl <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-user-deactivate>`__ tools to deactivate users.

Once deactivated, users still exist in the Mattermost database and their messages can still be viewed in Mattermost. You can use the Mattermost `CLI <https://docs.mattermost.com/manage/command-line-tools.html#mattermost-user-delete>`__, or the `mmctl <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-user-delete>`__ tools to delete a user and all of their content.

.. note::

   As long as the ID attribute selected via AD/LDAP or SAML 2.0 is a unique identifier, the user’s email address or name (along with other attributes) can be updated without breaking the user’s account.

source/onboard/system-admin-roles.rst METASEP
Additional System Admin roles
==============================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Mattermost Enterprise Edition E20*

System Admins can assign system roles that permit granular user access to specific areas of the System Console. These roles enable users to perform certain administrative tasks without requiring access to all system administration areas. System roles never supersede the user's original role or the user's permissions configured by the Permissions scheme.

.. note::

  - From Mattermost v5.28, System Admins can use the `CLI <https://docs.mattermost.com/manage/command-line-tools.html>`__ to assign roles and privileges.
  - From Mattermost v5.30 and in Mattermost Cloud, System Admins can use the System Console to assign and manage roles and privileges.
  - From Mattermost v6.0, the CLI has been deprecated in favor of the `mmctl command line tool <https://docs.mattermost.com/manage/mmctl-command-line-tool.html>`__.

Available roles
----------------

A System Admin can configure the following system roles:

- **System Manager:** The System Manager role has read/write permissions for management areas of the System Console, such as user management and integrations (excluding permissions). This role has read only access to authentication, reporting, and license interfaces.
- **User Manager:** The User Manager role is able to read/write to all the user management areas (excluding permissions). The authentication interface is read-only.
- **Custom Group Manager** The Custom Group Manager role has permissions to `create, edit, and delete custom user groups <https://docs.mattermost.com/welcome/manage-custom-groups.html>`__ via **User Groups** in the **Products menu**. It can be used to assign individual users this ability when **Custom Groups** permissions are removed for **All Members** via **System Console > Permissions > Edit Scheme > Custom Groups**.
- **Viewer:** The Viewer role is able to view all pages of the System Console, but has no write access to any pages.

When a user is assigned a system role, they have role-based access to the System Console. Each role has a different set of default permissions, and what users can access or view depends on the role they've been assigned.

+----------------------+-----------------------+---------------------------------------+
| **System role**      | **Read/Write access** | **Read Only access**                  |
+----------------------+-----------------------+---------------------------------------+
| System Manager       | - User Management     | - (User Management) Permissions       |
|                      | - Environment         | - Edition/License                     |
|                      | - Site Configuration  | - Reporting                           |
|                      | - Integrations        | - Authentication                      |
|                      |                       | - Plugins                             |
+----------------------+-----------------------+---------------------------------------+
| User Manager         | - User Management     | - (User Management) Permissions       |
|                      | - Groups              | - Authentication                      |
|                      | - Teams               |                                       |
|                      | - Channels            |                                       |
+----------------------+-----------------------+---------------------------------------+
| Custom Group Manager | Custom User Groups    | N/A                                   |
+----------------------+-----------------------+---------------------------------------+
| Viewer               | N/A                   | - All pages within the System Console |
+----------------------+-----------------------+---------------------------------------+

Assign system admin roles
-------------------------

There are two ways to assign roles:

1. In the System Console under **User Management > System Roles**.
2. Using the `mmctl tool <https://docs.mattermost.com/manage/mmctl-command-line-tool.html>`__. This can be done either locally or remotely.

+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+
| **You want to**                                   | **Using the System Console**                                                                                  | **Using mmctl**                                                                     |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+
| Assign roles                                      | Go to **System Console > User Management > System Roles > Assigned People**                                   | ``mmctl permissions role assign [role_name] [username...]``                         |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+
| Grant the System Manager role to a user           | 1. Go to **System Console > User Management > System Roles**, then select the **System Manager** role.        | ``mmctl permissions role assign system_manager user-name``                          |
|                                                   | 2. Under **Assigned People**, select **Add People**.                                                          |                                                                                     |
|                                                   | 3. Search for and select the user name, then select **Add** to grant the System Manager role to that user.    |                                                                                     |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+
| Grant the User Manager role to two users          | 1. Go to **System Console > User Management > System Roles**, then select the **User Manager** role.          | ``mmctl permissions role assign system_user_manager user-name1 user-name2``         |
|                                                   | 2. Under **Assigned People**, select **Add People**.                                                          |                                                                                     |
|                                                   | 3. Search for and select the two users, then select **Add** to grant the User Manager role to those users.    |                                                                                     |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+
| Grant the Viewer role to a user                   | 1. Go to **System Console > User Management > System Roles**, then select the **Viewer** role.                | ``mmctl permissions role assign system_read_only_admin user-name``                  |
|                                                   | 2. Under **Assigned People**, select **Add People**.                                                          |                                                                                     |
|                                                   | 3. Search for and select the user name, then select **Add** to grant the Viewer role to that user.            |                                                                                     |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+
| Grant the Custom Group Manager role to two users  | 1. Go to **System Console > User Management > System Roles**, then select the **Custom Group Manager**        | ``mmctl permissions role assign system_custom_group_admin user-name1 user-name2``   |
|                                                   |    role.                                                                                                      |                                                                                     |
|                                                   | 2. Under **Assigned People**, select **Add People**.                                                          |                                                                                     |
|                                                   | 3. Search for and select the two users, then select **Add** to grant the Custom Group Manager role to those   |                                                                                     |
|                                                   |    users.                                                                                                     |                                                                                     |
|                                                   | 4. All users have the ability to create custom user groups by default. When you assign users to the           |                                                                                     |
|                                                   |    Custom Group Manager role, you must manually remove these permissions from all users by going to           |                                                                                     |
|                                                   |    **System Console > User Management > Permissions > Edit Scheme**. Under **All Members**, clear all of      |                                                                                     |
|                                                   |    the **Custom Groups** permissions, including **Create**, **Manage members**, **Edit**, and **Delete**.     |                                                                                     |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+
| Remove the System Manager role from a single user | 1. Go to **System Console > User Management > System Roles**, then select the **System Manager** role.        | ``mmctl permissions role unassign system_manager bob-smith``                        |
|                                                   | 2. Under **Assigned People**, search for the user, then select **Remove**.                                    |                                                                                     |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+

Edit privileges of System Admin roles (advanced)
------------------------------------------------

System Admins can grant read/write access to other areas of the System Console, as well as remove read/write access (including default access), for all system roles except the Custom Group Manager role. 

There are two ways to assign roles:

1. In the System Console under **User Management > System Roles**.
2. Using the `mmctl tool <https://docs.mattermost.com/manage/mmctl-command-line-tool.html>`__. This can be done either locally or remotely.

+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+
| **You want to**                                  | **Using the System Console**                                                                                  | **Using mmctl**                                                                     |                                                              
+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+
| Edit role privileges                             | 1. Go to **System Console > User Management > System Roles**, then select the **System Manager**,             | ``mmctl permissions add [role_name] [permission...]``                               |
|                                                  | **User Manager**, or **Viewer** role.                                                                         |                                                                                     |                                                                                                                    
|                                                  | 2. For each set of privileges, select the access level as **Can edit**, **Read only**, or **No access**.      |                                                                                     |
|                                                  |                                                                                                               |                                                                                     |
|                                                  | **Note**: If you set privilege subsections to different access levels, then the privilege access level        |                                                                                     |
|                                                  | displays as **Mixed Access**.                                                                                 |                                                                                     |
+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+
| Grant write access to the Authentication section | 1. Go to **System Console > User Management > System Roles**, then select the **User Manager** role.          | ``mmctl permissions add system_user_manager sysconsole_write_authentication``       |
| of the System Console for all users with the     | 2. Under **Privileges > Authentication** select **Can edit**, then select **Save**.                           |                                                                                     |         
| User Manager role                                |                                                                                                               |                                                                                     |
+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+
| Grant read-only access to the Authentication     | 1. Go to **System Console > User Management > System Roles**. then select the **User Manager** role.          | ``mmctl permissions remove system_user_manager sysconsole_read_authentication``     |
| section of the System Console for all users      | 2. Under **Privileges > Authentication** select **Read only**, then select **Save**.                          |                                                                                     |
| with the User Manager role                       |                                                                                                               |                                                                                     |
+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+
| Remove write access to the Authentication        | 1. Go to **System Console > User Management > System Roles**, then select the **User Manager** role.          | ``mmctl permissions remove system_user_manager sysconsole_write_authentication``    |
| section of the System Console for all users with | 2. Under **Privileges > Authentication** select **No access**, then choose **Save**.                          |                                                                                     |
| the User Manager role                            |                                                                                                               |                                                                                     |
+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+
| Reset a role to its default set of permissions   | This is completed using the mmctl tool only.                                                                  | ``mmctl permissions reset [role_name]``                                             |
|                                                  |                                                                                                               | For example, to reset the permissions of the ``system_read_only_admin`` role:       |
|                                                  |                                                                                                               | ``mmctl permissions reset system_read_only_admin``                                  |
+--------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+

Admin roles and privileges
---------------------------

Roles
~~~~~

- ``system_manager``
- ``system_user_manager``
- ``system_custom_group_admin``
- ``system_read_only_admin``

Privileges
~~~~~~~~~~

+------------------------+--------------------------------------------------------------------------+
| System Console section | Permissions                                                              |
+========================+==========================================================================+
| About                  |  - PERMISSION_SYSCONSOLE_READ_ABOUT_EDITION_AND_LICENSE                  |
|                        |  - PERMISSION_SYSCONSOLE_WRITE_ABOUT_EDITION_AND_LICENSE                 |
+------------------------+--------------------------------------------------------------------------+
| Reporting              | **Site Statistics**                                                      |
|                        |  - PERMISSION_SYSCONSOLE_READ_REPORTING_SITE_STATISTICS                  |
|                        |  - PERMISSION_SYSCONSOLE_WRITE_REPORTING_SITE_STATISTICS                 |
|                        |                                                                          |
|                        | **Team Statistics**                                                      |
|                        |  - PERMISSION_SYSCONSOLE_READ_REPORTING_TEAM_STATISTICS                  |
|                        |  - PERMISSION_SYSCONSOLE_WRITE_REPORTING_TEAM_STATISTICS                 |
|                        |                                                                          |
|                        | **Server Logs**                                                          |
|                        |  - PERMISSION_SYSCONSOLE_READ_REPORTING_SERVER_LOGS                      |
|                        |  - PERMISSION_SYSCONSOLE_WRITE_REPORTING_SERVER_LOGS                     |
+------------------------+--------------------------------------------------------------------------+
| User Management        | **Users**                                                                |
|                        |  - PERMISSION_SYSCONSOLE_READ_USERMANAGEMENT_USERS                       |
|                        |  - PERMISSION_SYSCONSOLE_WRITE_USERMANAGEMENT_USERS                      |
|                        |                                                                          |
|                        | **Groups**                                                               |
|                        |  - PERMISSION_SYSCONSOLE_READ_USERMANAGEMENT_GROUPS                      |
|                        |  - PERMISSION_SYSCONSOLE_WRITE_USERMANAGEMENT_GROUPS                     |
|                        |                                                                          |
|                        | **Teams**                                                                |
|                        |  - PERMISSION_SYSCONSOLE_READ_USERMANAGEMENT_TEAMS                       |
|                        |  - PERMISSION_SYSCONSOLE_WRITE_USERMANAGEMENT_TEAMS                      |
|                        |                                                                          |
|                        | **Channels**                                                             |
|                        |  - PERMISSION_SYSCONSOLE_READ_USERMANAGEMENT_CHANNELS                    |
|                        |  - PERMISSION_SYSCONSOLE_WRITE_USERMANAGEMENT_CHANNELS                   |
|                        |                                                                          |
|                        | **Permissions**                                                          |
|                        |  - PERMISSION_SYSCONSOLE_READ_USERMANAGEMENT_PERMISSIONS                 |
|                        |  - PERMISSION_SYSCONSOLE_WRITE_USERMANAGEMENT_PERMISSIONS                |
+------------------------+--------------------------------------------------------------------------+
| Environment            | **Web Server**                                                           |
|                        |  - PERMISSION_SYSCONSOLE_READ_ENVIRONMENT_WEB_SERVER                     |
|                        |  - PERMISSION_SYSCONSOLE_WRITE_ENVIRONMENT_WEB_SERVER                    |
|                        |                                                                          |
|                        | **Database**                                                             |
|                        |  - PERMISSION_SYSCONSOLE_READ_ENVIRONMENT_DATABASE                       |
|                        |  - PERMISSION_SYSCONSOLE_WRITE_ENVIRONMENT_DATABASE                      |
|                        |                                                                          |
|                        | **Elasticsearch**                                                        |
|                        |  - PERMISSION_SYSCONSOLE_READ_ENVIRONMENT_ELASTICSEARCH                  |
|                        |  - PERMISSION_SYSCONSOLE_WRITE_ENVIRONMENT_ELASTICSEARCH                 |
|                        |                                                                          |
|                        | **File Storage**                                                         |
|                        |  - PERMISSION_SYSCONSOLE_READ_ENVIRONMENT_FILE_STORAGE                   |
|                        |  - PERMISSION_SYSCONSOLE_WRITE_ENVIRONMENT_FILE_STORAGE                  |
|                        |                                                                          |
|                        | **Image Proxy**                                                          |
|                        |  - PERMISSION_SYSCONSOLE_READ_ENVIRONMENT_IMAGE_PROXY                    |
|                        |  - PERMISSION_SYSCONSOLE_WRITE_ENVIRONMENT_IMAGE_PROXY                   |
|                        |                                                                          |
|                        | **SMTP**                                                                 |
|                        |  - PERMISSION_SYSCONSOLE_READ_ENVIRONMENT_SMTP                           |
|                        |  - PERMISSION_SYSCONSOLE_WRITE_ENVIRONMENT_SMTP                          |
|                        |                                                                          |
|                        | **Push Notification Server**                                             |
|                        |  - PERMISSION_SYSCONSOLE_READ_ENVIRONMENT_PUSH_NOTIFICATION_SERVER       |
|                        |  - PERMISSION_SYSCONSOLE_WRITE_ENVIRONMENT_PUSH_NOTIFICATION_SERVER      |
|                        |                                                                          |
|                        | **High Availability**                                                    |
|                        |  - PERMISSION_SYSCONSOLE_READ_ENVIRONMENT_HIGH_AVAILABILITY              |
|                        |  - PERMISSION_SYSCONSOLE_WRITE_ENVIRONMENT_HIGH_AVAILABILITY             |
|                        |                                                                          |
|                        | **Rate Limiting**                                                        |
|                        |  - PERMISSION_SYSCONSOLE_READ_ENVIRONMENT_RATE_LIMITING                  |
|                        |  - PERMISSION_SYSCONSOLE_WRITE_ENVIRONMENT_RATE_LIMITING                 |
|                        |                                                                          |
|                        | **Logging**                                                              |
|                        |  - PERMISSION_SYSCONSOLE_READ_ENVIRONMENT_LOGGING                        |
|                        |  - PERMISSION_SYSCONSOLE_WRITE_ENVIRONMENT_LOGGING                       |
|                        |                                                                          |
|                        | **Session Lengths**                                                      |
|                        |  - PERMISSION_SYSCONSOLE_READ_ENVIRONMENT_SESSION_LENGTHS                |
|                        |  - PERMISSION_SYSCONSOLE_WRITE_ENVIRONMENT_SESSION_LENGTHS               |
|                        |                                                                          |
|                        | **Performance Monitoring**                                               |
|                        |  - PERMISSION_SYSCONSOLE_READ_ENVIRONMENT_PERFORMANCE_MONITORING         |
|                        |  - PERMISSION_SYSCONSOLE_WRITE_ENVIRONMENT_PERFORMANCE_MONITORING        |
|                        |                                                                          |
|                        | **Developer**                                                            |
|                        |  - PERMISSION_SYSCONSOLE_READ_ENVIRONMENT_DEVELOPER                      |
|                        |  - PERMISSION_SYSCONSOLE_WRITE_ENVIRONMENT_DEVELOPER                     |
+------------------------+--------------------------------------------------------------------------+
| Site Configuration     | **Customization**                                                        |
|                        |  - PERMISSION_SYSCONSOLE_READ_SITE_CUSTOMIZATION                         | 
|                        |  - PERMISSION_SYSCONSOLE_WRITE_SITE_CUSTOMIZATION                        |   
|                        |                                                                          |
|                        | **Localization**                                                         |
|                        |  - PERMISSION_SYSCONSOLE_READ_SITE_LOCALIZATION                          | 
|                        |  - PERMISSION_SYSCONSOLE_WRITE_SITE_LOCALIZATION                         |   
|                        |                                                                          |   
|                        | **Users and Teams**                                                      | 
|                        |  - PERMISSION_SYSCONSOLE_READ_SITE_USERS_AND_TEAMS                       |   
|                        |  - PERMISSION_SYSCONSOLE_WRITE_SITE_USERS_AND_TEAMS                      | 
|                        |                                                                          | 
|                        | **Notifications**                                                        |   
|                        |  - PERMISSION_SYSCONSOLE_READ_SITE_NOTIFICATIONS                         |   
|                        |  - PERMISSION_SYSCONSOLE_WRITE_SITE_NOTIFICATIONS                        |  
|                        |                                                                          |   
|                        | **Announcement Banner**                                                  |    
|                        |  - PERMISSION_SYSCONSOLE_READ_SITE_ANNOUNCEMENT_BANNER                   |    
|                        |  - PERMISSION_SYSCONSOLE_WRITE_SITE_ANNOUNCEMENT_BANNER                  |  
|                        |                                                                          | 
|                        | **Emoji**                                                                |     
|                        |  - PERMISSION_SYSCONSOLE_READ_SITE_EMOJI                                 |  
|                        |  - PERMISSION_SYSCONSOLE_WRITE_SITE_EMOJI                                |
|                        |                                                                          | 
|                        | **Posts**                                                                |
|                        |  - PERMISSION_SYSCONSOLE_READ_SITE_POSTS                                 |  
|                        |  - PERMISSION_SYSCONSOLE_WRITE_SITE_POSTS                                |    
|                        |                                                                          |
|                        | **File Sharing and Downloads**                                           |
|                        |  - PERMISSION_SYSCONSOLE_READ_SITE_FILE_SHARING_AND_DOWNLOADS            |
|                        |  - PERMISSION_SYSCONSOLE_WRITE_SITE_FILE_SHARING_AND_DOWNLOADS           | 
|                        |                                                                          |  
|                        | **Public Links**                                                         |
|                        |  - PERMISSION_SYSCONSOLE_READ_SITE_PUBLIC_LINKS                          | 
|                        |  - PERMISSION_SYSCONSOLE_WRITE_SITE_PUBLIC_LINKS                         |    
|                        |                                                                          |     
|                        | **Notices**                                                              |      
|                        |  - PERMISSION_SYSCONSOLE_READ_SITE_NOTICES                               |   
|                        |  - PERMISSION_SYSCONSOLE_WRITE_SITE_NOTICES                              |    
+------------------------+--------------------------------------------------------------------------+
| Authentication         | **Signup**                                                               |
|                        |  - PERMISSION_SYSCONSOLE_READ_AUTHENTICATION_SIGNUP                      |
|                        |  - PERMISSION_SYSCONSOLE_WRITE_AUTHENTICATION_SIGNUP                     |
|                        |                                                                          |
|                        | **Email**                                                                |
|                        |  - PERMISSION_SYSCONSOLE_READ_AUTHENTICATION_EMAIL                       | 
|                        |  - PERMISSION_SYSCONSOLE_WRITE_AUTHENTICATION_EMAIL                      |  
|                        |                                                                          |
|                        | **Password**                                                             |   
|                        |  - PERMISSION_SYSCONSOLE_READ_AUTHENTICATION_PASSWORD                    |
|                        |  - PERMISSION_SYSCONSOLE_WRITE_AUTHENTICATION_PASSWORD                   |   
|                        |                                                                          |    
|                        | **MFA**                                                                  |     
|                        |  - PERMISSION_SYSCONSOLE_READ_AUTHENTICATION_MFA                         |
|                        |  - PERMISSION_SYSCONSOLE_WRITE_AUTHENTICATION_MFA                        |
|                        |                                                                          |
|                        | **AD/LDAP**                                                              |
|                        |  - PERMISSION_SYSCONSOLE_READ_AUTHENTICATION_MFA                         |
|                        |  - PERMISSION_SYSCONSOLE_WRITE_AUTHENTICATION_MFA                        |     
|                        |                                                                          |    
|                        | **SAML 2.0**                                                             |     
|                        |  - PERMISSION_SYSCONSOLE_READ_AUTHENTICATION_SAML                        |   
|                        |  - PERMISSION_SYSCONSOLE_WRITE_AUTHENTICATION_SAML                       | 
|                        |                                                                          |
|                        | **OpenID Connect**                                                       | 
|                        |  - PERMISSION_SYSCONSOLE_READ_AUTHENTICATION_OPENID                      |
|                        |  - PERMISSION_SYSCONSOLE_WRITE_AUTHENTICATION_OPENID                     |
|                        |                                                                          |
|                        | **Guest Access**                                                         | 
|                        |  - PERMISSION_SYSCONSOLE_READ_AUTHENTICATION_GUEST_ACCESS                |
|                        |  - PERMISSION_SYSCONSOLE_WRITE_AUTHENTICATION_GUEST_ACCESS               | 
+------------------------+--------------------------------------------------------------------------+
| Plugin                 |  - PERMISSION_SYSCONSOLE_READ_PLUGINS                                    |
|                        |  - PERMISSION_SYSCONSOLE_WRITE_PLUGINS                                   |
+------------------------+--------------------------------------------------------------------------+
| Integrations           | **Integration Management**                                               |
|                        |  - PERMISSION_SYSCONSOLE_READ_INTEGRATIONS_INTEGRATION_MANAGEMENT        |
|                        |  - PERMISSION_SYSCONSOLE_WRITE_INTEGRATIONS_INTEGRATION_MANAGEMENT       |
|                        |                                                                          |
|                        | **Bot Accounts**                                                         |   
|                        |  - PERMISSION_SYSCONSOLE_READ_INTEGRATIONS_BOT_ACCOUNTS                  |
|                        |  - PERMISSION_SYSCONSOLE_WRITE_INTEGRATIONS_BOT_ACCOUNTS                 |
|                        |                                                                          |
|                        | **GIF (Beta)**                                                           | 
|                        |  - PERMISSION_SYSCONSOLE_READ_INTEGRATIONS_GIF                           |   
|                        |  - PERMISSION_SYSCONSOLE_WRITE_INTEGRATIONS_GIF                          | 
|                        |                                                                          |       
|                        | **CORS**                                                                 |
|                        |  - PERMISSION_SYSCONSOLE_READ_INTEGRATIONS_CORS                          | 
|                        |  - PERMISSION_SYSCONSOLE_WRITE_INTEGRATIONS_CORS                         |                       
+------------------------+--------------------------------------------------------------------------+
| Compliance             | **Data Retention Policy**                                                |
|                        |  - PERMISSION_SYSCONSOLE_READ_COMPLIANCE_DATA_RETENTION_POLICY           |
|                        |  - PERMISSION_SYSCONSOLE_WRITE_COMPLIANCE_DATA_RETENTION_POLICY          |
|                        |                                                                          |
|                        | **Compliance Export**                                                    |
|                        |  - PERMISSION_SYSCONSOLE_READ_COMPLIANCE_COMPLIANCE_EXPORT               |
|                        |  - PERMISSION_SYSCONSOLE_WRITE_COMPLIANCE_COMPLIANCE_EXPORT              |
|                        |                                                                          |
|                        | **Compliance Monitoring**                                                |
|                        |  - PERMISSION_SYSCONSOLE_READ_COMPLIANCE_COMPLIANCE_MONITORING           |
|                        |  - PERMISSION_SYSCONSOLE_WRITE_COMPLIANCE_COMPLIANCE_MONITORING          |
|                        |                                                                          |
|                        | **Custom Terms of Service**                                              |
|                        |  - PERMISSION_SYSCONSOLE_READ_COMPLIANCE_CUSTOM_TERMS_OF_SERVICE         |
|                        |  - PERMISSION_SYSCONSOLE_WRITE_COMPLIANCE_CUSTOM_TERMS_OF_SERVICE        |
+------------------------+--------------------------------------------------------------------------+
| Experimental           | **Features**                                                             |
|                        |  - PERMISSION_SYSCONSOLE_READ_EXPERIMENTAL_FEATURES                      |
|                        |  - PERMISSION_SYSCONSOLE_WRITE_EXPERIMENTAL_FEATURES                     |
|                        |                                                                          |
|                        | **Feature Flags**                                                        |
|                        |  - PERMISSION_SYSCONSOLE_READ_EXPERIMENTAL_FEATURE_FLAGS                 |
|                        |  - PERMISSION_SYSCONSOLE_WRITE_EXPERIMENTAL_FEATURE_FLAGS                |
|                        |                                                                          |
|                        | **Bleve**                                                                |
|                        |  - PERMISSION_SYSCONSOLE_READ_EXPERIMENTAL_BLEVE                         |
|                        |  - PERMISSION_SYSCONSOLE_WRITE_EXPERIMENTAL_BLEVE                        |
+------------------------+--------------------------------------------------------------------------+

Frequently Asked Questions
--------------------------

Can a User Manager or System Manager reset an administrator’s email or password without their knowledge?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This is not possible with the default privileges of these roles. The ability to reset passwords or email addresses of administrators is limited to System Admins.  

Can a User Manager or System Manager access the configuration file? 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Yes. However, they will only have access to read actual values and modify values in accordance with their permissions. If appropriate read permissions do not exist, the default key values will be displayed.

Are all actions of admin roles logged?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Every change made by any admin is included in the audit log.

Can a System Manager change their own permissions or elevate their role?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

No. System Managers can't elevate their role, and aren't able to elevate other members' roles.

Can any of the new roles view API keys/passwords or other sensitive information within the System Console (such as SMTP, AWS, Elastic Search)?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

No, password information is only visible to System Admins and is obfuscated for other roles.

If download links for compliance exports are enabled in the System Console, can a Read Only Admin download the reports? 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Only roles that are explicitly granted access to **System Console > Compliance** have access to download compliance reports. 

Can any of the new roles force-join Private channels?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Yes at this time they can, however, we will be improving on this behavior in the future with a prompt that lets them know they are entering a private channel. We are also planning on adding a permission which would remove the ability to access Private channels.

Can I create a new role or clone an existing role?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

No, but we are actively seeking feedback on this capability.

Can I use an LDAP filter to assign these roles?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

No, but we are considering this functionality for a future enhancement.

Can I rename the roles?
~~~~~~~~~~~~~~~~~~~~~~~

This is being considered for future development.

Can a System Manager or User Manager demote or deactivate another Admin or Manager?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

No privilege grants the authority to deactivate or demote another admin. 

Can a System Manager or User Manager assign or unassign admin roles?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Only the System Admin has access to edit system roles.

source/onboard/sso-saml.rst METASEP
SAML Single Sign-On
===================

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Mattermost Enterprise Edition E20*

Single sign-on (SSO) is a way for users to log into multiple applications with a single user ID and password without having to re-enter their credentials. The SAML standard allows identity providers to pass credentials to service providers. Mattermost can be configured to act as a SAML 2.0 Service Provider. 

Mattermost can be configured to act as a SAML 2.0 Service Provider. The SAML Single sign-on integration offers the following benefits:

- **Single sign-on.** Users can log in to Mattermost with their SAML credentials.
- **Centralized identity management.** Mattermost accounts automatically pull user attributes from SAML upon login, such as full name, email, and username.
- **Automatic account provisioning.** Mattermost user accounts are automatically created the first time a user signs in with their SAML credentials on the Mattermost server.
- **Sync groups to predefined roles in Mattermost.** Assign team and channel roles to groups via LDAP Group Sync.
- **Compliance alignment with administrator management.** Manage Administrator access to Mattermost in the System Console using SAML attributes.

SAML Single sign-on itself does not support periodic updates of user attributes nor automatic deprovisioning. However, SAML with AD/LDAP sync can be configured to support these use cases.

For more information about SAML, see `this article from Varonis <https://www.varonis.com/blog/what-is-saml/>`_, and `this conceptual example from DUO <https://duo.com/blog/the-beer-drinkers-guide-to-saml>`_.

Mattermost officially supports Okta, OneLogin, and Microsoft ADFS as the identity providers (IDPs), please see links below for more details on how to configure SAML with these providers.

.. toctree::
  :titlesonly:

  Okta SAML Configuration <sso-saml-okta>
  OneLogin SAML Configuration <sso-saml-onelogin.rst>
  Microsoft ADFS SAML Configuration for Windows Server 2012 <sso-saml-adfs>
  Microsoft ADFS SAML Configuration for Windows Server 2016 <sso-saml-adfs-msws2016>
  Keycloak SAML Configuration <sso-saml-keycloak>

In addition to the officially supported identity providers, you can also configure SAML for a custom IdP. For instance, customers have successfully set up miniOrange, Azure AD, DUO, PingFederate, Keycloak, and SimpleSAMLphp as a custom IdPs. Because we do not test against these identity providers, it is important that you test new versions of Mattermost in a staging environment to confirm it will work with your identity provider. You can also set up MFA on top of your SAML provider for additional security.

Using SAML attributes to apply roles
-------------------------------------

You can use attributes to assign roles to specified users on login. To access the SAML attribute settings navigate to **System Console > SAML 2.0**.

Username attribute
~~~~~~~~~~~~~~~~~~

(Optional) Enter a SAML assertion filter to use when searching for users.

1. Navigate to **System Console > Authentication > SAML 2.0** (or **System Console > SAML** in versions prior to 5.12).
2. Complete the **Username Attribute** field.
3. Choose **Save**.

When the user accesses the Mattermost URL, they log in with same username and password that they use for organizational logins.

Guest attribute
~~~~~~~~~~~~~~~

When enabled, the ``guest`` attribute in Mattermost identifies external users whose SAML assertion is guest and who are invited to join your Mattermost server. These users will have the guest role applied immediately upon first login instead of the default member user role. This eliminates having to manually assign the role in the System Console.

If a Mattermost guest user has the guest role removed in the SAML system, the synchronization processes will not automatically promote them to a member user role. This is done manually via **System Console > User Management**. If a member user has the ``guest`` attribute added, the synchronization processes will automatically demote the member user to the guest role.

1. Enable Guest Access via **System Console > SAML 2.0**.
2. Navigate to **System Console > Authentication > SAML 2.0**.
3. Complete the Guest Attribute field.
4. Choose **Save**.

When a guest logs in for the first time they are presented with a default landing page until they are added to channels.

See the `Guest accounts documentation <https://docs.mattermost.com/onboard/guest-accounts.html>`_ for more information about this feature.

Admin attribute
~~~~~~~~~~~~~~~

(Optional) The attribute in the SAML Assertion for designating System Admins. The users selected by the query will have access to your Mattermost server as System Admins. By default, System Admins have complete access to the Mattermost System Console.

Existing members that are identified by this attribute will be promoted from member to System Admin upon next login. The next login is based upon Session lengths set in **System Console > Session Lengths**. It is recommended that users are manually demoted to members in **System Console > User Management** to ensure access is restricted immediately.

1. Navigate to **System Console > Authentication > SAML 2.0**.
2. Set **Enable Admin Attribute** to ``true``.
3. Complete the **Admin Attribute** field.
4. Choose **Save**.

.. note:: 
    If the ``admin`` attribute is set to ``false`` the member's role as System Admin is retained. However if the attribute is removed/changed, System Admins that were promoted via the attribute will be demoted to members and will not retain access to the System Console. When this attribute is not in use, System Admins can be manually promoted/demoted in **System Console > User Management**.

Roadmap
-------

From Mattermost v5.14, you can optionally configure Mattermost to sign the SAML request using a private key to meet InfoSec requirements at your organization.

In the future roadmap, the main consideration is an integration with SCIM, via plugin. Such an integration allows system administrators to create SAML-provisioned users before their first login, and sync them against Mattermost permissions.

Currently user provisioning and deprovisioning can be handled with SAML sync, but relies on AD/LDAP. SCIM enables admins to control user provisioning and deprovisioning within the IdP itself.

For examples, see `Microsoft Azure AD integration with SCIM <https://docs.microsoft.com/en-us/azure/active-directory/app-provisioning/use-scim-to-provision-users-and-groups>`__ and `Okta user provisioning with SCIM <https://help.okta.com/en/prod/Content/Topics/Apps/Provisioning_Deprovisioning_Overview.htm>`__.

Configuration assistance
------------------------

We are open to providing assistance when configuring your custom IdP by answering Mattermost technical configuration questions and working with your IdP provider in support of resolving issues as they relate to Mattermost SAML configuration settings. However, we cannot guarantee your connection will work with Mattermost.

For technical documentation on SAML, see :doc:`sso-saml-technical`.

To assist with the process of getting a user file for your custom IdP, see this `documentation <https://github.com/icelander/mattermost_generate_user_file>`_.

Please note that we may not be able to guarantee that your connection will work with Mattermost, however we will consider improvements to our feature as we are able. You can see more information on getting support `here <https://mattermost.com/support/>`_ and submit requests for official support of a particular provider on our `feature idea forum <https://mattermost.uservoice.com>`_.

source/onboard/sso-saml-technical.rst METASEP
.. _sso-saml-technical:

SAML Single Sign-On: technical documentation
============================================

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Mattermost Enterprise Edition E20*

Security Assertion Markup Language (SAML) is an open standard that allows identity providers (IdP), like OneLogin, to pass authorization credentials to service providers (SP), like Mattermost.

In simpler terms, it means you can use one set of credentials to log in to many different sites. With a SAML identity provider account, you can log in to Mattermost and other sites securely with the same account.

The main benefit is that it helps administrators centralize user management by controlling which sites users have access to with their SAML identity provider credentials.

From v5.20 Mattermost supports using a single metadata URL to retrieve configuration information for the Identity Provider using your single sign-on URL to generate an IdP metadata URL. The IdP metadata XML file contains the IdP certificate, the entity ID, the redirect URL, and the logout URL. 

Using this URL populates the SAML SSO URL and the Identity Provider Issuer URL fields in the configuration process automatically and the Identity Provider Public Certificate is also downloaded from the server and set locally. 

This is currently supported for Okta and Microsoft ADFS server 2012 and 2016. OneLogin support will be added in a future release. 

For detailed steps, view the :doc:`Configure SAML with Okta <sso-saml-okta>`, :doc:`Configure SAML with Microsoft ADFS for Windows Server 2012 <sso-saml-adfs>`, and :doc:`Configure SAML with Microsoft ADFS using Microsoft Windows Server 2016 <sso-saml-adfs-msws2016>` documentation. 

.. contents::
  :backlinks: top
  :local:

SAML providers
--------------

**Identity Providers (IdP)**: An identity provider performs the authentication. When a user clicks to log in, the identity provider confirms who the user is, and sends data to the service provider with the proper authorization to access the site.

*Examples*: OneLogin, Okta, Microsoft Active Directory (ADFS) or Azure.

**Service Providers (SP)**: A service provider gets authentication and authorization information from an IdP. Once received, it gives the user access to the system and logs the user in.

*Examples*: Mattermost, Zendesk, Zoom, Salesforce.

SAML request (AuthNRequest)
---------------------------

When Mattermost initiates an SP-initiated SAML request flow, it generates a **HTTP-Redirect** binding request to the IdP that contains an XML payload as a base64 string

.. code-block:: none

 bM441nuRIzAjKeMM8RhegMFjZ4L4xPBHhAfHYqgnYDQnSxC++Qn5IocWuzuBGz7JQmT9C57nxjxgbFIatiqUCQN17aYrLn/mWE09C5mJMYlcV68ibEkbR/JKUQ+2u/N+mSD4/C/QvFvuB6BcJaXaz0h7NwGhHROUte6MoGJKMPE=

AuthNRequests can also be signed by Mattermost in v5.14 and later, in which case the XML payload is similar to:

.. code-block:: XML

  <samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" xmlns:samlsig="https://www.w3.org/2000/09/xmldsig#" ID="_u5mpjadp1fdozfih4cj8ap4brh" Version="2.0" ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" AssertionConsumerServiceURL="http://localhost:8065/login/sso/saml" IssueInstant="2019-06-08T16:00:31Z">
      <saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">https://www.okta.com/exkoxukx1D8OIfY03356</saml:Issuer>
      <samlsig:Signature Id="Signature1">
          <samlsig:SignedInfo>
              <samlsig:CanonicalizationMethod Algorithm="https://www.w3.org/2001/10/xml-exc-c14n#"></samlsig:CanonicalizationMethod>
              <samlsig:SignatureMethod Algorithm="https://www.w3.org/2000/09/xmldsig#rsa-sha1"></samlsig:SignatureMethod>
              <samlsig:Reference URI="#_u5mpjadp1fdozfih4cj8ap4brh">
                  <samlsig:Transforms>
                      <samlsig:Transform Algorithm="https://www.w3.org/2000/09/xmldsig#enveloped-signature"></samlsig:Transform>
                  </samlsig:Transforms>
                  <samlsig:DigestMethod Algorithm="https://www.w3.org/2000/09/xmldsig#sha1"></samlsig:DigestMethod>
                  <samlsig:DigestValue></samlsig:DigestValue>
              </samlsig:Reference>
          </samlsig:SignedInfo>
          <samlsig:SignatureValue></samlsig:SignatureValue>
          <samlsig:KeyInfo>
              <samlsig:X509Data>
                  <samlsig:X509Certificate>MIIFmzCCA4OgAwIBAgIJAIusvV3gZIwiMA0GCSqGSIb3DQEBCwUAMGIxCzAJBgNVBAYTAlVTMRIwEAYDVQQHDAlQYWxvIEFsdG8xEzARBgNVBAoMCk1hdHRlcm1vc3QxDzANBgNVBAsMBkRldk9wczEZMBcGA1UEAwwQYmFzZS5leGFtcGxlLmNvbTAeFw0xOTA2MDcxMjQ0MTdaFw0yOTA2MDQxMjQ0MTdaMGIxCzAJBgNVBAYTAlVTMRIwEAYDVQQHDAlQYWxvIEFsdG8xEzARBgNVBAoMCk1hdHRlcm1vc3QxDzANBgNVBAsMBkRldk9wczEZMBcGA1UEAwwQYmFzZS5leGFtcGxlLmNvbTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALAfDj+RyByszTOPRL4b+cilNF/3PB1I0CG3TNzgllgy5CwRGHLKn5/t8rPsJoWLKOUGenzVdXWuoVi3jyl5FZ1N60CBbXfmSWk20dSIkcYCcYEgs1BTBqKKYFw2dV4M0oppzNtlq7A0Glpg/gpaR/2TXEPAhOsUfORC2qAdJt9ev0AQjp5V0TkIKMZz8oo33Coi38TG5r/LG+ihRbpWzO7j9Rc2S5I6bczvG4wOg7nVKG+B5XBvuU9PjSqgxpd/F/fYf+ggAEru58E+VM4veCRV8vSPbBqDG4FMPV6DiA+tH/70n6zuPCS3soxX00kjKtP80QD6UgzvM2NN7PHiNlf0Zj6VCU3VdjEnypg7dzlHJuyyaAaTD5nSfkecamEoJpq7kaUB7uTmBHELRUhOOy24f54HnP72vnxicZL8cWsOkJwQAqIGzBxQ7J0uX4Os71WrV2YIur8QVk6KN6MBPxfiCh3xO/R+cycgx0aMrWZoyzOzP7NCTM5MNE41C48xeGviyCtUID4xiBow+xo6IDUaiCoUVJhz579ore8ic70a19DD0qHy4SpBvrUwCO54kvkgn6HjYlLC/k8nFM9F9W9wVAQD/QwIjd7EtLZLGgbU61Jv3q4kZxxq270hogCRY0lmI3RxkedGHhetF7kaizrikW5zJQEeido/ir37HhX5AgMBAAGjVDBSMBIGA1UdEwEB/wQIMAYBAf8CAQAwPAYDVR0RBDUwM4IQbG9ncy5leGFtcGxlLmNvbYITbWV0cmljcy5leGFtcGxlLmNvbYcEwKgAAYcEfwAAATANBgkqhkiG9w0BAQsFAAOCAgEAH1O91BABHXZjrU7v1OwG+GbU/4TYZqBXXNxax++OFSRCkEEoNKGg49R6J7lY4lrm12zBlw+oGSyjIOerzi39/dcxDkKpzyhGvEN4mExbDlybmdCVrHPeWgZl7uwqn4Bj1xiu97M6eMthgxJE7KVNDGDHthGL0/fTlONIh3qS7Far33hLHJJKy3+lC1MDB8cNltV3mf/ctHCx5Wa0bfZId0MJgd/seP0WU1HCf3kIxhnhsnOYs32xu7EGiM4/lgnquVd/q/f99ueSaDSHrep373/w2ce9iF3U0qcLd2iP8ayF/daGeW1dVPL9R10Oe4BpRjMkjlLwhZdjJeKSg9GBa2GXUEn1Ru9vpSw/C10no3Qx/6ZHweYbSmJ6hBg4T0nDBp6iVS1eQULNXxDuDWb26U0ESOO5jK8ATywuc45o0bqdvD1XOrGYGfGnofx7ofRWwKHWfltvxurnbsyo2vH6nM6K41K2DpVdyQOKAGvKe/oCWfdi+WyBQJGWcIp2OTC1XyWHv7JsY3lo04+islkHEcqJyd8Rf8GWmRHdXz0WzGiZbxWzAuvRRWnzM31VAws8kQBHTBwIJlJoGX4AXfEvPi+NTxkntf8cQdJucK9ZZbP4ycXHULO4LneyJoJ9Q7nxX11xWv7BDWxxclOXy6tyUkg9Fjb7pQ/HCVvGhRzilVU=</samlsig:X509Certificate>
              </samlsig:X509Data>
          </samlsig:KeyInfo>
      </samlsig:Signature>
  </samlp:AuthnRequest>

SAML responses
--------------

There are different types of SAML responses sent by the IdP to the SP. The response contains the Assertion with the NameID and attributes of a user.

Below is a table of the different types of responses. Each response type is fully supported except when the SAML assertion is signed while the SAML response itself is not:

.. csv-table::
    :header: "Signed SAML Response", "Signed SAML Assertion", "Encrypted SAML Assertion", "Supported by Mattermost"

    "Yes", "Yes", "Yes", "Yes"
    "Yes", "Yes", "No", "Yes"
    "Yes", "No", "Yes", "Yes"
    "Yes", "No", "No", "Yes"
    "No", "Yes", "Yes", "Partially, validation of assertion signature not supported"
    "No", "Yes", "No", "Partially, validation of assertion signature not supported"
    "No", "No", "Yes", "Yes"
    "No", "No", "No", "Yes"

For example XML responses for each type, see the `OneLogin SAML response examples <https://www.samltool.com/generic_sso_res.php>`_.

Technical description of SAML synchronization with AD/LDAP
------------------------------------------------------------

When enabled, SAML synchronization with AD/LDAP occurs in phases:

1. Get all the current LDAP users from the Mattermost database who have ``Users.AuthService`` set to ``ldap``. This is a SQL query issued against the Mattermost database: ``SELECT * FROM Users WHERE AuthService = 'ldap'``.
2. Get all the current SAML users from the Mattermost database who have ``Users.AuthService`` set to ``saml``. This is a SQL query issued against the Mattermost database: ``SELECT * FROM Users WHERE AuthService = 'saml'``.
3. Get all the current LDAP users from the LDAP server as defined by ``LdapSettings.UserFilter``. This is an `LDAP query <https://github.com/mattermost/mattermost-server/blob/master/scripts/ldap-check.sh>`__ issued against the LDAP server. Users are retrieved in batches as defined by ``LdapSettings.MaxPageSize``.
4. Update LDAP attributes. For each existing Mattermost user retrieved in step 1, attempt to find a match against the list of LDAP users from step 3. To find matches, ``Users.AuthData`` field of the Mattermost user is compared against the ``LdapSettings.IdAttribute`` LDAP setting.

 - If any attribute of the user has changed, that attribute is copied from the LDAP server and the user is marked as updated.
 - If the corresponding ``LdapSettings.IdAttribute`` is not found, the user is assumed to be deleted from the LDAP server, and deactivated from Mattermost by setting the ``Users.DeleteAt`` field to a valid timestamp.

5. Update SAML attributes. For each existing Mattermost user retrieved in step 2, attempt to find a match against the list of LDAP users from step 3. To find matches, ``SamlSettings.Email`` is compared against the ``LdapSettings.EmailAttribute`` LDAP setting.

 - If any attribute of the user has changed, that attribute is copied from the LDAP server and the user is marked as updated.
 - If the corresponding ``LdapSettings.EmailAttribute`` is not found, the user is assumed to be deleted from the LDAP server, and deactivated from Mattermost by setting the ``Users.DeleteAt`` field to a valid timestamp.

Frequently Asked Questions
--------------------------

How can I obtain a SAML metadata XML file consumed by Mattermost?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

You can obtain the XML file by calling the Mattermost RESTful API endpoint at ``/api/v4/saml/metadata``.

For other useful SAML API calls, see the `API reference <https://api.mattermost.com/#tag/SAML>`_.

Can I update user attributes using the API?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

No. When Mattermost is configured to use SAML for user authentication, the following user attribute changes can't be made through the API:  first name, last name, position, nickname, email, profile image, or username. SAML must be the authoritative source for these user attributes.

source/onboard/sso-saml-onelogin.rst METASEP
Configure SAML with OneLogin
=============================

The following process provides steps to configure SAML 2.0 with OneLogin for Mattermost.

.. contents::
  :backlinks: top
  :local:

.. include:: sso-saml-before-you-begin.rst
  :start-after: :nosearch:

Create a OneLogin connection app for Mattermost SSO
---------------------------------------------------

1. Add a SAML test connector app.

  a. Log in to OneLogin as an administrator.
  b. Go to **Apps > Add Apps**.
  c. Search for "SAML Test Connector", then select **SAML Test Connector (Advanced)**.

  .. image:: ../../source/images/onelogin_1_new_app.png

  d. In the **Display Name** field, enter a name for the application, then optionally upload an app icon. You can use the Mattermost logo for the icon, which you can download from `Branding Guidelines <https://handbook.mattermost.com/operations/operations/publishing/publishing-guidelines/brand-and-visual-design-guidelines>`__ page.

  .. image:: ../../source/images/onelogin_2_basic_configuration.png

  e. Make sure that the **Visible in portal** option is enabled.
  f. Select **Save**.

2. Configure the app.

  a. Select the **Configuration** tab, then enter the following values:

    - **RelayState**: leave blank
    - **Audience**: leave blank
    - **Recipient**: ``https://<your-mattermost-url>/login/sso/saml`` where ``https://<your-mattermost-url>`` should typically match the `Mattermost Site URL <https://docs.mattermost.com/configure/configuration-settings.html#site-url>`__.
    - **ACS (Consumer) URL Validator**: ``https:\/\/<your-mattermost-url>\/login\/sso\/saml``
    - **ACS (Consumer) URL**: ``https://<your-mattermost-url>/login/sso/saml``

  .. image:: ../../source/images/onelogin_3_configuration_1.png
  
  b. In System Console,  `enable encryption <https://docs.mattermost.com/configure/configuration-settings.html#enable-encryption>`__, then select **Save**. You're redirected to the **Info** tab. From there, select the **Configuration** tab to access the **SAML Encryption** field.

  c. Paste the Public Key that you generated earlier into the **SAML Encryption** field at the bottom of the page. This field displays in OneLogin only when encryption is enabled in Mattermost.

  .. image:: ../../source/images/onelogin_4_configuration_2.png

  d. Select **Save**.

3. Enter the attribute parameters. The following attributes are recommended:

+----------------+-------------+
| Name           | Value       | 
+================+=============+
| ID             | UUID        |
+----------------+-------------+
| Email          | Email       |  
+----------------+-------------+
| FirstName      | First Name  |  
+----------------+-------------+
| LastName       | Last Name   |  
+----------------+-------------+
| Name ID value  | Email       |  
+----------------+-------------+
| Username       | Username    |
+----------------+-------------+

  Attribute parameters map attributes between OneLogin and Mattermost. For more information on which attributes are configurable, see our :ref:`documentation on SAML configuration settings <saml-enterprise>`.

  *Email* attributes are required. For Mattermost servers running version 3.3 and earlier, ``FirstName`` and ``LastName`` attributes are also required.

  a. Select the **Parameters** tab.
  b. Select **Add Parameter**.

  .. image:: ../../source/images/onelogin_5_parameters_add.png

  c. In the **Field name** field, enter an attribute parameter such as ``Email``.
  d. Select the **Include in SAML assertion** checkbox.
  e. Select **Save**.

  .. image:: ../../source/images/onelogin_6_parameters_add_2.png

  f. Select **Edit**.
  g. In the **Value** field, select the OneLogin value that corresponds to the attribute parameter.

  .. image:: ../../source/images/onelogin_7_parameters_add_3.png

  h. Repeat the steps above to add any other attributes that you need. After you've added all the attributes you want to use, the parameter list should look similar to the following image:

    .. image:: ../../source/images/onelogin_8_parameters_add_4.png

4. Copy the SSO information.

  a. Select the **SSO** tab.
  b. Copy the values in the **Issuer URL** and **SAML 2.0 Endpoint (HTTP)** fields, then save them for later use.

  .. image:: ../../source/images/onelogin_9_sso.png

  c. Select **View Details** to view the X.509 certificate.
  d. Make sure that the **X.509 PEM** option is selected in the drop-down.

  .. image:: ../../source/images/onelogin_10_sso_certificate.png

  e. Select **DOWNLOAD**, then save the file in a convenient location for later use.

5. Save all your changes.

Configure SAML Sign-On for Mattermost
--------------------------------------

1. Start the Mattermost server, then log in to Mattermost as a System Administrator. Go to **System Console > Authentication > SAML**.

  a. Enter the **OneLogin Issuer URL** into the **Identity Provider Metadata URL** field.
  b. Select **Get SAML Metadata from IdP** to download the metadata.

2. Configure Mattermost to verify the signature.

  a. In the **Verify Signature** field, select **True**.
  b. In the **Service Provider Login URL**, enter ``https//<your-mattermost-url>/login/sso/saml``.

  .. image:: ../../source/images/okta_11_mattermost_verification.png

3. Configure Mattermost to sign SAML requests using the Service Provider Private Key.

4. Enable encryption.

  a. In the **Enable Encryption** field, select **True**.
  b. In the **Service Provider Private Key** field, upload the private key that you generated earlier.
  c. In the **Service Provider Public Certificate** field, upload the public key that you generated earlier.

  .. image:: ../../source/images/okta_12_mattermost_encryption.png

5. Set attributes for the SAML Assertions, which are used for updating user information in Mattermost.

  The **Email Atttribute** field and the **Username Attribute** field are required, and should match the values that you entered earlier when you configured the SAML Test Connector on OneLogin.

  For Mattermost servers running version 3.3 and earlier, ``FirstName`` and ``LastName`` attributes are also required.

  .. image:: ../../source/images/okta_13_mattermost_attributes.png

6. (Optional) Customize the login button text.

7. Select **Save**.

8. (Optional) If you configured ``First Name`` Attribute and ``Last Name`` Attribute, go to **System Console > Site Configuration > Users and Teams**, then set **Teammate Name Display** to **Show first and last name**. This is recommended for a better user experience.

To confirm that SAML SSO is successfully enabled, switch your System Administrator account from email to SAML-based authentication from your avatar via **Profile > Security > Sign-in Method > Switch to SAML SSO**, then log in with your SAML credentials to complete the switch.

We also recommend that you post an announcement to your users detailing how the migration will work.

You can also configure SAML for OneLogin by editing the ``config.json`` file to enable SAML based on :ref:`SAML configuration settings <saml-enterprise>`. You must restart the Mattermost server for the changes to take effect.

.. include:: sso-saml-ldapsync.rst
  :start-after: :nosearch:

.. include:: sso-saml-faq.rst
  :start-after: :nosearch:
source/onboard/sso-saml-okta.rst METASEP
Configure SAML with Okta
========================

The following process provides steps to configure SAML 2.0 with Okta for Mattermost.

.. contents::
  :backlinks: top
  :local:

.. include:: sso-saml-before-you-begin.rst
	:start-after: :nosearch:

Set Up a connection app for Mattermost Single Sign-On
-----------------------------------------------------

1. Log in to Okta as an administrator.

2. Switch to the **Classic UI**, using the drop-down in the upper left.

3. Go to **Admin Dashboard > Applications > Add Application**.

4. Select **Create New App**, then choose **SAML 2.0** as the Sign on method.

	.. image:: ../../source/images/okta_1_new_app.png

5. Enter **General Settings** for the application, including **App name** and **App logo** (optional). It's recommended to display the application icon to users, including in the Okta Mobile app. If you’d like to use a Mattermost logo for the application, you can download one `from our page <https://handbook.mattermost.com/operations/operations/publishing/publishing-guidelines/brand-and-visual-design-guidelines>`__.

	.. image:: ../../source/images/okta_2_general_settings.png

6. Enter **SAML Settings**, including:

 - **Single sign on URL:** ``https://<your-mattermost-url>/login/sso/saml`` where ``https://<your-mattermost-url>`` should typically match the `Mattermost Site URL <https://docs.mattermost.com/configure/configuration-settings.html#site-url>`__.
 - **Audience URI:** For instance, ``mattermost``
 - **Name ID format:** ``unspecified``
 - **Application username:** ``Email``

	.. image:: ../../source/images/okta_3_initial_saml_settings.png

7.  To set up encryption for your SAML connection, select **Show Advanced Settings**.

	.. image:: ../../source/images/okta_4_initial_saml_settings.png

8. Set **Assertion Encryption** as **Encrypted**, then upload the Service Provider Public Certificate you generated earlier to the **Encryption Certificate** field.

	.. image:: ../../source/images/okta_5_advanced_saml_settings.png

9. Enter attribute statements used to map attributes between Okta and Mattermost. For more information on which attributes are configurable, see our `documentation on SAML configuration settings <https://docs.mattermost.com/configure/configuration-settings.html#saml>`__. Email and username attributes are required. For SAML with Okta, an `ID attribute <https://docs.mattermost.com/configure/configuration-settings.html#id-attribute>`__ is also required, and that ID must be mapped to ``user.id``. 

	.. image:: ../../source/images/okta_6_attribute_statements.png

10. Select **Next**. Then, set Okta support parameters for the application. Recommended settings:

 - **I’m an Okta customer adding an internal app**
 - **This is an internal app that we have created**

	.. image:: ../../source/images/okta_7_support_configuration.png

11. Select **Finish**. 

12. In the Mattermost System Console, go to **Authentication > SAML 2.0**, then set **Override SAML bind data with AD/LDAP information** to **false** if currently set to **true**. You can re-enable `this configuration setting <https://docs.mattermost.com/configure/configuration-settings.html#override-saml-bind-data-with-ad-ldap-information>`__ later when once setup is complete.

13. On the next screen, select the **Sign On** tab, then select **View Setup Instructions**.

14. Select the **Identity Provider metadata** link, then copy the link from the browser URL field. This will be used during the SAML configuration steps in the next section. 

	.. image:: ../../source/images/okta_8_view_instructions.png

15. Take note of **Identity Provider Single Sign-On URL** (also known as **SAML SSO URL**), and the Identity Provider Issuer, as both may be needed to configure SAML for Mattermost. 

16. Download the X.509 Certificate file and save it. You may need to upload it to Mattermost in a later step.

	.. image:: ../../source/images/okta_9_view_instructions.png

Configure SAML Sign-On for Mattermost
--------------------------------------

Start the Mattermost server and log in to Mattermost as a System Admin. Go to **System Console > Authentication > SAML 2.0**, then paste the copied Identity Provider Metadata URL in the **Identity Provider Metadata URL** field and select **Get SAML Metadata from IdP**.

This populates the **SAML SSO URL** and the **Identity Provider Issuer URL** fields automatically. The Identity Provider Public Certificate is also downloaded from the server and set locally. 

Alternatively you can enter the following fields manually:
 - **SAML SSO URL:** ``Identity Provider Single Sign-On URL`` from Okta, specified earlier.
 - **Identity Provider Issuer URL:** ``Identity Provider Issuer`` from Okta, specified earlier.
 - **Identity Provider Public Certificate:** X.509 Public Certificate file you downloaded from Okta earlier.
 
	.. image:: ../../source/images/okta_10_mattermost_basics.png

2. Configure Mattermost to verify the signature. The **Service Provider Login URL** is the ``Single sign on URL`` you specified in Okta earlier.

	.. image:: ../../source/images/okta_11_mattermost_verification.png

3. Enable encryption based on the parameters provided earlier.

	.. image:: ../../source/images/okta_12_mattermost_encryption.png

4. Configure Mattermost to sign SAML requests using the Service Provider Private Key.

5. Set attributes for the SAML Assertions used to update user information in Mattermost. 
	- Attributes for Email, Username, and Id are required and should match the values you entered in Okta earlier.
	
	.. image:: ../../source/images/okta_13_mattermost_attributes.png	

6. (Optional) Customize the login button text.

	.. image:: ../../source/images/okta_14_mattermost_login_button.png

7. Select **Save**.

8. (Optional) If you configured ``First Name`` Attribute and ``Last Name`` Attribute, go to **System Console > Site Configuration > Users and Teams**, then set **Teammate Name Display** to **Show first and last name**. This is recommended for a better user experience.

Once complete, and to confirm SAML SSO is successfully enabled, switch your System Administrator account from email to SAML-based authentication from your avatar via **Profile > Security > Sign-in Method > Switch to SAML SSO**, then log in with your SAML credentials to complete the switch.

We also recommend that you post an announcement for your users to explain how the migration will work.

You may also configure SAML for Okta by editing the ``config.json`` file to enable SAML based on :ref:`SAML configuration settings <saml-enterprise>`. You must restart the Mattermost server for the changes to take effect.

.. include:: sso-saml-ldapsync.rst
	:start-after: :nosearch:

.. include:: sso-saml-faq.rst
	:start-after: :nosearch:

source/onboard/sso-saml-ldapsync.rst METASEP
:nosearch:

Configure SAML synchronization with AD/LDAP
--------------------------------------------

In addition to configuring SAML sign-in, you can optionally configure synchronizing SAML accounts with AD/LDAP. When configured:

 - Mattermost queries AD/LDAP for relevant account information and updates SAML accounts based on changes to attributes (first name, last name, and nickname)
 - Accounts disabled in AD/LDAP are made inactive in Mattermost, and their active sessions are revoked once Mattermost synchronizes attributes.

To configure SAML synchronization with AD/LDAP:

1. Go to **System Console > Authentication > SAML 2.0**, then set **Enable Synchronizing SAML Accounts With AD/LDAP** to **true**.
2. Go to  **System Console > Authentication > AD/LDAP**, then set **Enable Synchronization with AD/LDAP** to **true**.
3. To ignore guest users when sychronizing, go to **System Console > Authentication > SAML 2.0**, then set **Ignore Guest Users when Synchronizing with AD/LDAP** to **true**. 
4. Set the rest of the AD/LDAP settings based on `configuration settings documentation <https://docs.mattermost.com/configure/configuration-settings.html#ad-ldap-settings>`__ to connect Mattermost with your AD/LDAP server.

 - If you don't want to enable AD/LDAP sign-in, go to **System Console > Authentication > AD/LDAP**, then set **Enable sign-in with AD/LDAP** to **false**.

5. To specify how often Mattermost synchronizes SAML user accounts with AD/LDAP, go to **System Console > Authentication > AD/LDAP**, then set a **Synchronization Interval** in minutes. The default setting is 60 minutes. If you want to synchronize immediately after disabling an account, select **AD/LDAP Synchronize Now**.
6. To confirm that Mattermost can successfully connect to your AD/LDAP server, go to **System Console > Authentication > AD/LDAP**, then select **AD/LDAP Test**.

Once the synchronization with AD/LDAP is enabled, user attributes are synchronized with AD/LDAP based on their email address. If a user with a given email address doesn't have an AD/LDAP account, they will be deactivated in Mattermost on the next AD/LDAP sync. 

To re-activate the account:

1. Add the user to your AD/LDAP server.
2. Purge all caches in Mattermost by going to **System Console > Environment > Web Server**, then select **Purge All Caches**.
3. Run AD/LDAP synchronization by going to **System Console > Authentication > AD/LDAP**, then select **AD/LDAP Synchronize Now**.
4. Purge all caches again in Mattermost by going to **System Console > Environment > Web Server**, then select **Purge All Caches** again. This re-activates the account in Mattermost.

  .. note::
    If a user is deactivated from AD/LDAP, they will be deactivated in Mattermost on the next sync. They will be shown as "Inactive" in the System Console users list, all of their sessions will expire and they won't be able to log back in to Mattermost.

    If a user is deactivated from SAML, their session won't expire until they're deactivated from AD/LDAP. However, they won't be able to log back in to Mattermost.

  .. note::
    SAML synchronization with AD/LDAP is designed to pull user attributes such as first name and last name from your AD/LDAP, not to control authentication.

    In particular, the user filter cannot be used to control who can log in to Mattermost, this should be controlled by your SAML service provider's group permissions.

See :ref:`technical description of SAML synchronization with AD/LDAP <sso-saml-technical>` for more details.

Override SAML data with AD/LDAP data
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Alternatively, you can choose to override SAML bind data with AD/LDAP information. For more information on binding a user with the SAML ID Attribute, please refer to this `documentation <https://docs.mattermost.com/onboard/sso-saml-okta.html#how-to-bind-authentication-to-id-attribute-instead-of-email>`__.

This process overrides SAML email address with AD/LDAP email address data or SAML Id Attribute with AD/LDAP Id Attribute if configured. We recommend using this configuration with the SAML ID Attribute to help ensure new users are not created when the email address changes for a user.

To ensure existing user accounts do not get disabled in this process, ensure the SAML IDs match the LDAP IDs by exporting data from both systems and comparing the ID data. Mapping ID Attributes for both AD/LDAP and SAML within Mattermost to fields that hold the same data will ensure the IDs match as well.

1. Set the SAML ``Id Attribute`` by going to **System Console > Authentication > SAML 2.0 > Id Attribute**.
2. Set **System Console > Authentication > SAML 2.0 > Override SAML bind data with AD/LDAP information** to **true**.
3. Set **System Console > Authentication > SAML 2.0 > Enable Synchronizing SAML Accounts With AD/LDAP** to **true**.
4. Run AD/LDAP sync by going to **System Console > Authentication > AD/LDAP**, then select **AD/LDAP Synchronize Now**.

source/onboard/sso-saml-keycloak.rst METASEP
Configure SAML with Keycloak
============================

The following process provides steps to configure SAML with Keycloak for Mattermost.

.. contents::
  :backlinks: top
  :local:

Set up a connection app for Mattermost SSO
-------------------------------------------

1. Log in to Keycloak as an administrator.

2. Click **Clients** then **Create** and save. You'll use this client ID in a later step.

    - **Client ID**: ``mattermost``
    - **Client Protocol**: ``saml``

3. Edit the Mattermost client to have the below values:

    - **Enabled**: **ON**
    - **Encrypt Assertions**: **ON**
    - **Force Name ID Format**: **ON**
    - **Name ID Format**: **Email**
    - **Valid Redirects**: ``https://<<siteURL>>/login/sso/saml``
    - **Base URL**: ``https://<<siteURL>>/login/sso/saml``

.. image:: ../../source/images/keycloak_1_client_settings.png

4. Save the client config.

5. Navigate to **Keys** within the client config.

6. Select **Generate new keys**.

7. Select **Export**, use the values below, and then select **Download**.

    - **Archive Format**: ``PKCS12``
    - **Key Alias**: ``mattermost``
    - **Key Password**: ``mattermost``
    - **Store Password**: ``mattermost``

.. image:: ../../source/images/keycloak_2_saml_keys.png

8. Add the default attributes:

    a. Within your Mattermost client select **Mappers**.
    b. Select **Add Buildin**
    c. Select the **X500 email**, **X500 givenName**, and **X500 surname** attributes.
    d. Select **Add selected**.

.. image:: ../../source/images/keycloak_3_add_builtins.png

9. Add the username and ID attribute.

    a. With the **Mappers** section of your client, select **Create**.
    b. Set **Name** to ``Username``.
    c. Under Mapper Type select **User Property**.
    d. Set **Property** to ``username`` (This is case sensitive and must be lowercase).
    e. Set **SAML Attribute Name** to ``username``.
    f. Select **Save**.
    g. Repeat this step and use the property of ``id`` to create the ID Attribute.

.. image:: ../../source/images/keycloak_4_create_username_attribute.png

10. Get the metadata URL from Keycloak:

    a. Within your Realm, select **Realm Settings**.
    b. At the bottom of the **General** tab you should see a **SAML 2.0 Identity Provider Metadata** endpoint. Right-click and copy this URL. Store for the next step.

.. image:: ../../source/images/keycloak_9_export_metadata.png

Configure SAML for Mattermost
-----------------------------

1. Start the Mattermost server and log in to Mattermost as a System Administrator. Go to **System Console > Authentication > SAML**.

2. Set the **Identity Provider Metadata URL** to the value you copied from the step above and select **Get SAML Metadata from IdP**. The metadata import will populate fields related to your Keycloak configuration.

    If you have any issues with this import, you can check the ``mattermost.log`` file for more information. You will need to turn on debug logging and try again if you do not already have debug logging enabled.

.. image:: ../../source/images/keycloak_10_get_metadata.png

3. Set the below fields:

    - **Verify Signature**: **false**
    - **Service Provider Login URL**: ``http://<<siteURL>>/login/sso/saml``
    - **Service Provider Identifier**: ``mattermost``

    The Service Provider Identifier will match the **Client ID** that you configured in the second Keycloak step.

.. image:: ../../source/images/keycloak_5_mattermost_config.png

4. Configure the Encryption using the key you downloaded in step 8 of the Keycloak config.

    a. Generate the ``.crt`` file from the ``.p12`` file.
    
        ``openssl pkcs12 -in keystore.p12 -out mattermost.crt -nodes``

    b. Generate the ``.key`` file from the ``.p12`` file.
    
        ``openssl pkcs12 -in keystore.p12 -out mattermost.key -nodes -nocerts``
        
    c. Upload both of these files within the Mattermost System Console. Make sure to select **Upload**.
    
      - **Service Provider Private Key**: ``mattermost.key``
      - **Service Provider Private Certificate**: ``mattermost.crt``

.. image:: ../../source/images/keycloak_6_mattermost_encryption.png

5. (Optional) Set up request signing with the below parameters.

.. image:: ../../source/images/keycloak_7_mattermost_request_signing.png

6. Set attributes for the SAML Assertions, which will update user information in Mattermost. Attributes for email and username are required to match the values you configured in Keycloak in steps 9 and 10. See `documentation on SAML configuration settings <https://docs.mattermost.com/configure/configuration-settings.html#saml>`__ for more detail.

    - **Email Attribute**: ``email``
    - **Username Attribute**:  ``username``
    - **Id Attribute**: ``id``

.. image:: ../../source/images/keycloak_8_mattermost_attributes.png

7. Select **Save**.

You’re done! If you’d like to confirm SAML SSO is successfully enabled, switch your System Administrator account from email to SAML-based authentication via **Profile > Security > Sign-in Method > Switch to SAML SSO** and log in with your SAML credentials to complete the switch.

It's also recommended to post an announcement about how the migration will work for users.

You may also configure SAML for Keycloak by editing ``config.json``. Before starting the Mattermost server, edit ``config.json`` to enable SAML based on `SAML configuration settings <https://docs.mattermost.com/configure/configuration-settings.html#saml>`__. You must restart the Mattermost server for the changes to take effect.

.. include:: sso-saml-ldapsync.rst
    :start-after: :nosearch:

.. include:: sso-saml-faq.rst
	:start-after: :nosearch:

source/onboard/sso-saml-faq.rst METASEP
:nosearch:

Frequently Asked Questions
--------------------------

How to bind authentication to ``Id`` attribute instead of email
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Alternatively, you can use an ``Id`` attribute instead of email to bind the user.  We recommend choosing an ID that is unique and will not change over time.  

Configuring with an ``Id`` attribute allows you to reuse an email address for a new user without the old user's information being exposed. For instance, if a user with an email address joe.smith@mattermost.com was once an employee, a new employee named Joe Smith can use the same email. This configuration is also useful when a user's name changes and their email needs to be updated. 

This process was designed with backwards compatibility to email binding. Here is the process applied to new account creations and to accounts logging in after the configuration:

- A user authenticated with SAML is bound to the SAML service user using the Id Attribute (as long as it has been configured) or bound by email using the email received from SAML. 
- When the user tries to login and the SAML server responds with a valid authentication, then the server uses the "Id" field of the SAML authentication to search the user. 
- If a user bound to that ID already exists, it logs in as that user. 
- If a user bound to that ID does not exist, it will search base on the email. 
- If a user bound to the email exists, it logs in with email and updates the autentication data to the ID, instead of the email. 
- If a user bound to the ID or email does not exist, it will create a new Mattermost account bound to the SAML account by ID and will allow the user to log in. 

.. note::
    Existing accounts won't update until they log in to the server. 
 
Can SAML via Microsoft ADFS be configured with Integrated Windows Authentication (IWA)?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Yes. IWA is supported on the browser, with support added to iOS and Android mobile apps in Q2/2019 (mobile apps v1.18 and later).

However, IWA is not supported on the Mattermost Desktop Apps due to a limitation in Electron. As a workaround you may create a browser desktop shortcut for quick access to Mattermost, just like a Desktop App.

How do I migrate users from one authentication method (e.g. email) to SAML?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

See the `user migrate_auth CLI command <https://docs.mattermost.com/manage/command-line-tools.html#mattermost-user-migrate-auth>`__ documentation, or see the `mmctl user migrate_auth command <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-user-migrate-auth>`__ for details.

How is SAML different from OAuth 2.0 and OpenId Connect?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

OAuth 2.0 was primarily intended for delegated authorization, where an app is authorized to access resources, such as Google contact list. It doesn’t deal with authentication.

OpenID Connect is built on top of OAuth 2.0, which supports authentication and thus direct SSO.

SAML is like OpenID Connect, except typically used in enterprise settings. OpenID Connect is more common in consumer websites and web/mobile apps.

Learn more at https://hackernoon.com/demystifying-oauth-2-0-and-openid-connect-and-saml-12aa4cf9fdba.


source/onboard/sso-saml-before-you-begin.rst METASEP
:nosearch:

Before you begin
----------------

Before you begin, you need generate encryption certificates for encrypting the SAML connection.

1. You can use the `Bash script <https://github.com/mattermost/docs/tree/master/source/scripts/generate-certificates>`__ from the ``mattermost/docs`` repository on GitHub, or any other suitable method.
2. Save the two files that are generated. They are the private key and the public key. In the System Console, they are referred to as the **Service Provider Private Key** and the **Service Provider Public Certificate** respectively.

source/onboard/sso-saml-adfs.rst METASEP
Configure SAML with Microsoft ADFS for Windows Server 2012
==========================================================

The following process provides steps to configure SAML 2.0 with Microsoft ADFS for Mattermost.

.. contents::
  :backlinks: top
  :local:

.. include:: sso-saml-before-you-begin.rst
	:start-after: :nosearch:

The following are basic requirements to use ADFS for Mattermost:
 - An Active Directory instance where all users have a specified email and username attributes. For Mattermost servers running 3.3 and earlier, users must also have their first name and last name attributes specified.
 - A Microsoft Server running. The screenshots used in this guide are from Microsoft Server 2012R2, but similar steps should work for other versions.
 - An SSL certificate to sign your ADFS login page.
 - ADFS installed on your Microsoft Server. You can find a detailed guide for deploying and configuring ADFS in `this article <https://msdn.microsoft.com/en-us/library/gg188612.aspx>`__.

On your ADFS installation, note down the value of the **SAML 2.0/W-Federation URL** in ADFS Endpoints section, also known as the **SAML SSO URL Endpoint** in this guide. If you chose the defaults for the installation, this will be ``/adfs/ls/``.

Add a relying party trust
-------------------------

1. In the ADFS management sidebar, go to **AD FS > Trust Relationships > Relying Party Trusts**, then select **Add Relying Party Trust**. A configuration wizard opens for adding a new relying party trust. 

	.. image:: ../../source/images/adfs_1_add_new_relying_party_trust.png

2. On the **Welcome** screen, select **Start**.

	.. image:: ../../source/images/adfs_2_start_wizard.png

3. On the **Select Data Source** screen, select **Enter data about the relying party manually**.

	.. image:: ../../source/images/adfs_3_select_data_source.png

4. On the **Specify Display Name** screen, enter a **Display Name** to recognize the trust, such as ``Mattermost``, then add any notes you want to make.

	.. image:: ../../source/images/adfs_4_specify_display_name.png

5. On the **Choose Profile** screen, select **AD FS profile**.

	.. image:: ../../source/images/adfs_5_choose_profile.png

6. On the **Configure Certificate** screen, leave the certificate settings at their default values.

	.. image:: ../../source/images/adfs_6_configure_certificate_default.png

However, if you would like to set up encryption for your SAML connection, select **Browse**, then upload your Service Provider Public Certificate.

	.. image:: ../../source/images/adfs_7_configure_certificate_encryption.png

7. On the **Configure URL** screen, select **Enable Support for the SAML 2.0 WebSSO protocol**, then enter the **SAML 2.0 SSO service URL**, similar to ``https://<your-mattermost-url>/login/sso/saml`` where ``<your-mattermost-url>`` should typically match the `Mattermost Site URL <https://docs.mattermost.com/configure/configuration-settings.html#site-url>`__.

	.. image:: ../../source/images/adfs_8_configure_url.png

8. On the **Configure Identifiers** screen, enter the **Relying party trust identifier** (also known as the **Identity Provider Issuer URL**) of the form ``https://<your-idp-url>/adfs/services/trust``, then click **Add**.

	.. image:: ../../source/images/adfs_9_configure_identifiers.png

9. On the **Configure Multi-factor Authentication Now** screen, you may enable multi-factor authentication. This is beyond the scope of this documentation.

	.. image:: ../../source/images/adfs_10_configure_mfa.png

10. On the **Choose Issuance Authorization Rules** screen, select **Permit all users to access this relying party**.

	.. image:: ../../source/images/adfs_11_authorization.png

11. On the **Ready to Add Trust** screen, review your settings.

	.. image:: ../../source/images/adfs_12_ready_to_add_trust.png

12. On the **Finish** screen, select **Open the Edit Claim Rules dialog for this relying party trust when the wizard closes**, then select **Close**. You exit the configuration wizard, and a **Claim Rules** editor opens.

	.. image:: ../../source/images/adfs_13_finish_trust.png

Create claim rules
------------------

1. In the **Issuance Transform Rules** section of the **Claim Rules** editor, select **Add Rule…** to open an **Add Transform Claim Rule Wizard**.

	.. image:: ../../source/images/adfs_14_claim_rules_editor.png

2. On the **Choose Rule Type** screen, select **Send LDAP Attributes as Claims** from the drop-down menu, then select **Next**.

	.. image:: ../../source/images/adfs_15_choose_rule_type.png

3. In the **Configure Claim Rule** screen, enter a **Claim Rule Name** of your choice, select **Active Directory** as the **Attribute Store**, then complete the following:

  - From the **LDAP Attribute column**, select ``E-Mail-Addresses``. From the **Outgoing Claim Type**, type ``Email``.
  - From the **LDAP Attribute column**, select ``E-Mail-Addresses``. From the **Outgoing Claim Type**, type ``Name ID``.
  - From the **LDAP Attribute column**, select ``Given-Name``. From the **Outgoing Claim Type**, type ``FirstName``.
  - From the **LDAP Attribute column**, select ``Surname``. From the **Outgoing Claim Type**, type ``LastName``.
  - From the **LDAP Attribute column**, select ``SAM-Account-Name``. From the **Outgoing Claim Type**, type ``Username``.

From Mattermost version 3.4, the ``FirstName`` and ``LastName`` attributes are optional.

Select **Finish** to add the rule.

Note that the entries in the **Outgoing Claim Type** column can be chosen to be something else. They can contain dashes but no spaces. They will be used to map the corresponding fields in Mattermost later.

	.. image:: ../../source/images/adfs_16_configure_claim_rule.png

4. Create another new rule by selecting **Add Rule**.

5. On the **Choose Rule Type** screen, select **Transform an Incoming Claim** from the drop-down menu, then select **Next**.

	.. image:: ../../source/images/adfs_17_transformation_of_incoming_claim.png

6. On the **Configure Claim Rule** screen, enter a **Claim Rule Name** of your choice, then:

  - Select **Name ID** for the **Incoming claim type**.
  - Select **Unspecified** for the **Incoming name ID format**.
  - Select **E-Mail Address** for the **Outgoing claim type**.

Select **Pass through all claim values**, then select **Finish**.

	.. image:: ../../source/images/adfs_18_configure_incoming_claim.png

7. Select **Finish** to create the claim rule, then select **OK** to finish creating rules.

8. Open Windows PowerShell as an administrator, then run the following command:

  ``Set-ADFSRelyingPartyTrust -TargetName <display-name> -SamlResponseSignature "MessageAndAssertion"``

where ``<display-name>`` is the name you specified in step 4 when adding a relying party trust. In this example, ``<display-name>`` would be ``mattermost``.

This action adds the signature to SAML messages, making verification successful.

Export identity provider certificate
-------------------------------------

Next, export the identity provider certificate, which will be later uploaded to Mattermost to finish SAML configuration.

1. In the ADFS management sidebar, go to **AD FS > Service > Certificates**, then double click on the certificate under **Token-signing**. Alternatively, you can right-click on the field, then select **View Certificate**.

	.. image:: ../../source/images/adfs_19_export_idp_cert_start.png

2. On the **Certificate** screen, go to the **Details** tab, then select **Copy to File**, followed by **OK**. This opens a **Certificate Export Wizard**.

	.. image:: ../../source/images/adfs_20_export_idp_cert_copy.png

3. On the **Certificate Export Wizard** screen, select **Next**, then, select the option **Base-64 encoded X.509 (.CER)**, and select **Next** again.

	.. image:: ../../source/images/adfs_21_export_idp_cert_wizard.png

4. On the **Certificate Export Wizard** screen, select **Browse** to specify the location where you want the Identity Provider Certificate to be exported, then specify the file name.

	.. image:: ../../source/images/adfs_21-2_export_idp_cert_wizard.png

5. Select **Save**. In the **Certificate Export Wizard** screen, verify the file path is correct, then select **Next**.

6. In the **Completing the Certificate Export Wizard**, select **Finish**, then select **OK** to confirm the export was successful.

	.. image:: ../../source/images/adfs_21-3_export_idp_cert_wizard.png

Configure SAML Sign-On for Mattermost
--------------------------------------

Create a metadata URL by appending "FederationMetadata/2007-06/FederationMetadata.xml" to the root URL of the ADFS server, for example: ``https://<adfs.domain.com>/federationmetadata/2007-06/FederationMetadata.xml>``.

Next, start the Mattermost server and log in to Mattermost as a System Administrator. Go to **System Console > Authentication > SAML**, paste the metadata URL in the **Identity Provider Metadata URL** field, then select **Get SAML Metadata from IdP**.

This populates the **SAML SSO URL** and the **Identity Provider Issuer URL** fields automatically. The Identity Provider Public Certificate is also downloaded from the server and set locally.

Alternatively you can enter the following fields manually:
  - **SAML SSO URL**: **SAML 2.0/W-Federation URL** ADFS Endpoint you copied earlier.
  - **Identity Provider Issuer URL**: ``Relying party trust identifier`` from ADFS you specified earlier.
  - **Identity Provider Public Certificate**: ``X.509 Public Certificate`` you downloaded earlier.

	.. image:: ../../source/images/adfs_22_mattermost_basics.png

2. Configure Mattermost to verify the signature. The **Service Provider Login URL** is the SAML 2.0 SSO service URL you specified in ADFS earlier.

	.. image:: ../../source/images/adfs_23_mattermost_verification.png

3. Enable encryption by uploading the Service Provider Private Key and Service Provider Public Certificate you generated earlier.

	.. image:: ../../source/images/adfs_24_mattermost_encryption.png

4. Configure Mattermost to sign SAML requests using the Service Provider Private Key.

5. Set attributes for the SAML Assertions, which will be used to update user information in Mattermost. Attributes for email and username are required and should match the values you entered in ADFS earlier. See :ref:`documentation on SAML configuration settings <saml-enterprise>` for more detail.

For Mattermost servers running 3.3 and earlier, the ``FirstName`` and ``LastName`` attributes are also required fields.

	.. image:: ../../source/images/adfs_25_mattermost_attributes.png

6. (Optional) Customize the login button text.

  .. image:: ../../source/images/adfs_26_mattermost_login_button.png

7. Select **Save**.

8. (Optional) If you configured a ``FirstName`` and ``LastName`` Attribute, go to **System Console > Site Configuration > Users and Teams**, then set **Teammate Name Display** to **Show first and last name**. This is recommended for a better user experience.

If you’d like to confirm SAML SSO is successfully enabled, switch your System Administrator account from email to SAML-based authentication from your avatar via **Profile > Security > Sign-in Method > Switch to SAML SSO**, then log in with your SAML credentials to complete the switch.

We recommend that you post an announcement about how the migration will work for your users.

You may also configure SAML for ADFS by editing the ``config.json`` file to enable SAML based on :ref:`SAML configuration settings <saml-enterprise>`. You must restart the Mattermost server for the changes to take effect.

.. include:: sso-saml-ldapsync.rst
	:start-after: :nosearch:

.. include:: sso-saml-faq.rst
	:start-after: :nosearch:

source/onboard/sso-saml-adfs-msws2016.rst METASEP
Configure SAML with Microsoft ADFS using Microsoft Windows Server 2016
======================================================================

This document provides steps to configure SAML 2.0 with Microsoft ADFS for Mattermost and Microsoft Windows Server 2016.

.. contents::
  :backlinks: top
  :local:

.. include:: sso-saml-before-you-begin.rst
	  :start-after: :nosearch:

Prerequisites
-------------

- An Active Directory instance where all users have specified email and username attributes. For Mattermost servers running 3.3 and earlier, users must also have their first name and last name attributes specified.
- A running Microsoft Server. The screenshots used in this guide are from Microsoft Server 2012R2, but similar steps should work for other versions.
- An SSL certificate to sign your ADFS login page.
- ADFS installed on your Microsoft Server. You can find a detailed guide for deploying and configuring ADFS in `this article <https://msdn.microsoft.com/en-us/library/gg188612.aspx>`__.

On your ADFS installation, open the ADFS console. Select **Service**, then select **Endpoints**. In the **Type** column, search for ``SAML 2.0/WS-Federation`` and note down the value of **URL Path** column. This is also known as the **SAML SSO URL Endpoint** in this guide. If you chose the defaults for the installation, this will be ``/adfs/ls``.

Add a relying party trust
-------------------------

1. Open the ADFS management snap-in, then select **AD FS > Relying Party Trusts > Add Relying Party Trust** from the right sidebar. You can also right-click **Relying Party Trusts**, then select **Add Relying Party Trust** from the context menu.

	.. image:: ../../source/images/SSO-SAML-ADFS_add-new-relying-party-trust_000.png

2. On the **Welcome** screen of the configuration wizard, select **Claims aware**, then select **Start**.

	.. image:: ../../source/images/SSO-SAML-ADFS_add-new-relying-party-trust_001.png

3. On the **Select Data Source** screen, select **Enter data about the relying party manually**.

	.. image:: ../../source/images/SSO-SAML-ADFS_add-new-relying-party-trust_002.png

4. On the **Specify Display Name** screen, enter a **Display Name** (e.g., ``Mattermost``). You can add optional notes.

	.. image:: ../../source/images/SSO-SAML-ADFS_add-new-relying-party-trust_003.png

5. On the **Configure Certificate** screen, leave the certificate settings at their default values.

	.. image:: ../../source/images/SSO-SAML-ADFS_add-new-relying-party-trust_004.png

If you would like to set up encryption for your SAML connection, select **Browse**, then upload your Service Provider Public Certificate.

	.. image:: ../../source/images/SSO-SAML-ADFS_add-new-relying-party-trust_005.png

6. On the **Configure URL** screen, select **Enable Support for the SAML 2.0 WebSSO protocol**, then enter the **SAML 2.0 SSO service URL** in the following format:``https://<your-mattermost-url>/login/sso/saml`` where ``<your-mattermost-url>`` should typically match the `Mattermost Site URL <https://docs.mattermost.com/configure/configuration-settings.html#site-url>`__.

	.. image:: ../../source/images/SSO-SAML-ADFS_add-new-relying-party-trust_006.png

7. On the **Configure Identifiers** screen, enter the **Relying party trust identifier**. This identifies the claims being requested. The **SAML 2.0 SSO service URL** format should be ``https://<your-mattermost-url>/login/sso/saml`` where ``<your-mattermost-url>`` matches your `Mattermost Site URL <https://docs.mattermost.com/configure/configuration-settings.html#site-url>`_. Then choose **Next**. 

	.. image:: ../../source/images/SSO-SAML-ADFS_add-new-relying-party-trust_007.png

	.. image:: ../../source/images/SSO-SAML-ADFS_add-new-relying-party-trust_008.png

This string must match the **Service Provider Identifier** string. For more information about the Relying party trust identifier and how prefix matching is applied see `this documentation <https://docs.microsoft.com/en-us/windows-server/identity/ad-fs/technical-reference/how-uris-are-used-in-ad-fs>`_.

Add your **SAML 2.0 SSO service URL** using this same process.

8. On the **Choose Access Control Policy** screen, select the access control policy suitable for your environment. This guide assumes the default values **Permit everyone** and an unchecked box.

	.. image:: ../../source/images/SSO-SAML-ADFS_add-new-relying-party-trust_009.png

9. On the **Ready to Add Trust** screen, review your settings.

	.. image:: ../../source/images/SSO-SAML-ADFS_add-new-relying-party-trust_010.png

10. On the **Finish** screen, select **Configure claims issuance policy for this application**, then select **Close**.

	.. image:: ../../source/images/SSO-SAML-ADFS_add-new-relying-party-trust_011.png

Create claim rules
------------------

1. In the **Issuance Transform Rules** tab of the **Claim Rules** editor, select **Add Rule…**.

	.. image:: ../../source/images/SSO-SAML-ADFS_create-claim-rules_001.png

2. On the **Choose Rule Type** screen, select **Send LDAP Attributes as Claims** from the drop-down menu, then select **Next**.

	.. image:: ../../source/images/SSO-SAML-ADFS_create-claim-rules_002.png

3. On the **Configure Claim Rule** screen, enter a **Claim Rule Name** of your choice, select **Active Directory** as the **Attribute Store**, then add the following mapping:

  - From the **LDAP Attribute column**, select ``E-Mail-Addresses``. From the **Outgoing Claim Type**, type ``Email``.
  - From the **LDAP Attribute column**, select ``E-Mail-Addresses``. From the **Outgoing Claim Type**, type ``Name ID``.
  - From the **LDAP Attribute column**, select ``Given-Name``. From the **Outgoing Claim Type**, type ``FirstName``.
  - From the **LDAP Attribute column**, select ``Surname``. From the **Outgoing Claim Type**, type ``LastName``.
  - From the **LDAP Attribute column**, select ``SAM-Account-Name``. From the **Outgoing Claim Type**, type ``Username``.

From Mattermost version 3.4, the ``FirstName`` and ``LastName`` attributes are optional.

Select **Finish** to add the rule.

The entries in the **Outgoing Claim Type** column can be modified. The entries may contain dashes but no spaces. They are used to map the corresponding fields in Mattermost.

	.. image:: ../../source/images/SSO-SAML-ADFS_create-claim-rules_003.png

4. Select **Add Rule** to create another new rule.

5. On the **Choose Rule Type** screen, select **Transform an Incoming Claim** from the drop-down menu, then select **Next**.

	.. image:: ../../source/images/SSO-SAML-ADFS_create-claim-rules_004.png

6. On the **Configure Claim Rule** screen, enter a **Claim Rule Name** of your choice, then:

  - Select **Name ID** for the **Incoming claim type**
  - Select **Unspecified** for the **Incoming name ID format**
  - Select **E-Mail Address** for the **Outgoing claim type**

Select **Pass through all claim values**, then select **Finish**.

	.. image:: ../../source/images/SSO-SAML-ADFS_create-claim-rules_005.png

7. Select **Finish** to create the claim rule, then select **OK** to finish creating rules.

8. Open Windows PowerShell as an administrator, then run the following command:

  ``Set-ADFSRelyingPartyTrust -TargetName <display-name> -SamlResponseSignature "MessageAndAssertion"``

where ``<display-name>``is the name you specified in step 4 when you added a relying party trust. In this example, ``<display-name>`` would be ``mattermost``.

This action adds the signature to SAML messages, making verification successful.

Export identity provider certificate
-------------------------------------

Next, export the identity provider certificate, which will be later uploaded to Mattermost to finish SAML configuration.

1. Open the ADFS management snap-in, select **AD FS > Service > Certificates**, then double-click on the certificate under **Token-signing**. You can also right-click the field, then select **View Certificate** in the context menu.

	.. image:: ../../source/images/SSO-SAML-ADFS_export-id-provider-cert_001.png

2. On the **Certificate** screen, open the **Details** tab, select **Copy to File**, then select **OK**.

	.. image:: ../../source/images/SSO-SAML-ADFS_export-id-provider-cert_003.png

3. On the **Certificate Export Wizard** screen, select **Next**.

	.. image:: ../../source/images/SSO-SAML-ADFS_export-id-provider-cert_004.png

4. Select **Base-64 encoded X.509 (.CER)**, then select **Next** again.

	.. image:: ../../source/images/SSO-SAML-ADFS_export-id-provider-cert_005.png

5. On the **Certificate Export Wizard** screen, select **Browse** to specify the location where you want the Identity Provider Certificate to be exported, then specify the file name.

	.. image:: ../../source/images/SSO-SAML-ADFS_export-id-provider-cert_006.png

6. Select **Save**. On the **Certificate Export Wizard** screen, verify the file path is correct, then select **Next**.

7. In the **Completing the Certificate Export Wizard**, select **Finish**, then select **OK** to confirm the export was successful.

	.. image:: ../../source/images/SSO-SAML-ADFS_export-id-provider-cert_007.png

Configure SAML Sign-On for Mattermost
--------------------------------------

Create a metadata URL by appending "FederationMetadata/2007-06/FederationMetadata.xml" to the root URL of the ADFS server, for example: ``https://<adfs.domain.com>/federationmetadata/2007-06/FederationMetadata.xml>``.

Next, start the Mattermost server, then log in to Mattermost as a System Administrator. Go to **System Console > Authentication > SAML**, paste the metadata URL in the **Identity Provider Metadata URL** field, then select **Get SAML Metadata from IdP**.

This populates the **SAML SSO URL** and the **Identity Provider Issuer URL** fields automatically. The Identity Provider Public Certificate is also downloaded from the server and set locally.

The following fields can be selected:
  - Set **Enable Login With SAML 2.0** to **true**.
  - Set **Enable Synchronizing SAML Accounts With AD/LDAP** to suit your environment.
  - Set **Override SAML bind data with AD/LDAP information** to suit your environment.

If you don't plan to use a metadata URL, you can manually enter the following fields:
  - For **SAML SSO URL** use the ``SAML 2.0/W-Federation URL ADFS Endpoint`` you copied at the beginning of the process.
  - For **Identity Provider Issuer URL** use the ``Relying party trust identifier`` from ADFS.
  - For **Identity Provider Public Certificate** use  the``X.509 Public Certificate``.

	.. image:: ../../source/images/SSO-SAML-ADFS_configure-saml_001.png

2. Configure Mattermost to verify the signature.

  - Set **Verify Signature** to ``true``.
  - For **Service Provider Login URL** use the ``SAML 2.0 SSO service URL`` you specified in ADFS.

	.. image:: ../../source/images/SSO-SAML-ADFS_configure-saml_002.png

3. Enable encryption.

  - Set **Enable Encryption** to ``true``.
  - For **Service Provider Private Key** use the Service Provider Private Key generated at the start of this process.
  - For **Service Provider Public Certificate** use the Service Provider Public Certificate you generated at the start of this process.
  - Set **Sign Request** to suit your environment.

	.. image:: ../../source/images/SSO-SAML-ADFS_configure-saml_003.png

4. Set attributes for the SAML Assertions, which will be used to update user information in Mattermost. Attributes for email and username are required and should match the values you entered in ADFS earlier. See :ref:`documentation on SAML configuration settings <saml-enterprise>` for more detail.

For Mattermost servers running 3.3 and earlier, the first name and last name attributes are also required fields.

	.. image:: ../../source/images/SSO-SAML-ADFS_configure-saml_004.png

5. Select **Save**.

6. (Optional) If you configured ``First Name`` Attribute and the ``Last Name`` Attribute, go to **System Console > Site Configuration > Users and Teams**, then set **Teammate Name Display** to **Show first and last name**. This is recommended for a better user experience.

You’re done! If you’d like to confirm SAML SSO is successfully enabled, switch your System Administrator account from email to SAML-based authentication from your avatar via **Profile > Security > Sign-in Method > Switch to SAML SSO**, then log in with your SAML credentials to complete the switch.

We also recommend that you post an announcement about how the migration will work to your users.

You may also configure SAML for ADFS by editing the ``config.json`` file to enable SAML based on :ref:`SAML configuration settings <saml-enterprise>`. You must restart the Mattermost server for the changes to take effect.

.. include:: sso-saml-faq.rst
	  :start-after: :nosearch:

.. include:: sso-saml-ldapsync.rst
	  :start-after: :nosearch:

source/onboard/sso-openidconnect.rst METASEP
OpenID Connect Single Sign-On
==============================

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Mattermost Enterprise Edition E20*

.. include:: common-sso-openidconnect.rst
  :start-after: :nosearch:
source/onboard/sso-office.rst METASEP
Office 365 Single Sign-On
=========================

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Mattermost Enterprise Edition E20*

.. include:: common-sso-office365.rst
  :start-after: :nosearch:

Configure Mattermost ``config.json`` for Office 365 SSO
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/selfhosted-only.rst
  :start-after: :nosearch:

Instead of using the System Console, you can add the Office 365 settings directly to the ``config.json`` file on your Mattermost server.

1. Open ``config.json`` as *root* in a text editor. It’s usually in ``/opt/mattermost/config`` but it might be elsewhere on your system.
2. Locate the ``Office365Settings`` section, then add or update the following information:

.. code-block:: text

  "Enable": false,
        "Secret": "i.hddd6Pu3--5dg~cRddddqOrBdd1a",
        "Id": "28ddd714-1f2f-4f9c-9486-90b8dddd27",
        "Scope": "profile openid email",
        "AuthEndpoint": "",
        "TokenEndpoint": "",
        "UserApiEndpoint": "",
        "DiscoveryEndpoint": "https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration",
        "DirectoryId": "common"
  }

3. Save your changes, then restart your Mattermost server. After the server restarts, users must change their login method before they can log in with Office 365.

source/onboard/sso-google.rst METASEP
Google Single Sign-On
=====================

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Mattermost Enterprise Edition E20*

.. include:: common-sso-google.rst
  :start-after: :nosearch:

Configure Mattermost ``config.json`` for Google Apps SSO
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/selfhosted-only.rst
  :start-after: :nosearch:

Instead of using the System Console, you can add the Google settings directly to the ``config.json`` file directly on your Mattermost server.

1. Open ``config.json`` as *root* in a text editor. It’s usually in ``/opt/mattermost/config``, but it might be elsewhere on your system.
2. Locate the ``GoogleSettings`` section, then add or update the following information:

.. code-block:: text

  "Enable": true,
        "Secret": "P-k9R-7E7ayX9LdddddWdXVg",
        "Id": "1022ddddd5846-bkddddd4a1ddddd9d88j1kb6eqc.apps.googleusercontent.com",
        "Scope": "profile openid email",
        "AuthEndpoint": "",
        "TokenEndpoint": "",
        "UserApiEndpoint": "",
        "DiscoveryEndpoint": "https://accounts.google.com/.well-known/openid-configuration",
        "ButtonText": "",
        "ButtonColor": ""
  }

3. Save your changes, then restart your Mattermost server. After the server restarts, users must change their login method before they can log in with Google Apps.

source/onboard/sso-gitlab.rst METASEP
GitLab Single Sign-On
=====================

.. include:: ../_static/badges/cloud-selfhosted.rst
  :start-after: :nosearch:

*Not available in Mattermost Cloud Starter*

Configuring GitLab as a Single Sign-On (SSO) service
----------------------------------------------------

Follow these steps to configure Mattermost to use GitLab as a Single Sign-on (SSO) service for team creation, account creation, and user login.

.. note::  
  - Only the default GitLab SSO is officially supported. 
  - "Double SSO", where GitLab SSO is chained to other SSO solutions, is not supported. It may be possible to connect GitLab SSO with AD, LDAP, SAML, or MFA add-ons in some cases, but because of the special logic required, they're not officially supported, and they're known not to work in some cases. 
  - Mattermost's open source Team Edition supports the OAuth 2.0 standard.
  - Mattermost Professional and Enterprise support the OpenID Connect standard.

Step 1: Add an OpenID Connect application to your GitLab account
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Log in to your GitLab account, then go to ``https://{gitlab-site-name}/profile/applications``. For *{gitlab-site-name}* use the name of your GitLab instance. If you're using GitLab itself as your service provider, use ``gitlab.com``.

2. Add a new application:

  a. In the **Name** field, enter ``Mattermost``.
  b. In the **Redirect URI** field, add the following two lines using your own value for *{mattermost-site-name}*.

    .. code-block:: text

      https://{mattermost-site-name}/login/gitlab/complete
      https://{mattermost-site-name}/signup/gitlab/complete

   If your GitLab instance is not set up to use SSL, your URIs must begin with ``http://`` instead of ``https://``.

  c. Select scopes.
  
     - For Mattermost Team Edition, select ``read_user`` and ``openid``.
     - For Mattermost Enterprise, select ``openid``, ``profile``, and ``email``.

3. Select **Save application**.

4. Keep the GitLab window open. You need the *Application Id* and *Application Secret Key* when you configure Mattermost.

Step 2: Configure Mattermost for GitLab SSO
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Log in to Mattermost, then go to **System Console > Authentication > OpenID Connect**.
2. Select **GitLab** as the service provider.
3. Enter the **Gitlab Site URL** of your GitLab instance. If your GitLab instance is not set up to use SSL, start the URL with ``http://`` instead of ``https://``. If you are using GitLab itself as your provider, use ``gitlab.com``.
4. The **Discovery Endpoint** for OpenID Connect with GitLab is prepopulated with ``https://gitlab.com/.well-known/openid-configuration``.
5. Paste the **Application ID** from GitLab as the **Client ID** in Mattermost.
6. Paste the **Application Secret Key** from GitLab as the **Client Secret** in Mattermost. 
7. Update the ``config.json`` file to specify the scopes selected for the ``GitLabSettings`` property. At a minimum, ``openid`` is a required scope for the connector to work. Changes to this setting require a server restart before taking effect. 
8. Select **Save**.

.. note::

  - When Mattermost is configured to use OpenID Connect or OAuth 2.0 for user authentication, the following user attribute changes can't be made through the Mattermost API: first name, last name, or username. OpenID Connect or OAuth 2.0 must be the authoritative source for these user attributes.
  - If you are using Mattermost behind a load balancer and you have SSL configured, you may need to set `X-Forwarded-Proto` header to https at your load balancer.

(Optional) Step 3: Force users to sign up using SSO only
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

To force all users to sign-up with SSO only, set **System Console > Authentication > Email > Enable sign-in with email** to ``false``
Users must change their login method before they can log in to Mattermost with GitLab.

source/onboard/ssl-client-certificate.rst METASEP
SSL client certificate setup (beta)
===================================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Follow these steps to configure SSL client certificates for your browser and the Mattermost desktop apps on Windows, macOS, and Linux. SSL client certificates are not yet supported on the Mattermost mobile apps.

Before you begin, follow the `official guides to install Mattermost <https://docs.mattermost.com/guides/administrator.html#installing-mattermost>`__ on your system, including NGINX configuration as a proxy with SSL and HTTP/2, and a valid SSL certificate such as Let's Encrypt.

For the purposes of this guide, the Mattermost server domain name is ``example.mattermost.com``, and the user account is ``mmuser`` with email ``mmuser@mattermost.com`` and password ``mmuser-password``.

.. note::
  Generating the client certificates in this section is optional if you have already generated them before.

Set up mutual TLS authentication for the web app
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Create a `certificate authority (CA) key <https://en.wikipedia.org/wiki/Certificate_authority>`__ and a certificate for signing the client certificate. When establishing a TLS connection, the NGINX proxy server requests and validates a client certificate provided by the web app.

.. code-block:: none

  openssl genrsa -des3 -out ca.mattermost.key 4096
  
  pass phrase: capassword

    
.. code-block:: none

  openssl req -new -x509 -days 365 -key ca.mattermost.key -out ca.mattermost.crt

  Country Name: US
  State: Maryland
  Locality Name: Meade
  Organization Name: Mattermost
  Organization Unit: Smarttotem
  Common Name: example.mattermost.com
  Email Address: admin@mattermost.com

2. Create the client side key for ``mmuser`` with a passphrase, and the certificate signing request:

.. code-block:: none

  openssl genrsa -des3 -out mmuser-mattermost.key 1024

  passphrase: mmuser-passphrase

.. code-block:: none

  openssl req -new -key mmuser-mattermost.key -out mmuser-mattermost.csr

  Country Name: US
  State: Maryland
  Locality Name: Meade
  Organization Name: Mattermost
  Organization Unit: Smarttotem
  Common Name: mmuser
  Email Address: mmuser@mattermost.com
  
  Challenge password: mmuser-passphrase

3. Sign the user's client certificate with the previously created CA certificate:

.. code-block:: none

  openssl x509 -req -days 365 -in mmuser-mattermost.csr -CA ca.mattermost.crt -CAkey ca.mattermost.key -set_serial 01 -out mmuser-mattermost.crt

4. Check the newly generated client certificate for ``mmuser``:

.. code-block:: none

  openssl x509 -in mmuser-mattermost.crt -text -noout

5. Open the file ``/etc/nginx/sites-available/mattermost`` and modify the following lines, so that the NGINX proxy server requests and verifies the client certificate:

.. code-block:: none
  :emphasize-lines: 4-5, 10-11, 16-17

  ssl on;
  ssl_certificate /etc/letsencrypt/live/example.mattermost.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.mattermost.com/privkey.pem;
  ssl_client_certificate /opt/mattermost/config/ca.mattermost.crt;
  ssl_verify_client on;

  ...

  location ~ /api/v[0-9]+/(users/)?websocket$ {
   proxy_set_header X-SSL-Client-Cert $ssl_client_cert;
   proxy_set_header X-SSL-Client-Cert-Subject-DN $ssl_client_s_dn;
     
  ...

  location / {
   proxy_set_header X-SSL-Client-Cert $ssl_client_cert;
   proxy_set_header X-SSL-Client-Cert-Subject-DN $ssl_client_s_dn;
 
  ...

6. Confirm the CA key for ``mmuser`` works by the following curl command to the proxy:

.. code-block:: none

  curl -v -s -k --key mmuser-mattermost.key --cert mmuser-mattermost.crt:mmuser-passphrase https://example.mattermost.com

You should see the Mattermost login page. If you see:

 - ``No required SSL certificate was sent``, something went wrong. Review the above steps and try again.
 - ``Error reading X.509 key or certificate file: Decryption has failed.``, make sure the passphrase is included together with the certificate, because curl doesn't prompt for it separately. 

7. Generate a PKCS12 file from the CA key and certificate, to install the certificate into your client machine for your browser to use:

.. code-block:: none

  openssl pkcs12 -export -out mmuser-mattermost.p12 -inkey mmuser-mattermost.key -in mmuser-mattermost.crt -certfile ca.mattermost.crt

  Enter Export Password: mmuser-passphrase

8. Repeat steps 2-7 above for other users as needed.

9. Import the generated ``.p12`` file in step 7 into your key chain. In the Chrome browser on macOS:

  1. Go to **Settings > Advanced > Privacy and security > Manage certificates**. This opens the Keychain Access app.
  2. Go to **File > Import Items** and select the ``mmuser-mattermost.p12`` file.

10. Go to ``https://example.mattermost.com``. You should see a popup for the client certificate request.

Troubleshooting
~~~~~~~~~~~~~~~~

`Follow this process <https://docs.mattermost.com/install/troubleshooting.html>`__ to resolve configuration issues and to ask for help.

source/onboard/shared-channels.rst METASEP
Shared channels (experimental)
==============================

.. include:: ../_static/badges/ent-cloud-selfhosted.rst
  :start-after: :nosearch:

Shared channels is an experimental feature that brings people together from multiple Mattermost installations. For example, teams collaborating with external partners and customers using multiple Mattermost instances in a federated architecture.

Mattermost System Admins use slash commands to establish secure connections between Mattermost instances, then invite secured connections to shared channels.

Shared channels behave like regular channels, offering the same user experience and functionality as public and private channels. All members using secure connections, including local members and remote members, can `send and receive messages <https://docs.mattermost.com/messaging/sending-receiving-messages.html>`__, `use emojis <https://docs.mattermost.com/help/messaging/emoji.html>`__ to react to messages, `share files <https://docs.mattermost.com/messaging/sharing-files.html>`__, and `search message history <https://docs.mattermost.com/messaging/searching-in-mattermost.html>`__. Content is synchronized in real-time across all participating Mattermost instances.

A channel’s permissions and access continues to be governed by each server separately. Channel moderation permissions can be applied to a shared channel and be in effect on the local Mattermost server while not being in effect on a remote Mattermost server.

Set up shared channels
----------------------

The process of sharing channels involves the following three steps:

1. System Admins must enable shared channels functionality for their Mattermost instance. See our `Configuration Settings <https://docs.mattermost.com/configure/configuration-settings.html#enable-shared-channels-experimental>`__ documentation for details.

2. System Admins `use a slash command <https://docs.mattermost.com/messaging/executing-slash-commands.html>`__ to establish a secure and trusted relationship between other Mattermost Enterprise instances. This process involves creating a password-protected, encrypted invitation, creating a strong decryption password, then sending the invitation and password to the System Admin of a remote Mattermost instance. We strongly recommend that you share an invitation separately from its password to ensure that someone doesn't have all of the data necessary to take action if the message were compromised.

3. The remote System Admin receiving the invitation uses a slash command to `accept the invitation <#accept-a-secure-connection-invitation>`_.

Once a trusted relationship is established between Mattermost servers, System Admins can `share specific public or private channels <#share-channels-with-secure-connections>`_ with secure connections.

.. note:: 

    - System Admins can only create secure connections with other Mattermost Enterprise instances, and can only share channels with secured connections by typing slash commands into the Message box of any channel.
    - System Admins must use Mattermost to generate a password-protected encrypted invitation code. However, sending secure connection invitations is not completed using Mattermost. System Admins must have an independent way to extend the secure connection invitation, such as by email.
    - A channel shared by a host organization cannot be shared from the receiving organization to another organization. Organizations are prevented from sharing a channel originating from another organization.

Create a secure connection invitation
-------------------------------------

System Admins can use the following slash command to create a secure connection invitation:

``/secure-connection create --name <--displayname> --password``

For example:

``/secure-connection create --name “AcmeUS” --displayname “AcmeUSA” --password examplepassword``

This slash command creates an invitation consisting of a password-protected AES 256-bit encrypted code blob for a remote Mattermost entity known locally as ``AcmeUS`` with a password of ``examplepassword``. Within Mattermost, this shared connection displays to the local System Admin based on the ``name`` and ``displayname`` provided.

Extend the invitation
~~~~~~~~~~~~~~~~~~~~~~

1. Copy the invitation code blob in the System message, then send the code blob and the decryption password to the remote Mattermost System Admin you want to securely connect with.
2. Ensure that the remote Mattermost instance can access your workspace URL listed in the System message.

Remove a secure connection
~~~~~~~~~~~~~~~~~~~~~~~~~~

Use the following slash command to remove a secure connection from your Mattermost instance:

``/secure-connection remove --connectionID``

For example:

``/secure-connection remove --connectionID``

This slash command severs the trust relationship between the local Mattermost server and a remote Mattermost server based on its ``connectionID`` and removes the secure connection from all shared Mattermost channels.

Review secure connection status
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Use the following slash command to review the current status of all secure connections established for your Mattermost instance:

``/secure-connection status``

Status details include:

- Connection ID
- Connection URL
- Description
- Invite accepted (Yes/No)
- Online (Yes/No)
- Last ping timestamp (UTC)

Accept a secure connection invitation
-------------------------------------

Use the following slash command to accept a secure connection invitation from a remote Mattermost instance:

``/secure-connection accept --name --displayname --password --invite [code blob]``

For example:

``/secure-connection accept --name AcmeUS --displayname “AcmeUSA” --password examplepassword --invite [code-blob]``

This slash command accepts a secure connection invitation from AcmeUS.

Share channels with secure connections
--------------------------------------

Within a specific Public or Private channel, use the following slash command to invite secure connections:

``/share-channel invite --connectionID <--readonly>``

You can extend an invitation that permits remote members to participate in the channel based on their channel and member permissions.

Alternatively, you can extend a read-only invitation to a secure connection by appending the optional ``--readonly`` parameter to this command. Remote members can’t post or reply to messages within shared read-only channels.

.. tip:: 

    To convert a read-only shared channel to an participation channel, remove the original secured connection from the channel, then re-extend an invitation to that secure connection while omitting the optional ``--readonly`` parameter.

For example:

``/share-channel invite --connectionID``
 
This slash command invites the shared connection to the current channel based on its connection ID.

.. tip:: 
    See `Reviewing Secure Connection Status <#review-secure-connection-status>`_ to find the connectionID for a shared connection.

Uninvite a shared channel connection from a channel
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Within a specific channel, use the following slash command to uninvite a secure connection:

``/share-channel uninvite --connectionID``

This slash command removes a secure connection from the current channel based on its connection ID. The channel continues to function for local users as expected, and the secure connection may continue to be invited to other shared channels.

Remove all secure connections from a channel
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Within a specific channel, use the following slash command to remove all secure connections:

``/share-channel unshare``

This slash command removes all secure connections from the current channel. Secure connections may continue to be invited to other shared channels.

While unsharing a shared channel stops synchronizing the channel with the other Mattermost server, the channel continues to function for local users as expected.

.. note:: 
    A System message notifies System Admins that the channel is no longer shared.

Review secure connections in channels
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Use the following slash command to review the status of all secure connections within the current shared channel:

``/share-channel status``

Status details include:

- Connection ID
- Connection URL
- Description
- Read only channel (True/False)
- Invite accepted (Yes/No)
- Online (Yes/No)
- Last ping timestamp (UTC)

Frequently Asked Questions
---------------------------

Why is this feature experimental?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This feature is considered experimental while we recruit customer testing partners. Mattermost QA has tested this feature, but as we build the interface for managing shared channels, we want to work with System Admins to build the most optimal experience.

Are special characters supported in secure connection names?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

No. ``--name`` can include periods, hyphens, and/or underscores. You must surround ``--name`` using quotation marks (“ “) when the value contains spaces.

What happens if two Mattermost instances contain different emojis?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

In cases where one Mattermost instance has different emojis than another instance, emoji text displays in place of a missing emoji image.

Is a Display Name required for all secure connections?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

No. ``--displayname`` is optional. When omitted, ``--name`` is displayed and used instead.

Do connection interruptions affect message synchronization?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Yes. A System message is posted in the channel visible to all channel members when message synchronization is interrupted for more than five minutes.

What happens if two secure connections share the same usernames?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

In cases where members share the same usernames across Mattermost secure connections, usernames on the local server instance are appended with the secure connection name of the remote server.

For example, if multiple members named John Smith exist after two Mattermost instances establish a secure connection with one another, all remote John Smith members include their Secure Connection ID following their username to help differentiate members across multiple Mattermost instances.

source/onboard/run-bulk-loading-command.rst METASEP
:nosearch:
.. _bulk-loading-data:

Bulk load data
---------------

Before running the bulk loading command, you must first create a `JSONL <https://jsonlines.org>`__ file that contains the data that you want to import in your Mattermost directory. The file can have any name, but in this example it's called ``data.jsonl``. The format of the file is described in the :ref:`data-format` section.

.. tabs::

  .. tab:: Use mmctl

    1. After you create the file, upload the file to the database by running the `mmctl import upload <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-import-upload>`__ command. For example: ``mmctl import upload data.jsonl``.

    2. Confirm that the file is uploaded and ready for use by running the `mmctl import list available <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-import-list-available>`__ command. 

    3. Import your uploaded file by running the `mmctl import process <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-import-process>`__ command. For example: ``mmctl import process data.jsonl``.

  .. tab:: Use CLI

    After you create the file, validate that the file is correct by running the bulk load command in validation mode. In this mode, the data is checked for correctness, but is not written to the database. After validating, run the command in apply mode, which saves the data to the database.

    1. Change to the Mattermost directory.

       ``cd /opt/mattermost`` (the location might be different on your system)

    2. Run the following command:

       ``sudo -u mattermost bin/mattermost import bulk data.jsonl --validate``

    3. Resolve any errors that are reported, and validate the file again. Do not go to the next step until you can run the validate command without errors.

    4. Run the bulk load command in apply mode:

       ``sudo -u mattermost bin/mattermost import bulk data.jsonl --apply``

    5. When the bulk load command completes, clear all caches in the System Console by going to **System Console > Environment > Web Server**.

    .. important::

      After the import tool has run, all files created in the ``data`` directory are owned by *root* as the tool was run as *sudo*. The owner of the ``data`` directory and all its content has to change to *mattermost* user, otherwise, Mattermost can't fetch the files created in the ``data`` directory after the import tool has run.

source/onboard/multi-factor-authentication.rst METASEP
..  _auth_mfa:

Multi-factor authentication
===========================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Multi-factor authentication (MFA) is a secondary layer of user authentication applied to your Mattermost server.

With MFA enabled, users need to provide a secure one-time code in addition to their username and password in order to log in to Mattermost. MFA is useful in organizations that have specific security and compliance policies. It can also be used in organizations where Mattermost is not behind a firewall and doesn't have access to existing MFA infrastructure.

Mattermost offers a smartphone-based MFA check in addition to email-password or Active Directory/LDAP authentication to log in to the Mattermost server.

Supported smartphones include iOS, Android, Blackberry, and Windows Phone devices that are able to install `Google Authenticator <https://support.google.com/accounts/answer/1066447?hl=en>`__. Other than requiring internet access to download and install Google Authenticator, the phone used for Mattermost MFA does not require internet access.

.. note::
  
  As the MFA implementation relies on Time-based One-time passwords (TOTP) ensure that your server system time is accurate. If there is a discrepancy, users may not be able to log in successfully.

Enabling MFA
------------

System Admins can enable this option by going to **System Console > Authentication > MFA**, then setting **Enable Multi-factor Authentication** to **true**.

Once enabled, users can opt to `set up multi-factor authentication <https://docs.mattermost.com/messaging/manage-profile-settings.html#multi-factor-authentication>`__ on their account by selecting **Profile > Security > Multi-factor Authentication** from their avatar.

.. include:: common-disable-mfa.rst
  :start-after: :nosearch:

Enforcing MFA
--------------

.. include:: ../_static/badges/ent-pro-only.rst
  :start-after: :nosearch:

*Available in legacy Mattermost Enterprise Edition E10/E20*

This option can be enabled by the System Admin by going to **System Console > Authentication > MFA**, then setting **Enforce Multi-factor Authentication** to **true**.

When MFA enforcement is set to **true**, users with email or LDAP authentication who don't have MFA set up will be directed to the MFA setup page when they log in to Mattermost. They will not be able to access the site until MFA setup is complete. Any new users will be required to set up MFA during the sign up process.

Users will not be able to remove MFA from their account while enforcement is on.

.. note::

  Turning on MFA enforcement prevents users from accessing the site until set up is complete. We recommended that you turn on enforcement during non-peak hours when people are less likely to be using Mattermost.

source/onboard/migration-announcement-email.rst METASEP
Migration announcement email
============================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

To notify your end users of your migration to Mattermost, we created a sample email template that you can use.

Remember to replace all the items in bold with your information.

Email template
--------------

To: End users

Subject: Moving to Mattermost


Hi all,

As some of you already know, we are moving from **[System]** to Mattermost as our collaboration platform. We have imported our existing users and data into Mattermost so we can continue to communicate, share files and collaborate.
 
To get started:

1. Open a browser on your computer, go to **[Mattermost URL]** and select “I forgot my password” to set your new password for Mattermost using the email address you used on the previous system.  

2. Once you reset your password, use your email and new password to log in. 

3. `Download <https://mattermost.com/apps>`__ the Mattermost apps for desktop and mobile. Refer to the `Channels documentation  <https://docs.mattermost.com/messaging/welcome-to-mattermost-messaging.html>`__ on how to get up and running quickly.

4. Remember to bookmark the URL so you can use it to log in next time!

Questions?

If you have any questions, feel free to post in the **[~Mattermost channel]** or email us at **[Support email]**.

Happy collaborating!

**[Sign-off]**

source/onboard/migrating-to-mattermost.rst METASEP
Migration guide
===============

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Thousands of organizations are moving to Mattermost for powerful, flexible, and easy-to-manage workplace collaboration. Mattermost deploys as a single Linux binary with MySQL or PostgreSQL, and can scale from dozens to tens of thousands of users in a single channel.

This guide summarizes different approaches to migrating from one Mattermost deployment to another, and migrating from other tools (such as Slack, HipChat, Jabber, and bespoke solutions) to Mattermost.

.. contents::
  :backlinks: top
  :local:

Migrating Mattermost server
----------------------------

The following instructions migrate Mattermost from one server to another by backing up and restoring the Mattermost database and ``config.json`` file. For these instructions **SOURCE** refers to the Mattermost server *from which* your system will be migrated and **DESTINATION** refers to the Mattermost server *to which* your system will be migrated.

1. Back up your SOURCE Mattermost server.
    1. See `Backup and Disaster Recovery documentation <https://docs.mattermost.com/deploy/backup-disaster-recovery.html>`__.
2. Upgrade your SOURCE Mattermost server to the latest major build version.
    1. See `Upgrading Mattermost Server documentation <https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html>`__.
3. Install the latest major build of Mattermost server as your DESTINATION.
    1. See `Install Mattermost documentation <https://docs.mattermost.com/guides/install-deploy-upgrade-scale.html#install-mattermost>`__ for details. Make sure your new instance is properly configured and tested. The database type (MySQL or PostgreSQL) and version of SOURCE and DESTINATION deployments need to match.
    2. Stop the DESTINATION server using ``sudo stop mattermost``, then back up the database and ``config.json`` file.
4. Migrate database from SOURCE to DESTINATION.
    1. Backup the database from the SOURCE Mattermost server and restore it in place of the database to which the DESTINATION server is connected.
5. Migrate ``config.json`` from SOURCE to DESTINATION.
    1. Copy of ``config.json`` file from SOURCE deployment to DESTINATION.
6. If you use local storage (``FileSettings.DriverName`` is set to ``local``), migrate ``./data`` from SOURCE to DESTINATION.
    1. Copy the ``./data`` directory from SOURCE deployment to DESTINATION.
    2. If you use a directory other than ``./data``, copy that directory instead.
7. Start the DESTINATION deployment.
    1. Run ``sudo start mattermost``.
    2. Go to the **System Console**, make a minor change, and save it to upgrade your ``config.json`` schema to the latest version using default values for any new settings added.
8. Test that the system is working by going to the URL of an existing team.
    1. You may need to refresh your Mattermost browser page in order to get the latest updates from the upgrade.

Once your migration is complete and verified, you can optionally `upgrade the Team Edition of Mattermost to Enterprise Edition using the upgrade guide <https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html#upgrading-team-edition-to-enterprise-edition>`__.

Migrating to Mattermost from other messaging solutions
------------------------------------------------------

Migrating from bespoke messaging solutions to Mattermost
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Many enterprises run bespoke, unsupported, lightly documented messaging systems driven by the initial excitement of the product's promise.

Often the solutions were championed by tech-savvy early adopters who loved a few features and pushed out the solution broadly.

Over time, management moves to an IT team, where an unsupported solution becomes problematic to maintain and secure. Mattermost is often selected to replace bespoke solutions by IT and DevOps teams as a stable, enterprise-grade, commercially-supported solution on an open source platform that meets and exceeds the flexibility and innovation of bespoke solutions.

Why IT teams choose to leave bespoke solutions
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Because messaging solutions in technical teams often contain confidential and highly exploitable data, messaging solutions become a security concern that could impact all of an organization's technical infrastructure.

When IT teams are asked to maintain a bespoke messaging solution, they often need to consider security issues such as the following:

1. Is the solution backed by a commercial entity with significant legal obligations to ensure the safety and security of the product?
2. Is there a security bulletin available to alert our organization of high-priority security updates, with clear instructions to apply the updates?
3. Does the solution have a clear and up-to-date list of security updates?
4. Are security updates released prior to detailed disclosure of vulnerability details, so as to provide our organization with time to apply security updates before vulnerabilities are widely known?
5. In addition to internal testing, is there a Responsible Disclosure Policy for external security researchers to confidentially report security issues, and a recognition program for their contributions?

Bespoke communication products that provide weak security assurance can dramatically increase the risk to IT teams and their organizations.

When early adopters of a bespoke solutions ask IT to "take over" and assume the risk of managing a rapidly installed, difficult-to-maintain system with limited or no assurance of security, the IT team is under a great deal of pressure.

Often at this point, IT teams accelerate their exploration of Mattermost as a long-term solution, given the `thousands of organizations (many in mission critical, high security industries) that have switched <https://mattermost.com/customers/>`__.

Why IT teams choose Mattermost over bespoke solutions
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Mattermost is designed to replace bespoke messaging solutions through a platform that is unmatched in flexibility. From the `hundreds of open source projects extending and customizing Mattermost through APIs and drivers <https://github.com/search?utf8=✓&q=mattermost&type=>`__, to an innovative client and server plugin framework for adapting the Mattermost user experience to the specific workflows and needs, thousands of high performance teams rely on Mattermost daily.

In addition, IT teams prefer Mattermost for its specific `security assurances <https://docs.mattermost.com/about/security.html>`__:

1. Mattermost products are backed by Mattermost, Inc., which has commercial contracts with hundreds of enterprises around the world, many with Fortune 500 and Global 2000 organizations who require significant obligations and assurances from vendors of critical infrastructure.
2. Mattermost offers a `security bulletin <https://mattermost.com/security-updates/#sign-up>`__ to alert IT teams and customers of high priority security updates, with step-by-step instructions for upgrade and options for commercial support.
3. Mattermost maintains an `up-to-date list of security updates <https://mattermost.com/security-updates/>`__ for both its open source and commercial offerings.
4. To keep IT teams safe, Mattermost waits 14 days after releasing a security patch before disclosing the specific details of the vulnerability each addresses.
5. A `Responsible Disclosure Policy <https://mattermost.com/security-vulnerability-report/>`__ is available to supplement internal security reviews with confidential reports from external security researchers, with a recognition program for security research contributions after the security patch is properly released.

Bringing data from bespoke solutions into Mattermost 
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Migrating from bespoke messengers to Mattermost can be challenging. Because of the difficulty of upgrading and maintaining bespoke solutions, the format for storing data is unpredictable, and the community around any single legacy release is small.

If your data in the bespoke messenger is vital, consider:

1. `Mattermost Bulk Load tool <https://docs.mattermost.com/onboard/bulk-loading-data.html>`__: Use the Mattermost Bulk Load tool to ETL from your bespoke system to Mattermost.
2. `Mattermost ETL framework from BrightScout <https://github.com/Brightscout/mattermost-etl>`__: Consider the Mattermost ETL framework from BrightScout to custom-configure an adapter to plug in to the Bulk Load tool mentioned above.
3. **Legacy Slack import:** If you only recently switched from Slack to a bespoke tool, consider going back to import the data and users from the old Slack instance directly into Mattermost, leveraging the extensive support for Slack-import provided.
4. **Export to Slack, then import to Mattermost:** `Export HipChat, Flowdock, Campfire, Chatwork, Hall, or CSV files to Slack <https://get.slack.help/hc/en-us/articles/201748703-Import-message-history>`__ and then export to a Slack export file and import the file into Mattermost.

If your data in the bespoke messenger is not vital, consider:

1. **Parallel systems:** Running Mattermost in parallel with your bespoke system until the majority of workflow and collaboration has moved to Mattermost
2. **Hard switch:** Announce a "hard switch" to Mattermost after a period of time of running both systems in parallel. Often this has been done due to security concerns in bespoke products or products nearing end-of-life.

Sometimes systems running in parallel turn into a hard switch migration when a bespoke or deprecated system experiences a major outage or a security exploit. In 2017, this was experienced by many companies using Mattermost and HipChat.com in parallel when `HipChat suffered a major security breach where customer data was stolen by an unknown attacker <https://thenextweb.com/insider/2017/04/24/hipchat-hacked-weekend-bad/#.tnw_lAotA9OV>`__.

When IT adopts management of Mattermost, often they will purchase the commercial version for additional compliance, access control, and scale features, in addition to high quality commercial support for upgrades and migrations. Teams can `purchase Mattermost Enterpise Edition with a credit card online <https://mattermost.com/pricing-self-managed/>`__ or `contact sales <https://mattermost.com/contact-us/>`__ to engage in an enterprise procurement process.

Migrating from Slack
~~~~~~~~~~~~~~~~~~~~

Slack offers two ways to `export your data from their product <https://get.slack.help/hc/en-us/articles/201658943-Export-your-workspace-data>`_.

1. A Slack export file can be generated from **Slack > Administration > Workspace settings > Import/Export Data > Export > Start Export**. This export does not include private channels, direct, or group messages.
2. You can request a "Corporate Export" from Slack directly to get a larger export including private channels, direct, and group messages.

.. note::

  As a proprietary SaaS service, Slack is able to change its export format quickly and without notice. If you encounter issues not mentioned in the following documentation, please let the Mattermost Product Team know by `filing an issue <https://handbook.mattermost.com/contributors/contributors/ways-to-contribute>`__.

Migrating from Slack using the Mattermost mmetl tool and bulk import
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. note::
  
  This method is the recommended way to import Slack's corporate export file, but will work with any Slack export file. It can be used for Mattermost v5.0+.

**1. Prepare your Mattermost server**

We recommend you create a new team in Mattermost to hold the imported Slack data. You can import this into an existing team, but ensure there are no channel name collisions. Also, make sure that all users in Mattermost have the same username as in Slack, otherwise the import will fail. Also, system administrator roles will be overwritten if the usernames match and the user isn't an admin on the Slack workspace.

**2. Generate a Slack import**

The first step is to generate a `Slack export <https://slack.com/help/articles/201658943-Export-your-workspace-data>`_.

.. note::

  Make sure not to unzip and rezip the Slack export. Doing that can modify the directory structure of the archive which could cause issues with the import process.

Next, follow these steps to create a bot token:

1. Go to https://api.slack.com/apps.
2. Select **Create New App**.
3. Select **From scratch**.
4. Name the app something like "Slack Advanced Exporter" and select the workspace. You'll have to do this for every workspace. Then create the app.
5. Select **OAuth & Permissions** and scroll down to **Scopes**.
6. Under **Bot Token Scopes** select ``users:read`` and ``users:read.email``.
7. Scroll up and select **Install to Workspace**.
8. Grant the app permissions.
9. Copy the Bot User OAuth Token and save it somewhere convenient.

**3. Download file attachments and email addresses**

The Slack export does not include file attachments and email addresses, so you must use ``slack-advanced-exporter`` to download them. Download the latest release of ``slack-advanced-exporter`` for your OS and architecture `here <https://github.com/grundleborg/slack-advanced-exporter/releases/>`__ and extract it.

Once it's installed, run these commands. Replace ``<SLACK TOKEN>`` with the Slack token you generated earlier and ``<SLACK EXPORT FILE>`` with the `path <https://www.geeksforgeeks.org/absolute-relative-pathnames-unix/>`__ to your file.

.. note::

    - You'll end up with two files (``export-with-emails.zip`` and ``export-with-emails-and-attachments.zip``). The file ``export-with-emails.zip`` will not have attachments.
    - The second command can take a long time if you have a large number of file uploads. If it's interrupted, delete the file generated (if any), and start again.

.. code:: bash

    slack-advanced-exporter --input-archive <SLACK EXPORT FILE> --output-archive export-with-emails.zip fetch-emails --api-token <SLACK TOKEN>
    slack-advanced-exporter --input-archive export-with-emails.zip --output-archive export-with-emails-and-attachments.zip fetch-attachments

The file ``export-with-emails-and-attachments.zip`` now contains all the information necessary to be imported into Mattermost.

**4. Convert Slack Import to Mattermost Bulk Export Format**

Now that you have a Slack export file with emails and attachments you have to convert it to the Mattermost format using ``mmetl``. Download the latest release of ``mmetl`` for your OS and architecture `here <https://github.com/mattermost/mmetl/releases/>`__ and extract it to your $PATH like with ``slack-advanced-exporter``. The same caveat applies.

Next, run this command to do the conversion. Replace ``<TEAM NAME>`` with the name of your team:

.. code:: bash

    ./mmetl transform slack --team <TEAM NAME> --file export-with-emails-and-attachments.zip --output mattermost_import.jsonl

Next you have to create a zip file with the ``mattermost_import.jsonl`` file and the directory ``bulk-export-attachments`` (which needs to be moved to a subdirectory ``data`` first) that contains the attachments. On Linux and macOS you can use this command:

.. code:: bash

    mkdir data
    mv bulk-export-attachments data
    zip -r mattermost-bulk-import.zip data mattermost_import.jsonl

The file ``mattermost-bulk-import.zip`` is now ready to import into Mattermost.

**5. Import into Mattermost**

Now you can start the import process. Once you have ``mmctl`` installed and authenticated use this command to upload ``mattermost-bulk-import.zip``:

.. code:: bash

    mmctl import upload ./mattermost-bulk-import.zip

Run this command to list the available imports:

.. code:: bash

    mmctl import list available

Run this command to process the import. Replace ``<IMPORT FILE NAME>`` with the name you got from the ``mmctl import list available`` command:

.. code:: bash

    mmctl import process <IMPORT FILE NAME>
    
Finally, run this command to view the status of the import process job. If the job status shows as ``pending``, then wait before running the command again. The ``--json`` flag is required to view the possible error message. Replace ``<JOB ID>`` with the id you got from the ``mmctl import list process`` command:

.. code:: bash

    mmctl import job show <JOB ID> --json

Debugging imports
-----------------

The ``mmctl import job show`` shows a detailed error message. If you run into problems which the error message does not help to resolve, your best bet is to use the ``mattermost bulk import`` command. The ``mmctl`` import process does not give you any additional debugging information, even in the Mattermost server logs.

Migrating from Slack using the Mattermost Web App
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. important::
  In Mattermost v6.0, the ability to migrate from Slack using the Mattermost Web App has been deprecated and removed in favor of using the Mattermost mmetl tool with bulk import.

.. note::
  
  For larger imports, particularly those where you have used the `slack-advanced-exporter tool` to add Slack post attachments to the archive or the Corporate Export file, it is recommended to import the Slack data using the `mmetl tool and bulk loading tool <https://docs.mattermost.com/onboard/migrating-to-mattermost.html#migrating-from-slack-using-the-mattermost-mmetl-tool-and-bulk-import>`__.

1. Generate a Slack export file from **Slack > Administration > Workspace Settings > Import/Export Data > Export > Start Export**. Alternatively, use the Slack Corporate Export file after receiving it from Slack.
2. In Mattermost go to **Main Menu > Team Settings > Import > Import from Slack**. Team Admin or System Admin permission is required to access this menu option.
3. Choose **Select file** to upload the Slack export file and select **Import**.

Migrating from Slack using the Mattermost CLI
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. note::
  In Mattermost v6.0, the CLI has been deprecated in favor of the mmctl `CLI <https://docs.mattermost.com/manage/mmctl-command-line-tool.html>`__.

1. Generate a Slack export file from **Slack > Administration > Workspace Settings > Import/Export Data > Export > Start Export**.
2. Run the following Mattermost CLI command, with the name of a team you've already created:

   ``$ mattermost import slack team_name /path/to/your-slack-export.zip``
   
.. note::

  To run the CLI command, you must be in the directory that contains the Mattermost installation. On a default installation of Mattermost, the directory is ``/opt/mattermost/``. Also, if you followed our `installation process <https://docs.mattermost.com/guides/install-deploy-upgrade-scale.html#install-mattermost>`__, you must run the command as the user *mattermost*. The executable is in the ``bin`` subdirectory and is called ``mattermost``.

Using the imported team
^^^^^^^^^^^^^^^^^^^^^^^

* During the import process, the emails and usernames from Slack are used to create new Mattermost accounts. If emails are not present in the Slack export archive, then placeholder values will be generated and the System Admin will need to update these manually.
* Slack users can activate their new Mattermost accounts by using Mattermost's **Password Reset** screen with their email addresses from Slack to set new passwords for their Mattermost accounts.
* Once logged in, Mattermost users will have access to previous Slack messages in the public channels imported from Slack.

Migrating from Bitnami
~~~~~~~~~~~~~~~~~~~~~~

Bitnami uses MySQL, and renames the Mattermost database tables by converting the names to all lower case. For example, in non-Bitnami installations, the Users table is named "Users", but in Bitnami, the table is "users". As a result, when you migrate your data from Bitnami to a non-Bitnami installation, you must modify the MySQL startup script so that it starts MySQL in lowercase table mode.

You can modify the script by adding the ``--lower-case-table-names=1`` switch to the MySQL start command. The location of the start-up script generally depends on how you installed MySQL, whether by using the package manager for the operating system, or by manually installing MySQL. You must modify the start-up script before migrating the data.

For more information about letter case in MySQL table names and the ``--lower-case-table-names`` switch, see the `Identifier Case Sensitivity <https://dev.mysql.com/doc/refman/5.7/en/identifier-case-sensitivity.html>`__ topic in the MySQL documentation.

Migrating from HipChat Server and HipChat Data Center to Mattermost
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Please see `HipChat Migration Guide <https://docs.mattermost.com/onboard/migrating-from-hipchat-to-mattermost.html>`__.

Migrating from Jabber to Mattermost
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

BrightScout helped a major U.S. Federal Agency rapidly migrate from Jabber to Mattermost and open sourced their Extract, Transform and Load (ETL) tool at https://github.com/Brightscout/mattermost-etl.

Read more about their `case study <https://mattermost.com/blog/u-s-federal-agency-migrates-from-jabber-to-mattermost-the-open-source-way/>`__ online.

Migrating from Pidgin to Mattermost
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

In some cases people are using Pidgin clients with different backends to communicate. To continue using Pidgin with a Mattermost backend consider using `Mattermost ETL tool <https://github.com/Brightscout/mattermost-etl>`__ created by BrightScout to migrate data from your existing backend into Mattermost, then use the `Pidgin-Mattermost plugin <https://github.com/EionRobb/purple-mattermost>`__ (complete with an installer for end user machines) to continue to support legacy Pidgin users while offering a whole new Mattermost experience on web, mobile, and PC.

source/onboard/migrating-from-hipchat-to-mattermost.rst METASEP
:orphan:

.. Users trying to access this page are now redirected to /onboard/migrating-to-mattermost.html#migrating-from-slack instead

Migrating from HipChat to Mattermost
=====================================

You can migrate HipChat users and message histories to Mattermost using the following guidelines.

Step 1:  Set up your Mattermost instance
-----------------------------------------

- `Go to Mattermost download page <https://mattermost.com/deploy/>`__ to install Mattermost in your environment using one of the installation guides for Linux binary install, Docker install or various orchestrated installations. 

Questions? Please visit our `troubleshooting forum <https://forum.mattermost.com/t/how-to-use-the-troubleshooting-forum/150>`__ for help. 

Step 2:  Export your data from HipChat Server or HipChat Data Center
---------------------------------------------------------------------

HipChat Server/HipChat Data Center
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

If you’re able to upgrade HipChat Server or HipChat Data Center to the latest version, we recommend using Group Export Dashboard to export your data. If you’re unable to upgrade, see Command Line Interface procedure below. 

*Using the Group Export Dashboard*

#. Log in to your Hipchat Server (e.g. hipchat.yourcompany.com).
#. Click on **Server Admin > Export**.
#. Select the data to export.
#. In the **Password** and **Confirm Password** fields, create a password to protect your archive files (Store this password as it is not saved anywhere else).
#. Click **Export**. Once the export is done, you will receive an email with a link to download the file.

*If you’re unable to use the Group Export Dashboard, use the command line interface to export*

#. Go to **CLI**.
#. Enter ``hipchat export --export  -p your_password``.
#. Once the export is done, you will receive an email with a link to download the file.

More detailed instructions can be found on Hipchat's `documentation <https://confluence.atlassian.com/hipchatdc3/export-data-from-hipchat-data-center-913476832.html>`__ and `knowledge base <https://confluence.atlassian.com/hipchatkb/exporting-from-hipchat-server-or-data-center-for-data-portability-950821555.html>`__.

Step 3: Import your data into Mattermost 
----------------------------------------

1. Follow the `Mattermost Bulk Load Tool <https://docs.mattermost.com/onboard/bulk-loading-data.html>`__ guide to import your data into Mattermost. Files exported from HipChat will need to be converted to the format required by Mattermost. Please `contact us <https://mattermost.zendesk.com/hc/en-us/requests/new>`__ if you require assistance in the conversion. 

2. You are also encouraged to use the HipChat import tool created by Herzum: https://github.com/herzum/HC2MM.

If you’re interested in contributing or testing any community contributed solution, please let us know at info@mattermost.com, Twitter or Mattermost forums at https://forum.mattermost.com.

3. Alternatively, `contact Mattermost <https://mattermost.com/contact-us/>`__ for partner recommendations for your region to assist in your import. 
  
Step 4: Onboard your users into Mattermost
-------------------------------------------

After importing users, you can send out an announcement via email or via your old system (or both) to let users know how to log into Mattermost with their old accounts or how to create new accounts.
 
**Announcing Mattermost onboarding in your previous messaging system:**
 
Use the following message template to alert users of the migration::

     @all, we’re moving communications to a new Mattermost server. You can start your new account by going to the [your new location, e.g. ``https://yourcompany.com/mattermost``], selecting **I forgot my password**, and entering the email you used on this system in the Reset Password page to set up new credentials. Your message history and channels should carry over from this system into Mattermost. Any questions? Please let us know.

**Announcing Mattermost onboarding using email using username/password:**

#. Get a list of email addresses of people in the new system by running a database query on Mattermost. Run ``SELECT Email FROM Users`` from either MySQL or PostgreSQL databases. 
#. Adapt the `migration announcement email template <https://docs.mattermost.com/onboard/migration-announcement-email.html>`__ to let users know how to reclaim their old accounts or start new ones.

Onboard users using SSO in Mattermost
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Alternatively, you can choose to set up SSO (Single Sign-on) with Mattermost if you are using an Enterprise version.  

#. Configure `Active Directory/LDAP <https://docs.mattermost.com/onboard/ad-ldap.html>`__ or `SAML Single Sign-on <https://docs.mattermost.com/onboard/sso-saml.html>`__ from the **System Console**.
#. Adjust the messaging templates above to remove "password reset" references and indicate which SSO system credentials Mattermost has configured.

source/onboard/mattermost-limits.rst METASEP
Workspace limits
================

.. include:: ../_static/badges/allplans-cloud.rst
  :start-after: :nosearch:

There may be limits applied to your Mattermost Cloud workspace based on the type of subscription plan you have. These limits are applied across all users in your team. We'll let you know when you're halfway from reaching a limit, as well as when you're closer to it. 

When limits have been reached, data is archived. This data is not deleted, and can be accessed when you upgrade to a plan with higher limits. If you choose to downgrade your plan, for example from Mattermost Professional to Mattermost Starter, the limits will be applied to your existing data.

In addition to these limits, visit our pricing page to see a complete list of features are available for each of our plans: https://mattermost.com/pricing/.

.. note::

   These limits do not apply to self-hosted deployments. 

Mattermost Starter limits
-------------------------

**Platform limits**

- Maximum 1 team. Any additional teams created during a trial or on a paid plan will be archived.
- 10GB file storage across the platform, with 100MB upload limit. The oldest files that exceed this limit will be archived.
- Unlimited plugins can be installed but only 5 can be enabled at one time. Core plugins such as Boards, Calls, and Playbooks do not count toward this limit.

**Channels limits**

- 10,000 message history limit. The oldest messages that exceed this limit will be archived.

**Boards limits**

- Maximum 5 saved views per board.
- Only the 500 most recently updated cards on the server are displayed.

.. note::
   
   Mattermost reserves the right to archive or delete messages and establish or change (1) limits as to how many messages can be stored, (2) how long such messages will be stored, and (3) charges for storing such messages. Mattermost further reserves the right to establish or change limits on periods of inactivity that may result in the termination of your messages cloud storage and deletion or archiving of any stored messages.

Mattermost Professional limits
------------------------------

**Platform limits**

- 250GB file storage limit.

Frequently Asked Questions
--------------------------

Can I upgrade my plan to get a copy of my archived data?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Currently you don't have to upgrade your plan to get your archived data. You can follow the steps provided `in this article <https://docs.mattermost.com/manage/cloud-data-export.html>`_ to export your data.

Does Mattermost delete data?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

When file and message limits are reached, your data is archived. While you can export your data anytime, if you don't log into, or use, your workspace for an extended period of time, your data may be deleted. We'll let you know ahead of time, so you can take action to reactivate your workspace.

If I have more than one team and I downgrade, which teams are archived?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The first team you created is retained. The rest, if any, are archived.

What happens to additional Boards views that I create?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Views created during a trial or on a paid plan are retained on downgrading to Starter. However, new views can't be created until any additional views are deleted to bring the number of views back to the limit of five.

source/onboard/managing-team-channel-membership-using-ad-ldap-sync-groups.rst METASEP
.. _ldap-group-constrained-team-channel:

Using AD/LDAP synchronized groups to manage team or private channel membership
------------------------------------------------------------------------------

.. include:: ../_static/badges/ent-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Mattermost Enterprise Edition E20*

Mattermost groups created with `synchronized AD/LDAP groups <https://docs.mattermost.com/onboard/ad-ldap-groups-synchronization.html>`_ can be used to manage the membership of private teams and private channels. When a team or private channel is managed by synchronized groups, users will be added and removed based on their membership to the synchronized AD/LDAP group.

For instance, you may have an AD/LDAP group that contains your development team that you want to synchronize to a developer team.  By using this feature, new developers will get added to the team when they are added to the synchronized AD/LDAP group and they will be removed from the team when removed from the AD/LDAP group.

Similarly, you may have an AD/LDAP group that contains your leadership team that you want to synchronize to a private channel for coordination and updates. This feature will help control the membership of the channel so that users outside of the synchronized group are prevented from being added to the channel mistakenly.

On teams that are managed by synchronized groups, users outside of the group are restricted from:

 - Invitation through a team invite link
 - Invitation through an email invite

Similarly on private channels that are managed by synchronized groups, users outside of the group are restricted from:

 - Invitation through a mention
 - Invitation through the ``/invite`` slash command
 - Being added to the channel with **Add members**

Users can remove themselves from teams and private channels managed by synchronized groups.

Managing membership of a team or channel with synchronized groups
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

To manage membership of a private team with synchronized groups:

1. Navigate to **System Console > User Management > Teams**. 
2. Select the team you want to manage with group synchronization.
3. Under **Team Management**, enable **Sync Group Members**. If **Anyone can join this team** is enabled or if specific email domains are set, they will be disabled by the sync group members feature.
4. Add one or more groups to the team. If there are groups already associated to default users into the team, they will already be present.
5. Review the notice in the footer of the screen for any users that are not part of groups who will be removed from the team on the next synchronization.
6. Select **Save**. Members will be updated on the next scheduled AD/LDAP synchronization.

Alternatively you can use the CLI tool to set the team to be managed by groups:

1. Ensure there's at least one group already associated to the team. You can view and add default teams to a group via **System Console > User Management > Groups > Group Configuration**. Please see more information on adding default teams and channels `here <https://docs.mattermost.com/manage/command-line-tools.html#mattermost-group-team-list>`_. Additionally, you can use the CLI tool to view if there is already a group associated to the team by running the `group team list CLI command <https://docs.mattermost.com/manage/command-line-tools.html#mattermost-group-team-list>`_.
2. Ensure **Team Settings > General > Allow any user with an account on this server to join this team** is set to ``No``.
3. Convert the team to have its membership managed by synchronized groups by running the `group team enable CLI command <https://docs.mattermost.com/manage/command-line-tools.html#mattermost-group-team-enable>`_.

To manage membership of a private channel with synchronized groups:

1. Navigate to **System Console > User Management > Channels**. 
2. Select the channel you want to manage with group synchronization.
3. Under **Channel Management**, enable **Sync Group Members**. Please ensure the channel is set to ``private``.
4. Add one or more groups to the channel. If there are groups already associated to default users in the channel, they'll already be present.
5. Review the notice in the footer of the screen for any users that are not part of groups who will be removed from the channel on the next synchronization.
6. Select **Save**. Members will be updated on the next scheduled AD/LDAP synchronization.

Alternatively you can use the CLI tool to set a private channel to be managed by groups:

1. Ensure there's at least one group already associated to the channel. You can view and add default channels to a group via **System Console > User Management > Groups > Group Configuration**. Please see more information on adding default teams and channels `here <https://docs.mattermost.com/onboard/ad-ldap-groups-synchronization.html#adding-default-teams-or-channels-for-the-group>`_. Additionally, you can use the CLI tool to view if there is already a group associated to the channel by running the `group channel list CLI command <https://docs.mattermost.com/manage/command-line-tools.html#mattermost-group-team-list>`_.
2. Convert the team to have its membership managed by synchronized groups by running the `group channel enable CLI command <https://docs.mattermost.com/manage/command-line-tools.html#mattermost-group-channel-enable>`_.

Add or remove groups from teams
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Once the management of the team is converted to be managed by synchronized groups, a Team or System Admin can add additional groups from **Main Menu > Add Groups to Team**. This will add users on the next AD/LDAP synchronization and any new users to the group will be added to the team on subsequent synchronizations. Team Admins will be prevented from changing the team to public by enabling **Team Settings > Allow any user with an account on this server to join this team**.

Team or System Admins can also remove groups from a team from **Main Menu > Manage Groups**. This will disassociate the group from the team. Users are removed on the next AD/LDAP synchronization.

The System Admin can also remove groups from  **System Console > User Management > Teams > Team Configuration > Synced Groups**.

Add or remove groups from private channels
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Once the management of the channel is converted to be managed by synchronized groups, a Team or System Admin can add additional groups from **Channel Menu > Add Groups to Channel**. This will add users on the next AD/LDAP synchronization and any new users to the group will be added to the channel on subsequent synchronizations.

Team or System Admins can also remove groups from a team from **Main Menu > Manage Groups**. This will disassociate the group from the team. Users are removed on the next AD/LDAP synchronization.

The System Admin can also remove groups from  **System Console > User Management > Channels > Channel Configuration > Synced Groups**.

Managing members
^^^^^^^^^^^^^^^^

Users are automatically removed from the team or private channel when removed from a synchronized AD/LDAP group that is managing the membership of that team or channel. Additionally, users who are not in the synchronized groups are prevented from being added through the ``/invite`` and mention flows within a channel.

A user can remove themselves from the team or from the private channel when it is managed by synchronized groups. They can be added back by users who have permission to manage members for a team or private channel by using the ``/invite`` slash command or by mentioning the user in a channel.

If the user is removed from a synchronized group and later readded to the group, they can be manually added back to the team or private channel as noted above.

.. note:: 
  Users will not be automatically added back by the AD/LDAP synchronization once they remove themselves or are removed by the LDAP synchronized group.

Disabling group synchronized management of teams and private channels
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

To remove the management of members by synchronized groups in a team, disable **Sync Group Members** under **System Console > User Management > Teams > Team Management**, or run the `group team disable CLI command <https://docs.mattermost.com/manage/command-line-tools.html#mattermost-group-team-disable>`_.

To remove the management of members by synchronized groups in a channel, disable **Sync Group Members** under **System Console > User Management > Channels > Channel Management**, or run the `group channel disable CLI command <https://docs.mattermost.com/manage/command-line-tools.html#mattermost-group-channel-disable>`_.

Frequently asked questions
^^^^^^^^^^^^^^^^^^^^^^^^^^

**Why aren’t public channels supported with this feature?**

Public channels are available to all members to discover and join. Managing membership with synchronized groups removes the ability for public channels to be accessible to users on the team. Private channels typically require a more controlled membership management, which is why this feature applies to Private channels. Groups can be assigned to public teams and public channels as described in `this documentation <https://docs.mattermost.com/onboard/ad-ldap-groups-synchronization.html#adding-default-teams-or-channels-for-the-group>`_.

**Does a team with its membership managed by groups have any effect on Public channel access?**

Only users that are members of groups synchronized to team are able to discover and join public channels. Private channels can also be managed by synchronized groups when a team is managed by synchronized groups.

**Why don't users get readded to teams or channels once they have been removed from and then later re-added to the LDAP group?**

The implementation of group removals does not currently differentiate between users who have removed themselves or have been removed by the LDAP synchronization process. Our design optimizes for users who have removed themselves from a team or channel. In the future, we may add the ability for admins to re-add users who have been removed, and even prevent users from leaving a team or channel.

Additionally, LDAP users who aren't accessible to Mattermost based on filters will be removed from the groups and from group-synced teams and channels. If they were removed from teams and channels then they will not be re-added to those teams and channels upon becoming subsequently re-accessible to Mattermost.

source/onboard/guest-accounts.rst METASEP
.. _guest-accounts:

Guest accounts
==============

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10 and E20*

Guest accounts are a way to collaborate with individuals, such as vendors and contractors, outside of your organization by controlling their access to channels and team members. For example, guest accounts can be used to collaborate with customers on a support issue or work on a website project with resources from an external design firm.

Guests can:

- Pin messages to channels
- Use slash commands (excluding restricted commands such as invite members, rename channels, change headers, etc)
- Favorite channels
- Mute channels
- Update their profile

Guests cannot:

- Discover public channels
- Join open teams
- Create direct messages or group messages with members who aren’t within the same channel
- Invite people

Additionally, guest accounts count as a paid user in your Mattermost workspace, but guests are not automatically added to the default **Town-square** and **Off-topic** channels upon logging in. Guests must be invited/added to these channels manually.

Enable guest accounts
----------------------

1. Go to **System Console > Authentication > Guest Access**.
2. Set **Enable Guest Access** to **true**.
3. (Optional) Specify the **Whitelisted Guest Domains** that are acceptable for guest access. This allows the System Admin to set a list of approved guest domains.
4. (Optional) Set **Enforce Multi-factor Authentication** to **true**. If you're enforcing MFA for your users, you can optionally choose to also enforce MFA for your guest users.
 
.. note::

  If you have team domain restrictions, you also need to add your guest domain in **System Console > User Management > Teams**. Select a team, then enable **Only specific email domains can join this team**.

Guest authentication
---------------------

Guests can access the Mattermost server via email invitation, and be authenticated using AD/LDAP or SAML 2.0.

Before you proceed, ensure that the authentication method you wish to use is correctly configured on your server and enabled in Mattermost. For configuration steps and technical documentation, see `Active Directory/LDAP Setup <https://docs.mattermost.com/onboard/ad-ldap.html>`_ and `SAML Single-Sign-On <https://docs.mattermost.com/onboard/sso-saml.html>`__.

Converting a member user to a guest will not change the channels they are in. However, they will be restricted from discovering additional channels and are unable to direct message/group message users outside of the channels they are in. They can be added to channels by System Admins and other roles that have the correct permissions to invite guests.

Invite guests to the Mattermost server via email
-------------------------------------------------

Guests can be invited into one or more Mattermost channels within a team by System Admins and other roles that have the correct permission to invite guests. A guest can be invited into channels on multiple teams.

.. note::
  
  Guest invitations are revoked after 48 hours per the member email invitation process. If your guest has not accepted the invitation within that period, please follow the steps below to resend an invitation to the guest.

To invite guests into one or more Mattermost channels:

1. Go to **System Console > Signup > Enable Email Invitations** to enable email invites.
2. Select your team's name at the top of the channel sidebar and choose **Invite People**.
3. Select **Invite Guests**.
4. Enter the guest’s email address.
5. Choose the channels the guest can join (excluding managed teams).
6. (Optional) Enter a custom message.

.. image:: ../images/Guest_Invite_Screen.png

Configure AD/LDAP authentication
---------------------------------

When enabled, the **Guest Filter** in Mattermost identifies external users whose AD/LDAP role is ``guest`` and who are invited to join your Mattermost server. These users will have the ``guest`` role applied immediately upon first login instead of the default member user role. This eliminates having to manually assign the role in the System Console.

1. Go to **System Console > Authentication > Guest Access** to enable guest access.
2. Go to **System Console > Authentication > AD/LDAP**.
3. Complete the **Guest Filter** field.
4. Select **Save**.

If a Mattermost guest user has the ``guest`` role removed in the AD/LDAP system, the synchronization process will not automatically promote them to a member user role. This is done manually via **System Console > User Management**. If a member user has the **Guest Attribute** added, the synchronization processes will automatically demote the member user to the guest role.

When a guest logs in without having any channels assigned to their account, they're advised to contact a Mattermost System Admin. 

Configure SAML 2.0 authentication
----------------------------------

When enabled, the **Guest Attribute** in Mattermost identifies external users whose SAML assertion is guest and who are invited to join your Mattermost server. These users will have the ``guest`` role applied immediately upon first login instead of the default member user role. This eliminates having to manually assign the role in the System Console.

If a Mattermost guest user has the guest role removed in the SAML system, the synchronization processes will not automatically promote them to a member user role. This is done manually via **System Console > User Management**. If a member user has the **Guest Attribute** added, the synchronization processes will automatically demote the member user to the guest role.

1. Go to **System Console > Guest Access** to enable guest access.
2. Go to **System Console > Authentication > SAML 2.0**.
3. Complete the **Guest Attribute** field.
4. Select **Save**.

When a guest logs in without having any channels assigned to their account, they're advised to contact a Mattermost System Admin.

Guest permission settings
-------------------------

In Mattermost Enterprise and Professional, you can control which users can invite guests. By default, only the System Admins can invite guests.

There are `additional permissions <https://docs.mattermost.com/onboard/advanced-permissions.html>`__ in Mattermost Enterprise that can be adjusted under **System Console > User Management > Permissions > System Scheme** to control a guest’s ability to:

 - Edit posts
 - Delete posts
 - Post reactions
 - Create private channels with members they are allowed to collaborate with

Guest identification
---------------------

Guests are identified with a **Guest** badge. This badge is visible in various places on the interface and mobile apps, such as on a guest’s profile and next to their name on user lists, including @mentions. When guests are added to a channel, a system message informs other channel members that the added user is a guest.

Channels containing guests display the message: *This channel has guests*.

.. image:: ../images/Guest_Badges.png

Manage guests
--------------

Add guests to additional channels
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Users with the permissions to invite guests can **Invite Guests** to additional channels. A system message will be posted in the channels to let other members know a guest user has been added.

Remove guests from channels and teams
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Guests can be removed from a channel through **Manage members**, or by using the ``/kick`` or ``/remove`` slash commands.

When a guest has been removed from all channels within a team, and if they belong to other teams, they will default into the last channel on the last team they have accessed. If they are removed from all channels on all teams, they'll be taken to a screen letting them know they have no channels assigned.

Promote and demote user roles
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

System Admins can demote a user from a member to a guest by updating the user's role in **System Console > User Management > Users**. Select the member, then select **Demote to Guest**. System Admins should also purge all of the demoted guest's sessions by selecting the guest user, then selecting **Revoke Sessions**.

The demoted guest user retains their existing channel and team memberships, but is restricted from discovering public channels and collaborating with users outside of the channels they're in. This is useful if you're already collaborating with external contractors, and want to restrict their abilities within Mattermost.

System Admins can also promote a guest to member by updating their role in **System Console > User Management > Users**. Select the guest, then select **Promote to Member**.

.. note::
  
  You can filter the list in **System Console > User Management > Users** to view all guests in the system.

Disable guest accounts
-----------------------

To disable the guest accounts feature, go to **System Console > Authentication > Guest Access**, then set **Enable Guest Access** to **False**. To deactivate individual guest accounts, go to **System Console > User Management > Users**. Select a user, then select **Deactivate**. You can re-activate individual Guest Accounts by selecting **Activate**.

From Mattermost Server version 5.18 and in Mattermost Cloud:

- Wwhen a single guest account is deactivated or the guest account feature is disabled, guests are marked as ``inactive``, are logged out of Mattermost, and all guest sessions are revoked. In Mattermost Server versions prior to 5.18, disabling the guest account feature leaves current guest accounts as active until they are manually deactivated.
- If you're using AD/LDAP and the guest access setting is disabled, the ``guest`` filter and existing guest users in System Console are deactivated. Additionally, no new guests can be invited or added using the filter as an authentication method. If a previous guest's credentials match the user filter (the only filter which is active when guest access is disabled), they will be reactivated and promoted to a member user upon their next login.
- Similarly, for SAML, when the guest access setting is disabled, the ``guest`` attribute and existing guest users in System Console are deactivated. Additionally, no new guests can be invited or added using the attribute as an authentication method. If a previous guest's credentials match the user attribute (the only attribute which is active when guest access is disabled), they will be reactivated and promoted to a member user upon their next login.

You can disable individual guest accounts in **System Console > User Management** via **Manage Members**. When a single guest account is disabled or the feature is disabled, the guest will be marked as ``inactive``, be logged out of Mattermost, and all their sessions will be revoked.

Reinstate guest accounts
-------------------------

When guest access is re-enabled for AD/LDAP, the ``guest`` filter is reinstated. 

New users matching the ``guest`` filter will be authenticated as new guest users on login.

Previous guest users will be activated with the next synchronization. If their credentials still match the ``guest`` filter, they will retain their guest status. If they no longer match the ``guest`` filter but do match the ``user`` filter, they will be not be promoted to member user automatically on login - this must be done manually. If a previous guest was reactivated as a member user when guest access was disabled, and now are identified by the ``guest`` filter once again, they will automatically be demoted to Guest upon their login.

Similarly, for SAML, when guest access is re-enabled, the SAML ``guest`` attribute is reinstated. New users matching the ``guest`` attribute will be authenticated as new guest users on login.

Previous guest users will be activated with the next synchronization. If their credentials still match the ``guest`` attribute, they will retain their guest status. If they no longer match the ``guest`` attribute but do match the ``user`` filter, they will be not be promoted to member user automatically on login - this must be done manually. If a previous guest was reactivated as a member user when guest access was disabled, and now are identified by the ``guest`` attribute once again, they will automatically be demoted to guest upon their login.

Frequently Asked Questions
---------------------------

How am I charged for guest accounts?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Guests are charged as a user seat.

Why doesn’t Mattermost have single-channel guests?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

We wanted to support collaboration with external guests for the broadest use cases without limiting guests' access to channels. In the future, we may consider adding single-channel guests.

Can I set an expiration date for guests?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Currently, you cannot. This feature may be added at a later stage.

Can MFA be applied selectively?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

If MFA is enforced for your users, it can be applied to guest accounts. Guests can configure MFA in by going to their avatar and selecting **Profile > Security**. If MFA is not enforced for your users, it can't be applied to guest accounts.

Has the guest accounts feature been reviewed by an external security firm?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The guest account feature was reviewed by the Mattermost security team. We do not have an external firm review scheduled but will include this feature in future reviews.

How can I validate my guests' identity?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Guests can be authenticated via SAML and/or AD/LDAP to ensure that only the named guest can log in. Alternatively, you can whitelist domains via **System Console > Authentication > Guest Access > Whitelisted Guest Domains**.

Can I restrict guests' ability to upload content?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

It is not currently possible to selectively disable upload/download functionality as it is a server-wide configuration.

source/onboard/convert-oauth20-service-providers-to-openidconnect.rst METASEP
Converting OAuth 2.0 Service Providers to OpenID Connect
========================================================

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Mattermost Enterprise Edition E20*

.. include:: common-converting-oauth-to-openidconnect.rst
  :start-after: :nosearch:

Configuring OpenID Connect Single Sign-On
-----------------------------------------

.. include:: ../_static/badges/selfhosted-only.rst
  :start-after: :nosearch:

For details on configuring Mattermost to use a service provider as a Single Sign-on (SSO) service for team creation, account creation, and user sign-in using OpenID Connect, refer to the following documentation:

- `OpenID Connect Single Sign-On <https://docs.mattermost.com/onboard/sso-openidconnect.html>`_
- `GitLab Single Sign-On <https://docs.mattermost.com/onboard/sso-gitlab.html>`__
- `Google Apps Single Sign-On <https://docs.mattermost.com/onboard/sso-google.html>`__
- `Office 365 Single Sign-On <https://docs.mattermost.com/onboard/sso-office.html>`__

source/onboard/common-sso-openidconnect.rst METASEP
:nosearch:

Mattermost provides OpenID Connect support for `GitLab <https://docs.mattermost.com/cloud/cloud-administration/sso-gitlab.html>`__, `Google Apps <https://docs.mattermost.com/cloud/cloud-administration/sso-google.html>`__, and `Office 365 <https://docs.mattermost.com/cloud/cloud-administration/sso-office.html>`__. With OpenID Connect, users can also use their login to Keycloak, Atlassian Crowd, Apple, Microsoft, Salesforce, Auth0, Ory.sh, Facebook, Okta, OneLogin, and Azure AD, as well as others, as a Single Sign-on (SSO) service for team creation, account creation, and user login.

Follow these steps to configure a service provider using OpenID Connect.

Step 1: Create an OpenID Connect Application
---------------------------------------------

1. Follow service provider documentation for creating an OpenID Connect application. Most OpenID Connect service providers require authorization of all redirect URIs.
2. In the appropriate field, enter ``{your-mattermost-url}/signup/openid/complete`` For example: ``http://domain.com/signup/openid/complete``
3. Copy and paste values for the **Discovery Endpoint**, **Client ID**, and **Client Secret** values to a temporary location. You will enter these values when you configure Mattermost.

Step 2: Configure Mattermost for an OpenID Connect SSO
-------------------------------------------------------

1. Log in to Mattermost, then go to **System Console > Authentication > OpenID Connect**.
2. Select **OpenID Connect (Other)** as the service provider.
3. Enter the **Discovery Endpoint**.
4. Enter the **Client ID**.
5. Enter the **Client Secret**.
6. Specify a **Button Name** and **Button Color** for the OpenID Connect option on the Mattermost login page.
7. Select **Save**.
8. Restart your Mattermost server to see the changes take effect.

.. note::
  When Mattermost is configured to use OpenID Connect for user authentication, the following user attribute changes can't be made through the Mattermost API: first name, last name, or username. OpenID Connect must be the authoritative source for these user attributes.
  
Frequently Asked Questions
--------------------------

How can I use LDAP attributes or Groups with OpenID?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

At this time, LDAP data isn't compatible with OpenID. If you currently rely on LDAP to manage your users' teams, channels, groups, or attributes, you won't be able to do this automatically with users who have logged in with OpenID. If you need LDAP synced to each user, we suggest using SAML or LDAP as the login provider. Some OpenID providers can use SAML instead, like Keycloak.

source/onboard/common-sso-office365.rst METASEP
:nosearch:

Configuring Office 365 as a Single Sign-On (SSO) service
--------------------------------------------------------

Follow these steps to configure Mattermost to use your Office 365 logon credentials and Azure Active Directory account as a Single Sign-on (SSO) service for team creation, account creation, and sign-in.

.. note::

  The system must be using SSL as Microsoft only allows OAuth redirect URIs that are SSL-enabled.

Step 1: Register an application in Azure Portal
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Log in to the `Azure Portal <https://portal.azure.com/>`__ with the account that relates to the Azure Active Directory tenant where you want to register the application. You can confirm the tenant in the top right corner of the portal.

2. In the left-hand navigation pane, select the **Azure Active Directory service**, then select **App registrations > New registration**.

3. Give your new registration a **Name**.

4. Define which **Supported account types** can access the application. For example, if this is to be only accessed from your enterprise's Azure AD accounts, then select **Accounts in this organizational directory only**. 

5. Define the **Redirect URI** as Web client, then input the URL with the host name that will be specific to your Mattermost service followed by ``/signup/office365/complete``. An example below is: ``https://your.mattermost.com/signup/office365/complete``

.. image:: /images/AzureApp_New_Registration.png

.. image:: /images/AzureApp_SetupMenuv2.png

Once the App Registration has been created, you can configure it further. See the standard `Azure AD documentation <https://docs.microsoft.com/en-gb/azure/active-directory/develop/quickstart-register-app>`__ for reference.

Step 2: Generate a new client secret in Azure Portal
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. In the Azure Portal, select **Certificates and Secrets** from the menu, then select the button to generate a **New Client secret**. 

2. Provide a description, define the expiry for the token, then select **Add**.

3. In Azure Portal, select **Overview** from the menu, then copy and paste both the Application (client) ID and the Directory (tenant) ID to a temporary location. You will enter these values as an **Application ID** and as part of an **Auth Endpoint** and **Token Endpoint** URL in the Mattermost System Console.

.. image:: /images/AzureApp_Client_Secret_Expiry.png

.. image:: /images/AzureApp_App_Directory_IDsv2.png

Step 3: Configure Mattermost for Office 365 SSO
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Log in to Mattermost, then go to **System Console > Authentication > OpenID Connect**.

2. Select **Office 365** as the service provider.

3. Paste the **Directory (tenant) ID** from the Azure Portal as the **Directory (tenant) ID** in Mattermost.

4. The **Discovery Endpoint** for OpenID Connect with Office 365 is prepopulated with ``https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration``.

5. Paste the **Application (client) ID** from the Azure Portal as the **Client ID** in Mattermost.

6. Paste the **client secret** value from the Azure Portal as the **Client Secret** in Mattermost.

7. Select **Save**.

.. note::
  When Mattermost is configured to use OpenID Connect or OAuth 2.0 for user authentication, the following user attribute changes can't be made through the Mattermost API: first name, last name, or username. OpenID Connect or OAuth 2.0 must be the authoritative source for these user attributes.

Note about Microsoft Active Directory Tenants
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

A Microsoft Active Directory (AD) tenant is a dedicated instance of Azure Active Directory (Azure AD) that you own and would have received when signing up for a Microsoft cloud service, such as Azure or Office 365. Tenants are commonly used by organizations who want to store information about their users, such as passwords, user profile data, and permissions. You can learn more about `getting an Azure AD tenant here <https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-create-new-tenant>`__.

To allow your Azure AD users to log in to Mattermost using Office 365 SSO, you must register Mattermost in the Microsoft Azure AD tenant that contains the users' information. The registration can be done from the `Microsoft Azure portal <https://portal.azure.com>`__. The steps to register the Mattermost account in the tenant should be similar to those provided above, and you can find more information about `integrating apps with Azure AD here <https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-create-new-tenant>`__.

If you don't register Mattermost in the Microsoft Azure AD tenant your organization uses, Office 365 SSO will likely fail for your users.

.. note:: 

  If you do not use Azure Active Directory, you may register Mattermost with your Office 365 or Azure account (a personal, work, or school account), then set up Office 365 SSO with Mattermost using the steps provided above.

source/onboard/common-sso-google.rst METASEP
:nosearch:

Configuring Google Apps as a Single Sign-On (SSO) service
---------------------------------------------------------

Follow these steps to configure Mattermost to use Google as a Single Sign-on (SSO) service for team creation, account creation, and login.

.. note::

  The `Google People API <https://developers.google.com/people>`__ has replaced the Google+ API, which was deprecated by Google as of March 7th, 2019 `per their notice <https://developers.google.com/+/api-shutdown>`__.

Step 1: Create OpenID Connect project in Google API Manager
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Go to `Google Cloud Platform <https://console.developers.google.com>`__.

2. Select **Credentials** in the left-hand sidebar.

3. Select **Create Credentials**, then select **OAuth client ID**.

4. Select the **Web application** as the application type.

5. Enter ``Mattermost-<your-company-name>`` as the **Name**, replacing ``<your-company-name>`` with the name of your organization.

6. Under **Authorized redirect URIs**, select **Add URL**, then enter ``{your-mattermost-url}/signup/google/complete``. For example: ``http://localhost:8065/signup/google/complete``.

7. Select **Create**.

8. Copy and paste the **Your Client ID** and **Your Client Secret** values to a temporary location. You will enter these values in the Mattermost System Console.

.. image:: /images/create-google-sso-credentials.png

.. image:: /images/select-google-sso-web-app.png

.. image:: /images/google-sso-web-app-name.png

.. image:: /images/google-sso-redirect-uri.png

.. image:: /images/google-sso-credentials.png

Step 2: Enable Google People API
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Go to the `Google People API <https://console.developers.google.com/apis/api/plus/overview>`__, then select **Enable** in the header. This might take a few minutes to propagate through Google's systems.

Step 3: Configure Mattermost for Google Apps SSO
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Log in to Mattermost, then go to **System Console > Authentication > OpenID Connect**.

2. Select **Google Apps** as the service provider.

3. The **Discovery Endpoint** for OpenID Connect with Google Apps is prepopulated with ``https://accounts.google.com/.well-known/openid-configuration``.

4. Paste in the **Client ID** from Google in Mattermost.

5. Paste in the **Client Secret** from Google in Mattermost.

6. Select **Save**.

.. note::
  When Mattermost is configured to use OpenID Connect or OAuth 2.0 for user authentication, the following user attribute changes can't be made through the Mattermost API: first name, last name, or username. OpenID Connect or OAuth 2.0 must be the authoritative source for these user attributes.

source/onboard/common-disable-mfa.rst METASEP
:nosearch:

Disabling MFA
^^^^^^^^^^^^^

System Admins can disable this option by going to **System Console > Authentication > MFA**. When **Enable Multi-factor Authentication** is set to **false**, users can't opt to use or disable multi-factor authentication on their account via **Profile > Security > Multi-factor Authentication**.

MFA can be disabled for user accounts using the API. See the `Mattermost API Reference <https://api.mattermost.com/#tag/users/paths/~1users~1{user_id}~1mfa/put>`__ for details.

source/onboard/common-converting-oauth-to-openidconnect.rst METASEP
:nosearch:

Using the System Console, Mattermost Enterprise and Professional customers can migrate OAuth configuration to the OpenID Connect standard. A one-time, one-click conversion tool is available within the existing **OAuth 2.0** page. You can also go to **System Console > Authentication > OpenID Connect**.

Select **Convert to OpenID Connect** to migrate your active service provider configuration to the new standard. No further changes are required. 

.. note::
  - Inactive service providers configured for OAuth 2.0 are also migrated to the new OpenID Connect standard. 
  - Converting to OpenID Connect removes the **OAuth 2.0** option from the System Console menu.

source/onboard/certificate-based-authentication.rst METASEP
Certificate-based authentication (experimental)
===============================================

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available as an experimental feature in legacy Mattermost Enterprise Edition E20.*

Certificate-based authentication (CBA) is available as an experimental feature to identify a user or a device before granting access to Mattermost and provide an additional layer of security to access the system.

Follow these steps to configure user CBA for your browser and Mattermost Desktop Apps. Support for the Mattermost iOS and Android Apps is planned. It is expected that you can manage certificate distribution for each personal device (BYOD) and their lifecycle management with a service like `OpenSSL <https://www.openssl.org/>`__.

Before you begin, follow the `official guides to install Mattermost <https://docs.mattermost.com/guides/deployment.html#install-guides>`__ on your system, including NGINX configuration as a proxy with SSL and HTTP/2, and a valid SSL certificate such as Let's Encrypt.

.. contents::
  :backlinks: top
  :local:
  :depth: 2

Set up mutual TLS authentication for the Web App
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This is the first step for setting up certificate-based authentication. If you haven't set up mutual TLS authentication yet, `see our documentation to learn more <https://docs.mattermost.com/onboard/ssl-client-certificate.html>`__.

Set up Mattermost server to log in with a client certificate
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Make sure your Mattermost server is licensed with a valid Enterprise license.
2. In ``ExperimentalSettings`` of the ``config.json`` file, set ``ClientSideCertEnable`` to ``true`` and ``ClientSideCertCheck`` to one of the following values:

- ``primary`` - After the client side certificate is verified, user's email is retrieved from the certificate and is used to log in without a password.
- ``secondary`` - After the client side certificate is verified, user's email is retrieved from the certificate and matched against the one supplied by the user. If they match, the user logs in with regular email/password credentials.

The ``config.json`` file should then have the following lines

.. code-block:: text

  "ExperimentalSettings": {
      "ClientSideCertEnable": true,
      "ClientSideCertCheck": "secondary"
  },

3. Restart the Mattermost server.

On Ubuntu 14.04 and RHEL 6:

.. code-block:: text

  sudo restart mattermost

On Ubuntu 16.04, Debian Stretch, and RHEL 7:

.. code-block:: text

  sudo systemctl restart mattermost

4. Go to ``https://example.mattermost.com`` and try to log in. The server should require the x.509 cert to have an ``emailAddress`` equal to the Mattermost user's email.

source/onboard/bulk-loading-troubleshooting.rst METASEP
:nosearch:
.. _bulk-loading-troubleshooting:

Troubleshooting
---------------

Running bulk loading tool hangs and doesn't complete
-----------------------------------------------------

If you have Bleve search indexing enabled, temporarily disable it in **System Console > Experimental > Bleve** and run the command again.

Bleve does not support multiple processes opening and manipulating the same index. Therefore, if the Mattermost server is running, an attempt to run the bulk loading tool will lock when trying to open the indeces.

If you are not using the Bleve search indexing, feel free to post in our `Troubleshooting forum <https://docs.mattermost.com/install/troubleshooting.html>`__ for help.

source/onboard/bulk-loading-data.rst METASEP
.. _bulk-loading:

Bulk loading data
=================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Large quantities of data can be imported from a `JSONL <https://jsonlines.org>`__ file into Mattermost at the command line using the bulk loading feature. This feature is most suitable for migrating data from an existing system, or for pre-populating a new installation with data.

You can import the following data types:

- Teams
- Channels (public and private)
- Users
- Users' team memberships
- Users' channel memberships
- Users' notification preferences
- Posts (regular, non-reply posts)
- Posts' replies
- Posts' reactions
- Posts' file attachments
- Direct message and group message channels
- Direct messages and group messages
- Direct messages from a user to themselves
- Permissions schemes
- Custom emoji

Importing additional types of posts is not yet supported.

.. contents:: Contents
  :backlinks: top
  :local:
  :depth: 2

.. include:: bulk-loading-about.rst
  :start-after: :nosearch:

.. include:: run-bulk-loading-command.rst
  :start-after: :nosearch:

.. include:: bulk-loading-data-format.rst
  :start-after: :nosearch:

.. include:: bulk-loading-common-issues.rst
  :start-after: :nosearch:

.. include:: bulk-loading-troubleshooting.rst
  :start-after: :nosearch:

source/onboard/bulk-loading-data-format.rst METASEP
:nosearch:
.. _data-format:

Data format
-----------

The input data file must be a valid `JSONL
<https://jsonlines.org>`__ file with the following objects, each on its own line in the file. The objects must occur in the file in the order listed.

Version
  Mandatory. The Version object must be the first line in the file, and must occur only once. The version is the version of the bulk importer tool, which is currently ``1``. 
Scheme
  Optional. If present, Scheme objects must occur after the Version object but before any Team objects.
Emoji
  Optional. If present, Emoji objects must occur after the Version objects but before any Team objects.
Team
  Optional. If present, Team objects must occur after any Scheme objects and before any Channel objects.
Channel
  Optional. If present, Channel objects must occur after all Team objects and before any User objects.
User
  Optional. If present, User objects must occur after the Team and Channel objects in the file and before any Post objects. Each User object defines the teams and channels that the user is a member of. If the corresponding teams and channels are not in the data file, then they must exist in the Mattermost database.
Post
  Optional. If present, Post objects must occur after the last User object but before any DirectChannel objects. Each Post object defines the team, the channel, and the username of the user who posted the message. If the corresponding team, channel, or user are not in the data file, then they must exist in the Mattermost database.
DirectChannel
  Optional. If present, DirectChannel objects must occur after all Post objects in the file and before any DirectPost objects.
DirectPost
  Optional. If present, DirectPost objects must occur after all other objects in the file. Each DirectPost object defines the usernames of the channel members and the username of the user who posted the message. If the corresponding usernames are not in the data file, then they must exist in the Mattermost database.

With the exception of the Version object, each object has a field or a combination of fields that is used as the unique identifier of that object. The bulk loader uses the unique identifier to determine if the object being imported is a new object or an update to an existing object.

The identifiers for each object are listed in the following table:

.. csv-table:: Objects and their unique identifiers
  :header: Object, Unique Identifier

  Version, Not Applicable
  Scheme, *name*
  Role, *name*
  Emoji, *name*
  Team, *name*
  Channel, "*name*, *team*"
  User, *username*
  UserNotifyProps, *username*
  UserTeamMembership, "*team*, *username*"
  UserChannelMembership, "*team*, *channel*, *username*"
  Post, "*channel*, *message*, *create_at*"
  Reply, "*post*, *message*, *create_at*"
  Reaction, "*post*, *emoji_name*, *create_at*"
  Attachment, "*path*"
  DirectChannel, *members*
  DirectPost,  "*channel_members*, *user*, *message*, *create_at* "

The following fragment is from a file that imports two teams, each with two channels, many users, and many posts.

.. code-block:: javascript
  :linenos:

  { "type": "version", ... }
  { "type": "team", "team": { "name": "TeamA", ...} }
  { "type": "team", "team": { "name": "TeamB", ...} }
  { "type": "channel", "channel": { "team": "TeamA", "name": "channel_a1", ...} }
  { "type": "channel", "channel": { "team": "TeamA", "name": "channel_a2", ...} }
  { "type": "channel", "channel": { "team": "TeamB", "name": "channel_b1", ...} }
  { "type": "channel", "channel": { "team": "TeamB", "name": "channel_b2", ...} }
  { "type": "user", "user": { "username": "user001", ...} }
  { "type": "user", "user": { "username": "user002", ...} }
  { "type": "user", "user": { "username": "user003", ...} }
  { "type": "user", ... }
  { "type": "user", ... }
  { "type": "user", ... }
  .
  .
  .
  { "type": "post", { "team": "TeamA", "name": "channel_a1", "user": "user001", ...} }
  { "type": "post", { "team": "TeamA", "name": "channel_a1", "user": "user001", ...} }
  { "type": "post", { "team": "TeamA", "name": "channel_a1", "user": "user001", ...} }
  .
  .
  .

Version object
--------------

The Version object must be the first object in the data file, and can appear only once.  The version represents the version of the bulk import tool and currently is ``1``. 

Example Version object
~~~~~~~~~~~~~~~~~~~~~~

For clarity, the object is shown using regular JSON formatting, but in the data file it cannot be spread across several lines. It must be all on one line.

.. code-block:: javascript

  {
    "type": "version",
    "version": 1
  }

Fields of the Version object
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. raw:: html

  <table width="100%" border="1" cellpadding="5px" style="margin-bottom:20px;">
    <tr class="row-odd">
      <th class="head">Field name</th>
      <th class="head">Type</th>
      <th class="head">Description</th>
      <th class="head">Validated</th>
      <th class="head">Mandatory</th>
    </tr>
    <tr class="row-odd">
      <td valign="middle">type</td>
      <td valign="middle">string</td>
      <td>Must be the string "version"</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">Yes</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">version</td>
      <td valign="middle">number</td>
      <td>Must be the number 1.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">Yes</td>
    </tr>
  </table>

Scheme object
-------------

Scheme objects represent Permissions Schemes in the Mattermost permissions system. If present, Scheme objects must occur after the Version object and before any Team objects.

Example Scheme object
~~~~~~~~~~~~~~~~~~~~~

For clarity, the object is shown using regular JSON formatting, but in the data file it cannot be spread across several lines. It must be all on one line.

.. code-block:: javascript

  {
    "type": "scheme",
    "scheme": {
      "name": "custom_scheme_name",
      "display_name": "Custom Scheme Name",
      "description": "This is a custom override scheme.",
      "scope": "team",
      "default_team_admin_role": {
        "name": "custom_scheme_team_admin_role",
        "display_name": "Custom Scheme Team Admin Role",
        "description": "This is the default team admin role for the custom scheme.",
        "permissions": ["add_user_to_team", "manage_team_roles"],
      },
      "default_team_user_role": {
        "name": "custom_scheme_team_user_role",
        "display_name": "Custom Scheme Team User Role",
        "description": "This is the default team user role for the custom scheme.",
        "permissions": ["create_public_channel", "create_private_channel"],
      },
      "default_channel_admin_role": {
        "name": "custom_scheme_channel_admin_role",
        "display_name": "Custom Scheme Channel Admin Role",
        "description": "This is the default channel admin role for the custom scheme.",
        "permissions": ["manage_private_channel_members", "manage_channel_roles"],
      },
      "default_channel_user_role": {
        "name": "custom_scheme_channel_user_role",
        "display_name": "Custom Scheme Channel User Role",
        "description": "This is the default channel user role for the custom scheme.",
        "permissions": ["manage_public_channel_members", "manage_public_channel_properties"],
      },
    }
  }

Fields of the Scheme object
~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. raw:: html

  <table width="100%" border="1" cellpadding="5px" style="margin-bottom:20px;">
    <tr class="row-odd">
      <th class="head">Field name</th>
      <th class="head">Type</th>
      <th class="head">Description</th>
      <th class="head">Validated</th>
      <th class="head">Mandatory</th>
    </tr>
    <tr class="row-odd">
      <td valign="middle">name</td>
      <td valign="middle">string</td>
      <td>The scheme name. Must start with and contain only lowercase letters <kbd>([a-z0-9])</kbd> or <kbd>_</kbd>, and must be between 2-64 characters in length.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">Yes</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">display_name</td>
      <td valign="middle">string</td>
      <td>The display name for the scheme.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">Yes</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">scope</td>
      <td valign="middle">string</td>
      <td>The scope for the scheme. Must be either "team" or "channel".</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">Yes</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">description</td>
      <td valign="middle">string</td>
      <td>The description of the scheme.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">default_team_admin_role</td>
      <td valign="middle"><b>Role</b> object</td>
      <td>The default role applied to Team Admins in teams using this scheme. This field is mandatory if the scheme scope is set to "team", otherwise must <b>not</b> be present.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">default_team_user_role</td>
      <td valign="middle"><b>Role</b> object</td>
      <td>The default role applied to Team Users in teams using this scheme. This field is mandatory if the scheme scope is set to "team", otherwise must <b>not</b> be present.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">default_channel_admin_role</td>
      <td valign="middle"><b>Role</b> object</td>
      <td>The default role applied to Channel Admins in channels using this scheme. This field is mandatory for both "team" and "channel" scope schemes.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">Yes</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">default_channel_user_role</td>
      <td valign="middle"><b>Role</b> object</td>
      <td>The default role applied to Channel Users in channels using this scheme. This field is mandatory for both "team" and "channel" scope schemes.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">Yes</td>
    </tr>
  </table>

Fields of the Role object
~~~~~~~~~~~~~~~~~~~~~~~~~

This object is a member of the Scheme object.

.. raw:: html

  <table width="100%" border="1" cellpadding="5px" style="margin-bottom:20px;">
    <tr class="row-odd">
      <th class="head">Field name</th>
      <th class="head">Type</th>
      <th class="head">Description</th>
      <th class="head">Validated</th>
      <th class="head">Mandatory</th>
    </tr>
    <tr class="row-odd">
      <td valign="middle">name</td>
      <td valign="middle">string</td>
      <td>The scheme name.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">Yes</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">display_name</td>
      <td valign="middle">string</td>
      <td>The display name for the scheme.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">Yes</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">description</td>
      <td valign="middle">string</td>
      <td>The description of the scheme.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">permissions</td>
      <td valign="middle">array</td>
      <td>The permissions the role should grant. This is an array of strings where the strings are the names of individual permissions in the Mattermost permissions system.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">No</td>
    </tr>
  </table>

Emoji object
------------

Emoji objects represent custom Emoji. If present, Emoji objects must occur after the Version object and before any Team objects.

Example Emoji object
~~~~~~~~~~~~~~~~~~~~

For clarity, the object is shown using regular JSON formatting, but in the data file it cannot be spread across several lines. It must be all on one line.

.. code-block:: javascript

  {
  "type": "emoji",
  "emoji": {
    "name": "custom-emoji-troll",
    "image": "bulkdata/emoji/trollolol.png"
    }
  }

Fields of the Emoji object
~~~~~~~~~~~~~~~~~~~~~~~~~~

.. raw:: html

  <table width="100%" border="1" cellpadding="5px" style="margin-bottom:20px;">
    <tr class="row-odd">
      <th class="head">Field name</th>
      <th class="head">Type</th>
      <th class="head">Description</th>
      <th class="head">Validated</th>
      <th class="head">Mandatory</th>
    </tr>
    <tr class="row-odd">
      <td valign="middle">name</td>
      <td valign="middle">string</td>
      <td>The emoji name.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">Yes</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">image</td>
      <td valign="middle">string</td>
      <td>The path (either absolute or relative to the current working directory) to the image file for this emoji.</td>
      <td align="center" valign="middle">No</td>
      <td align="center" valign="middle">Yes</td>
    </tr>
  </table>

Team object
-----------

If present, Team objects must occur after the Version object and before any Channel objects.

Example Team object
~~~~~~~~~~~~~~~~~~~

For clarity, the object is shown using regular JSON formatting, but in the data file it cannot be spread across several lines. It must be all on one line.

.. code-block:: javascript

  {
  "type": "team",
  "team": {
    "name": "team-name",
    "display_name": "Team Display Name",
    "type": "O",
    "description": "The Team Description",
    "allow_open_invite": true
    }
  }

Fields of the Team object
~~~~~~~~~~~~~~~~~~~~~~~~~

.. raw:: html

  <table width="100%" border="1" cellpadding="5px" style="margin-bottom:20px;">
    <tfoot><tr><td colspan="5">[1] Not validated, but an error occurs if no such scheme exists when running in apply mode.</td></tr></tfoot>
    <tr class="row-odd">
      <th class="head">Field name</th>
      <th class="head">Type</th>
      <th class="head">Description</th>
      <th class="head">Validated</th>
      <th class="head">Mandatory</th>
    </tr>
    <tr class="row-odd">
      <td valign="middle">name</td>
      <td valign="middle">string</td>
      <td>The team name.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">Yes</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">display_name</td>
      <td valign="middle">string</td>
      <td>The display name for the team.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">Yes</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">type</td>
      <td valign="middle">string</td>
      <td>The type of team. Can have one the following values:<br>
          <kbd>O</kbd> for an open team<br>
          <kbd>I</kbd> for an invite-only team.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">Yes</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">description</td>
      <td valign="middle">string</td>
      <td>The team description.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">allow_open_invite</td>
      <td valign="middle">bool</td>
      <td>Whether to allow open invitations. Must have one of the following values:<br>
        <kbd>true</kbd><br>
        <kbd>false</kbd>
      </td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">scheme</td>
      <td valign="middle">string</td>
      <td>The name of the Scheme that should be applied to this team.</td>
      <td align="center" valign="middle">No [1]</td>
      <td align="center" valign="middle">No</td>
    </tr>
  </table>

Channel object
--------------

If present, Channel objects must occur after all Team objects and before any User objects.

Example Channel object
~~~~~~~~~~~~~~~~~~~~~~

For clarity, the object is shown using regular JSON formatting, but in the data file it cannot be spread across several lines. It must be all on one line.

.. code-block:: javascript

  {
    "type": "channel",
    "channel": {
      "team": "team-name",
      "name": "channel-name",
      "display_name": "Channel Name",
      "type": "O",
      "header": "The Channel Header",
      "purpose": "The Channel Purpose",
    }
  }

Fields of the Channel object
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. raw:: html

  <table width="100%" border="1" cellpadding="5px" style="margin-bottom:20px;">
    <tfoot><tr><td colspan="5">[1] Not validated, but an error occurs if no such team/scheme exists when running in apply mode.</td></tr></tfoot>
    <tr class="row-odd">
      <th class="head">Field name</th>
      <th class="head">Type</th>
      <th class="head">Description</th>
      <th class="head">Validated</th>
      <th class="head">Mandatory</th>
    </tr>
    <tr class="row-odd">
      <td valign="middle">team</td>
      <td valign="middle">string</td>
      <td>The name of the team this channel belongs to.</td>
      <td align="center" valign="middle">No [1]</td>
      <td align="center" valign="middle">Yes</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">name</td>
      <td valign="middle">string</td>
      <td>The name of the channel. Must start with and contain only lowercase letters <kbd>([a-z0-9])</kbd> or <kbd>-</kbd> or <kbd>_</kbd>.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">Yes</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">display_name</td>
      <td valign="middle">string</td>
      <td>The display name for the channel.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">yes</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">type</td>
      <td valign="middle">string</td>
      <td>The type of channel. Can have one the following values:<br>
          <kbd>O</kbd> for a public channel.<br>
          <kbd>P</kbd> for a private channel.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">Yes</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">header</td>
      <td valign="middle">string</td>
      <td>The channel header.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">purpose</td>
      <td valign="middle">string</td>
      <td>The channel purpose.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">scheme</td>
      <td valign="middle">string</td>
      <td>The name of the Scheme that should be applied to this team.</td>
      <td align="center" valign="middle">No [1]</td>
      <td align="center" valign="middle">No</td>
    </tr>
  </table>

User object
-----------

If present, User objects must occur after the Team and Channel objects in the file and before any Post objects.

Example User object
~~~~~~~~~~~~~~~~~~~

For clarity, the object is shown using regular JSON formatting, but in the data file it cannot be spread across several lines. It must be all on one line.

.. code-block:: javascript

  {
    "type": "user",
    "user": {
      "profile_image": "avatar.png",
      "username": "username",
      "email": "email@example.com",
      "auth_service": "",
      "auth_data": "",
      "password": "passw0rd",
      "nickname": "bobuser",
      "first_name": "Bob",
      "last_name": "User",
      "position": "Senior Developer",
      "roles": "system_user",
      "locale": "pt_BR",
      "teams": [
        {
          "name": "team-name",
          "theme": "{
              \"awayIndicator\":\"#DBBD4E\",
              \"buttonBg\":\"#23A1FF\",
              \"buttonColor\":\"#FFFFFF\",
              \"centerChannelBg\":\"#ffffff\",
              \"centerChannelColor\":\"#333333\",
              \"codeTheme\":\"github\",
              \"linkColor\":\"#2389d7\",
              \"mentionBg\":\"#2389d7\",
              \"mentionColor\":\"#ffffff\",
              \"mentionHighlightBg\":\"#fff2bb\",
              \"mentionHighlightLink\":\"#2f81b7\",
              \"newMessageSeparator\":\"#FF8800\",
              \"onlineIndicator\":\"#7DBE00\",
              \"sidebarBg\":\"#fafafa\",
              \"sidebarHeaderBg\":\"#3481B9\",
              \"sidebarHeaderTextColor\":\"#ffffff\",
              \"sidebarText\":\"#333333\",
              \"sidebarTextActiveBorder\":\"#378FD2\",
              \"sidebarTextActiveColor\":\"#111111\",
              \"sidebarTextHoverBg\":\"#e6f2fa\",
              \"sidebarUnreadText\":\"#333333\",
              }",
          "roles": "team_user team_admin",
          "channels": [
            {
              "name": "channel-name",
              "roles": "channel_user",
              "notify_props": {
                "desktop": "default",
                "mark_unread": "all"
              }
            }
          ]
        }
      ]
    }
  }

Fields of the User object
~~~~~~~~~~~~~~~~~~~~~~~~~

.. raw:: html

  <table width="100%" border="1" cellpadding="5px" style="margin-bottom:20px;">
    <tr class="row-odd">
      <th class="head">Field name</th>
      <th class="head">Type</th>
      <th class="head">Description</th>
      <th class="head">Validated</th>
      <th class="head">Mandatory</th>
    </tr>
    <tr class="row-odd">
      <td valign="middle">profile_image</td>
      <td valign="middle">string</td>
      <td>The user’s profile image. This must be an existing file path.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">username</td>
      <td valign="middle">string</td>
      <td>The user’s username. This is the unique identifier for the user.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">Yes</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">email</td>
      <td valign="middle">string</td>
      <td>The user’s email address.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">Yes</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">auth_service</td>
      <td valign="middle">string</td>
      <td>The authentication service to use for this user account. If not provided, it defaults to password-based authentication. Must be one of the following values:<br>
        <kbd>""</kbd> or not provided - password authentication.<br>
        <kbd>"gitlab"</kbd> - GitLab authentication.<br>
        <kbd>"ldap"</kbd> - LDAP authentication (Enterprise and Professional)<br>
        <kbd>"saml"</kbd> - Generic SAML based authentication (Enterprise)<br>
        <kbd>"google"</kbd> - Google OAuth authentication (Enterprise)<br>
        <kbd>"office365"</kbd> - Microsoft Office 365 OAuth Authentication (Enterprise)</td>
      <td align="center" valign="middle">No</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">auth_data</td>
      <td valign="middle">string</td>
      <td>The authentication data if <kbd>auth_service</kbd> is used. The value depends on the <kbd>auth_service</kbd> that is specified.<br>
        The data comes from the following fields for the respective auth_services:<br>
        <kbd>""</kbd> or not provided - must be omitted.<br>
        <kbd>"gitlab"</kbd> - The value of the Id attribute provided in the Gitlab auth data.<br>
        <kbd>"ldap"</kbd> - The value of the LDAP attribute specified as the "ID Attribute" in the Mattermost LDAP configuration.<br>
        <kbd>"saml"</kbd> - The value of the SAML Email address attribute.<br>
        <kbd>"google"</kbd> - The value of the OAuth Id attribute.<br>
        <kbd>"office365"</kbd> - The value of the OAuth Id attribute.</td>
      <td align="center" valign="middle">No</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">password</td>
      <td valign="middle">string</td>
      <td>A password for the user. Can be present only when password-based authentication is used. When password-based authentication is used and the password is not present, the bulk loader generates a password.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">nickname</td>
      <td valign="middle">string</td>
      <td>The user’s nickname.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">first_name</td>
      <td valign="middle">string</td>
      <td>The user’s first name.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">last_name</td>
      <td valign="middle">string</td>
      <td>The user’s last name.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">position</td>
      <td valign="middle">string</td>
      <td>The user’s position.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">roles</td>
      <td valign="middle">string</td>
      <td>The user’s roles. Must be one of the following values:<br>
        <kbd>"system_user"</kbd><br>
        <kbd>"system_admin system_user"</kbd></td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">locale</td>
      <td valign="middle">string</td>
      <td>The user’s locale. This must be a valid locale for which Mattermost has been localised.</td>
      <td align="center" valign="middle">No</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">delete_at</td>
      <td valign="middle">int64</td>
      <td>Timestamp for when the user was deactivated.</td>
      <td align="center" valign="middle">No</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">teams</td>
      <td valign="middle">array</td>
      <td>The teams which the user will be made a member of. Must be an array of <b>UserTeamMembership</b> objects.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">theme</td>
      <td valign="middle">string</td>
      <td>The user’s theme. Formatted as a Mattermost theme string.</td>
      <td align="center" valign="middle">No</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">military_time</td>
      <td valign="middle">string</td>
      <td>How times should be displayed to this user. Must be one of the following values:<br>
        <kbd>"true"</kbd> - Use 24 hour clock.<br>
        <kbd>"false"</kbd> - Use 12 hour clock.</td>
      <td align="center" valign="middle">No</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">collapse_previews</td>
      <td valign="middle">string</td>
      <td>Whether to collapse or expand link previews by default. Must be one of the following values:<br>
        <kbd>"true"</kbd> - Collapsed by default.<br>
        <kbd>"false"</kbd> - Expanded by default.</td>
      <td align="center" valign="middle">No</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">message_display</td>
      <td valign="middle">string</td>
      <td>Which style to use for displayed messages. Must be one of the following values:<br>
        <kbd>"clean"</kbd> - Use the standard style.<br>
        <kbd>"compact"</kbd> - Use the compact style.</td>
      <td align="center" valign="middle">No</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">channel_display_mode</td>
      <td valign="middle">string</td>
      <td>How to display channel messages. Must be one of the following values:<br>
        <kbd>"full"</kbd> - Use the full width of the screen.<br>
        <kbd>"centered"</kbd> - Use a fixed width, centered block.</td>
      <td align="center" valign="middle">No</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">tutorial_step</td>
      <td valign="middle">string</td>
      <td>Where to start the user tutorial. Must be one of the following values:<br>
        <kbd>"1"</kbd>, <kbd>"2"</kbd> or <kbd>"3"</kbd> - Start from the specified tutorial step.<br>
        <kbd>"999"</kbd> - Skip the user tutorial.</td>
      <td align="center" valign="middle">No</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">use_markdown_preview</td>
      <td valign="middle">bool</td>
      <td>Enable preview of message markdown formatting. Can have one the following values:<br>
          <kbd>"True"</kbd> <br>
          <kbd>"False"</kbd> </td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">Yes</td>
    <tr class="row-odd">
      <td valign="middle">use_formatting</td>
      <td valign="middle">bool</td>
      <td>Enable post formatting for links, emoji, text styles and line breaks. Can have one the following values:<br>
          <kbd>"True"</kbd> <br>
          <kbd>"False"</kbd> </td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">Yes</td>
    <tr class="row-odd">
      <td valign="middle">show_unread_section</td>
      <td valign="middle">bool</td>
      <td>Enable showing unread messages at top of channel sidebar. Can have one the following values:<br>
          <kbd>"True"</kbd> <br>
          <kbd>"False"</kbd> </td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">Yes</td>
     <tr class="row-odd">
      <td valign="middle">email_interval</td>
      <td valign="middle">string</td>
      <td>Specify an email batching interval during bulk import. Can have one of the following values:<br>
          <kbd>"immediate"</kbd> - Emails are sent immediately.  <br>
          <kbd>"fifteen"</kbd> - Emails are batched and sent every 15 minutes.<br>
          <kbd>"hour"</kbd> - Emails are batched and sent every hour.<br> </td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">Yes</td>
     </tr>
    <tr class="row-odd">
      <td valign="middle">notify_props</td>
      <td valign="middle"><b>UserNotifyProps</b> object</td>
      <td>The user’s notify preferences, as defined by the <b>UserNotifyProps</b> object.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">No</td>
    </tr>
  </table>

Fields of the UserNotifyProps object
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This object is a member of the User object.

.. raw:: html

  <table width="100%" border="1" cellpadding="5px" style="margin-bottom:20px;">
    <tfoot><tr><td colspan="5">[1] Not validated, but an error occurs if no such team exists when running in apply mode.</td></tr></tfoot>
    <tr class="row-odd">
      <th class="head">Field name</th>
      <th class="head">Type</th>
      <th class="head">Description</th>
      <th class="head">Validated</th>
      <th class="head">Mandatory</th>
    </tr>
    <tr class="row-odd">
      <td valign="middle">desktop</td>
      <td valign="middle">string</td>
      <td>Preference for sending desktop notifications. Must be one of the following values:<br>
      <kbd>"all"</kbd> - For all activity.<br>
      <kbd>"mention"</kbd> - Only for mentions.<br>
      <kbd>"none"</kbd> - Never.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">desktop_sound</td>
      <td valign="middle">string</td>
      <td>Preference for whether desktop notification sound is played. Must be one of the following values:<br>
      <kbd>"true"</kbd> - Sound is played.<br>
      <kbd>"false"</kbd> - Sound is not played.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">email</td>
      <td valign="middle">string</td>
      <td>Preference for email notifications. Must be one of the following values:<br>
      <kbd>"true"</kbd> - Email notifications are sent based on the email_interval setting <br>
      <kbd>"false"</kbd> - Email notifications are not sent.</td>
      <td align="center" valign="middle">No</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">mobile</td>
      <td valign="middle">string</td>
      <td>Preference for sending mobile push notifications. Must be one of the following values:<br>
      <kbd>"all"</kbd> - For all activity.<br>
      <kbd>"mention"</kbd> - Only for mentions.<br>
      <kbd>"none"</kbd> - Never.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">mobile_push_status</td>
      <td valign="middle">string</td>
      <td>Preference for when push notifications are triggered. Must be one of the following values:<br>
      <kbd>"online"</kbd> - When online, away or offline.<br>
      <kbd>"away"</kbd> - When away or offline.<br>
      <kbd>"offline"</kbd> - When offline.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">channel</td>
      <td valign="middle">string</td>
      <td>Whether @all, @channel and @here trigger mentions. Must be one of the following values:<br>
      <kbd>"true"</kbd> - Mentions are triggered.<br>
      <kbd>"false"</kbd> - Mentions are not triggered.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">comments</td>
      <td valign="middle">string</td>
      <td>Preference for reply mention notifications. Must be one of the following values:<br>
      <kbd>"any"</kbd> - Trigger notifications on messages in reply threads that the user starts or participates in.<br>
      <kbd>"root"</kbd> - Trigger notifications on messages in threads that the user starts.<br>
      <kbd>"never"</kbd> - Do not trigger notifications on messages in reply threads unless the user is mentioned.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">mention_keys</td>
      <td valign="middle">string</td>
      <td>Preference for custom non-case sensitive words that trigger mentions. Words must be separated by commas.</td>
      <td align="center" valign="middle">No</td>
      <td align="center" valign="middle">No</td>
    </tr>
  </table>

Fields of the UserTeamMembership object
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This object is a member of the User object.

.. raw:: html

  <table width="100%" border="1" cellpadding="5px" style="margin-bottom:20px;">
    <tfoot><tr><td colspan="5">[1] Not validated, but an error occurs if no such team exists when running in apply mode.</td></tr></tfoot>
    <tr class="row-odd">
      <th class="head">Field name</th>
      <th class="head">Type</th>
      <th class="head">Description</th>
      <th class="head">Validated</th>
      <th class="head">Mandatory</th>
    </tr>
    <tr class="row-odd">
      <td valign="middle">name</td>
      <td valign="middle">string</td>
      <td>The name of the team this user should be a member of.</td>
      <td align="center" valign="middle">No [1]</td>
      <td align="center" valign="middle">Yes</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">theme</td>
      <td valign="middle">string</td>
      <td>The user’s theme for the specified team. Formatted as a Mattermost theme string.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">roles</td>
      <td valign="middle">string</td>
      <td>The roles the user should have within this team. Must be one of the following values:<br>
          <kbd>"team_user"</kbd><br>
          <kbd>"team_admin team_user"</kbd>
      </td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">channels</td>
      <td valign="middle">array</td>
      <td>The channels within this team that the user should be made a member of. Must be an array of <b>UserChannelMembership</b> objects.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">No</td>
    </tr>
  </table>

Fields of the UserChannelMembership object
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This object is a member of the TeamMembership object.

.. raw:: html

  <table width="100%" border="1" cellpadding="5px" style="margin-bottom:20px;">
    <tfoot><tr><td colspan="5">[1] Not validated, but an error occurs if the parent channel does not exist when running in apply mode.</td></tr></tfoot>
    <tr class="row-odd">
      <th class="head">Field name</th>
      <th class="head">Type</th>
      <th class="head">Description</th>
      <th class="head">Validated</th>
      <th class="head">Mandatory</th>
    </tr>
    <tr class="row-odd">
      <td valign="middle">name</td>
      <td valign="middle">string</td>
      <td>The name of the channel in the parent team that this user should be a member of.</td>
      <td align="center" valign="middle">No [1]</td>
      <td align="center" valign="middle">Yes</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">roles</td>
      <td valign="middle">string</td>
      <td>The roles the user should have within this channel. Must be one of the following values:<br>
          <kbd>"channel_user"</kbd><br>
          <kbd>"channel_user channel_admin"</kbd>
      </td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">notify_props</td>
      <td valign="middle">object</td>
      <td>The notify preferences for this user in this channel. Must be a <b>ChannelNotifyProps</b> object</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">favorite</td>
      <td valign="middle">boolean</td>
      <td>Whether to favorite the channel. Must be one of the following values:<br>
          <kbd>"true"</kbd> - Yes.<br>
          <kbd>"false"</kbd> - No.</td>
      </td>
      <td align="center" valign="middle">No</td>
      <td align="center" valign="middle">No</td>
    </tr>
  </table>

Fields of the ChannelNotifyProps object
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This object is a member of the ChannelMembership object.

.. raw:: html

  <table width="100%" border="1" cellpadding="5px" style="margin-bottom:20px;">
    <tr class="row-odd">
      <th class="head">Field name</th>
      <th class="head">Type</th>
      <th class="head">Description</th>
      <th class="head">Validated</th>
      <th class="head">Mandatory</th>
    </tr>
    <tr class="row-odd">
      <td valign="middle">desktop</td>
      <td valign="middle">string</td>
      <td>Preference for sending desktop notifications. Must be one of the following values:<br>
      <kbd>"default"</kbd> - Global default.<br>
      <kbd>"all"</kbd> - For all activity.<br>
      <kbd>"mention"</kbd> - Only for mentions.<br>
      <kbd>"none"</kbd> - Never.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">mobile</td>
      <td valign="middle">string</td>
      <td>Preference for sending mobile notifications. Must be one of the following values:<br>
      <kbd>"default"</kbd> - Global default.<br>
      <kbd>"all"</kbd> - For all activity.<br>
      <kbd>"mention"</kbd> - Only for mentions.<br>
      <kbd>"none"</kbd> - Never.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">mark_unread</td>
      <td valign="middle">string</td>
      <td>Preference for marking channel as unread. Must be one of the following values:<br>
          <kbd>"all"</kbd> - For all unread messages.<br>
          <kbd>"mention"</kbd> - Only for mentions.
      </td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">No</td>
    </tr>
  </table>

Post object
-----------

If present, Post objects must occur after the last User object in the file, but before any DirectChannel objects.

Example Post object
~~~~~~~~~~~~~~~~~~~

For clarity, the object is shown using regular JSON formatting, but in the data file it cannot be spread across several lines. It must be all on one line.

.. code-block:: javascript

  {
    "type": "post",
    "post": {
      "team": "team-name",
      "channel": "channel-name",
      "user": "username",
      "message": "The post message",
      "props": {
        "attachments": [{
          "pretext": "This is the attachment pretext.",
          "text": "This is the attachment text."
        }]
      },
      "create_at": 140012340013,
      "flagged_by": [
        "username1",
        "username2",
        "username3"
      ],
      "replies": [{
        "user": "username4",
        "message": "The reply message",
        "create_at": 140012352049,
        "attachments": [{
            "path": "/some/valid/file/path/1"
        }],
      }, {
        "user": "username5",
        "message": "Other reply message",
        "create_at": 140012353057,
      }],
      "reactions": [{
        "user": "username6",
        "emoji_name": "+1",
        "create_at": 140012356032,
      }, {
        "user": "username7",
        "emoji_name": "heart",
        "create_at": 140012359034,
      }],
      "attachments": [{
        "path": "/some/valid/file/path/1"
      }, {
        "path": "/some/valid/file/path/2"
      }]
    }
  }


Fields of the Post object
~~~~~~~~~~~~~~~~~~~~~~~~~

.. raw:: html

  <table width="100%" border="1" cellpadding="5px" style="margin-bottom:20px;">
    <tfoot>
      <tr>
        <td colspan="5">[1] Not validated, but an error occurs if the team does not exist when running in apply mode.<br>
        [2] Not validated, but an error occurs if the channel does not exist in the corresponding team when running in apply mode.<br>
        [3] Not validated, but an error occurs if the user does not exist when running in apply mode.
        </td>
      </tr>
    </tfoot>
    <tr class="row-odd">
      <th class="head">Field name</th>
      <th class="head">Type</th>
      <th class="head">Description</th>
      <th class="head">Validated</th>
      <th class="head">Mandatory</th>
    </tr>
    <tr class="row-odd">
      <td valign="middle">team</td>
      <td valign="middle">string</td>
      <td>The name of the team that this post is in.</td>
      <td align="center" valign="middle">No [1]</td>
      <td align="center" valign="middle">Yes</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">channel</td>
      <td valign="middle">string</td>
      <td>The name of the channel that this post is in.</td>
      <td align="center" valign="middle">No [2]</td>
      <td align="center" valign="middle">Yes</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">user</td>
      <td valign="middle">string</td>
      <td>The username of the user for this post.</td>
      <td align="center" valign="middle">No [3]</td>
      <td align="center" valign="middle">Yes</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">message</td>
      <td valign="middle">string</td>
      <td>The message that the post contains.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">Yes</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">props</td>
      <td valign="middle">object</td>
      <td>The props for a post. Contains additional formatting information used by integrations and bot posts. For a more detailed explanation see the <a href="https://docs.mattermost.com/developer/message-attachments.html">message attachments documentation</a>.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">Yes</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">create_at</td>
      <td valign="middle">int</td>
      <td>The timestamp for the post, in milliseconds since the Unix epoch.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">Yes</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">flagged_by</td>
      <td valign="middle">array</td>
      <td>Must contain a list of members who have flagged the post.</td>
      <td align="center" valign="middle">No</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">replies</td>
      <td valign="middle">array</td>
      <td>The posts in reply to this post. Must be an array of <a href="#fields-of-the-reply-object">Reply</a> objects.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">reactions</td>
      <td valign="middle">array</td>
      <td>The emoji reactions to this post. Must be an array of <a href="#fields-of-the-reaction-object">Reaction</a> objects.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">attachments</td>
      <td valign="middle">array</td>
      <td>File attachments associated with this post. Must be an array of <a href="#fields-of-the-attachment-object">Attachment</a> objects.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">No</td>
    </tr>
  </table>

Fields of the Reply object
~~~~~~~~~~~~~~~~~~~~~~~~~~

This object is a member of the Post/DirectPost object.

.. raw:: html

  <table width="100%" border="1" cellpadding="5px" style="margin-bottom:20px;">
    <tr class="row-odd">
      <th class="head">Field name</th>
      <th class="head">Type</th>
      <th class="head">Description</th>
      <th class="head">Validated</th>
      <th class="head">Mandatory</th>
    </tr>
    <tr class="row-odd">
      <td valign="middle">user</td>
      <td valign="middle">string</td>
      <td>The username of the user for this reply.</td>
      <td align="center" valign="middle">No [3]</td>
      <td align="center" valign="middle">Yes</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">message</td>
      <td valign="middle">string</td>
      <td>The message that the reply contains.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">Yes</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">create_at</td>
      <td valign="middle">int</td>
      <td>The timestamp for the reply, in milliseconds since the Unix epoch.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">Yes</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">flagged_by</td>
      <td valign="middle">array</td>
      <td>Must contain a list of members who have flagged the post.</td>
      <td align="center" valign="middle">No</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">reactions</td>
      <td valign="middle">array</td>
      <td>The emoji reactions to this post. Must be an array of <a href="#fields-of-the-reaction-object">Reaction</a> objects.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">attachments</td>
      <td valign="middle">array</td>
      <td>The file attachments to this post. Must be an array of <a href="#fields-of-the-attachment-object">Attachment</a> objects.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">No</td>
    </tr>
  </table>

Fields of the Reaction object
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This object is a member of the Post/DirectPost object.

.. raw:: html

  <table width="100%" border="1" cellpadding="5px" style="margin-bottom:20px;">
    <tr class="row-odd">
      <th class="head">Field name</th>
      <th class="head">Type</th>
      <th class="head">Description</th>
      <th class="head">Validated</th>
      <th class="head">Mandatory</th>
    </tr>
    <tr class="row-odd">
      <td valign="middle">user</td>
      <td valign="middle">string</td>
      <td>The username of the user for this reply.</td>
      <td align="center" valign="middle">No [3]</td>
      <td align="center" valign="middle">Yes</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">emoji_name</td>
      <td valign="middle">string</td>
      <td>The emoji of the reaction.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">Yes</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">create_at</td>
      <td valign="middle">int</td>
      <td>The timestamp for the reply, in milliseconds since the Unix epoch.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">Yes</td>
    </tr>
  </table>

Fields of the Attachment object
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This object is a member of the Post/DirectPost object.

.. raw:: html

  <table width="100%" border="1" cellpadding="5px" style="margin-bottom:20px;">
   <tfoot>
      <tr>
        <td colspan="5">
          [1] Not validated, but an error occurs if the file path is not found or accessible when running in apply mode.
        </td>
      </tr>
    </tfoot>
    <tr class="row-odd">
      <th class="head">Field name</th>
      <th class="head">Type</th>
      <th class="head">Description</th>
      <th class="head">Validated</th>
      <th class="head">Mandatory</th>
    </tr>
    <tr class="row-odd">
      <td valign="middle">path</td>
      <td valign="middle">string</td>
      <td>The path to the file to be attached to the post.</td>
      <td align="center" valign="middle">No [1]</td>
      <td align="center" valign="middle">Yes</td>
    </tr>
  </table>

DirectChannel object
--------------------

A direct channel can have from two to eight users as members of the channel. If there are only two members, Mattermost treats it as a Direct Message channel. If there are three or more members, Mattermost treats it as a Group Message channel.

Example DirectChannel object
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

For clarity, the object is shown using regular JSON formatting, but in the data file it cannot be spread across several lines. It must be all on one line.

.. code-block:: javascript

  {
    "type": "direct_channel",
    "direct_channel": {
      "members": [
        "username1",
        "username2",
        "username3"
      ],
      "header": "The Channel Header",
      "favorited_by": [
        "username1",
        "username2",
        "username3"
      ]
    }
  }

Fields of the DirectChannel object
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. raw:: html

  <table width="100%" border="1" cellpadding="5px" style="margin-bottom:20px;">
    <tfoot>
      <tr>
        <td colspan="5">[1] Not validated, but an error occurs if one or more of the users don't exist when running in apply mode.
        </td>
      </tr>
    </tfoot>
    <tr class="row-odd">
      <th class="head">Field name</th>
      <th class="head">Type</th>
      <th class="head">Description</th>
      <th class="head">Validated</th>
      <th class="head">Mandatory</th>
    </tr>
    <tr class="row-odd">
      <td valign="middle">members</td>
      <td valign="middle">array</td>
      <td>Must contain a list of members, with a minimum of two usernames and a maximum of eight usernames.</td>
      <td align="center" valign="middle">No [1]</td>
      <td align="center" valign="middle">Yes</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">header</td>
      <td valign="middle">string</td>
      <td>The channel header.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">favorited_by</td>
      <td valign="middle">array</td>
      <td>Must contain a list of members who have favorited the channel.</td>
      <td align="center" valign="middle">No</td>
      <td align="center" valign="middle">No</td>
    </tr>
  </table>

DirectPost object
-----------------

DirectPost objects must occur after all other objects in the file.

Example DirectPost object
~~~~~~~~~~~~~~~~~~~~~~~~~

For clarity, the object is shown using regular JSON formatting, but in the data file it cannot be spread across several lines. It must be all on one line.

.. code-block:: javascript

  {
    "type": "direct_post",
    "direct_post": {
      "channel_members": [
        "username1",
        "username2",
        "username3",
      ],
      "user": "username2",
      "message": "Hello Group Channel",
      "create_at": 140012340013,
      "flagged_by": [
        "username1",
        "username2",
        "username3"
      ],
      "replies": [{
        "user": "username4",
        "message": "The reply message",
        "create_at": 140012352049,
      }, {
        "user": "username5",
        "message": "Other reply message",
        "create_at": 140012353057,
      }],
      "reactions": [{
        "user": "username6",
        "emoji_name": "+1",
        "create_at": 140012356032,
      }, {
        "user": "username7",
        "emoji_name": "heart",
        "create_at": 140012359034,
      }]
    }
  }

Fields of the DirectPost object
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. raw:: html

  <table width="100%" border="1" cellpadding="5px" style="margin-bottom:20px;">
    <tfoot>
      <tr>
        <td colspan="5">[1] Not validated, but an error occurs if no channels contain an identical list when running in apply mode.<br>[2] Not validated, but an error occurs if the user does not exist when running in apply mode.
        </td>
      </tr>
    </tfoot>
    <tr class="row-odd">
      <th class="head">Field name</th>
      <th class="head">Type</th>
      <th class="head">Description</th>
      <th class="head">Validated</th>
      <th class="head">Mandatory</th>
    </tr>
    <tr class="row-odd">
      <td valign="middle">channel_members</td>
      <td valign="middle">array</td>
      <td>Must contain a list of members, with a minimum of two usernames and a maximum of eight usernames.</td>
      <td align="center" valign="middle">No [1]</td>
      <td align="center" valign="middle">Yes</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">user</td>
      <td valign="middle">string</td>
      <td>The username of the user for this post.</td>
      <td align="center" valign="middle">No [2]</td>
      <td align="center" valign="middle">Yes</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">message</td>
      <td valign="middle">string</td>
      <td>The message that the post contains.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">Yes</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">create_at</td>
      <td valign="middle">int</td>
      <td>The timestamp for the post, in milliseconds since the Unix epoch.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">Yes</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">flagged_by</td>
      <td valign="middle">array</td>
      <td>Must contain a list of members who have flagged the post.</td>
      <td align="center" valign="middle">No</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">replies</td>
      <td valign="middle">array</td>
      <td>The posts in reply to this direct post. Must be an array of <a href="#fields-of-the-reply-object">Reply</a> objects.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">No</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">reactions</td>
      <td valign="middle">array</td>
      <td>The emoji reactions to this direct post. Must be an array of <a href="#fields-of-the-reaction-object">Reaction</a> objects.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">No</td>
    </tr>
        <tr class="row-odd">
      <td valign="middle">attachments</td>
      <td valign="middle">array</td>
      <td>The attachments to this direct post. Must be an array of <a href="#fields-of-the-attachment-object">Attachment</a> objects.</td>
      <td align="center" valign="middle">Yes</td>
      <td align="center" valign="middle">No</td>
    </tr>
  </table>

source/onboard/bulk-loading-common-issues.rst METASEP
:nosearch:
.. _bulk-loading-common-issues:

Common issues
-------------

Run the bulk import command as the *mattermost* user. Running it as *root* or any other user will cause issues with file permissions on imported attachments.

Ensure that `file attachments are enabled <https://docs.mattermost.com/configure/configuration-settings.html#allow-file-sharing>`__, that you have enough free space in your `file storage system <https://docs.mattermost.com/configure/configuration-settings.html#file-storage-system>`__ to support the incoming attachments, and that your `maximum file size <https://docs.mattermost.com/configure/configuration-settings.html#maximum-file-size>`__ is appropriate.

If you are using a Mattermost version prior to v5.17, extended `password requirements <https://docs.mattermost.com/configure/configuration-settings.html#password>`__ also need to be disabled (to remove requirements of uppercase, special characters, numbers, and the password length of 5). Any passwords that do not meet the requirements will cause the user import to fail.

Make sure you have enough free space for logs on the Mattermost server as well as free space on the database server for both the database itself and transaction logs.

Disable anti-virus or any other plugins that might interfere with attachment uploading. They could potentially block uploading of attachments and cause the import to fail if configured incorrectly. If you need anti-virus scanning, scan the attachment folder before the import.

source/onboard/bulk-loading-about.rst METASEP
:nosearch:
.. _about-bulk-loading-command:

About the bulk loading command
------------------------------

The bulk loading command is interruptible and idempotent
  If the import is interrupted for any reason, it continues from where it left off the next time you run it. You can run the command repeatedly with the same data file, and the data is imported only once. From v5.20, posts with matching timestamps to incoming posts will have their attachments replaced by the incoming data. Prior to v5.20 any updates to posts with matching timestamps were appended to older posts. 

You can run the bulk loading command on a live system
  Although you don't need to shut down Mattermost to run the command, changes made by users of the system between runs can be overwritten if the corresponding fields exist in the data file.

Some data fields are optional
  Not all fields are mandatory. If an optional field is missing from the object that is being imported, the field's current value in the database is not changed.

The bulk loading command is not a synchronization tool
  You cannot use the bulk loading command to remove any objects or their fields from the Mattermost database. The command only creates or overwrites fields.

.. important::
  The bulk loading command runs in the CLI and operates in the security context of the CLI. This means it has full permissions to access and alter everything in the Mattermost database.

source/onboard/advanced-permissions.rst METASEP
Advanced permissions
====================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Mattermost System Admins using Mattermost Cloud or Mattermost Server from v5.0 can use Advanced Permissions to customize which users can perform specific actions, such as creating teams, managing channels, and configuring webhooks. The Mattermost permission system is based on a modified RBAC (role-based access control) architecture, using roles to determine which users have the ability to perform various actions.

Two permission schemes are provided in Mattermost:

* **System Scheme**: Applies permissions universally across all teams and channels.
* **Team Override Schemes**: Allow admins to customize permissions for each team (available in Mattermost Enterprise and Professional).

This document describes the types of permissions that can be given to users of Mattermost using schemes as well as channel settings and roles. The `permissions backend documentation <https://docs.mattermost.com/onboard/advanced-permissions-backend-infrastructure.html>`__ provides additional technical details around permissions.
  
Permissions structure
----------------------

The Mattermost System Console provides a number of elements for Admins to control the permissions in their system.

System scheme
~~~~~~~~~~~~~~

You can set the default permissions granted to System Admins, Team Admins, Channel Admins, Guests (if enabled), and All Members. The permissions granted in the System Scheme apply system-wide, meaning:

- **Guests:** If Guest Accounts are enabled, permissions apply to guest users in all channels, in all teams.
- **All Members:** Permissions apply to all members, including Admins, in all channels, in all teams.
- **Channel Administrators:** Permissions apply to all Channel Admins in all channels, in all teams.
- **Team Administrators:** Permissions apply to all Team Admins, in all teams.

To override the System Scheme default permissions in a specific team, you must set up a Team Override Scheme.

You can access the System Scheme interface by going to **System Console > User Management > Permissions > System Scheme**.

.. image:: ../images/system-scheme.png

Team override scheme
~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-pro-only.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10 and E20*

On systems with multiple `Mattermost teams <https://docs.mattermost.com/welcome/about-teams.html#create-a-team>`__, each team may operate and collaborate in a unique way. Team Override Schemes give Admins the flexibility to tailor permissions to the needs of each team.

When you use this permission scheme:

- The permissions granted in a Team Override Scheme apply only in the teams which are assigned to the scheme.
- The System Scheme does not apply to teams that are added to a Team Override Scheme.
- Teams can only belong to one Team Override Scheme.

You can access the Team Override Scheme interface by going to **System Console > User Management > Permissions > Team Override Schemes**.

.. image:: ../images/team-scheme.png

Channel permissions 
--------------------

The channel permissions interface is accessed in **System Console > User Management > Channels**.

Channel Moderation
~~~~~~~~~~~~~~~~~~~

This content has moved to `Team and Channel Management <https://docs.mattermost.com/manage/team-channel-members.html>`__.

Supplementary Roles
~~~~~~~~~~~~~~~~~~~~

*Available in a future release of Mattermost Enterprise*

Allows Admins to grant additional permissions to specific users or to a group of users based on AD/LDAP group membership. Permissions can be granted within the scope of channels, teams, or system level.

Recipes
-------

This section provides some examples of common permissions use cases for team management, channel management, and overall permissions. 

Team management
~~~~~~~~~~~~~~~~

**Only allow Admins, in a specific team, to add members**

Example: In Team A, only allow Team and System Admins to add new team members. As the default for all other teams, allow all users to add and invite new members.

1. Go to **System Console > User Management > Permissions**.
2. Select **Edit Scheme**.
3. In the **All Members > Teams** panel, check the box for **Add Team Members**. This sets the system default for all teams.
4. Select **Save**.
5. Select the back arrow to return to the **Permission Schemes** menu.
6. Select **New Team Override Scheme**.

  a. Name and describe the scheme. For example, ``Authorized Personnel Only`` with description ``Restrict adding team members to Team and System Admins.``
  b. Select **Add Teams** to add Team B to the **Select teams to override permissions** list, locate Team B, then select **Add**.
  c. In the **All Members** panel, uncheck the box for **Add Team Members**.
  d. In the **Team Administrators** panel, check the box for **Add Team Members**.

7. Select **Save**.
8. Select the back arrow to return to the **Permission Schemes** menu.

Public and private channel management
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

**Restrict who can rename channels and edit channel header and purposes**

Example: As the default for the entire system, restrict renaming channels and editing headers and purposes to Admins only.

1. Go to **System Console > User Management > Permissions**.
2. Select **Edit Scheme**.
3. In the **All Members** panel, uncheck the box for **Manage Public Channels > Manage Channel Settings**.

The **Manage Channel Settings** option is now only available to **Channel Administrators**, **Team Administrators**, and **System Administrators**.

.. note::

  Permissions for channel renaming, editing channel header, and editing channel purpose are currently grouped in a single permission. These will be split into separate permissions in a future release.

**Restrict who can create channels, in specific teams**

Example: In Team C, restrict public channel creation to Admins. As the default for all other teams, allow everyone to create public channels.

1. Go to **System Console > User Management > Permissions**.
2. Select **Edit Scheme**.
3. In the **All Members** panel, in the **Manage Public Channels** menu, check the box for **Create Channels**. This sets the system default to allow creation of public channels on all teams.
4. Select **Save**.
5. Select the arrow to return to the **Permission Schemes** interface.
6. Select **New Team Override Scheme**.

  a. Name and describe the scheme. For example, ``Contractor Scheme`` with description ``Restrict public channel creation to Admins only``.
  b. Select **Add Teams** to add Team B to the **Select teams to override permissions** list, locate Team B, then select **Add**.
  c. In the **All Members** panel, in the **Manage Public Channels** section, uncheck the box for **Create Channels**.
  d. In the **Team Administrators** panel, in the **Manage Public Channels** section, check the box for **Create Channels**.
  
Convert public channels to private channels
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

**Allow all members to convert public channels to private channels**

Example: Set the default setting to allow all members, Team Admins, and Channel Admins to convert public channels to private.

1. Go to **System Console > User Management > Permissions**.
2. Select **Edit Scheme**.
3. In the **All Members** panel, uncheck the box for **Manage Public Channels > Convert Channels**.

This permission is applied to all other roles (excluding the Guest role). When this permission is not enabled for All Members, it must be manually applied to Team Admins and Channel Admins if required.

Read only channels
~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-only.rst
  :start-after: :nosearch:

**Configure a channel so that members can post/reply/react but guests can only read and react.**

1. Go to **System Console > User Management > Channels**.
2. Select **Edit** next to the name of the channel you want to configure.
3. In the **Create Posts** panel, uncheck **Guests**.
4. In the **Post Reactions** panel, uncheck **Guests** if required.
5. Select **Save**.

The channel is available for all members and guests to access, but guests can only read messages and react to them.

**Create an announcement channel where only channel admins are able to post.**

1. Create a new channel (either Public or Private).
2. Navigate to **System Console > User Management > Channels**.
3. Select **Edit** next to the name of the channel you just created (you may need to search for it).
4. In the **Create Posts** panel, uncheck **Guests** and **Members**.
5. In the **Post Reactions** panel, uncheck **Guests** and **Members**.
6. Select **Save**.

The channel is available for all members and guests to access but only admins can post.

Post management
~~~~~~~~~~~~~~~

**Restrict who can delete posts.**

Example: As the default for the entire system, restrict deleting posts to only Team and System Admins.

1. Go to **System Console > User Management > Permissions**.
2. Select **Edit Scheme**.
3. In the **All Members** and **Channel Admininistrators** panels, in the **Delete Posts** section, uncheck the boxes for **Delete Own Posts** and **Delete Others' Posts**.
4. In the **Channel Administrators** and **Team Administrators** panels, in the **Delete Posts** section, check the boxes for **Delete Own Posts** and **Delete Others' Posts**.

**Restrict who can edit posts.**

Example: As the default for the entire system, only allow users to edit their own posts for five minutes after posting.

1. Go to **System Console > User Management > Permissions**.
2. Select **Edit Scheme**.
3. In the **All Members**, **Channel Administrators**, and **Team Administrators** panels, in the **Manage Posts** section, check the box for **Edit Posts**.
4. From any panel, select the gear button to set the global time limit to ``300`` seconds.

Integration management
~~~~~~~~~~~~~~~~~~~~~~

**Restrict managing webhooks and slash commands.**

Example: As the default for the entire system, only allow System Admins to create, edit and delete integrations.

1. Go to **System Console > User Management > Permissions**.
2. Select **Edit Scheme**.
3. In the **All Members** and **Team Administrators** panels, in the **Integrations & Customizations** section, uncheck the boxes for **Manage Incoming Webhooks**, **Manage Outgoing Webhooks**, and **Manage Slash Commands**.

.. note::

  Permissions for creating, editing, and deleting integrations are currently grouped for each integration type. These will be split into separate permissions in a future release.

Administration tools
--------------------

There are a number of CLI and mmctl tools available for Admins to help in configuring and troubleshooting the permissions system:

1. Reset all permissions to the default on new installations using the `CLI <https://docs.mattermost.com/manage/command-line-tools.html#mattermost-permissions-reset>`__, or using the `mmctl <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-permissions-reset>`__.
2. `Export permission schemes <https://docs.mattermost.com/manage/command-line-tools.html#mattermost-permissions-export>`__: Exports the System Scheme and any Team Override Schemes to a ``jsonl`` file.
3. `Import permission schemes <https://docs.mattermost.com/manage/command-line-tools.html#mattermost-permissions-import>`__: Imports the System Scheme and any Team Override Schemes to your Mattermost instance from a ``jsonl`` input file in the format outputted by ``mattermost permissions export``.

Backend infrastructure
----------------------

Technical admins or developers looking for a deeper understanding of the permissions backend can refer to our `permissions backend documentation <https://docs.mattermost.com/onboard/advanced-permissions-backend-infrastructure.html>`__.

Glossary
--------

- **Permission:** The ability to execute certain actions. Permissions are granted to roles.
- **Roles:** A set of permissions. Users or groups are assigned to roles.
- **Group:** A set of users, usually synced from AD/LDAP. Groups are assigned to roles in the context of teams, channels, or system-wide.
- **Default Roles:** All Members, Guests (if enabled), Channel Admins, Team Admins, System Admins.
- **System Scheme:** A set of default roles that apply system-wide.
- **Team Override Scheme:** A set of default roles that apply only in the team specified. Permissions granted to roles in a team scheme override roles in the system scheme.
- **System-wide:** Applies across the entire system, including all teams of which the user is a member.
- **Team-wide:** Applies in a specific team only.

source/onboard/advanced-permissions-backend-infrastructure.rst METASEP
Advanced permissions: backend infrastructure
=============================================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

This document outlines the backend server infrastructure for permissions in Mattermost and is recommended only for technical Admins or developers looking to make modifications to their installation.

.. note::

  The contents of this document apply from Mattermost Server v5.0. 

.. contents::
  :backlinks: top
  :local:
  
Entity definitions
------------------

Permissions
~~~~~~~~~~~~

A **permission** describes a permitted action which may be carried out on an object. It describes the action that users may perform in the context in which they have been assigned the role granting the permission.

Roles
~~~~~~

A **role** is something to which permissions are granted, that is then assigned to users in contexts in order to grant them the assigned permissions in that context. One user may end up with different sets of permissions granted by different roles in different contexts.

Scope
~~~~~~

Permissions live within a given scope. There are three scopes in the Mattermost system: System, Team and Channel. Permissions cascade down the scopes from the context in which they are applied. For example, if a “Channel” scoped permission is applied to a “Team” context, the permission applies to any channels within that team. A permission is considered,

- **System scope** if it makes sense only on the system level. For example, ``manage_oauth``.
- **Team scope** if it makes sense at the team level and system level. For example, ``create_public_channel``.
- **Channel scope** if it makes sense at channel, team and system level. For example, ``manage_public_channel_properties``.

Context
~~~~~~~~

A **context** is an instance of a scope. For example, a channel called "Developers Hangout" is an instance of channel scope. Contexts have hierarchical relationships between them that reflect the hierarchical ordering of scopes. Each context has one parent, and may have multiple children, with the ultimate parent context being the system context:

- A channel context has a parent team context, whose parent is the system context. For example, the "Developers Hangout" channel is the channel context, with parent team context "Contributors Team", with parent system context.
- A team context has a parent system context and child channel contexts. For example, the "Contributors Team" is the team context, with parent system context, and with children channel contexts such as "Developers Hangout", "Reception" and "Marketing".

When determining whether a user is allowed to carry out a given action in a given context, the union of the permissions of all roles that user has been assigned in the current context and its parent contexts is calculated. This enables permissions to cascade down the scope hierarchy. For example, if a users is granted the ``manage_public_channel_properties`` permission in a role in the system context, then the user has permissions to manage public channel properties in all channels, in all teams, of which they are a member.

Schemes
~~~~~~~

Schemes describe the default roles applied to users in a context, and all child contexts. Schemes are either defined specifically for a context, or if they are not specified, the relevant parts of the parent context’s scheme are applied, ultimately climbing the hierarchy to the System Scheme, which serves the purpose of providing the system-wide defaults. For example, if Team A does not have a team-scoped scheme defined, the System Scheme will provide the defaults for all contexts in Team A.

Additionally, the lowest-scoped scheme always takes precedence in the context. For example, if Team B has a team-scoped scheme, that scheme takes precedence over the System Scheme defaults for all contexts in Team B. 

Data structure
--------------

Permissions
~~~~~~~~~~~~

Permissions in Mattermost are a property of the server code base and are not created or modified dynamically. The current set of permissions are as described in the table below.

**Mattermost permissions**

+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Name (i18n)                                  | Scope   | Description                                                                                                                                                                                           |
+==============================================+=========+=======================================================================================================================================================================================================+
| invite_user                                  | team    | Invite users to the team using Send Email Invite or Get Team Invite Link.                                                                                                                             |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| add_user_to_team                             | team    | Add existing server users to the current team.                                                                                                                                                        |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| use_slash_commands                           | channel | Use slash commands.                                                                                                                                                                                   |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| manage_slash_commands                        | system  | Create, edit, and delete your own slash commands.                                                                                                                                                     |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| manage_others_slash_commands                 | system  | Edit or delete other users' slash commands.                                                                                                                                                           |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| create_public_channel                        | team    | Create public channels.                                                                                                                                                                               |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| create_private_channel                       | team    | Create private channels.                                                                                                                                                                              |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| manage_public_channel_members                | channel | Manage public channel members.                                                                                                                                                                        |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| manage_private_channel_members               | channel | Manage private channel members.                                                                                                                                                                       |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| assign_system_admin_role                     | system  | Grant other users the System Admin role.                                                                                                                                                              |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| manage_roles                                 | system  | Manage other users' system-wide roles.                                                                                                                                                                |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| manage_team_roles                            | team    | Add and remove team members.                                                                                                                                                                          |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| manage_channel_roles                         | channel | Add and remove channel members.                                                                                                                                                                       |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| manage_system                                | system  | Access to System Console.                                                                                                                                                                             |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| sysconsole_read_usermanagement_system_roles  | system  | View system roles.                                                                                                                                                                                    |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| sysconsole_write_usermanagement_system_roles | system  | Add, remove, and assign system roles.                                                                                                                                                                 |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| create_direct_channel                        | system  | Open Direct Message channels.                                                                                                                                                                         |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| create_group_channel                         | system  | Open Group Message channels.                                                                                                                                                                          |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| manage_public_channel_properties             | channel | Edit public channel name, header, and purpose.                                                                                                                                                        |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| manage_private_channel_properties            | channel | Edit private channel name, header, and purpose.                                                                                                                                                       |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| list_public_teams                            | system  | View public teams listed in the "Join Another Team" menu accessed from the main menu.                                                                                                                 |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| join_public_teams                            | system  | Join public teams listed in the "Join Another Team" menu accessed from the main menu.                                                                                                                 |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| list_private_teams                           | system  | View private teams listed in the "Join Another Team" menu accessed from the main menu.                                                                                                                |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| join_private_teams                           | system  | Join private teams listed in the "Join Another Team" menu accessed from the main menu.                                                                                                                |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| list_team_channels                           | team    | List public channels in a team.                                                                                                                                                                       |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| join_public_channels                         | team    | Join public channels.                                                                                                                                                                                 |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| delete_public_channel                        | channel | Archive public channels.                                                                                                                                                                              |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| delete_private_channel                       | channel | Archive private channels.                                                                                                                                                                             |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| edit_other_users                             | system  | Edit values on the `user` object of other users.                                                                                                                                                      |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| read_channel                                 | channel | View posts in a channel.                                                                                                                                                                              |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| read_public_channel                          | team    | View and access public channels on a team.                                                                                                                                                            |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| add_reaction                                 | channel | Add emoji reactions to posts.                                                                                                                                                                         |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| remove_reaction                              | channel | Remove emoji reactions from posts.                                                                                                                                                                    |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| remove_others_reactions                      | channel | Remove other users emoji reactions from posts.                                                                                                                                                        |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| permanent_delete_user (deprecated)           | system  | Permanently delete other users.                                                                                                                                                                       |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| upload_file                                  | channel | Upload file attachments to posts.                                                                                                                                                                     |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| get_public_link                              | system  | Get permalink for posts.                                                                                                                                                                              |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| manage_incoming_webhooks                     | team    | Create, edit, and delete your own incoming webhooks.                                                                                                                                                  |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| manage_outgoing_webhooks                     | team    | Create, edit, and delete your own outgoing webhooks.                                                                                                                                                  |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| manage_others_webhooks(deprecated)           | team    | Edit and delete other users' incoming or outgoing webhooks.                                                                                                                                           |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| manage_others_incoming_webhooks              | team    | Edit and delete other users' incoming webhooks.                                                                                                                                                       |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| manage_others_outgoing_webhooks              | team    | Edit and delete other users' outgoing webhooks.                                                                                                                                                       |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| manage_oauth                                 | system  | Create, edit, and delete your own OAuth 2.0 apps.                                                                                                                                                     |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| manage_system_wide_oauth                     | system  | Edit or delete other users' OAuth 2.0 apps.                                                                                                                                                           |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| create_post                                  | channel | Post in channels.                                                                                                                                                                                     |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| create_post_public                           | channel | Create a system message within a channel.                                                                                                                                                             |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| create_post_ephermal                         | channel | Create an ephemeral message within a channel.                                                                                                                                                         |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| edit_post                                    | channel | Authors edit their own posts. Edit post time limit is controlled by the ``"PostEditTimeLimit"`` `config <https://docs.mattermost.com/configure/configuration-settings.html#post-edit-time-limit>`__.  |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| edit_others_posts                            | channel | Edit other users' posts.                                                                                                                                                                              |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| delete_post                                  | channel | Authors delete their own posts.                                                                                                                                                                       |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| delete_others_posts                          | channel | Delete other users' posts.                                                                                                                                                                            |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| remove_user_from_team                        | team    | Remove users from team.                                                                                                                                                                               |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| create_team                                  | system  | Create teams.                                                                                                                                                                                         |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| manage_team                                  | team    | Access Team Settings.                                                                                                                                                                                 |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| import_team                                  | system  | Import teams in Team Settings.                                                                                                                                                                        |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| view_team                                    | team    | Read the Team object.                                                                                                                                                                                 |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| create_bot                                   | team    | Create bot accounts.                                                                                                                                                                                  |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| assign_bot                                   | team    | Assign bots to users other than who created the bot.                                                                                                                                                  |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| read_bot                                     | team    | View own bots created.                                                                                                                                                                                |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| read_others_bots                             | team    | View bots created by others.                                                                                                                                                                          |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| manage_bots                                  | team    | Edit and delete own bots.                                                                                                                                                                             |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| manage_others_bots                           | team    | Edit and delete bots created by others.                                                                                                                                                               |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| view_members                                 | team    | List all members on the team.                                                                                                                                                                         |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| list_users_without_team                      | system  | List users without a team.                                                                                                                                                                            |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| create_user_access_token                     | system  | Create user access tokens.                                                                                                                                                                            |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| read_user_access_token                       | system  | Read user access tokens by ID.                                                                                                                                                                        |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| revoke_user_access_token                     | system  | Revoke user access tokens.                                                                                                                                                                            |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| manage_jobs                                  | system  | Create and cancel jobs.                                                                                                                                                                               |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| create_emojis                                | team    | Create custom emoji.                                                                                                                                                                                  |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| delete_emojis                                | team    | Delete own custom emoji.                                                                                                                                                                              |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| delete_others_emojis                         | team    | Delete custom emoji created by others.                                                                                                                                                                |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| invite_guest                                 | system  | Invite guest users via email invite or add existing guests to teams.                                                                                                                                  |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| promote_guest                                | system  | Promote guests to member users.                                                                                                                                                                       |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| demote_to_guest                              | system  | Demote member users to guests.                                                                                                                                                                        |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| manage_remote_clusters                       | system  | Add, remove, and view remote clusters for shared channels.                                                                                                                                            |
+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

``Roles`` field
~~~~~~~~~~~~~~~~

Roles are applied to objects that represents that user’s membership in a context. These are referenced in the ``Roles`` field of the ``User``, ``TeamMember``, ``ChannelMember`` and ``Schemes`` Tables.

In the ``TeamMember`` and ``ChannelMember`` tables, it's the ``Roles`` field that contains custom roles and the ``SchemeAdmin`` and ``SchemeUser`` booleans that indicate the member object should inherit the respective roles from the relevant scheme, either the default or custom scheme assigned to the relevant team.

``Roles`` table
~~~~~~~~~~~~~~~~

Roles are dynamic and user configurable, necessitating a database table with the following fields:

- ``Id`` (Autoincrement, Primary Key)
- ``Name`` (Unique String with Character Constraints, e.g. “team_user”).
- ``Display Name`` (String)
- ``Description`` (String)
- ``Permissions`` (String): Space-separated permissions names
- ``Scheme Managed`` (bool): Indicates whether this role is managed as part of a scheme.
- ``BuiltIn`` (bool): Indicates if this role is built-in to the Mattermost system and not removable by the user.

Built-in roles
~~~~~~~~~~~~~~

The System Scheme is built-in to the product, and its roles are defined as ``BuiltIn: true`` in the ``Roles`` table. You can use the Mattermost API to `retrieve a list of permissions by role name <https://api.mattermost.com/#tag/roles/paths/~1roles~1names/post>`__. 

The following built-in roles and associated permissions are available:

*channel_admin*

- manage_private_channel_members
- read_public_channel_groups
- use_channel_mentions
- create_post
- use_group_mentions
- add_reaction
- read_private_channel_groups
- remove_reaction
- manage_public_channel_members
- manage_channel_roles

*channel_guest*

- use_slash_commands
- read_channel
- add_reaction
- remove_reaction
- upload_file
- edit_post
- create_post
- use_channel_mentions

*channel_user*

- manage_public_channel_properties
- use_group_mentions
- add_reaction
- delete_private_channel
- manage_private_channel_members
- read_private_channel_groups
- delete_public_channel
- read_public_channel_groups
- use_channel_mentions
- read_channel
- delete_post
- get_public_link
- remove_reaction
- manage_public_channel_members
- use_slash_commands
- upload_file
- manage_private_channel_properties
- create_post
- edit_post

*system_admin*

- manage_others_slash_commands
- sysconsole_write_user_management_permissions
- edit_brand
- remove_reaction
- manage_incoming_webhooks
- sysconsole_write_user_management_groups
- create_public_channel
- manage_private_channel_members
- sysconsole_write_authentication
- join_private_teams
- create_post_ephemeral
- list_users_without_team
- sysconsole_write_reporting
- join_public_channels
- invite_guest
- list_private_teams
- sysconsole_write_user_management_channels
- manage_others_bots
- read_user_access_token
- add_user_to_team
- view_members
- edit_post
- demote_to_guest
- delete_others_posts
- sysconsole_write_plugins
- delete_private_channel
- sysconsole_read_user_management_system_roles
- sysconsole_read_user_management_users
- revoke_user_access_token
- read_others_bots
- read_public_channel_groups
- sysconsole_write_user_management_teams
- sysconsole_write_billing
- convert_public_channel_to_private
- remove_user_from_team
- manage_team
- add_reaction
- manage_oauth
- list_team_channels
- create_team
- read_jobs
- invite_user
- manage_shared_channels
- remove_others_reactions
- manage_remote_clusters
- sysconsole_write_user_management_users
- sysconsole_read_experimental
- sysconsole_write_compliance
- edit_others_posts
- assign_bot
- manage_bots
- manage_others_outgoing_webhooks
- manage_system_wide_oauth
- delete_others_emojis
- manage_others_incoming_webhooks
- promote_guest
- sysconsole_write_experimental
- sysconsole_read_plugins
- create_group_channel
- sysconsole_read_environment
- manage_roles
- use_channel_mentions
- manage_public_channel_properties
- manage_channel_roles
- get_public_link
- sysconsole_read_billing
- sysconsole_write_integrations
- download_compliance_export_result
- manage_slash_commands
- assign_system_admin_role
- create_post
- delete_post
- create_direct_channel
- list_public_teams
- create_post_public
- read_private_channel_groups
- sysconsole_read_integrations
- read_other_users_teams
- manage_jobs
- sysconsole_read_site
- manage_outgoing_webhooks
- sysconsole_write_environment
- manage_system
- sysconsole_read_user_management_permissions
- manage_public_channel_members
- sysconsole_write_about
- import_team
- sysconsole_write_user_management_system_roles
- sysconsole_read_reporting
- upload_file
- read_channel
- sysconsole_read_user_management_teams
- delete_emojis
- manage_private_channel_properties
- view_team
- sysconsole_read_user_management_groups
- create_private_channel
- create_bot
- join_public_teams
- delete_public_channel
- read_public_channel
- sysconsole_read_about
- use_slash_commands
- read_bots
- sysconsole_read_authentication
- edit_other_users
- sysconsole_read_user_management_channels
- convert_private_channel_to_public
- use_group_mentions
- create_user_access_token
- sysconsole_write_site
- manage_team_roles
- sysconsole_read_compliance
- create_emojis

*system_custom_group_admin*

- create
- edit
- delete
- manage members

*system_guest*

- create_group_channel
- create_direct_channel

*system_manager*

- sysconsole_write_user_management_permissions
- sysconsole_read_about
- sysconsole_read_user_management_channels
- join_private_teams
- delete_private_channel
- view_team
- read_jobs
- sysconsole_read_user_management_teams
- sysconsole_read_plugins
- manage_channel_roles
- manage_public_channel_members
- remove_user_from_team
- sysconsole_read_environment
- list_private_teams
- manage_private_channel_members
- manage_private_channel_properties
- edit_brand
- add_user_to_team
- convert_public_channel_to_private
- read_private_channel_groups
- sysconsole_write_environment
- manage_jobs
- sysconsole_read_reporting
- read_public_channel
- manage_team
- read_channel
- convert_private_channel_to_public
- sysconsole_read_integration
- read_public_channel_groups
- list_public_teams
- manage_team_roles
- sysconsole_read_user_management_groups
- manage_public_channel_properties
- sysconsole_write_user_management_groups
- sysconsole_read_user_management_permissions
- sysconsole_write_site
- sysconsole_read_site
- sysconsole_write_user_management_channels
- sysconsole_write_integrations
- delete_public_channel
- sysconsole_write_user_management_teams
- join_public_teams

*system_post_all*

- create_post
- use_channel_mentions
- use_group_mentions

*system_post_all_public*

- create_post_public
- use_group_mentions
- use_channel_mentions

*system_read_only_admin*

- sysconsole_read_compliance
- read_other_users_teams
- sysconsole_read_reporting
- list_private_teams
- sysconsole_read_experimental
- read_jobs
- read_public_channel
- view_team
- sysconsole_read_user_management_users
- sysconsole_read_plugins
- sysconsole_read_user_management_teams
- read_public_channel_groups
- sysconsole_read_user_management_channels
- sysconsole_read_user_management_permissions
- sysconsole_read_about
- download_compliance_export_result
- read_channel
- sysconsole_read_authentication
- sysconsole_read_site
- list_public_teams
- sysconsole_read_integrations
- read_private_channel_groups
- sysconsole_read_environment
- sysconsole_read_user_management_groups

*system_user*

- list_public_teams
- join_public_teams
- create_direct_channel
- create_group_channel
- view_members
- create_team
- create_emojis
- delete_emojis

*system_user_access_token*

- create_user_access_token
- read_user_access_token
- revoke_user_access_token

*system_user_manager*

- manage_public_channel_members
- sysconsole_write_user_management_groups
- manage_private_channel_properties
- read_channel
- sysconsole_read_authentication
- manage_private_channel_members
- read_jobs
- view_team
- sysconsole_read_user_management_groups
- list_private_teams
- join_public_teams
- manage_team
- list_public_teams
- add_user_to_team
- sysconsole_read_user_management_channels
- sysconsole_write_user_management_teams
- read_public_channel
- sysconsole_read_user_management_permissions
- manage_public_channel_properties
- join_private_teams
- convert_public_channel_to_private
- manage_channel_roles
- sysconsole_read_user_management_teams
- convert_private_channel_to_public
- read_public_channel_groups
- delete_public_channel
- remove_user_from_team
- manage_team_roles
- delete_private_channel
- sysconsole_write_user_management_channels
- read_private_channel_groups

*team_admin*

- remove_user_from_team
- manage_others_slash_commands
- manage_team_roles
- manage_public_channel_members
- use_group_mentions
- manage_others_outgoing_webhooks
- manage_slash_commands
- manage_team
- manage_others_incoming_webhooks
- manage_channel_roles
- read_public_channel_groups
- convert_private_channel_to_public
- remove_reaction
- delete_post
- manage_outgoing_webhooks
- use_channel_mentions
- manage_incoming_webhooks
- delete_others_posts
- read_private_channel_groups
- create_post
- manage_private_channel_members
- convert_public_channel_to_private
- add_reaction
- import_team

*team_guest*

- view_team

*team_post_all*

- create_post
- use_group_mentions
- use_channel_mentions

*team_post_all_public*

- use_group_mentions
- create_post_public
- use_channel_mentions

*team_user*

- invite_user
- add_user_to_team
- list_team_channels
- join_public_channels
- read_public_channel
- view_team
- create_public_channel
- create_private_channel

``Schemes`` table
~~~~~~~~~~~~~~~~~~

Schemes are dynamic and user configurable, necessitating a database table with the following fields:

- ``Id`` (Autoincrement, Primary Key)
- ``Name`` (Unique String with Character Constraints, e.g. “corporate_scheme”)
- ``Display`` Name
- ``Description`` (String)
- ``Scope`` (String): Team or Channel
- ``Team Admin Role`` (String): Empty if Channel Scope
- ``Team User Role`` (String): Empty if Channel Scope
- ``Team Guest Role`` (String): Empty if Channel Scope
- ``Channel Admin Role`` (String): Always provided
- ``Channel User Role`` (String): Always provided
- ``Channel Guest Role`` (String): Always provided

source/onboard/ad-ldap.rst METASEP
Active directory/LDAP setup
===========================

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

Overview
--------

Active Directory (AD) is a service that stores authentication and authorization details of users on your organization's network. When you integrate your AD/LDAP system with Mattermost, users can log into Mattermost without having to create new credentials. User accounts are managed in AD/LDAP, and changes are synced with Mattermost.

Benefits of integrating AD/LDAP with Mattermost include:

- **Single sign-on.** Users can log in to Mattermost with their AD/LDAP credentials.
- **Centralized identity management.** Mattermost accounts can display user information from AD/LDAP, such as first and last name, email, and username.
- **Automatic account provisioning.** A Mattermost user account is automatically created the first time a user signs in with their AD/LDAP credentials.
- **Sync groups to predefined roles in Mattermost.** Assign team and channel roles to groups via LDAP Group Sync.
- **Compliance alignment with administrator management.** Manage Administrator access to Mattermost in the System Console using LDAP filters.

Pre-installation notes
-----------------------

If you're using Active Directory with **nested security groups** you need to write a PowerShell script, or similar, to flatten and aggregate the tree into a single security group to map into Mattermost.

Getting started
----------------

There are two ways to set up AD/LDAP:

1. **Configure AD/LDAP using the System Console user interface**
     - Log in to your workspace and create a new account using email and password. This is assigned the System Admin role as the first user created.
     - Next, configure AD/LDAP and then convert your System Admin account to use the AD/LDAP login method.

2. **Configure AD/LDAP by editing ``config.json``**
     - Edit ``config.json`` to enable AD/LDAP based on the `AD/LDAP settings documentation <https://docs.mattermost.com/configure/configuration-settings.html#ad-ldap>`__. When you log in to Mattermost the first user to log in with valid AD/LDAP credentials will be assigned the System Admin role.

Configure AD/LDAP login
--------------------------

1. **Create a System Admin account using email authentication.**
     - Create a new workspace and create an account using email and password, which is automatically assigned the **System Administrator** role since it is the first account created. You may also assign the role to another account.

2. **Configure AD/LDAP.**
     - Go to **System Console > Authentication > AD/LDAP** and fill in AD/LDAP settings based on the `configuration settings documentation <https://docs.mattermost.com/configure/configuration-settings.html#ad-ldap>`__.

3. **Confirm that AD/LDAP sign-on is enabled.**
     - After AD/LDAP has been enabled, confirm that users can log in using AD/LDAP credentials.

4. **Switch your System Admin account from email to AD/LDAP authentication.**
     - Navigate to **Settings > Security > Sign-in Method > Switch to AD/LDAP** and log in with your AD/LDAP credentials to complete the switch.

5. **(Optional) Restrict authentication to AD/LDAP.**
     - Go to **System Console > Authentication > Email** and set **Enable sign-in with email** to **false** and **Enable sign-in with username** to **false**.
     - Then choose **Save** to save the changes. This should leave Active Directory/LDAP as the only login option.

6. **(Optional) If you configured `First Name Attribute` and `Last Name Attribute` in the System Console.**
     - Navigate to **System Console > Site Configuration > Users and Teams** and set **Teammate Name Display** to **Show first and last name**. This is recommended for a better user experience.

.. note::

   If you've made a mistake and lock yourself out of the system somehow, you can `set an existing account to System Administrator using the command line tool <https://docs.mattermost.com/getting-started/admin-onboarding-tasks.html#common-tasks>`__.

Configure AD/LDAP synchronization
----------------------------------

In addition to configuring AD/LDAP sign-in, you can also configure AD/LDAP synchronization. When synchronizing, Mattermost queries AD/LDAP for relevant account information and updates Mattermost accounts based on changes to attributes (first name, last name, and nickname). When accounts are disabled in AD/LDAP users are made inactive in Mattermost, and their active sessions are revoked once Mattermost synchronizes the updated attributes.

The AD/LDAP synchronization depends on email. Make sure all users on your AD/LDAP server have an email address, or ensure their account is deactivated in Mattermost.

When Mattermost is configured to use LDAP for user authentication, the following user attribute changes can't be made through the API: first name, last name, position, nickname, email, profile image, or username. LDAP must be the authoritative source for these user attributes.

To configure AD/LDAP synchronization with AD/LDAP sign-in:

1. Go to **System Console > Authentication > AD/LDAP** and set **Enable Synchronization with AD/LDAP** to **true**.

2. Scroll down to **Synchronization Interval (minutes)** to specify how often Mattermost accounts synchronize attributes with AD/LDAP. The default setting is 60 minutes. The profile picture attribute is only synchronized when the user logs in.
     - If you want to synchronize immediately after disabling an account, use the **AD/LDAP Synchronize Now** button in **System Console > AD/LDAP**.
     - To configure AD/LDAP synchronization with SAML sign-in, see the `SAML documentation <https://docs.mattermost.com/onboard/ad-ldap.html>`__.

.. note::
   Make sure that at least one LDAP user is in Mattermost or the sync will not complete.

Configure AD/LDAP sign-in using filters
----------------------------------------

Using filters assigns roles to specified users on login. To access AD/LDAP filter settings navigate to **System Console > AD/LDAP**.

User filter
~~~~~~~~~~~

(Optional) Enter an AD/LDAP filter to use when searching for user objects. Only the users selected by the query will be able to access Mattermost. For Active Directory, the query to filter out disabled users is ``(&(objectCategory=Person)(!(UserAccountControl:1.2.840.113556.1.4.803:=2)))``.

1. Navigate to **System Console > Authentication > AD/LDAP**.
2. Complete the **User Filter** field.
3. Choose **Save**.

When the user accesses Mattermost, they log in with same username and password that they use for organizational logins.

Filters can also be used for excluding users who belong to certain groups. For Active Directory, the query to filter out groups is ``(&(memberof=cn=ACME_ALL,ou=Users,dc=sademo,dc=com)(!(memberof=cn=DEV_OPS,ou=Users,dc=sademo,dc=com)))``.

Guest filter
~~~~~~~~~~~~

(Optional) When enabled, the Guest Filter in Mattermost identifies external users whose AD/LDAP role is guest and who are invited to join your Mattermost workspace. These users will have the Guest role applied immediately upon first login instead of the default member user role. This eliminates having to manually assign the role in the System Console.

If this filter is removed/changed, active guests will not be promoted to a member and will retain their Guest role. Guests can be promoted in **System Console > User Management**.

1. Navigate to **System Console > Authentication > Guest Access (Beta)** and set Guest Access to ``true``.
2. Navigate to **System Console > Authentication > AD/LDAP**.
3. Complete the **Guest Filter** field.
4. Choose **Save**.

When a guest logs in for the first time they are presented with a default landing page until they are added to channels.

See the `Guest Accounts documentation <https://docs.mattermost.com/onboard/guest-accounts.html>`__ for more information about this feature.

Admin filter
~~~~~~~~~~~~

(Optional) Enter an AD/LDAP filter to use for designating System Admins. The users selected by the query will have access to your Mattermost workspace as System Admins. By default, System Admins have complete access to the Mattermost System Console. Existing members that are identified by this attribute will be promoted from member to System Admin upon next login.

The next login is based upon Session lengths set in **System Console > Session Lengths**. It is recommended that users are demoted to members manually in **System Console > User Management** to ensure access is restricted immediately.

1. Navigate to **System Console > Authentication > AD/LDAP**.
2. Set **Admin Filter** to **true**.
3. Complete the **Admin Filter** field.
4. Choose **Save**.

**Note:** If the Admin Filter is set to ``false`` the member's role as System Admin is retained. However if this filter is removed/changed, System Admins that were promoted via this filter will be demoted to members and will not retain access to the System Console.

When this filter isn't in use, members can be manually promoted/demoted via **System Console > User Management**.

Configure AD/LDAP deployments with multiple domains
-----------------------------------------------------

Organizations using multiple domains can integrate with Mattermost using a "Forest" configuration to bring together multiple domains. Please see `Forests as Collections of Domain Controllers that Trust Each Other <https://technet.microsoft.com/en-us/library/cc759073%28v=ws.10%29.aspx?f=255&MSPPError=-2147217396>`__ for more information.

For forest configurations that contain multiple domains which do NOT share a common root, you can search across all of the domains using the Global Catalog. To do so, update your ``config.json`` as follows:

- Set the LdapPort to 3268 (instead of 389)
- Set the BaseDN to " " (A single space character)

See `Global Catalog and LDAP Searches <https://technet.microsoft.com/en-us/library/cc978012.aspx>`__ for additional details.

Troubleshooting/FAQ
-------------------

The following are frequently asked questions and troubleshooting suggestions on common error messages and issues. It is recommended that you check your logs for errors as they can provide an idea of what the issue is.

If the **AD/LDAP Test** button fails, how can I troubleshoot the connection?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Check that your AD/LDAP connection settings are correct by running an AD/LDAP user query in an external system. See `LDAP Connection Test Example <http://ldaptool.sourceforge.net>`__. If the AD/LDAP connection is verified to be working outside of Mattermost, try the following:

- Check your AD/LDAP system to verify your ``Bind Username`` format.
- Check your **AD/LDAP Port** and **Connection Security** settings in the System Console. (**AD/LDAP Port** set to 389 typically uses **Connection Security** set to ``None``. **AD/LDAP Port** set to 636 typically ties to **Connection Security** set to **TLS**).
- If you're seeing ``x509: certificate signed by unknown authority`` in your logs, try installing an intermediate SSL certificate or have your LDAP server send the complete certificate chain.

If these options don't work, please contact Mattermost support via the email address that came with your license key.

When I first set up and synchronize AD/LDAP, are the users automatically created in Mattermost?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

No, each user is created on their first login.

When I try to synchronize AD/LDAP, why does the status show as ``Pending`` and not complete?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Go to **System Console > AD/LDAP** and make sure that the **Enable Synchronization with AD/LDAP** setting is set to **true**.

If the issue persists, try performing a sync with the **User Filter** field blank. If the sync completes in this scenario, then the general syntax was formatted incorrectly. Refer to this `document <https://docs.mattermost.com/configure/configuration-settings.html#user-filter>`__ for guidance on setting a correct syntax format.

Make sure that you also have at least one LDAP user in Mattermost or the sync will not complete.

What's the difference between the Username Attribute, ID Attribute, and Login ID Attribute?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

There are three AD/LDAP attributes that apear to be similar but serve a different purpose:

1. **Username Attribute:** Used within the Mattermost user interface to identify and mention users. For example, if **Username Attribute** is set to ``john.smith``, a user typing ``@john`` will see ``@john.smith`` in their autocomplete options and posting a message with ``@john.smith`` will send a notification to that user that they’ve been mentioned.
2. **ID Attribute:** Used as the unique identifier in Mattermost. It should be an AD/LDAP attribute with a value that does not change, such as ``ObjectGUID``. If a user's ID attribute changes, it will create a new Mattermost account unassociated with their old one. If you need to change this field after users have already logged in, use the `mattermost ldap idmigrate mmctl tool <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-ldap-idmigrate>`__.
3. **Login ID Attribute:** The attribute in the AD/LDAP server used to log in to Mattermost. Normally this attribute is the same as the **Username Attribute** field above, or another field that users can easily remember.

How do I deactivate users?
~~~~~~~~~~~~~~~~~~~~~~~~~~

When AD/LDAP authentication is used in Mattermost, user deactivation must be done via the AD/LDAP server.

There are two main ways to do this:

1. **User deletion:** If the user is completely removed from the AD/LDAP server, they will be deactivated in Mattermost on the next synchronization.
2. **User filter:** Set the `user filter <https://docs.mattermost.com/configure/configuration-settings.html#user-filter>`__ to only select the subset of AD/LDAP users you want to have access to Mattermost. When someone is removed from the selected group, they will be deactivated in Mattermost on the next synchronization.

For Active Directory, to filter out deactivated users you must set the user filter to:

``(&(objectCategory=Person)(!(UserAccountControl:1.2.840.113556.1.4.803:=2)))``

Filters can also be used for excluding users who belong to certain groups. For Active Directory, the query to filter out groups is: 

``(&(memberof=cn=ACME_ALL,ou=Users,dc=sademo,dc=com)``

``(!(memberof=cn=DEV_OPS,ou=Users,dc=sademo,dc=com)))``

When a user is deactivated in Mattermost, all the user's current sessions are revoked and they will be unable to log in or access Mattermost.

Can I connect to multiple Active Directory servers?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

There is currently no built-in way to connect to multiple AD servers. You will need to connect the instances in a forest before connecting to Mattermost. Consider upvoting the `feature request <https://mattermost.uservoice.com/forums/306457-general/suggestions/13589904-add-the-abilitiry>`__ on our forum.

When trying to log in, I see the error ``AD/LDAP not available on this server``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This indicates that there is a problem somewhere with your configuration. We recommend that you check your Mattermost configuration settings to ensure that AD/LDAP is enabled, and the settings are correct.

If you're still having issues, you can `contact support <https://mattermost.com/support/>`__ for additional troubleshooting.

I see the error ``User not registered on AD/LDAP server``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This means the query sent back to the AD/LDAP server returned no results. We recommend that you:

1. Check that the user credentials were entered properly - you should log in with the field set as the `*ID Attribute* <https://docs.mattermost.com/configure/configuration-settings.html#id-attribute>`__.
2. Check that the user account exists in the AD/LDAP server.
3. Check the AD/LDAP configuration settings are correct.

If you're still having issues, you can `contact Mattermost Support <https://mattermost.com/support/>`__  for additional troubleshooting.

I updated a user account in AD/LDAP, and they can no longer log in to Mattermost
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

If the user can no longer log in to Mattermost with their AD/LDAP credentials - for example, they get an error message ``An account with that email already exists``, or a new Mattermost account is created when they try to log in - this means the **ID Attribute** for their account has changed.

The issue can be fixed by changing the value of the field used for the **ID Attribute** back to the old value. If you're currently using a field that sometimes changes for an **ID Attribute** (e.g. username, email that changes when someone gets married), we recommend you switch to using a non-changing field such as a GUID.

To do this, you can set the `Login ID Attribute <https://docs.mattermost.com/configure/configuration-settings.html#id-attribute>`__ to whatever you would like users to log in with (e.g. username or email).

.. note::
   Currently the value is case sensitive. If the **ID Attribute** is set to the username and the username changes from ``John.Smith`` to ``john.smith``, the user will experience problems logging in.

I see the log error ``LDAP Result Code 4 "Size Limit Exceeded"``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This indicates your AD/LDAP server configuration has a maximum page size set and the query coming from Mattermost is returning a result set in excess of that limit.

To address this issue you can set the `max page size <https://docs.mattermost.com/configure/configuration-settings.html#maximum-page-size>`__ in your Mattermost configuration to match the limit on your AD/LDAP server. This will return a sequence of result sets that do not exceed the max page size, rather than returning all results in a single query. A max page size setting of 1500 is recommended.

If the error is still occurring, it is likely that no AD/LDAP users have logged into Mattermost yet. Ensure that at least one AD/LDAP user has logged into Mattermost and re-run the sync. The error should disappear at that point.

Can the AD/LDAP User Filter read security groups?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Yes it can, but make sure that:

- Permissions are correctly configured on the service account you are using.
- Each user object is a direct member of the security group.

How do I know if an AD/LDAP sync job fails?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost provides the status of each AD/LDAP sync job in **System Console > Authentication > AD/LDAP**. Here you can see the number of users updated and if the job succeeded or failed.

source/onboard/ad-ldap-groups-synchronization.rst METASEP
.. _ldap-group-sync:

AD/LDAP groups
==============

.. include:: ../_static/badges/ent-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Mattermost Enterprise Edition E20*

Overview
--------

The groups feature is useful for organizations that have many new users to onboard or that onboard users frequently and want to ensure users are added to default teams and channels that are pertinent to them. The group feature currently supports:

- Creating groups by synchronization with your AD/LDAP system groups.
- Syncing groups to pre-defined roles in Mattermost.
- AD/LDAP nested groups.
- Using synchronized groups to manage `membership of teams and Private channels <https://docs.mattermost.com/onboard/ad-ldap-groups-synchronization.html#synchronizing-teams-and-channels>`_.

For a technical overview of the feature by Martin Kraft, who led the development of the feature, please see `this blog post <https://developers.mattermost.com/blog/ldap-nested-groups-modelling-and-representation-in-code>`__.

You can also watch a video overview about adding users to Mattermost with AD/LDAP on `YouTube <https://www.youtube.com/watch?v=zyku2ibsG0M>`_.

.. raw:: html

   <div style="position: relative; padding-bottom: 50%; height: 0; overflow: hidden; max-width: 100%; height: auto;">
      <iframe src="https://www.youtube.com/embed/zyku2ibsG0M" frameborder="0" allowfullscreen style="position: absolute; top: 0; left: 0; width: 100%; height: 95%;"></iframe>
   </div>

Pre-installation notes
----------------------

If you have enabled synchronization with AD/LDAP, all groups matching the default filter ``(|(objectClass=group)(objectClass=groupOfNames)(objectClass=groupOfUniqueNames))`` will be available to be linked in the groups list view at **System Console > User Management > Groups**.

The group filter is an optional configuration setting available under **System Console > AD/LDAP** and allows you to specify the groups that should have access in Mattermost. The **Group** filter is independent of the **User** filter; however, it does leverage the Base DN attribute. You may need to adjust your Base DN to ensure group objects can be searched in your AD/LDAP tree.

The synchronization of groups happens with the synchronization of users, during which Mattermost queries AD/LDAP for updated account information. Please see the `Active Directory/LDAP Set up documentation <https://docs.mattermost.com/onboard/ad-ldap.html>`__. for more information. The group feature has no effect on users' authentication to Mattermost.

Enabling AD/LDAP group synchronization
--------------------------------------

To enable this feature, go to **System Console > Groups**.

Using AD/LDAP group synchronization
-----------------------------------

To synchronize specific AD/LDAP groups to Mattermost, specify the ``Group ID Attribute`` and the ``Group Display Name Attribute`` (e.g., "cn" for Common Name) under **System Console > Authentication > AD/LDAP**.

Additionally, you can specify the **Group** filter used to retrieve groups. If the **Group** filter configuration is left blank, then all groups matching the default filter ``(|(objectClass=group)(objectClass=groupOfNames)(objectClass=groupOfUniqueNames))`` are returned.

.. note::
   Attribute values for **Group ID** and **Group Display Name** are case-sensitive.

Group synchronization occurs after user synchronization and results for group synchronization are available on the synchonization status table (located at the bottom of the **AD/LDAP** configuration page).

After the AD/LDAP groups have been synchronized, go to **System Console > User Management > Groups** to link and configure Mattermost groups.

.. image:: ../images/Group_filter.png

.. note::
   The sync process does not create Mattermost groups. Mattermost groups are created when you “link” the AD/LDAP group as outlined in the next section **Linking AD/LDAP groups to Mattermost groups**. Existing AD/LDAP users are added to the Mattermost groups on the next synchronization and new users are added on their first login.

On subsequent synchronizations and once groups are linked:

 - Users that have been added to an AD/LDAP group will be added to the linked Mattermost group and to teams and channels configured for that group.
 - Mattermost groups that are linked to AD/LDAP groups no longer included in your filter are deleted.
 - Users removed from an AD/LDAP group are removed from the linked Mattermost group, but their channel and team membership is only revoked when the channel or team is synchronized to an AD/LDAP group.

.. image:: ../images/Group_Group_Member_Sync.png

Linking AD/LDAP groups to Mattermost groups
-------------------------------------------

Groups that have been returned from the default filter or your AD/LDAP group filter will be available in a list view on the Groups page. The link action will create Mattermost groups corresponding to the AD/LDAP group. AD/LDAP groups linked to a Mattermost group will display the **Linked** icon. AD/LDAP groups that have not been linked to a Mattermost group will display the **Not Linked** icon. An AD/LDAP group that is not linked does not create a Mattermost group.

.. image:: ../images/Groups_listing.png

You can link groups individually by the inline **Linked** button and use the checkbox next to the group name to select multiple groups and choose **Link Selected Groups**. When selecting multiple groups with a mix of **Linked** and **Not Linked** states, the bulk action of the button will be **Link Selected Groups** until all selected are marked **Linked**. Using the bulk action speeds the process of creating Mattermost groups from your AD/LDAP Groups.

If you see a **Link Failed** message, either select the message, or check the box alongside the group name to expose the inline link message and try again.

.. image:: ../images/LinkFailed.png

Configuring the group
---------------------

AD/LDAP groups that have been linked to Mattermost groups can be configured to add team and channels. To configure the group, select **Configure > Group Configuration** and view the group profile which includes the group name. This name is automatically mapped from the AD/LDAP group common name attribute and is read-only.

Adding default teams or channels for the group
----------------------------------------------

To add the teams and channels that you want the group members to default in, select either **Add Team** or **Add Channel** from the **Add Team or Channel** button.

.. image:: ../images/Group_Configuration.png

Channels are nested below the team they belong to in the team and channel list.

Teams that are open for anyone to join are indicated by:

.. image:: ../images/open_team.png

Teams that are not open for anyone to join are indicated by:

.. image:: ../images/private_team.png

Public channels are indicated by:

.. image:: ../images/public_channel.png

Private channels are indicated by:

.. image:: ../images/private_channel.png

When a team is added, the ``Town Square`` and ``Off-Topic`` channels will also be added as default, as well as any default channels set in the `ExperimentalDefaultChannels config setting <https://docs.mattermost.com/configure/configuration-settings.html#default-channels-experimental>`__.

When a channel is added without setting the team explicitly, the team will be shown in the **Team and Channel Membership** listing, but it will not be added to the group specifically. Because of this dependency, when the channel is removed, the team will also be removed. Teams are listed in parentheses after the channel name in the channel selector.

You can assign roles to group members using the options provided in the **Assigned Roles** column. Roles are updated on the next scheduled AD/LDAP synchronization. 

Synchronizing teams and channels
--------------------------------

For new users, default teams and channels will be added when they log in for the first time. For existing users, default teams and channels will be added after the next scheduled AD/LDAP sychronization.

It may take a few seconds to load all team and channel memberships for a user depending on the number of teams and channels the group is defaulted to. In our testing, it took six seconds for an organization with 200,000 users and 30,000 linked groups.

.. note::
   Users are not removed from the team or channel on subsequent synchronizations of the AD/LDAP groups. Users will need to be manually removed from the team or channel per the existing functionality. They will not be re-added if they were manually removed or removed themselves. To manage a team or Private channel membership with synchronized groups, please see `this documentation <https://docs.mattermost.com/onboard/ad-ldap-groups-synchronization.html#synchronizing-teams-and-channels>`_.

.. image:: ../images/Team_Channel_Membership_Sync.png

Removing configured teams and channels from a group
---------------------------------------------------

To remove a team or channel configured for a group, select **Remove** to the right of the team or channel name. Users already part of the team and channel will not be removed from that channel by this action.

Viewing users belonging to the group
------------------------------------

Users who have logged in and accessed Mattermost will be visible in the members list on the group object. Members are read-only at this time and new members can be added through management in your AD/LDAP system.

.. image:: ../images/Group_Members.png

Users can be removed from the Mattermost group on subsequent synchronizations. However, they will not be removed from teams and channels unless the team or channel is group-synced.

.. note::

   When a member removes themselves manually from a channel, that action is tracked in the **Channel Member History** table. If a System Admin manually forces all members in a specific LDAP group to join the teams and channels synchronized to that group, members can potentially be re-added to channels from which they were previously removed.

Disabling and re-activating AD/LDAP users
-----------------------------------------

From Mattermost Server v5.36, if a member is removed from an AD/LDAP group, deactivated in AD/LDAP, or filtered from the AD/LDAP user filter, that member loses access to Mattermost.

If that member is later re-added, reactivated, or included in the user filter, they aren't automatically re-added to Mattermost groups. A System Admin must re-add that member manually to Mattermost teams and channels.

Using the Mattermost API, System Admins can manually re-add all group members back into synchronized teams or channels by forcing members in an LDAP group to join the teams and channels synchronized to that group, even if members left on their own, were removed, were filtered out, or were deactivated. See our `Mattermost API documentation <https://api.mattermost.com/#operation/SyncLdap>`__ for details on synchronizing user attribute changes in the configured AD/LDAP server with Mattermost.

Managing groups
---------------

Once a group has been configured, the default teams and channels can be changed via the **Edit** option on the group list view.

Deleting groups
---------------

Mattermost groups can be deleted by adjusting your AD/LDAP group filter to remove the group or by unlinking the group on the Groups listing page. If you add the group back by re-adjusting the AD/LDAP group filter and link the group again on the group configuration page, the previous team and channel configurations will be available.

Using AD/LDAP synchronized groups to manage team or private channel membership
-------------------------------------------------------------------------------

Mattermost groups created with synchronized AD/LDAP groups can be used to manage the membership of private teams and private channels. When a team or private channel is managed by synchronized groups, member users will be added and removed based on their membership to the synchronized AD/LDAP group.

.. note::

   It is not possible to add guests to teams and channels that are managed using groups.

For instance, you may have an AD/LDAP group that contains your development team that you want to synchronize to a developer team. By using this feature, new developers will get added to the team when they are added to the synchronized AD/LDAP group and they will be removed from the team when removed from the AD/LDAP group.

Similarly, you may have an AD/LDAP group that contains your leadership team that you want to synchronize to a private channel for coordination and updates.

This feature helps control the membership of the channel so that guests and member users outside of the synchronized group are prevented from being added to the channel mistakenly.

On teams that are managed by synchronized groups, guests, and member users outside of the group are restricted from:

 - Invitation through a team invite link.
 - Invitations through an email invite.

Similarly on private channels that are managed by synchronized groups, guests and member users outside of the group are restricted from:

 - Invitation through a mention.
 - Invitation through the ``/invite`` slash command.
 - Being added to the channel via the **Add Members** menu option.

Users can remove themselves from teams and Private channels managed by synchronized groups.

Managing membership of a team or channel with synchronized groups
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

To manage membership of a private team with synchronized groups:

1. Navigate to **System Console > User Management > Teams**. Select the team you want to manage with group synchronization.
2. Under **Team Management**, enable **Sync Group Members**. If **Anyone can join this team** is enabled or if specific email domains are set, they will be disabled by the Sync Group Members feature.
3. Add one or more groups to the team. If there are groups already associated with default users in the team, they'll be listed.
4. Review the notice in the footer of the screen for any users that are not part of groups who will be removed from the team on the next synchronization.
5. Select **Save**. Members will be updated on the next scheduled AD/LDAP synchronization.

Alternatively, you can use the CLI or mmctl tools to set the team to be managed by groups:

1. Ensure there is at least one group already associated to the team. You can view and add default teams to a group via **System Console > User Management > Groups > Group Configuration**. Please see more information on adding default teams and channels `here <https://docs.mattermost.com/onboard/ad-ldap-groups-synchronization.html#adding-default-teams-or-channels-for-the-group>`__. Additionally, you can use the CLI or mmctl tools to confirm if there is already a group associated to the team by running the `group team list CLI command <https://docs.mattermost.com/manage/command-line-tools.html#mattermost-group-team-list>`__ or by running the `mmctl group team list command <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-group-team-list>`__.
2. Ensure **Team Settings > General > Allow any user with an account on this server to join this team** is set to **No**.
3. Convert the team to have its membership managed by synchronized groups by running the `group team enable CLI or command <https://docs.mattermost.com/manage/command-line-tools.html#mattermost-group-team-enable>`__, or by running the `mmctl group team enable command <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-group-team-enable>`__.

To manage membership of a private channel with synchronized groups:

1. Navigate to **System Console > User Management > Channels**. Select the channel you want to manage with group synchronization.
2. Under **Channel Management**, enable **Sync Group Members**. Please ensure the channel is set to **private**.
3. Add one or more groups to the channel. If there are groups already associated with default users in the team, they'll be listed.
4. Review the notice in the footer of the screen for any users that are not part of groups who will be removed from the channel on the next synchronization.
5. Select **Save**. 

Members will be updated on the next scheduled AD/LDAP synchronization. Alternatively, you can use the CLI or mmctl tools to set a private channel to be managed by groups:

1. Ensure there is at least one group already associated to the channel. You can view and add default channels to a group via **System Console > User Management > Groups > Group Configuration**. Please see more information on adding default teams and channels `here <https://docs.mattermost.com/onboard/ad-ldap-groups-synchronization.html#adding-default-teams-or-channels-for-the-group>`_. Additionally, you can use the CLI or mmctl tools to view if there is already a group associated to the channel by running the `group channel list CLI command <https://docs.mattermost.com/manage/command-line-tools.html#mattermost-group-team-list>`__, or by running the `mmctl group channel list command <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-group-channel-list>`__.
2. Convert the team to have its membership managed by synchronized groups by running the `group channel enable CLI command <https://docs.mattermost.com/manage/command-line-tools.html#mattermost-group-channel-enable>`__, or by running the `mmctl group channel enable command <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-group-channel-enable>`__.

Assigning roles to group members
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Group members can be assigned predefined roles by System Admins, which are applied across the group during the scheduled sychronization. The roles are:

- Member (default)
- Team Admin (in teams)
- Channel Admin (in channels)

The permissions for each role can be viewed and modified in **System Console > Permissions**.

**To set the Team Admin role in a synced group**

1. Go to **System Console > User Management > Teams**.
2. Select **Edit** next to the team you want to configure.
3. Ensure that **Sync Group Members** is enabled.
4. Choose **Add Group** to add one or more groups to the team. If there are groups already associated to default users into the team, they will already be present.
5. Select the arrow next to the current role in the **Roles** column to display and select the **Team Admin** option.
6. Repeat as needed for any other synced groups you have added.
7. Select **Save**.

Roles are updated on the next scheduled AD/LDAP synchronization.

**To set the Channel Admin role in a synced group**

1. Navigate to **System Console > User Management > Channels**.
2. Select **Edit** next to the team you want to configure.
3. Ensure that **Sync Group Members** is enabled.
4. Choose **Add Group** to add one or more groups to the team. If there are groups already associated with default users in the team, they'll be listed.
5. Select the arrow next to the current role in the **Roles** column to display and select the **Channel Admin** option.
6. Repeat as needed for any other synced groups you have added.
7. Select **Save**.

Roles are updated on the next scheduled AD/LDAP synchronization.

.. note:: 
   Members who have been synced as part of a group cannot have their role changed via **View Members** in Mattermost.

Add or remove groups from teams
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Once team management is converted to use synchronized groups, a Team or System Admin can add additional groups from **Main Menu > Add Groups to Team**. This will add users to the next AD/LDAP synchronization, and any new users to the group will be added to the team on subsequent synchronizations. Team Admins will be prevented from converting the team to a public space by enabling **Team Settings > Allow any user with an account on this server to join this team**.

Team or System Admins can also remove groups from a team from **Main Menu > Manage Groups**. This will disassociate the group from the team. Users are removed on the next AD/LDAP synchronization.

The System Admin can also remove groups from  **System Console > User Management > Teams > Team Configuration > Synced Groups**.

Add or remove groups from private channels
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Once the management of the channel is converted to be managed by synchronized groups, a Team or System Admin can add additional groups from **Channel Menu > Add Groups to Channel**. This will add users on the next AD/LDAP synchronization and any new users to the group will be added to the channel on subsequent synchronizations.

Team or System Admins can also remove groups from a team from **Main Menu > Manage Groups**. This will disassociate the group from the team. Users are removed on the next AD/LDAP synchronization.

The System Admin can also remove groups from  **System Console > User Management > Channels > Channel Configuration > Synced Groups**.

Managing members
^^^^^^^^^^^^^^^^^

Users are automatically removed from the team or private channel when removed from a synchronized AD/LDAP group that is managing the membership of that team or channel. Additionally, users who are not in the synchronized groups are prevented from being added through the ``/invite`` and mention flows within a channel.

A user can remove themselves from the team or from the private channel when it is managed by synchronized groups. They can be added back by users who have permission to manage members for a team or private channel by using the ``/invite`` slash command or by mentioning the user in a channel.

If the user is removed from a synchronized group and later readded to the group, they can be manually added back to the team or Private channel as noted above.

.. note:: 

   Users will not be automatically added back by the AD/LDAP synchronization once they remove themselves or are removed by the LDAP synchronized group.

Disabling group synchronized management of teams and private channels
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

To remove the management of members by synchronized groups in a team, disable **Sync Group Members** under **System Console > User Management > Teams > Team Management**. Alternatively, you can also run the `group team disable CLI command <https://docs.mattermost.com/manage/command-line-tools.html#mattermost-group-team-disable>`__, or run the `mmctl group team disable command <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-group-team-disable>`__.

To remove the management of members by synchronized groups in a channel, disable **Sync Group Members** under **System Console > User Management > Channels > Channel Management**. Alternatively, you can also run the `group channel disable CLI command <https://docs.mattermost.com/manage/command-line-tools.html#mattermost-group-channel-disable>`__, or run the `mmctl group channel disable command <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-group-channel-disable>`__.

Frequently asked questions
--------------------------

Why do my LDAP users and groups exist in Mattermost, but my groups have no members?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

In order for Mattermost to detect group membership correctly, and to automatically add users to the group configured in the System Console, you must use one of the following AD/LDAP attributes to represent group members in Mattermost: ``member`` or ``uniqueMember``. These attributes use a ``Distinguished Name`` as the value on groups.

.. note::
   LDAP installations that use ``memberUid`` to indicate group membership are not supported because ``memberUid`` is an attribute of an object class ``posixGroup`` that does not use ``Distinguished Names`` as the value on groups.

Why can't my existing users see the teams and channels they have been synced to?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Existing Mattermost users that are members of linked Mattermost groups will be added to teams and channels on the next scheduled synchronization job that is run after teams and channels are added to the Mattermost group. You can manually initiate a synchronization from **System Console > Authentication > AD/LDAP > AD/LDAP Synchronize Now**.

How do nested groups work with AD/LDAP Group Sync?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Users within nested groups are included as members of parent groups. The group filter that you specify can include any type of AD/LDAP group on your system. The ``member`` AD/LDAP attribute is used to determine nested groups that belong to a parent group.

How do I manage a team or private channel membership with synchronized groups?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

You can do this by setting the team or channel management to synced groups instead defaulting a group to a team or channel. See `this documentation <https://docs.mattermost.com/onboard/ad-ldap-groups-synchronization.html#synchronizing-teams-and-channels>`_ to learn more.

How do I use AD/LDAP group sync with SAML?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

You can use AD/LDAP group sync with SAML by enabling `SAML Synchronization with AD/LDAP <https://docs.mattermost.com/onboard/sso-saml-okta.html#configure-saml-synchronization-with-ad-ldap>`_. You do not need to enable sign-in with LDAP for this feature to work.

However, it's critical that the unique Mattermost ID identifier that you have chosen as your attribute in your directory service (AD/LDAP) is the same for both the SAML and AD/LDAP configurations.

For instance, if ``ObjectGUID`` has been chosen as the Mattermost ID in your AD/LDAP configuration, then an attribute that has the same value should also be mapped to the ID attribute in your SAML assertion. We also recommend that the ID attribute you select is unique and unchanging (such as a ``GUID``).

Why aren’t public channels supported with synchronized groups?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Public channels are available to all members to discover and join. Managing membership with synchronized groups removes the ability for Public channels to be accessible to users on the team. Private channels typically require more controlled membership management, which is why this feature applies to Private channels. Groups can be assigned to public teams and public channels as described in `this documentation <https://docs.mattermost.com/onboard/ad-ldap-groups-synchronization.html#adding-default-teams-or-channels-for-the-group>`_.

Does a team with its membership managed by groups have any effect on public channel access?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Only users that are members of groups synchronized to team are able to discover and join public channels. Private channels can also be managed by synchronized groups when a team is managed by synchronized groups.

Why don't users get readded to teams or channels once they have been removed from and then later re-added to the LDAP group?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The implementation of group removals does not currently differentiate between users who have removed themselves or have been removed by the LDAP synchronization process. Our design optimizes for users who have removed themselves from a team or channel. In the future, we may add the ability for Admins to re-add users who have been removed and even prevent users from leaving a team or channel.

Additionally, LDAP users who are not accessible to Mattermost based on filters will be removed from the groups and from group synced teams and channels. If they were removed from teams and channels then they would not be re-added to those teams and channels upon becoming subsequently reaccessible to Mattermost.

source/manage/workspace-usage.rst METASEP
Workspace usage
===============

.. include:: ../_static/badges/allplans-cloud.rst
  :start-after: :nosearch:

Your Mattermost Cloud workspace is considered "Active" when you're using it. If you stop using the workspace, have no active users, or don't log in for 14 days, your workspace is moved to a "Hibernation" state.

You can still access your workspace via its URL and all your data is still available.

If your workspace isn't accessed or used for 60 days, it will be deleted. This deletion includes any data on the workspace. The URL that you chose for your workspace will become available again after a period of time.

source/manage/user-satisfaction-surveys.rst METASEP
User satisfaction surveys
=========================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Mattermost introduced in-product feedback surveys from v5.12. Feedback is used to measure user satisfaction and improve product quality by hearing directly from users. Please refer to our `privacy policy <https://github.com/mattermost/mattermost-server/blob/master/build/PRIVACY_POLICY.md>`_ for more information on the collection and use of information received through our services.

.. contents::
  :depth: 2
  :local:
  :backlinks: entry

Administration
--------------

Is the survey enabled by default?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The user satisfaction survey is a pre-packaged plugin, and surveys are enabled by default on all servers. However, the plugin will not be activated on any servers that have `Error and Diagnostic Reporting <https://docs.mattermost.com/manage/telemetry.html>`_ disabled, meaning no surveys or data collection occurs.

How can surveys be disabled?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Disabling the **User Satisfaction Surveys** plugin from **System Console > Plugins > Plugin Management** will disable surveys and all data collection by the plugin. If surveys have been disabled from the plugin configuration in **System Console > Plugins > User Satisfaction Surveys** but the plugin itself is still enabled, surveys will not be scheduled but users can still send written feedback by messaging Surveybot.

If the plugin or surveys in the plugin configuration are disabled, they will remain disabled for subsequent server upgrades.

When is the survey scheduled?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Users will receive surveys 21 days after every server upgrade, assuming the following conditions are true:

- User Satisfaction Surveys plugin is enabled in **System Console > Plugins > Plugin Management**.
- Surveys are enabled in the plugin configuration in **System Console > Plugins > User Satisfaction Surveys**.
- User account is greater than 21 days old.
- User has not completed a survey in the last 90 days.
- User has not been sent a survey in the last 90 days.
- Current server version is greater than the server version of the last survey, excluding dot releases.

The above conditions mean that at maximum frequency a user will receive a survey every 90 days, assuming the server is upgraded within that time period.

How will I be notified when a survey is scheduled?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

System Admins will receive an email notification and in-product direct message from "Surveybot" mentioning the scheduled date the survey will be triggered.

.. image:: ../images/nps-admin.png
   :alt: When user satisfaction surveys are enabled in the System Console, Mattermost sends out user satisfaction surveys following every server upgrade. System Admins are notified about upcoming surveys by email notification and through an in-product message from a system bot.

Survey Data
-----------

How is the survey received?
~~~~~~~~~~~~~~~~~~~~~~~~~~~

Once the survey is triggered on the server, all users will receive an in-product direct messages from "Surveybot" on their next login or page refresh in Mattermost.

Users can optionally select a 0-10 score on how likely they are to recommend Mattermost and then provide written feedback about their experience. Selecting a score and providing feedback are optional, and the survey can be ignored without interrupting usage of Mattermost.

.. image:: ../images/nps-survey.png
   :alt: Once Mattermost sends out a user satisfaction survey, all users receive an in-product message from a system bot the next time they log in or refresh Mattermost. The in-product message asks users to rate how likely they'd recommend Mattermost.

What data is collected?
~~~~~~~~~~~~~~~~~~~~~~~

Data is only collected when a user selects a score or provides written feedback in response to survey questions. Please refer to our `privacy policy <https://github.com/mattermost/mattermost-server/blob/master/build/PRIVACY_POLICY.md>`_ for more information on the collection and use of information received through our services. The following **non-personally identifiable information** is collected:

- Survey information:
   - Score (0-10) submitted by the user
   - Written feedback submitted by the user (if applicable)
   - Timestamp of the survey submission
- Server information:
   - Server/Web App version the survey was submitted on
   - Installation date of the server
   - Diagnostic ID used for error and diagnostics reporting
   - License ID used for error and diagnostics reporting (if applicable)
   - Enterprise or Professional (if applicable)
- User information:
   - User role (System Admin, Team Admin, or member)
   - Account creation timestamp
   - User ID of the surveyed user

Will this data be sent through my firewall?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/selfhosted-only.rst
  :start-after: :nosearch:

If Mattermost is hosted in a private network with firewall then data from the User Satisfaction Surveys plugin is not sent unless outbound connections are allowed or specifically configured for this plugin.
source/manage/telemetry.rst METASEP
:orphan:

.. _telemetry:

Telemetry
=========

As described in the privacy policy in each Mattermost server, telemetry data optionally shared from your Mattermost servers is used to identify security and reliability issues, to analyze and fix software problems, to help improve the quality of Mattermost software and related services, and to make design decisions for future releases.

Telemetry data is encrypted in transit, does not include personally identifiable information or message contents, and details of how the information is used and processed is available in our `Privacy Policy <https://mattermost.com/privacy-policy/>`__.

We use the data for the following purposes:

- To identify security and reliability issues.
- To analyze and fix software problems.
- To help improve the quality of Mattermost software and related services.
- To make design decisions for future releases.

Security update check feature
-----------------------------

New threats to system security constantly arise. To alert you of relevant, high priority security updates, Mattermost servers are configured to share diagnostic information with Mattermost Inc. so that we can provide appropriate alerts.

The following data is collected once every 24 hours:

- Mattermost server build number and version
- Type of build (Enterprise Edition or Team Edition)
- Server operating system
- The server diagnostic ID (same as the ID accessing the push notification proxy, and is used to prevent double-counting of telemetry data)
- Database type
- Database version
- Number of teams
- Number of users 
- Number of active users
- Whether or not the unit tests have been run
- Date and time of the last check for security updates
- The location of the Amazon Cloudfront server used for telemetry data

To opt out, disable the feature in **System Console > Environment > SMTP**. When the feature is disabled, you will not receive any security alerts.

Error and diagnostics reporting feature
---------------------------------------

Mattermost error and diagnostic data is collected for the following purposes:
- To add improvements that are specific to your usage and deployment patterns, including identifying security and reliability issues.
- To analyze and fix software problems.
- To help improve the quality of Mattermost software and related services.
- To make design decisions for future releases.

.. note:: 

  Error and diagnostic reporting is sent by the client to the endpoint ``api.segment.io``. From Mattermost v5.23 the segment endpoint is being deprecated in favor of ``https://pdat.matterlytics.com``, a custom Rudder domain. To opt out, you can disable the feature in **System Console > Environment > Logging > Enable Diagnostics and Error Reporting**. Starting in Mattermost v5.26, when this feature is enabled, any 500 errors will be automatically sent to the Mattermost-hosted `Sentry <https://sentry.io/welcome/>`_ endpoint.

Deployment and server configuration data
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Reporting Frequency
- When starting the server for the first time: Every 10 minutes for the first hour, then every hour for the first 12 hours.
- At the 24 hour mark and every 24 hours thereafter.

Deployment Configuration Information
  Basic information including Mattermost server version, database and operating system type and version, and count of System Administrator accounts.

Deployment Type
- Manual install (includes ``wget`` installs)
- Docker
- Mattermost Omnibus
- Kubernetes operator
- GitLab Omnibus

Server Configuration Settings
  Non-personally identifiable data from configuration settings file (``config.json``) in the form of ``type`` ("enumerated integer" or "enumerated boolean") values, ``true/false`` ("boolean"), and ``count`` ("integer"). Specifically these include:

  **Type values (enumerated integer and enumerated boolean)**

  **ServiceSettings**: enum WebserverMode, bool EnableSecurityFixAlert, bool EnableInsecureOutgoingConnections, bool EnableIncomingWebhooks, bool EnableOutgoingWebhooks, bool EnableCommands, bool EnableDeveloper, bool EnableOnlyAdminIntegrations, bool EnablePostUsernameOverride, bool EnablePostIconOverride, bool EnableCustomEmoji, enum RestrictCustomEmojiCreation, bool EnableTesting, bool DeveloperFlags, bool EnableClientPerformanceDebugging, bool EnableMultifactorAuthentication, bool EnableOAuthServiceProvider, enum ConnectionSecurity, bool UseLetsEncrypt, bool Forward80To443, enum ConnectionSecurity, bool TLSStrictTransport, bool EnforceMultifactorAuthentication, enum RestrictPostDelete, bool AllowEditPost, bool EnableUserTypingMessages, bool EnablePostSearch, bool EnableUserStatuses, bool EnableChannelViewMessages, bool EnableEmojiPicker, bool EnableGifPicker, bool EnableAuthenticationTransfer, enum TeammateNameDisplay, bool EnableUserAccessTokens, enum MaximumLoginAttempts, bool ExtendSessionLengthWithActivity, enum SessionLengthWebInHours, enum SessionLengthMobileInHours, enum SessionLengthSSOInHours, int SessionCacheInMinutes, enum SessionIdleTimeoutInMinutes, enum PostEditTimeLimit, enum TimeBetweenUserTypingUpdatesMilliseconds, enum ClusterLogTimeoutMilliseconds, bool CloseUnusedDirectMessages, bool EnablePreviewFeatures, bool EnableTutorial, bool EnableOnboarding, bool ExperimentalEnableDefaultChannelLeaveJoinMessages, bool ExperimentalGroupUnreadChannels, bool AllowCookiesForSubdomains, bool EnableAPITeamDeletion, bool EnableAPIUserDeletion, bool EnableAPIChannelDeletion, bool ExperimentalEnableHardenedMode, bool DisableLegacyMFA, bool ExperimentalStrictCSRFEnforcement, bool EnableEmailInvitations, bool ExperimentalChannelOrganization, bool ExperimentalChannelSidebarOrganization, bool EnableLegacySidebar, bool CorsAllowCredentials, bool CorsDebug, bool DisableBotsWhenOwnerIsDeactivated, bool EnableBotAccountCreation, bool RestrictLinkPreviews, bool EnablePermalinkPreviews, bool EnableSVGs, bool EnableLatex, bool EnableInlineLatex, bool EnableOpenTracing, bool Directory, bool RetentionDays, bool ExperimentalDataPrefetch, bool EnableLocalMode; **TeamSettings**: bool EnableUserCreation, bool EnableTeamCreation, bool RestrictTeamNames, enum RestrictTeamInvite, enum RestrictPublicChannelManagement, enum RestrictPrivateChannelManagement, enum RestrictPublicChannelCreation, enum RestrictPrivateChannelCreation, enum RestrictPublicChannelDeletion, enum RestrictPrivateChannelDeletion, enum RestrictPrivateChannelManageMembers, bool EnableOpenServer, bool EnableUserDeactivation, bool EnableCustomBrand, bool RestrictDirectMessage, enum MaxNotificationsPerChannel, bool EnableConfirmNotificationsToChannel; enum MaxUsersPerTeam, enum MaxChannelsPerTeam, bool EnableCustomUserStatuses, bool ExperimentalTownSquareIsReadOnly, bool ExperimentalHideTownSquareinLHS, bool EnableXToLeaveChannelsFromLHS, bool ExperimentalEnableAutomaticReplies, bool ExperimentalViewArchivedChannels, bool LockTeammateNameDisplay; **ClientRequirementSettings**: enum AndroidLatestVersion, enum AndroidMinVersion, enum DesktopLatestVersion, enum DesktopMinVersion, enum IosLatestVersion, enum IosMinVersion; **DisplaySettings**: bool ExperimentalTimezone; **GuestAccountsSettings**: bool Enable, bool AllowEmailAccounts, bool EnforceMultifactorAuthentication; **SqlSettings**: enum DriverName, bool Trace, enum MaxIdleConns, enum ConnMaxIdleTimeMilliseconds, bool ConnMaxLifetimeMilliseconds; enum MaxOpenC onns, enum QueryTimeout, bool DisableDatabaseSearch; **LogSettings**: bool EnableConsole, enum ConsoleLevel, bool ConsoleJson, bool EnableFile, enum FileLevel, bool FileJson, bool EnableWebhookDebugging; **NotificationLogSettings**: bool EnableConsole, bool ConsoleLevel, bool ConsoleJson, bool EnableFile, bool FileLevel, bool FileJson **PasswordSettings**: bool Lowercase, bool Number, bool Uppercase, bool Symbol, enum MinimumLength; **FileSettings**: bool EnablePublicLink, enum DriverName, enum MaxFileSize, enum FileSettings.MaxImageResolution, enum MaxImageDecoderConcurrency, bool FileSettings.ExtractContent, bool FileSettings.ArchiveRecursion, bool AmazonS3SSL, bool AmazonS3SignV2, bool AmazonS3SSE, bool AmazonS3Trace, bool EnableFileAttachments, bool EnableMobileUpload, bool EnableMobileDownload; **EmailSettings**: bool EnableSignUpWithEmail, bool EnableSignInWithEmail, bool EnableSignInWithUsername, bool RequireEmailVerification, bool SendEmailNotifications, bool UseChannelInEmailNotifications, bool EmailNotificationContentsType, bool EnableSMTPAuth, enum ConnectionSecurity, bool SendPushNotifications, enum PushNotificationContents, bool EnableEmailBatching, bool SkipServerCertificateVerification, enum EmailBatchingBufferSize, enum EmailBatchingInterval, bool EnablePreviewModeBanner, enum SMTPServerTimeout; **MessageExportSettings**: bool DownloadExportResults; **RateLimitSettings**: bool EnableRateLimiter, bool VaryByRemoteAddr,  bool VaryByUser, enum PerSec, enum MaxBurst, enum MemoryStoreSize; **PrivacySettings**: bool ShowEmailAddress, bool ShowFullName; **ThemeSettings**: bool EnableThemeSelection, bool AllowCustomThemes; **GitLabSettings**: bool Enable; **GoogleSettings**: bool Enable; **Office365Settings**: bool Enable; **SupportSettings**: bool CustomTermsOfServiceEnabled; enum CustomTermsOfServiceReAcceptancePeriod; **LdapSettings**: bool Enable, bool EnableSync, enum ConnectionSecurity, bool SkipCertificateVerification, enum SyncIntervalMinutes, enum QueryTimeout, enum MaxPageSize, bool EnableAdminFilter; **ComplianceSettings**: bool Enable, bool EnableDaily; **LocalizationSettings**: enum DefaultServerLocale, enum DefaultClientLocale, enum AvailableLocales; **SamlSettings**: bool Enable, bool EnableSyncWithLdap, bool IgnoreGuestsLdapSync, bool EnableSyncWithLdapIncludeAuth, bool Verify, bool Encrypt, bool SignRequest, bool EnableAdminFilter; **ClusterSettings**: bool Enable, bool UseIpAddress, bool UseExperimentalGossip, bool ReadOnlyConfig, bool EnableExperimentalGossipEncryption, bool EnableGossipCompression; **MetricsSettings**: bool Enable, enum BlockProfileRate; **WebrtcSettings** (only in v5.5 and earlier): bool Enable; **ExperimentalSettings** bool ClientSideCertEnable, bool EnablePostMetadata, bool LinkMetadataTimeoutMilliseconds, bool EnableClickToReply, bool RestrictSystemAdmin, bool UseNewSAMLLibrary, bool CloudBilling, bool RemoteClusters, bool EnableSharedChannels, bool EnableRemoteClusterService; **AnnouncementSettings**: bool EnableBanner, bool AllowBannerDismissal, bool AdminNoticesEnabled, bool UserNoticesEnabled; **ElasticsearchSettings**: bool EnableIndexing, bool EnableSearching, bool Sniff, enum PostIndexReplicas, enum PostIndexShards, enum LiveIndexingBatchSize, enum BatchSize, enum RequestTimeoutSeconds, bool SkipTLSVerification, bool Trace; **PluginSettings**: bool Enable, bool EnableUploads, bool EnableHealthCheck, bool EnableMarketplace, bool EnableRemoteMarketplace, bool AutomaticPrepackagedPlugins, bool RequirePluginSignature; **DataRetentionSettings**: bool EnableMessageDeletion, bool MessageRetentionDays, bool AllowInsecureDownloadUrl, bool EnableFileDeletion, bool FileRetentionDays, enum DeletionJobStartTime; **MessageExportSettings**: bool EnableExport, enum ExportFormat, enum DailyRunTime, enum ExportFromTimestamp, enum BatchSize, enum GlobalRelaySettings.CustomerType; **ExperimentalAuditSettings**: bool SysLogEnabled, bool SysLogInsecure, enum SysLogMaxQueueSize, bool FileEnabled, enum FileMaxSizeMB, enum FileMaxAgeDays, bool FileMaxBackups, bool FileCompress, enum FileMaxQueueSize; **BleveSettings**: bool EnableIndexing, bool EnableSearching, bool EnableAutocomplete, enum BatchSize; bool FeatureFlags
  
  **Counts (integer)**

   **SqlSettings**: int DataSourceReplicas, int DataSourceSearchReplicas, int ReplicaLagSettings; **ThemeSettings**: int AllowedThemes; **PluginSettings**: int SignaturePublicKeyFiles

  **True/false (boolean)** value whether setting remains default (true) or non-default (false). **NOTE: No input data is used**:

   **ServiceSettings**: bool SiteURL, bool WebsocketURL, bool TLSCertFile, bool TLSKeyFile, bool ReadTimeout, bool WriteTimeout,bool IdleTimeout, bool GoogleDeveloperKey, bool AllowCorsFrom, bool CorsExposedHeaders, bool AllowedUntrustedInternalConnections, bool GfycatApiKey, bool GfycatApiSecret, bool ManagedResourcePaths, bool CollapsedThreads; **TeamSettings**: bool SiteName, bool CustomBrandText, bool CustomDescriptionText, bool UserStatusAwayTimeout, bool ExperimentalPrimaryTeam; **DisplaySettings**: bool CustomUrlSchemes; **GuestAccountSettings**: bool RestrictCreationToDomains; **LogSettings**: bool FileLocation; **NotificationLogSettings**: bool FileLocation; **EmailSettings**: bool FeedbackName, bool FeedbackEmail, bool FeedbackOrganization, bool LoginButtonColor, bool LoginButtonBorderColor, bool LoginButtonTextColor, bool ImageProxyType, bool ImageProxyURL, bool ImageProxyOptions; **RateLimitSettings**: bool VaryByHeader; **SupportSettings**: bool TermsOfServiceLink, bool PrivacyPolicyLink, bool AboutLink, bool HelpLink, bool ReportAProblemLink, bool AppCustomURLSchemes, bool SupportEmail; **ThemeSettings**: bool DefaultTheme; **TimeZoneSettings**: bool SupportedTimezonesPath; **LdapSettings**: bool FirstNameAttribute, bool LastNameAttribute, bool EmailAttribute, bool UserNameAttribute, bool NicknameAttribute, bool IdAttribute, bool PositionAttribute, bool LoginFieldName, bool LoginButtonColor, bool LoginButtonBorderColor, bool LoginButtonTextColor, bool GroupFilter, bool GroupDisplayNameAttribute, bool GroupIdAttribute, bool GuestFilter, bool AdminFilter; **SamlSettings**: bool SignatureAlgorithm, bool CanonicalAlgorithm, bool ScopingIDPProviderId, bool ScopingIDPName, bool IdAttribute, bool GuestAttribute, bool FirstNameAttribute, bool LastNameAttribute, bool EmailAttribute, bool UserNameAttribute, bool NicknameAttribute, bool LocaleAttribute, bool PositionAttribute, bool LoginIdAttribute, bool LoginButtonText, bool LoginButtonColor, bool LoginButtonBorderColor, bool LoginButtonTextColor, bool AdminFilter; **NativeAppSettings**: bool AppDownloadLink, bool  AndroidAppDownloadLink, bool IosAppDownloadLink; **WebrtcSettings** (only in v5.5 and earlier): bool StunURI, bool TurnURI; **ClusterSettings**: bool NetworkInterface, bool BindAddress, bool AdvertiseAddress; **MetricsSettings**: bool BlockProfileRate; **AnalyticsSettings**: bool MaxUsersForStatistics; **ExperimentalSettings** bool ClientSideCertCheck; **AnnouncementSettings**: bool BannerColor, bool BannerTextColor; **ElasticsearchSettings**: bool ConnectionUrl, bool Username, bool Password, bool IndexPrefix; **PluginSettings**: bool MarketplaceUrl, bool SignaturePublicKeyFiles, bool ChimeraOAuthProxyUrl; **MessageExportSettings**: bool GlobalRelaySettings.SmtpUsername, bool GlobalRelaySettings.SmtpPassword, bool GlobalRelaySettings.EmailAddress

Commercial License Information (Enterprise Edition only)
  Information about commercial license key purchased or trial license key used for Enterprise Edition servers: Company ID, license ID, license issue date, license start date, license expiry date, number of licensed users, license name, list of unlocked subscription features.

Channel Moderation Configuration Information (Enterprise Edition only)
  Information related to channel moderation, including number of channel schemes, number of channels with posting messages disabled for users or guests, number of channels with emoji reactions disabled for users or guests, number of channels with managing members disabled, number of channels with channel mentions disabled for users or guests.
  
Channel Member Management Information (Enterprise Edition only)
  Information related to bulk user management and team and channel filtering, including number of users added, number of users removed, number of users promoted, number of users demoted, number of times archive and unarchive is used from any channel configuration page, and number of times channel search or team search filters are used.

Groups Configuration Information (Enterprise Edition only)
  Information related to AD/LDAP groups, including number of groups synced to Mattermost, teams and channels associated to groups, teams and channels synced with groups, and number of group members.

Plugin Configuration Information
  Basic information including number of active and inactive plugins, which are using webapp or backend portions, which `Mattermost plugins <https://github.com/mattermost/mattermost-server/blob/master/services/telemetry/telemetry.go#L1406>`__ are enabled along with their versions, and core plugins disabled count (including apps framework, calls, boards, playbooks, net promoter score/user satisfaction survey, and channel export). Some plugins may send summary data such as number of authenticated users of the plugin. From Mattermost v5.26, the list of plugins is obtained from the Marketplace. If the Marketplace can't be reached, the list of known plugins is used instead.

Permissions Configuration Information (Enterprise Edition only)
  Permissions configured for each role for the System Scheme and each Team Override Scheme created in the system. Scheme ID; Team Admin permissions; team user permissions; Channel Admin permissions; channel user permissions; number of teams the scheme is associated with; number of users assigned to each admin role; Number of admin roles not using default privileges; Changes to default privileges of each admin role.

Aggregated Usage Statistics
  Non-personally identifiable summations of basic usage statistics: Number of enabled and disabled accounts, number of user logins in the last 24 hours and the last 30 days, number of users active in the last day/month, whether APIv3 endpoints were used in the last 24 hours, number of posts, channels, teams, guest accounts, bots, and file storage.

Event data
~~~~~~~~~~~

Reporting Frequency
  - Immediately after the specific event occurs.

.. note::

  The majority of these events have been disabled since Mattermost v5.8. Refer to the source file for the `current list of events sent via telemetry <https://github.com/mattermost/mattermost-redux/blob/master/src/client/client4.ts#L3069>`__.

Non-personally Identifiable Error Information, distinguished by end users and System Admins
  Boolean when the following events occur:
  
  - *Sign-in Error*: Email login error, AD/LDAP login error, SAML login error
  
  Boolean when the following events occur, including the error message, recently dispatched Redux actions, and non-identifiable information of the device, operating system, and the app:

  - *Mobile App Errors*: App crashes caused by type errors, exceptions, and failed logins

Non-personally Identifiable Diagnostic Information, distinguished by end users and System Admins
  Boolean when the following events occur:

  - *Team and Account Setup Diagnostics:* Account creation via email, invite or UI, account creation page view, account creation completion; tutorial step and tip completion or opt out, team creation page view, team name and URL entry, team creation completion, clicks on all form elements, buttons, textboxes and links on sign up page, team selection page, and team creation pages
  - *Sign-in Diagnostics:* Login succeeded or failed for email, LDAP, or SAML/SSO; logout succeeded; switched authentication method from email to LDAP or SAML/SSO or vice versa; reset password; updated password
  - *Navigation Discovery Diagnostics:* Joined a channel from the "More" list, through an invite or by clicking a public link; created a channel, direct, or group direct message conversation; renamed, joined, left or deleted an existing channel; updated header or purpose; added or removed members; updated channel notification preferences; loaded more messages in a channel; switched a channel or a team; opened the "More" modal for channels or direct message conversations; updated team name; invited members; updated profile and Channels settings
  - *Core Feature Discovery Diagnostics:* Created, edited or deleted a message; posted a message containing a hashtag, link, mention or file attachment; searched for a term; searched for saved posts or recent mentions
  - *Advanced Feature Discovery Diagnostics:* Reacted to a message; favorited or unfavorited a channel; saved or unsaved a message; pinned or unpinned a message; replied to a message; expanded the right-hand sidebar; started or finished a WebRTC video call (only in v5.5 and earlier); created or deleted a personal access token; added or removed post:all or post:channels permission; created a category in the sidebar
  - *Integration Discovery Diagnostics:* Created or triggered a webhook or slash command; created, authorized or deleted an OAuth 2.0 app; created, posted, or deleted a custom emoji
  - *Plugin Discovery Diagnostics:* Number of installed plugins containing either server or webapp portions, or both; number of those plugins being activated
  - *Plugin Marketplace Diagnostics:* Plugin ID, current version, and target version for all install and update events. Only sent when the default Marketplace is configured
  - *Plugin telemetry:* Search terms used in Marketplace on cloud workspaces will be recorded
  - *Commercial License Diagnostics (Enterprise Edition only):* Uploaded an Enterprise license key to the server
  - *Mobile Performance Diagnostics:* Load times for starting the app, switching channels, and switching teams
  - *Permissions Discovery Diagnostics (Enterprise Edition only):* Provides all the permissions configured for each role for the System Scheme and each Team Override Scheme created in the system. Scheme ID; Team Admin permissions; Team user permissions; Channel Admin permissions; Channel user permissions; Number of teams the scheme is associated with
  - *Group Discovery Diagnostics:* Provides information related to AD/LDAP (Enterprise Edition only) and custom groups (Enterprise and Professional Edition only), including number of unique users in groups, number of groups synchronized to Mattermost, teams and channels associated to groups, teams and channels synchronized with groups, and number of group members.
  - *System Console Menu Discovery Diagnostics:* Clicks on the hamburger menu items of the System Console, including Administrator's Guide, Troubleshooting Forum, Commercial Support, About Mattermost, and clicks on the left-hand side navigation menu items
  - *In Product Notices Diagnostics:* Notices viewed, and the notices on which an action button was clicked.
  - *Collapsed Reply Threads:* Clicks to reply to a thread, reply using the footer element, filter threads by unread, mark as read, access to global threads section.

Playbooks telemetry
-------------------

Playbooks metadata is collected and sent every 24 hours. Visit the `playbooks telemetry file <https://github.com/mattermost/mattermost-plugin-playbooks/blob/master/server/telemetry/rudder.go>`_ for details about the types of metadata collected.

Boards telemetry
----------------

Boards metadata is collected and sent every 24 hours. Visit the `boards telemetry file <https://github.com/mattermost/focalboard/blob/main/webapp/src/telemetry/telemetryClient.ts>`_ for information about the action and event data collected.

Other telemetry information that we collect is:

**Server telemetry**

Boards Plugin Information

- Boards Version and Build Number
- Boards Edition 
- Operating System for Boards server
- The server diagnostic ID
      
Configuration Information

- ServerRoot is default server root (``true``/``false``)
- Port is default port (``true``/``false``)
- UseSSL (``true``/``false``)
- Database Type 
- Single User (``true``/``false``)
    
User Count Information

- Registered User Count
- Daily Active User Count
- Weekly Active User Count
- Monthly Active User Count
    
Block Count Information

- Block Counts By Type
    
Workspace Information

- Workspace Count

**Web app event activity**

Load Board View

- ``UserID``: Unique identifier of the server.
- ``UserActualID``: Unique identifier of the user who initiated the action.
- ``Event``: Type of the event. Only the ``view`` event is currently monitored.
- ``View Type`` (``board``, ``table``, ``gallery``).

Apps framework telemetry
------------------------

The following list details the types of Apps Framework metadata we collect:

**Data collected for all event types**

- ``PluginVersion``: Version of the plugin.
- ``ServerVersion``: Version of the server the plugin is running on.
- ``UserID``: Unique identifier of the server.
- ``appID``: ID of the App that triggers the event.
- ``Event``: Type of the event. There are three event types that are tracked: ``install``, ``uninstall``, ``call``, ``oauthComplete``.

**Data collected in install and uninstall events**

- ``appType``: Type of the App installed (e.g., HTTP, AWS).

**Data collected in call events**

- ``location``: Call location.
- ``type``: Call type. Right now only submit calls are tracked.

**Data collected in oauthComplete events**

- ``UserActualID``: User ID of the user completing the OAuth flow.

Android Mobile App performance monitoring
-----------------------------------------

To improve Android app performance, we are collecting trace events and device information, collectively known as metrics, to identify slow performing key areas. Those metrics will be sent only from users using Android app beta build starting in version v1.20, who are logged in to servers that allow sending `diagnostic information <https://docs.mattermost.com/configure/configuration-settings.html#enable-diagnostics-and-error-reporting>`__.

Trace events
  Includes duration on how long the action took place like startup, team/channel switch, posts loading/update and channel drawer open/close. The naming convention is interpreted as ``[start observation]:[end observation]``, e.g. ``start:overall`` as from app start until fully rendered or ``post_list:thread`` as on press of post at post list until thread is opened.
  Complete list of trace events are the following:

  - start:overall
  - start:process_packages
  - start:content_appeared
  - start:select_server_screen
  - start:channel_screen
  - team:switch
  - channel:loading
  - channel:switch_loaded
  - channel:switch_initial
  - channel:close_drawer
  - channel:open_drawer
  - posts:loading
  - post_list:thread
  - post_list:permalink

Device information
  The information being collected is non-personally identifiable. Except for system_version, device information is based from `react-native-device-info <https://github.com/mattermost/react-native-device-info#react-native-device-info>`__ library.  Refer to the linked documentation to learn more.
  Complete list of device information are the following:

  - api_level
  - build_number
  - bundle_id
  - brand
  - country
  - device_id
  - device_locale
  - device_type
  - device_unique_id
  - height
  - is_emulator
  - is_tablet
  - manufacturer
  - max_memory
  - model
  - server_version
  - system_name
  - system_version
  - timezone
  - version
  - width

source/manage/team-channel-members.rst METASEP
Manage team and channel members
================================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

System Admins can manage channel configuration in the System Console, including:

- **Management:** Manage synchronization, moderation, and membership settings.
- **Promoting/demoting Team and Channel Admins:** Team and Channel Admins can be demoted via the System Console.
- **View channel members:** System Admins can view members of a channel without having to join the channel.
- **Member count:** Total member count in a team or channel.
- **Archive channels:** System Admins can archive channels without having to join the channel.

Teams
------

To view and manage team information, navigate to **System Console > Teams**. Teams can be managed by **Group Sync** or **Invite Only**. The type of management in use may affect the management options available for that team.

Select a team to view its configuration options.

Team profile
~~~~~~~~~~~~

The name and description of the team. 

System Admins can archive or unarchive the team from within **User Management > Teams > Team Management**. Archiving a team makes its contents inaccessible for all users. All related information is archived, including posts from the database. Before archiving a team, we recommend that you perform a database backup.

Archiving a team
^^^^^^^^^^^^^^^^

Select **Archive Team**, then select **Save**. Select **Archive** when prompted to confirm the team archive.

Alternatively, System Admins can use the mmctl ``mmctl team archive`` to archive teams. See the `mmctl product documentation <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-team-archive>`__ for details.

Unarchiving a team
^^^^^^^^^^^^^^^^^^

Select **Unarchive Team**, then select **Save**.

Alternatively, System Admins can use the mmctl ``mmctl team restore`` to archive teams. See the `mmctl product documentation <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-team-restore>`__ for details.

Team management
~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-only.rst
  :start-after: :nosearch:

- When **Sync Group Members** is enabled, the **Synced Groups** list is visible and additional groups can be added.
- When **Sync Group Members** is not enabled, invitation limitations can be selected.

Groups
~~~~~~~

.. include:: ../_static/badges/ent-only.rst
  :start-after: :nosearch:

You can add and remove groups, as well as promote or demote group members to Team Admin/Member roles.

Members
~~~~~~~~

A list of all members in a channel is visible to System Admins. Members can be added and removed from the team members and be promoted or demoted to a Team Admin/Member role. Use the role **Filter** to refine your search results. You can use one filter, or combine filters to search by multiple roles:

- Guest
- Member
- Team Admin
- System Admin

Channels
---------

To view and manage channel information, navigate to **System Console > Channels**. Channels can be managed by **Group Sync** or **Manual Invites**. The type of management in use may affect the management options available for that channel. Use the **Filter** to refine your search results. You can use one filter, or combine filters to search by channel and management type:

- Public channels
- Private channels
- Archived channels
- Channels that are synchronized to an AD/LDAP Group
- Channels with users who were invited manually (not synced from LDAP)

Select a channel to view its configuration options.

Profile
~~~~~~~

The name and description of the channel. To archive the channel, select **Archive Channel > Save**. The channel is still searchable in the **Channels** list. To unarchive the channel, select **Unarchive Channel** and **Save**.

Channel management
~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-only.rst
  :start-after: :nosearch:

- When **Sync Group Members** is enabled, the **Synced Groups** list is visible and additional groups can be added.
- When **Sync Group Members** is not enabled, you can select whether the channel is **Private** or **Public**.

Channel moderation
~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-pro-only.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

From Mattermost v5.22, the channel moderation settings allow Admins to restrict actions within specific channels. These actions include:

- **Make channel read-only:** The ability for Admins to turn off posting in specified channels.
- **Restrict reactions:** Turn off the ability for members and guests to post reactions.
- **Restrict channel mentions:** Turn off the ability for users to post channel wide mentions (@all/channel/here) in specified channels.
- **Channel member management:** Only Admins have the ability to add and remove channel members in the specified channels.

These settings are modified in **System Console > User Management > Channels**.

.. note:: 
  These settings are applicable only to Guests and Members. System, Team, and Channel Admins are not affected. If you wish to grant posting ability to a specific member, you must first promote that member to Channel Admin.

The availability of channel moderation settings can also be affected by existing system and team permissions configurations. If there are existing configurations that override the channel settings you would like to apply, it will be indicated in the user interface. These settings can then be adjusted in the relevant panel in the **Permissions** section of the System Console.

**Configure a channel so that members can post/reply/react but guests can only read and react.**

1. Navigate to **System Console > User Management > Channels**.
2. Select **Edit** next to the name of the channel you want to configure.
3. In the **Create Posts** panel, uncheck **Guests**.
4. In the **Post Reactions** panel, uncheck **Guests** if required.
5. Select **Save**.

The channel is available for all members and guests to access, but guests can only read messages and react to them.

**Create an Announcement Channel where only Channel Admins are able to post (read-only).**

1. Create a new channel (either Public or Private).
2. Navigate to **System Console > User Management > Channels**.
3. Select **Edit** next to the name of the channel you just created (you may need to search for it).
4. In the **Create Posts** panel, uncheck **Guests** and **Members**.
5. In the **Post Reactions** panel, uncheck **Guests** and **Members**.
6. Select **Save**.

The channel is available for all members and guests to access but only Admins can post to the channel.

Groups
~~~~~~

.. include:: ../_static/badges/ent-only.rst
  :start-after: :nosearch:

You can add and remove groups, as well as promote or demote group members to Team Admin/Member roles.

Members
~~~~~~~

A list of all members in a channel is visible to System Admins. Members can be added and removed from the team members and be promoted or demoted to a Team Admin/Member role. Use the role **Filter** to refine your search results. You can use one filter, or combine filters to search by multiple roles:

- Guest
- Member
- Channel Admin
- System Admin
source/manage/statistics.rst METASEP
Statistics
==========

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Statistics on users, posts, and channels are tracked for each system and team. Enterprise Editions have access to advanced system statistics.

.. note::

  To maximize performance for large Enterprise deployments, statistics for total posts, total hashtag posts, total file posts, posts per day, and active users with posts per day are disabled. You can re-enable them by changing the ``MaxUsersForStatistics`` value `in config.json <https://docs.mattermost.com/configure/configuration-settings.html#maximum-users-for-statistics>`__.

For advanced metrics for Enterprise deployments, `see performance monitoring documentation to learn more <https://docs.mattermost.com/scale/performance-monitoring.html>`__.

Site statistics
---------------

System statistics are viewable under **System Console > Reporting**. The data shown here is a cumulative sum across all teams on the system.

Total Users
    The total number of active accounts created on your system. Excludes deactivated accounts.

Total Teams
    The total number of teams created on your system.

Total Channels
    The total number of public channels and private channels created in all the teams on your system, including deleted channels. Doesn't include direct message channels.

Total Posts
    The total number of posts made in all the teams on your system, including deleted posts and posts made using automation.

Daily Active Users
  The total number of users who viewed the Mattermost site in the last 24 hours. Excludes bot users as of v5.14.

Monthly Active Users
  The total number of users who viewed the Mattermost site in the last 30 days. Excludes bot users as of v5.14.

Total Posts (graph)
    The total number of posts made on a certain day in all the teams on your system, including deleted posts and posts made using automation.

Total Posts from Bots (graph)
    The total number of posts made by a `bot account <https://developers.mattermost.com/integrate/admin-guide/admin-bot-accounts/>`_ on a certain day in all the teams on your system, including deleted posts and posts made using automation.

Active Users with Posts (graph)
    Users who made a post on a certain day in all the teams on your system, including system messages posted from the user's account.

Advanced system statistics
~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted-only.rst
  :start-after: :nosearch:

Mattermost Enterprise includes additional system statistics.

Total Sessions
    The number of active user sessions connected to your system. Expired sessions are not counted.

Total Commands
    The number of active slash commands currently set up on your system. Slash commands that are created and then removed in the **Integrations** menu are not counted.

Incoming Webhooks
    The number of active incoming webhooks currently setup on your system. Incoming webhooks that are created and then removed in the **Integrations** menu are not counted.

Outgoing Webhooks
    The number of active outgoing webhooks currently set up on your system. Outgoing webhooks that are created and then removed in the **Integrations** menu are not counted.

WebSocket Conns
    The number of active WebSocket connections currently on your server.

Master DB Conns
    The number of active connections currently on your master database.

Replica DB Conns
    The number of active connections currently on one or more of `your read replica databases <https://docs.mattermost.com/scale/high-availability-cluster.html#database-configuration>`__.

Total Playbooks
    The total number of playbooks on this server.

Total Playbook Runs
    The total number of runs (active and complete) on this server.

Channel Types
    This chart displays the number of public channels and private channels in a visual format, including channels that might have been deleted.

Posts, Files and Hashtags
    This chart displays the number of posts containing files, hashtags, or only text. Posts containing both files and hashtags are counted in both categories, and deleted posts are included.

Team statistics
---------------

Team Statistics are viewable under **System Console > Team Statistics**. The data shown here is a cumulative sum across this team only, and excludes posts made in Direct Message channels, which are not tied to a team.

Total Users
    The total number of active accounts on this team. Excludes deactivated accounts.

Public Channels
    The number of public channels created in this team. Excludes deleted channels.

Private Channels
    The number of private channels created in this team. Excludes deleted channels.

Total Posts
    The total number of posts made in this team, including deleted posts and posts made using automation. Excludes posts made in Direct Message channels, which are not tied to a team.

Total Posts (graph)
    The total number of posts made on a certain day in this team, including deleted posts and posts made using automation.

Active Users with Posts (graph)
    Users who made a post on a certain day in this team, including system messages posted from the user's account.

Recent Active Users
    Twenty most recent users who have logged in and had recent browser activity in Mattermost.

Newly Created Users
    Most recent users who have joined the team.

Troubleshooting/FAQ
-------------------

I see an error: "Not enough data for a meaningful representation"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

If the statistics page is loading endlessly and you get an error message saying "Not enough data for a meaningful representation", check whether you're using an ad blocker. An ad blocker can prevent this page from loading data. To test this, temporarily disable your ad blocker, or view the page in a browser without an ad blocker installed.

Can Team Admins review their own team's statistics?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted-only.rst
  :start-after: :nosearch:

Yes. In Mattermost Enterprise, you can enable Team Admins to see their team's statistics by modifying available System Admin roles. Learn more about System Admin roles, including how to manage privileges and assign roles, in the `Additional System Admin Roles <https://docs.mattermost.com/onboard/system-admin-roles.html>`__ documentation.

To enable Team Admins to access their team's statistics:

1. Go to **System Console > User Management > System Roles**, then edit the **Viewer** System Admin role. 

.. image:: ../images/edit-viewer-system-admin-role.png
   :alt: Enable Team Admins to access their team's statistics in the System Console by going to User Management > System Roles, and making changes to the Viewer role.

2. Under **Privileges**, expand the **Reporting** section, set **Team Statistics** to **Read only**, then set **Site Statistics** and **Server Logs** to **No access**.

3. Set all other privileges to **No access** to restrict all users with the **Viewer** role to access only the **Team Statistics** page in the System Console.   

.. image:: ../images/restrict-role-access.png
   :alt: On the Viewer page, restrict user access to the Team Statistics page by expanding the Reporting section, setting Site Statistics and Server Logs to No Access, and setting all other privileges to No Access. 

4. Under **Assigned People**, select **Add People** to assign Team Admins to the **Viewer** role, and enable them to access their team's statistics.

.. image:: ../images/assign-people-to-system-role.png
   :alt: On the Viewer page, specify which users can access the Team Statistics page by assigning specific users the Viewer admin role. 

5. Select **Save**.

.. note::

    System Admins must manually add people to or remove people from the **Viewer** System Admin role to address Team Admin changes, such as promotions or demotions.
source/manage/mmctl-command-line-tool.rst METASEP
mmctl command line tool
=======================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

The mmctl is a CLI tool for the Mattermost server which is installed locally and uses the Mattermost API, but may also be used remotely. Authentication is done with either login credentials or an authentication token. This mmctl tool is included from Mattermost v6.0, and it replaces the `CLI <https://docs.mattermost.com/manage/command-line-tools.html>`__. The mmctl can currently be used alongside the Mattermost CLI tool. The Mattermost CLI tool will be deprecated in a future release.

Being installed locally enables System Admins for both self-hosted and Cloud Mattermost instances to run CLI commands even in instances where there's no access to the server (e.g., via SSH).

This feature was developed to a large extent by community contributions and we'd like to extend our gratitude to the contributors who have worked on this project. We are currently accepting pull requests for Help Wanted issues in the `mattermost-server <https://github.com/mattermost/mattermost-server/issues?q=is%3Aissue+is%3Aopen+label%3A%22Help+Wanted%22+label%3AArea%2Fmmctl>`__ repo. You can learn more about the unit test coverage campaign for mmctl in the `Unit testing mmctl commands <https://mattermost.com/blog/unit-testing-mmctl-commands/>`__ blog post.

What's new in Mattermost v6.0?
------------------------------

The following new mmctl functionality is available from Mattermost v6.0:

- Output streaming that includes a progress indicator, easy navigation via paged output, output to file support, and basic piped output search support.
- Report mmctl issues to Mattermost using the link provided when unhandled errors and exceptions are encountered.
- Interactive user confirmations.

For more information on what's new in mmctl for Mattermost v6.0, see the `Mattermost v6.0 mmctl demo video <https://www.youtube.com/watch?v=zITNaPWP-80>`_.

.. raw:: html

   <div style="position: relative; padding-bottom: 50%; height: 0; overflow: hidden; max-width: 100%; height: auto;">
      <iframe src="https://www.youtube.com/embed/zITNaPWP-80" frameborder="0" allowfullscreen style="position: absolute; top: 0; left: 0; width: 100%; height: 95%;"></iframe>
   </div>

What's changed in Mattermost v6.0?
----------------------------------

The following mmctl changes are available from Mattermost v6.0:

- The inherited option ``config-path`` has changed to ``config``.
- The option ``password`` has changed to ``password-file``.
- Option names that contained underscores have been updated to use hyphens for consistency.

For more information on what's changed in mmctl for Mattermost v6.0, see the `Mattermost v6.0 mmctl changes video <https://www.youtube.com/watch?v=hmbSfSeWo4Y>`_.

.. raw:: html

   <div style="position: relative; padding-bottom: 50%; height: 0; overflow: hidden; max-width: 100%; height: auto;">
      <iframe src="https://www.youtube.com/embed/hmbSfSeWo4Y" frameborder="0" allowfullscreen style="position: absolute; top: 0; left: 0; width: 100%; height: 95%;"></iframe>
   </div>

.. note::
   
   You can continue to use existing options available from Mattermost v5.38 and earlier releases. However, we strongly recommend that customers upgrading to Mattermost v6.0 or later make use of the latest option syntax to take full advantage of the security and scaleability improvements available.

mmctl usage notes
-----------------

- System Admins have two ways to run ``mmctl`` commands: by downloading ``mmctl`` from the repository, or by building it directly. See the `mmctl readme <https://github.com/mattermost/mmctl#install>`__ for details.
- ``mmctl`` comes bundled with the Mattermost distribution, and is located in the ``bin`` folder of the installation, next to the ``CLI``.

  - We recommend you add the path to the Mattermost ``bin`` folder into your ``$PATH`` environment variable. This ensures that you can run mmctl commands locally regardless of your current directory location.
  - If the ``bin`` directory is not added to the ``$PATH`` environment variable, each time you use mmctl you must be in the ``bin`` directory to run mmctl commands, and the commands must be prefixed with ``./``. If you're working from a different directory, make sure you specify the full path to mmctl when running mmctl commands.
- Parameters in CLI commands are order-specific.
- You can use the ``--local`` flag with mmctl commands to run them without authentication by allowing communicating with the server through a Unix socket. See the `local mode <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#local-mode>`__ documentation for activation and usage details.
- If special characters (``!``, ``|``, ``(``, ``)``, ``\``, ``'``, and ``"``) are used, the entire argument needs to be surrounded by single quotes (e.g. ``-password 'mypassword!'``, or the individual characters need to be escaped out (e.g. ``password mypassword\!``).
- Team name and channel name refer to the handles, not the display names. So in the URL ``https://community.mattermost.com/core/channels/town-square`` team name would be ``core`` and channel name would be ``town-square``.

mmctl commands
--------------

- `mmctl auth`_ - Authentication Management
- `mmctl bot`_ - Bot Management
- `mmctl channel`_ - Channel Management
- `mmctl command`_ - Command Management
- `mmctl completion`_ - Generate autocompletion scripts for bash and zsh
- `mmctl config`_ - Configuration Management
- `mmctl docs`_ - Generate mmctl documentation
- `mmctl export`_ - Exports Management
- `mmctl extract`_ - Content Extraction Job Management
- `mmctl group`_ - Group Management
- `mmctl group channel`_ - Channel Group Management
- `mmctl group team`_ - Team Group Management
- `mmctl import`_ - Import Management
- `mmctl integrity`_ - Database Record Integrity
- `mmctl ldap`_ - LDAP Management
- `mmctl license`_ - License Management
- `mmctl logs`_ - Log Management
- `mmctl permissions`_ - Permissions Management
- `mmctl plugin`_ - Plugin Management
- `mmctl post`_ - Post Management
- `mmctl roles`_ - Roles Management
- `mmctl saml`_ - SAML Management
- `mmctl sampledata`_ - Generate sample data
- `mmctl system`_ - System Management
- `mmctl team`_ - Team Management
- `mmctl team users`_ - Team User Management
- `mmctl token`_ - Token Management
- `mmctl user`_ - User Management
- `mmctl version`_ - Version Management
- `mmctl webhook`_ - Webhook Management
- `mmctl websocket`_ - Websocket Management

**Options**

.. code-block:: sh

       --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
       --disable-pager                disables paged output
       -h, --help                     help for mmctl
       --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
       --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
       --json                         the output format will be in json format
       --local                        allows communicating with the server through a unix socket
       --quiet                        prevent mmctl to generate output for the commands
       --strict                       will only run commands if the mmctl version matches the server one
       --suppress-warnings            disables printing warning messages

Install mmctl
-------------

The mmctl tool comes bundled with the Mattermost package from v6.0. For customers that want to setup it independently from the package, or for versions prior to v6.0, there are different methods available to install mmctl.

**Using brew (Linux, macOS)**

Use this option on Linux and macOS if you have Homebrew installed.

.. code-block:: sh

   brew install mmctl

**Using go get (Linux, macOS, Windows)**

Use this option on Linux, macOS, and Windows if you have a ``go`` environment configured.

To add the project in your `$GOPATH` run the following command:

.. code-block:: sh

   go get -u github.com/mattermost/mmctl

**Using release package (Linux, macOS, Windows)**

Vist the `mmctl releases page <https://github.com/mattermost/mmctl/releases>`__ and download the appropriate release for your OS, and install the binary.

Build mmctl
------------

The ``mmctl`` tool uses ``go`` modules to manage dependencies, so you need to have installed
``go`` 1.11 or greater and compile the binary using:

.. code-block:: sh

  make build

Local mode
----------

.. include:: ../_static/badges/selfhosted-only.rst
  :start-after: :nosearch:

Local mode allows platform administrators with access to the Mattermost server to run mmctl commands against the API without needing to have a user registered. To ensure secure usage of this API, the server exposes a local socket that only a user with access to the server's file system can access. The requests coming from the socket are treated as authorized, so they can reach the handlers without requiring a user session.

The API that the socket exposes follows the same specification that can be found `in the API documentation <https://api.mattermost.com>`_, so mmctl is able to interact with it without needing any modifications. When a request comes in through the socket, it is flagged as local by the server, and this flag is taken into account when checking for session permissions to correctly authorize the sessions.

Activating local mode
~~~~~~~~~~~~~~~~~~~~~

To use local mode, the Mattermost server first needs to `have local mode enabled <https://docs.mattermost.com/configure/configuration-settings.html#enable-local-mode>`_. When local mode is enabled, a socket is created at ``/var/tmp/mattermost_local.socket`` by default.

Using local mode
~~~~~~~~~~~~~~~~

You need to append ``--local`` to the command you want to use, or set the environment variable as ``MMCTL_LOCAL=true``. To use a socket file other than the default, you need to set the environment variable to ``MMCTL_LOCAL_SOCKET_PATH``. This file must match the `server configuration setting <https://docs.mattermost.com/configure/configuration-settings.html#enable-local-mode-socket-location>`_.

In Mattermost versions prior to 5.26, only the commands ``config``, ``plugin``, and ``license`` are available.

Running mmctl tests
-------------------

.. include:: ../_static/badges/selfhosted-only.rst
  :start-after: :nosearch:

mmctl has two types of tests: unit tests and end to end tests. 

To run the unit tests, you need to execute:

.. code-block:: sh

  make test

To run the end to end test suite, you need to have a Mattermost server instance running. Check the `Developer Setup guide <https://developers.mattermost.com/contribute/server/developer-setup/>`_ for instructions around how to configure a local test server instance.

Once the development server is set up, cd into the ``mattermost-server directory``:

- Start it with ``make run``. To confirm that the instance is running correctly, you can access the web interface at ``http://localhost:8065``.
- Run ``make test-data`` to preload your server instance with initial seed data. Generated data such as users are typically used for logging, etc.

Change your directory to ``mmctl`` and run the end to end test suite with:

.. code-block:: sh

  make test-e2e

mmctl auth
----------

**Description**

Manage the credentials and authentication methods of remote Mattermost instances.
  
   Child Commands   

      - `mmctl auth clean`_ - Clean credentials
      - `mmctl auth current`_ - Display current credentials
      - `mmctl auth delete`_ - Delete authentication details
      - `mmctl auth list`_ - List registered credentials
      - `mmctl auth login`_ - Log into Mattermost instance
      - `mmctl auth renew`_ - Renew login credentials
      - `mmctl auth set`_ - Set login credentials

**Options**

.. code-block:: sh

   -h, --help   help for auth

mmctl auth clean
~~~~~~~~~~~~~~~~

**Description**

Clean the credentials associated with a Mattermost instance.

**Format**

.. code-block:: sh

   mmctl auth clean [flags]

**Examples**

.. code-block:: sh

   mmctl auth clean

**Options**

.. code-block:: sh

   -h, --help   help for clean

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl auth current
~~~~~~~~~~~~~~~~~~

**Description**

Show the currently stored user credentials.

**Format**

.. code-block:: sh

   mmctl auth current [flags]

**Examples**

.. code-block:: sh

   mmctl auth current

**Options**

.. code-block:: sh

   -h, --help   help for current

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl auth delete
~~~~~~~~~~~~~~~~~

**Description**

Delete a named credential.

**Format**

.. code-block:: sh

   mmctl auth delete [server name] [flags]

**Examples**

.. code-block:: sh

   mmctl auth delete local-server

**Options**

.. code-block:: sh

   -h, --help   help for delete

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages
   
mmctl auth list
~~~~~~~~~~~~~~~~

**Description**

Print a list of registered credentials.

**Format**

.. code-block:: sh

   mmctl auth list [flags]

**Examples**

.. code-block:: sh

   mmctl auth list

**Options**

.. code-block:: sh

   -h, --help   help for auth list

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl auth login
~~~~~~~~~~~~~~~~

**Description**

Log in to an instance and store credentials.

**Format**

.. code-block:: sh

   mmctl auth login [instance url] --name [server name] --username [username] --password-file [password-file] [flags]

**Examples**

.. code-block:: sh

   mmctl auth login https://mattermost.example.com
   mmctl auth login https://mattermost.example.com --name local-server --username sysadmin --password-file mysupersecret.txt
   mmctl auth login https://mattermost.example.com --name local-server --username sysadmin --password-file mysupersecret.txt --mfa-token 123456
   mmctl auth login https://mattermost.example.com --name local-server --access-token myaccesstoken

**Options**

.. code-block:: sh

   -t, --access-token-file string   Access token file to be read to use instead of username/password
   -h, --help                       help for login
   -m, --mfa-token string           MFA token for the credentials
   -n, --name string                Name for the credentials
       --no-activate                If present, it won't activate the credentials after login
   -f, --password-file string       Password file to be read for the credentials
   -u, --username string            Username for the credentials

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages
   
mmctl auth renew
~~~~~~~~~~~~~~~~

**Description**

Renew the credentials for a given server.

**Format**

.. code-block:: sh

   mmctl auth renew [flags]

**Examples**

.. code-block:: sh

   mmctl auth renew local-server

**Options**

.. code-block:: sh

   -t, --access-token-file string   Access token file to be read to use instead of username/password
   -h, --help                       help for renew
   -m, --mfa-token string           MFA token for the credentials
   -f, --password-file string       Password file to be read for the credentials

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl auth set
~~~~~~~~~~~~~~

**Description**

Set credentials to use in the following commands.

**Format**

.. code-block:: sh

   mmctl auth set [server name] [flags]

**Examples**

.. code-block:: sh

   mmctl auth set local-server

**Options**

.. code-block:: sh

   -h, --help   help for set

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

Authenticate to a server (e.g. >mmctl auth login https://test.mattermost.com), then enter your username and password (and MFA token if MFA is enabled on the account).

**Password**

.. code-block:: sh

   $ mmctl auth login https://community.mattermost.com --name community --username my-username --password-file mysupersecret

The ``login`` command can also work interactively, so if you leave any required flag empty, ``mmctl`` will ask you for it interactively:

.. code-block:: sh

   $ mmctl auth login https://community.mattermost.com
   Connection name: community
   Username: my-username
   Password File:

**MFA**

To log in with MFA, use the ``--mfa-token`` flag:

.. code-block:: sh

   $ mmctl auth login https://community.mattermost.com --name community --username my-username --password-file mysupersecret --mfa-token 123456

Access tokens
^^^^^^^^^^^^^

You can generate and use a personal access token to authenticate with a server, instead of using username and password to log in:

.. code-block:: sh

   $ mmctl auth login https://community.mattermost.com --name community --access-token MY_ACCESS_TOKEN

Alternatively, you can log in to your Mattermost server with a username and password:

.. code-block:: sh

   $ mmctl auth login https://my-instance.example.com --name my-instance --username john.doe --password-file mysupersecret
   credentials for my-instance: john.doe@https://my-instance.example.com stored

We can check the currently stored credentials with:

.. code-block:: sh

   $ mmctl auth list

   | Active |        Name | Username |                     InstanceUrl |
   |--------|-------------|----------|---------------------------------|
   |      * | my-instance | john.doe | https://my-instance.example.com |

And now we can run commands normally:

.. code-block:: sh

   $ mmctl user search john.doe
   id: qykfw3t933y38k57ubct77iu9c
   username: john.doe
   nickname:
   position:
   first_name: John
   last_name: Doe
   email: john.doe@example.com
   auth_service:

Installing shell completions
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

To install the shell completions for bash, add the following line to your ``~/.bashrc`` or ``~/.profile`` file:

.. code-block:: sh

   source <(mmctl completion bash)

For zsh, add the following line to your ``~/.zshrc`` file:

.. code-block:: sh

   source <(mmctl completion zsh)

mmctl bot
---------

Manage bots.

   Child Commands
      - `mmctl bot assign`_ - Assign bot ownership
      - `mmctl bot create`_ - Create a new bot
      - `mmctl bot disable`_ - Disable a bot
      - `mmctl bot enable`_ - Enable a bot
      - `mmctl bot list`_ - List all bots
      - `mmctl bot update`_ - Update bot configuration

**Options**

.. code-block:: sh

   -h, --help   help for bot

mmctl bot assign
~~~~~~~~~~~~~~~~

**Description**

Assign the ownership of a bot to another user.

**Format**

.. code-block:: sh

   mmctl bot assign [bot-username] [new-owner-username] [flags]

**Examples**

.. code-block:: sh

   mmctl bot assign testbot user2

**Options**

.. code-block:: sh

   -h, --help              help for assign

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl bot create
~~~~~~~~~~~~~~~~

**Description**

Create a bot.

**Format**

.. code-block:: sh

   mmctl bot create [username] [flags]

**Examples**

.. code-block:: sh

   mmctl bot create testbot

**Options**

.. code-block:: sh

   --description string    Optional. The description text for the new bot.
   --display-name string   Optional. The display name for the new bot.
   -h, --help              help for create
   --with-token            Optional. Auto genreate access token for the bot.

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl bot disable
~~~~~~~~~~~~~~~~~

**Description**

Disable an enabled bot.

**Format**

.. code-block:: sh

   mmctl bot disable [username] [flags]

**Examples**

.. code-block:: sh

   mmctl bot disable testbot

**Options**

.. code-block:: sh

   -h, --help     help for disable

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl bot enable
~~~~~~~~~~~~~~~~

**Description**

Enable a disabled bot.

**Format**

.. code-block:: sh

   mmctl bot enable [username] [flags]

**Examples**

.. code-block:: sh

   mmctl bot enable testbot

**Options**

.. code-block:: sh

   -h, --help              help for enable

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl bot list
~~~~~~~~~~~~~~

**Description**

List the bot's users.

**Format**

.. code-block:: sh

   mmctl bot list [flags]

**Examples**

.. code-block:: sh

   mmctl bot list

**Options**

.. code-block:: sh

   --all        Optional. Show all bots (including deleleted and orphaned)
   -h, --help   help for list
   --orphaned   Optional. Only show orphaned bots

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl bot update
~~~~~~~~~~~~~~~~

**Description**

Update bot information.

**Format**

.. code-block:: sh

   mmctl bot update [username] [flags]

**Examples**

.. code-block:: sh

   mmctl bot update testbot --username newbotusername

**Options**

.. code-block:: sh

   --description string    Optional. The new description text for the bot
   --display-name string   Optional. The new display name for the bot
   -h, --help              help for update
   --username string       Optional. The new username for the bot

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl channel
--------------

Manage channels.

   Child Commands
      -  `mmctl channel archive`_ - Archive a channel
      -  `mmctl channel create`_ - Create a channel
      -  `mmctl channel delete`_ - Delete a channel
      -  `mmctl channel list`_ - List all channels on specified teams
      -  `mmctl channel make-private`_ - Set a channel's type to "private"
      -  `mmctl channel modify`_ - Modify a channel's type (private/public)
      -  `mmctl channel move`_ - Move channels to the specified team
      -  `mmctl channel rename`_ - Rename a channel
      -  `mmctl channel restore`_ - (Deprecated) Restore a channel from the archive
      -  `mmctl channel search`_ - Search a channel by name
      -  `mmctl channel unarchive`_ - Unarchive a channel
      -  `mmctl channel users`_ - Manage channel users
      -  `mmctl channel users add`_ - Add a user to a channel
      -  `mmctl channel users remove`_ - Remove a user from a channel

**Options**

.. code-block:: sh

   -h, --help   help for channel

mmctl channel archive
~~~~~~~~~~~~~~~~~~~~~

**Description**

Archive channels along with all related information including posts from the database. Channels can be specified by ``[team]:[channel]`` (i.e., ``myteam:mychannel``), or by channel ID.

**Format**

.. code-block:: sh

   mmctl channel archive [channels] [flags]

**Examples**

.. code-block:: sh

   mmctl channel archive myteam:mychannel

**Options**

.. code-block:: sh

   -h, --help   help for archive

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl channel create
~~~~~~~~~~~~~~~~~~~~

**Description**

Create a channel.

**Format**

.. code-block:: sh

   mmctl channel create [flags]

**Examples**

.. code-block:: sh

   mmctl channel create --team myteam --name mynewchannel --display-name "My New Channel"
   mmctl channel create --team myteam --name mynewprivatechannel --display-name "My New Private Channel" --private

**Options**

.. code-block:: sh
   
   --display-name string   Channel Display Name
   --header string         Channel header
   -h, --help              help for create
   --name string           Channel Name
   --private               Create a private channel
   --purpose string        Channel purpose
   --team string           Team name or ID

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl channel delete
~~~~~~~~~~~~~~~~~~~~

**Description**

Permanently delete channels along with all related information including posts from the database.

.. note::
   Requires the `Enable API Channel Deletion <https://docs.mattermost.com/configure/configuration-settings.html#enable-api-channel-deletion>`__ configuration setting to be enabled. If this configuration setting is disabled, attempting to delete the channel using mmctl fails.

**Format**

.. code-block:: sh

   mmctl channel delete [channels] [flags]

**Examples**

.. code-block:: sh

   mmctl channel delete myteam:mychannel

**Options**

.. code-block:: sh

   --confirm       Confirm you really want to delete the channel and a database backup has been performed.
   -h, --help      help for delete

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl channel list
~~~~~~~~~~~~~~~~~~~~

**Description**

List all Public, Private, and archived channels on specified teams. Archived channels are appended with ``(archived)``. Private channels the user is a member of, or has access to, are appended with ``(private)``.

**Format**

.. code-block:: sh

   mmctl channel list [teams] [flags]

**Examples**

.. code-block:: sh

   mmctl channel list myteam

**Options**

.. code-block:: sh

   -h, --help   help for list

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl channel make-private
~~~~~~~~~~~~~~~~~~~~~~~~~~

**Description**

Set the type of a channel from Public to Private. Channel can be specified by ``[team]:[channel]`` (e.g., ``myteam:mychannel``), or by channel ID.

**Format**

.. code-block:: sh

   mmctl channel make-private [channel] [flags]

**Examples**

.. code-block:: sh

   mmctl channel make-private myteam:mychannel

**Options**

.. code-block:: sh

   -h, --help   help for make-private

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl channel modify
~~~~~~~~~~~~~~~~~~~~

**Description**

Change the Public/Private type of a channel. Channel can be specified by ``[team]:[channel]`` (e.g., ``myteam:mychannel``), or by channel ID.

**Format**

.. code-block:: sh

   mmctl channel modify [channel] [flags]

**Examples**

.. code-block:: sh

   mmctl channel modify myteam:mychannel --private
   mmctl channel modify channelId --public

**Options**

.. code-block:: sh

   -h, --help  help for modify
   --private   Convert the channel to a private channel
   --public    Convert the channel to a public channel

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl channel move
~~~~~~~~~~~~~~~~~~~

**Description**

Move the provided channels to the specified team. Validate that all users in the channel belong to the target team. Incoming/outgoing webhooks are moved along with the channel. Channels can be specified by ``[team]:[channel]`` (e.g., ``myteam:mychannel``), or by channel ID.

**Format**

.. code-block:: sh

   mmctl channel move [team] [channels] [flags]

**Examples**

.. code-block:: sh

   mmctl channel move newteam oldteam:mychannel

**Options**

.. code-block:: sh

   -h, --help    help for move
   --force       Remove users that are not members of target team before moving the channel.

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl channel rename
~~~~~~~~~~~~~~~~~~~~

**Description**

Rename an existing channel.

**Format**

.. code-block:: sh

   mmctl channel rename [channel] [flags]

**Examples**

.. code-block:: sh

   mmctl channel rename myteam:oldchannel --name 'new-channel' --display_name 'New Display Name'
   mmctl channel rename myteam:oldchannel --name 'new-channel'
   mmctl channel rename myteam:oldchannel --display_name 'New Display Name'

**Options**

.. code-block:: sh

   --display_name string   Channel Display Name
   -h, --help              help for rename
   --name string           Channel Name

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl channel restore
~~~~~~~~~~~~~~~~~~~~~

Deprecated in favor of `mmctl channel unarchive`_. Not used in Mattermost Server version v5.26 and later.

**Description**

Restore a previously deleted channel. Channels can be specified by ``[team]:[channel]`` (e.g., ``myteam:mychannel``), or by channel ID.

**Format**

.. code-block:: sh

   mmctl channel restore [channels] [flags]

**Examples**

.. code-block:: sh

   mmctl channel restore myteam:mychannel

**Options**

.. code-block:: sh

   -h, --help   help for restore

**Options inherited from parent commands**

.. code-block:: sh

   --format string               the format of the command output [plain, json] (default "plain")
   --insecure-sha1-intermediate  allows the use of insecure TLS protocols, such as SHA-1
   --local                       allows communicating with the server through a unix socket
   --strict                      will only run commands if the mmctl version matches the server one

mmctl channel search
~~~~~~~~~~~~~~~~~~~~

**Description**

Search a channel by channel name. Channels can be specified by team (e.g., ``--team myteam mychannel``), or by team ID.

**Format**

.. code-block:: sh

   mmctl channel search [channel]
   mmctl search --team [team] [channel] [flags]

**Examples**

.. code-block:: sh

   mmctl channel search mychannel
   mmctl channel search --team myteam mychannel

**Options**

.. code-block:: sh

   -h, --help      help for search
   --team string   team name or ID

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl channel unarchive
~~~~~~~~~~~~~~~~~~~~~~~

**Description**

Unarchive a previously archived channel. Channels can be specified by ``[team]:[channel]`` (e.g., ``myteam:mychannel``), or by channel ID.

**Format**

.. code-block:: sh

   mmctl channel unarchive [channels] [flags]
  
**Examples**

.. code-block:: sh

   mmctl channel unarchive myteam:mychannel

**Options**

.. code-block:: sh

   -h, --help   help for unarchive

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl channel users
~~~~~~~~~~~~~~~~~~~~

**Description**

Manage channel users.

**Options**

.. code-block:: sh

   -h, --help   help for users
  
**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl channel users add
~~~~~~~~~~~~~~~~~~~~~~~

**Description**

Add users to a channel.

**Format**

.. code-block:: sh

   mmctl channel users add [channel] [users] [flags]

**Examples**

.. code-block:: sh

   mmctl channel users add myteam:mychannel user@example.com username

**Options**

.. code-block:: sh

   -h, --help   help for add

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl channel users remove
~~~~~~~~~~~~~~~~~~~~~~~~~~

**Description**

Remove users from a channel.

**Format**

.. code-block:: sh

   mmctl channel users remove [channel] [users] [flags]

**Examples**

.. code-block:: sh

   mmctl channel users remove myteam:mychannel user@example.com username
   mmctl channel users remove myteam:mychannel --all-users

**Options**

.. code-block:: sh

   --all-users  Remove all users from the indicated channel
   -h, --help   help for remove
  
**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl command
-------------

Manage slash commands.

   Child Commands
      -  `mmctl command archive`_ - Archive a slash command
      -  `mmctl command create`_ - Create a custom command
      -  `mmctl command delete`_ - (Deprecated) Delete a specified slash command
      -  `mmctl command list`_ - List slash commands on specified teams
      -  `mmctl command modify`_ - Modify a slash command
      -  `mmctl command move`_ - Move a slash command to a different team
      -  `mmctl command show`_ - Show a custom slash command

**Options**

.. code-block:: sh

   -h, --help      help for command

mmctl command archive
~~~~~~~~~~~~~~~~~~~~~~

**Description**

Archive a slash command. Commands can be specified by command ID.

**Format**

.. code-block:: sh

   mmctl command archive [commandID] [flags]

**Examples**

.. code-block:: sh

   mmctl command archive commandID

**Options**

.. code-block:: sh

   -h, --help   help for archive

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl command create
~~~~~~~~~~~~~~~~~~~~

**Description**

Create a custom slash command for the specified team.

**Format**

.. code-block:: sh

   mmctl command create [team] [flags]

**Examples**

.. code-block:: sh

   mmctl command create myteam --title MyCommand --description "My Command Description" --trigger-word mycommand --url http://localhost:8000/my-slash-handler --creator myusername --response-username my-bot-username --icon http://localhost:8000/my-slash-handler-bot-icon.png --autocomplete --post

**Options**

.. code-block:: sh

   --autocomplete               Show Command in autocomplete list
   --autocompleteDesc string    Short Command Description for autocomplete list
   --autocompleteHint string    Command Arguments displayed as help in autocomplete list
   --creator string             Command Creator's Username (required)
   --description string         Command Description
   -h, --help                   help for create
   --icon string                Command Icon URL
   --post                       Use POST method for Callback URL
   --response-username string   Command Response Username
   --title string               Command Title
   --trigger-word string        Command Trigger Word (required)
   --url string                 Command Callback URL (required)

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl command delete
~~~~~~~~~~~~~~~~~~~~

Deprecated in favor of `mmctl command archive`_.

**Description**

Delete a slash command. Commands can be specified by command ID.

**Format**

.. code-block:: sh

   mmctl command delete [flags]

**Examples**

.. code-block:: sh

   mmctl command delete commandID

**Options**

.. code-block:: sh

   -h, --help   help for delete

**Options inherited from parent commands**

.. code-block:: sh

   --format string               the format of the command output [plain, json] (default "plain")
   --insecure-sha1-intermediate  allows the use of insecure TLS protocols, such as SHA-1
   --local                       allows communicating with the server through a unix socket
   --strict                      will only run commands if the mmctl version matches the server one

mmctl command list
~~~~~~~~~~~~~~~~~~~

**Description**

List all commands on specified teams.

**Format**

.. code-block:: sh

   mmctl command list [teams] [flags]

**Examples**

.. code-block:: sh

  mmctl command list myteam

**Options**

.. code-block:: sh

   -h, --help   help for list

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl command modify
~~~~~~~~~~~~~~~~~~~~

**Description**

Modify a slash command. Commands can be specified by command ID.

**Format**

.. code-block:: sh

   mmctl command modify [commandID] [flags]

**Examples**

.. code-block:: sh

   mmctl command modify commandID --title MyModifiedCommand --description "My Modified Command Description" --trigger-word mycommand --url http://localhost:8000/my-slash-handler --creator myusername --response-username my-bot-username --icon http://localhost:8000/my-slash-handler-bot-icon.png --autocomplete --post

**Options**

.. code-block:: sh

   --autocomplete               Show Command in autocomplete list
   --autocompleteDesc string    Short Command Description for autocomplete list
   --autocompleteHint string    Command Arguments displayed as help in autocomplete list
   --creator string             Command Creator's username, email or id (required)
   --description string         Command Description
   -h, --help                   help for modify
   --icon string                Command Icon URL
   --post                       Use POST method for Callback URL
   --response-username string   Command Response Username
   --title string               Command Title
   --trigger-word string        Command Trigger Word (required)
   --url string                 Command Callback URL (required)

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl command move
~~~~~~~~~~~~~~~~~~~

**Description**

Move a slash command to a different team. Commands can be specified by command ID.

**Format**

.. code-block:: sh

   mmctl command move [team] [commandID] [flags]

**Examples**

.. code-block:: sh

   mmctl command move newteam commandID

**Options**

.. code-block:: sh

   -h, --help   help for move

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl command show
~~~~~~~~~~~~~~~~~~~

**Description**

Show a custom slash command. Commands can be specified by command ID. Returns command ID, team ID, trigger word, display name, and creator username.

**Format**

.. code-block:: sh

   mmctl command show [commandID] [flags]

**Examples**

.. code-block:: sh
   
   mmctl command show commandID

**Options**

.. code-block:: sh

   -h, --help   help for show

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl completion
----------------

Generate autocompletion scripts for ``bash`` and ``zsh``.

   Child Commands
      -  `mmctl completion bash`_ - Edit the configuration settings
      -  `mmctl completion zsh`_ - Get the value of a configuration setting

**Options**

.. code-block:: sh

   -h, --help   help for completion

mmctl completion bash
~~~~~~~~~~~~~~~~~~~~~

**Description**

Generate the ``bash`` autocompletion scripts.

To load completion, run:

.. code-block:: sh

  . <(mmctl completion bash)

To configure your ``bash`` shell to load completions for each session, add the above line to your ``~/.bashrc``.

**Format**

.. code-block:: sh

   mmctl completion bash [flags]

**Options**

.. code-block:: sh

   -h, --help   help for bash

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl completion zsh
~~~~~~~~~~~~~~~~~~~~

**Description**

Generate the ``zsh`` autocompletion scripts.

To load completion, run:

.. code-block:: sh

   . <(mmctl completion zsh)

To configure your ``zsh`` shell to load completions for each session, add the above line to your ``~/.zshrc``.

**Format**

.. code-block:: sh

   mmctl completion zsh [flags]

**Options**

.. code-block:: sh

   -h, --help   help for zsh

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl config
------------

Configuration settings.

   Child Commands
      -  `mmctl config edit`_ - Edit the configuration settings
      -  `mmctl config get`_ - Get the value of a configuration setting
      -  `mmctl config migrate`_ - Migrate existing configuration between backends
      -  `mmctl config patch`_ - Patch the configuration
      -  `mmctl config reload`_ - Reload the server configuration
      -  `mmctl config reset`_ - Reset the configuration
      -  `mmctl config set`_ - Set the value of a configuration
      -  `mmctl config show`_ - Write the server configuration to STDOUT
      -  `mmctl config subpath`_ - Update client asset loading to use the configured subpath

**Options**

.. code-block:: sh

   -h, --help   help for config

mmctl config edit
~~~~~~~~~~~~~~~~~

**Description**

Open the editor defined in the EDITOR environment variable to modify the server's configuration. Once complete, save the file, then upload it to your server.

**Format**

.. code-block:: sh

   mmctl config edit [flags]

**Examples**

.. code-block:: sh

   mmctl config edit

**Options**

.. code-block:: sh

   -h, --help   help for edit

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl config get
~~~~~~~~~~~~~~~~~

**Description**

Get the value of a configuration setting by its name in dot notation.

**Format**

.. code-block:: sh

   mmctl config get [flags]

**Examples**

.. code-block:: sh

   mmctl config get SqlSettings.DriverName

**Options**

.. code-block:: sh

   -h, --help   help for get

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl config migrate
~~~~~~~~~~~~~~~~~~~~~

**Description**

Migrate a file-based configuration to (or from) a database-based configuration. Point the Mattermost server at the target configuration to start using it. This command only migrates the configuration data from one type to another. 

.. note::
  
   To change the store type to use the database, a System Admin needs to set a ``MM_CONFIG`` `environment variable <https://docs.mattermost.com/configure/configuation-in-mattermost-database.html#create-an-environment-file>`_ and restart the Mattermost server.

**Format**

.. code-block:: sh

   mmctl config migrate [from_config] [to_config] [flags]

**Examples**

.. code-block:: sh

   mmctl config migrate path/to/config.json "postgres://mmuser:mostest@localhost:5432/mattermost_test?sslmode=disable&connect_timeout=10"

**Options**

.. code-block:: sh

   -h, --help   help for migrate

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl config patch
~~~~~~~~~~~~~~~~~~

**Description**

Patch the server configuration with the specified configuration file.

**Format**

.. code-block:: sh

   mmctl config patch <config-file> [flags]

**Examples**

.. code-block:: sh

   mmctl config patch /path/to/config.json

**Options**

.. code-block:: sh

   -h, --help   help for reload

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl config reload
~~~~~~~~~~~~~~~~~~~

**Description**

Reload the server configuration and apply new settings.

**Format**

.. code-block:: sh

   mmctl config reload [flags]

**Examples**

.. code-block:: sh

   mmctl config reload

**Options**

.. code-block:: sh

   -h, --help   help for reload

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl config reset
~~~~~~~~~~~~~~~~~~~

**Description**

Reset the value of a configuration setting by its name in dot notation or a setting section. Accepts multiple values for array settings.

**Format**

.. code-block:: sh

   mmctl config reset [flags]

**Examples**

.. code-block:: sh

   mmctl config reset SqlSettings.DriverName LogSettings

**Options**

.. code-block:: sh

   --confirm   Confirm you really want to reset all configuration settings to the default value
   -h, --help  help for reset

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl config set
~~~~~~~~~~~~~~~~~

**Description**

Set the value of a config setting by its name in dot notation. Accepts multiple values for array settings.

**Format**

.. code-block:: sh

   mmctl config set [flags]

**Examples**

.. code-block:: sh

   mmctl config set SqlSettings.DriverName mysql
   mmctl config set SqlSettings.DataSourceReplicas "replica1" "replica2"

**Options**

.. code-block:: sh

   -h, --help   help for set

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl config show
~~~~~~~~~~~~~~~~~~

**Description**

Print the server configuration and write to STDOUT in JSON format.

**Format**

.. code-block:: sh

   mmctl config show [flags]

**Examples**

.. code-block:: sh

   mmctl config show

**Options**

.. code-block:: sh

   -h, --help   help for show

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl config subpath
~~~~~~~~~~~~~~~~~~~~~

**Description**

Update the hard-coded production client asset paths to take into account Mattermost running on a subpath. This command needs access to the Mattermost ``assets`` directory to be able to rewrite the paths.

**Format**

.. code-block:: sh

   mmctl config subpath [flags]

**Examples**

.. code-block:: sh

   # you can rewrite the assets to use a subpath
   mmctl config subpath --assets-dir /opt/mattermost/client --path /mattermost

   # the subpath can have multiple steps
   mmctl config subpath --assets-dir /opt/mattermost/client --path /my/custom/subpath

   # or you can fallback to the root path passing /
   mmctl config subpath --assets-dir /opt/mattermost/client --path /

**Options**

.. code-block:: sh

   -a, --assets-dir string   directory of the Mattermost assets in the local filesystem
   -h, --help                help for subpath
   -p, --path string         path to update the assets with

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl docs
----------

**Description**

Generate mmctl documentation.

**Format**

.. code-block:: sh

   mmctl docs [flags]

**Options**

.. code-block:: sh

   -d, --directory string   The directory where the docs would be generated in. (default "docs")
   -h, --help               help for docs

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl export
------------

Manage exports.

   Child Commands
      -  `mmctl export create`_ - Create an export file
      -  `mmctl export delete`_ - Delete an export file
      -  `mmctl export download`_ - Download export files
      -  `mmctl export job`_ - List and show export jobs
      -  `mmctl export job list`_ - List export jobs
      -  `mmctl export job show`_ - Show export job
      -  `mmctl export list`_ - List export files
  
**Options**

.. code-block:: sh

   -h, --help   help for group

mmctl export create
~~~~~~~~~~~~~~~~~~~

**Description**

Create an export file.

**Format**

.. code-block:: sh

  mmctl export create [flags]

**Options**

.. code-block:: sh

   --attachments     Set to true to include file attachments in the export file.
   -h, --help        help for create

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl export delete
~~~~~~~~~~~~~~~~~~~

**Description**

Delete an export file.

**Format**

.. code-block:: sh

  mmctl export delete [exportname] [flags]

**Example**

.. code-block:: sh

  mmctl export delete export_file.zip

**Options**

.. code-block:: sh

   -h, --help   help for delete

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages
   
mmctl export download
~~~~~~~~~~~~~~~~~~~~~

**Description**

Download export files.

**Format**

.. code-block:: sh

  mmctl export download [exportname] [filepath] [flags]

**Example**

.. code-block:: sh

   # You can indicate the name of the export and its destination path
   $ mmctl export download samplename sample_export.zip

   # If you only indicate the name, the path will match it
   $ mmctl export download sample_export.zip

**Options**

.. code-block:: sh

   -h, --help     help for download
   --resume       Set to true to resume an export download.
    
**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages
   
mmctl export job
~~~~~~~~~~~~~~~~

**Description**

List and show export jobs.

**Options**

.. code-block:: sh

   -h, --help   help for job

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl export job list
~~~~~~~~~~~~~~~~~~~~~

**Description**

List export jobs. Export files include the Job ID in the file name.

**Format**

.. code-block:: sh

  mmctl export job list [flags]

**Example**

.. code-block:: sh

  mmctl export job list

**Options**

.. code-block:: sh

   --all            Fetch all export jobs. ``--page`` flag will be ignored if provided
   -h, --help       help for list
   --page int       Page number to fetch for the list of export jobs
   --per-page int   Number of export jobs to be fetched (default 200)

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl export job show
~~~~~~~~~~~~~~~~~~~~~

**Description**

Show export job.

**Format**

.. code-block:: sh

  mmctl export job show [exportJobID] [flags]

**Example**

.. code-block:: sh

  mmctl export job show
  
**Options**

.. code-block:: sh

   -h, --help   help for show

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl export list
~~~~~~~~~~~~~~~~~

**Description**

List export files. Export files include the job ID in the file name.

**Format**

.. code-block:: sh

   mmctl export list [flags]

**Options**

.. code-block:: sh

   -h, --help   help for list

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl extract
-------------

Manage content extraction jobs.

   Child Commands
      -  `mmctl extract job`_ - List and show content extraction jobs
      -  `mmctl extract run`_ - Start a content extraction job

**Options**

.. code-block:: sh

   -h, --help   help for list

mmctl extract job
~~~~~~~~~~~~~~~~~~

List and show content extraction jobs.

Child Commands
      -  `mmctl extract job list`_ - List content extraction jobs
      -  `mmctl extract job show`_ - Show extract job

mmctl extract job list
~~~~~~~~~~~~~~~~~~~~~~

**Description**

List content extraction jobs.

**Format**

.. code-block:: sh

   mmctl extract job list [flags]

**Examples**

.. code-block:: sh

   mmctl extract job list

**Options**

.. code-block:: sh

   --all            Fetch all export jobs. --page flag will be ignore if provided
   -h, --help       help for list
   --page int       Page number to fetch for the list of export jobs
   --per-page int   Number of export jobs to be fetched (default 200)

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl extract job show
~~~~~~~~~~~~~~~~~~~~~~

**Description**

Show extract job.

**Format**

.. code-block:: sh

   mmctl extract job show [extractJobID] [flags]

**Examples**

.. code-block:: sh

   mmctl extract job show f3d68qkkm7n8xgsfxwuo498rah

**Options**

.. code-block:: sh

   -h, --help   help for disable

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl extract run
~~~~~~~~~~~~~~~~~

**Description**

Start a content extraction job.

**Format**

.. code-block:: sh

   mmctl extract run [flags]

**Examples**

.. code-block:: sh

   mmctl extract run

**Options**

.. code-block:: sh

   --from int   The timestamp of the earliest file to extract, expressed in seconds since the unix epoch.
   -h, --help   help for run
   --to int     The timestamp of the latest file to extract, expressed in seconds since the unix epoch. Defaults to the current time.

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl group
-----------

Manage channel and team groups.

   Child Commands
      -  `mmctl group channel`_ - Manage channel groups
      -  `mmctl group list-ldap`_ - List LDAP groups
      -  `mmctl group team`_ - Manage team groups

mmctl group channel
--------------------

Management of channel groups

   Child Commands
      -  `mmctl group channel disable`_ - Disable group channel constrains
      -  `mmctl group channel enable`_ - Enable group channel constrains
      -  `mmctl group channel list`_ - List channel groups
      -  `mmctl group channel status`_ - Check group status

**Options**

.. code-block:: sh

   -h, --help   help for group

mmctl group channel disable
~~~~~~~~~~~~~~~~~~~~~~~~~~~

**Description**

Disable group constrains in the specified channel.

**Format**

.. code-block:: sh

   mmctl group channel disable [team]:[channel] [flags]

**Examples**

.. code-block:: sh

   mmctl group channel disable myteam:mychannel

**Options**

.. code-block:: sh

   -h, --help   help for disable

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl group channel enable
~~~~~~~~~~~~~~~~~~~~~~~~~~

**Description**

Enable group constrains in the specified channel.

**Format**

.. code-block:: sh

   mmctl group channel enable [team]:[channel] [flags]

**Examples**

.. code-block:: sh

   mmctl group channel enable myteam:mychannel

**Options**

.. code-block:: sh

   -h, --help   help for enable

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl group channel list
~~~~~~~~~~~~~~~~~~~~~~~~

**Description**

List the groups associated with a channel.

**Format**

.. code-block:: sh

   mmctl group channel list [team]:[channel] [flags]

**Examples**

.. code-block:: sh

   mmctl group channel list myteam:mychannel

**Options**

.. code-block:: sh

   -h, --help   help for list

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl group channel status
~~~~~~~~~~~~~~~~~~~~~~~~~~

**Description**

Show the group constrain status for the specified channel.

**Format**

.. code-block:: sh

   mmctl group channel status [team]:[channel] [flags]

**Examples**

.. code-block:: sh

   mmctl group channel status myteam:mychannel

**Options**

.. code-block:: sh

   -h, --help   help for status

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl group list-ldap
~~~~~~~~~~~~~~~~~~~~~

**Description**

List LDAP groups.

**Format**

.. code-block:: sh

   mmctl group list-ldap [flags]

**Examples**

.. code-block:: sh

   mmctl group list-ldap

**Options**

.. code-block:: sh

   -h, --help   help for list-ldap

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl group team
----------------

Manage team groups.

   Child Commands
      -  `mmctl group team disable`_ - Disable group team constrains
      -  `mmctl group team enable`_ - Enable group team constrains
      -  `mmctl group team list`_ - List team groups
      -  `mmctl group team status`_ - Check group constrain status

**Options**

.. code-block:: sh

   -h, --help   help for group

mmctl group team disable
~~~~~~~~~~~~~~~~~~~~~~~~

**Description**

Disable group constrains in the specified team.

**Format**

.. code-block:: sh

   mmctl group team disable [team] [flags]

**Examples**

.. code-block:: sh
   
   mmctl group team disable myteam

**Options**

.. code-block:: sh

   -h, --help   help for disable

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl group team enable
~~~~~~~~~~~~~~~~~~~~~~~

**Description**

Enable group constrains in the specified team.

**Format**

.. code-block:: sh

   mmctl group team enable [team] [flags]

**Examples**

.. code-block:: sh

   mmctl group team enable myteam

**Options**

.. code-block:: sh

   -h, --help   help for enable

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl group team list
~~~~~~~~~~~~~~~~~~~~~

**Description**

List the groups associated with a team.

**Format**

.. code-block:: sh

   mmctl group team list [team] [flags]

**Examples**

.. code-block:: sh

   mmctl group team list myteam

**Options**

.. code-block:: sh

   -h, --help   help for list

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl group team status
~~~~~~~~~~~~~~~~~~~~~~~

**Description**

Show the group constrain status for the specified team.

**Format**

.. code-block:: sh

   mmctl group team status [team] [flags]

**Examples**

.. code-block:: sh

   mmctl group channel status myteam

**Options**

.. code-block:: sh

   -h, --help   help for status

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages
   
mmctl import
------------

**Description**

Manage imports.

   Child Commands
      -  `mmctl import job`_ - List and show import jobs
      -  `mmctl import job list`_ - List import jobs
      -  `mmctl import job show`_ - Show import job
      -  `mmctl import list`_ - List all import files
      -  `mmctl import list available`_ - List available import files
      -  `mmctl import list incomplete`_ - List incomplete import files uploads
      -  `mmctl import process`_ - Start an import job
      -  `mmctl import upload`_ - Upload import files

**Options**

.. code-block:: sh

   -h, --help   help for import

mmctl import job
~~~~~~~~~~~~~~~~

**Description**

List and show import jobs.

**Options**

.. code-block:: sh

   -h, --help   help for status

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl import job list
~~~~~~~~~~~~~~~~~~~~~

**Description**

List import jobs

**Format**

.. code-block:: sh

     mmctl import job list [flags]

**Examples**

.. code-block:: sh

     mmctl import job list

**Options**

.. code-block:: sh

   --all            Fetch all import jobs. --page flag will be ignore if provided
   -h, --help       help for list
   --page int       Page number to fetch for the list of import jobs
   --per-page int   Number of import jobs to be fetched (default 200)

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl import job show
~~~~~~~~~~~~~~~~~~~~~

**Description**

Show import job.

**Format**

.. code-block:: sh

     mmctl import job show [importJobID] [flags] 

**Examples**

.. code-block:: sh

     mmctl import job show f3d68qkkm7n8xgsfxwuo498rah

**Options**

.. code-block:: sh

   -h, --help   help for status

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl import list
~~~~~~~~~~~~~~~~~

**Description**

List all import files.

**Examples**

.. code-block:: sh

     mmctl import list

**Options**

.. code-block:: sh

   -h, --help   help for status

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages 

mmctl import list available
~~~~~~~~~~~~~~~~~~~~~~~~~~~

**Description**

List available import files.

**Format**

.. code-block:: sh

     mmctl import list available [flags] 

**Examples**

.. code-block:: sh

     mmctl import list available

**Options**

.. code-block:: sh

   -h, --help   help for status

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages 

mmctl import list incomplete
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

**Description**

List incomplete import files uploads.

**Format**

.. code-block:: sh

     mmctl import list incomplete [flags]

**Examples**

.. code-block:: sh

     mmctl import list incomplete

**Options**

.. code-block:: sh

   -h, --help   help for status

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages 

mmctl import process
~~~~~~~~~~~~~~~~~~~~

**Description**

Start an import job.

**Format**

.. code-block:: sh

     mmctl import process [importname] [flags] 

**Examples**

.. code-block:: sh

     mmctl import process 35uy6cwrqfnhdx3genrhqqznxc_import.zip

**Options**

.. code-block:: sh

   -h, --help   help for status

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages 

mmctl import upload
~~~~~~~~~~~~~~~~~~~

**Description**

Upload import files.

**Format**

.. code-block:: sh

     mmctl import upload [filepath] [flags] 

**Examples**

.. code-block:: sh

     mmctl import upload import_file.zip

**Options**

.. code-block:: sh

   -h, --help        help for upload
   --resume          Set to true to resume an incomplete import upload.
   --upload string   The ID of the import upload to resume.

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages 

mmctl integrity
---------------

**Description**

Perform a relational integrity check which returns information about any orphaned record found. This command can only be run using local mode.

**Format**

.. code-block:: sh

   mmctl integrity [flags]

**Options**

.. code-block:: sh

   --confirm       Confirm you really want to run a complete integrity check that may temporarily harm system performance
   -h, --help      help for integrity
   -v, --verbose   Show detailed information on integrity check results

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl ldap
----------

LDAP-related utilities.

   Child Commands
      -  `mmctl ldap idmigrate`_ - Migrate LDAP IdAttribute to a new value
      -  `mmctl ldap sync`_ - Sync all LDAP users and groups

**Options**

.. code-block:: sh

   -h, --help   help for ldap

mmctl ldap idmigrate
~~~~~~~~~~~~~~~~~~~~

**Description**

Migrate LDAP ``IdAttribute`` to a new value. Run this utility to change the value of your ID Attribute without your users losing their accounts. After running the command, you can change the ID Attribute to the new value in the System Console. For example, if your current ID Attribute was ``sAMAccountName`` and you wanted to change it to ``objectGUID``, you would:

1. Wait for an off-peak time when your users won’t be impacted by a server restart.
2. Run the command ``mmctl ldap idmigrate objectGUID``.
3. Update the config within the System Console to the new value ``objectGUID``.
4. Restart the Mattermost server.

**Format**

.. code-block:: sh

   mmctl ldap idmigrate <objectGUID> [flags]

**Examples**

.. code-block:: sh

   mmctl ldap idmigrate objectGUID

**Options**

.. code-block:: sh

   -h, --help   help for idmigrate

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl ldap sync
~~~~~~~~~~~~~~~

**Description**

Synchronize all LDAP users and groups now.

**Format**

.. code-block:: sh

   mmctl ldap sync [flags]

**Examples**

.. code-block:: sh

   mmctl ldap sync

**Options**

.. code-block:: sh

   -h, --help                  help for sync
   --include-removed-members   Include members who left or were removed from a group-synced team/channel

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl license
-------------

Manage the Mattermost license.

   Child Commands
      -  `mmctl license remove`_ - Remove the current license
      -  `mmctl license upload`_ - Upload a new license

**Options**

.. code-block:: sh

   -h, --help   help for license

mmctl license remove
~~~~~~~~~~~~~~~~~~~~

**Description**

Remove the current license and use Mattermost Team Edition.

**Format**

.. code-block:: sh

   mmctl license remove [flags]

**Examples**

.. code-block:: sh
   
   mmctl license remove

**Options**

.. code-block:: sh

   -h, --help   help for remove

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl license upload
~~~~~~~~~~~~~~~~~~~~

**Description**

Upload a license and replace the current license.

**Format**

.. code-block:: sh

   mmctl license upload [license] [flags]

**Examples**

.. code-block:: sh

   mmctl license upload /path/to/license/mylicensefile.mattermost-license

**Options**

.. code-block:: sh

   -h, --help   help for upload

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl logs
----------

**Description**

Display logs in a human-readable format. As the log format depends on the server, the ``--format`` flag cannot be used with this command.

**Format**

.. code-block:: sh

   mmctl logs [flags]

**Options**

.. code-block:: sh

   -h, --help         help for logs
   -l, --logrus       Use logrus for formatting
   -n, --number int   Number of log lines to retrieve (default 200)

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl permissions
-----------------

Manage permissions and roles.

   Child Commands
      -  `mmctl permissions add`_ - Add permissions to a role
      -  `mmctl permissions remove`_ - Remove permissions from a role
      -  `mmctl permissions reset`_ - Reset default permissions for a role
      -  `mmctl permissions role assign`_ - Assign users to role
      -  `mmctl permissions role show`_ - Show the role information
      -  `mmctl permissions role unassign`_ - Unassign users from a role

**Options**

.. code-block:: sh

   -h, --help   help for permissions

mmctl permissions add
~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-only.rst
  :start-after: :nosearch:

*Available in legacy Mattermost Enterprise Edition E10 and E20*

**Description**

Add one or more permissions to an existing role. 

**Format**

.. code-block:: sh

   mmctl permissions add <role> <permission...> [flags]

**Examples**

.. code-block:: sh

   mmctl permissions add system_user list_open_teams
   mmctl permissions add system_manager sysconsole_read_user_management_channels
   
**Options**

.. code-block:: sh

   -h, --help   help for add

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl permissions remove
~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-only.rst
  :start-after: :nosearch:

*Available in legacy Mattermost Enterprise Edition E10 and E20*

**Description**

Remove one or more permissions from an existing role. 

**Format**

.. code-block:: sh

   mmctl permissions remove <role> <permission...> [flags]

**Examples**

.. code-block:: sh

   mmctl permissions remove system_user list_open_teams
   mmctl permissions remove system_manager sysconsole_read_user_management_channels

**Options**

.. code-block:: sh

   -h, --help   help for remove

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl permissions reset
~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-only.rst
  :start-after: :nosearch:

*Available in legacy Mattermost Enterprise Edition E10 and E20*

**Description**

Reset the given role's permissions to the default settings and overwrite custom settings. 

**Format**

.. code-block:: sh

   mmctl permissions reset <role_name> [flags]

**Examples**

.. code-block:: sh

   # Reset the permissions of the 'system_read_only_admin' role.
   $ mmctl permissions reset system_read_only_admin

**Options**

.. code-block:: sh

   -h, --help   help for reset

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl permissions role assign
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-only.rst
  :start-after: :nosearch:

*Available in legacy Mattermost Enterprise Edition E10 and E20*

**Description**

Assign users to a role by username. 

**Format**

.. code-block:: sh

   mmctl permissions role assign <role_name> <username...> [flags]

**Examples**

.. code-block:: sh

   # Assign users with usernames 'john.doe' and 'jane.doe' to the role named 'system_admin'.
   mmctl permissions assign system_admin john.doe jane.doe
    
   # Examples using other system roles
   mmctl permissions assign system_manager john.doe jane.doe
   mmctl permissions assign system_user_manager john.doe jane.doe
   mmctl permissions assign system_read_only_admin john.doe jane.doe

**Options**

.. code-block:: sh

   -h, --help   help for assign

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl permissions role show
~~~~~~~~~~~~~~~~~~~~~~~~~~~

**Description**

Show all the information about a role.

**Format**

.. code-block:: sh

   mmctl permissions role show <role_name> [flags]

**Examples**

.. code-block:: sh

   mmctl permissions show system_user

**Options**

.. code-block:: sh

   -h, --help   help for show

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl permissions role unassign
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

**Description**

Unassign users from a role by username. Available in Mattermost Professional and Mattermost Enterprise.

**Format**

.. code-block:: sh

   mmctl permissions role unassign <role_name> <username...> [flags]

**Examples**

.. code-block:: sh

   # Unassign users with usernames 'john.doe' and 'jane.doe' from the role named 'system_admin'.
   mmctl permissions unassign system_admin john.doe jane.doe

   # Examples using other system roles
   mmctl permissions unassign system_manager john.doe jane.doe
   mmctl permissions unassign system_user_manager john.doe jane.doe
   mmctl permissions unassign system_read_only_admin john.doe jane.doe

**Options**

.. code-block:: sh
   
   -h, --help   help for unassign

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl plugin
-------------

Manage plugins.

   Child Commands
      -  `mmctl plugin add`_ - Add plugins
      -  `mmctl plugin delete`_ - Remove plugins
      -  `mmctl plugin disable`_ - Disable plugins
      -  `mmctl plugin enable`_ - Enable plugins
      -  `mmctl plugin install-url`_ - Install plugin from URL
      -  `mmctl plugin list`_ - List plugins
      -  `mmctl plugin marketplace`_ - Manage Marketplace plugins
  
**Options**

.. code-block:: sh

   -h, --help   help for plugin

mmctl plugin add
~~~~~~~~~~~~~~~~

**Description**

Add plugins to your Mattermost server.

**Format**

.. code-block:: sh

   mmctl plugin add [plugins] [flags]

**Examples**

.. code-block:: sh

   mmctl plugin add hovercardexample.tar.gz pluginexample.tar.gz

**Options**

.. code-block:: sh

   -f, --force   overwrite a previously installed plugin with the same ID, if any
   -h, --help    help for add

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl plugin delete
~~~~~~~~~~~~~~~~~~~~

**Description**

Delete previously uploaded plugins from your Mattermost server.

**Format**

.. code-block:: sh

   mmctl plugin delete [plugins] [flags]

**Examples**

.. code-block:: sh

   mmctl plugin delete hovercardexample pluginexample

**Options**

.. code-block:: sh

   -h, --help   help for delete

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl plugin disable
~~~~~~~~~~~~~~~~~~~~

**Description**

Disable plugins. Disabled plugins are immediately removed from the user interface and logged out of all sessions.

**Format**

.. code-block:: sh

   mmctl plugin disable [plugins] [flags]

**Examples**

.. code-block:: sh

   mmctl plugin disable hovercardexample pluginexample

**Options**

.. code-block:: sh

   -h, --help   help for disable

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl plugin enable
~~~~~~~~~~~~~~~~~~~

**Description**

Enable plugins for use on your Mattermost server.

**Format**

.. code-block:: sh

   mmctl plugin enable [plugins] [flags]

**Examples**

.. code-block:: sh

   mmctl plugin enable hovercardexample pluginexample

**Options**

.. code-block:: sh

   -h, --help   help for enable

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages
   
mmctl plugin install-url
~~~~~~~~~~~~~~~~~~~~~~~~

**Description**

Supply URLs to plugins compressed in a ``.tar.gz`` file. Plugins must be enabled in the server's config settings.

**Format**

.. code-block:: sh

   mmctl plugin install-url <url>... [flags]

**Examples**

.. code-block:: sh

   # You can install one plugin
   $ mmctl plugin install-url https://example.com/mattermost-plugin.tar.gz

   # Or install multiple plugins at a time
   $ mmctl plugin install-url https://example.com/mattermost-plugin-one.tar.gz https://example.com/mattermost-plugin-two.tar.gz

**Options**

.. code-block:: sh

   -f, --force   overwrite a previously installed plugin with the same ID, if any
   -h, --help    help for install-url

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages
   
mmctl plugin list
~~~~~~~~~~~~~~~~~~

**Description**

List all enabled and disabled plugins installed on your Mattermost server.

**Format**

.. code-block:: sh

   mmctl plugin list [flags]

**Examples**

.. code-block:: sh

   mmctl plugin list

**Options**

.. code-block:: sh

   -h, --help   help for list

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl plugin marketplace
-------------------------

Manage Marketplace plugins.

   Child Commands
      -  `mmctl plugin marketplace install`_ - Install a plugin from the Plugin Marketplace
      -  `mmctl plugin marketplace list`_ - List plugins on the Plugin Marketplace

**Options**

.. code-block:: sh

   -h, --help   help for marketplace

mmctl plugin marketplace install
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

**Description**

Install a plugin available on the Plugin Marketplace server. The latest version of the plugin will be installed.

**Format**

.. code-block:: sh

   mmctl plugin marketplace install <id> [flags]

**Examples**

.. code-block:: sh

   $ mmctl plugin marketplace install jitsi

**Options**

.. code-block:: sh

   -h, --help   help for install

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl plugin marketplace list
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

**Description**

Get all plugins available from the Plugin Marketplace server, merging data from locally installed plugins as well as prepackaged plugins shipped with the server.

**Format**

.. code-block:: sh

   mmctl plugin marketplace list [flags]
    
**Examples**

.. code-block:: sh

   # You can list all available plugins
   $ mmctl plugin marketplace list --all

   # Pagination options can be used
   $ mmctl plugin marketplace list --page 2 --per-page 10

   # Filtering narrows down the search
   $ mmctl plugin marketplace list --filter jit

   # You can retrieve only local plugins
   $ mmctl plugin marketplace list --local-only

**Options**

.. code-block:: sh

   --all             Fetch all plugins. --page flag will be ignore if provided
   --filter string   Filter plugins by ID, name or description
   -h, --help        help for list
   --local-only      Only retrieve local plugins
   --page int        Page number to fetch for the list of users
   --per-page int    Number of users to be fetched (default 200)

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl post
----------

Manage posts.

   Child Commands
      -  `mmctl post create`_ - Create a post
      -  `mmctl post list`_ - List posts for a channel

**Options**

.. code-block:: sh

   -h, --help   help for post

mmctl post create
~~~~~~~~~~~~~~~~~~

**Description**

Create a post.

**Format**

.. code-block:: sh

   mmctl post create [flags]

**Examples**

.. code-block:: sh

   mmctl post create myteam:mychannel --message "some text for the post"

**Options**

.. code-block:: sh

   -h, --help              help for create
   -m, --message string    Message for the post
   -r, --reply-to string   Post id to reply to

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl post list
~~~~~~~~~~~~~~~~

**Description**

List posts for a channel.

**Format**

.. code-block:: sh

   mmctl post list [flags]

**Examples**

.. code-block:: sh

   mmctl post list myteam:mychannel
   mmctl post list myteam:mychannel --number 20

**Options**

.. code-block:: sh

   -f, --follow         Output appended data as new messages are posted to the channel
   -h, --help           help for list
   -n, --number int     Number of messages to list (default 20)
   -i, --show-ids       Show posts ids
   -s, --since string   List messages posted after a certain time (ISO 8601)

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl roles
-----------

**Description**

Promote users to the System Admin role, or remove System Admin privileges from users.

**Format**

Promote users to the System Admin role:

.. code-block:: sh

   mmctl roles system_admin [users] [flags]

Remove System Admin privileges:

.. code-block:: sh

   mmctl roles member [users] [flags]

**Examples**

Promote a user to the System Admin role:

.. code-block:: sh

   mmctl roles system_admin john_doe

Promote multiple users to the System Admin role:

.. code-block:: sh

   mmctl roles system_admin john_doe jane_doe

Remove System Admin privileges from a user:

.. code-block:: sh

   mmctl roles member john_doe

Remove System Admin privileges from multiple users:

.. code-block:: sh

   mmctl roles member john_doe jane_doe

**Options**

.. code-block:: sh

   -h, --help   help for roles

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl saml
----------

SAML-related utilities.

Child Commands
      -  `mmctl saml auth-data-reset`_ - Reset AuthData field to Email

**Options**

.. code-block:: sh

   -h, --help   help for system

mmctl saml auth-data-reset
~~~~~~~~~~~~~~~~~~~~~~~~~~

**Description**

Resets the AuthData field for SAML users to their email. Run this utility after setting the 'id' SAML attribute to an empty value.

**Format**

.. code-block:: sh

   mmctl saml auth-data-reset [flags]

**Examples**

.. code-block:: sh

   # Reset all SAML users' AuthData field to their email, including deleted users
   $ mmctl saml auth-data-reset --include-deleted

   # Show how many users would be affected by the reset
   $ mmctl saml auth-data-reset --dry-run

   # Skip confirmation for resetting the AuthData
   $ mmctl saml auth-data-reset -y

   # Only reset the AuthData for the following SAML users
   $ mmctl saml auth-data-reset --users userid1,userid2

**Options**

.. code-block:: sh

   --dry-run           Dry run only
   -h, --help          help for auth-data-reset
   --include-deleted   Include deleted users
   --users strings     Comma-separated list of user IDs to which the operation will be applied
   -y, --yes           Skip confirmation

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl sampledata
----------------

**Description**

Generate a sample data file and store it locally, or directly import it to the remote server.

**Format**

.. code-block:: sh

   mmctl sampledata [flags]

**Examples**

.. code-block:: sh

   # You can create a sampledata file and store it locally
   $ mmctl sampledata --bulk sampledata-file.jsonl

   # Or you can simply print it to the STDOUT
   $ mmctl sampledata --bulk -

   # You can customize the amount of entities to create
   $ mmctl sampledata -t 7 -u 20 -g 4

   # The sampledata file can be directly imported into the remote server by not specifying a ``--bulk``` flag
   $ mmctl sampledata

   # Sample users can be created with profile pictures
   $ mmctl sampledata --profile-images ./images/profiles

**Options**

.. code-block:: sh

   -b, --bulk string                Optional. Path to write a JSONL bulk file instead of uploading into the remote server.
   --channel-memberships int        The number of sample channel memberships per user in a team. (default 5)
   --channels-per-team int          The number of sample channels per team. (default 10)
   --deactivated-users int          The number of deactivated users.
   --direct-channels int            The number of sample direct message channels. (default 30)
   --group-channels int             The number of sample group message channels. (default 15)
   -g, --guests int                 The number of sample guests. (default 1)
   -h, --help                       help for sampledata
   --posts-per-channel int          The number of sample post per channel. (default 100)
   --posts-per-direct-channel int   The number of sample posts per direct message channel. (default 15)
   --posts-per-group-channel int    The number of sample posts per group message channel. (default 30)
   --profile-images string          Optional. Path to folder with images to randomly pick as user profile image.
   -s, --seed int                   Seed used for generating the random data (Different seeds generate different data). (default 1)
   --team-memberships int           The number of sample team memberships per user. (default 2)
   -t, --teams int                  The number of sample teams. (default 2)
   -u, --users int                  The number of sample users. (default 15)

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl system
------------

System management commands for interacting with the server state and configuration.

   Child Commands
      -  `mmctl system clearbusy`_ - Clear the busy state
      -  `mmctl system getbusy`_ - Get the current busy state
      -  `mmctl system setbusy`_ - Set the busy state to ``true``
      -  `mmctl system status`_ - Print the status of the server
      -  `mmctl system version`_ - Print the remote server version build number

**Options**

.. code-block:: sh

   -h, --help   help for system

mmctl system clearbusy
~~~~~~~~~~~~~~~~~~~~~~

**Description**

Clear the busy state which re-enables non-critical services.

**Format**

.. code-block:: sh

   mmctl system clearbusy [flags]

**Examples**

.. code-block:: sh

   mmctl system clearbusy

**Options**

.. code-block:: sh

   -h, --help   help for clearbusy

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl system getbusy
~~~~~~~~~~~~~~~~~~~~

**Description**

Get the server busy state (high load) and timestamp corresponding to when the server busy flag will be automatically cleared.

**Format**

.. code-block:: sh

   mmctl system getbusy [flags]

**Examples**

.. code-block:: sh

   mmctl system getbusy

**Options**

.. code-block:: sh

   -h, --help   help for getbusy

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl system setbusy
~~~~~~~~~~~~~~~~~~~~

**Description**

Set the busy state to ``true`` for the specified number of seconds which disables non-critical services.

**Format**

.. code-block:: sh

   mmctl system setbusy -s [seconds] [flags]

**Examples**

.. code-block:: sh

   mmctl system setbusy -s 3600

**Options**

.. code-block:: sh

   -h, --help           help for setbusy
   -s, --seconds uint   Number of seconds until server is automatically marked as not busy (default 3600)

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl system status
~~~~~~~~~~~~~~~~~~~~

**Description**

Print the server status which is calculated using several basic server healthchecks.

**Format**

.. code-block:: sh

   mmctl system status [flags]

**Examples**

.. code-block:: sh

   mmctl system status

**Options**

.. code-block:: sh

   -h, --help   help for status

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl system version
~~~~~~~~~~~~~~~~~~~~

**Description**

Print the server version build number of the currently connected Mattermost instance.

**Format**

.. code-block:: sh

   mmctl system version [flags]

**Examples**

.. code-block:: sh

   mmctl system version

**Options**

.. code-block:: sh

   -h, --help   help for version

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl team
----------

Manage teams.

   Child Commands
      -  `mmctl team archive`_ - Archive some teams
      -  `mmctl team create`_ - Create teams
      -  `mmctl team delete`_ - Delete teams
      -  `mmctl team list`_ - List teams
      -  `mmctl team modify`_ - Modify teams
      -  `mmctl team rename`_ - Rename teams
      -  `mmctl team restore`_ - Restore teams
      -  `mmctl team search`_ - Search teams
      -  `mmctl team users`_ - Manage team users

**Options**

.. code-block:: sh

   -h, --help   help for team

mmctl team archive
~~~~~~~~~~~~~~~~~~

**Description**

Archive a team along with all related information including posts from the database.

**Format**

.. code-block:: sh

   mmctl team archive [teams] [flags]

**Examples**

.. code-block:: sh

   mmctl team archive myteam

**Options**

.. code-block:: sh

   --confirm   Confirm you really want to archive the team and a database backup has been performed
   -h, --help  help for archive

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl team create
~~~~~~~~~~~~~~~~~

**Description**

Create a team.

**Format**

.. code-block:: sh

   mmctl team create [flags]

**Examples**

.. code-block:: sh

   mmctl team create --name mynewteam --display_name "My New Team"
   mmctl team create --name private --display_name "My New Private Team" --private

**Options**

.. code-block:: sh

   --display_name string   Team Display Name
   --email string          Administrator Email (anyone with this email is automatically a team admin)
   -h, --help              help for create
   --name string           Team Name
   --private               Create a private team

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl team delete
~~~~~~~~~~~~~~~~~

**Description**

Permanently delete a team along with all related information including posts from the database.

.. note::
   Requires the `Enable API Team Deletion <https://docs.mattermost.com/configure/configuration-settings.html#enable-api-team-deletion>`__ configuration setting to be enabled. If this configuration setting is disabled, attempting to delete the team using mmctl fails.

**Format**

.. code-block:: sh

   mmctl team delete [teams] [flags]

**Examples**

.. code-block:: sh

   mmctl team delete myteam

**Options**

.. code-block:: sh

   --confirm   Confirm you really want to delete the team and a database backup has been performed
   -h, --help  help for delete

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl team list
~~~~~~~~~~~~~~~~

**Description**

List all teams on the server.

**Format**

.. code-block:: sh

   mmctl team list [flags]

**Examples**

.. code-block:: sh

   mmctl team list

**Options**

.. code-block:: sh

   -h, --help  help for list

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl team modify
~~~~~~~~~~~~~~~~~

**Description**

Modify a team's privacy setting to public or private.

**Format**

.. code-block:: sh

   mmctl team modify [teams] [flag] [flags]

**Examples**

.. code-block:: sh

   mmctl team modify myteam --private

**Options**

.. code-block:: sh

   -h, --help  help for modify
   --private   Modify team to be private
   --public    Modify team to be public

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl team rename
~~~~~~~~~~~~~~~~~

**Description**

Rename an existing team.

**Format**

.. code-block:: sh

   mmctl team rename [team] [flags]

**Examples**

.. code-block:: sh

   mmctl team rename old-team --display_name 'New Display Name'

**Options**

.. code-block:: sh

   --display_name string   Team Display Name
   -h, --help              help for rename

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl team restore
~~~~~~~~~~~~~~~~~~

**Description**

Restore archived teams.

**Format**

.. code-block:: sh

   mmctl team restore [teams] [flags]

**Examples**

.. code-block:: sh

   mmctl team restore myteam

**Options**

.. code-block:: sh

   -h, --help   help for restore

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl team search
~~~~~~~~~~~~~~~~~

**Description**

Search for teams based on name.

**Format**

.. code-block:: sh

   mmctl team search [teams] [flags]

**Examples**

.. code-block:: sh

   mmctl team search team1

**Options**

.. code-block:: sh

   -h, --help  help for search

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl team users
----------------

Manage team users.

   Child Commands
      -  `mmctl team users add`_ - Add users to a team
      -  `mmctl team users remove`_ - Remove users from a team

**Options**

.. code-block:: sh

   -h, --help       help for token

mmctl team users add
~~~~~~~~~~~~~~~~~~~~

**Description**

Add specified users to a team.

**Format**

.. code-block:: sh

   mmctl team users add [team] [users] [flags]

**Examples**

.. code-block:: sh

   mmctl team users add myteam user@example.com username

**Options**

.. code-block:: sh

   -h, --help  help for add

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl team users remove
~~~~~~~~~~~~~~~~~~~~~~~

**Description**

Remove specified users from a team.

**Format**

.. code-block:: sh

   mmctl team users remove [team] [users] [flags]

**Examples**

.. code-block:: sh

   mmctl team users remove myteam user@example.com username

**Options**

.. code-block:: sh

   -h, --help  help for remove

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl token
-----------

Manage users' access tokens.

   Child Commands
      -  `mmctl token generate`_ - Generate token for a user
      -  `mmctl token list`_ - List users' tokens
      -  `mmctl token revoke`_ - Revoke tokens for a user

**Options**

.. code-block:: sh

   -h, --help       help for token

mmctl token generate
~~~~~~~~~~~~~~~~~~~~

**Description**

Generate token for a user.

**Format**

.. code-block:: sh

   mmctl token generate [user] [description] [flags]

**Examples**

.. code-block:: sh

   mmctl generate testuser test-token

**Options**

.. code-block:: sh

   -h, --help     help for generate

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl token list
~~~~~~~~~~~~~~~~~

**Description**

List the tokens belonging to a user.

**Format**

.. code-block:: sh

   mmctl token list [user] [flags]

**Examples**

.. code-block:: sh

   mmctl user tokens testuser

**Options**

.. code-block:: sh

   --active         List only active tokens (default true)
   --all            Fetch all tokens. --page flag will be ignore if provided
   -h, --help       help for list
   --inactive       List only inactive tokens
   --page int       Page number to fetch for the list of users
   --per-page int   Number of users to be fetched (default 200)

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl token revoke
~~~~~~~~~~~~~~~~~~

**Description**

Revoke tokens for a user.

**Format**

.. code-block:: sh

   mmctl token revoke [token-ids] [flags]

**Examples**

.. code-block:: sh

   mmctl revoke testuser test-token-id

**Options**

.. code-block:: sh

   -h, --help       help for revoke

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl user
----------

Manage users.

   Child Commands
      -  `mmctl user activate`_ - Activate a user
      -  `mmctl user change-password`_ - Change a user's password
      -  `mmctl user convert`_ - Convert users to bots or convert bots to users
      -  `mmctl user create`_ - Create user
      -  `mmctl user deactivate`_ - Deactivate user
      -  `mmctl user delete`_ - Delete users
      -  `mmctl user deleteall`_ - Delete all users and all posts (local command only)
      -  `mmctl user demote`_ - Demote users to guests
      -  `mmctl user email`_ - Set user email
      -  `mmctl user invite`_ - Invite user
      -  `mmctl user list`_ - List users
      -  `mmctl user migrate_auth`_ - Bulk migrate user accounts authentication type
      -  `mmctl user reset_password`_ - Reset user password
      -  `mmctl user resetmfa`_ - Reset a user's MFA token
      -  `mmctl user search`_ - Search for a user
      -  `mmctl user username`_ - Change username of the user
      -  `mmctl user verify`_ - Mark user's email as verified

**Options**

.. code-block:: sh

   -h, --help       help for user

mmctl user activate
~~~~~~~~~~~~~~~~~~~~

**Description**

Activate users that have been deactivated.

**Format**

.. code-block:: sh

   mmctl user activate [emails, usernames, userIds] [flags]

**Examples**

.. code-block:: sh

   mmctl user activate user@example.com
   mmctl user activate username

**Options**

.. code-block:: sh

   -h, --help           help for activate

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl user change-password
~~~~~~~~~~~~~~~~~~~~~~~~~~

**Description**

Change the password of a user to the one provided. If the user is changing their own password, the flag ``--current`` must indicate the current password. The flag ``--hashed`` can be used to indicate that the new password has been introduced as already hashed.

**Format**

.. code-block:: sh

   mmctl user change-password <user> [flags]

**Examples**

.. code-block:: sh

   # If you have system permissions, you can change other user's passwords
   $ mmctl user change-password john_doe --password new-password

   # If you are changing your own password, you need to provide the current one
   $ mmctl user change-password my-username --current current-password --password new-password

   # You can ommit these flags to introduce them interactively
   $ mmctl user change-password my-username
   Are you changing your own password? (YES/NO): YES
   Current password:
   New password:

   # If you have system permissions, you can update the password with the already hashed new
   # password. The hashing method should be the same that the server uses internally.
   $ mmctl user change-password john_doe --password HASHED_PASSWORD --hashed

**Options**

.. code-block:: sh

   -c, --current string    The current password of the user. Use only if changing your own password
   --hashed                The supplied password is already hashed
   -h, --help              help for change-password
   -p, --password string   The new password for the user

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl user convert
~~~~~~~~~~~~~~~~~~

**Description**

Convert user accounts to bots, or convert bots to user accounts.

**Format**

.. code-block:: sh

   mmctl user convert (--bot [emails] [usernames] [userIds] | --user <username> --password PASSWORD [--email EMAIL]) [flags]

**Examples**

.. code-block:: sh

   # You can convert a user to a bot providing an email, an ID, or a username
   $ mmctl user convert user@example.com --bot

   # Or you can convert multiple users at a time
   $ mmctl user convert user@example.com anotherUser --bot

   # You can convert a bot to a user and specify the email and password that the user will have after conversion
   $ mmctl user convert botusername --email new.email@email.com --password password --user

**Options**

.. code-block:: sh

   --bot                If supplied, convert users to bots
   --email string       The email address for the converted user account. Required when the "bot" flag is set
   --firstname string   The first name for the converted user account. Required when the "bot" flag is set
   -h, --help           help for convert
   --lastname string    The last name for the converted user account. Required when the "bot" flag is set
   --locale string      The locale (e.g., EN, FR) for the converted new user account. Required when the "bot" flag is set
   --nickname string    The nickname for the converted user account. Required when the "bot" flag is set
   --password string    The password for converted new user account. Required when "user" flag is set
   --system_admin       If supplied, the converted user will be a System Admin. Defaults to false. Required when the "bot" flag is set
   --user               If supplied, convert a bot to a user
   --username string    Username for the converted user account. Required when the "bot" flag is set

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl user create
~~~~~~~~~~~~~~~~~

**Description**

Create a user.

**Format**

.. code-block:: sh

   mmctl user create [flags]

**Examples**

.. code-block:: sh

   # You can create a user
   $ mmctl user create --email user@example.com --username userexample --password Password1

   # You can define optional fields like first name, last name, and nickname
   $ mmctl user create --email user@example.com --username userexample --password Password1 --firstname User --lastname Example --nickname userex

   # You can also create the user as a System Admin
   $ mmctl user create --email user@example.com --username userexample --password Password1 --system-admin

   # You can verify user on creation if you have the correct permissions
   $ mmctl user create --email user@example.com --username userexample --password Password1 --system-admin --email-verified

**Options**

.. code-block:: sh

   --disable-welcome-email   Optional. If supplied, the new user will not receive a welcome email. Defaults to false
   --email string            Required. The email address for the new user account
   --email-verified          Optional. If supplied, the new user will have the email verified. Defaults to false
   --firstname string        Optional. The first name for the new user account
   --guest                   Optional. If supplied, the new user will be a guest. Defaults to false
   -h, --help                help for create
   --lastname string         Optional. The last name for the new user account
   --locale string           Optional. The locale (ex: en, fr) for the new user account
   --nickname string         Optional. The nickname for the new user account
   --password string         Required. The password for the new user account
   --system-admin            Optional. If supplied, the new user will be a system administrator. Defaults to false
   --username string         Required. Username for the new user account

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl user deactivate
~~~~~~~~~~~~~~~~~~~~~

**Description**

Deactivate users. Deactivated users are immediately logged out of all sessions and are unable to log back in.

**Format**

.. code-block:: sh

   mmctl user deactivate [emails, usernames, userIds] [flags]

**Examples**

.. code-block:: sh

   mmctl user deactivate user@example.com
   mmctl user deactivate username

**Options**

.. code-block:: sh

   -h, --help       help for deactivate

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl user delete
~~~~~~~~~~~~~~~~~

**Description**

Permanently delete users along with all related information including posts from the database. 

.. note::
   Requires the `Enable API User Deletion <https://docs.mattermost.com/configure/configuration-settings.html#enable-api-user-deletion>`__ configuration setting to be enabled. If this configuration setting is disabled, attempting to delete the user using mmctl fails.

**Format**

.. code-block:: sh

   mmctl user delete [users] [flags]

**Examples**

.. code-block:: sh

   mmctl user delete user@example.com

**Options**

.. code-block:: sh

   --confirm   Confirm you really want to delete the user and a database backup has been performed
   -h, --help  help for delete

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl user deleteall
~~~~~~~~~~~~~~~~~~~~

**Description**

Permanently delete all users and all related information including posts. This command can only be run in local mode.

**Format**

.. code-block:: sh

   mmctl user deleteall [flags]

**Examples**

.. code-block:: sh

   mmctl user deleteall

**Options**

.. code-block:: sh

   --confirm   Confirm you really want to delete the user and a database backup has been performed
   -h, --help  help for delete

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl user demote
^^^^^^^^^^^^^^^^^

**Description**

Demote a user to a guest.

**Format**

.. code-block:: sh

  mmctl user demote [users] [flags]

**Examples**

.. code-block:: sh

  mmctl user demote user1 user2  

**Options**

.. code-block:: sh

  -h, --help   help for demote

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages
   
mmctl user email
~~~~~~~~~~~~~~~~

**Description**

Change the email address associated with a user.

**Format**

.. code-block:: sh

  mmctl user email [user] [new email] [flags]

**Examples**

.. code-block:: sh

  mmctl user email testuser user@example.com
  
**Options**

.. code-block:: sh

  -h, --help       help for email

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl user invite
~~~~~~~~~~~~~~~~~

**Description**

Send an email invite to a user to join a team. You can invite a user to multiple teams by listing them. You can specify teams by name or ID.

**Format**

.. code-block:: sh

   mmctl user invite [email] [teams] [flags]

**Examples**

.. code-block:: sh

   mmctl user invite user@example.com myteam
   mmctl user invite user@example.com myteam1 myteam2

**Options**

.. code-block:: sh

   -h, --help       help for invite

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl user list
~~~~~~~~~~~~~~~~

**Description**

List all users.

**Format**

.. code-block:: sh

   mmctl user list [flags]

**Examples**

.. code-block:: sh

   mmctl user list

**Options**

.. code-block:: sh

   --all            Fetch all users. --page flag will be ignore if provided
   -h, --help       help for list
   --page int       Page number to fetch for the list of users
   --per-page int   Number of users to be fetched (default 200)
   --team string    If supplied, only users belonging to this team will be listed

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl user migrate_auth
~~~~~~~~~~~~~~~~~~~~~~~

**Description**

Migrate accounts from one authentication provider to another. For example, you can upgrade your authentication provider from email to LDAP.

**Format**

.. code-block:: sh

   mmctl user migrate_auth [from_auth] [to_auth] [migration-options] [flags]

**Examples**

.. code-block:: sh

   mmctl user migrate_auth email saml users.json

**Options**

.. code-block:: sh

   --auto         Automatically migrate all users. Assumes the usernames and emails are identical between Mattermost and SAML services. (saml only)
   --confirm      Confirm you really want to proceed with auto migration. (saml only)
   --force        Force the migration to occur even if there are duplicates on the LDAP server. Duplicates will not be migrated. (ldap only)
   -h, --help     help for migrate_auth

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl user promote
^^^^^^^^^^^^^^^^^^

**Description**

Promote a guest to a user.

**Format**

.. code-block:: sh

   mmctl user promote [guests] [flags]

**Examples**

.. code-block:: sh

   mmctl user promote guest1 guest2

**Options**

.. code-block:: sh

   -h, --help   help for promote

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl user reset_password
~~~~~~~~~~~~~~~~~~~~~~~~~

**Description**

Send users an email to reset their password.

**Format**

.. code-block:: sh

   mmctl user reset_password [users] [flags]

**Examples**

.. code-block:: sh

   mmctl user reset_password user@example.com

**Options**

.. code-block:: sh

   -h, --help       help for reset_password

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl user resetmfa
~~~~~~~~~~~~~~~~~~~~

**Description**

Turn off multi-factor authentication for a user. If MFA enforcement is enabled, the user will be forced to re-enable MFA as soon as they log in.

**Format**

.. code-block:: sh

   mmctl user resetmfa [users] [flags]

**Examples**

.. code-block:: sh

   mmctl user resetmfa user@example.com

**Options**

.. code-block:: sh

   -h, --help       help for resetmfa

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl user search
~~~~~~~~~~~~~~~~~~

**Description**

Search for users based on username, email, or user ID.

**Format**

.. code-block:: sh

   mmctl user search [users] [flags]

**Examples**

.. code-block:: sh

   mmctl user search user1@mail.com user2@mail.com

**Options**

.. code-block:: sh

   -h, --help       help for search

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl user username
~~~~~~~~~~~~~~~~~~~

**Description**

Change the username of the user.

**Format**

.. code-block:: sh

   mmctl user username [user] [new username] [flags]

**Examples**

.. code-block:: sh

   mmctl user username testuser newusername

**Options**

.. code-block:: sh

   -h, --help       help for version

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages
   
mmctl user verify
~~~~~~~~~~~~~~~~~

**Description**

Mark user's email as verified without requiring user to complete email verification path.

**Format**

.. code-block:: sh

   mmctl user verify [users] [flags]

**Examples**

.. code-block:: sh

   mmctl user verify user1

**Options**

.. code-block:: sh

   -h, --help       help for version

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl version
-------------

**Description**

Print the version of mmctl.

**Format**

.. code-block:: sh

   mmctl version [flags]

**Options**

.. code-block:: sh

   -h, --help       help for version

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl webhook
-------------

**Description**

Manage webhooks.

   Child Commands
      -  `mmctl webhook create-incoming`_ - Create an incoming webhook
      -  `mmctl webhook create-outgoing`_ - Create an outgoing webhook
      -  `mmctl webhook delete`_ - Delete webhooks
      -  `mmctl webhook list`_ - List webhooks
      -  `mmctl webhook modify-incoming`_ - Modify an incoming webhook
      -  `mmctl webhook modify-outgoing`_ - Modify an outgoing webhook
      -  `mmctl webhook show`_ - Show a webhook

**Options**

.. code-block:: sh

   -h, --help       help for webhook

mmctl webhook create-incoming
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

**Description**

Create an incoming webhook to allow external posting of messages to a specific channel.

**Format**

.. code-block:: sh

   mmctl webhook create-incoming [flags]

**Examples**

.. code-block:: sh

   mmctl webhook create-incoming --channel [channelID] --user [userID] --display-name [displayName] --description [webhookDescription] --lock-to-channel --icon [iconURL]

**Options**

.. code-block:: sh

   --channel string        Channel name or ID of the new webhook
   --description string    Incoming webhook description
   --display-name string   Incoming webhook display name
   -h, --help              help for create-incoming
   --icon string           Icon URL
   --lock-to-channel       Lock to channel
   --user string           The username, email, or ID of the user that the webhook should post as

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl webhook create-outgoing
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

**Description**

Create an outgoing webhook to allow external posting of messages from a specific channel.

**Format**

.. code-block:: sh

   mmctl webhook create-outgoing [flags]

**Examples**

.. code-block:: sh

   mmctl webhook create-outgoing --team myteam --user myusername --display-name mywebhook --trigger-word "build" --trigger-word "test" --url http://localhost:8000/my-webhook-handler
    mmctl webhook create-outgoing --team myteam --channel mychannel --user myusername --display-name mywebhook --description "My cool webhook" --trigger-when start --trigger-word build --trigger-word test --icon http://localhost:8000/my-slash-handler-bot-icon.png --url http://localhost:8000/my-webhook-handler --content-type "application/json"

**Options**

.. code-block:: sh

   --channel string             Channel name or ID
   --content-type string        Content-type
   --description string         Outgoing webhook description
   --display-name string        Outgoing webhook display name
   -h, --help                   help for create-outgoing
   --icon string                Icon URL
   --team string                Team name or ID (required)
   --trigger-when string        When to trigger webhook (exact: for first word matches a trigger word exactly, start: for first word starts with a trigger word) (default "exact")
   --trigger-word stringArray   Word to trigger webhook (required)
   --url stringArray            Callback URL (required)
   --user string                The username, email, or ID of the user that the webhook should post as (required)

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl webhook delete
~~~~~~~~~~~~~~~~~~~~

**Description**

Delete a webhook with a given ID.

**Format**

.. code-block:: sh

   mmctl webhook delete [flags]

**Examples**

.. code-block:: sh

   mmctl webhook delete [webhookID]

**Options**

.. code-block:: sh

   -h, --help   help for delete

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl webhook list
~~~~~~~~~~~~~~~~~~

**Description**

Print a list of all webhooks.

**Format**

.. code-block:: sh

   mmctl webhook list [flags]

**Examples**

.. code-block:: sh

   mmctl webhook list myteam

**Options**

.. code-block:: sh

   -h, --help   help for list

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl webhook modify-incoming
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

**Description**

Modify an existing incoming webhook by changing its title, description, channel, or icon URL.

**Format**

.. code-block:: sh

   mmctl webhook modify-incoming [flags]

**Examples**

.. code-block:: sh

   mmctl webhook modify-incoming [webhookID] --channel [channelID] --display-name [displayName] --description [webhookDescription] --lock-to-channel --icon [iconURL]

**Options**

.. code-block:: sh

   --channel string        Channel ID
   --description string    Incoming webhook description
   --display-name string   Incoming webhook display name
   -h, --help              help for modify-incoming
   --icon string           Icon URL
   --lock-to-channel       Lock to channel

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl webhook modify-outgoing
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

**Description**

Modify an existing outgoing webhook by changing its title, description, channel, icon, url, content-type, or triggers.

**Format**

.. code-block:: sh

   mmctl webhook modify-outgoing [flags]

**Examples**

.. code-block:: sh

   mmctl webhook modify-outgoing [webhookId] --channel [channelId] --display-name [displayName] --description "New webhook description" --icon http://localhost:8000/my-slash-handler-bot-icon.png --url http://localhost:8000/my-webhook-handler --content-type "application/json" --trigger-word test --trigger-when start

**Options**

.. code-block:: sh

   --channel string             Channel name or ID
   --content-type string        Content-type
   --description string         Outgoing webhook description
   --display-name string        Outgoing webhook display name
   -h, --help                   help for modify-outgoing
   --icon string                Icon URL
   --trigger-when string        When to trigger webhook (exact: for first word matches a trigger word exactly, start: for first word starts with a trigger word)
   --trigger-word stringArray   Word to trigger webhook
   --url stringArray            Callback URL

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl webhook show
~~~~~~~~~~~~~~~~~~

**Description**

Show the webhook specified by ``[webhookId]``.

**Format**

.. code-block:: sh

   mmctl webhook show [webhookId] [flags]

**Examples**

.. code-block:: sh

   mmctl webhook show w16zb5tu3n1zkqo18goqry1je

**Options**

.. code-block:: sh

   -h, --help   help for show

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages

mmctl websocket
---------------

**Description**

Display websocket in a human-readable format.

**Format**

.. code-block:: sh

   mmctl websocket [flags]

**Options**

.. code-block:: sh

   -h, --help       help for websocket

**Options inherited from parent commands**

.. code-block:: sh

   --config string                path to the configuration file (default "$XDG_CONFIG_HOME/mmctl/config")
   --disable-pager                disables paged output
   --insecure-sha1-intermediate   allows to use insecure TLS protocols, such as SHA-1
   --insecure-tls-version         allows to use TLS versions 1.0 and 1.1
   --json                         the output format will be in json format
   --local                        allows communicating with the server through a unix socket
   --quiet                        prevent mmctl to generate output for the commands
   --strict                       will only run commands if the mmctl version matches the server one
   --suppress-warnings            disables printing warning messages
source/manage/in-product-notices.rst METASEP
In-product notices
==================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Mattermost in-product notices keep users and administrators informed of the newest product improvements, features, and releases.

.. contents::
  :local:

Administrator notices
---------------------

Administrator notices inform System Admins when a new server version is available, when external dependencies are being deprecated, or when server upgrades are recommended due to ending support life cycles. System Admins may also receive notices about recommended server configuration options to optimize the user experience of their deployment.

.. image:: ../images/notices_admin.png
   :alt: An example of an in-product administrator notice announcing that a new server version of Mattermost is available. Admin notices also announce when external dependencies are being deprecated, or when server upgrades or optimizations are recommended.
   
Administrator notices can be disabled in the **System Console > Notices** page.

End user notices
----------------

End user notices are used to inform users and Admins of new feature enhancements and when new desktop versions are available. They can be disabled in **System Console > Notices**.

.. image:: ../images/notices.png
   :alt: An example of an end user in-product notice announcing that a new Mattermost Desktop App version is available. End user notices announce when new features and versions are available, and can be disabled.

Frequently asked questions (FAQs)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Are notices enabled by default?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Notices are enabled by default for all Mattermost users. System Admins may choose to disable administrator or end user notices in **System Console > Notices**.

Will I still receive notices if my server is air-gapped?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

No, the Mattermost server requires a connection to the internet to receive notices.

How often will users receive notices?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Notices will be used to raise awareness of new features as part of our monthly release cadence. Users will only receive notices that specifically apply to them. For example, if a user is already running the latest Desktop App version, they will not receive an upgrade notice.

Admin Advisor notices
---------------------

Admin Advisor notices are designed to provide guidance and assist in choosing features to support your deployment as it scales.

.. note::
  Admin Advisor notices are disabled in v5.35 and later.

When these notices are triggered, System Admins receive a bot message notification and, for larger instances, a dismissable daily banner with quick access to contact support. The notices are triggered based on usage such as the number of registered users, posts, or channels in your deployment reaching a predefined threshold.

.. image:: ../images/mattermost_admin_advisor_banner.png
   :alt: An example of an Admin Advisor notice. Admin Advisor notices provide guidance as your deployment scales in size. Admin Advisor notices are disabled from Mattermost v5.35.

.. image:: ../images/mattermost_admin_advisor_bot.png
   :alt: An example of an Admin Advisor notice that includes an option for System Admins to contact Mattermost Support. Admin Advisor notices are disabled from Mattermost v5.35.

System Admins can optionally contact support for additional assistance. There are also links to useful resources for user management and provisioning to support large systems.

Managing Admin Advisor notices
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The Admin Advisor notices are run on a schedule based on specific triggers.

- Selecting **Contact us** in the Admin Advisor banner dismisses the banner notification. In addition, contact information, such as the email address and name associated with your Mattermost account, is sent to us so we can contact you as requested and help us better understand your needs. The number of registered users on your system, the site URL, and a Mattermost diagnostic server ID number are also sent to us to better understand your environment and hence provide more tailored support.
- Selecting **Acknowledge** in the Admin Advisor banner closes the advisory and does not send your details to Mattermost.
- Closing the notification bot removes the conversation from your Direct Messages list.

We welcome your feedback on this feature. Please visit `our forum <https://forum.mattermost.com/t/new-admin-advisor-notifications-in-mattermost-v5-26/10263/6>`_ if you have any questions or feedback.

source/manage/health-checks.rst METASEP
Health check
============

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This page describes how to configure health check probes for a Mattermost server.

Before you begin, you should have a running Mattermost server. If you don't, you can `install Mattermost on various distributions <https://docs.mattermost.com/guides/deployment.html>`__ or deploy a `Kubernetes cluster with Minikube <https://github.com/mattermost/mattermost-kubernetes>`__.  Note that `highly available Mattermost cluster support <https://docs.mattermost.com/scale/high-availability-cluster.html>`__ is available in Mattermost Enterprise.

You can perform a health check with two methods:

``/ping`` APIv4 endpoint
-------------------------

From Mattermost v3.10 and later, you can use the `GET /system/ping APIv4 endpoint <https://api.mattermost.com/#tag/system%2Fpaths%2F~1system~1ping%2Fget>`__ to check for system health.

A sample request is included below. The endpoint checks if the server is up and healthy based on the configuration setting ``GoRoutineHealthThreshold``.

- If ``GoRoutineHealthThreshold`` and the number of goroutines on the server exceeds that threshold, the server is considered unhealthy.
- If ``GoRoutineHealthThreshold`` is not set or the number of goroutines is below the threshold the server is considered healthy.

This endpoint can also be provided to schedulers like `Kubernetes <https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#before-you-begin>`__.

.. code-block:: go

  import "github.com/mattermost/mattermost-server/model"
  
  Client := model.NewAPIv4Client("https://your-mattermost-url.com")
  Client.Login("email@domain.com", "Password1")
  
  // GetPing
  status, err := Client.GetPing()

Mattermost probe
----------------

The `Mattermost Probe <https://github.com/csduarte/mattermost-probe>`__ constantly pings a Mattermost server using a variety of probes.

These probes can be configured to verify core features, including sending and receiving messages, joining channels, pinging a login page, and searching of users and channels.

The project is contributed by the Mattermost open source community. Suggestions and contributions for the project are welcome.

source/manage/generating-support-packet.rst METASEP
Generating a support packet
===========================

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Mattermost Enterprise Edition E10 and E20*

.. include:: common-support-packet.rst
  :start-after: :nosearch:

source/manage/common-support-packet.rst METASEP
:nosearch:

Use the System Console to generate a Mattermost Support Packet that includes configuration information, logs, plugin details, and data on external dependencies. Confidential data, such as passwords, are automatically stripped. 

.. note:: 

   When present, the following information is santized during packet generation: ``LdapSettings.BindPassword``, ``FileSettings.PublicLinkSalt``, ``FileSettings.AmazonS3SecretAccessKey``, ``EmailSettings.SMTPPassword``, ``GitLabSettings.Secret``, ``GoogleSettings.Secret``, ``Office365Settings.Secret``, ``OpenIdSettings.Secret``, ``SqlSettings.DataSource``, ``SqlSettings.AtRestEncryptKey``, ``ElasticsearchSettings.Password``, ``All SqlSettings.DataSourceReplicas``, ``All SqlSettings.DataSourceSearchReplicas``, ``MessageExportSettings.GlobalRelaySettings.SmtpPassword``, ``ServiceSettings.GfycatApiSecret``, and ``ServiceSettings.SplitKey``.

To generate a Support Packet:

1. Go to System Console, then select **Commercial Support**.
2. Select **Download Support Packet**. A zip file is downloaded to the local machine.

A Mattermost Support Packet can contain up to five files:

- ``mattermost.log``
- ``plugins.json``
- ``sanitized_config.json``
- ``support_packet.yaml``
- ``warning.txt`` (present when issues are encountered during packet generation)

You'll be notified if any packet files are unavailable during packet generation. See the ``warning.txt`` file for details.

3. Plugins are not sanitized during packet generation. Sanitize any confidential details in the ``plugin.json`` file before sending the support packet to Mattermost. 

.. note::

  When sanitizing Support Packet data, replace details with example strings that contain the same special characters if possible, as special characters are common causes of configuration errors.

  LDAP groups are not included during support packet generation. Only ``LDAP Version`` and ``LDAP Vendor`` are included when present. These values are included in the ``support_packet.yaml`` file.

source/manage/command-line-tools.rst METASEP
Command line tools
==================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

In self-managed deployments, a ``mattermost`` command is available for configuring the system from the directory where the Mattermost server is installed. For an overview of the Mattermost command line interface (CLI), `read this article <https://medium.com/@santosjs/plugging-in-to-the-mattermost-cli-8cdcef2bd1f6>`__ from Santos.

.. note::
  - As of Mattermost v6.0, this CLI has been replaced with the `mmctl command line tool <https://docs.mattermost.com/manage/mmctl-command-line-tool.html>`__. However, `mattermost import <https://docs.mattermost.com/manage/command-line-tools.html#mattermost-import>`__ commands, `mattermost export <https://docs.mattermost.com/manage/command-line-tools.html#mattermost-export>`__ commands, and related subcommands, remain available and fully supported from Mattermost v6.0.
  - The CLI is run in a single node which bypasses the mechanisms that a `High Availability environment <https://docs.mattermost.com/scale/high-availability-cluster.html>`__ uses to perform actions across all nodes in the cluster. As a result, when running `CLI commands <https://docs.mattermost.com/manage/command-line-tools.html>`__ in a High Availability environment, tasks such as creating and deleting users or changing configuration settings require a server restart.

These ``mattermost`` commands include:

**General administration**

-  Create teams
-  Create users
-  Assign roles to users
-  Reset user passwords
-  Invite users to teams

**Advanced administration**

-  Permanently delete users (use cautiously - database backup recommended before use)
-  Permanently delete teams (use cautiously - database backup recommended before use)

**Advanced automation**

-  Create channels
-  Invite users to channels
-  Remove users from channels
-  List all channels for a team
-  Restore previously deleted channels
-  Modify a channel's public/private type
-  Migrate sign-in options
-  Reset multi-factor authentication for a user
-  Create sample data

**Diagnostics**

- Analyze the database for relational consistency

.. contents::
    :backlinks: top
    :local:

Use the CLI
-----------

To run the CLI commands, you must be in the Mattermost root directory. On a default installation of Mattermost, the root directory is ``/opt/mattermost``. If you followed our standard `installation process <../guides/administrator.html#installing-mattermost>`__, you must run the commands as the user ``mattermost``. The name of the executable is ``mattermost``, and it can be found in the ``/opt/mattermost/bin`` directory.

**For example, to get the Mattermost version on a default installation of Mattermost:**

.. code-block:: bash

    cd /opt/mattermost/
    sudo -u mattermost bin/mattermost version

.. note::

  Ensure you run the Mattermost binary as the ``mattermost`` user. Running it as ``root`` user (for example) may cause complications with permissions as the binary initiates plugins and accesses various files when running CLI commands. Running the server as ``root`` may result in ownership of the plugins and files to be overwritten as well as other potential permissions errors.

.. note::

   When running CLI commands on a Mattermost installation that has the configuration stored in the database, you might need to pass the database connection string as: 

.. code-block:: bash
 
   bin/mattermost --config="postgres://mmuser:mostest@localhost:5432/mattermost_test?sslmode=disable\u0026connect_timeout=10"

Use the CLI on GitLab Omnibus
------------------------------

On GitLab Omnibus, you must be in the following directory when you run CLI commands: ``/opt/gitlab/embedded/service/mattermost``. Also, you must run the commands as the user *mattermost* and specify the location of the configuration file. The executable is ``/opt/gitlab/embedded/bin/mattermost``.

**For example, to get the Mattermost version on GitLab Omnibus:**

.. code-block:: bash

    cd /opt/gitlab/embedded/service/mattermost
    sudo /opt/gitlab/embedded/bin/chpst -e /opt/gitlab/etc/mattermost/env -P -U mattermost:mattermost -u mattermost:mattermost /opt/gitlab/embedded/bin/mattermost version

.. note::
   
   The example commands in the documentation are for a default installation of Mattermost. You must modify the commands so that they work on GitLab Omnibus.

Use the CLI on Docker Install
-----------------------------

On Docker install, the ``/mattermost/bin`` directory was added to ``PATH``, so you can use the CLI directly with the ``docker exec`` command. Note that the container name may be ``mattermostdocker_app_1`` if you installed Mattermost with ``docker-compose.yml``.

**For example, to get the Mattermost version on a Docker install:**

.. code-block:: bash

    docker exec -it <your-mattermost-container-name> mattermost version

Use the CLI on Docker Preview
-----------------------------

The preceding documentation and command reference below also applies to the `Mattermost docker preview image <https://github.com/mattermost/mattermost-docker-preview>`__.

Mattermost 3.6 and later
~~~~~~~~~~~~~~~~~~~~~~~~

The new CLI tool is supported in Mattermost v3.6 and later.

.. note::

  -  Parameters in CLI commands are order-specific.
  -  If special characters (``!``, ``|``, ``(``, ``)``, ``\``, ``'``, and ``"``) are used, the entire argument needs to be surrounded by single quotes (e.g. ``-password 'mypassword!'``, or the individual characters need to be escaped out (e.g. ``-password mypassword\!``).
  -  Team name and channel name refer to the handles, not the display names. So in the URL ``https://community.mattermost.com/core/channels/town-square`` team name would be ``core`` and channel name would be ``town-square``.

.. tip::
  
   If you automate user creation through the CLI tool with SMTP enabled, emails will be sent to all new users created. If you run such a load script, it is best to disable SMTP or to use test accounts so that new account creation emails aren't unintentionally sent to people at your organization who aren't expecting them.

mattermost
----------

  Description
    Commands for configuring and managing your Mattermost instance and users.

  Options
    .. code-block:: none

      -c, --config {string}   Configuration file to use. (default "config.json")
      --disableconfigwatch {boolean}  When true, the config.json file will not be reloaded automatically when another process changes it (default "false")

  Child Commands
    -  `mattermost channel`_ - Management of channels
    -  `mattermost command`_ - Management of slash commands
    -  `mattermost config`_ - Work with the configuration file
    -  `mattermost export`_ - Compliance export commands
    -  `mattermost group`_ - Management of Mattermost groups
    -  `mattermost help`_ - Generate full documentation for the CLI
    -  `mattermost import`_ - Import data
    -  `mattermost jobserver`_ - Start the Mattermost job server
    -  `mattermost ldap`_ - AD/LDAP related utilities
    -  `mattermost license`_ - Licensing commands
    -  `mattermost logs`_ - Display human-readable logs
    -  `mattermost permissions`_ - Management of the permissions system
    -  `mattermost plugin`_ - Management of plugins
    -  `mattermost reset`_ - Reset the database to initial state
    -  `mattermost roles`_ - Management of user roles
    -  `mattermost sampledata`_ - Sample data generation
    -  `mattermost server`_ - Run the Mattermost server
    -  `mattermost team`_ - Management of teams
    -  `mattermost user`_ - Management of users
    -  `mattermost version`_ - Display version information
    -  `mattermost webhook`_ - Management of webhooks

mattermost channel
------------------

  Description
    Commands for channel management.

  Child Commands
    -  `mattermost channel add`_ - Add users to a channel
    -  `mattermost channel archive`_ - Archive a channel
    -  `mattermost channel create`_ - Create a channel
    -  `mattermost channel delete`_ - Delete a channel
    -  `mattermost channel list`_ - List all channels on specified teams
    -  `mattermost channel modify`_ - Modify a channel's public/private type
    -  `mattermost channel move`_ - Move a channel to another team
    -  `mattermost channel remove`_ - Remove users from a channel
    -  `mattermost channel rename`_ - Rename a channel
    -  `mattermost channel restore`_ - Restore a channel from the archive
    -  `mattermost channel search`_ -  Search a channel by name

.. _channel-value-note:

.. note::
    **{channel} value**

    For the *add*, *archive*, *delete*, *remove*, and *restore* commands, you can specify the *{channels}* value by {team}:{channel} using the team and channel URLs, or by using channel IDs. Channel IDs can be obtained via the `API <https://api.mattermost.com/#operation/GetChannelByName>`_ or the `mattermost channel search <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-channel-search>`__ command.
    
    For example, in the following URL the *{channels}* value is *myteam:mychannel*:
    
    ``https://example.com/myteam/channels/mychannel``

    Also, the team and channel names in the URL should be written in lowercase.

mattermost channel add
~~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl channel add <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-channel-users-add>`__.


Description
    Add users to a channel. If adding multiple users, use a space-separated list.

 Format
   .. code-block:: none

      mattermost channel add {channel} {users}

 Examples
   .. code-block:: none

      bin/mattermost channel add 8soyabwthjnf9qibfztje5a36h user@example.com username
      bin/mattermost channel add myteam:mychannel user@example.com username

mattermost channel archive
~~~~~~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl channel archive <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-channel-archive>`__.


Description
    Archive a channel. Archived channels are not accessible to users, but remain in the database. To restore a channel from the archive, see `mattermost channel restore`_. Channels can be specified by {team}:{channel} using the team and channel names, or by using channel IDs. Channel IDs can be obtained via the `API <https://api.mattermost.com/#operation/GetChannelByName>`_ or the `mattermost channel search <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-channel-search>`__ command.
    
  Format
    .. code-block:: none

      mattermost channel archive {channels}

  Examples
    .. code-block:: none

      bin/mattermost channel archive 8soyabwthjnf9qibfztje5a36h
      bin/mattermost channel archive myteam:mychannel

mattermost channel create
~~~~~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl channel create <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-channel-create>`__.


Description
    Create a channel.

 Format
   .. code-block:: none

     mattermost channel create

 Examples
   .. code-block:: none

      bin/mattermost channel create --team myteam --name mynewchannel --display_name "My New Channel"
      bin/mattermost channel create --team myteam --name mynewprivatechannel --display_name "My New Private Channel" --private

 Options
   .. code-block:: none

      --display_name string   Channel Display Name
      --header string         Channel header
      --name string           Channel Name
      --private               Create a private channel.
      --purpose string        Channel purpose
      --team string           Team name or ID

mattermost channel delete
~~~~~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl channel delete <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-channel-delete>`__.

Description
    Permanently delete a channel along with all related information, including posts from the database. Channels can be specified by {team}:{channel} using the team and channel names, or by using channel IDs. Channel IDs can be obtained via the `API <https://api.mattermost.com/#operation/GetChannelByName>`_ or the `mattermost channel search <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-channel-search>`__ command.

  Format
    .. code-block:: none

      mattermost channel delete {channels}

  Examples
    .. code-block:: none

      bin/mattermost channel delete 8soyabwthjnf9qibfztje5a36h
      bin/mattermost channel delete myteam:mychannel

mattermost channel list
~~~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl channel list <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-channel-list>`__.


Description
    List all channels on a specified team. Private channels are appended with ``(private)`` and archived channels are appended with ``(archived)``.

  Format
    .. code-block:: none

      mattermost channel list {teams}

  Example
    .. code-block:: none

      bin/mattermost channel list myteam

mattermost channel modify
~~~~~~~~~~~~~~~~~~~~~~~~~

Description
    Modify a channel's public/private type.

  Format
    .. code-block:: none

      mattermost channel modify

  Example
    .. code-block:: none

      bin/mattermost channel modify myteam:mychannel --username myusername --private

  Options
    .. code-block:: none

          --username [REQUIRED] Username of the user who is changing the channel privacy.
          --public   Change a private channel to be public.
          --private  Change a public channel to be private.

mattermost channel move
~~~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl channel move <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-channel-move>`__.

Description
    Move channels to another team. The command validates that all users in the channel belong to the target team. Incoming/outgoing webhooks are moved along with the channel. Channels can be specified by ``[team]:[channel]`` or by using channel IDs. Channel IDs can be obtained via the `API <https://api.mattermost.com/#operation/GetChannelByName>`_ or the `mattermost channel search <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-channel-search>`__ command.
    
  Format
    .. code-block:: none

      mattermost channel move

  Example
    .. code-block:: none

      bin/mattermost channel move newteam 8soyabwthjnf9qibfztje5a36h --username myusername
      bin/mattermost channel move newteam myteam:mychannel --username myusername

  Options
    .. code-block:: none

          --username [REQUIRED] Username of the user who is moving the team.
          --remove-deactivated-users [OPTIONAL] When moving the channel, remove any users who have been deactivated who may be preventing the move.

mattermost channel remove
~~~~~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl channel remove <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-channel-users-remove>`__.

Description
    Remove users from a channel.

  Format
    .. code-block:: none

      mattermost channel remove {channel} {users}

  Examples
    .. code-block:: none

      bin/mattermost channel remove 8soyabwthjnf9qibfztje5a36h user@example.com username
      bin/mattermost channel remove myteam:mychannel user@example.com username
      bin/mattermost channel remove myteam:mychannel --all-users

  Options
    .. code-block:: none

          --all-users string     Remove all users from the channel.

mattermost channel rename
~~~~~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl channel rename <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-channel-rename>`__.

Description
    Rename a channel. Channels can be specified by *{team}:{channel}* using the team and channel names, or by using channel IDs. Channel IDs can be obtained via the `API <https://api.mattermost.com/#operation/GetChannelByName>`_ or the `mattermost channel search <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-channel-search>`__ command.

  Format
    .. code-block:: none

      mattermost channel rename {channel} newchannelname --display_name "New Display Name"

  Examples
    .. code-block:: none

      bin/mattermost channel rename 8soyabwthjnf9qibfztje5a36h newchannelname --display_name "New Display Name"
      bin/mattermost channel rename myteam:mychannel newchannelname --display_name "New Display Name"

  Options
    .. code-block:: none

      --display_name string   Channel Display Name

mattermost channel restore
~~~~~~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl channel restore <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-channel-restore>`__.

Description
    Restore a channel from the archive. Channels can be specified by {team}:{channel} using the team and channel names, or by using channel IDs. Channel IDs can be obtained via the `API <https://api.mattermost.com/#operation/GetChannelByName>`_ or the `mattermost channel search <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-channel-search>`__ command.
  
  Format
    .. code-block:: none

      mattermost channel restore {channels}

  Examples
    .. code-block:: none

      bin/mattermost channel restore 8soyabwthjnf9qibfztje5a36h
      bin/mattermost channel restore myteam:mychannel

mattermost channel search
~~~~~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl channel search <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-channel-search>`__.

Description
    Search for a channel by channel name. Returns channel display name, channel Id, and indicates if it is private or archived. Private channels are appended with ``(private)`` and archived channels are appended with ``(archived)``.

  Format
    .. code-block:: none

      mattermost channel search {channelName}

  Examples
    .. code-block:: none

      bin/mattermost channel search mychannel
      bin/mattermost channel search --team myteam mychannel
      bin/mattermost channel search --team f1924a8db44ff3bb41c96424cdc20676 mychannel

  Options
    .. code-block:: none

      --team   Team Name or Team ID

mattermost command
------------------

  Description
    Commands for slash command management.

  Child Commands
    -  `mattermost command create`_ - Create a custom slash command for a specified team.
    -  `mattermost command delete`_ - Delete a slash command.
    -  `mattermost command list`_ - List all commands on specified teams or all teams by default.
    -  `mattermost command modify`_ - Modify a slash command.
    -  `mattermost command move`_ - Move a slash command to a different team.
    -  `mattermost command show`_ - Show a custom slash command.

mattermost command create
~~~~~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl command create <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-command-create>`__.

Description
    Create a custom slash command for a specified team.

  Format
    .. code-block:: none

      mattermost command create

  Examples
    .. code-block:: none

       bin/mattermost command create myteam --title MyCommand --description "My Command Description" --trigger-word mycommand --url http://localhost:8000/my-slash-handler --creator myusername --response-username my-bot-username --icon http://localhost:8000/my-slash-handler-bot-icon.png --autocomplete --post

  Options
    .. code-block:: none

          --title string                     Command Title
          --description string               Command Description
          --trigger-word string [REQUIRED]   Command Trigger Word
          --url  string   [REQUIRED]         Command Callback URL
          --creator string  [REQUIRED]       Command Creator's Username
          --response-username string         Command Response Username
          --icon string                      Command icon URL
          --autocomplete bool                Show command in autocomplete list
          --autocompleteDesc string          Short command description for autocomplete list
          --autocompleteHint string          Command arguments displayed as help in autocomplete list
          --post bool                        Use POST method for callback URL

mattermost command delete
~~~~~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl command delete <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-command-delete>`__.

Description
    Delete a slash command. Commands can be specified by command ID.

  Format
    .. code-block:: none

      mattermost command delete {commandID}

  Examples
    .. code-block:: none

       bin/mattermost command delete commandID

mattermost command list
~~~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl command list <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-command-list>`__.


Description
    List all commands on specified teams or all teams by default.

  Format
    .. code-block:: none

      mattermost command list {team}

  Examples
    .. code-block:: none

       bin/mattermost command list myteam

mattermost command modify
~~~~~~~~~~~~~~~~~~~~~~~~~~

  Description
    Modify a slash command. Commands can be specified by command ID.

.. note::
    Only fields that you want to modify need to be specified.  Also, when modifying the command's creator, the new creator specified must have the permission to create commands.


  Format
    .. code-block:: none

      mattermost command modify {commandID}

  Examples
    .. code-block:: none

       bin/mattermost command modify commandID --title MyModifiedCommand --description "My Modified Command Description" --trigger-word mycommand --url http://localhost:8000/my-slash-handler --creator myusername --response-username my-bot-username --icon http://localhost:8000/my-slash-handler-bot-icon.png --autocomplete --post

  Options
    .. code-block:: none

          --title string                     Command Title
          --description string               Command Description
          --trigger-word string              Command Trigger Word
          --url  string                      Command Callback URL
          --creator string                   Command Creator's Username
          --response-username string         Command Response Username
          --icon string                      Command Icon URL
          --autocomplete bool                Show command in autocomplete list
          --autocompleteDesc string          Short command description for autocomplete list
          --autocompleteHint string          Command arguments displayed as help in autocomplete list
          --post bool                        Use POST method for callback URL, else use GET method

mattermost command move
~~~~~~~~~~~~~~~~~~~~~~~

  Description
    Move a slash command to a different team. Commands can be specified by {team}:{command-trigger-word}, or by using command IDs.

  Format
    .. code-block:: none

      mattermost command move

  Examples
    .. code-block:: none

      bin/mattermost command move newteam oldteam:command-trigger-word
      bin/mattermost command move newteam o8soyabwthjnf9qibfztje5a36h

mattermost command show
~~~~~~~~~~~~~~~~~~~~~~~

  Description
    Show a custom slash command. Commands can be specified by command ID. Returns command ID, team ID, trigger word, display name and creator username.

  Format
    .. code-block:: none

      command show {commandID}

  Examples
    .. code-block:: none

      bin/mattermost command show commandID

mattermost config
-----------------

  Description
    Commands for managing the configuration file.

  Child Command
    - `mattermost config get`_ - Retrieve the value of a config setting by its name in dot notation.
    - `mattermost config migrate`_ - Migrate a file-based configuration to (or from) a database-based configuration.
    - `mattermost config reset`_ - Resets the value of a config setting by its name in dot notation or a setting section.
    - `mattermost config set`_ - Set the value of a config setting by its name in dot notation.
    - `mattermost config show`_ - Print the current mattermost configuration in an easy to read format.
    - `mattermost config validate`_ - Validate the configuration file.

mattermost config get
~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl config get <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-config-get>`__.

Description
    Retrieve the value of a config setting by its name in dot notation.

  Format
    .. code-block:: none

      mattermost config get {config.name}

  Examples
    .. code-block:: none

       bin/mattermost config get SqlSettings.DriverName

 Options
    .. code-block:: none

          --path string  Optional subpath; defaults to value in Site URL.

mattermost config migrate
~~~~~~~~~~~~~~~~~~~~~~~~~

  Description
    Migrate a file-based configuration to (or from) a database-based configuration. Point the Mattermost server at the target configuration to start using it. If using SAML, ensure the SAML certificates and keys are accessible to also migrate into the database.

.. note::
    If a ``from`` parameter is not specified, the command will fall back to what is specified in --config.

  Format
    .. code-block:: none

      mattermost config migrate {config to read} {config to write}

  Examples
    .. code-block:: none

       bin/mattermost config migrate  path/to/config.json "postgres://mmuser:mostest@dockerhost:5432/mattermost_test?sslmode=disable&connect_timeout=10"

mattermost config reset
~~~~~~~~~~~~~~~~~~~~~~~~~

  Description
    Resets the value of a config setting by its name in dot notation or a setting section to the default value. Accepts multiple values for array settings. When no parameters are given, it will reset all config settings.

  Format
    .. code-block:: none

      mattermost config reset {config.name} {setting section}

  Examples
    .. code-block:: none

       bin/mattermost config reset SqlSettings.DriverName LogSettings

  Options
    .. code-block:: none

       --confirm  Confirm you really want to reset the config setting and a backup has been performed.

mattermost config set
~~~~~~~~~~~~~~~~~~~~~

  Description
    Set the value of a config setting by its name in dot notation. Accepts multiple values for array settings.

  Format
    .. code-block:: none

      mattermost config set {config.name} {setting new value}

  Examples
    .. code-block:: none

       bin/mattermost config set SqlSettings.DriverName mysql

  Options
   .. code-block:: none

       --path string  Optional subpath; defaults to value in Site URL.

mattermost config show
~~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl config <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-config-show>`__.

Description
    Print the current mattermost configuration in an easy to read format.

  Format
    .. code-block:: none

      mattermost config show

  Examples
    .. code-block:: none

       bin/mattermost config show

mattermost config validate
~~~~~~~~~~~~~~~~~~~~~~~~~~

  Description
    Makes sure the configuration file has the following properties:

    - Is valid JSON.
    - Has attributes of the correct type, such as *bool*, *int*, and *str*.
    - All entries are valid. For example, checks that entries are below the maximum length.

  Format
      .. code-block:: none

        mattermost config validate

  Example
      .. code-block:: none

        bin/mattermost config validate
	
mattermost db init
------------------

  Description
    Initializes the database for a given data source name (DSN), executes migrations, and loads custom defaults when specified.

  Format
    .. code-block:: none

      mattermost db init

  Examples
  
    Use the ``config`` flag to pass the DSN:
    
    .. code-block:: none

       mattermost db init --config postgres://localhost/mattermost
       
    Run this command to use the ``MM_CONFIG`` environment variable:
    
    .. code-block:: none
      
       MM_CONFIG=postgres://localhost/mattermost mattermost db init
    
    Run this command to set a custom defaults file to be loaded into the database: 
    
    .. code-block:: none
    
       MM_CUSTOM_DEFAULTS_PATH=custom.json MM_CONFIG=postgres://localhost/mattermost mattermost db init
       
mattermost db migrate
---------------------

  Description
    Migrates the database schema if there are any unapplied migrations.

  Format
    .. code-block:: none

      mattermost db migrate

  Examples
    
    .. code-block:: none

       mattermost db migrate

mattermost export
-----------------

  Description
   Commands for exporting data for compliance and for merging multiple Mattermost instances.

  Child Commands
    -  `mattermost export actiance`_ - Export data from Mattermost in Actiance XML format. Requires a Mattermost Enterprise subscription plan.
    -  `mattermost export bulk`_ - Export data to a file compatible with the Mattermost `Bulk Import format <https://docs.mattermost.com/onboard/bulk-loading-data.html>`__
    -  `mattermost export csv`_ - Export data from Mattermost in CSV format. Requires a Mattermost Enterprise subscription plan.
    -  `mattermost export global-relay-zip`_ - Export data from Mattermost into a ZIP file containing emails to send to Global Relay for debug and testing purposes only. Requires a Mattermost Enterprise subscription plan.
    -  `mattermost export schedule`_ - Schedule an export job

mattermost export actiance
~~~~~~~~~~~~~~~~~~~~~~~~~~

  Description
    Export data from Mattermost in Actiance XML format.

  Format
    .. code-block:: none

      mattermost export actiance

  Example
    .. code-block:: none

      bin/mattermost export actiance --exportFrom=1513102632

  Options
    .. code-block:: none

          --exportFrom string     Unix timestamp (milliseconds since epoch, UTC) to export data from.

mattermost export bulk
~~~~~~~~~~~~~~~~~~~~~~

  Description
    Export data to a file compatible with the Mattermost `Bulk Import format <https://docs.mattermost.com/onboard/bulk-loading-data.html>`__.

  Format
    .. code-block:: none

      mattermost export bulk

  Example
    .. code-block:: none

      bin/mattermost export bulk file.json --all-teams

  Options
    .. code-block:: none

      --all-teams bool   [REQUIRED] Export all teams from the server.
      --attachments bool Also export file attachments.
      --archive bool     Outputs a single archive file.

mattermost export csv
~~~~~~~~~~~~~~~~~~~~~

  Description
    Export data from Mattermost in CSV format.

  Format
    .. code-block:: none

      mattermost export csv

  Example
    .. code-block:: none

      bin/mattermost export csv --exportFrom=1513102632

  Options
    .. code-block:: none

        --exportFrom string     Unix timestamp (seconds since epoch, UTC) to export data from.

mattermost export global-relay-zip
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  Description
    Export data from Mattermost into a zip file containing emails to send to Global Relay for debug and testing purposes only. This does not archive any information in Global Relay.

  Format
    .. code-block:: none

      mattermost export global-relay-zip

  Example
    .. code-block:: none

      bin/mattermost export global-relay-zip --exportFrom=1513102632

  Options
    .. code-block:: none

        --exportFrom string     Unix timestamp (seconds since epoch, UTC) to export data from.

mattermost export schedule
~~~~~~~~~~~~~~~~~~~~~~~~~~

  Description
    Schedule an export job in a format suitable for importing into a third-party archive system.

  Format
    .. code-block:: none

      mattermost export schedule

  Example
    .. code-block:: none

      bin/mattermost export schedule --format=actiance --exportFrom=1513102632

  Options
    .. code-block:: none

          --format string         Output file format. Currently, only ``actiance`` is supported.
          --exportFrom string     Unix timestamp (seconds since epoch, UTC) to export data from.
          --timeoutSeconds string Set how long the export should run for before timing out.

mattermost extract-documents-content 
-------------------------------------

  Description
    Extracts and indexes the contents of files shared prior to upgrading to Mattermost Server v5.35. Running this command is strongly recommended since search results for past file contents may be incomplete. If this command isn't run, users can search older files based on filename only.
    
    If you're using `Elasticsearch <https://docs.mattermost.com/scale/elasticsearch.html>`__ search, you must rebuild the search index after running the content extraction command.
    
    If you're using `Bleve <https://docs.mattermost.com/deploy/bleve-search.html>`__ search, you must disable Bleve before running the content extraction command. Once extraction is complete, re-enable Bleve, then rebuild the search index.

    You can run this extraction command while the server is running. Running this command adds load to your server. For large deployments, or teams that share many large, text-heavy documents, we recommended you review our `hardware requirements <https://docs.mattermost.com/install/software-hardware-requirements.html#hardware-requirements>`__, and test `enabling content search <https://docs.mattermost.com/configure/configuration-settings.html#enable-document-search-by-content>`__ in a staging environment before enabling it in a production environment.
  
  Format
    .. code-block:: none
    
      mattermost extract-documents-content 

  Example
    .. code-block:: none
    
      extract-documents-content --from=12345
  
  Options
    .. code-block:: none
    
      	 --from    Optional. Unix timestamp (seconds since epoch, UTC) of the earliest file to extract. (default 0)
     	 --to 	   Optional. Unix timestamp (seconds since epoch, UTC) of the latest file to extract. (default now)

mattermost group
-----------------

  Description
    Commands for managing Mattermost groups.  For more information on Mattermost groups please see `this documentation. <https://docs.mattermost.com/onboard/ad-ldap-groups-synchronization.html>`__.

  Child Commands
    -  `mattermost group channel`_ - Management of Mattermost groups linked to channels
    -  `mattermost group team`_ - Management of Mattermost groups linked to teams

mattermost group channel
------------------------

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl group channel <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-group-channel>`__.


  Description
    Commands for managing Mattermost groups linked to a channel.

  Child Commands
    -  `mattermost group channel enable`_ - Enables group constraint on the specified channel
    -  `mattermost group channel disable`_ - Disables group constraint on the specified channel
    -  `mattermost group channel list`_ - Lists the groups associated with a channel
    -  `mattermost group channel status`_ - Shows the group constraint status of the specified channel

mattermost group channel enable
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl group channel enable <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-group-channel-enable>`__.


  Description
    Enables group constraint on the specified channel. When a channel is group constrained, channel membership is managed by linked groups instead of managed by manually adding and removing users.

.. note::
  To enable a group constraint on a specific channel, you must already have at least one group associated. See `AD/LDAP Group documentation <https://docs.mattermost.com/onboard/ad-ldap-groups-synchronization.html#adding-default-teams-or-channels-for-the-group>`_ for more details on how to associate a group to a channel.


  Format
    .. code-block:: none

      mattermost group channel enable {team}:{channel}

  Examples
    .. code-block:: none

      bin/mattermost group channel enable myteam:mychannel

mattermost group channel disable
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl group channel disable <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-group-channel-disable>`__.

Description
    Disables group constraint on the specified channel.

  Format
    .. code-block:: none

      mattermost group channel disable {team}:{channel}

  Examples
    .. code-block:: none

      bin/mattermost group channel disable myteam:mychannel

mattermost group channel list
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl group channel list <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-group-channel-list>`__.

Description
    Lists the groups associated with a channel.

  Format
    .. code-block:: none

      mattermost group channel list {team}:{channel}

  Examples
    .. code-block:: none

      bin/mattermost group channel list myteam:mychannel


mattermost group channel status
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl group channel status <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-group-channel-status>`__.

Description
    Shows the group constraint status of the specified channel. Returns "Enabled" when channel membership is managed by linked groups.  Returns "Disabled" when the channel membership is managed by manually adding and removing users.

  Format
    .. code-block:: none

      mattermost group channel status {team}:{channel}

  Examples
    .. code-block:: none

      bin/mattermost group channel status myteam:mychannel

mattermost group team
------------------------

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl group team <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-group-team>`__.

Description
    Commands for managing Mattermost groups linked to a team.

  Child Commands
    -  `mattermost group team enable`_ - Enables group constraint on the specified team
    -  `mattermost group team disable`_ - Disables group constraint on the specified team
    -  `mattermost group team list`_ - Lists the groups associated with a team
    -  `mattermost group team status`_ - Shows the group constraint status of the specified team

mattermost group team enable
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. note::

   TIn Mattermost v6.0, this command has been replaced with the mmctl command `mmctl group team enable <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-group-team-enable>`__.

Description
    Enables group constraint on the specified team. When a team is group constrained, team membership is managed by linked groups instead of managed by manually inviting and removing users.

.. note::
  To enable a group constraint on a specific team, you must already have at least one group associated. See `AD/LDAP Group documentation <https://docs.mattermost.com/onboard/ad-ldap-groups-synchronization.html#adding-default-teams-or-channels-for-the-group>`_ for more details on how to associate a group to a team.

  Format
    .. code-block:: none

      mattermost group team enable {team}

  Examples
    .. code-block:: none

      bin/mattermost group team enable myteam

mattermost group team disable
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl group team disable <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-group-team-disable>`__.

Description
    Disables group constraint on the specified team.

  Format
    .. code-block:: none

      mattermost group team disable {team}

  Examples
    .. code-block:: none

      bin/mattermost group team disable myteam

mattermost group team list
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl group team list <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-group-team-list>`__.

Description
    Lists the groups associated with a team.

  Format
    .. code-block:: none

      mattermost group team list {team}

  Examples
    .. code-block:: none

      bin/mattermost group team list myteam


mattermost group team status
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl group team status <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-group-team-status>`__.

Description
    Shows the group constraint status of the specified team. Returns "Enabled" when team membership is managed by linked groups.  Returns "Disabled" when the team membership is managed by manually inviting and removing users.

  Format
    .. code-block:: none

      mattermost group team status {team}

  Examples
    .. code-block:: none

      bin/mattermost group team status myteam

mattermost help
---------------

  Description
    Generate full documentation in Markdown format for the Mattermost command line tools.

  Format
    .. code-block:: none

      mattermost help {outputdir}

mattermost import
-----------------

  Description
    Import data into Mattermost.

  Child Command
    -  `mattermost import bulk`_ - Import a Mattermost Bulk Import File.
    -  `mattermost import slack`_ - Import a team from Slack.

mattermost import bulk
~~~~~~~~~~~~~~~~~~~~~~

  Description
    Import data from a Mattermost Bulk Import File.

  Format
    .. code-block:: none

      mattermost import bulk {file}

  Options
    .. code-block:: none

          --apply         Save the import data to the database. Use with caution - this cannot be reverted.
          --validate      Validate the import data without making any changes to the system.
          --workers int   How many workers to run whilst doing the import. (default 2)

  Example
    .. code-block:: none

      bin/mattermost import bulk bulk-file.jsonl

mattermost import slack
~~~~~~~~~~~~~~~~~~~~~~~

  Description
    Import a team from a Slack export zip file.

  Format
    .. code-block:: none

      mattermost import slack {team} {file}

  Example
    .. code-block:: none

      bin/mattermost import slack myteam slack_export.zip

mattermost integrity
--------------------

  Description
    Check database schema integrity as well as referential integrity of channels, slash commands, webhooks, posts, schemes, sessions, users, and teams. This process may temporarily affect live system performance, and should be used during off-peak periods.

  Format
    .. code-block:: none

      mattermost integrity

  Example
    .. code-block:: none

      bin/mattermost integrity --confirm --verbose

  Options
    .. code-block:: none

          --confirm   Optional. Skip the confirmation message which indicates that the complete integrity check may temporarily harm system performance. This is not recommended in production environments.
	  --verbose   Outputs a detailed report of number and type of orphaned records including ids (if any).


.. _command-line-tools-mattermost-jobserver:

mattermost jobserver
--------------------

  Description
    Start the Mattermost job server.

  Format
    .. code-block:: none

      mattermost jobserver

  Example
    .. code-block:: none

      bin/mattermost jobserver

mattermost ldap
---------------

  Description
    Commands to configure and synchronize AD/LDAP.

  Child Command
    -  `mattermost ldap idmigrate`_ - Migrate the LDAP Id Attribute to a new value
    -  `mattermost ldap sync`_ - Synchronize now

mattermost ldap idmigrate
~~~~~~~~~~~~~~~~~~~~~~~~~

  Description
    Migrate LDAP Id Attribute to new value.

    Run this utility to change the value of your ID Attribute without your users losing their accounts. After running the command you can change the ID Attribute to the new value in your ``config.json``. For example, if your current ID Attribute was ``sAMAccountName`` and you wanted to change it to ``objectGUID``, you would:

    1. Wait for an off-peak time when your users won't be impacted by a server restart.
    2. Run the command ``mattermost ldap idmigrate objectGUID``.
    3. Edit your ``config.json`` and change your ``IdAttribute`` field to the new value ``objectGUID``.
    4. Restart the Mattermost server.

  Format
    .. code-block:: none

      mattermost ldap idmigrate {attribute}

  Example
    .. code-block:: none

      bin/mattermost ldap idmigrate objectGUID

mattermost ldap sync
~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl ldap sync <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-ldap-sync>`__.

Description
    Synchronize all AD/LDAP users now.

  Format
    .. code-block:: none

      mattermost ldap sync

  Example
    .. code-block:: none

      bin/mattermost ldap sync

mattermost license
------------------

  Description
    Commands to manage licensing.

  Child Command
    -  `mattermost license upload`_ - Upload a license.

mattermost license upload
~~~~~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl license upload <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-license-upload>`__.

Description
    Upload a license. This command replaces the current license if one is already uploaded.

  Format
    .. code-block:: none

      mattermost license upload {license}

  Example
    .. code-block:: none

      bin/mattermost license upload /path/to/license/mylicensefile.mattermost-license

.. note::
  The Mattermost server needs to be restarted after uploading a license file for any changes to take effect. Also, for cluster setups the license file needs to be uploaded to every node.

mattermost logs
------------------

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl logs <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-logs>`__.

Description
    Displays Mattermost logs in a human-readable format.

  Format
    .. code-block:: none

      mattermost logs

  Example
    .. code-block:: none

      bin/mattermost logs --logrus

  Options
    .. code-block:: none

          --logrus   Displays Mattermost logs in `logrus format <https://github.com/sirupsen/logrus>`_. Else, standard output is returned.


mattermost permissions
----------------------

  Description
    Commands to manage advanced permissions.

  Child Commands
    -  `mattermost permissions export`_ - Export Schemes and Roles.
    -  `mattermost permissions import`_ - Import Schemes and Roles from a permissions export.
    -  `mattermost permissions reset`_ - Reset the permissions system to its default state on new installs.

mattermost permissions export
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  Description
    Prints to stdout a jsonl representation of Schemes and Roles from a Mattermost instance. Used to export
    Roles and Schemes from one Mattermost instance to another. The output is a jsonl representation with
    each line containing a json representation of a Scheme and its associated Roles. The output is intended
    to be used as the input of `mattermost permissions import`.

  Format
    .. code-block:: none

      mattermost permissions export

  Example
    .. code-block:: none

      bin/mattermost permissions export > my-permissions-export.jsonl

mattermost permissions import
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  Description
    Creates Roles and Schemes on a Mattermost instance from a jsonl input file in the format outputted by
    `mattermost permissions export`.

  Format
    .. code-block:: none

      mattermost permissions import {file}

  Example
    .. code-block:: none

      bin/mattermost permissions import my-permissions-export.jsonl

mattermost permissions reset
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  Description
    Reset permissions for all users, including Admins, to their default state on new installs. Note: **this will delete
    all custom schemes**.

  Format
    .. code-block:: none

      mattermost permissions reset

  Example
    .. code-block:: none

      bin/mattermost permissions reset

  Options
    .. code-block:: none

          --confirm   Confirm you really want to reset the permissions system and a DB backup has been performed.

mattermost plugin
-----------------

  Description
    Commands to manage plugins.

  Child Commands
    -  `mattermost plugin add`_ - Add plugins to your Mattermost server.
    -  `mattermost plugin delete`_ - Delete previously uploaded plugins.
    -  `mattermost plugin disable`_ - Disable plugins.
    -  `mattermost plugin enable`_ - Enable plugins for use.
    -  `mattermost plugin list`_ - List plugins installed on your Mattermost server.

mattermost plugin add
~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl plugin add <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-plugin-add>`__.

Description
    Add plugins to your Mattermost server. If adding multiple plugins, use a space-separated list.

  Format
    .. code-block:: none

      mattermost plugin add {plugin tar file}

  Example
    .. code-block:: none

      bin/mattermost plugin add hovercardexample.tar.gz pluginexample.tar.gz

mattermost plugin delete
~~~~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl plugin delete <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-plugin-delete>`__.

Description
    Delete previously uploaded plugins from your Mattermost server. If deleting multiple plugins, use a space-separated list.

  Format
    .. code-block:: none

      mattermost plugin delete {plugin_id}

  Example
    .. code-block:: none

      bin/mattermost plugin delete hovercardexample pluginexample

mattermost plugin disable
~~~~~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl plugin disable <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-plugin-disable>`__.

Description
    Disable plugins. Disabled plugins are immediately removed from the user interface and logged out of all sessions. If disabling multiple plugins, use a space-separated list.

  Format
    .. code-block:: none

      mattermost plugin disable {plugin_id}

  Example
    .. code-block:: none

      bin/mattermost plugin disable hovercardexample pluginexample

mattermost plugin enable
~~~~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl plugin enable <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-plugin-enable>`__.

Description
    Enable plugins for use on your Mattermost server. If enabling multiple plugins, use a space-separated list.

  Format
    .. code-block:: none

      mattermost plugin enable {plugin_id}

  Example
    .. code-block:: none

      bin/mattermost plugin enable hovercardexample pluginexample

mattermost plugin list
~~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl plugin list <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-plugin-list>`__.

Description
    List all active and inactive plugins installed on your Mattermost server.

  Format
    .. code-block:: none

      mattermost plugin list

  Example
    .. code-block:: none

      bin/mattermost plugin list

mattermost reset
----------------

  Description
    Completely erase the database causing the loss of all data. This resets Mattermost to its initial state.

  Format
    .. code-block:: none

      mattermost reset

  Options
    .. code-block:: none

          --confirm   Confirm you really want to delete everything and a DB backup has been performed.

mattermost roles
----------------

  Description
    Commands to manage user roles.

  Child Commands
    -  `mattermost roles member`_ - Remove System Admin privileges from a user
    -  `mattermost roles system_admin`_ - Make a user into a System Admin

mattermost roles member
~~~~~~~~~~~~~~~~~~~~~~~

  Description
    Remove system admin privileges from a user.

  Format
    .. code-block:: none

      mattermost roles member {users}

  Example
    .. code-block:: none

      bin/mattermost roles member user1

mattermost roles system\_admin
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  Description
    Promote a user to a System Admin.

  Format
    .. code-block:: none

      mattermost roles system_admin {users}

  Example
    .. code-block:: none

      bin/mattermost roles system_admin user1

mattermost sampledata
---------------------

  Description
    .. versionadded:: 4.7
      Generate sample data and populate the Mattermost database. Supported in Mattermost v4.7 and later.

      The command generates one user as the System Administrator with a username ``sysadmin`` and password ``Sys@dmin-sample1``. Other users are generated following an index, e.g. with username ``user-1`` and password ``SampleUs@r-1``.

  Format
    .. code-block:: none

      mattermost sampledata

  Example
    .. code-block:: none

      bin/mattermost sampledata --seed 10 --teams 4 --users 30

  Options
    .. code-block:: none

          -u, --users int                      The number of sample users. (default 15)
              --profile-images string          Optional. Path to folder with images to randomly pick as user profile image.
          -t, --teams int                      The number of sample teams. (default 2)
              --team-memberships int           The number of sample team memberships per user. (default 2)
              --channels-per-team int          The number of sample channels per team. (default 10)
              --channel-memberships int        The number of sample channel memberships per user in a team. (default 5)
              --posts-per-channel int          The number of sample post per channel. (default 100)
              --direct-channels int            The number of sample direct message channels. (default 30)
              --group-channels int             The number of sample group message channels. (default 15)
              --posts-per-direct-channel int   The number of sample posts per direct message channel. (default 15)
              --posts-per-group-channel int    The number of sample post per group message channel. (default 30)
          -s, --seed int                       Seed used for generating the random data (Different seeds generate different data). (default 1)
          -b, --bulk string                    Optional. Path to write a JSONL bulk file instead of loading into the database.
          -w, --workers int                    How many workers to run during the import. (default 2)

mattermost server
-----------------

  Description
    Runs the Mattermost server.

  Format
    .. code-block:: none

      mattermost server

mattermost team
---------------

  Description
    Commands to manage teams.

  Child Commands
    -  `mattermost team add`_ - Add users to a team.
    -  `mattermost team archive`_ - Archive teams based on name.
    -  `mattermost team create`_ - Create a team.
    -  `mattermost team delete`_ - Delete a team.
    -  `mattermost team list`_ - List all teams.
    -  `mattermost team modify`_ - Modify a team's public/private type.
    -  `mattermost team remove`_ - Remove users from a team.
    -  `mattermost team rename`_ - Rename a team.
    -  `mattermost team restore`_ - Restore a previously archived team.
    -  `mattermost team search`_ - Search for teams based on name.

.. _team-value-note:

.. note::
    **{team-name} value**

    For the *add*, *delete*, and *remove* commands, you can determine the *{team-name}* value from the URLs that you use to access your instance of Mattermost. For example, in the following URL the *{team-name}* value is *myteam*:

    ``https://example.com/myteam/channels/mychannel``

    Also, the team and channel names in the URL should be written in lowercase.

mattermost team add
~~~~~~~~~~~~~~~~~~~

.. note::

   TIn Mattermost v6.0, this command has been replaced with the mmctl command `mmctl team add <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-team-users-add>`__.

Description
    Add users to a team. Before running this command, see the :ref:`note about {team-name} <team-value-note>`.

  Format
    .. code-block:: none

      mattermost team add {team-name} {users}

  Example
    .. code-block:: none

      bin/mattermost team add myteam user@example.com username

mattermost team archive
~~~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl team archive <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-team-archive>`__.


Description
    Archive teams based on name. Before running this command, see the :ref:`note about {team-name} <team-value-note>`.

  Format
    .. code-block:: none

      mattermost team archive {team}

  Examples
    .. code-block:: none

       bin/mattermost team archive team1

mattermost team create
~~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl team create <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-team-create>`__.

Description
    Create a team.

  Format
    .. code-block:: none

      mattermost team create

  Examples
    .. code-block:: none

      bin/mattermost team create --name mynewteam --display_name "My New Team"
      bin/mattermost teams create --name private --display_name "My New Private Team" --private

  Options
    .. code-block:: none

          --display_name string   Team Display Name
          --email string          Administrator Email (anyone with this email is automatically a team admin)
          --name string           Team Name
          --private               Create a private team.

mattermost team delete
~~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl team delete <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-team-delete>`__.

Description
    Permanently delete a team along with all related information, including posts from the database. Before running this command, see the :ref:`note about {team-name} <team-value-note>`.

  Format
    .. code-block:: none

      mattermost team delete {team-name}

  Example
    .. code-block:: none

      bin/mattermost team delete myteam

  Options
    .. code-block:: none

          --confirm   Confirm you really want to delete the team and a DB backup has been performed.

mattermost team list
~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl team list <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-team-list>`__.

*Supported in Mattermost v4.10 and later*

  Description
    List all teams on the server.

  Format
    .. code-block:: none

      mattermost team list

  Example
    .. code-block:: none

      bin/mattermost team list

mattermost team modify
~~~~~~~~~~~~~~~~~~~~~~

  Description
    Modify a team's public/private type.

  Format
    .. code-block:: none

      mattermost team modify [team] [flag]

  Example
    .. code-block:: none

      bin/mattermost modify team myteam --private
      bin/mattermost modify team myteam --public

mattermost team remove
~~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl team remove <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-team-users-remove>`__.

Description
    Remove users from a team. Before running this command, see the :ref:`note about {team-name} <team-value-note>`.

  Format
    .. code-block:: none

      mattermost team remove {team-name} {users}

  Example
    .. code-block:: none

      bin/mattermost team remove myteam user@example.com username

mattermost team rename
~~~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl team rename <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-team-rename>`__.

Description
    Rename a team.

  Format
    .. code-block:: none

      mattermost team rename {team} newteamname --display_name "New Display Name"

  Examples
    .. code-block:: none

      bin/mattermost team rename myteam newteamname --display_name "New Display Name"

  Options
    .. code-block:: none

      --display_name string   Team Display Name

mattermost team restore
~~~~~~~~~~~~~~~~~~~~~~~

  Description
    Restore a previously archived team.

  Format
    .. code-block:: none

      mattermost team restore {team}

  Example
    .. code-block:: none

      bin/mattermost team restore myteam

mattermost team search
~~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl team search <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-team-search>`__.

Description
    Search for teams based on name. Before running this command, see the :ref:`note about {team-name} <team-value-note>`.

  Format
    .. code-block:: none

      mattermost team search {team}

  Examples
    .. code-block:: none

       bin/mattermost team search team1

mattermost user
---------------

  Description
    Commands to manage users.

  Child Commands

    -  `mattermost user activate`_ - Activate a user
    -  `mattermost user convert`_ - Convert a user to a bot, or a bot to a user
    -  `mattermost user create`_ - Create a user
    -  `mattermost user deactivate`_ - Deactivate a user
    -  `mattermost user delete`_ - Delete a user and all posts
    -  `mattermost user deleteall`_ - Delete all users and all posts
    -  `mattermost user email`_ - Set a user's email
    -  `mattermost user invite`_ - Send a user an email invitation to a team
    -  `mattermost user migrate_auth`_ - Mass migrate all user accounts to a new authentication type
    -  `mattermost user password`_ - Set a user's password
    -  `mattermost user resetmfa`_ - Turn off MFA for a user
    -  `mattermost user search`_ - Search for users based on username, email, or user ID
    -  `mattermost user verify`_ - Verify email address of a new user

~~~~~~~~~~~~~~~~~~~~~~~~

mattermost user activate
~~~~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl user activate <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-user-activate>`__.

Description
    Activate users that have been deactivated. If activating multiple users, use a space-separated list.

  Format
    .. code-block:: none

      mattermost user activate {emails, usernames, userIds}

  Examples
    .. code-block:: none

      bin/mattermost user activate user@example.com
      bin/mattermost user activate username1 username2

mattermost user convert
~~~~~~~~~~~~~~~~~~~~~~~~

  Description
    Convert a user to a bot, or convert a bot to a user account.

  Format
    .. code-block:: none

      mattermost user convert {emails, usernames, userIds} --bot
      OR
      mattermost user convert {bot_id} --user --email {email_address} --password {new_password}

  Examples
    .. code-block:: none

      bin/mattermost user convert user@example.com --bot
      bin/mattermost user convert username1 username2 --bot
      bin/mattermost user convert old_bot --user --email real_user@example.com --password Password1


  Options
    .. code-block:: none

          --bot string       Convert user to bot.  Supports converting multiple bots at once, use a space-separated list.
          --user string      Convert bot to user.  Supports converting one account per command. The converted user will have the role of `system_user` set.

mattermost user create
~~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl user create <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-user-create>`__.


Description
    Create a user.

  Format
    .. code-block:: none

      mattermost user create

  Examples
    .. code-block:: none

      bin/mattermost user create --email user@example.com --username userexample --password Password1
      bin/mattermost user create --firstname Joe --system_admin --email joe@example.com --username joe --password Password1

  Options
    .. code-block:: none

          --email string       Email
          --firstname string   First Name
          --lastname string    Last Name
          --locale string      Locale (ex: en, fr)
          --nickname string    Nickname
          --password string    Password
          --system_admin       Make the user a system administrator
          --username string    Username

mattermost user deactivate
~~~~~~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl user deactivate <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-user-deactivate>`__.

Description
    Deactivate a user. Deactivated users are immediately logged out of all sessions and are unable to log back in.

  Format
    .. code-block:: none

      mattermost user deactivate {emails, usernames, userIds}

  Examples
    .. code-block:: none

      bin/mattermost user deactivate user@example.com
      bin/mattermost user deactivate username

  .. note::
    Users deactivated via this CLI command can continue to use Mattermost, if they are already logged in, until the user cache is manually purged or automatically after 30 minutes. Users who are deactivated when they're not logged in will not be able to log in to Mattermost again.

    If you want to immediately terminate a deactivated user's session, purge all caches in **System Console > Web Server > Purge All Caches** after running this command.

    You can also use the `API command <https://api.mattermost.com/#tag/users%2Fpaths%2F~1users~1%7Buser_id%7D%2Fdelete>`_ to deactivate a user account and immediately terminate the session.

mattermost user delete
~~~~~~~~~~~~~~~~~~~~~~

  Description
    Permanently delete a user and all related information, including posts from the database.

    Does not delete content from the file storage. You can manually delete all file uploads for a given user as uploads contain the ``CreatorId`` field. User avatars are stored in ``data/users/<userid>/profile.png``.

  Format
    .. code-block:: none

      mattermost user delete {users}

  Example
    .. code-block:: none

      bin/mattermost user delete user@example.com

  Options
    .. code-block:: none

          --confirm   Confirm you really want to delete the user and a DB backup has been performed.

mattermost user deleteall
~~~~~~~~~~~~~~~~~~~~~~~~~

  Description
    Permanently delete all users and all related information, including posts.

    Does not delete content from the file storage. You can manually delete all file uploads and avatars. All uploads contain the ``CreatorId`` field and user avatars are stored in ``data/users/<userid>/profile.png``.

  Format
    .. code-block:: none

      mattermost user deleteall

  Example
    .. code-block:: none

      bin/mattermost user deleteall

  Options
    .. code-block:: none

          --confirm   Confirm you really want to delete the user and a DB backup has been performed.

mattermost user email
~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl user email <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-user-email>`__.


Description
    Set a user's email.

  Format
    .. code-block:: none

       mattermost user email {user} {new email}

  Example
    .. code-block:: none

      bin/mattermost user email user@example.com newuser@example.com

mattermost user invite
~~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl user invite <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-user-invite>`__.


Description
    Send a user an email invite to a team. You can invite a user to multiple teams by listing the team names or team IDs.

  Format
    .. code-block:: none

      mattermost user invite {email} {teams}

  Examples
    .. code-block:: none

      bin/mattermost user invite user@example.com myteam
      bin/mattermost user invite user@example.com myteam1 myteam2

mattermost user migrate_auth
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. _cli-user-migrate-auth:

  Description
    Migrates all existing Mattermost user accounts from one authentication provider to another. For example, you can upgrade your authentication provider from email to AD/LDAP, or from AD/LDAP to SAML. Output will display any accounts that are not migrated successfully. These accounts might be blocked because of filters in your AD/LDAP configuration in the System Console.

**Migrate to AD/LDAP**

  Parameters
    -  ``from_auth``: The authentication service from which to migrate user accounts. Supported options: ``email``, ``gitlab``, ``saml``.

    -  ``to_auth``: The authentication service to which to migrate user accounts. Supported options: ``ldap``.

    -  ``match_field``: The field that is guaranteed to be the same in both authentication services. For example, if the user emails are consistent set to email. Supported options: ``email``, ``username``.

  Format
    .. code-block:: none

      mattermost user migrate_auth {from_auth} ldap {match_field}

  Example
    .. code-block:: none

      bin/mattermost user migrate_auth email ldap email
  Options
    .. code-block:: none

      --force  Ignore duplicate entries on the AD/LDAP server.
      --dryRun Run a simulation of the migration process without changing the database.

**Migrate to SAML**

*Supported in Mattermost v4.8 and later*

  Parameters

    -  ``from_auth``: The authentication service from which to migrate user accounts. Supported options: ``email``, ``gitlab``. ``ldap``.

    -  ``to_auth``: The authentication service to which to migrate user accounts. Supported options: ``saml``.

    -  ``users_file``: The path of a JSON file with the usernames and emails of all users to migrate to SAML. The username and email must be the same as in your SAML service provider. Moreover, the email must match the email address of the Mattermost user account. An example of the users file is below:

    .. code-block:: json

        {
          "user1@email.com": "username.one",
          "user2@email.com": "username.two"
        }

  Users file generation
    Generating the ``users_file`` depends on how the system is configured and which SAML service provider is used. Below are two sample scripts for OneLogin and Okta service providers. For ADFS, you can use the AD/LDAP protocol to directly extract the users information and export it to a JSON file.

    After generating the ``users_file``, you can manually update the file to obtain a list of Mattermost user accounts you want to migrate to SAML. Note that users listed in ``users_file`` that do not yet exist in Mattermost are ignored during the migration process.

    OneLogin:

    .. code-block:: python

        from onelogin.api.client import OneLoginClient
        import json

        client_id = input("Client id: ")
        client_secret = input("Secret: ")
        region = input("Region (us, eu): ")

        client = OneLoginClient(client_id, client_secret, region)

        mapping = {}
        for user in client.get_users():
            mapping[user.email] = user.username

        with file("saml_users.json", "w") as fd:
            json.dump(mapping, fd)

    Okta:

    .. code-block:: python

        from okta import UsersClient
        import json

        base_url = input("Base url (example: https://example.okta.com): ")
        api_token = input("API Token: ")

        usersClient = UsersClient(base_url, api_token)

        users = usersClient.get_paged_users(limit=25)

        mapping = {}

        for user in users.result:
            mapping[user.profile.email] = user.profile.login

        while not users.is_last_page():
            users = usersClient.get_paged_users(url=users.next_url)
            for user in users.result:
                mapping[user.profile.email] = user.profile.login

        with file("saml_users.json", "w") as fd:
            json.dump(mapping, fd)

    ADFS:

    .. code-block:: python

        import ldap
        import json
        import getpass

        ldap_host = input('Ldap Host (example ldap://localhost:389): ')
        base_dn = input('Base DN (example dc=mm,dc=test,dc=com): ')
        bind_dn = input('Bind DN (example ORGANIZATION\username): ')
        password = getpass.getpass('Password: ')
        user_object_class = input('User object class (example organizationalPerson): ')
        username_field = input('Username field (example sAMAccountName): ')
        mail_field = input('Mail field (example mail): ')

        l = ldap.initialize(ldap_host)
        l.simple_bind_s(bind_dn, password)
        page_control = ldap.controls.libldap.SimplePagedResultsControl(True, size=1000, cookie='')
        r = l.search_ext(base_dn, ldap.SCOPE_SUBTREE, '(objectClass='+user_object_class+')', [username_field, mail_field],         serverctrls=[page_control])

        mapping = {}
        while True:
            rtype, rdata, rmsgid, serverctrls = l.result3(r)

            for dn, entry in rdata:
                if mail_field in entry and len(entry[mail_field]) >= 1 and username_field in entry and len(entry[username_field]) >= 1:
                    mapping[entry[mail_field][0].decode('utf-8')] = entry[username_field][0].decode('utf-8')

            controls = [control for control in serverctrls if control.controlType == ldap.controls.libldap.SimplePagedResultsControl.controlType]
            if not controls:
                print('The server ignores RFC 2696 control')
                break
            if not controls[0].cookie:
                break
            page_control.cookie = controls[0].cookie
            r = l.search_ext(base_dn, ldap.SCOPE_SUBTREE, '(objectClass='+user_object_class+')', [username_field, mail_field], serverctrls=[page_control])

        with open("saml_users.json", "w") as fd:
            json.dump(mapping, fd)

  Format
    .. code-block:: none

      mattermost user migrate_auth {from_auth} saml {users_file}

  Example
    .. code-block:: none

      bin/mattermost user migrate_auth email saml users.json

  Options
    .. code-block:: none

      --auto   Automatically migrate all users without a {users_file}. Assumes the usernames and emails are identical between Mattermost and SAML services.
      --dryRun Run a simulation of the migration process without changing the database. Useful to test if the migration results in any errors. You can use this option with or without a {users_file}.

mattermost user password
~~~~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl user reset_password <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-user-reset-password>`__.


Description
    Set a user's password.

  Format
    .. code-block:: none

      mattermost user password {user} {password}

  Example
    .. code-block:: none

      bin/mattermost user password user@example.com Password1

mattermost user resetmfa
~~~~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl user resetmfa <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-user-resetmfa>`__.


Description
    Turns off multi-factor authentication for a user. If MFA enforcement is enabled, the user will be forced to re-enable MFA with a new device as soon as they log in.

  Format
    .. code-block:: none

      mattermost user resetmfa {users}

  Example
    .. code-block:: none

      bin/mattermost user resetmfa user@example.com

mattermost user search
~~~~~~~~~~~~~~~~~~~~~~

.. note::

   In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl user search <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-user-search>`__.


Description
    Search for users based on username, email, or user ID.

  Format
    .. code-block:: none

      mattermost user search {users}

  Example
    .. code-block:: none

      bin/mattermost user search user1@example.com user2@example.com

mattermost user verify
~~~~~~~~~~~~~~~~~~~~~~

  Description
    Verify the email address of a new user.

  Format
    .. code-block:: none

      mattermost user verify {users}

  Example
    .. code-block:: none

      bin/mattermost user verify user1

mattermost version
------------------

.. note::

   From Mattermost v6.5, this CLI command no longer interacts with the database. The ``mattermost db migrate <https://docs.mattermost.com/manage/command-line-tools.html#mattermost-db-migrate>`__ CLI command has been introduced to trigger schema migrations.

Description
    Displays Mattermost version information.

  Format
    .. code-block:: none

      mattermost version

mattermost webhook
------------------

  Description
    Commands to manage webhooks.

  Child Commands
    -  `mattermost webhook create-incoming`_ - Create an incoming webhook within specific channel.
    -  `mattermost webhook create-outgoing`_ - Create an outgoing webhook within specific channel.
    -  `mattermost webhook delete`_ - Delete incoming and outgoing webhooks.
    -  `mattermost webhook list`_ - List all webhooks.
    -  `mattermost webhook modify-incoming`_ - Modify an existing incoming webhook by changing its title, description, channel, or icon URL.
    -  `mattermost webhook modify-outgoing`_ - Modify an existing outgoing webhook by changing its title, description, channel, icon, URL, content-type, and triggers.
    -  `mattermost webhook move-outgoing`_ - Move an existing outgoing webhook with an ID.
    -  `mattermost webhook show`_ - Show information about a webhook by providing the webhook ID.

mattermost webhook create-incoming
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  Description
    Create an incoming webhook within specific channel.

  Format
    .. code-block:: none

      mattermost webhook create-incoming

  Examples
    .. code-block:: none

       bin/mattermost webhook create-incoming --channel [channelID] --user [userID] --display-name [display-name] --description [webhookDescription] --lock-to-channel --icon [iconURL]

  Options
    .. code-block:: none

          --channel string           Channel ID
          --user string              User ID
          --display-name string      Incoming webhook display name
          --description string       Incoming webhook description
          --lock-to-channel boolean  (True/False) Lock incoming webhook to channel
          --icon [iconURL]           Icon URL

mattermost webhook create-outgoing
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  Description
    Create an outgoing webhook which allows external posting of messages from a specific channel.

  Format
    .. code-block:: none

      mattermost webhook create-outgoing

  Examples
    .. code-block:: none

       bin/mattermost webhook create-outgoing --team myteam --channel mychannel --user myusername --display-name mywebhook --description "My cool webhook" --trigger-when start --trigger-word "build" --icon http://localhost:8000/my-slash-handler-bot-icon.png --url http://localhost:8000/my-webhook-handler --content-type "application/json"

       bin/mattermost webhook create-outgoing --team myotherteam --channel mychannel --user myusername --display-name myotherwebhook --description "My cool webhook" --trigger-when exact --trigger-word "build" --trigger-word "test" --trigger-word "third-trigger" --icon http://localhost:8000/my-slash-handler-bot-icon.png --url http://localhost:8000/my-webhook-handler --url http://example.com --content-type "application/json"

  Options
    .. code-block:: none

          --team string [REQUIRED]                Team name or ID
          --channel string                        Channel name or ID
          --user string [REQUIRED]                User username, email, or ID
          --display-name string [REQUIRED]        Outgoing webhook display name
          --description string                    Outgoing webhook description
          --trigger-words stringArray [REQUIRED]  Words to trigger webhook
          --trigger-when string [REQUIRED]        When to trigger webhook (exact: for first word matches a trigger word exactly, start: for first word starts with a trigger word) (default "exact")
          --icon [iconURL]                        Icon URL
          --url stringArray [REQUIRED]            Callback URLs
          --content-type string                   Content-type
          --h, --help         Help for create-outgoing

mattermost webhook delete
~~~~~~~~~~~~~~~~~~~~~~~~~

   Description
    Delete incoming and outgoing webhooks. If deleting multiple webhooks, use a space-separated list.

   Format
     .. code-block:: none

       mattermost webhook delete [webhookID]

   Examples
     .. code-block:: none

        bin/mattermost webhook delete ggwpz8c1oj883euk98wfm9n1cr

mattermost webhook list
~~~~~~~~~~~~~~~~~~~~~~~

  Description
    List all webhooks.

  Format
    .. code-block:: none

      mattermost webhook list {team}

  Examples
    .. code-block:: none

       bin/mattermost webhook list team1
       bin/mattermost webhook list

  Options
    .. code-block:: none

          --team string  Specific team results to return.  If not specified, all teams will be included.

mattermost webhook modify-incoming
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  Description
    Modify an existing incoming webhook by changing its title, description, channel or icon url.

  Format
    .. code-block:: none

      mattermost webhook modify-incoming {webhookId}

  Examples
    .. code-block:: none

       bin/mattermost webhook modify-incoming [webhookID] --channel [channelID] --display-name [displayName] --description [webhookDescription] --lock-to-channel --icon [iconURL]

  Options
    .. code-block:: none

          --channel string              Channel ID
          --display-name string         Incoming webhook display name
          --description string          Incoming webhook description
          --lock-to-channel boolean     (True/False) Lock incoming webhook to channel
          --icon [iconURL]              Icon URL

mattermost webhook modify-outgoing
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  Description
    Modify an existing outgoing webhook by changing its title, description, channel, trigger words, icon url, callback url, or content type.

  Format
    .. code-block:: none

      mattermost webhook modify-outgoing {webhookId}

  Examples
    .. code-block:: none

       bin/mattermost webhook modify-outgoing [webhookId] --channel [channelId] --display-name [displayName] --description "New webhook description" --icon http://localhost:8000/my-slash-handler-bot-icon.png --url http://localhost:8000/my-webhook-handler --content-type "application/json" --trigger-word test --trigger-when start`

  Options
    .. code-block:: none

          --channel string              Channel ID
          --display-name string         Incoming webhook display name
          --description string          Incoming webhook description
	  --trigger-word string array	Word(s) to trigger webhook
	  --trigger-when string		When to trigger webhook (exact: for first word matches a trigger word exactly, start: for first word starts with a trigger word)")
         --icon [iconURL]              Icon URL
	  --url [callbackURL]           Callback URL
	  --content-type string         Content type

mattermost webhook move-outgoing
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  Description
    Move an existing outgoing webhook to another team by specifying its id. If the outgoing webhook is triggered by a keyword then assigning a channel is optional.  If the outgoing webhook is associated to a specific channel prior to moving, a channel must be specified within the new team.

  Format
    .. code-block:: none

      mattermost webhook move-outgoing {webhookId}

  Examples
    .. code-block:: none

       bin/mattermost webhook move-outgoing newteam oldteam:[webhookId] --channel [channelId or channelName]

  Options
    .. code-block:: none

          --channel string              Channel ID or Channel Name


mattermost webhook show
~~~~~~~~~~~~~~~~~~~~~~~

  Description
    Show information about a webhook by providing the webhook ID. Returns display name, channel ID and team ID for both incoming and outgoing webhooks.  Additionally returns callback URL, username, and icon URL for outgoing webhooks.

  Format
    .. code-block:: none

      mattermost webhook show {webhookId}

  Examples
    .. code-block:: none

       bin/mattermost webhook show [webhookId]

Mattermost 3.5 and earlier
^^^^^^^^^^^^^^^^^^^^^^^^^^^

Typing ``./platform -help`` brings up documentation for the CLI tool. To return the help documentation in GitLab omnibus, type

    .. code-block:: none

      sudo -u mattermost /opt/gitlab/embedded/bin/mattermost --config=/var/opt/gitlab/mattermost/config.json -help

Notes:

- Parameters in CLI commands are order-specific.
- If special characters (``!``, ``|``, ``(``, ``)``, ``\``, `````, and ``"``) are used, the entire argument needs to be surrounded by single quotes (e.g. ``-password 'mypassword!'``, or the individual characters need to be escaped out (e.g. ``-password mypassword\!``).
- Team name and channel name refer to the handles, not the display names. So in the url ``https://community.mattermost.com/core/channels/town-square`` team name would be ``core`` and channel name would be ``town-square``

.. tip :: 
	
	If you automate user creation through the CLI tool with SMTP enabled, emails will be sent to all new users created. If you run such a load script, it is best to disable SMTP or to use test accounts so that new account creation emails aren't unintentionally sent to people at your organization who aren't expecting them.

CLI Documentation:

::

  Mattermost commands to help configure the system

  NAME:
      platform -- platform configuration tool

  USAGE:
      platform [options]

  FLAGS:
      -config="config.json"             Path to the config file

      -username="someuser"              Username used in other commands

      -license="ex.mattermost-license"  Path to your license file

      -email="user@example.com"         Email address used in other commands

      -password="mypassword"            Password used in other commands

      -team_name="name"                 The team name used in other commands

      -channel_name="name"	        The channel name used in other commands

      -channel_header="string"	        The channel header used in other commands

      -channel_purpose="string"	        The channel purpose used in other commands

      -channel_type="type"	        The channel type used in other commands
                                        valid values are
                                          "O" - public channel
                                          "P" - private channel

      -role="system_admin"               The role used in other commands
                                         valid values are
                                           "" - The empty role is basic user
                                              permissions
                                           "system_admin" - Represents a system
                                              admin who has access to all teams
                                              and configuration settings.
  COMMANDS:
      -create_team                      Creates a team.  It requires the -team_name
                                        and -email flag to create a team.
          Example:
              platform -create_team -team_name="name" -email="user@example.com"

      -create_user                      Creates a user.  It requires the -email and -password flag,
                                         and -team_name and -username are optional to create a user.
          Example:
              platform -create_user -team_name="name" -email="user@example.com" -password="mypassword" -username="user"

      -invite_user                      Invites a user to a team by email. It requires the -team_name
                                          and -email flags.
          Example:
              platform -invite_user -team_name="name" -email="user@example.com"

      -join_team                        Joins a user to the team.  It requires the -email and
                                         -team_name flags.  You may need to logout of your current session
                                         for the new team to be applied.
          Example:
              platform -join_team -email="user@example.com" -team_name="name"

      -assign_role                      Assigns role to a user.  It requires the -role and
                                        -email flag.  You may need to log out
                                        of your current sessions for the new role to be
                                        applied.
          Example:
              platform -assign_role -email="user@example.com" -role="system_admin"

      -create_channel		        Create a new channel in the specified team. It requires the -email,
                                        -team_name, -channel_name, -channel_type flags. Optional you can set
                                        the -channel_header and -channel_purpose.
          Example:
              platform -create_channel -email="user@example.com" -team_name="name" -channel_name="channel_name" -channel_type="O"

      -join_channel                     Joins a user to the channel.  It requires the -email, -channel_name and
                                        -team_name flags.  You may need to logout of your current session
                                        for the new channel to be applied.  Requires an enterprise license.
          Example:
              platform -join_channel -email="user@example.com" -team_name="name" -channel_name="channel_name"

      -leave_channel                     Removes a user from the channel.  It requires the -email, -channel_name and
                                         -team_name flags.  You may need to logout of your current session
                                         for the channel to be removed.  Requires an enterprise license.
          Example:
              platform -leave_channel -email="user@example.com" -team_name="name" -channel_name="channel_name"

      -list_channels                     Lists all channels for a given team.
                                         It will append ' (archived)' to the channel name if archived.  It requires the
                                         -team_name flag.  Requires an enterprise license.
          Example:
              platform -list_channels -team_name="name"

      -restore_channel                  Restores a previously deleted channel.
                                        It requires the -channel_name flag and
                                        -team_name flag.  Requires an enterprise license.
          Example:
              platform -restore_channel -team_name="name" -channel_name="channel_name"

      -reset_password                   Resets the password for a user.  It requires the
                                        -email and -password flag.
          Example:
              platform -reset_password -email="user@example.com" -password="newpassword"

      -reset_mfa                        Turns off multi-factor authentication for a user.  It requires the
                                        -email or -username flag.
          Example:
              platform -reset_mfa -username="someuser"

      -reset_database                   Completely erases the database causing the loss of all data. This
                                        will reset Mattermost to it's initial state. (note this will not
                                        erase your configuration.)

          Example:
              platform -reset_database

      -permanent_delete_user            Permanently deletes a user and all related information
                                        including posts from the database.  It requires the
                                        -email flag.  You may need to restart the
                                        server to invalidate the cache
          Example:
              platform -permanent_delete_user -email="user@example.com"

      -permanent_delete_all_users       Permanently deletes all users and all related information
                                        including posts from the database.  It requires the
                                        -team_name, and -email flag.  You may need to restart the
                                        server to invalidate the cache
          Example:
              platform -permanent_delete_all_users -team_name="name" -email="user@example.com"

      -permanent_delete_team            Permanently deletes a team along with
                                        all related information including posts from the database.
                                        It requires the -team_name flag.  You may need to restart
                                        the server to invalidate the cache.
          Example:
              platform -permanent_delete_team -team_name="name"

      -upload_license                   Uploads a license to the server. Requires the -license flag.

          Example:
              platform -upload_license -license="/path/to/license/example.mattermost-license"

      -migrate_accounts                 Migrates accounts from one authentication provider to another.
                                        Requires -from_auth -to_auth and -match_field flags. Supported
                                        options for -from_auth: email, gitlab, saml. Supported options
                                        for -to_auth: ldap. Supported options for -match_field: email,
                                        username. Output will display any accounts that are not migrated
                                        successfully.

          Example:
              platform -migrate_accounts -from_auth email -to_auth ldap -match_field username

      -upgrade_db_30                   Upgrades the database from a version 2.x schema to version 3 see
                                        https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html

          Example:
              platform -upgrade_db_30

      -version                          Display the current of the Mattermost platform

      -help                             Displays this help page


Troubleshooting
^^^^^^^^^^^^^^^^^

Executing a command hangs and doesn't complete
------------------------------------------------

If you have Bleve search indexing enabled, temporarily disable it in **System Console > Experimental > Bleve** and run the command again. You can also optionally use the new `mmctl Command Line Tool <https://docs.mattermost.com/manage/mmctl-command-line-tool.html>`_.

Bleve does not support multiple processes opening and manipulating the same index. Therefore, if the Mattermost server is running, an attempt to run the CLI will lock when trying to open the indeces.

If you are not using the Bleve search indexing, feel free to post in our `Troubleshooting forum <https://docs.mattermost.com/install/troubleshooting.html>`__ to get help.

source/manage/cloud-data-residency.rst METASEP
Mattermost Cloud data residency
===============================

.. include:: ../_static/badges/allplans-cloud.rst
  :start-after: :nosearch:

Mattermost Cloud resides in the ``aws-us-east-1`` region, located in Virginia, United States. The following customer data will be stored at rest in this data center when using Mattermost Cloud:

- Channels, messages, replies, and channel membership information
- Boards and cards
- Playbooks and event runs
- User accounts and profiles 
- Files (e.g., images, docs, etc.) uploaded to the Mattermost Service
- Plugin, app- or bot-generated messages and files
- Data used to measure user count, usage, and revenue
- Data used for analytics and to measure quality of service, e.g., sanitized logs
- IDs generated by Mattermost on behalf of the customer

If you require your data to reside in an area outside of the United States, please contact the product team via `feedback-cloud@mattermost.com <feedback-cloud@mattermost.com>`_, or consider `deploying one of our self-hosted options <https://mattermost.com/deploy>`_ that provides full control of your data. You may also work with `one of our European partners <https://mattermost.com/partners>`_ for deploying and hosting your Mattermost server.

source/manage/cloud-data-export.rst METASEP
Mattermost workspace migration
==============================

.. include:: ../_static/badges/allplans-cloud.rst
  :start-after: :nosearch:

This document outlines the process for migrating from Mattermost Cloud to a Mattermost self-hosted instance. In the future, a process for migrating from Mattermost self-hosted to Mattermost Cloud will also be documented and provided here.

Migrating between two installations follows the same process that's documented below, regardless as to whether the source or destination of the migration is in the Cloud or self-hosted. **These steps will work for any Mattermost instance**, as long as the instances are running Mattermost v5.33 or later.

Migrate from Cloud to self-hosted
---------------------------------

You can migrate your Cloud workspace data to a self-hosted deployment at any time.

How does the process work?
--------------------------

Before you export and migrate your data, you must `install Mattermost <https://docs.mattermost.com/guides/deployment.html#install-guides>`_ on the server you’ll be using to run Mattermost. The migration is done using the mmctl CLI tool, which is a remote CLI tool for Mattermost that's installed locally and uses the Mattermost API. From Mattermost v6.0 onwards, mmctl is pre-installed. For versions prior to 6.0, first download the newest release from `the releases page <https://github.com/mattermost/mmctl/releases/tag/v6.1.0>`_, `install mmctl <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#install-mmctl>`_, and place the binary on your ``PATH``.

The `mmctl usage notes <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-usage-notes>`_ provide some additional context and information which you can reference before and during the process.

You'll be using the `mmctl export <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-export>`__ commands to export your Cloud data for channels, messages, users, etc. The export file is downloaded to a location specified in the export commands. Once the export is complete, you'll import the data into your self-hosted instance.

.. note::
  
  Prior to migrating your data from Cloud, please ensure you have the appropriate permissions within your organization to carry out the data export which may contain sensitive information. Mattermost is not liable for any actions taken after the data export.
  
  Moreover, the export process doesn’t include integrations or any custom data. Other aspects of your instance, such as specific security settings and requirements, are also not included. For assistance with migrating additional data and settings, see our support options: https://mattermost.com/support/.

Once mmctl is installed, we can generate the export from the source instance.

Authenticate
------------

Authentication is done with either Mattermost login credentials or an authentication token. First, use your administrator credentials to log into the instance with mmctl, replacing `example-source-domain.com` with the network address of the source instance:

.. code::

   $ mmctl auth login https://yourdomain.cloud.mattermost.com
   
You'll be prompted for a username (use your admin user), password, and for a connection name. The connection name can be anything you want, and it's used to identify this set of credentials in the future, for your convenience. Then you will be able to start the export process.

Create the export
-----------------

Once you're logged in, run:

.. code::

   $ mmctl export create --attachments

This will create a full export of the server, and include attached files. Leave out ``--attachments`` if you do not wish to export attached files from your instance. This process can take some time, so ``mmctl`` will return immediately, and the job will run in the background on the Mattermost instance until the export is fully created. If successful, the command will immediately output a job ID, like this:

.. code::

   Export process job successfully created, ID: yfrr9ku5i7fjubeshs1ksrknzc

While the job is running, its status can be checked using the ID that was provided when it was created, and when it's done the output will look similar to this:

.. code::

  $ mmctl export job show yfrr9ku5i7fjubeshs1ksrknzc
    ID: yfrr9ku5i7fjubeshs1ksrknzc
    Status: success
    Created: 2021-11-03 10:44:13 -0500 CDT
    Started: 2021-11-03 10:44:23 -0500 CDT

Download the export
-------------------

Once the status is ``success``, you can download the export onto your local machine. First, discover the name of the completed export file with ``mmctl export list``:

.. code::

   $ mmctl export list
   r3kcj8yuwbramdt714doafi3oo_export.zip

This will show all of the exports on the server, so be sure to download the latest one and to delete it when you're done to save storage. Download the file with a command like the following, but with the filename of the export on your server:

.. code::

   $ mmctl export download r3kcj8yuwbramdt714doafi3oo_export.zip

Upload the export to the new server
-----------------------------------

Finally, it's time to take our export from the source server and use it as an import into the destination server. First, log into the destination server using mmctl the same way you logged into the source server:

.. code::

   $ mmctl auth login https://localinstance.company.com

Use the following command to upload the export to the destination server. The speed of the upload may vary based on connection speed. When the upload is complete the command will return with the ID of the import:

.. code::
  
   mmctl import upload r3kcj8yuwbramdt714doafi3oo_export.zip
   Upload session successfully created, ID: cfuq6q9kkjrqfgnph1pew3db4e
   Import file successfully uploaded, name: xrzs9wrzufntbfcxpy39mdq9hy

Complete the import into the new server
---------------------------------------

.. code::

   $ mmctl import list available
   cfuq6q9kkjrqfgnph1pew3db4e_r3kcj8yuwbramdt714doafi3oo_export.zip

Run the import job to process to import the export file into the server. The speed of this process may vary based on connection speed. First, start the import process:

.. code::
   
   $ mmctl import process cfuq6q9kkjrqfgnph1pew3db4e_r3kcj8yuwbramdt714doafi3oo_export.zip

Once you've marked the file for processing, you can check the status of the job using ``mmctl import job list``:

.. code::

  $ mmctl --local import job list
    ID: f93jxu1hzty79enwa1xy6f1tbr
    Status: pending
    Created: 2021-10-28 13:32:55 +0200 CEST

When the job is complete, the ``success`` status is displayed:

.. code::

  $ mmctl --local import job list
    ID: f93jxu1hzty79enwa1xy6f1tbr
    Status: success
    Created: 2021-10-28 13:32:55 +0200 CEST
    Started: 2021-10-28 13:33:05 +0200 CEST

Then extract the export file to use it by running the following mmctl command:

.. code::
   
   mmctl extract run [flags].

Once your migration is complete and you’ve imported your data into your self-hosted instance we recommend that you take a few days to validate your data and ensure everything is working as expected before taking down your Cloud instance.

.. note:: If you are using email/password authentication, your users must reset their passwords.

If you encounter any issues or problems, please contact our Support team via https://customers.mattermost.com/cloud/contact-us, or through the `Mattermost Help Center <https://support.mattermost.com/>`_.

Migrate from self-hosted to Cloud
----------------------------------

When you migrate from self-hosted to Cloud, you'll need to open a ticket with the Mattermost Support team so they can assist you with the process. The information below describes the migration process. Before you get started, visit our `Support site <https://support.mattermost.com/hc/en-us/requests/new>`_ to open a ticket. 

.. note:: This migration process is only available to customers using paid Mattermost editions.

Before you begin your migration, ensure you’re on Mattermost version 6.5 (or later) as this contains the latest version of the server and the mmctl tool which is used to perform the export. You also need to take note of the following information before you begin:

**User Authentication**

If you are using the email login method, users will need to reset their passwords after the migration has been completed. Other authentication methods, such as LDAP and GitLab SSO, required changes to your infrastructure allowing the specific authentication method to function in Mattermost cloud.

**Plugins**

If you’re using plugins that aren’t listed on the Marketplace, they won’t be included in the export and you won’t have access to them going forward. You can view the list of plugins `in the Support knowledgebase <https://support.mattermost.com/hc/en-us/articles/5346624843924>`_.

**Data**

The migration only includes data from Channels. No Boards or Playbooks data is exported.

Migration process
^^^^^^^^^^^^^^^^^

**Export from your self-hosted instance**

Use your administrator credentials to log into your self-hosted Mattermost server. Once you're logged in, run:

.. code:: 
   
   $ mmctl export create --attachments

This creates a full export of the server, and includes attached files. If you don’t want to export attached files, leave out ``--attachments``.

This process can take some time, so ``mmctl`` will return immediately, and the job will run in the background until the export is fully created. If successful, the command will immediately output a job ID, like this:

.. code::
  
  Export process job successfully created, ID: yfrr9ku5i7fjubeshs1ksrknzc

While the job is running, its status can be checked using the ID that was provided when it was created, and when it's done the output will look similar to this:

.. code::

    $ mmctl export job show yfrr9ku5i7fjubeshs1ksrknzc
      ID: yfrr9ku5i7fjubeshs1ksrknzc
      Status: success
      Created: 2021-11-03 10:44:13 -0500 CDT
      Started: 2021-11-03 10:44:23 -0500 CDT

The completed file will be downloaded to your desktop as a ``.zip`` file.


.. note:: 
   
   Do not rename the file as the file name is referenced in log files, which are used by the Support team to validate the exported file.

The Support team will provide you with S3 credentials so you can upload the exported file. Once you’ve uploaded the file, please contact the Support team and let them know.

Create a new workspace on the Mattermost Cloud
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

In the meantime, you can log into Mattermost Cloud with your Mattermost credentials and create a Cloud workspace. 

.. note:: 
   
   Do not create any users in your Mattermost Cloud instance as the migration process performs this task for you.

Importing your data into your Mattermost Cloud instance
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Once the export upload to the provided S3 bucket is complete and you’ve shared your Mattermost Cloud instance name/URL, Support can begin the import step.

Depending on the size of the export this process can take some time. Support will contact you as soon as the import is complete. During this time it is highly recommended you do not use your Mattermost Cloud instance.

Start using your Mattermost Cloud instance
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

When the export is complete, you can log into your Cloud instance and can invite your users to log in. 

.. note:: 
  
  It’s recommended that you keep your self-hosted Mattermost server until you’ve been using your Cloud instance for a while and all is verified as is as expected.

source/manage/cloud-billing.rst METASEP
Mattermost Cloud billing
========================

.. include:: ../_static/badges/allplans-cloud.rst
  :start-after: :nosearch:

Mattermost Cloud is offered as a pay-as-you-go subscription service.

You will be billed for registered users in your workspace. A registered user is a user who has an account in a workspace and does not show as *Inactive* in **System Console > User Management > Users**. Registered users will count towards your monthly invoice each day as long as they are not deactivated in the billing period.

Mattermost Cloud workspaces can be used free forever with Cloud Starter. You can upgrade to a monthly per-user subscription, with Mattermost Professional and Mattermost Enterprise. 

Please see the `Cloud subscriptions <https://docs.mattermost.com/about/cloud-subscriptions.html>`__ documentation for more detailed information on the Cloud billing process.

source/manage/bulk-export-tool.rst METASEP
.. _bulk-export:

Bulk export tool
================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Moving data from one Mattermost instance into another begins with exporting data to a `JSONL <https://jsonlines.org>`__ file using the
`bulk loading feature <https://docs.mattermost.com/onboard/bulk-loading-data.html>`__. This tool is useful if you have created a server for a proof of concept, have created another server for production use, and now want to retain the history from the proof of concept instance.

You can export the following data types:

- Teams
- Channels (Public and Private)
- Users
- Users' Team memberships
- Users' Channel memberships
- Posts (Posts in the public/private channels and also replies to those posts)

.. include:: bulk-export-data.rst
  :start-after: :nosearch:
source/manage/bulk-export-data.rst METASEP
:nosearch:

Bulk export data
----------------

.. tabs::

  .. tab:: Use mmctl

    1. Create a full export file including attachments by running the `mmctl export create -- attachments <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-export-create>`__ command. See the `Mattermost workspace migration <https://docs.mattermost.com/manage/cloud-data-export.html#create-the-export>`__ documentation for details.
    
    2. While the job is running, you can check its status by running the `mmctl export job show <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-export-job-show>`__ command.

    3. When the export job status is successful:
    
      a. Identify the name of the completed export file by running the `mmctl export list <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-export-list>`__ command.
      b. Download the export file to your local machine by running the `mmctl export download <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-export-download>`__ command.

  .. tab:: Use CLI

    The export command runs in the `CLI <https://docs.mattermost.com/manage/command-line-tools.html>`__.  It has permissions to access all information in the Mattermost database.

    To run the export command:

    1.  Navigate to the directory where the Mattermost server is installed. On a default install of Mattermost, the directory is ``/opt/mattermost``.
    2.  Run the following command to extract data from all teams on the server. Note that you can change the file name and specify an absolute or relative path to dictate where the file is exported:
  
        ``sudo -u mattermost bin/mattermost export bulk file.json --all-teams``

        ``sudo -u mattermost bin/mattermost export bulk /home/user/bulk_data.json --all-teams``
  
    3.  Retrieve your file from the location you specified.

At this time, the export supports attributes of the objects listed below. All Mattermost bulk export data files will begin with a `Version` object as the first line of the file. This indicates the version of the Mattermost bulk import file format with which the exported data is compatible.

You can export the following data types:

- Teams
- Channels (public and private)
- Users
- Users' team memberships
- Users' channel memberships
- Users' notification preferences
- Posts (regular, non-reply posts)
- Posts' replies
- Posts' reactions
- Custom emoji
- Direct message channels
- Direct message posts

.. note::

   Configuration for data types such as exporting specific areas of the server, exporting additional types of posts, permissions schemes, file attachments, webhooks, and bot messages is not yet supported. Deleted objects are also not yet supported.
  
   For requests to add additional attributes or objects to our exporter, please add a feature request on our `feature idea forum <https://mattermost.uservoice.com/forums/306457-general>`__.

Version object
--------------

.. raw:: html

  <table width="100%" border="1" cellpadding="5px" style="margin-bottom:20px;">
    <tr class="row-odd">
      <th class="head">Field name</th>
      <th class="head">Type</th>
      <th class="head">Description</th>
    </tr>
    <tr class="row-odd">
      <td valign="middle">type</td>
      <td valign="middle">string</td>
      <td>The string "version"</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">version</td>
      <td valign="middle">number</td>
      <td>The number 1.</td>
    </tr>
  </table>
  
Team object
-----------

.. raw:: html

  <table width="100%" border="1" cellpadding="5px" style="margin-bottom:20px;">
    <tr class="row-odd">
      <th class="head">Field name</th>
      <th class="head">Type</th>
      <th class="head">Description</th>
    </tr>
    <tr class="row-odd">
      <td valign="middle">name</td>
      <td valign="middle">string</td>
      <td>The team name.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">display_name</td>
      <td valign="middle">string</td>
      <td>The display name for the team.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">type</td>
      <td valign="middle">string</td>
      <td>The type of team. Will have one of the following values:<br>
          <kbd>"O"</kbd> for an open team<br>
          <kbd>"I"</kbd> for an invite-only team.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">description</td>
      <td valign="middle">string</td>
      <td>The team description.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">allow_open_invite</td>
      <td valign="middle">bool</td>
      <td>Whether to allow open invitations. Will have one of the following values:<br>
        <kbd>"true"</kbd><br>
        <kbd>"false"</kbd></td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">scheme</td>
      <td valign="middle">string</td>
      <td>The name of the permissions scheme that applies to this team.</td>
    </tr>
  </table>

Channel object
--------------

.. raw:: html

  <table width="100%" border="1" cellpadding="5px" style="margin-bottom:20px;">
    <tr class="row-odd">
      <th class="head">Field name</th>
      <th class="head">Type</th>
      <th class="head">Description</th>
    </tr>
    <tr class="row-odd">
      <td valign="middle">team</td>
      <td valign="middle">string</td>
      <td>The name of the team this channel belongs to.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">name</td>
      <td valign="middle">string</td>
      <td>The name of the channel.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">display_name</td>
      <td valign="middle">string</td>
      <td>The display name for the channel.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">type</td>
      <td valign="middle">string</td>
      <td>The type of channel. Will have one the following values:<br>
          <kbd>"O"</kbd> for a public channel.<br>
          <kbd>"P"</kbd> for a private channel.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">header</td>
      <td valign="middle">string</td>
      <td>The channel header.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">purpose</td>
      <td valign="middle">string</td>
      <td>The channel purpose.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">scheme</td>
      <td valign="middle">string</td>
      <td>The name of the permissions scheme that applies to this team.</td>
    </tr>
  </table>
  
User object
-----------

.. raw:: html

  <table width="100%" border="1" cellpadding="5px" style="margin-bottom:20px;">
    <tr class="row-odd">
      <th class="head">Field name</th>
      <th class="head">Type</th>
      <th class="head">Description</th>
    </tr>
    <tr class="row-odd">
      <td valign="middle">username</td>
      <td valign="middle">string</td>
      <td>The user’s username. This is the unique identifier for the user.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">email</td>
      <td valign="middle">string</td>
      <td>The user’s email address.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">auth_service</td>
      <td valign="middle">string</td>
      <td>The authentication service used for this user account. This field will be absent for user/password authentication.<br>
        <kbd>"gitlab"</kbd> - GitLab authentication.<br>
        <kbd>"ldap"</kbd> - LDAP authentication (Enterprise and Professional)<br>
        <kbd>"saml"</kbd> - Generic SAML based authentication (Enterprise)<br>
        <kbd>"google"</kbd> - Google OAuth authentication (Enterprise)<br>
        <kbd>"office365"</kbd> - Microsoft Office 365 OAuth Authentication (Enterprise)</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">auth_data</td>
      <td valign="middle">string</td>
      <td>The authentication data if <kbd>auth_service</kbd> is used. The value depends on the <kbd>auth_service</kbd> that is specified.<br>
        The data comes from the following fields for the respective auth_services:<br>
        <kbd>"gitlab"</kbd> - The value of the Id attribute provided in the GitLab auth data.<br>
        <kbd>"ldap"</kbd> - The value of the LDAP attribute specified as the "ID Attribute" in the Mattermost LDAP configuration.<br>
        <kbd>"saml"</kbd> - The value of the SAML email address attribute.<br>
        <kbd>"google"</kbd> - The value of the OAuth Id attribute.<br>
        <kbd>"office365"</kbd> - The value of the OAuth Id attribute.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">nickname</td>
      <td valign="middle">string</td>
      <td>The user’s nickname.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">first_name</td>
      <td valign="middle">string</td>
      <td>The user’s first name.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">last_name</td>
      <td valign="middle">string</td>
      <td>The user’s last name.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">position</td>
      <td valign="middle">string</td>
      <td>The user’s position.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">roles</td>
      <td valign="middle">string</td>
      <td>The user’s roles. </td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">locale</td>
      <td valign="middle">string</td>
      <td>The user’s localization configuration.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">use_markdown_preview</td>
      <td valign="middle">bool</td>
      <td><kbd>"true"</kbd> if the user has enabled markdown preview in the message input box.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">use_formatting</td>
      <td valign="middle">bool</td>
      <td><kbd>"true"</kbd> if the user has enabled post formatting for links, emoji, text styles, and line breaks.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">show_unread_section</td>
      <td valign="middle">string</td>
      <td><kbd>"true"</kbd> if the user has enabled showing unread messages at top of channel sidebar.</td>
    </tr> 
    <tr class="row-odd">
      <td valign="middle">theme</td>
      <td valign="middle">string</td>
      <td>The user’s theme. Formatted as a Mattermost theme string.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">military_time</td>
      <td valign="middle">string</td>
      <td><kbd>"true"</kbd> if the user has enabled a 24-hour clock. <kbd>"false"</kbd> if using a 12-hour clock.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">collapse_previews</td>
      <td valign="middle">string</td>
      <td><kbd>"true"</kbd> if user collapses link preview by default. <kbd>"false"</kbd> if user expands link previews by default.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">message_display</td>
      <td valign="middle">string</td>
      <td>The style the user prefers for displayed messages. Options are <kbd>"clean"</kbd> if the user uses the standard style or <kbd>"compact"</kbd> if the user uses compact style.</td>
    </tr> 
    <tr class="row-odd">
      <td valign="middle">channel_display_mode</td>
      <td valign="middle">string</td>
      <td><kbd>"full"</kbd> if the users displays channel messages at the full width of the screen or <kbd>"centered"</kbd> if the user uses a fixed width, centered block.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">tutorial_step</td>
      <td valign="middle">string</td>
      <td><kbd>"1"</kbd>, <kbd>"2"</kbd>, or <kbd>"3"</kbd> indicates which specified tutorial step to start with for the user. <kbd>"999"</kbd> skips the tutorial.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">email_interval</td>
      <td valign="middle">string</td>
      <td>Email batching interval to use during bulk import. </td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">delete_at</td>
      <td valign="middle">int64</td>
      <td>Timestamp of when the user was deactivated.</td>
    </tr>    
    <tr class="row-odd">
      <td valign="middle">teams</td>
      <td valign="middle">array</td>
      <td>The teams which the user is member of. Is an array of <b>UserTeamMembership</b> objects.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">notify_props</td>
      <td valign="middle">object</td>
      <td>The user’s notify preferences, as defined by the <b>UserNotifyProps</b> object.</td>
    </tr>
  </table>

UserNotifyProps object
----------------------

This object is a member of the User object.

.. raw:: html

  <table width="100%" border="1" cellpadding="5px" style="margin-bottom:20px;">
    <tr class="row-odd">
      <th class="head">Field name</th>
      <th class="head">Type</th>
      <th class="head">Description</th>
    </tr>
    <tr class="row-odd">
      <td valign="middle">desktop</td>
      <td valign="middle">string</td>
      <td>Preference for sending desktop notifications. Will be one of the following values:<br>
      <kbd>"all"</kbd> - For all activity.<br>
      <kbd>"mention"</kbd> - Only for mentions.<br>
      <kbd>"none"</kbd> - Never.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">desktop_sound</td>
      <td valign="middle">string</td>
      <td>Preference for whether desktop notification sound is played. Will be one of the following values:<br>
      <kbd>"true"</kbd> - Sound is played.<br>
      <kbd>"false"</kbd> - Sound is not played.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">email</td>
      <td valign="middle">string</td>
      <td>Preference for email notifications. Will be one of the following values:<br>
      <kbd>"true"</kbd> - Email notifications are sent immediately.<br>
      <kbd>"false"</kbd> - Email notifications are not sent.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">mobile</td>
      <td valign="middle">string</td>
      <td>Preference for sending mobile push notifications. Will be one of the following values:<br>
      <kbd>"all"</kbd> - For all activity.<br>
      <kbd>"mention"</kbd> - Only for mentions.<br>
      <kbd>"none"</kbd> - Never.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">mobile_push_status</td>
      <td valign="middle">string</td>
      <td>Preference for when push notifications are triggered. Will be one of the following values:<br>
      <kbd>"online"</kbd> - When online, away or offline.<br>
      <kbd>"away"</kbd> - When away or offline.<br>
      <kbd>"offline"</kbd> - When offline.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">channel</td>
      <td valign="middle">string</td>
      <td>Preference for whether @all, @channel, and @here trigger mentions. Will be one of the following values:<br>
      <kbd>"true"</kbd> - Mentions are triggered.<br>
      <kbd>"false"</kbd> - Mentions are not triggered.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">comments</td>
      <td valign="middle">string</td>
      <td>Preference for reply mention notifications. Will be one of the following values:<br>
      <kbd>"any"</kbd> - Trigger notifications on messages in reply threads that the user starts or participates in.<br>
      <kbd>"root"</kbd> - Trigger notifications on messages in threads that the user starts.<br>
      <kbd>"never"</kbd> - Do not trigger notifications on messages in reply threads unless the user is mentioned.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">mention_keys</td>
      <td valign="middle">string</td>
      <td>Preference for custom non-case sensitive words that trigger mentions. Words are separated by commas.</td>
    </tr>
  </table>

UserTeamMembership object
-------------------------

.. raw:: html

  <table width="100%" border="1" cellpadding="5px" style="margin-bottom:20px;">
    <tr class="row-odd">
      <th class="head">Field name</th>
      <th class="head">Type</th>
      <th class="head">Description</th>
    </tr>
    <tr class="row-odd">
      <td valign="middle">name</td>
      <td valign="middle">string</td>
      <td>The name of the team this user is a member of.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">roles</td>
      <td valign="middle">string</td>
      <td>The roles the user has within this team. </td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">theme</td>
      <td valign="middle">string</td>
      <td>The user’s theme for this team. Formatted as a Mattermost theme string.</td>
    </tr>
     <tr class="row-odd">
      <td valign="middle">channels</td>
      <td valign="middle">array</td>
      <td>The channels within this team that the user is a member of. Listed as an array of <b>UserChannelMembership</b> objects.</td>
    </tr>
  </table>

UserChannelMembership object
----------------------------

.. raw:: html

  <table width="100%" border="1" cellpadding="5px" style="margin-bottom:20px;">
    <tr class="row-odd">
      <th class="head">Field name</th>
      <th class="head">Type</th>
      <th class="head">Description</th>
    </tr>
    <tr class="row-odd">
      <td valign="middle">name</td>
      <td valign="middle">string</td>
      <td>The name of the channel in the parent team that this user is a member of.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">roles</td>
      <td valign="middle">string</td>
      <td>The roles the user has within this channel. </td>
    </tr>
        <tr class="row-odd">
      <td valign="middle">notify_props</td>
      <td valign="middle">object</td>
      <td>The notify preferences for this user in this channel as defined by the <b>ChannelNotifyProps</b> object.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">favorite</td>
      <td valign="middle">boolean</td>
      <td>Whether the channel is marked as a favorite for this user. Will be one of the following values:<br>
          <kbd>"true"</kbd> - Yes.<br>
          <kbd>"false"</kbd> - No.</td>
      </td>
    </tr>
  </table>

ChannelNotifyProps object
~~~~~~~~~~~~~~~~~~~~~~~~~

This object is a member of the ChannelMembership object.

.. raw:: html

  <table width="100%" border="1" cellpadding="5px" style="margin-bottom:20px;">
    <tr class="row-odd">
      <th class="head">Field name</th>
      <th class="head">Type</th>
      <th class="head">Description</th>
    </tr>
    <tr class="row-odd">
      <td valign="middle">desktop</td>
      <td valign="middle">string</td>
      <td>Preference for sending desktop notifications. Will be one of the following values:<br>
      <kbd>"default"</kbd> - Global default.<br>
      <kbd>"all"</kbd> - For all activity.<br>
      <kbd>"mention"</kbd> - Only for mentions.<br>
      <kbd>"none"</kbd> - Never.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">mobile</td>
      <td valign="middle">string</td>
      <td>Preference for sending mobile notifications. Will be one of the following values:<br>
      <kbd>"default"</kbd> - Global default.<br>
      <kbd>"all"</kbd> - For all activity.<br>
      <kbd>"mention"</kbd> - Only for mentions.<br>
      <kbd>"none"</kbd> - Never.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">mark_unread</td>
      <td valign="middle">string</td>
      <td>Preference for marking channel as unread. Will be one of the following values:<br>
          <kbd>"all"</kbd> - For all unread messages.<br>
          <kbd>"mention"</kbd> - Only for mentions.</td>
    </tr>
  </table>

Post object
-----------

.. raw:: html

  <table width="100%" border="1" cellpadding="5px" style="margin-bottom:20px;">
    <tr class="row-odd">
      <th class="head">Field name</th>
      <th class="head">Type</th>
      <th class="head">Description</th>
    </tr>
    <tr class="row-odd">
      <td valign="middle">team</td>
      <td valign="middle">string</td>
      <td>The name of the team that this post is in.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">channel</td>
      <td valign="middle">string</td>
      <td>The name of the channel that this post is in.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">user</td>
      <td valign="middle">string</td>
      <td>The username of the user for this post.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">message</td>
      <td valign="middle">string</td>
      <td>The message that the post contains.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">props</td>
      <td valign="middle">object</td>
      <td>The props for a post. Contains additional formatting information used by integrations and bot posts. For a more detailed explanation see the <a href="https://docs.mattermost.com/developer/message-attachments.html">message attachments documentation</a>.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">create_at</td>
      <td valign="middle">int</td>
      <td>The timestamp for the post, in milliseconds since the Unix epoch.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">reactions</td>
      <td valign="middle">array</td>
      <td>The emoji reactions to this post. Will be an array of Reaction objects.</td>
  </table>
  
Reply object
------------

.. raw:: html

  <table width="100%" border="1" cellpadding="5px" style="margin-bottom:20px;">
    <tr class="row-odd">
      <th class="head">Field name</th>
      <th class="head">Type</th>
      <th class="head">Description</th>
    </tr>
    <tr class="row-odd">
      <td valign="middle">user</td>
      <td valign="middle">string</td>
      <td>The username of the user for this reply.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">message</td>
      <td valign="middle">string</td>
      <td>The message that the reply contains.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">create_at</td>
      <td valign="middle">int</td>
      <td>The timestamp for the reply, in milliseconds since the Unix epoch.</td>
    </tr>
  </table>
  
Reaction object
---------------

This object is a member of the Post object.

.. raw:: html

  <table width="100%" border="1" cellpadding="5px" style="margin-bottom:20px;">
    <tr class="row-odd">
      <th class="head">Field name</th>
      <th class="head">Type</th>
      <th class="head">Description</th>
    </tr>
    <tr class="row-odd">
      <td valign="middle">user</td>
      <td valign="middle">string</td>
      <td>The username of the user for this reply.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">emoji_name</td>
      <td valign="middle">string</td>
      <td>The emoji of the reaction.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">create_at</td>
      <td valign="middle">int</td>
      <td>The timestamp for the reply, in milliseconds since the Unix epoch.</td>
    </tr>
  </table>

Emoji object
------------

.. raw:: html

  <table width="100%" border="1" cellpadding="5px" style="margin-bottom:20px;">
    <tr class="row-odd">
      <th class="head">Field name</th>
      <th class="head">Type</th>
      <th class="head">Description</th>
    </tr>
    <tr class="row-odd">
      <td valign="middle">name</td>
      <td valign="middle">string</td>
      <td>The emoji name.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">image</td>
      <td valign="middle">string</td>
      <td>The path (either absolute or relative to the current working directory) to the image file for this emoji.</td>
    </tr>
  </table>
  
DirectChannel object
--------------------

.. raw:: html

  <table width="100%" border="1" cellpadding="5px" style="margin-bottom:20px;">
    <tr class="row-odd">
      <th class="head">Field name</th>
      <th class="head">Type</th>
      <th class="head">Description</th>
    </tr>
    <tr class="row-odd">
      <td valign="middle">members</td>
      <td valign="middle">array</td>
      <td>List of channel members.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">header</td>
      <td valign="middle">string</td>
      <td>The channel header.</td>
    </tr>
  </table>
  
DirectPost object
-----------------

.. raw:: html

  <table width="100%" border="1" cellpadding="5px" style="margin-bottom:20px;">
    <tr class="row-odd">
      <th class="head">Field name</th>
      <th class="head">Type</th>
      <th class="head">Description</th>
    </tr>
    <tr class="row-odd">
      <td valign="middle">user</td>
      <td valign="middle">string</td>
      <td>The username of the user for this post.</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">message</td>
      <td valign="middle">string</td>
      <td>The message that the post contains.</td>
    </tr>
        <tr class="row-odd">
      <td valign="middle">create_at</td>
      <td valign="middle">int</td>
      <td>The timestamp for the post, in milliseconds since the Unix epoch.</td>
  </table>

source/manage/announcement-banner.rst METASEP
Announcement banner
===================

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Mattermost Enterprise Edition E10 and E20*

System Admins can display a notice that's visible to all users on the system via an announcement banner. The announcement banner is disabled by default, so System Admins must first `enable this feature <https://docs.mattermost.com/configure/configuration-settings.html#enable-announcement-banner>`__ within the System Console or via the ``config.json`` file.

.. image:: ../images/announcement-banner-1106x272.png
  :width: 1106
  :height: 272
  :alt: An example of an announcement banner displayed in Mattermost Channels notifying all users that the system will be going down for maintenance later that evening. System Admins enable the banner and customize the text to display, as well as configure whether or not users can dismiss the banner.

.. note::

   The announcement banner is not displayed in the Boards or Playbooks tabs.

.. image:: ../images/announcement-banner.png
  :alt: System Admins can display an announcement banner at the top of the user's screen.

By default, users can dismiss the banner until they log in again or until you update the banner. You can `configure Mattermost to prevent users from dismissing the banner <https://docs.mattermost.com/configure/configuration-settings.html#allow-banner-dismissal>`__.

Update the banner by either changing the text of the banner or by re-enabling the banner after it's been disabled. You can also control the text color and the background color.

Configure an announcement banner
---------------------------------

1. Enable the announcement banner by going to **System Console > Site Configuration > Announcement Banner**, and setting **Enable Announcement Banner** to **true**.
2. In the **Banner Text** field, enter the text of the announcement that you want to make.
3. Specify the background and text colors for the banner.
4. To prevent users from dismissing the banner, set **Allow Banner Dismissal** to **false**.
5. Select **Save**.

To disable the banner, set **Enable Announcement Banner** to **false**.

source/install/troubleshooting.rst METASEP
..  _troubleshooting:

Troubleshooting Mattermost issues
=================================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This document summarizes common troubleshooting issues and techniques.

Depending on the type of error or problem you're experiencing, refer to the sections below for troubleshooting guidance. If you're a new user, it might help to go over the installation steps again to confirm the process.

If you have a `paid subscription to a Mattermost offering <https://docs.mattermost.com/about/editions-and-offerings.html>`_, such as `Mattermost Professional <https://docs.mattermost.com/about/editions-and-offerings.html#mattermost-professional>`_ or `Mattermost Enterprise <https://docs.mattermost.com/about/editions-and-offerings.html#mattermost-enterprise>`_, you're entitled to open support tickets via our `online support portal <https://support.mattermost.com/hc/en-us/requests/new>`_. 

Additionally, peer-to-peer support is available for all Mattermost users in our `troubleshooting forum <https://forum.mattermost.com/c/trouble-shoot>`__ and on our `community server <https://community.mattermost.com/core/channels/peer-to-peer-help>`_. 

Important notes
---------------

- Do not manipulate the Mattermost database directly. Mattermost is designed to stop working if data integrity is compromised.
- Any manipulation of the database must be done using the built in command line tools.
- Start simple with the step-by-step install guides for your operating system.

Deployment troubleshooting
--------------------------

Docker deployments
~~~~~~~~~~~~~~~~~~

If you're deploying the Mattermost server using Docker on an M1 Mac and encountering permission issues in the Docker container, `re-create the required directories and set their permissions <https://docs.mattermost.com/guides/deployment.html#deploy-mattermost-for-production-use>`__, then skip the following command:

.. code:: bash

   sudo chown -R 2000:2000 ./volumes/app/mattermost

On M1 systems, this permission change causes the deploy to stop working, so we recommend skipping this step altogether.

If you're experiencing issues deploying on Docker generally, ensure the docker daemon is enabled and running:

.. code:: bash
  
   sudo systemctl enable --now docker

To remove all data and settings for your Mattermost deployment:

.. code:: bash

   sudo rm -rf ./volumes

Postgres issues
~~~~~~~~~~~~~~~

You can change the Postgres username and/or password (recommended) in the ``.env`` file.

TLS and NGINX issues
~~~~~~~~~~~~~~~~~~~~~

For an in-depth guide to configuring the TLS certificate and key for NGINX, please refer to `this document in the repository <https://github.com/mattermost/docker/blob/main/docs/issuing-letsencrypt-certificate.md>`__.

Install a different version of Mattermost
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Shut down your deployment.

2. Run ``git pull`` to fetch any recent changes to the repository, paying attention to any potential ``env.example`` changes.

3. Adjust the ``MATTERMOST_IMAGE_TAG`` in the ``.env`` file to point your desired `enterprise <https://hub.docker.com/r/mattermost/mattermost-enterprise-edition/tags?page=1&ordering=last_updated>`__ or `team <https://hub.docker.com/r/mattermost/mattermost-team-edition/tags?page=1&ordering=last_updated>`__ image version.

4. Redeploy Mattermost.

Upgrading from ``mattermost-docker``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

For an in-depth guide to upgrading from the deprecated `mattermost-docker repository <https://github.com/mattermost/mattermost-docker>`__, please refer to `this document <https://github.com/mattermost/docker/blob/main/scripts/UPGRADE.md>`__. For additional help, please refer to `this issue <https://github.com/mattermost/mattermost-docker/issues/489>`__.

General troubleshooting
-----------------------

Some of these suggestions can be done directly, and others may need consultation from your network administrator.

Review Mattermost logs
----------------------

You can access logs for Mattermost and use them for troubleshooting. These steps assume that you have `System Admin permissions <https://docs.mattermost.com/help/getting-started/managing-members.html#system-admin>`__.

Mattermost Server logs 
----------------------

- Ensure that log files are being created: Navigate to **System Console > Environment > Logging**, confirm that **Output logs to file** is set to **true**.
- You can obtain the path for the log files in **System Console > Environment > Logging > File Log Directory**.

The resulting server log file is called ``mattermost.log`` and can be opened with a standard text editor or shared directly.

.. note::
    For a more complete log open **System Console > Environment > Logging**, set **File Log Level** to **DEBUG**, then replicate the issue to log it again. Make sure to revert the file log level to **INFO** after troubleshooting to save disk space.

If filesystem access is not possible, navigate to **System Console > Reporting > Server Logs** to locate the current system logs which can be copied to a file.

You can find more on logging settings `here <https://docs.mattermost.com/configure/configuration-settings.html#standard-logging>`__.

Mattermost Desktop App logs
---------------------------

The desktop app log file can be found in the user directory:

- **Windows:** ``%userprofile%\AppData\Roaming\Mattermost\logs``
- **Linux:** ``~/.local/share/Mattermost/logs`` OR ``~/.config/Mattermost/logs``
- **MacOS:** ``~/Library/Logs/Mattermost`` (DMG installation) OR ``~Library/Containers/Mattermost.Desktop/Data/Library/Logs/Mattermost`` (Appstore installation)

Mattermost Browser App logs
---------------------------

The browser-based app does not produce additional log files. If the app has to be debugged, use the development tools integrated in your browser for action history. 

Mattermost Push Notification Service logs
-----------------------------------------

Logging for the Mattermost Push Notification Service is handled via system log with logger and is appended to ``/var/log/syslog``.

Review Mattermost environment
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Put together a timeline to eliminate events prior to the error/problem occurring. For example, if you recently reconfigured your firewall and are now having connection issues it might be worth reviewing the settings or rolling back to see whether that resolves the problem.

- If the problem occurred subsequent to some period of normal operation, did anything change in the environment?
    - Was the client, host, or server upgraded?
    - Was an operating system update applied?
    - Did the network environment change? For example, was a server moved or a domain migrated?
    - Did the system (client or server) recently fail or abnormally terminate?
- How many users are impacted?
    - Is this problem affecting one, some, or all users?
    - Is the problem occurring only for a user who was recently added to the environment, such as a new employee?
    - Do differences exist between the users who are affected and the users who are not affected?

You can also search the error messages online. Existing solutions from our `forum <https://forum.mattermost.com/t/how-to-use-the-troubleshooting-forum/150>`__ can often be found and applied.

Connect to another server
-------------------------

1. Create an account at https://community.mattermost.com.
2. Erase your mobile application and reinstall it.
3. In your mobile app, enter the server URL https://community.mattermost.com and then your login credentials to test whether the connection is working.

Connect with another device
---------------------------

- If you have another mobile device available, try connecting with that to see if your issue still reproduces.
- If you don’t have another device available, check with other teammates to see if they are having the same issue.

Opening a support ticket for self-hosted deployments
----------------------------------------------------

If you have a `paid subscription to a Mattermost offering <https://docs.mattermost.com/about/editions-and-offerings.html>`_, such as `Mattermost Professional <https://docs.mattermost.com/about/editions-and-offerings.html#mattermost-professional>`_ or `Mattermost Enterprise <https://docs.mattermost.com/about/editions-and-offerings.html#mattermost-enterprise>`_, you're entitled to open support tickets via our `online support portal <https://support.mattermost.com/hc/en-us/requests/new>`_. 

When opening a Support ticket as part of your paid subscription, it's important that you provide us with as much information as you can in a timely manner. Knowing what information is relevant can be confusing. We use the anagram C.L.U.E.S. to remember what we need:

* Configurations
* Logs
* Users affected
* Environment
* Steps to reproduce

C.L.U.E.S. represents all of the information that can clarify your issue. With these details, we can begin searching for a cause, whether it's a simple configuration change or a product bug. It also helps us when we need to escalate the issue to our developers so they can spend as much time as possible improving our product.

General guidelines for information
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Follow these guidelines when providing diagnostic data to us:

* Make sure the files you provide are as complete as possible, rather than providing a few lines. Entire log files and configurations provide us with important context.
* Provide configuration and log files in plaintext format if possible, as these are far easier for us to search than screenshots.
* Be sure to sanitize configuration and log files to remove usernames, passwords, and LDAP groups. Replace these details with example strings that contain the same special characters if possible, as special characters are common causes of configuration errors.
* Provide screenshots or screen recordings of unexpected product behavior so that we know exactly what your users are seeing.

Configuration
~~~~~~~~~~~~~

Why we need your configuration data
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

On Linux systems, settings are generally stored in configuration files. Many issues can be resolved by enabling or disabling a configuration setting. In order to find a resolution, we need to have as complete a picture of your system setup as possible. This also helps us to reproduce bugs so our developers can fix them.

What configuration data includes
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Configuration includes (but is not limited to):

- The Mattermost ``config.json`` file.
- The configuration for the reverse proxy, e.g. NGINX, HAProxy, AWS.
- The database configuration.
- SAML configuration when the issue is regarding SAML authentication. The configuration for the Mattermost service is in the SAML IdP.
- Any other systems that Mattermost connects to or systems that exist between the user and the Mattermost server.

How to access your configuration data
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**Mattermost configuration**

The Mattermost configuration is usually stored at ``/opt/mattermost/config/config.json``. If you've migrated the Mattermost configuration to the database, you can get the configuration using ``mmctl`` or by running this database query:

.. code-block:: none
    
   SELECT Value FROM Configurations WHERE Active = 1;

**Reverse Proxy configuration**

NGINX usually splits its configuration into two parts: the main server configuration at ``/etc/nginx/nginx.conf``, and a virtual server configuration. On Ubuntu, this is stored in ``/etc/nginx/sites-available``. Providing both of these configuration files is helpful, but providing the latter is more important.

**SAML configuration**

If the issue you're seeing is with SAML login, we will need to see the full configuration for the Mattermost service in the SAML provider. The configuration for the Mattermost service is in the SAML IdP. Providing screenshots similar to the ones in the setup documentation is sufficient because most SAML providers are configured using a web interface.

**LDAP configuration**

The LDAP administrator should confirm the correct values for the following Mattermost LDAP settings:

- LDAP server hostname.
- LDAP connection port, security, and certificates.
- BaseDN, bind username, and bind password.
- User, Group, Guest, and Admin filters.
- Display attributes.

These can be provided as a text file or as screenshots from the LDAP server.

**Other configurations**

If you're experiencing an issue on mobile, and you're using an MDM or VPN to connect to the server, those configurations will be necessary to diagnose the problem. A System Administrator for the external system should be able to provide you with the configuration.

Logs
~~~~

Why we need them
^^^^^^^^^^^^^^^^

Nearly all computer systems have logs of errors and application behavior that can show us what's happening when an application is running. Error logs are invaluable when diagnosing a problem, but only if they're as complete as possible.

What logs are available
^^^^^^^^^^^^^^^^^^^^^^^

**Mattermost**

Mattermost has two log files, one for general messages and the other for notification-related messages. These are found at:

* ``/opt/mattermost/logs/mattermost.log``
* ``/opt/mattermost/logs/notification.log``

**Proxy**

The location of these depend on your proxy configuration, but a good place to start looking is in ``/var/log``. Your proxy administrator should be able to help you find the logs.

**Database**

MySQL and PostgreSQL have different logs, and their location varies based on your configuration. If the issue is related to database connectivity, check the database documentation to locate the logs.

**SAML, LDAP, and other systems**

Your organization's System Administrator should be able to find these for you.

How to access logs
^^^^^^^^^^^^^^^^^^

**Mattermost**

Make sure debug logging is enabled so that we can get the most information from the logs. To do this, go to **System Console > Environment > Logging**, then set console and file log level to **DEBUG**.

If the behavior started at a known time or date, use ``journalctl`` to get the logs like this:

.. code-block:: none

   sudo journalctl -u mattermost --since "2020-08-23 17:15:00" > mattermost_journalctl.log

Replace 2020-08-23 17:15:00 with the date and time (relative to the server) when the behavior started. To get the server time, use the ``date`` command. If the log files generated are too large to send, compress them with this command:

.. code-block:: none
   
   tar -czf /tmp/mattermost.log.tgz

The compressed logs will be located on the server at ``/tmp/mattermost.log.tgz``.

If the compressed file is still too big, use these commands to split the compressed file into two or more 20MB files:

.. code-block:: none
   
   mkdir -p /tmp/mattermost-logs
   cd /tmp/mattermost-logs
   tar czf - /opt/mattermost/logs/mattermost.log | split -b 20m - mattermost.log.tgz.

The compressed files will be located on the server at ``/tmp/mattermost-logs`` and be named ``mattermost.log.tgz.aa``, ``mattermost.log.tgz.ab``, and so on. Use a file transfer client that supports SSH/SFTP, such as Cyberduck, to copy these files from the server.

If you are experiencing issues with Elasticsearch, SAML, LDAP, or the database, you can enable trace logging in ``config.json`` by setting ``Trace`` to ``true`` under their respective settings. Combining this with ``DEBUG`` level file log output will result in huge log files, so only leave trace logging on long enough to replicate the behavior. The resulting logs will also contain a lot more sensitive data, including user data, so be sure to sanitize it completely before sharing it with us.

**System logs**

The location of log files for other systems varies, but a good way to get the logs for all processes on the Mattermost server is to use ``journalctl`` like this:

.. code-block:: none
  
   sudo journalctl --since "2020-08-23 17:15:00" > mattermost_journalctl.log

Replace 2020-08-23 17:15:00` with the date and time (relative to the server) when the error occurred. You can use ``--until`` with the same timestamp format to get the logs between two times:

.. code-block:: none
  
   sudo journalctl --since "2020-08-23 17:15:00" --until "2020-08-23 16:30:00" > mattermost_journalctl.log

Users affected
~~~~~~~~~~~~~~

Why we need it
^^^^^^^^^^^^^^

Mattermost servers are chaotic places. Thousands of posts, websocket actions, and webhook calls happen every second while users can be in dozens of channels across multiple teams. Knowing which users are affected by a problem can help us sift through all this information to find the root cause.

What information to include
^^^^^^^^^^^^^^^^^^^^^^^^^^^

This should be a detailed explanation of anything the end users who are reporting the unexpected behavior have in common. This includes (but is not limited to):

- Team and Channel memberships, including Direct and Group Messages.
- Authentication methods.
- Client operating system and app versions.
- How users connect to the Mattermost server.
- Any other things these users have in common such as when they joined, whether their login information recently changed, or if they are being synchronized via LDAP.

Note for Agents: This information is also required:

- Customer name
- Customer contacts
- Customer license, e.g. Enterprise/Professional
- Customer tier

Environment
~~~~~~~~~~~

Where the Mattermost server sits in your architecture has a lot of impact on potential issues. For example, a misconfigured proxy server can prevent users from connecting even if there's nothing wrong with Mattermost.

What information to include
^^^^^^^^^^^^^^^^^^^^^^^^^^^

Because of this, having a complete picture of the servers and network that the Mattermost server operates in is key to solving problems. This includes (but is not limited to):

- Mattermost version (e.g. 5.28.0, 5.25.5)
- Server OS and version (e.g. RHEL7, Ubuntu 18.04)
- Any orchestration/automation used like Docker or Kubernetes
- Reverse proxy and version (e.g. NGINX 1.16)
- Database type and version (e.g. MySQL 5.7, PostgreSQL 12.4)
- SAML provider (e.g. Windows Server 2012 Active Directory, Okta, KeyCloak)
- LDAP provider (e.g. Windows Server 2016 Active Directory, Okta, OpenLDAP)
- The type and version of any proxies or VPNs on the network that the Mattermost server is connecting through

Be as specific as possible when describing the environment. If you are seeing errors like **Connection Refused** be sure to include any firewalls or filtering proxies that may be on your network, either inbound or outbound.

**Examples**

Mattermost server

 - External hostname: mattermost.example.com
 - Internal hostname: mattermost.lan
 - Mattermost v5.28.0
 - Zoom plugin v1.4.1
 - NGINX v1.18.0

Database server

 - Internal hostname: mysql.lan
 - MySQL v5.7
 - LDAP Provider - 192.168.1.102
 - Internal hostname: ldap.lan
 - OpenLDAP 2.4.54 (Docker container)

Mattermost servers

 - Hostnames: mm1.local.lan, mm2.local.lan, mm3.local.lan, mm4.local.lan

Mattermost server versions

 - mm1-3: 5.25.4
 - mm4: 5.21.0

Proxy server

 - External hostname: mattermost.example.com
 - Internal hostname: proxy.local.lan
 - NGINX v1.16.0

Database servers

 - Hostnames: db1.local.lan, db2.local.lan, db3.local.lan
 - Primary: db1.local.lan
 - Read-Only: db2.local.lan, db3.local.lan  
 - MySQL v5.6

Elasticsearch server

 - Hostname: elastic.local.lan
 - Elasticsearch 7.9 with these plugins
 - analysis-icu

Steps to reproduce
~~~~~~~~~~~~~~~~~~

What it is
^^^^^^^^^^

If the behavior only happens when the user performs a specific action, providing detailed steps to reproduce it will help us make sure we find and fix the right bug. These details should be as descriptive as possible, but nothing is better than a screenshot or a screen recording of the behavior.

A short summary of the steps to reproduce is also helpful. If you want some examples, look at the bug tickets on some Mattermost Jira tickets.

How to provide these details
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**macOS**

Press :kbd:`⌘` :kbd:`⇧` :kbd:`5` to open the screen recording tool and select the region of the screen you want to record. To take a screenshot, press :kbd:`⌘` :kbd:`⇧` :kbd:`4` and select the region to take a screenshot. The screenshot files are placed on the desktop by default.

**Windows**

Press :kbd:`Ctrl` :kbd:`Shift` :kbd:`S` to open the snipping tool to take a screenshot. If you want to take a screen recording you'll need to install third-party software such as `OBS <https://obsproject.com/>`__.

**iOS**

Take a screenshot or screen recording `on iPhone <https://support.apple.com/guide/iphone/take-a-screenshot-or-screen-recording-iphc872c0115/ios>`__.

**Android**

Take a screenshot or record your screen on your `Android device <https://support.google.com/android/answer/9075928?hl=en>`__.

Appendix
--------

**A note on mobile issues**

Because the mobile app doesn't have a debug mode, diagnosing issues stemming from user data requires a proxy like Charles or mitmproxy. These will intercept and record traffic from the client which can then be replayed to reproduce issues. Contact your Customer Engineer for help setting these up.

**SAML login issues**

If the issue is with SAML login, one important piece of context is the SAML login flow. This contains headers and authentication information that can reveal issues that are easy to fix. Follow these instructions to view the SAML login flow if you are experiencing SAML authentication.

Checking keys and certificates
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Key and certificate files should never be shared, but if the error indicates a problem with the format of a key or certificate, then you should verify the format of the keys and certificates by running this command:

.. code-block:: none

  cat -A /path/to/key-or.cert

The output must meet these criteria exactly to be valid:

* Start with ``-----BEGIN CERTIFICATE-----$``.
* All lines must end with ``$``. If they end with ``^M$`` then convert them to UNIX line endings with ``dos2unix``.
* End with ``-----END CERTIFICATE-----$``.

source/install/trouble_mysql.rst METASEP
MySQL installation troubleshooting
==================================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Before you can run the Mattermost server, you must first install and configure a database. You can start Mattermost by navigating to the ``/opt/mattermost`` directory and entering the command
``sudo -u mattermost bin/mattermost``. If the Mattermost server cannot connect to the database, it will fail to start. This section deals with MySQL database issues that you may encounter when you start up Mattermost for the first time.

How you install MySQL varies depending upon which Linux distribution you use. However, once MySQL is installed, the configuration instructions are the
same. For all distributions you must create a ``mattermost`` database and a ``mattermost`` database user. Failure to create these database
objects or improperly referencing them from the Mattermost configuration file, ``/opt/mattermost/config/config.json``, causes Mattermost to fail. The troubleshooting tips given here deal with these specific issues.

Before proceeding, confirm that your MySQL server is running. You can do this by issuing the command ``mysqladmin -u root -p status``. When
prompted, enter your password. If MySQL is running you should see output like the following:

 ::

    Uptime: 877134  Threads: 1  Questions: 9902  Slow queries: 0  Opens: 522
    Flush tables: 1  Open tables: 371  Queries per second avg: 0.011

If MySQL is not running, review the instructions for installation on your distribution.

.. warning::

  Some of the commands used in this section alter the database. **Use these commands only if your Mattermost installation has failed.** Do not directly manipulate the MySQL database for a working Mattermost installation.

The ``mattermost`` database
---------------------------

The database created during installation is named ``mattermost``. If you fail to create this database or you misname it, you will see an error such as the following when you attempt to start the Mattermost server:

 ::

    [2017/09/20 17:11:37 EDT] [INFO] Pinging SQL master database
    [2017/09/20 17:11:37 EDT] [ERROR] Failed to ping DB retrying in 10 seconds
    err-Error 1044: Access denied for user 'mmuser'@'%' to database 'mattermost'

Note that MySQL is specifically denying access to the ``mattermost`` database. This may mean that you have failed to create a database named
``mattermost`` or you may have incorrectly referenced this database from the ``/opt/mattermost/config/config.json`` file.

**Checking that the Database Exists**

To confirm that the ``mattermost`` database exists, open MySQL as *root* by executing ``mysql -u root -p``. When prompted, enter your password and then issue the command ``show databases;``. This command displays all the databases. You should see something similar to the following:

 ::

    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mattermost         |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+
    5 rows in set (0.03 sec)

**No mattermost Database**

If the ``mattermost`` database doesn't exist, create a database named ``mattermost`` by opening MySQL as root and issuing the command: ``create database mattermost;``.

If you accidentally created a database with the wrong name, you can remove it by issuing the command: :samp:`drop database {misnamed};`.

After creating the database, attempt to restart the Mattermost server by navigating to the ``/opt/mattermost`` directory and entering the command ``sudo -u mattermost bin/mattermost``.

**The mattermost Database Exists**

If the ``mattermost`` database does exist, confirm that you have defined the database driver correctly in the ``/opt/mattermost/config/config.json`` file. Open this file in a text editor, and review the value of ``"DataSource"``. It should be:

 ::

     "mmuser:*mmuser-password*@tcp(*host-name-or-IP*:3306)/mattermost?charset=utf8mb4,utf8&writeTimeout=30s"

You should also confirm that ``DriverName`` element (found immediately above the ``DataSource`` element) is set to ``mysql``.

If you correct an error, restart the Mattermost server by navigating to the ``/opt/mattermost`` directory and entering the command ``sudo -u mattermost bin/mattermost``.

The Database User
-----------------

During the installation you should create a MySQL database user from the *mysql* prompt by issuing the command

:samp: `create user 'mmuser'@'%' identified by '{mmuser-password}';`.

The ``mmuser-password`` value is a placeholder for the password you chose. You may also have specified an IP address rather than the wild card
``%``.

.. note::

    A MySQL user is fully defined by their username and the host that they access MySQL from. These elements are separated by the ``@`` sign. The ``%`` character is a wild card indicating that the user can access MySQL from any IP address. If the user you created accesses MySQL from a specific IP address such as ``10.10.10.2``, please adjust your actions accordingly.

If the user and host combination that you created does not exist, you will see an error such as:

 ::

    [2017/09/20 17:06:18 EDT] [INFO] Pinging SQL master database
    [2017/09/20 17:06:18 EDT] [ERROR] Failed to ping DB retrying in 10 seconds
    err-Error 1045: Access denied for user 'mmuser'@'localhost' (using password: YES)

**Checking that mmuser Exists**

To check that this user exists, log in to MySQL as *root*: ``mysql -u root -p``.

When prompted, enter the root password that you created when installing MySQL. From the ``mysql`` prompt enter the command ``select User, Host from mysql.user;``. You should see something like the following:

 ::

    +------------------+-----------+
    | User             | Host      |
    +------------------+-----------+
    | mmuser           | %         |
    | debian-sys-maint | localhost |
    | mysql.session    | localhost |
    | mysql.sys        | localhost |
    | root             | localhost |
    +------------------+-----------+
    5 rows in set (0.00 sec)

**User Doesn't Exist**

If ``'mmuser'@'%'`` does not exist, create this user by logging into MySQL as *root* and issuing the command:

:samp: `create user 'mmuser'@'%' identified by '{mmuser-password}';`.

After creating a user, ensure that this user has rights to the ``mattermost`` database.

**User Exists**

If the user ``mmuser`` exists, the DataSource element of the ``/opt/mattermost/config/config.json`` file may be incorrect. Open this file and search for ``DataSource``. Its value should be:

 ::

     "mmuser:*mmuser-password*@tcp(*host-name-or-IP*:3306)/mattermost?charset=utf8mb4,utf8&writeTimeout=30s"

If you correct an error, restart the Mattermost server by navigating to the ``/opt/mattermost`` directory and issuing the command: ``sudo -u mattermost bin/mattermost``.

The user password
-----------------

Mattermost will fail if you use an incorrect password for ``mmuser``. An incorrect password displays an error message such as the following:

 ::

    [2017/09/20 17:09:10 EDT] [INFO] Pinging SQL master database
    [2017/09/20 17:09:10 EDT] [ERROR] Failed to ping DB retrying in 10 seconds
    err-Error 1045: Access denied for user 'mmuser'@'localhost' (using password: YES)

**The password in ``config.json``**

The DataSource element of the ``/opt/mattermost/config/config.json`` file references the ``mmuser`` password. Open this file and search for ``DataSource``. It's value should be:

 ::

     "mmuser:*mmuser-password*@tcp(*host-name-or-IP*:3306)/mattermost?charset=utf8mb4,utf8&writeTimeout=30s"

Check that the password is correct. If you correct an error, restart the Mattermost server by navigating to ``/opt/mattermost`` and issuing the command: ``sudo -u mattermost bin/mattermost``.

**Unsure of Password**

If you are not sure that the ``mmuser`` password is correct, attempt to log in to MySQL as ``mmuser`` by issuing the command ``mysql -u mmuser -p``. You will be prompted for your password. If your login fails, you are not using the correct password.

With a new database installation, the easiest solution for an unknown password is to remove the existing ``mmuser`` and then recreating that user. You can do this by logging in to MySQL as ``root`` and issuing the following commands:

- ``drop user mmuser;``

- ``flush privileges;``

- :samp: `create user 'mmuser'@'%' identified by '{mmuser-password}';`

If you recreate ``mmuser``, ensure that this user has rights to the ``mattermost`` database by following the instructions given in :ref: `mysql_grants`.

Insufficient user privileges
----------------------------

If the database exists and the username and password are correct, the ``mmuser`` may not have sufficient rights to access the ``mattermost`` database. If this is the case, you may see an error message such as:

 ::

    [2017/09/20 17:20:53 EDT] [INFO] Pinging SQL master database
    [2017/09/20 17:20:53 EDT] [ERROR] Failed to ping DB retrying in 10 seconds
    err-Error 1044: Access denied for user 'mmuser'@'%' to database 'mattermost

.. note::

    Examine the error message closely. The user name displayed in the error message is the user identified in the ``DataSource`` element of the ``/opt/mattermost/config/config.json`` file. For example, if the error message reads``Access denied for user 'muser'@'%' ...`` you will know that you have misidentified the user as ``muser`` in the ``config.json`` file.

You can check if the user ``mmuser`` has access to the ``mattermost`` database by logging in to MySQL as ``mmuser`` and issuing the command: ``show databases;``. If this user does not have rights to view the ``mattermost`` database, you will not see it in the output.

 ::

    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    +--------------------+
    1 rows in set (0.00 sec)

.. _mysql_grants:

**Granting privileges to mmuser**

If the ``mattermost`` database exists and ``mmuser`` cannot view it, exit from MySQL and then log in again as root. Issue the command ``grant all privileges on mattermost.* to 'mmuser'@'%';`` to grant all rights on ``mattermost`` to ``mmuser``.

Restart the Mattermost server by navigating to the ``/opt/mattermost`` directory and entering the command ``sudo -u mattermost bin/mattermost``.

source/install/transport-encryption.rst METASEP

Configuring transport encryption
=================================

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

The components of the Mattermost setup are shown in the following diagram, including the transport encryption used. Aside from the encryption between the nodes of the Mattermost cluster, all transports rely on TLS encryption.

.. note::

  The transport between the Application servers is not used by default and requires additional setup steps. Enhancing the core product to include automatic encryption between cluster nodes is in progress and planned for a later release.

.. image:: ../images/transport-encryption.png
   :alt: Components of the Mattermost setup where all transports rely on TLS encryption.

The configuration guides are split up into the following documents:

.. toctree::
  :titlesonly:

  proxy-to-mattermost-transport-encryption.rst
  database-transport-encryption.rst
  cluster-transport-encryption.rst

source/install/software-hardware-requirements.rst METASEP
..  _requirements:

Software and hardware requirements
==================================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This guide outlines minimum software and hardware requirements for deploying Mattermost. Requirements may vary based on utilization and observing performance of pilot projects is recommended prior to scale out.

.. contents::
    :backlinks: top

Deployment overview
-------------------

Please see the `Mattermost Deployment Overview <https://docs.mattermost.com/deploy/deployment-overview.html>`__ documentation for a summary of software systems whose requirements are described in this document.

.. image:: ../images/network_diagram.png
   :alt: Mattermost network diagram shows how the components can be deployed. Includes optional configurations for scaling for larger enterprise organizations.

Software requirements
---------------------

Client software
~~~~~~~~~~~~~~~

Desktop apps
^^^^^^^^^^^^

.. csv-table::
    :header: "Operating System", "Self-Hosted Technical Requirement", "Cloud Technical Requirement"

    "Windows", "Windows 8.1+", "Windows 8.1+"
    "Mac", "MacOS 10.14+", "MacOS 10.14+"
    "Linux", "Ubuntu LTS releases 18.04 or later", "Ubuntu LTS releases 18.04 or later"

Though not officially supported, the Linux desktop app also runs on RHEL/CentOS 7+.

`*` Integrated Windows Authentication is not supported by Mattermost desktop apps. If you use ADFS we recommend `configuring intranet forms-based authentication for devices that do not support WIA <https://docs.microsoft.com/en-us/windows-server/identity/ad-fs/operations/configure-intranet-forms-based-authentication-for-devices-that-do-not-support-wia>`_.

PC web
^^^^^^

.. csv-table::
    :header: "Browser", "Self-Hosted Technical Requirement", "Cloud Technical Requirement"

    "Chrome", "v100+", "v100+"
    "Firefox", "v91+", "v91+"
    "Safari", "v14.1+", "v14.1+"
    "Edge", "v44+", "v44+"

`*` Support for Internet Explorer (IE11) has been removed in Mattermost v5.16. We recommend using the `Mattermost desktop app <https://mattermost.com/apps/>`_ or another supported browser. See `this forum post <https://forum.mattermost.com/t/mattermost-is-dropping-support-for-internet-explorer-ie11-in-v5-16/7575>`__ to learn more.

Mobile apps
^^^^^^^^^^^

.. csv-table::
    :header: "Operating System", "Technical Requirement"

    "iOS", "iPhone 5s devices and later with iOS 12.1+"
    "Android", "Android devices with Android 7+"

`*` Integrated Windows Authentication is not supported by Mattermost mobile apps. If you use ADFS we recommend `configuring intranet forms-based authentication for devices that do not support WIA <https://docs.microsoft.com/en-us/windows-server/identity/ad-fs/operations/configure-intranet-forms-based-authentication-for-devices-that-do-not-support-wia>`_.

Mobile web
^^^^^^^^^^

.. csv-table::
    :header: "Browser", "Technical Requirement"

    "iOS", "iOS 12.1+ with Safari 12+ or Chrome 89+"
    "Android", "Android 7+ with Chrome 89+"

Email client
^^^^^^^^^^^^

-  *Desktop clients:* Outlook 2010+, Apple Mail version 7+, Thunderbird 38.2+
-  *Web based clients:* Office 365, Outlook, Gmail, Yahoo, AOL
-  *Mobile clients:* iOS Mail App (iOS 7+), Gmail Mobile App (Android, iOS)

Server software
~~~~~~~~~~~~~~~

Mattermost server operating system
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

- Ubuntu 18.04, Debian Buster, CentOS 6+, CentOS 7+, RedHat Enterprise Linux 7+, Oracle Linux 6+, Oracle Linux 7+.
- Using the Mattermost `Docker deployment <https://github.com/mattermost/docker>`__ on a Docker-compatible operating system (Linux-based OS) is still recommended.

While community support exists for Fedora, FreeBSD, and Arch Linux, Mattermost does not currently include production support for these platforms.

Database software
^^^^^^^^^^^^^^^^^

For Mattermost v6.0 and later:

-  MySQL 5.7.12, 8.0.12+ (see note below on MySQL 8 support)
-  PostgreSQL 10.0+

For Mattermost v5.39 and previous releases:

- MySQL 5.6, 5.7, 8.0.12+ (see note below on MySQL 8 support)
- PostgreSQL 10.0+

Amazon Aurora equivalents of both MySQL and PostgreSQL are also supported.

MariaDB v10+ no longer functions as a MySQL drop-in replacement, and it's not supported for Mattermost due to the requirement of MySQL 5.7.12. Prior versions of MariaDB were not officially supported but may have functioned in older Mattermost releases. If you are running MariaDB now, migrating from MariaDB to the MySQL equivalent is recommended.

Deployments requiring searching in Chinese, Japanese, and Korean languages require MySQL 5.7.6+ and the configuration of `ngram Full-Text parser <https://dev.mysql.com/doc/refman/5.7/en/fulltext-search-ngram.html>`__. For searching two characters, you will also need to set ``ft_min_word_len`` and ``innodb_ft_min_token_size`` to ``2`` and restart MySQL. See `CJK discussion <https://github.com/mattermost/mattermost-server/issues/2033#issuecomment-183872616>`__ for details.

Search limitations on PostgreSQL:

- Email addresses do not return results.
- Hashtags or recent mentions of usernames containing a dash do not return search results.
- Terms containing a dash return incorrect results as dashes are ignored in the search query.
- If any of the above is an issue, you can either enable the `Elasticsearch feature <https://docs.mattermost.com/scale/elasticsearch.html>`__ or install MySQL instead.

Search limitations on MySQL:

- Hashtags or recent mentions of usernames containing a dot do not return search results.
- From Mattermost v6.4, the new migration system requires the MySQL database user to have additional `EXECUTE`, `CREATE ROUTINE`, `ALTER ROUTINE` and `REFERENCES` privileges to run schema migrations.

**MySQL 8 Support**:

In MySQL 8.0.4, the default authentication plugin was changed from ``mysql_native_password`` to ``caching_sha2_password`` (https://mysqlserverteam.com/mysql-8-0-4-new-default-authentication-plugin-caching_sha2_password/). Therefore, you will need to enable ``mysql_native_password`` by adding the following entry in your MySQL configuration file:

  .. code-block:: text

   [mysqld]
   default-authentication-plugin=mysql_native_password

In MySQL 8, the default collation changed to ``utf8mb4_0900_ai_ci`` (https://dev.mysql.com/doc/mysqld-version-reference/en/optvar-changes-8-0.html). Therefore, if you update your MySQL installation to version 8, you'll need to convert your database tables to use the new default collation:

.. code-block:: sql

   ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;

If this change isn't made, tables in the database may end up having different collations which will cause errors when executing queries.

In MySQL versions 8.0.0 - 8.0.11 ``ADMIN`` is a `reserved keyword <https://dev.mysql.com/doc/refman/8.0/en/keywords.html>`_, which is why our requirement for MySQL is version 8.0.12.

MySQL 8.0.22 contains an `issue with JSON column types <https://bugs.mysql.com/bug.php?id=101284>`__ changing string values to integers which is preventing Mattermost from working properly. Users are advised to avoid this database version.

Hardware requirements
---------------------

Usage of CPU, RAM, and storage space can vary significantly based on user behavior. These hardware recommendations are based on traditional deployments and may grow or shrink depending on how active your users are.

Moreover, memory requirements can be driven by peak file sharing activity. Recommendation is based on default 50 MB maximum file size, which can be `adjusted from the System Console <https://docs.mattermost.com/configure/configuration-settings.html#maximum-file-size>`__. Changing this number may change memory requirements.

For deployments larger than 2,000 users, it is recommended to use the Mattermost open source load testing framework to simulate usage of your system at full scale: `https://github.com/mattermost/mattermost-load-test <https://github.com/mattermost/mattermost-load-test>`__.

Mattermost supports any 64-bit x86 processor architecture.

Hardware requirements for team deployments
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Most small to medium Mattermost team deployments can be supported on a single server with the following specifications based on registered users:

-  1 - 1,000 users - 1 vCPU/cores, 2 GB RAM
-  1,000 - 2,000 users - 2 vCPUs/cores, 4 GB RAM

.. _hardware-sizing-for-enterprise:

Hardware requirements for enterprise deployments (multi-server)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Scale requirements
^^^^^^^^^^^^^^^^^^

For Enterprise Edition deployments with a multi-server setup, see `our scaling guide <https://docs.mattermost.com/scale/scaling-for-enterprise.html>`__.

It is highly recommended that pilots are run before enterprise-wide deployments in order to estimate full scale usage based on your specific organizational needs. You can use the Mattermost open source load testing framework to simulate usage of your system: `https://github.com/mattermost/mattermost-load-test <https://github.com/mattermost/mattermost-load-test>`__.

Mattermost's `performance monitoring <https://docs.mattermost.com/scale/performance-monitoring.html>`__ tools can be used for detailed performance measurements and to inspect the running system to ensure sizing and installation is correct.

System requirements
^^^^^^^^^^^^^^^^^^^

For Enterprise Edition deployments with a multi-server setup, we highly recommend the following systems to support your Mattermost deployment:

- Prometheus to track system health of your Mattermost deployment, through `performance monitoring feature <https://docs.mattermost.com/scale/performance-monitoring.html>`__ available in Mattermost Enterprise.
- Grafana to visualize the system health metrics collected by Prometheus with the `performance monitoring feature <https://docs.mattermost.com/scale/performance-monitoring.html>`__. Grafana 5.0.0 and later is recommended.
- Elasticsearch to support highly efficient database searches in a cluster environment. Elasticsearch 7.x is supported in Mattermost v6.0. Previous Mattermost versions of Mattermost, including v5.39 and earlier releases, support Elasticsearch v5.x, v6.x, and v7.x. `Learn more here <https://docs.mattermost.com/scale/elasticsearch.html>`__.
- MinIO or AWS S3. Mattermost is compatible with object storage systems which implement the S3 API. Other S3-compatible systems may work, but are not officially supported. Learn more about file storage configuration options `in our documentation <https://docs.mattermost.com/configure/configuration-settings.html#file-storage>`__.

Alternate storage calculations
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

As an alternative to recommended storage sizing above, you can forecast your own storage usage. Begin with a Mattermost server approximately 600 MB to 800 MB in size including operating system and database, then add the multiplied product of:

-  Estimated storage per user per month (see below), multiplied by 12 months in a year
-  Estimated mean average number of users in a year
-  A 1-2x safety factor

**Estimated storage per user per month**

File usage per user varies significantly across industries. The below benchmarks are recommended:

-  **Low usage teams** (1-5 MB/user/month)
	- Primarily use text messages and links to communicate. Examples would include software development teams that heavily use web-based document creation and management tools, and therefore rarely upload files to the server.

-  **Medium usage teams** (5-25 MB/user/month)
	- Use a mix of text messages as well as shared documents and images to communicate. Examples might include business teams that may commonly drag and drop screenshots, PDFs and Microsoft Office documents into Mattermost for sharing and review.

-  **High usage teams** (25-100 MB/user/month)
	- Heaviest utilization comes from teams uploading a high number of large files into Mattermost on a regular basis. Examples include creative teams who share and store artwork and media with tags and commentary in a pipeline production process.

*Example:* A 30-person team with medium usage (5-25 MB/user/month) with a safety factor of 2x would require between 3.5 GB (30 users \* 5 MB \* 12 months \* 2x safety factor) and 17.6 GB (30 users \* 25 MB \* 12 months \* 2x safety factor) of free space in the next year.

It's recommended that you review storage utilization at least quarterly to ensure adequate free space is available.

source/install/setting-up-socket-based-mattermost-database.rst METASEP
Using sockets for database
==========================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Mattermost requires a database back-end. If you plan to run it on the machine,
install MySQL or PostgreSQL as the database. In this document let's understand how
you can use sockets for setting up the database.

MySQL
-----

.. code-block:: bash

    $ mysql -u root -p
    CREATE DATABASE mattermostdb;
    CREATE USER mmuser IDENTIFIED BY 'mmuser_password';
    GRANT ALL ON mattermostdb.* TO mmuser;


PostgreSQL
----------

- Install and configure PostgreSQL.
- Choose between TCP or UNIX Socket, and jump to the corresponding section.

With TCP socket
---------------

- Create the new user while connecting to the server as ``postgres`` user
  (you will be prompted for a password for the new user):

  ``sudo -u postgres createuser -P mmuser``

- Create the Mattermost database, owned by ``mmuser`` user:

  ``sudo -u postgres createdb -O mmuser mattermostdb``

- In the connections and authentications section, set the ``listen_address`` list
  line per your needs:

   .. code-block:: bash

      /var/lib/postgres/data/postgresql.conf
      listen_address = 'localhost,my_local_ip_address'

  You can use '*' to listen on all available addresses.

- Then add a line like the following to the authentication config:

  .. code-block:: bash

     /var/lib/postgres/data/pg_hba.conf
     # TYPE  DATABASE        USER            ADDRESS                 METHOD
     # IPv4 local connections:
     host    all             all             ip_address/32   md5

- Run the setup using:

  .. code-block:: bash

     $ psql --host=ip_address --dbname=mattermostdb --username=mmuser --password

With Unix socket
----------------

- Create the new user while connecting to the server as ``postgres`` user:

  .. code-block:: bash

     sudo -u postgres createuser mattermost

- Create the Mattermost database, owned by ``mattermost`` user:

  .. code-block:: bash

     sudo -u postgres createdb -O mattermost mattermostdb

- Setup the Unix socket by adding the following line to ``/var/lib/postgres/data/pg_hba.conf``:

  .. code-block:: bash

     local    mattermostdb    mattermost    peer

- Restart postgresql.service.

- Run the setup using:

  .. code-block:: bash

     sudo -u mattermost psql --dbname=mattermostdb

Configuring Mattermost
----------------------

- Mattermost is configured in ``/etc/webapps/mattermost/config.json``.
  Strings need to be quoted.

- The ``DriverName`` setting: ``mysql`` for MySQL and ``postgres`` for PostgreSQL.

  The ``DataSource``:

  - For MySQL, set it to ``mmuser:mmuser_password@unix(/run/mysqld/mysqld.sock)/mattermostdb?charset=utf8mb4,utf8``.
  - For PostgreSQL
    
    - TCP socket: ``postgres://mmuser:mmuser_password@127.0.0.1:5432/mattermostdb?sslmode=disable&connect_timeout=10``    
    
    - Unix socket: ``postgres:///mattermostdb?host=/run/postgresql``, where ``mattermostdb`` is the name of the database and ``/run/postgresql`` is the directory containing the Unix socket.


source/install/setting-up-aws-elastic-beanstalk-docker.rst METASEP
..  _docker-ebs:

AWS Elastic Beanstalk Docker setup
==================================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

The following instructions use Docker to install Mattermost in *Preview Mode* for exploring product functionality. This configuration should not
be used in production.

The Elastic Beanstalk application creation process used here is the easy *Getting Started* approach which combines Application and Environment creation in the same flow. 

1.  From your `AWS console <https://console.aws.amazon.com/console/home>`__ select **Elastic Beanstalk**.
2.  Select the **Create Application** button on the Elastic Beanstalk home page.
3.  Enter an **Application name** for the Elastic Beanstalk application.
4.  (Optional) Specify **Application tags**.
5.  Select **Docker** for the Platform.
6.  Choose **Docker running on 64bit Amazon Linux 2** for the **Platform** branch. Note that multi-container Docker is now deprecated.
7.  Leave the platform version preselected as **3.4.8 (Recommended)**.
8.  For **Application code**, select **Upload your code**.
9.  Download the ``Dockerrun.aws.json`` file from
    https://raw.githubusercontent.com/mattermost/mattermost-docker-preview/master/Dockerrun.aws.json.
10.  Set a unique **Version Label**, choose **Local File**, then select **Choose file** button to browse for the downloaded file in the previous step. You should see a *File successfully uploaded* message.
11. Select **Create Application**. It may take a few minutes for Beanstalk to launch your environment. If the launch is successful, you will see a see a large green checkmark and the **Health status** displayed in green.
12. Test your environment by selecting the domain link next to your application name at the top of the dashboard. Alternatively, enter the domain into your browser in the form of ``http://<your-ebs-application-url>.elasticbeanstalk.com``. You can also map your own domain if you prefer. When everything is working correctly, the domain navigates you to the Mattermost Login page. Enjoy exploring Mattermost!

Configuration Settings
----------------------

See `Configuration Settings <https://docs.mattermost.com/configure/configuration-settings.html>`__ documentation to customize your deployment.

(Recommended) Enable Email
--------------------------

The default Docker instance for Mattermost is designed for product evaluation, and sets ``SendEmailNotifications=false`` so the product can function without enabling email. To see the product's full functionality, enabling SMTP email is recommended.

.. include:: ../configure/smtp-email.rst
	:start-after: How to enable email

source/install/self-managed-changelog.md METASEP
# Mattermost self-hosted changelog

[Mattermost](https://mattermost.com) is an open source platform for secure collaboration across the entire software development lifecycle. This changelog summarizes updates for the latest self-hosted versions of Mattermost to be [deployed and upgraded on infrastructure you control](https://docs.mattermost.com/guides/deployment.html).

See the [changelog in progress](https://bit.ly/2nK3cVf) for the upcoming release. See the [Legacy Self-Hosted Mattermost Changelog](legacy-self-hosted-changelog) for details on all Mattermost self-hosted releases prior to v6.0. 

Latest Mattermost Releases:
- [Release v7.2 - Feature Release](#release-v7-2-feature-release)
- [Release v7.1 - Extended Support Release](#release-v7-1-extended-support-release)
- [Release v7.0 - Major Release](#release-v7-0-major-release)
- [Release v6.7 - Feature Release](#release-v6-7-feature-release)
- [Release v6.3 - Extended Support Release](#release-v6-3-extended-support-release)

## Release v7.2 - [Feature Release](https://docs.mattermost.com/upgrade/release-definitions.html#feature-release)

**v7.2.0 release day: 2022-08-16**

Mattermost v7.2.0 contains low to medium level severity level security fixes. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).

### Important Upgrade Notes
Several schema changes impose additional database constraints to make the data more strict. All the commands listed below were tested on a 8 core, 16GB RAM machine. Here are the times recorded:

**PostgreSQL (131869 channels, 2 teams)**:

- ``CREATE TYPE channel_type AS ENUM ('P', 'G', 'O', 'D');`` took 14.114 milliseconds
- ``ALTER TABLE channels alter column type type channel_type using type::channel_type;`` took 3856.790 milliseconds (3.857 seconds)
- ``CREATE TYPE team_type AS ENUM ('I', 'O');`` took 4.191 milliseconds
- ``ALTER TABLE teams alter column type type team_type using type::team_type;`` took 116.205 milliseconds
- ``CREATE TYPE upload_session_type AS ENUM ('attachment', 'import');`` took 4.266 milliseconds
- ``ALTER TABLE uploadsessions alter column type type upload_session_type using type::upload_session_type;`` took 37.099 milliseconds

**MySQL (270959 channels, 2 teams)**:

- ``ALTER TABLE Channels MODIFY COLUMN Type ENUM("D", "O", "G", "P");`` took 13.24 seconds
- ``ALTER TABLE Teams MODIFY COLUMN Type ENUM("I", "O");`` took 0.04 seconds
- ``ALTER TABLE UploadSessions MODIFY COLUMN Type ENUM("attachment", "import");`` took 0.03 seconds

**IMPORTANT:** If you upgrade from a release earlier than v7.1, please read the other [Important Upgrade Notes](https://docs.mattermost.com/upgrade/important-upgrade-notes.html).

### Highlights

#### Message Forwarding
 - You can now easily share messages as permalinks and respective permalink previews via the new [Post Forwarding feature](https://docs.mattermost.com/channels/forward-messages.html). Simply select the new **Forward** option from the **More** section of the message hover actions menu on a given message, choose a desired destination, and optionally add a comment for context.
 
#### Audit Log v2 (Beta)
 - Added support for new [schema and output log types](https://docs.mattermost.com/comply/audit-log.html). Contrary to the previous audit log implementation, all audit log records now have the same schema.

### Improvements

#### User Interface (UI)
 - Pre-packaged Calls v0.7.1.
 - Added the option to colorize usernames in compact display mode when **Account Settings > Display > Message Display > Compact** is selected.
 - Added a setting to always land users at the newest messages in a channel via **Account settings > Advanced > Scroll position when viewing an unread channel**.
 - Added email headers to notification emails so they can be threaded by email clients.
 - Added **Save** and **Cancel** buttons for post inline editing.
 - Enterprise trial details are now displayed for end users in the product switcher menu.
 - Updated the **Edit Header** modal text description to be applicable to channels, direct messages, and group messages.
 - Added a red destructive action color to ``Archive Channel`` and ``Leave Channel`` menu actions.
 - Plugin activation errors now show in the plugin management page and marketplace.
 - Added accessibility to the emoji picker skin tone selector and reversed the order of the skin tone selections in the emoji selector.

#### Administration
 - Added an **Upgrade** button for Admins on the navigation bar.
 - Added the ability for Admins to quickly view different paid license options inside the product.
 - Added the ability to start a trial from the **Invite People** modal.
 - Admins are now able to search for channel IDs via **System Console > User Management > Channels** page.
 - In the **System Console** left-hand side, paid features icons are now displayed on the menu entries to indicate enterprise features.
 - Added ``webSocketClient`` to ``Pluggable`` and ``PostWillRenderEmbed`` plugin registered components.
 - Added a new static system-level role called [Custom Group Manager](https://docs.mattermost.com/onboard/system-admin-roles.html). This role has permissions to create, edit, and delete custom user groups via User Groups in the Products menu. It can be used to assign individual users this ability when Custom Groups permissions are removed for All Members via the **System Console** (**System Console > Permissions > Edit Scheme > Custom Groups**).
 - Export file names now contain the ID of the job they were generated by.

### Performance
 - Removed ``getLastPostPerChannel`` selector for improved performance in channel sorting.

### Bug Fixes
 - Fixed an issue with pasting a GitHub code snippet in the message box when text is selected.
 - Fixed an issue where fully typed emojis that contained a capital letter were not correctly displayed.
 - Fixed an issue where the archive icon for channels did not display correctly in dark themes.
 - Fixed an issue where password requirements were not enforced when Development Mode was enabled.
 - Fixed an issue where users were able to attempt to edit the channel header of an archived channel on the right-hand side.
 - Fixed an issue where the “Your Trial Ended” banner hid the product switcher menu.
 - Fixed an issue where the custom status date format was not set to ``YYYY-MM-DD``.
 - Fixed an issue where users were unable to remove themselves from a custom role.
 - Fixed an issue where some images in link previews overflowed.
 - Fixed an issue where accessing the **System Console** and then exiting changed the user's status to "Offline".
 - Fixed an issue where the **New Messages** line sometimes appeared when viewing a channel that was previously read.
 - Fixed an issue with incorrectly formatted text in the **System Console**.
 - Fixed an issue where the thread's view would appear as if it has unread threads even if no unread threads existed.
 - Fixed an issue that caused a crash when fetching unread posts.
 - Fixed an issue where the mobile app crashed when unfollowing a thread of a channel that a user was no longer a member of.
 - Fixed an issue where the Custom Brand text was not centered and Site Description configuration did not show a placeholder.
 - Fixed an issue where the group permissions had an extra level of nesting in the user interface. Also the permissions checkboxes were split out into their individual custom group permissions for a greater granularity of control.
 - Fixed an issue where the OpenID Connect authentication button was missing from the signup page.
 - Fixed an issue with autocomplete sorting regression in channels and threads.
 - Fixed an issue where the custom branding logo was distorted on the login screen.

### config.json
Multiple setting options were added to ``config.json``. Below is a list of the additions and their default values on install. The settings can be modified in ``config.json``, or the System Console when available.

#### Changes to Team Edition and Enterprise Edition:
 - Under ``FileSettings`` in ``config.json``:
    - A new config setting ``AmazonS3RequestTimeoutMilliseconds`` was added which sets a timeout for requests to AWS S3. By default, the timeout is at 30 seconds.

#### API Changes
 - Added a new response-header ``Has-Inaccessible-Posts`` for ``getPost`` and ``getPostByIDs`` APIs.

### Go Version
 - v7.2 is built with Go ``v1.18.1``.

### Open Source Components
 - Added ``@types/color-hash``, ``color-contrast-checker``, ``color-hash``, and ``webpack`` to https://github.com/mattermost/mattermost-webapp.

### Known Issues
 - Forwarding messages: pressing Enter key on an auto-complete item in the comment box sends the forward message [MM-46142](https://mattermost.atlassian.net/browse/MM-46142).
 - Adding an @mention at the start of a post draft and pressing the left or right arrow key can clear the post draft and the undo history [MM-33823](https://mattermost.atlassian.net/browse/MM-33823).
 - Google login fails on the Classic mobile apps.
 - Status may sometimes get stuck as **Away** or **Offline** in High Availability mode with IP Hash turned off.
 - Searching stop words in quotation marks with Elasticsearch enabled returns more than just the searched terms.
 - The team sidebar on the desktop app does not update when channels have been read on mobile.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.
 - Boards are not refreshing on creation. See the [GitHub discussion](https://github.com/mattermost/focalboard/discussions/1971) for more information.
 - Boards export and reimport results in duplicates boards because all IDs are replaced by new ones on the server. See the [GitHub issue](https://github.com/mattermost/focalboard/issues/1924) for more information.
 
### Contributors
 - [64bitpandas](https://github.com/64bitpandas), [Afsoon](https://github.com/Afsoon), [agarciamontoro](https://github.com/agarciamontoro), [AGMETEOR](https://github.com/AGMETEOR), [agnivade](https://github.com/agnivade), [amyblais](https://github.com/amyblais), [Apahadi73](https://github.com/Apahadi73), [asaadmahmood](https://github.com/asaadmahmood), [ashishbhate](https://github.com/ashishbhate), [AshishDhama](https://github.com/AshishDhama), [avinashlng1080](https://github.com/avinashlng1080), [azigler](https://github.com/azigler), [ballista01](https://github.com/ballista01), [BenCookie95](https://github.com/BenCookie95), [calebroseland](https://github.com/calebroseland), [cpoile](https://github.com/cpoile), [crspeller](https://github.com/crspeller), [ctlaltdieliet](https://github.com/ctlaltdieliet), [cwarnermm](https://github.com/cwarnermm), [d-wierdsma](https://github.com/d-wierdsma), [debasish4patra](https://github.com/debasish4patra), [devinbinnie](https://github.com/devinbinnie), [eggmoid](https://github.com/eggmoid), [filipeandrade6](https://github.com/filipeandrade6), [gabrieljackson](https://github.com/gabrieljackson), [gbochora](https://github.com/gbochora), [Haliax](https://github.com/Haliax), [hannaparks](https://github.com/hannaparks), [hanzei](https://github.com/hanzei), [harshilsharma63](https://github.com/harshilsharma63), [hegocre](https://github.com/hegocre), [hmhealey](https://github.com/hmhealey), [ifnotak](https://github.com/ifnotak), [imasdekar](https://github.com/imasdekar), [imskr](https://github.com/imskr), [iomodo](https://github.com/iomodo), [isacikgoz](https://github.com/isacikgoz), [iyampaul](https://github.com/iyampaul), [jasonblais](https://github.com/jasonblais), [jespino](https://github.com/jespino), [johnsonbrothers](https://github.com/johnsonbrothers), [jonathanwiemers](https://github.com/jonathanwiemers), [josephbaylon](https://github.com/josephbaylon), [jprusch](https://github.com/jprusch), [JtheBAB](https://github.com/JtheBAB), [JulienTant](https://github.com/JulienTant), [julmondragon](https://github.com/julmondragon), [justinegeffen](https://github.com/justinegeffen), [kaakaa](https://github.com/kaakaa), [kamre](https://github.com/kamre), [KantinHoll](https://translate.mattermost.com/user/KantinHoll), [karistuck](https://github.com/karistuck), [kayazeren](https://github.com/kayazeren), [komarnitskyi](https://github.com/komarnitskyi), [koox00](https://github.com/koox00), [krisfremen](https://github.com/krisfremen), [krmh04](https://github.com/krmh04), [kyeongsoosoo](https://github.com/kyeongsoosoo), [levb](https://github.com/levb), [lieut-data](https://github.com/lieut-data), [M-ZubairAhmed](https://github.com/M-ZubairAhmed), [majo](https://translate.mattermost.com/user/majo/), [maksimatveev](https://github.com/maksimatveev), [manojmalik20](https://github.com/manojmalik20), [MarkAndersonTrocme](https://github.com/MarkAndersonTrocme), [master7](https://translate.mattermost.com/user/master7), [matt-w99](https://github.com/matt-w99), [matthew-w](https://translate.mattermost.com/user/matthew-w), [mgdelacroix](https://github.com/mgdelacroix), [michelengelen](https://github.com/michelengelen), [mickmister](https://github.com/mickmister), [milotype](https://github.com/milotype), [mkraft](https://github.com/mkraft), [Mshahidtaj](https://github.com/Mshahidtaj), [munish7771](https://github.com/munish7771), [muratbayan](https://github.com/muratbayan), [neallred](https://github.com/neallred), [neflyte](https://github.com/neflyte), [nevyangelova](https://github.com/nevyangelova), [nickmisasi](https://github.com/nickmisasi), [noxer](https://github.com/noxer), [ogi-m](https://github.com/ogi-m), [oh6hay](https://github.com/oh6hay), [pfltdv](https://github.com/pfltdv), [phoinixgrr](https://github.com/phoinixgrr), [Phrynobatrachus](https://github.com/Phrynobatrachus), [Pinjasaur](https://github.com/Pinjasaur), [pjenicot](https://github.com/pjenicot), [plant99](https://github.com/plant99), [potatogim](https://github.com/potatogim), [pvev](https://github.com/pvev), [Rajat-Dabade](https://github.com/Rajat-Dabade), [RKRohk](https://github.com/RKRohk), [RoyI99](https://github.com/RoyI99), [sadohert](https://github.com/sadohert), [samia64saleem](https://github.com/samia64saleem), [santoniriccardo](https://github.com/santoniriccardo), [saosangmo](https://github.com/saosangmo), [saturninoabril](https://github.com/saturninoabril), [sbishel](https://github.com/sbishel), [seoyeongeun](https://github.com/seoyeongeun), [serhack](https://github.com/serhack), [shamboozles](https://github.com/shamboozles), [Sharuru](https://github.com/Sharuru), [sibasankarnayak](https://github.com/sibasankarnayak), [SilverKnightKMA](https://github.com/SilverKnightKMA), [sinansonmez](https://github.com/sinansonmez), [spirosoik](https://github.com/spirosoik), [sri-byte](https://github.com/sri-byte), [stafot](https://github.com/stafot), [streamer45](https://github.com/streamer45), [stylianosrigas](https://github.com/stylianosrigas), [svelle](https://github.com/svelle), [Szymongib](https://github.com/Szymongib), [t0mm0](https://github.com/t0mm0), [tboulis](https://github.com/tboulis), [thePanz](https://github.com/thePanz), [thinkGeist](https://github.com/thinkGeist), [tiagodll](https://github.com/tiagodll), [trilopin](https://github.com/trilopin), [tsabi](https://github.com/tsabi), [varghesejose2020](https://github.com/varghesejose2020), [vdvukhzhilov](https://github.com/vdvukhzhilov), [vish9812](https://github.com/vish9812), [weblate](https://github.com/weblate), [whiver](https://github.com/whiver), [wiggin77](https://github.com/wiggin77), [Willyfrog](https://github.com/Willyfrog), [yoikeda](https://github.com/yoikeda), [zefhemel](https://github.com/zefhemel)

## Release v7.1 - [Extended Support Release](https://docs.mattermost.com/upgrade/release-definitions.html#extended-support-release-esr)

- **v7.1.3, released 2022-08-23**
  - Mattermost v7.1.3 contains a medium severity level security fix. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).
  - Fixed an issue where Admins were unable to save configuration changes in the **System Console** in some cases [MM-45875](https://mattermost.atlassian.net/browse/MM-45875).
- **v7.1.2, released 2022-07-21**
  - Fixed an issue where mmctl checked the server version incorrectly.
- **v7.1.1, released 2022-07-15**
  - Fixed an issue where selecting "Update" next to an outdated Marketplace plugin didn't work [MM-45731](https://mattermost.atlassian.net/browse/MM-45731).
- **v7.1.0, released 2022-07-15**
  - Original 7.1.0 release

Mattermost v7.1.0 contains low severity level security fixes. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).

### Important Upgrade Notes
 - A new configuration option ``MaxImageDecoderConcurrency`` indicates how many images can be decoded concurrently at once. The default is -1, and the value indicates the number of CPUs present. This affects the total memory consumption of the server. The maximum memory of a single image is dictated by ``MaxImageResolution * 24 bytes``. Therefore, we recommend that ``MaxImageResolution * MaxImageDecoderConcurrency * 24`` should be less than the allocated memory for image decoding.
 - Mattermost v7.1 introduces schema changes in the form of a new column and its index. The following notes our test results for the schema changes:
    - MySQL 12M Posts, 2.5M Reactions - ~1min 34s (instance: PC with 8 cores, 16GB RAM)
    - PostgreSQL 12M Posts, 2.5M Reactions - ~1min 18s (instance: db.r5.2xlarge)
 - You can run the following SQL queries before the upgrade to obtain a lock on ``Reactions`` table, so that users' reactions posted during this time won't be reflected in the database until the migrations are complete. This is fully backwards-compatible.
    - For MySQL:
      - ``ALTER TABLE Reactions ADD COLUMN ChannelId varchar(26) NOT NULL DEFAULT "";``
      - ``UPDATE Reactions SET ChannelId = COALESCE((select ChannelId from Posts where Posts.Id = Reactions.PostId), '') WHERE ChannelId="";`` 
      - ``CREATE INDEX idx_reactions_channel_id ON Reactions(ChannelId) LOCK=NONE;``
  
    - For PostgreSQL:
      - ``ALTER TABLE reactions ADD COLUMN IF NOT EXISTS channelid varchar(26) NOT NULL DEFAULT '';``
      - ``UPDATE reactions SET channelid = COALESCE((select channelid from posts where posts.id = reactions.postid), '') WHERE channelid='';`` 
      - ``CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_reactions_channel_id on reactions (channelid);`` 

**IMPORTANT:** If you upgrade from a release earlier than v7.0, please read the other [Important Upgrade Notes](https://docs.mattermost.com/upgrade/important-upgrade-notes.html).

### Highlights

#### Insights (Beta) (Enterprise and Professional)
 - Added workplace insights consisting of usage and behavior data, which helps Enterprises further increase productivity of their employees through Mattermost functionality. This feature can be disabled by setting the ``MM_FEATUREFLAGS_INSIGHTSENABLED`` environment variable to ``false``.

### Improvements

#### User Interface (UI)
 - Pre-packaged Playbooks v1.29.1, Boards v7.1.0, and Calls v0.7.0.
 - Recent emojis are now sorted based on the number of times an emoji has been used.
 - Improved the link preview user interface.
 - Added new search shortcuts to the **Keyboard Shortcuts** modal. 
    - CMD+F (macOS) and CTRL+F (Windows) for Desktop App
    - CMD+SHIFT+F (macOS) and CTRL+SHIFT+F (Windows) for webapp
 - Changed some tooltips to appear when focused instead of just on hover.
- Added support for syntax highlighting for 1C:Enterprise (BSL) language.

#### Administration
 - Default password requirements have been loosened to eight characters and no numeric, casing, or special characters required. These requirements can be configured by the System Admin as needed via **System Console > Password**.
 - The System Console now also searches and returns channels based on the channel ID. A new parameter ``IncludeSearchById`` was added to the channel search endpoint, allowing requests to include searches that match IDs in response.
 - Search results in PostgreSQL will now respect the ``default_text_search_config`` value instead of being hardcoded to English. Mattermost System Admins should check this value in case of any discrepancies with what is expected.
 - Moved ``UserHasJoinedTeam`` callback to after a user is added to a team.

#### Performance
 - Reduced the number of calls made to ``viewChannel`` API during regular usage.
 - Added pagination to the ``getPostThread`` API calls.

### Bug Fixes
 - Fixed an issue where links to internal help pages did not always open in a new browser tab.
 - Fixed an issue that caused the Channel Members right-hand side search input to not search all the members of a channel.
 - Fixed an issue where the feature discovery page still displayed a **Start Trial** button after a trial was completed.
 - Fixed an issue where channel recency sorting was not consistent between mobile and webapp.
 - Fixed an issue with uploading SVG files.
 - Fixed an issue where thread posts were not left-aligned in compact message display mode.
 - Fixed an error about a missing column for the Shared Channels experimental feature.
 - Fixed an issue where the channel menu drop-down option "Move to..." was skipped when pressing the TAB keyboard key.
 - Fixed an issue where the bulk import failed due to reply ``CreateAt`` being greater than that of the parent post.
 - Fixed an undefined error when leaving a channel with the Unreads filter enabled.
 - Fixed an issue where clicking on a quick emoji reaction opened the right-hand pane.
 - Fixed an issue where the keyboard focus did not go back to the post textbox after hitting CTRL/CMD+SHIFT+P twice.
 - Fixed an issue where the upload files button was positioned incorrectly.
 - Fixed an issue where duplicated emojis sometimes displayed as recently used emojis.
 - Fixed an issue where autocomplete "@" search for names did not normalize UTF-8 characters.
 - Fixed an issue where **Group Messages** with long display names didn't have a tooltip in the left-hand sidebar.
 - Fixed an issue where the file icon was sometimes unresponsive.
 - Fixed a race condition where switching teams to an unread channel did not appear to mark that channel as read.
 - Fixed an issue where the error message did not appear if a user drafted a too long post.
 - Fixed an issue where channels with more than 100 members only showed 100 channel members in the right-hand side.
 - Fixed an issue where the preview mode in the advanced text editor did not reset after posting a message.
   
### config.json
Multiple setting options were added to ``config.json``. Below is a list of the additions and their default values on install. The settings can be modified in ``config.json``, or the System Console when available.

#### Changes to Team Edition and Enterprise Edition:
 - Under ``ServiceSettings`` in ``config.json``:
    - The setting ``EnableInsecureOutgoingConnections`` is now applicable to S3 clients as well. If that is set, s3 clients will skip TLS verification.

#### API Changes
 - To allow Admins to retrieve contents of posts whether they are deleted or not, ``include_deleted`` query parameter was introduced to ``GetPost`` endpoint.

### Go Version
 - v7.1 is built with Go ``v1.18.1``.

### Open Source Components
 - Added ``@floating-ui/react-dom`` and removed ``superagent`` and ``jasny-bootstrap`` from https://github.com/mattermost/mattermost-webapp/.

### Known Issues
 - The Top Boards widget in Insights is slow to load.
 - Adding an @mention at the start of a post draft and pressing the left or right arrow key can clear the post draft and the undo history [MM-33823](https://mattermost.atlassian.net/browse/MM-33823).
 - Google login fails on the Classic mobile apps.
 - Status may sometimes get stuck as **Away** or **Offline** in High Availability mode with IP Hash turned off.
 - Searching stop words in quotation marks with Elasticsearch enabled returns more than just the searched terms.
 - The team sidebar on the desktop app does not update when channels have been read on mobile.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.
 - Boards are not refreshing on creation. See the [GitHub discussion](https://github.com/mattermost/focalboard/discussions/1971) for more information.
 - Boards export and reimport results in duplicates boards because all IDs are replaced by new ones on the server. See the [GitHub issue](https://github.com/mattermost/focalboard/issues/1924) for more information.

### Contributors
 - [3ach](https://github.com/3ach), [abhijit-singh](https://github.com/abhijit-singh), [aeomin](https://github.com/aeomin), [agarciamontoro](https://github.com/agarciamontoro), [AGMETEOR](https://github.com/AGMETEOR), [agnivade](https://github.com/agnivade), [alejdg](https://github.com/alejdg), [amyblais](https://github.com/amyblais), [angeloskyratzakos](https://github.com/angeloskyratzakos), [antonbuks](https://github.com/antonbuks), [anurag6713](https://github.com/anurag6713), [armanchand](https://github.com/armanchand), [ashishbhate](https://github.com/ashishbhate), [AshishDhama](https://github.com/AshishDhama), [azigler](https://github.com/azigler), [Ballista01](https://github.com/Ballista01), [BenCookie95](https://github.com/BenCookie95), [BenLloydPearson](https://github.com/BenLloydPearson), [calebroseland](https://github.com/calebroseland), [chenilim](https://github.com/chenilim), [cpoile](https://github.com/cpoile), [crspeller](https://github.com/crspeller), [ctlaltdieliet](https://github.com/ctlaltdieliet), [cwarnermm](https://github.com/cwarnermm), [d-wierdsma](https://github.com/d-wierdsma), [darkLord19](https://github.com/darkLord19), [devinbinnie](https://github.com/devinbinnie), [dimoiko100](https://github.com/dimoiko100), [dipak-demansol](https://github.com/dipak-demansol), [dontoisme](https://github.com/dontoisme), [DSchalla](https://github.com/DSchalla), [emdecr](https://github.com/emdecr), [enahum](https://github.com/enahum), [engineereng](https://github.com/engineereng), [erezo9](https://github.com/erezo9), [esethna](https://github.com/esethna), [furqanmlk](https://github.com/furqanmlk), [gabrieljackson](https://github.com/gabrieljackson), [gbochora](https://github.com/gbochora), [gbyx3](https://github.com/gbyx3), [hannaparks](https://github.com/hannaparks), [hanzei](https://github.com/hanzei), [harshilsharma63](https://github.com/harshilsharma63), [hmhealey](https://github.com/hmhealey), [imasdekar](https://github.com/imasdekar), [imskr](https://github.com/imskr), [iomodo](https://github.com/iomodo), [isacikgoz](https://github.com/isacikgoz), [ismaaylSpiria](https://github.com/ismaaylSpiria), [IsmailTakriti](https://translate.mattermost.com/user/IsmailTakriti/), [it33](https://github.com/it33), [jaskiratsingh2000](https://github.com/jaskiratsingh2000), [jasonblais](https://github.com/jasonblais), [jbattistispiria](https://github.com/jbattistispiria), [jespino](https://github.com/jespino), [jfcastroluis](https://github.com/jfcastroluis), [jgilliam17](https://github.com/jgilliam17), [johnsonbrothers](https://github.com/johnsonbrothers), [jprusch](https://github.com/jprusch), [JtheBAB](https://github.com/JtheBAB), [JulienTant](https://github.com/JulienTant), [julmondragon](https://github.com/julmondragon), [justinegeffen](https://github.com/justinegeffen), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [kamre](https://github.com/kamre), [kayazeren](https://github.com/kayazeren), [keremkurtulus](https://github.com/keremkurtulus), [Kirill](https://github.com/Kirill), [koox00](https://github.com/koox00), [krisfremen](https://github.com/krisfremen), [kyeongsoosoo](https://github.com/kyeongsoosoo), [lapaz17](https://github.com/lapaz17), [larkox](https://github.com/larkox), [levb](https://github.com/levb), [lieut-data](https://github.com/lieut-data), [lindy65](https://github.com/lindy65), [lynn915](https://github.com/lynn915), [M-ZubairAhmed](https://github.com/M-ZubairAhmed), [majo](https://translate.mattermost.com/user/majo/), [maksimatveev](https://translate.mattermost.com/user/maksimatveev/), [manojmalik20](https://github.com/manojmalik20), [marianunez](https://github.com/marianunez), [maruTA-bis5](https://github.com/maruTA-bis5), [master7](https://translate.mattermost.com/user/master7/), [matt-w99](https://github.com/matt-w99), [matthewbirtch](https://github.com/matthewbirtch), [mayur_dhamecha](@mayur_dhamecha), [metanerd](https://github.com/metanerd), [metehankaraca](https://github.com/metehankaraca), [mgdelacroix](https://github.com/mgdelacroix), [michelengelen](https://github.com/michelengelen), [mickmister](https://github.com/mickmister), [milotype](https://github.com/milotype), [miltalex](https://github.com/miltalex), [mkraft](https://github.com/mkraft), [Mshahidtaj](https://github.com/Mshahidtaj), [munish7771](https://github.com/munish7771), [mvitale1989](https://github.com/mvitale1989), [natalie-hub](https://github.com/natalie-hub), [neallred](https://github.com/neallred), [neflyte](https://github.com/neflyte), [nevyangelova](https://github.com/nevyangelova), [Ngwind](https://github.com/Ngwind), [nickmisasi](https://github.com/nickmisasi), [nikolaizah](https://github.com/nikolaizah), [noxer](https://github.com/noxer), [ogi-m](https://github.com/ogi-m), [pfltdv](https://github.com/pfltdv), [pheel](https://github.com/pheel), [phoinixgrr](https://github.com/phoinixgrr), [Phrynobatrachus](https://github.com/Phrynobatrachus), [Pinjasaur](https://github.com/Pinjasaur), [plant99](https://github.com/plant99), [prathers](https://github.com/prathers), [pvev](https://github.com/pvev), [Rajat-Dabade](https://github.com/Rajat-Dabade), [respinffs](https://github.com/respinffs), [rodrigopinero](https://github.com/rodrigopinero), [RoyI99](https://github.com/RoyI99), [Rutam21](https://github.com/Rutam21), [sadohert](https://github.com/sadohert), [santoniriccardo](https://github.com/santoniriccardo), [sayanta66](https://github.com/sayanta66), [sbishel](https://github.com/sbishel), [serhack](https://github.com/serhack), [sinansonmez](https://github.com/sinansonmez),  [sonichigo](https://github.com/sonichigo), [spirosoik](https://github.com/spirosoik), [sri-byte](https://github.com/sri-byte), [srkgupta](https://github.com/srkgupta), [stafot](https://github.com/stafot), [streamer45](https://github.com/streamer45), [stylianosrigas](https://github.com/stylianosrigas), [Szymongib](https://github.com/Szymongib), [tboulis](https://github.com/tboulis), [thinkGeist](https://github.com/thinkGeist), [topelrapha](https://github.com/topelrapha), [trilopin](https://github.com/trilopin), [tsabi](https://github.com/tsabi), [varghesejose2020](https://github.com/varghesejose2020), [vish9812](https://github.com/vish9812), [wiersgallak](https://github.com/wiersgallak), [wiggin77](https://github.com/wiggin77), [Willyfrog](https://github.com/Willyfrog), [wuwinson](https://github.com/wuwinson), [yasserfaraazkhan](https://github.com/yasserfaraazkhan), [YetAnotherBlogArticle](https://github.com/YetAnotherBlogArticle), [zefhemel](https://github.com/zefhemel), [zsichina](https://github.com/zsichina)

## Release v7.0 - [Major Release](https://docs.mattermost.com/upgrade/release-definitions.html#major-release)

- **v7.0.2, released 2022-08-23**
  - Mattermost v7.0.2 contains a medium severity level security fix. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).
- **v7.0.1, released 2022-06-24**
  - Fixed an issue where mmctl checked the server version incorrectly [MM-45161](https://mattermost.atlassian.net/browse/MM-45161).
  - Fixed an issue where the file icon was sometimes unresponsive [MM-45097](https://mattermost.atlassian.net/browse/MM-45097).
  - Fixed an issue with Compliance Exports where the zip file creation failed when adding attachments to a post [MM-40179](https://mattermost.atlassian.net/browse/MM-40179).
  - Fixed the notification title for ``id_loaded`` push notifications [MM-43655](https://mattermost.atlassian.net/browse/MM-43655).
  - Pre-packaged Playbooks v1.28.2.
- **v7.0.0, released 2022-06-15**
  - Original 7.0.0 release

Mattermost v7.0.0 contains medium severity level security fixes. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).

### Important Upgrade Notes
 - **IMPORTANT:** Session length configuration settings have changed from using a unit of *days* to *hours*. Instances using a config.json file or a database configuration for the following values should be automatically migrated to the new units, but instances using environment variables must make the following changes:
 1. replace `MM_SERVICESETTINGS_SESSIONLENGTHWEBINDAYS` with `MM_SERVICESETTINGS_SESSIONLENGTHWEBINHOURS` (x24 the value).
 2. replace `MM_SERVICESETTINGS_SESSIONLENGTHMOBILEINDAYS` with `MM_SERVICESETTINGS_SESSIONLENGTHMOBILEINHOURS` (x24 the value).
 3. replace `MM_SERVICESETTINGS_SESSIONLENGTHSSOINDAYS` with `MM_SERVICESETTINGS_SESSIONLENGTHSSOINHOURS` (x24 the value).
 - MySQL self-hosted customers may notice the migration taking longer than usual when having a large number of rows in the ``FileInfo`` table. For MySQL, it takes around 19 seconds for a table of size 700,000 rows. The time required for PostgreSQL is negligible. The testing was performed on a machine with specifications of ``CPU - Intel i7 6-cores @ 2.6 GHz`` and ``Memory - 16 GB``.
 - When a new configuration setting via **System Console > Experimental > Features > Enable App Bar** is enabled, all channel header icons registered by plugins will be moved to the new Apps Bar, even if they do not explicitly use the new registry function to render a component there. The setting for Apps Bar defaults to ``false`` for self-hosted deployments.
 - The value of ``ServiceSettings.TrustedProxyIPHeader`` defaults to empty from now on. A previous bug prevented this from happening in certain conditions. Customers are requested to check for these values in their config and set them to nil if necessary. See more details [here](https://docs.mattermost.com/configure/configuration-settings.html#trusted-proxy-ip-header).
 - Upgrading the Microsoft Teams Calling plugin to v2.0.0 requires users to reconnect their accounts.

**IMPORTANT:** If you upgrade from a release earlier than v6.7, please read the other [Important Upgrade Notes](https://docs.mattermost.com/upgrade/important-upgrade-notes.html).

### Highlights

#### Collapsed Reply Threads (General Availability)
 - [Collapsed Reply Threads](https://docs.mattermost.com/channels/organize-conversations.html) is now generally available. Please reference [this article](https://support.mattermost.com/hc/en-us/articles/6880701948564) for more information and guidance for enabling the feature.

#### Calls (Beta)
 - [Native voice calling and screen sharing](https://docs.mattermost.com/channels/make-calls.html) is now available. This is a Channels-specific integration.

#### Apps Bar (Beta)
 - Channel header is now decluttered when a new configuration setting via **System Console > Experimental > Features > Enable App Bar** is enabled, to make it more obvious how to access Calls, Playbooks, and Boards when viewing a channel. All channel header icons registered by plugins will be moved to the new Apps Bar when the configuration setting is enabled, while Calls remains in the channel header. We recommend enabling the Apps Bar for servers with Calls enabled since the Apps Bar helps make space for the dedicated **Start Call** button in the channel header.

#### Playbooks Updates
 - Users can now easily keep processes up-to-date with [the inline playbook editor](https://docs.mattermost.com/playbooks/customize-a-playbook.html).
 - A new statistics dashboard was added that displays the number of playbooks and run instances within the server alongside other system statistics in the **System Console**.
 - Run triggers and actions now provide more control over where [status updates are posted](https://docs.mattermost.com/playbooks/customize-a-run.html) throughout a run.

#### Message Formatting Toolbar
 - The [new formatting toolbar](https://docs.mattermost.com/channels/format-messages.html#use-the-messaging-formatting-toolbar) makes Markdown accessible to everyone with easy to use controls for commonly used message formatting, such as bold, headings, links, and more.

### Improvements

#### User Interface (UI)
 - For toggling the channel information in the right-hand pane, a shortcut CTRL/CMD+ALT+I was added.
 - Added an "Unread Channels" section to the channel switcher and included threads in the results.
 - Users are no longer hidden from search results in the "Add members" modal, even if they are already members of the channel.
 - Applied new designs for the Login screen.
 - Enabled the new onboarding task list for end users.
 - The legacy **Settings > Advanced Settings > Enable Post Formatting** and **Settings > Advanced Settings > Preview Pre-release Features** settings are now deprecated in favor of the the new formatting toolbar.
 - Romanian language support was downgraded to Beta.
 
#### Performance
 - Improved the performance of aggregate queries related to Collapsed Reply Threads. Learn more about these server performance optimizations in [this article](https://support.mattermost.com/hc/en-us/articles/6880701948564).

#### Integrations
 - To keep users in Mattermost when opening documentation links from the **System Console > Plugin** settings page, all the links now open in another tab.
 - Changed **Actions** post menu hover text to **Message Actions**.
 - Updated Apps Framework to version 1.1.0 to add improved logging.

#### Administration
 - Timestamps are now enabled in the default audit configuration.
 - The Collapsed Reply Threads configuration option was moved in the **System Console** from **Experimental** to **Site Configuration > Posts**.
 
#### Enterprise Subscription
 - Upgraded the minor version of the ElasticSearch development Docker image.
 - The Support Packet now contains two additional fields in the ``support_packet.yaml`` file: Active users and License-supported users.

### Bug Fixes
 - Fixed an issue with ADA Accessibility where screen readers did not TAB to or read "This channel has guests" in the channel header bar.
 - Fixed an issue where the @mention autosuggest of users was no longer grouped by channel membership status.
 - Fixed an issue where the New Messages toast was not fully tappable in narrow view.
 - Fixed an issue where the shortcut modal for channel info showed ``ALT`` instead of ``SHIFT`` for Mac.
 - Fixed an issue where the **Help > Report a Problem** link was not hidden when a URL was not set for **System Console > Customization > Report a Problem**.
 - Fixed an issue with the timing of selector performance metrics.
 - Fixed an issue where the S3 **Test Connection** button deceptively failed unless the user pressed **Save** first.
 - Fixed an issue where Workspace Optimization did not load in the System Console on subpath servers.
 - Fixed an issue where an error was logged when ``SendEmailNotifications`` was not set to ``true``.
   
### config.json
Multiple setting options were added to ``config.json``. Below is a list of the additions and their default values on install. The settings can be modified in ``config.json``, or the System Console when available.

#### Changes to Team Edition and Enterprise Edition:
 - Under ``ServiceSettings`` in ``config.json``:
   - Changed ``SessionLengthWebInDays`` to ``SessionLengthWebInHours``.
   - Changed ``SessionLengthMobileInDays`` to ``SessionLengthMobileInHours``.
   - Changed ``SessionLengthSSOInDays`` to ``SessionLengthSSOInHours``.
   - The value of ``TrustedProxyIPHeader`` defaults to empty from now on. A previous bug prevented this from happening in certain conditions. Customers are requested to check for these values in their config and set them to nil if necessary.
   - Added ``always-on`` and ``default-on`` settings to **System Console > Posts** for Collapsed Reply Threads. When enabled (default-on), users see Collapsed Reply Threads by default and have the option to disable it in **Settings**. When always on, users are required to use Collapsed Reply Threads and can't disable it.
   - The default for ``CollapsedThreads`` has been changed to ``always_on``. This change impacts new Mattermost deployments, and doesn't affect existing configurations where this value is already set to some other value.
 - Under ``ExperimentalSettings`` in ``config.json``:
   - Added a new config setting ``EnableAppBar`` to enable and disable the new Apps Bar. This setting is disabled by default, but we recommend enabling the Apps Bar for servers with Calls enabled since the Apps Bar helps make space for the dedicated **Start Call** button in the channel header.

#### API Changes
 - Added new API endpoints ``GET /api/v4/teams/:team_id/top/channels`` and ``GET /api/v4/users/me/top/channels`` to get top channels for a team and user.

#### Websocket Event Changes
 - Added a new ``ConnectionId`` field to ``model.WebsocketBroadcast`` that allows broadcasting a message only to a specific connection.

### Go Version
 - v7.0 is built with Go ``v1.18.1``.

### Known Issues
 - Post list doesn't always scroll down to show new messages [MM-44131](https://mattermost.atlassian.net/browse/MM-44131).
 - Mentions incorrectly shows users as not in a channel [MM-44157](https://mattermost.atlassian.net/browse/MM-44157).
 - Status may sometimes get stuck as **Away** or **Offline** in High Availability mode with IP Hash turned off.
 - Searching stop words in quotation marks with Elasticsearch enabled returns more than just the searched terms.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.
 - Boards are not refreshing on creation. See the [GitHub discussion](https://github.com/mattermost/focalboard/discussions/1971) for more information.
 - Boards export and reimport duplicate boards because all IDs are replaced by new ones on the server. See the [GitHub issue](https://github.com/mattermost/focalboard/issues/1924) for more information.

### Contributors
 - [Abrahamology](https://github.com/Abrahamology), [AbrahamQll](https://translate.mattermost.com/user/AbrahamQll), [aeomin](https://github.com/aeomin), [agarciamontoro](https://github.com/agarciamontoro), [AGMETEOR](https://github.com/AGMETEOR), [agnivade](https://github.com/agnivade), [Altaaya](https://github.com/Altaaya), [amyblais](https://github.com/amyblais), [angeloskyratzakos](https://github.com/angeloskyratzakos), [asaadmahmood](https://github.com/asaadmahmood), [ashishbhate](https://github.com/ashishbhate), [AshishDhama](https://github.com/AshishDhama), [BenCookie95](https://github.com/BenCookie95), [BenLloydPearson](https://github.com/BenLloydPearson), [bobmaster](https://translate.mattermost.com/user/bobmaster), [Borknab](https://github.com/Borknab), [bpmct](https://github.com/bpmct), [calebroseland](https://github.com/calebroseland), [catalintomai](https://github.com/catalintomai), [chenilim](https://github.com/chenilim), [cohu-dev](https://github.com/cohu-dev), [coltoneshaw](https://github.com/coltoneshaw), [cpoile](https://github.com/cpoile), [crspeller](https://github.com/crspeller), [ctlaltdieliet](https://github.com/ctlaltdieliet), [cwarnermm](https://github.com/cwarnermm), [debasish4patra](https://github.com/debasish4patra), [devinbinnie](https://github.com/devinbinnie), [dipak-demansol](https://github.com/dipak-demansol), [djanda97](https://github.com/djanda97), [eggmoid](https://github.com/eggmoid), [elyscape](https://github.com/elyscape), [enahum](https://github.com/enahum), [flynbit](https://github.com/flynbit), [furqanmlk](https://github.com/furqanmlk), [gabrieljackson](https://github.com/gabrieljackson), [gavin-luo](https://github.com/gavin-luo), [gbochora](https://github.com/gbochora), [gin-melodic](https://github.com/gin-melodic), [hamzaMM](https://github.com/hamzaMM), [HandsomeChoco](https://github.com/HandsomeChoco), [hanzei](https://github.com/hanzei), [harshilsharma63](https://github.com/harshilsharma63), [hmhealey](https://github.com/hmhealey), [ialorro](https://github.com/ialorro), [iomodo](https://github.com/iomodo), [isacikgoz](https://github.com/isacikgoz), [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais), [jbattistispiria](https://github.com/jbattistispiria), [jespino](https://github.com/jespino), [jfrerich](https://github.com/jfrerich), [johnsonbrothers](https://github.com/johnsonbrothers), [jonathanwiemers](https://github.com/jonathanwiemers), [jprusch](https://github.com/jprusch), [jsoref](https://github.com/jsoref), [jtdspiria](https://github.com/jtdspiria), [JtheBAB](https://github.com/JtheBAB), [JulienTant](https://github.com/JulienTant), [julmondragon](https://github.com/julmondragon), [justinegeffen](https://github.com/justinegeffen), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [kamre](https://github.com/kamre), [kayazeren](https://github.com/kayazeren), [kkennethlee](https://github.com/kkennethlee), [koox00](https://github.com/koox00), [krisfremen](https://github.com/krisfremen), [krmh04](https://github.com/krmh04), [kyeongsoosoo](https://github.com/kyeongsoosoo), [larkox](https://github.com/larkox), [levb](https://github.com/levb), [lieut-data](https://github.com/lieut-data), [lisez](https://github.com/lisez), [lkyuchukov](https://github.com/lkyuchukov), [lynn915](https://github.com/lynn915), [M-ZubairAhmed](https://github.com/M-ZubairAhmed), [majo](https://translate.mattermost.com/user/majo/), [maksimatveev](https://github.com/maksimatveev), [master7](https://translate.mattermost.com/user/master7),  [matthew-w](https://translate.mattermost.com/user/matthew-w/), [matt-w99](https://github.com/matt-w99), [maxtrem271991](https://github.com/maxtrem271991), [metanerd](https://github.com/metanerd), [metehankaraca](https://translate.mattermost.com/user/metehankaraca/), [mgdelacroix](https://github.com/mgdelacroix), [michelengelen](https://github.com/michelengelen), [mickmister](https://github.com/mickmister), [milotype](https://github.com/milotype), [miltalex](https://github.com/miltalex), [mjnagel](https://github.com/mjnagel), [mkraft](https://github.com/mkraft), [Mshahidtaj](https://github.com/Mshahidtaj), [munish7771](https://github.com/munish7771), [neallred](https://github.com/neallred), [nickmisasi](https://github.com/nickmisasi), [nzeemin](https://github.com/nzeemin), [pfltdv](https://github.com/pfltdv), [phoinixgrr](https://github.com/phoinixgrr), [Phrynobatrachus](https://github.com/Phrynobatrachus), [plykung](https://translate.mattermost.com/user/plykung/), [prakharporwal](https://github.com/prakharporwal), [pvev](https://github.com/pvev), [Rajat-Dabade](https://github.com/Rajat-Dabade), [RoyI99](https://github.com/RoyI99), [saturninoabril](https://github.com/saturninoabril), [sbishel](https://github.com/sbishel), [seoyeongeun](https://github.com/seoyeongeun), [sibasankarnayak](https://github.com/sibasankarnayak), [SiderealArt](https://github.com/SiderealArt), [sinansonmez](https://github.com/sinansonmez), [spirosoik](https://github.com/spirosoik), [sri-byte](https://github.com/sri-byte), [stafot](https://github.com/stafot), [streamer45](https://github.com/streamer45), [stylianosrigas](https://github.com/stylianosrigas), [Szymongib](https://github.com/Szymongib), [TQuock](https://github.com/TQuock), [trilopin](https://github.com/trilopin), [tsabi](https://github.com/tsabi), [vaaas](https://github.com/vaaas), [vadimasadchi](https://github.com/vadimasadchi), [vaheed](https://github.com/vaheed), [varghesejose2020](https://github.com/varghesejose2020), [vish9812](https://github.com/vish9812), [wiersgallak](https://github.com/wiersgallak), [wiggin77](https://github.com/wiggin77), [Willyfrog](https://github.com/Willyfrog), [windane](https://translate.mattermost.com/user/windane)

## Release v6.7 - [Feature Release](https://docs.mattermost.com/upgrade/release-definitions.html#feature-release)

- **v6.7.2, released 2022-06-15**
  - Fixed an issue with Compliance Exports where the zip file creation failed when adding attachments to a post [MM-40179](https://mattermost.atlassian.net/browse/MM-40179).
- **v6.7.1, released 2022-06-13**
  - Mattermost v6.7.1 contains medium severity level security fixes. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).
  - The value of ``ServiceSettings.TrustedProxyIPHeader`` defaults to empty from now on. A previous bug prevented this from happening
in certain conditions. Customers are requested to check for these values in their config and set them to nil if necessary. See more details [here](https://docs.mattermost.com/configure/configuration-settings.html#trusted-proxy-ip-header).
- **v6.7.0, released 2022-05-16**
  - Original 6.7.0 release

Mattermost v6.7.0 contains low severity level security fixes. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).

### Compatibility
 - Updated Chrome recommended minimum version to v100+.

### Important Upgrade Notes
 - New schema changes were introduced in the form of a new index. The following summarizes the test results measuring how long it took for the database queries to run with these schema changes:
    - MySQL 7M Posts - ~17s (Instance: db.r5.xlarge)
    - MySQL 9M Posts - 2min 12s (Instance: db.r5.large)
    - Postgres 7M Posts - ~9s  (Instance: db.r5.xlarge)
 - For customers wanting a zero downtime upgrade, they are encouraged to apply this index prior to doing the upgrade. This is fully backwards compatible and will not acquire any table lock or affect any existing operations on the table when run manually. Else, the queries will run during the upgrade process and will lock the table in non-MySQL environments. Run the following to apply this index:
    - For MySQL: `CREATE INDEX idx_posts_create_at_id on Posts(CreateAt, Id) LOCK=NONE;`
    - For Postgres: `CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_posts_create_at_id on posts(createat, id);`

**IMPORTANT:** If you upgrade from a release earlier than v6.6, please read the other [Important Upgrade Notes](https://docs.mattermost.com/upgrade/important-upgrade-notes.html).

### Highlights

#### Playbooks Updates
 - To keep procedures on track while reducing noise, task due dates can now be added to playbook runs (Professional and Enterprise subscriptions).

### Improvements

#### User Interface (UI)
 - Added Files and Pinned Messages to the right-hand side Channel Info.
 - Improved the New Channel modal user interface.
 - Added the channel members list to the right-hand side Channel Info modal.
 - Added the ability to invite new users to a team from the **Add to channel** modal.
 - To be able to download images and copy public links for images more quickly, a copy URL and download buttons were added to image thumbnails.
 - Added the ability to have one character long channel names.
 - Pre-packaged Calls v0.4.9 with Mattermost server v6.7 (closed Beta). To participate in Beta testing, please contact [Mattermost](https://mattermost.com/contact-sales/).
 - Updated the NPS plugin to version 1.2.0 to add a new **Give Feedback** menu item to the **Help** menu to send feedback at anytime.
 
#### Performance
 - Improved the performance of ``GetTeamsUnreadForUser`` when Collapsed Reply Threads is enabled.
 - Added an index to the ``UserGroups DisplayName`` for improved autosuggest query performance.
 - Improved the performance of permission selectors.
 - Improved the performance of configuration read/writes if the configuration is stored on a database.

#### Administration
 - To add the ability to toggle sending inactivity email notification to Admins, a configuration setting ``EmailSettings.EnableInactivityEmail`` was added.
 - To filter out inactive users in the System Console, an **Active** filter was added for users and Admins in **System Console > User Management > Users**.
 - Added a ``threadsOnly`` query parameter for getting user threads.
 - To allow Admins to add a new license without having to first remove the old one, a new “License" button was added to **System Console > Edition and License**.

#### Enterprise Subscription
 - The Elasticsearch indexing job is resumable now. Stopping a server while the job is running will put the job in pending status and will resume the job when the server starts. The job can still be explicitly canceled via the **System Console**.

### Bug Fixes
 - Fixed an issue where permalinks to direct and group message posts did not show a preview.
 - Fixed an issue when Collapsed Reply Threads are enabled where marking a root post with a mention as unread displayed both a mention badge and the thread item being bolded.
 - Fixed an issue where the public link to generate the API was getting called even if public links were disabled.
 - Fixed an issue with onboarding page view events.
 - Fixed an issue where the custom emoji **Next** button was out of view when a banner was present.
 - Fixed an issue where it would appear that a user had a negative number of unread threads.
 - Fixed an issue where marking the last post in a thread as unread didn't mark the thread as unread.
 - Restored the rendering of main menu items from plugins in non-mobile view.
 - Fixed the overflow of text in **Manage Channel Members** modal title.
 - Fixed an issue where pagination was broken in **System Console > Groups**.
 - Fixed an issue where thread updates did not show correctly after the computer woke up.
 - Fixed an issue where a negative unread count sometimes appeared with Collapsed Reply Threads enabled.
 - Fixed an issue where the modal to create a Custom Group got closed when pressing ENTER.
 - Fixed an issue where group mention did not get highlighted in Professional subscription.
 - Fixed an issue where users were unable to edit posts with markdown code blocks.
 - Fixed an issue where sending test (empty) notifications was allowed even when the ``SendPushNotifications`` config setting was set to ``false``.
   
### config.json
Multiple setting options were added to ``config.json``. Below is a list of the additions and their default values on install. The settings can be modified in ``config.json``, or the System Console when available.

#### Changes to Team Edition and Enterprise Edition:
 - Under ``EmailSettings`` in ``config.json``:
    - Added ``EnableInactivityEmail`` setting to be able to disable inactive server email notifications.
 - Under ``JobSettings`` in ``config.json``:
    - Added a new cleanup job to regularly remove outdated config entries from the database. The threshold for this setting can be adjusted with ``CleanupConfigThresholdDays``.
 - Under ``ElasticsearchSettings`` in ``config.json``:
    - Elasticsearch (Enterprise subscription) and Bleve indexing have been revamped to be much more efficient and faster. The config parameter ``BulkIndexingTimeWindowSeconds`` for both Elasticsearch and Bleve is now deprecated and no longer used. A new config parameter called ``BatchSize`` has been introduced instead. This parameter controls the number of objects that can be indexed in a single batch. This makes things more efficient and maintains a constant workload.

#### API Changes
 - Added a new API endpoint ``POST /api/v4/users/{user_id}/teams/{team_id}/threads/{thread_id}/set_unread/{post_id}`` to set a thread as unread by post id.
 - Added new API endpoints ``GET /api/v4/teams/:team_id/top/reactions`` and ``GET /api/v4/users/me/top/reactions`` to get top reactions for a team and user.
 - Fixed an issue where the ``UpdateUser`` API endpoint required a ``create_at`` field.
 - ``api/v4/file/s3_test`` now requires ``FileSettings`` to be all set to run.
 - ``api/v4/email/test`` now requires ``EmailSettings`` to be all set to run.
 - Added ``fromWebhook`` property to the webapp plugin API.

### Go Version
 - v6.7 is built with Go ``v1.18.1``.

### Open Source Components
 - Added ``react-native-math-view`` to https://github.com/mattermost/mattermost-mobile.
 - Removed ``flux`` and ``react-slidedown`` from https://github.com/mattermost/mattermost-webapp.
 - Added ``@mattermost/compass-icons``, ``bootstrap-dark``, ``fs-extra``, and ``pretty-bytes`` to https://github.com/mattermost/desktop.

### Known Issues
 - Channels with more than 100 members only show 100 members in the right-hand side [MM-44159](https://mattermost.atlassian.net/browse/MM-44159).
 - Shortcut modal for channel info shows ``Alt`` instead of ``Shift`` for Mac [MM-44172](https://mattermost.atlassian.net/browse/MM-44172).
 - A blank screen is seen when returning from the System Console while the Channel Info is open on the right-hand side [MM-44435](https://mattermost.atlassian.net/browse/MM-44435).
 - [Collapsed Reply Threads](https://docs.mattermost.com/messaging/organizing-conversations.html) is currently in beta. Before enabling the feature, please ensure you are well versed in the [known issues](https://docs.mattermost.com/messaging/organizing-conversations.html#known-issues), particularly relating to database resource requirements and server performance implications. If you cannot easily scale up your database size, or are running the Mattermost application server and database server on the same machine, we recommended waiting to enable Collapsed Reply Threads until it's [promoted to general availability in Q2 2022](https://mattermost.com/blog/collapsed-reply-threads-ga). Learn more about these [performance considerations here](https://support.mattermost.com/hc/en-us/articles/4413183568276).
 - File upload might fail for SVG files [MM-38982](https://mattermost.atlassian.net/browse/MM-38982).
 - Adding an @mention at the start of a post draft and pressing the left or right arrow key can clear the post draft and the undo history [MM-33823](https://mattermost.atlassian.net/browse/MM-33823).
 - Google login fails on the Classic mobile apps.
 - Status may sometimes get stuck as **Away** or **Offline** in High Availability mode with IP Hash turned off.
 - Searching stop words in quotation marks with Elasticsearch enabled returns more than just the searched terms.
 - The team sidebar on the desktop app does not update when channels have been read on mobile.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.
 - Boards are not refreshing on creation. See the [GitHub discussion](https://github.com/mattermost/focalboard/discussions/1971) for more information.
 - Boards export and reimport duplicates boards because all IDs are replaced by new ones on the server. See the [GitHub issue](https://github.com/mattermost/focalboard/issues/1924) for more information.

### Contributors
 - [aeomin](https://github.com/aeomin), [agarciamontoro](https://github.com/agarciamontoro), [AGMETEOR](https://github.com/AGMETEOR), [agnivade](https://github.com/agnivade), [alexkoala](https://github.com/alexkoala), [alieh-rymasheuski](https://github.com/alieh-rymasheuski), [allonios](https://github.com/allonios), [amyblais](https://github.com/amyblais), [amynicol1985](https://github.com/amynicol1985), [andrewodri](https://github.com/andrewodri), [angeloskyratzakos](https://github.com/angeloskyratzakos), [asaadmahmood](https://github.com/asaadmahmood), [ashishbhate](https://github.com/ashishbhate), [AshishDhama](https://github.com/AshishDhama), [azigler](https://github.com/azigler), [BenCookie95](https://github.com/BenCookie95), [BenLloydPearson](https://github.com/BenLloydPearson), [bermelmike](https://translate.mattermost.com/user/bermelmike), [boxiyang](https://translate.mattermost.com/user/boxiyang), [bpodwinski](https://github.com/bpodwinski), [calebroseland](https://github.com/calebroseland), [cdump](https://github.com/cdump), [cecilysullivan](https://github.com/cecilysullivan), [chenilim](https://github.com/chenilim), [cleferman](https://github.com/cleferman), [codedsun](https://github.com/codedsun), [coltoneshaw](https://github.com/coltoneshaw), [cota-eng](https://translate.mattermost.com/user/cota-eng), [cpoile](https://github.com/cpoile), [ctlaltdieliet](https://github.com/ctlaltdieliet), [cwarnermm](https://github.com/cwarnermm), [devinbinnie](https://github.com/devinbinnie), [emdecr](https://github.com/emdecr), [enahum](https://github.com/enahum), [esethna](https://github.com/esethna), [ewwollesen](https://github.com/ewwollesen), [flynbit](https://github.com/flynbit), [furqanmlk](https://github.com/furqanmlk), [gabrieljackson](https://github.com/gabrieljackson), [gbochora](https://github.com/gbochora), [HandsomeChoco/](https://translate.mattermost.com/user/HandsomeChoco/), [hanzei](https://github.com/hanzei), [harshilsharma63](https://github.com/harshilsharma63), [hmhealey](https://github.com/hmhealey), [ialorro](https://github.com/ialorro), [iomodo](https://github.com/iomodo), [isacikgoz](https://github.com/isacikgoz), [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais), [jbattistispiria](https://github.com/jbattistispiria), [jespino](https://github.com/jespino), [jfrerich](https://github.com/jfrerich), [johndavidlugtu](https://github.com/johndavidlugtu), [johnsonbrothers](https://github.com/johnsonbrothers), [josephbaylon](https://github.com/josephbaylon), [jpaldeano](https://github.com/jpaldeano), [jprusch](https://github.com/jprusch), [JtheBAB](https://translate.mattermost.com/user/JtheBAB), [JulienTant](https://github.com/JulienTant), [jupenur](https://github.com/jupenur), [justinegeffen](https://github.com/justinegeffen), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [kayazeren](https://github.com/kayazeren), [KevinSJ](https://github.com/KevinSJ), [kherwata](https://translate.mattermost.com/user/kherwata), [KobeBergmans](https://github.com/KobeBergmans), [koox00](https://github.com/koox00), [krmh04](https://github.com/krmh04), [kyeongsoosoo](https://github.com/kyeongsoosoo), [larkox](https://github.com/larkox), [levb](https://github.com/levb), [lieut-data](https://github.com/lieut-data), [lindy65](https://github.com/lindy65), [lkyuchukov](https://github.com/lkyuchukov), [M-ZubairAhmed](https://github.com/M-ZubairAhmed), [majo](https://translate.mattermost.com/user/majo/), [maksimatveev](https://github.com/maksimatveev), [marianunez](https://github.com/marianunez), [master7](https://translate.mattermost.com/user/master7/), [matt-w99](https://github.com/matt-w99), [matthew-w](https://translate.mattermost.com/user/matthew-w/), [maxtrem271991](https://translate.mattermost.com/user/maxtrem271991), [mgdelacroix](https://github.com/mgdelacroix), [michaelgamble](https://github.com/michaelgamble), [michelengelen](https://github.com/michelengelen), [mickmister](https://github.com/mickmister), [mikebermel](https://github.com/mikebermel), [milotype](https://github.com/milotype), [mkraft](https://github.com/mkraft), [Mshahidtaj](https://github.com/Mshahidtaj), [muratbayan](https://github.com/muratbayan), [mvitale1989](https://github.com/mvitale1989), [mylonsuren](https://github.com/mylonsuren), [nat-gunner](https://github.com/nat-gunner), [natalie-hub](https://github.com/natalie-hub), [nathanaelhoun](https://github.com/nathanaelhoun), [neallred](https://github.com/neallred), [nickmisasi](https://github.com/nickmisasi), [ogi-m](https://github.com/ogi-m), [pfltdv](https://github.com/pfltdv), [phoinixgrr](https://github.com/phoinixgrr), [Phrynobatrachus](https://github.com/Phrynobatrachus), [Pinjasaur](https://github.com/Pinjasaur), [plant99](https://github.com/plant99), [pvev](https://github.com/pvev), [Rajat-Dabade](https://github.com/Rajat-Dabade), [rebornwwp](https://github.com/rebornwwp), [RoyI99](https://github.com/RoyI99), [ryoarmanda](https://github.com/ryoarmanda), [saturninoabril](https://github.com/saturninoabril), [sayanta66](https://github.com/sayanta66), [sbishel](https://github.com/sbishel), [serhack](https://github.com/serhack), [seoyeongeun](https://translate.mattermost.com/user/seoyeongeun), [shadowshot-x](https://github.com/shadowshot-x), [SiderealArt](https://translate.mattermost.com/user/SiderealArt), [silentyak](https://github.com/silentyak), [sinansonmez](https://github.com/sinansonmez), [Sonichigo](https://github.com/Sonichigo), [spirosoik](https://github.com/spirosoik), [sri-byte](https://github.com/sri-byte), [stafot](https://github.com/stafot), [streamer45](https://github.com/streamer45), [stylianosrigas](https://github.com/stylianosrigas), [svelle](https://github.com/svelle), [Szymongib](https://github.com/Szymongib), [TQuock](https://github.com/TQuock), [trilopin](https://github.com/trilopin), [tsabi](https://github.com/tsabi), [TylerStilson](https://github.com/TylerStilson), [unode](https://github.com/unode), [vadimasadchi](https://github.com/vadimasadchi), [varghesejose2020](https://github.com/varghesejose2020), [VishakhaPoonia](https://github.com/VishakhaPoonia), [Vovcharaa](https://github.com/Vovcharaa), [wiggin77](https://github.com/wiggin77), [Willyfrog](https://github.com/Willyfrog), [zefhemel](https://github.com/zefhemel)

## Release v6.6 - [Feature Release](https://docs.mattermost.com/upgrade/release-definitions.html#feature-release)

- **v6.6.2, released 2022-06-13**
  - Mattermost v6.6.2 contains medium severity level security fixes. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).
  - The value of ``ServiceSettings.TrustedProxyIPHeader`` defaults to empty from now on. A previous bug prevented this from happening
in certain conditions. Customers are requested to check for these values in their config and set them to nil if necessary. See more details [here](https://docs.mattermost.com/configure/configuration-settings.html#trusted-proxy-ip-header).
  - Fixed a bug that allowed to send test (empty) notifications even if the ``SendPushNotifications`` config was set to ``false``.
- **v6.6.1, released 2022-04-28**
  - Mattermost v6.6.1 contains a medium severity level security fix. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).
  - Replaced an expired GPG key which is used to verify the enterprise binary.
  - Fixed an issue with null values in the OAuthApps table's MattermostAppID column, which was introduced in v6.6.0 [MM-43500](https://mattermost.atlassian.net/browse/MM-43500).
  - Fixed an issue where the Workspace Optimization dashboard mentioned that the workspace had reached over 100 users, when fewer than 100 users were registered [MM-43215](https://mattermost.atlassian.net/browse/MM-43215).
- **v6.6.0, released 2022-04-16**
  - Original 6.6.0 release

Mattermost v6.6.0 contains a low severity level security fix. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).

### Compatibility
 - Updated Safari recommended minimum version to v14.1+.

### Important Upgrade Notes
 - The [Apps Framework protocol](https://developers.mattermost.com/integrate/apps/) for binding/form submissions has changed, by separating the single `call` into separate `submit`, `form`, `refresh` and `lookup` calls. If any users have created their own Apps, they have to be updated to the new system.

**IMPORTANT:** If you upgrade from a release earlier than v6.5, please read the other [Important Upgrade Notes](https://docs.mattermost.com/upgrade/important-upgrade-notes.html).

### Highlights

#### Apps Framework 1.0: General Availability
 - The [Apps Framework](https://developers.mattermost.com/integrate/apps/) allows developers to build integrations with Mattermost that seamlessly work across Mattermost’s desktop and mobile clients. Apps can be developed using any programming language, as opposed to plugins which must be developed in Go.

#### Triggers and Actions
 - Channel admins can now configure [certain actions](https://docs.mattermost.com/channels/create-channels.html) to be executed automatically based on trigger conditions without writing any code. Users running an older Playbooks release need to upgrade their Playbooks instance to at least v1.26 to take advantage of the channel actions functionality.

#### Actions Restructure
 - The **Actions** menu was restructured to reduce the clutter from Plugins and Apps.

#### Playbook Updates
 - Added [retrospective metrics](https://docs.mattermost.com/playbooks/metrics-and-goals.html) (Enterprise edition) to track up to four key metrics that indicate performance of every run.

### Improvements

#### User Interface (UI)
 - Pre-packaged Calls v0.4.8 with Mattermost server v6.6 (closed Beta). To participate in Beta testing, please contact [Mattermost](https://mattermost.com/contact-sales/).
 - Added nested previews for permalinks.
 - Added a right-hand side Channel Info panel to see and interact with channel information.
 - Added support for inline editing of posts.
 - Changed the Mattermost indigo theme to match the dark theme in code blocks.
 - Updated in-product links from legacy domain about.mattermost.com to mattermost.com.
 - Made it easier to copy code blocks by adding a copy button on hover.
 - Made it easier to copy a message via a new **Copy Text** post menu item.
 - Added a loading indicator to the **Threads** global list each time more posts are fetched on infinite scroll.
 - Added search guidance to the **Threads** global list when no more posts can be loaded. This is only shown if you’ve scrolled to load older posts and reach the end of the list.
 - Added accessibility support for custom statuses.
 - Tooltip is now only displayed when text is too long in the announcement banner.
 - When restricting direct messages to users on the same team, bots are now excluded from that restriction.
 - Brazilian Portuguese language support was downgraded to Beta.
 
#### Performance
 - Improved performance when clearing notifications with Collapsed Reply Threads enabled.
 - Improved performance of Collapsed Reply Threads when ``ThreadAutoFollow`` is enabled but ``CollapsedThreads`` is disabled.
 - Fixed a potential memory leak in the sidebar when using accessibility hotkeys.
 - Virtualized the emoji picker and added other performance improvements to the emoji picker.
 - Improved the performance of storing users in webapp.
 - Fixed a small memory leak in the **System Console**.

#### Plugins
 - Updated the plugin registry's ``registerCallButtonAction`` method to allow for displaying custom calls buttons in the channel header.
 - Added a debugging setting to turn off client-side plugins for the current user.
 - Added performance metrics related to plugin loading on page load.

#### Administration
 - The default for [``ThreadAutoFollow``](https://docs.mattermost.com/configure/configuration-settings.html#automatically-follow-threads) has been changed to ``true``. This does not affect existing configurations where this value is already set to ``false``; however, we recommend enabling ``ThreadAutoFollow`` if you plan to enable [Collapsed Reply Threads](https://docs.mattermost.com/channels/organize-conversations.html) in the future.
 - Improved the license upload flow.
 - The Start Trial CTA presents a modal exposing the benefits the client gets by starting the trial, encouraging Admins to request a trial license and engage them with the product.
 - A new field was added to the client configuration to let clients know the database schema version of the server. The applied database migrations have also been added to the **System Console**.
 - Added a ``Automatically Follow Threads`` configuration setting to the **System Console** to expose the ``threadAutoFollow`` config setting to the User Interface.
 - An error is now shown on the email invitation modal if SMTP is not configured but email invitations are ``true``.
 - Logs from third-party libraries are now included in the default logging configuration.
 - Added additional performance debugging settings.
 - The support email field has moved from **Customization** to **Notifications** in the System Console. Also, a support email is now required when configuring email notifications.
 - The ping endpoint can now receive a device ID, which will report whether the device is able to receive push notifications.
 - [Feature flags](https://developers.mattermost.com/contribute/server/feature-flags/) are now automatically refreshed when the server undergoes a restart.
 - Added a sort order to the category API, and included category data in the websocket category update event.
 - Permissions for private playbooks are now hidden unless running an Enterprise license.

### Bug Fixes
 - Fixed an error that occured when a non-logged-in user attempted to view a page that required being logged in while MFA was required on the server.
 - Fixed an issue where the channel switcher displayed channels from teams the Admin was no longer part of.
 - Fixed an issue where ``ThreadStore.GetThreadsForUser`` did not count correctly when no team ID was specified.
 - Fixed an issue where ``zip`` file creation failed when adding attachments.
 - Fixed an issue where emoji short codes written in Markdown were not added to recently used emojis.
 - Fixed the positioning of SVGs in admin onboarding when the screen doesn't have a previous button.
 - Fixed an issue with the displayed channel name in the channel tutorial tip.
 - Fixed an issue with the clickable area for emojis in the emoji picker to match the interface.
 - Fixed an issue where usernames with periods in the channel switcher input showed Group Messages over matching Direct Messages.
 - Fixed an issue on Collapsed Reply Threads compact message view where clicking on the thread footer avatar did not open the profile modal.
 - Fixed a scan error on column name "LastRootPostAt": converting NULL to int64.
 - Fixed an issue where selecting a custom status from Recent statuses used the original expiration time.
 - Fixed an issue that caused a gap to appear on the left-hand side in products using the team sidebar.
 - Fixed an issue where moving up or down in the channel switcher didn’t work as expected when Global Threads was in the background.
 - Fixed an issue where pressing ENTER opened the onboarding tutorial tip.
 - Fixed an issue where some permission checkboxes had been moved to different categories in the System Console.
 - Fixed an issue where a blank screen occurred upon leaving a currently open unread channel with the channel unread grouping enabled.
 - Fixed an issue related to disabling and re-enabling Custom Terms of Service.
 - Fixed an issue where channel links on hover overlapped the channels menus.
 - Fixed the positioning of the post menu in mobile web view.
 - Fixed an issue where closing the keyboard shortcut modal by "CTRL/CMD + /" didn’t work.
 - Fixed an issue where the channel keyboard navigation was broken in the Threads view.
   
### config.json
Multiple setting options were added to ``config.json``. Below is a list of the additions and their default values on install. The settings can be modified in ``config.json``, or the System Console when available.

#### Changes to Team Edition and Enterprise Edition:
 - Under ``ServiceSettings`` in ``config.json``:
    - The default for ``ThreadAutoFollow`` has been changed to ``true``. This does not affect existing configurations where this value is already set to ``false``.

### Go Version
 - v6.6 is built with Go ``v1.16.7``.

### Open Source Components
 - Added ``@tippyjs/react``, ``react-popper``, ``react-slidedown`` and ``smooth-scroll-into-view-if-needed`` , and removed ``prettier`` and ``xregexp`` from https://github.com/mattermost/mattermost-webapp.

### Known Issues
 - On subpath, 404 can be seen on OpenID or SAML redirect after changing login method. The login change is successful, and manually adding the subpath name into the URL opens the expected page [MM-43114](https://mattermost.atlassian.net/browse/MM-43114).
 - [Collapsed Reply Threads](https://docs.mattermost.com/messaging/organizing-conversations.html) is currently in beta. Before enabling the feature, please ensure you are well versed in the [known issues](https://docs.mattermost.com/messaging/organizing-conversations.html#known-issues), particularly relating to database resource requirements and server performance implications. If you cannot easily scale up your database size, or are running the Mattermost application server and database server on the same machine, we recommended waiting to enable Collapsed Reply Threads until it's [promoted to general availability in Q2 2022](https://mattermost.com/blog/collapsed-reply-threads-ga). Learn more about these [performance considerations here](https://support.mattermost.com/hc/en-us/articles/4413183568276).
 - File upload might fail for SVG files [MM-38982](https://mattermost.atlassian.net/browse/MM-38982).
 - Adding an @mention at the start of a post draft and pressing the left or right arrow key can clear the post draft and the undo history [MM-33823](https://mattermost.atlassian.net/browse/MM-33823).
 - Google login fails on the Classic mobile apps.
 - Status may sometimes get stuck as **Away** or **Offline** in High Availability mode with IP Hash turned off.
 - Searching stop words in quotation marks with Elasticsearch enabled returns more than just the searched terms.
 - The team sidebar on the desktop app does not update when channels have been read on mobile.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.
 - Boards are not refreshing on creation. See the [GitHub discussion](https://github.com/mattermost/focalboard/discussions/1971) for more information.
 - Boards export and reimport duplicates boards because all IDs are replaced by new ones on the server. See the [GitHub issue](https://github.com/mattermost/focalboard/issues/1924) for more information.

### Contributors
 - [AccountingMattermost](https://github.com/AccountingMattermost), [aeomin](https://translate.mattermost.com/user/aeomin/), [agarciamontoro](https://github.com/agarciamontoro), [AGMETEOR](https://github.com/AGMETEOR), [agnivade](https://github.com/agnivade), [akkivasu](https://github.com/akkivasu), [Alexnoj](https://github.com/Alexnoj), [amyblais](https://github.com/amyblais), [andreygolubkow](https://github.com/andreygolubkow), [asaadmahmood](https://github.com/asaadmahmood), [ashishbhate](https://github.com/ashishbhate), [AshishDhama](https://github.com/AshishDhama), [azigler](https://github.com/azigler), [BenCookie95](https://github.com/BenCookie95), [BenLloydPearson](https://github.com/BenLloydPearson), [blocodenotas](https://github.com/blocodenotas), [bobertoyin](https://github.com/bobertoyin), [Borknab](https://github.com/Borknab), [bpodwinski](https://github.com/bpodwinski), [calebroseland](https://github.com/calebroseland), [CeesJol](https://github.com/CeesJol), [chenilim](https://github.com/chenilim), [ChristieBavelaar](https://github.com/ChristieBavelaar), [cleferman](https://github.com/cleferman), [coltoneshaw](https://github.com/coltoneshaw), [cpoile](https://github.com/cpoile), [crspeller](https://github.com/crspeller), [ct7amz](https://translate.mattermost.com/user/ct7amz/), [ctlaltdieliet](https://github.com/ctlaltdieliet), [cwarnermm](https://github.com/cwarnermm), [darkonovkina](https://translate.mattermost.com/user/darkonovkina/), [debasish4patra](https://github.com/debasish4patra), [devinbinnie](https://github.com/devinbinnie), [dipak-demansol](https://github.com/dipak-demansol), [dontoisme](https://github.com/dontoisme), [DSchalla](https://github.com/DSchalla), [emdecr](https://github.com/emdecr), [emilyacook](https://github.com/emilyacook), [enahum](https://github.com/enahum), [EragonRD](https://github.com/EragonRD), [erdeerdeerde](https://github.com/erdeerdeerde), [ericocesar](https://github.com/ericocesar), [ewwollesen](https://github.com/ewwollesen), [flynbit](https://github.com/flynbit), [fromhro](https://github.com/fromhro), [furqanmlk](https://github.com/furqanmlk), [gabrieljackson](https://github.com/gabrieljackson), [gbochora](https://github.com/gbochora), [glennschler](https://github.com/glennschler), [gmerz](https://github.com/gmerz), [gyeben](https://github.com/gyeben), [hannaparks](https://github.com/hannaparks), [hanzei](https://github.com/hanzei), [harshilsharma63](https://github.com/harshilsharma63), [hmhealey](https://github.com/hmhealey), [htlcnn](https://github.com/htlcnn), [hydeenoble](https://github.com/hydeenoble), [icelander](https://github.com/icelander), [iomodo](https://github.com/iomodo), [isacikgoz](https://github.com/isacikgoz), [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais), [jespino](https://github.com/jespino), [jfrerich](https://github.com/jfrerich), [jgilliam17](https://github.com/jgilliam17), [johndavidlugtu](https://github.com/johndavidlugtu), [johnsonbrothers](https://github.com/johnsonbrothers), [jordanafung](https://github.com/jordanafung), [jpetazzo](https://github.com/jpetazzo), [jprusch](https://github.com/jprusch), [JtheBAB](https://github.com/JtheBAB), [JulienTant](https://github.com/JulienTant), [julmondragon](https://github.com/julmondragon), [justinegeffen](https://github.com/justinegeffen), [jwilander](https://github.com/jwilander), [k4awon](https://github.com/k4awon), [kaakaa](https://github.com/kaakaa), [kamre](https://github.com/kamre), [karistuck](https://github.com/karistuck), [kayazeren](https://github.com/kayazeren), [KevinSJ](https://github.com/KevinSJ), [koox00](https://github.com/koox00), [krmh04](https://github.com/krmh04), [kzmi](https://translate.mattermost.com/user/kzmi/), [larkox](https://github.com/larkox), [levb](https://github.com/levb), [lieut-data](https://github.com/lieut-data), [lindy65](https://github.com/lindy65), [M-ZubairAhmed](https://github.com/M-ZubairAhmed), [majo](https://translate.mattermost.com/user/majo/), [maksimatveev](https://github.com/maksimatveev), [marianunez](https://github.com/marianunez), [maruTA-bis5](https://github.com/maruTA-bis5), [master7](https://translate.mattermost.com/user/master7/), [matt-w99](https://github.com/matt-w99), [matthew-w](https://translate.mattermost.com/user/matthew-w/), [metanerd](https://github.com/metanerd), [michelengelen](https://github.com/michelengelen), [mickmister](https://github.com/mickmister), [milotype](https://github.com/milotype), [mkdbns](https://github.com/mkdbns), [mkraft](https://github.com/mkraft), [Mshahidtaj](https://github.com/Mshahidtaj), [mylonsuren](https://github.com/mylonsuren), [nasermoein](https://github.com/nasermoein), [natalie-hub](https://github.com/natalie-hub), [nathanaelhoun](https://github.com/nathanaelhoun), [neallred](https://github.com/neallred), [nickmisasi](https://github.com/nickmisasi), [nikolaizah](https://github.com/nikolaizah), [Nothing23yeh](https://github.com/Nothing23yeh), [noxer](https://github.com/noxer), [ogi-m](https://github.com/ogi-m), [oh6hay](https://github.com/oh6hay), [pfltdv](https://github.com/pfltdv), [Phrynobatrachus](https://github.com/Phrynobatrachus), [potatogim](https://github.com/potatogim), [pvev](https://github.com/pvev), [ramirezjag00](https://github.com/ramirezjag00), [rodcorsi](https://github.com/rodcorsi), [ruckc](https://github.com/ruckc), [ryoarmanda](https://github.com/ryoarmanda), [saturninoabril](https://github.com/saturninoabril), [sayanta66](https://github.com/sayanta66), [sbishel](https://github.com/sbishel), [sc](https://translate.mattermost.com/user/_sc/), [sibasankarnayak](https://github.com/sibasankarnayak), [sinansonmez](https://github.com/sinansonmez), [spirosoik](https://github.com/spirosoik), [src-r-r](https://github.com/src-r-r), [sri-byte](https://github.com/sri-byte), [sridhar02](https://github.com/sridhar02), [srkgupta](https://github.com/srkgupta), [stafot](https://github.com/stafot), [streamer45](https://github.com/streamer45), [stylianosrigas](https://github.com/stylianosrigas), [superkkt](https://github.com/superkkt), [Szymongib](https://github.com/Szymongib), [ThiefMaster](https://github.com/ThiefMaster), [thorkemado](https://github.com/thorkemado), [tilto0822](https://github.com/tilto0822), [tmotyl](https://github.com/tmotyl), [tomaszn](https://github.com/tomaszn), [TQuock](https://github.com/TQuock), [trilopin](https://github.com/trilopin), [tsabi](https://github.com/tsabi), [vadimasadchi](https://github.com/vadimasadchi), [varghesejose2020](https://github.com/varghesejose2020), [vish9812](https://github.com/vish9812), [VishakhaPoonia](https://github.com/VishakhaPoonia), [wandersiemers](https://github.com/wandersiemers), [wiersgallak](https://github.com/wiersgallak), [wiggin77](https://github.com/wiggin77), [Willyfrog](https://github.com/Willyfrog), [wuwinson](https://github.com/wuwinson), [Zxce3](https://github.com/Zxce3)

## Release v6.5 - [Feature Release](https://docs.mattermost.com/upgrade/release-definitions.html#feature-release)

- **v6.5.2, released 2022-06-13**
  - Mattermost v6.5.2 contains medium severity level security fixes. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).
  - The value of ``ServiceSettings.TrustedProxyIPHeader`` defaults to empty from now on. A previous bug prevented this from happening
in certain conditions. Customers are requested to check for these values in their config and set them to nil if necessary. See more details [here](https://docs.mattermost.com/configure/configuration-settings.html#trusted-proxy-ip-header).
  - Fixed a bug that allowed to send test (empty) notifications even if the ``SendPushNotifications`` config was set to ``false``.
  - The ping endpoint now can receive a device ID, which will report whether the device is able to receive push notifications.
- **v6.5.1, released 2022-04-28**
  - Mattermost v6.5.1 contains a medium severity level security fix. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/). 
  - Fixed an issue on schema migrations where the Mattermost server failed to restart after having an error in the migration process.
  - Fixed an issue where the Get trial endpoint did not seem to complete.
- **v6.5.0, released 2022-03-16**
  - Original 6.5.0 release

Mattermost v6.5.0 contains low to medium severity level security fixes. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).

### Compatibility
 - Updated the recommended minimum supported Firefox version to v91+.

### Important Upgrade Notes
 - The ``mattermost version`` CLI command does not interact with the database anymore. Therefore the database version is not going to be printed. Also, the database migrations are not going to be applied with the version sub command. [A new db migrate sub command](https://docs.mattermost.com/manage/command-line-tools.html#mattermost-db-migrate) is added to enable administrators to trigger migrations.

**IMPORTANT:** If you upgrade from a release earlier than v6.4, please read the other [Important Upgrade Notes](https://docs.mattermost.com/upgrade/important-upgrade-notes.html).

### Highlights

#### Custom User Groups (Beta; Professional and Enterprise Plans)
 - Added the ability to mention a group of members at a time in a workspace. Users can create groups, edit group details, join groups, archive groups, and add group members.

#### Cross-team Channel Navigation
 - You can now find and jump to channels across all your teams by typing any channel name in the **Find Channels** modal.

#### Workspace Optimizations
 - System Admins can now review their overall health and growth scores and take recommended actions for ensuring their workspace is running smoothly, so users can get the most out of Mattermost.

#### Playbook Updates
 - Added a new onboarding tour for Playbooks.
 - Existing playbooks can now be duplicated by copying and modifying your colleague’s processes. Playbooks can also be exported.

#### Boards Updates
 - Added a new onboarding tour for Boards.
 - Improved the share boards user interface.
 - A link to Boards is now included in the channel intro whenever a new channel or direct message is started.
 - Added in-app links to import Help Docs.

### Improvements

#### User Interface (UI)
 - Added Persian as an official supported language (Beta).
 - Added a new onboarding experience for first System Admin user.
 - Added new tutorial tours for Channels, Boards, and Playbooks to help orient first time users.
 - Removed extra telemetry events that were tracked during page loads.
 - Added a feature card slide for Playbooks.
 - Removed ``admin-advisor`` bot's ability to notify admins about missing support email.
 - Clarified in-product error string "Oops!" as "Unable to continue" for both translators and target audiences in cases where a user doesn't have sufficient permissions to add users or guests.
 - Removed incorrect in-product string text from the **Send full message contents** email notification option description displayed via **System Console > Site Configuration > Notifications**.
 - Added the ability to send an unsanitized user to the source user on ``user_updated`` event.
 - In the compact view, the sender's username is now always shown on posts.
 - The post menu is now only rendered on the root post on hover over.
 - Updated a library used for storing drafts and other data in browser storage.
 - Enabled performance telemetry tracking for production deployments not running in developer mode. This telemetry tracking is disabled when telemetry is toggled off.
 - Inactive server email notifications will now be sent to System Admins occasionally if there have been no telemetry events on their server for 100 hours or more. Inactivity is determined by reviewing all activity on the server. This feature can also be disabled using the ``MM_FeatureFlag_EnableInactivityCheckJob`` feature flag.

#### Performance
 - Improved database performance when ``ThreadAutoFollow`` is enabled but ``CollapsedThreads`` is disabled. Learn more about ``ThreadAutoFollow`` and Collapsed Reply Threads [here](https://docs.mattermost.com/configure/configuration-settings.html#collapsed-reply-threads-beta).
 - Improved perceived typing performance by moving heavy code around and effective memoization related to the textbox component.
 - Fixed a memory leak caused by the post textbox.
 - Reduced the number of menu components listening for keyboard and mouse events.
 - Re-rendering of ``CustomStatusEmoji`` component is now avoided on post hovering.
 - Removed the collapsed sidebar menu from the DOM on sidebar collapse and expand.
 - Re-rendering of ``TextBox`` links component below the post box while typing is now avoided.

#### Plugins
 - Added an ``OnInstall()`` plugin hook.
 - Added an ``OnSendDailyTelemetry()`` plugin hook.
 - Added a new plugin registry entry to append menu items to the user guide dropdown.

### Bug Fixes
 - Fixed an issue with clicking images in the message attachment.
 - Fixed an issue that caused Rudder to create their cookies on the top-level domain when Mattermost was installed on a subdomain.
 - Fixed an issue where **Total Posts** and **Active Users With Posts** graphs did not render in **System Console** > **Team Statistics**.
 - Fixed an issue where telemetry events attempted to get sent even when blocked by an ad blocker.
 - Fixed an issue where the channel switcher stopped showing search results when the first few characters were removed.
 - Fixed an issue where notification sounds didn't trigger on the Desktop App for new accounts.
 - Fixed an issue where users got multiple sounds for a single notification on the Linux Desktop App.
 - Fixed an issue where posting frequent messages to followed threads caused jittery typing.
 - Fixed an issue where the **Add to channel** permission was available in private channels for non-admin users.
 - Fixed an issue where the reply notification setting was still in effect even when Collapsed Reply Threads was enabled.
 - Fixed an issue where running ``mmctl config migrate`` reset the configuration settings to defaults if the settings were already in the database.
 - Fixed an issue where the custom status menu option was missing the "x" to clear status.
 - Fixed an issue where the password reset link was valid for 1 hour instead of 24 hours.
 - Fixed an issue where the Mattermost import failed if an export contained a soft-deleted team.
 - Fixed an issue where search results in the right-hand side did not clear when changing screens from file results to any other.
 - Fixed an issue where an emoji import failed when the emoji name conflicted with a system emoji.
 - Fixed an issue where the **Edition and License** page displayed a prompt to upgrade to Enterprise for servers that already had an E20 license.
   
### config.json
Multiple setting options were added to ``config.json``. Below is a list of the additions and their default values on install. The settings can be modified in ``config.json``, or the System Console when available.

#### Changes to Team Edition and Enterprise Edition:
 - Under ``ServiceSettings`` in ``config.json``:
   - Added a new ``EnableClientPerformanceDebugging`` setting to enable some options for users on the web app to enable and disable different parts of the web app to help us isolate performance issues while debugging.
   - Added a new ``EnableCustomGroups`` setting to create and delete custom groups and to add and remove custom group members.

#### API Changes
 - Added new endpoint GET /api/v4/users/invalid_emails. This endpoint will return a list of non-guest users who are not in your whitelisted domains on a server where EnableOpenServer is false.
 - Added new API endpoint ``POST /system/onboarding/complete`` to complete onboarding.
 - Added a new API endpoint ``GET api/v4/latest_version`` to fetch the latest Mattermost version.
 - Modified an existing API endpoint ``${baseUrl}/api/v4/channels/search?system_console=false`` and added additional parameters ``${baseUrl}/api/v4/users/me/channels`` to fetch all the channel across teams and ``${baseUrl}/api/v4/users/${userId/channel_members`` to fetch all the channel_members across teams).

#### Websocket Changes
 - Refactored `user-update` websocket event handler to prevent extra get request to server for unsanitized user.
 - Added a new ``ReliableClusterSend`` field to ``model.WebsocketBroadcast`` to allow sending events through the cluster using the reliable channel.

### Go Version
 - v6.5 is built with Go ``v1.16.7``.

### Known Issues
 - The mmctl command built into version v6.5.0 appears to be from v6.4.1 [MM-42588](https://mattermost.atlassian.net/browse/MM-42588).
 - The new onboarding menu icon obscures System Console menu items [MM-42353](https://mattermost.atlassian.net/browse/MM-42353).
 - For Custom Groups, the user activity doesn't sync in two sessions [MM-42242](https://mattermost.atlassian.net/browse/MM-42242).
 - For Custom Groups, the last action popup menu is cut off [MM-42189](https://mattermost.atlassian.net/browse/MM-42189).
 - [Collapsed Reply Threads](https://docs.mattermost.com/messaging/organizing-conversations.html) is currently in beta. Before enabling the feature, please ensure you are well versed in the [known issues](https://docs.mattermost.com/messaging/organizing-conversations.html#known-issues), particularly relating to database resource requirements and server performance implications. If you cannot easily scale up your database size, or are running the Mattermost application server and database server on the same machine, we recommended waiting to enable Collapsed Reply Threads until it's [promoted to general availability in Q2 2022](https://mattermost.com/blog/collapsed-reply-threads-ga). Learn more about these [performance considerations here](https://support.mattermost.com/hc/en-us/articles/4413183568276).
 - File upload might fail for SVG files [MM-38982](https://mattermost.atlassian.net/browse/MM-38982).
 - Adding an @mention at the start of a post draft and pressing the left or right arrow key can clear the post draft and the undo history [MM-33823](https://mattermost.atlassian.net/browse/MM-33823).
 - Google login fails on the Classic mobile apps.
 - Status may sometimes get stuck as **Away** or **Offline** in High Availability mode with IP Hash turned off.
 - Searching stop words in quotation marks with Elasticsearch enabled returns more than just the searched terms.
 - The team sidebar on the desktop app does not update when channels have been read on mobile.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.
 - Boards are not refreshing on creation. See the [GitHub discussion](https://github.com/mattermost/focalboard/discussions/1971) for more information.
 - Boards export and reimport duplicates boards because all IDs are replaced by new ones on the server. See the [GitHub issue](https://github.com/mattermost/focalboard/issues/1924) for more information.

### Contributors
 - [97amarnathk](https://github.com/97amarnathk), [agarciamontoro](https://github.com/agarciamontoro), [AGMETEOR](https://github.com/AGMETEOR), [agnivade](https://github.com/agnivade), [akshitarora921](https://github.com/akshitarora921), [alerque](https://github.com/alerque), [amyblais](https://github.com/amyblais), [andrewbrown00](https://github.com/andrewbrown00), [angeloskyratzakos](https://github.com/angeloskyratzakos), [anurag6713](https://github.com/anurag6713), [asaadmahmood](https://github.com/asaadmahmood), [ashishbhate](https://github.com/ashishbhate), [AshishDhama](https://github.com/AshishDhama), [bbodenmiller](https://github.com/bbodenmiller), [BenCookie95](https://github.com/BenCookie95), [BenLloydPearson](https://github.com/BenLloydPearson), [calebroseland](https://github.com/calebroseland), [CeesJol](https://github.com/CeesJol), [chenilim](https://github.com/chenilim), [chris-nee](https://github.com/chris-nee), [codedsun](https://github.com/codedsun), [coltoneshaw](https://github.com/coltoneshaw), [cpanato](https://github.com/cpanato), [cpoile](https://github.com/cpoile), [crspeller](https://github.com/crspeller), [ctlaltdieliet](https://github.com/ctlaltdieliet), [cvockrodt](https://github.com/cvockrodt), [cwarnermm](https://github.com/cwarnermm), [danielsischy](https://github.com/danielsischy), [debasish4patra](https://github.com/debasish4patra), [devinbinnie](https://github.com/devinbinnie), [dipak-demansol](https://github.com/dipak-demansol), [DIVYA-19](https://github.com/DIVYA-19), [dontoisme](https://github.com/dontoisme), [emdecr](https://github.com/emdecr), [enahum](https://github.com/enahum), [EragonRD](https://github.com/EragonRD), [fromhro](https://github.com/fromhro), [furqanmlk](https://github.com/furqanmlk), [gabrieljackson](https://github.com/gabrieljackson), [gbochora](https://github.com/gbochora), [ggu1012](https://github.com/ggu1012), [gohyinhao](https://github.com/gohyinhao), [GR34SE](https://github.com/GR34SE), [gtapiasgt](https://github.com/gtapiasgt), [gyeben](https://translate.mattermost.com/user/gyeben/), [haardikdharma10](https://github.com/haardikdharma10), [hamzaMM](https://github.com/hamzaMM), [hanzei](https://github.com/hanzei), [harshilsharma63](https://github.com/harshilsharma63), [hmhealey](https://github.com/hmhealey), [hojin-kim](https://translate.mattermost.com/user/hojin-kim/), [iomodo](https://github.com/iomodo), [isacikgoz](https://github.com/isacikgoz), [it33](https://github.com/it33), [ITKozak](https://github.com/ITKozak), [jaz-on](https://github.com/jaz-on), [jespino](https://github.com/jespino), [johnsonbrothers](https://github.com/johnsonbrothers), [joriki](https://github.com/joriki), [josephbaylon](https://github.com/josephbaylon), [jprusch](https://github.com/jprusch), [jsoref](https://github.com/jsoref), [JtheBAB](https://github.com/JtheBAB), [JulienTant](https://github.com/JulienTant), [julmondragon](https://github.com/julmondragon), [jupriano](https://github.com/jupriano), [justinegeffen](https://github.com/justinegeffen), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [kamre](https://github.com/kamre), [karistuck](https://github.com/karistuck), [kayazeren](https://github.com/kayazeren), [koox00](https://github.com/koox00), [krmh04](https://github.com/krmh04), [krotovkk](https://github.com/krotovkk), [larkox](https://github.com/larkox), [levb](https://github.com/levb), [lieut-data](https://github.com/lieut-data), [M-ZubairAhmed](https://github.com/M-ZubairAhmed), [majo](https://translate.mattermost.com/user/majo/), [maksimatveev](https://github.com/maksimatveev), [mamounjamous](https://github.com/mamounjamous), [manojmalik20](https://github.com/manojmalik20), [master7](https://translate.mattermost.com/user/master7/), [matt-w99](https://github.com/matt-w99), [matthew-w](https://translate.mattermost.com/user/matthew-w/), [matthewbirtch](https://github.com/matthewbirtch), [maurobraggio](https://github.com/maurobraggio), [metanerd](https://github.com/metanerd), [michelengelen](https://github.com/michelengelen), [mickmister](https://github.com/mickmister), [milotype](https://github.com/milotype), [mkraft](https://github.com/mkraft), [mylonsuren](https://github.com/mylonsuren), [nasermoein](https://github.com/nasermoein), [nathanaelhoun](https://github.com/nathanaelhoun), [NathanBnm](https://github.com/NathanBnm), [neallred](https://github.com/neallred), [nevyangelova](https://github.com/nevyangelova), [nickmisasi](https://github.com/nickmisasi), [nikolaizah](https://github.com/nikolaizah), [Nothing23yeh](https://github.com/Nothing23yeh), [ogi-m](https://github.com/ogi-m), [oh6hay](https://github.com/oh6hay), [penthaapatel](https://github.com/penthaapatel), [persian@mattermost.com](https://translate.mattermost.com/user/persiantranslator@mattermost.com/), [persiantranslator@mattermost.com](https://translate.mattermost.com/user/persiantranslator@mattermost.com/), [Phrynobatrachus](https://github.com/Phrynobatrachus), [Pinjasaur](https://github.com/Pinjasaur), [plant99](https://github.com/plant99), [poflankov](https://github.com/poflankov), [potatogim](https://github.com/potatogim), [Profesor08](https://github.com/Profesor08), [pvev](https://github.com/pvev), [rodcorsi](https://github.com/rodcorsi), [Rutam21](https://github.com/Rutam21), [saeid.hmdr](https://translate.mattermost.com/user/saeid.hmdr/), [sargreal](https://github.com/sargreal), [Sayanta66](https://github.com/Sayanta66), [sbishel](https://github.com/sbishel), [scottaudet](https://github.com/scottaudet), [seoyeongeun](https://github.com/seoyeongeun), [serhack](https://github.com/serhack), [sibasankarnayak](https://github.com/sibasankarnayak), [sinansonmez](https://github.com/sinansonmez), [snan](https://github.com/snan), [Sonichigo](https://github.com/Sonichigo), [spirosoik](https://github.com/spirosoik), [sri-byte](https://github.com/sri-byte), [stafot](https://github.com/stafot), [streamer45](https://github.com/streamer45), [stylianosrigas](https://github.com/stylianosrigas), [superkkt](https://github.com/superkkt), [svelle](https://github.com/svelle), [Szymongib](https://github.com/Szymongib), [ThiefMaster](https://github.com/ThiefMaster), [tilto0822](https://github.com/tilto0822), [TQuock](https://github.com/TQuock), [tsabi](https://github.com/tsabi), [ukewea](https://github.com/ukewea), [varghesejose2020](https://github.com/varghesejose2020), [vinod-demansol](https://github.com/vinod-demansol), [wiersgallak](https://github.com/wiersgallak), [wiggin77](https://github.com/wiggin77), [Willyfrog](https://github.com/Willyfrog), [wuwinson](https://github.com/wuwinson), [zefhemel](https://github.com/zefhemel), [Zxce3](https://translate.mattermost.com/user/Zxce3/).

## Release v6.4 - [Feature Release](https://docs.mattermost.com/upgrade/release-definitions.html#feature-release)

- **v6.4.3, released 2022-04-28**
  - Mattermost v6.4.3 contains a medium severity level security fix. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).
  - Fixed an issue on schema migrations where the Mattermost server failed to restart after having an error in the migration process.
- **v6.4.2, released 2022-03-10**
  - Mattermost v6.4.2 contains medium severity level security fixes. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).
  - Fixed an issue where the webapp did not route notifications correctly when the computer was locked.
- **v6.4.1, released 2022-02-25**
  - Fixed a major web and desktop app performance issue for users with a large accumulated number of Direct Messages and Group Messages.
- **v6.4.0, released 2022-02-16**
  - Original 6.4.0 release

Mattermost v6.4.0 contains low severity level security fixes. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).

### Important Upgrade Notes
 - A new schema migration system has been introduced, so we strongly recommend backing up the database before updating the server to this version. The new migration system will run through all existing migrations to record them to a new table. This will only happen for the first run in order to migrate the application to the new system. The table where migration information is stored is called ``db_migrations``. Additionally, a ``db_lock`` table is used to prevent multiple installations from running migrations in parallel. Any downtime depends on how many records the database has and whether there are missing migrations in the schema. In case of an error while applying the migrations, please check this table first. If you encounter an issue please file [an Issue](https://github.com/mattermost/mattermost-server/issues) by including the failing migration name, database driver/version, and the server logs. 
 - On MySQL, if you encounter an error "Failed to apply database migrations" when upgrading to v6.4.0, it means that there is a mismatch between the table collation and the default database collation. You can manually fix this by changing the database collation with ``ALTER DATABASE <YOUR_DB_NAME> COLLATE = 'utf8mb4_general_ci',``. Then do the server upgrade again and the migration will be successful. 
 - It has been commonly observed on MySQL 8+ systems to have an error ``Error 1267: Illegal mix of collations`` when upgrading due to changing the default collation. This is caused by the database and the tables having different collations. If you get this error, please change the collations to have the same value with, for example, ``ALTER DATABASE <db_name> COLLATE = '<collation>'``.
 - The new migration system requires the MySQL database user to have additional *EXECUTE*, *CREATE ROUTINE*, *ALTER ROUTINE* and *REFERENCES* privileges to run schema migrations.                   

**IMPORTANT:** If you upgrade from a release earlier than v6.3, please read the other [Important Upgrade Notes](https://docs.mattermost.com/upgrade/important-upgrade-notes.html).

### Highlights

#### Playbook Updates
 - The Team and Starter plans no longer have a limit to the number of playbooks that can be created.

#### Boards Updates
 - Redesigned the Boards template selector to help users find the best template for projects.
 - Board archives now support images. All image attachments on cards will be included the next time a board archive is exported and imported. The archive format is changing with a new ``.boardarchive`` extension and all new exports will only be in this format.
 - Added card badges to indicate the type of content in a card, such as the description, comments, and checklists, without needing to open the card.
 - The entire text on URL properties is now clickable, so users can easily open links from a card without needing to click on a small link icon.
 - GIF file types are now supported as image attachments in card descriptions.

### Improvements

#### User Interface (UI)
 - Updated **Account Settings** terminology to **Settings**.
 - Added Accept-Language header to generate link previews in the default Server language.
 - The **Invite Members** button is now hidden when the Direct Message category is collapsed.
 - Added Collapsed Reply Threads (Beta) tour functionality.
 - Added a keyboard shortcut to open and expand the right-hand pane.
 - UX improvements to the **System Console > Licensing** page: added a new modal for the upload license workflow.

#### Administration
 - Improved plugins performance by re-initializing only after plugin configuration changes.
 - Removed dead struct ``ManifestExecutables``.
 - Added support for exporting and importing the post type and ``edit_at`` post details.
 - Added support for ``postgresql`` schema designator.

### Bug Fixes
 - Fixed an issue where the "Make channel admin" option did not display without a license.
 - Fixed an issue where the user menu header was visible when custom statuses were disabled.
 - Fixed an issue where the "New Replies" banner on the right-hand side was displayed for a thread that was entirely visible.
 - Fixed an issue where the markdown **Preview** link was not hidden in read-only channels.
 - Fixed an issue that caused a gap to appear on the left-hand side in products using the team sidebar.
 - Fixed an issue with Collapsed Reply Threads (Beta) where clearing a deleted root post left the right-hand side blank.
 - Fixed an issue where the **Add** channel member button text was cut off in Safari.
 - Fixed an issue where the file preview modal info bar showed the channel id instead of the channel name for Direct Messages.
 - Fixed an issue to add a loader when fetching data from the backend in the channel switcher if there are no results matching local data.
 - Fixed an issue where the **Get a Public Link** button in the file preview modal was hidden if the image was an external link.
 - Fixed an issue where the click effect on **Copy** invite link button was incorrect.
 - Reinstalling a previously-enabled plugin now correctly reports enabled status as false.
 - Fixed an issue where the Ctrl/Cmd+Shift+A hotkey to open **Settings** didn't work in desktop view.
 - Fixed an issue where the "Leave Channel" button didn't work from the channel sidebar 3-dot menu when clicking on it a second time.
   
### config.json
Multiple setting options were added to ``config.json``. Below is a list of the additions and their default values on install. The settings can be modified in ``config.json``, or the System Console when available.

#### Changes to Team Edition and Enterprise Edition:
 - Under ``DataRetentionSettings`` in ``config.json``:
   - Added ``EnableBoardsDeletion`` and ``BoardsRetentionDays`` to add support for Global Retention Policy for Boards.

#### API Changes
 - The ``api/v4/config/migrate`` API endpoint has been removed in favor of the mmctl ``--local`` endpoint. API clients won't be able to access this endpoint without having physical access to the server.

### Go Version
 - v6.4 is built with Go ``v1.16.7``.

### Open Source Components
 - Removed ``@formatjs/intl-pluralrules`` and ``@formatjs/intl-relativetimeformat`` from https://github.com/mattermost/mattermost-webapp.
 - Added ``msgpack/msgpack`` and ``pako`` to https://github.com/mattermost/mattermost-mobile.

### Known Issues
 - [Collapsed Reply Threads](https://docs.mattermost.com/messaging/organizing-conversations.html) is currently in beta. Before enabling the feature, please ensure you are well versed in the [known issues](https://docs.mattermost.com/messaging/organizing-conversations.html#known-issues), particularly relating to database resource requirements and server performance implications. If you cannot easily scale up your database size, or are running the Mattermost application server and database server on the same machine, we recommended waiting to enable Collapsed Reply Threads until it's [promoted to general availability in Q2 2022](https://mattermost.com/blog/collapsed-reply-threads-ga). Learn more about these [performance considerations here](https://support.mattermost.com/hc/en-us/articles/4413183568276).
 - File upload might fail for SVG files [MM-38982](https://mattermost.atlassian.net/browse/MM-38982).
 - Adding an @mention at the start of a post draft and pressing the left or right arrow key can clear the post draft and the undo history [MM-33823](https://mattermost.atlassian.net/browse/MM-33823).
 - Google login fails on the Classic mobile apps.
 - Status may sometimes get stuck as **Away** or **Offline** in High Availability mode with IP Hash turned off.
 - Searching stop words in quotation marks with Elasticsearch enabled returns more than just the searched terms.
 - The team sidebar on the desktop app does not update when channels have been read on mobile.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.
 - Boards are not refreshing on creation. See the [GitHub discussion](https://github.com/mattermost/focalboard/discussions/1971) for more information.
 - Boards export and reimport duplicates boards because all IDs are replaced by new ones on the server. See the [GitHub issue](https://github.com/mattermost/focalboard/issues/1924) for more information.

### Contributors
 - [3ach](https://github.com/3ach), [abdusabri](https://github.com/abdusabri), [abhijit-singh](https://github.com/abhijit-singh), [adithyaakrishna](https://github.com/adithyaakrishna), [Adovenmuehle](https://github.com/Adovenmuehle), [aeomin](https://github.com/aeomin), [agarciamontoro](https://github.com/agarciamontoro), [AGMETEOR](https://github.com/AGMETEOR), [agnivade](https://github.com/agnivade), [alauregaillard](https://github.com/alauregaillard), [alieh-rymasheuski](https://github.com/alieh-rymasheuski), [amyblais](https://github.com/amyblais), [anurag6713](https://github.com/anurag6713), [arjitc](https://github.com/arjitc), [asaadmahmood](https://github.com/asaadmahmood), [ashishbhate](https://github.com/ashishbhate), [AshishDhama](https://github.com/AshishDhama), [balajivenkatesh](https://github.com/balajivenkatesh), [BenHargreaves](https://github.com/BenHargreaves), [BenLloydPearson](https://github.com/BenLloydPearson), [bhimeshchauhan](https://github.com/bhimeshchauhan), [bobychaudhary](https://github.com/bobychaudhary), [calebroseland](https://github.com/calebroseland), [ChaseKnowlden](https://github.com/ChaseKnowlden), [chenilim](https://github.com/chenilim), [codedsun](https://github.com/codedsun), [coltoneshaw](https://github.com/coltoneshaw), [cpanato](https://github.com/cpanato), [cpoile](https://github.com/cpoile), [crspeller](https://github.com/crspeller), [ctlaltdieliet](https://github.com/ctlaltdieliet), [cwarnermm](https://github.com/cwarnermm), [debasish4patra](https://github.com/debasish4patra), [debci](https://translate.mattermost.com/user/debci/), [devinbinnie](https://github.com/devinbinnie), [dfun90](https://github.com/dfun90), [emdecr](https://github.com/emdecr), [enahum](https://github.com/enahum), [esethna](https://github.com/esethna), [evil.com](https://translate.mattermost.com/user/evil.com/), [flynbit](https://translate.mattermost.com/user/flynbit/), [frnkshin](https://github.com/frnkshin), [furqanmlk](https://github.com/furqanmlk), [gabrieljackson](https://github.com/gabrieljackson), [gbochora](https://github.com/gbochora), [gtapias](https://translate.mattermost.com/user/gtapias/), [hanzei](https://github.com/hanzei), [harshilsharma63](https://github.com/harshilsharma63), [hmhealey](https://github.com/hmhealey), [icelander](https://github.com/icelander), [iomodo](https://github.com/iomodo), [isacikgoz](https://github.com/isacikgoz), [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais), [jayaddison-collabora](https://github.com/jayaddison-collabora), [jespino](https://github.com/jespino), [jfrerich](https://github.com/jfrerich), [jgilliam17](https://github.com/jgilliam17), [jihoon-seo](https://github.com/jihoon-seo), [johnsonbrothers](https://github.com/johnsonbrothers), [josephjosedev](https://github.com/josephjosedev), [jpaldeano](https://github.com/jpaldeano), [jprusch](https://github.com/jprusch), [jsoref](https://github.com/jsoref), [JtheBAB](https://github.com/JtheBAB), [jufab](https://github.com/jufab), [JulienTant](https://github.com/JulienTant), [justinegeffen](https://github.com/justinegeffen), [jwilander](https://github.com/jwilander), [K3UL](https://github.com/K3UL), [kaakaa](https://github.com/kaakaa), [kamre](https://github.com/kamre), [kayazeren](https://github.com/kayazeren), [koox00](https://github.com/koox00), [krmh04](https://github.com/krmh04), [krotovkk](https://github.com/krotovkk), [LaoshuBaby](https://github.com/LaoshuBaby), [larkox](https://github.com/larkox), [levb](https://github.com/levb), [lieut-data](https://github.com/lieut-data), [lynn915](https://github.com/lynn915), [M-ZubairAhmed](https://github.com/M-ZubairAhmed), [maisnamrajusingh](https://github.com/maisnamrajusingh), [majo](https://translate.mattermost.com/user/majo/), [maksimatveev](https://github.com/maksimatveev), [manojmalik20](https://github.com/manojmalik20), [MarcCeleiro](https://translate.mattermost.com/user/MarcCeleiro/), [marianunez](https://github.com/marianunez), [master7](https://translate.mattermost.com/user/master7/), [matt-w99](https://github.com/matt-w99), [matthewbirtch](https://github.com/matthewbirtch), [matthew-w](https://translate.mattermost.com/user/matthew-w/), [Mercbot7](https://github.com/Mercbot7), [meshal](https://translate.mattermost.com/user/meshal/), [Meshalaw](https://github.com/Meshalaw), [mgdelacroix](https://github.com/mgdelacroix), [michaelgamble](https://github.com/michaelgamble), [mickmister](https://github.com/mickmister), [milotype](https://github.com/milotype), [mkbox](https://github.com/mkbox), [mkraft](https://github.com/mkraft), [mxschumacher](https://github.com/mxschumacher), [mylonsuren](https://github.com/mylonsuren), [nathanaelhoun](https://github.com/nathanaelhoun), [neallred](https://github.com/neallred), [nickmisasi](https://github.com/nickmisasi), [ogi-m](https://github.com/ogi-m), [oh6hay](https://github.com/oh6hay), [onoklin](https://github.com/onoklin), [pablovelezvidal](https://github.com/pablovelezvidal), [patatman](https://github.com/patatman), [Phrynobatrachus](https://github.com/Phrynobatrachus), [potatogim](https://github.com/potatogim), [R](https://translate.mattermost.com/user/R/), [RenePinnow](https://github.com/RenePinnow), [ricosega](https://github.com/ricosega), [rinkimekari](https://github.com/rinkimekari), [sadohert](https://github.com/sadohert), [sangramrath](https://github.com/sangramrath), [sanjaydemansol](https://github.com/sanjaydemansol), [saturninoabril](https://github.com/saturninoabril), [Sayanta66](https://github.com/Sayanta66), [sbishel](https://github.com/sbishel), [Schweinepriester](https://github.com/Schweinepriester), [scottaudet](https://github.com/scottaudet), [seoyeongeun](https://github.com/seoyeongeun), [shadowshot-x](https://github.com/shadowshot-x), [shrzkhn](https://github.com/shrzkhn), [sibasankarnayak](https://github.com/sibasankarnayak), [spirosoik](https://github.com/spirosoik), [sri-byte](https://github.com/sri-byte), [srkgupta](https://github.com/srkgupta), [stafot](https://github.com/stafot), [streamer45](https://github.com/streamer45), [stylianosrigas](https://github.com/stylianosrigas), [svelle](https://github.com/svelle), [Szymongib](https://github.com/Szymongib), [tilto0822](https://github.com/tilto0822), [TQuock](https://github.com/TQuock), [tsabi](https://github.com/tsabi), [tw-ayush](https://github.com/tw-ayush), [varghesejose2020](https://github.com/varghesejose2020), [venarius](https://github.com/venarius), [wiersgallak](https://github.com/wiersgallak), [wiggin77](https://github.com/wiggin77), [willpwa](https://github.com/willpwa), [Willyfrog](https://github.com/Willyfrog), [wqweto](https://translate.mattermost.com/user/wqweto/), [wuwinson](https://github.com/wuwinson), [zefhemel](https://github.com/zefhemel)

## Release v6.3 - [Extended Support Release](https://docs.mattermost.com/upgrade/release-definitions.html#extended-support-release-esr)

- **v6.3.10, released 2022-08-23**
  - Mattermost v6.3.10 contains a medium severity level security fix. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).
- **v6.3.9, released 2022-06-13**
  - Mattermost v6.3.9 contains medium severity level security fixes. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).
  - The value of ``ServiceSettings.TrustedProxyIPHeader`` defaults to empty from now on. A previous bug prevented this from happening
in certain conditions. Customers are requested to check for these values in their config and set them to nil if necessary. See more details [here](https://docs.mattermost.com/configure/configuration-settings.html#trusted-proxy-ip-header).
  - Fixed a bug that allowed to send test (empty) notifications even if the ``SendPushNotifications`` config was set to ``false``.
  - Pre-packaged Playbooks v1.23.2.
- **v6.3.8, released 2022-04-28**
  - Mattermost v6.3.8 contains a medium severity level security fix. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).
  - Ping endpoint now can receive a device ID, which will report whether the device is able to receive push notifications.
- **v6.3.7, released 2022-04-13**
  - Fixed an issue where users were able to attempt to create private playbooks with the Professional license.
- **v6.3.6, released 2022-03-24**
  - Fixed an issue with a slow delete of posts and ``context deadline exceeded`` errors after upgrading to v6.3.
  - Fixed an issue where the announcement banner caused the top team to be partially obstructed [MM-40887](https://mattermost.atlassian.net/browse/MM-40887).
- **v6.3.5, released 2022-03-10**
  - Mattermost v6.3.5 contains medium severity level security fixes. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).
  - Improved the performance of code for storing users in the webapp.
  - Fixed a memory leak caused by the post textbox.
  - Removed the collapsed sidebar menu from the DOM on sidebar collapse and expand.
  - Fixed an issue with disabling and re-enabling Custom Terms of Service.
- **v6.3.4, released 2022-02-21**
  - Fixed a major web and desktop app performance issue for users with a large accumulated number of Direct Messages and Group Messages.
  - The right-hand side dot menu of root posts are now rendered to DOM only when hovered upon.
  - The re-rendering of the ``CustomStatusEmoji`` component is now avoided on post hover.
  - The re-rendering of the ``TextBox`` links component below post box is now avoided while typing.
  - Reduced the number of post components listening for keyboard and mouse events.
- **v6.3.3, released 2022-02-03**
  - Mattermost v6.3.3 contains medium level security fixes. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).
  - The default for ``ThreadAutoFollow`` has been changed to ``false``. This does not affect existing configurations where this value is already set to ``true`` [MM-41351](https://mattermost.atlassian.net/browse/MM-41351). 
  - Prevented some instances where operations relating to Collapsed Reply Threads added load to the database server even when the ``ThreadAutoFollow`` and ``CollapsedThreads`` config settings were disabled [MM-41350](https://mattermost.atlassian.net/browse/MM-41350).
  - ``.pages`` content search is no longer available due to technical difficulties.
  - Fixed an issue where the "New Replies" banner displayed in the right-hand side for threads that were entirely visible [MM-40317](https://mattermost.atlassian.net/browse/MM-40317).
- **v6.3.2, released 2022-01-28**
  - Fixed an issue where MySQL installations re-triggered the v6.0 migration on server restart [MM-41330](https://mattermost.atlassian.net/browse/MM-41330).
  - Fixed an issue where Actiance compliance jobs caused the Mattermost server process to crash with a panic [MM-41245](https://mattermost.atlassian.net/browse/MM-41245).
- **v6.3.1, released 2022-01-21**
  - Mattermost v6.3.1 contains a medium level security fix. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).
  - Updated Mattermost Boards to v0.12.1 with various bug fixes.
  - Added the ability to normalize DN strings if they were returned with a different attribute letter casing for LDAP users versus LDAP group members [MM-40753](https://mattermost.atlassian.net/browse/MM-40753).
  - Removed file attachment options in channels when file attachments are disabled on the server [MM-38054](https://mattermost.atlassian.net/browse/MM-38054).
  - Fixed a bug causing the team sidebar to display for servers running in a subpath.
- **v6.3.0, released 2022-01-16**
  - Original 6.3.0 release

### Important Upgrade Notes
 -  [Collapsed Reply Threads](https://docs.mattermost.com/messaging/organizing-conversations.html), available in beta, are known to have a negative impact on server performance. If you cannot easily scale up and tune your database, or if you are running the Mattermost application server and database server on the same machine, we recommended disabling [``ThreadAutoFollow``](https://docs.mattermost.com/configure/configuration-settings.html#automatically-follow-threads) and [``CollapsedThreads``](https://docs.mattermost.com/configure/configuration-settings.html#collapsed-reply-threads-beta) until Collapsed Reply Threads is promoted to general availability in Q2 2022. Learn more about these [performance considerations here](https://support.mattermost.com/hc/en-us/articles/4413183568276).

IMPORTANT: If you upgrade from a release earlier than v6.2, please read the other [Important Upgrade Notes](https://docs.mattermost.com/upgrade/important-upgrade-notes.html).

### Highlights

#### Playbook Updates
 - (Enterprise Edition) Granular permission schemes enable more access control of playbooks.
 - Playbooks is now completely translatable with over a dozen languages in-progress.
 - All in-channel notifications are removed, with high-value notifications being delivered via direct message from the Playbooks Bot to reduce channel noise. 

#### Boards Updates
 - Boards is now officially in General Availability (GA).
 - Ability to follow cards and get a message notification with details of all the changes made on the card.
 - Ability to quickly identify users and assign them tasks with avatars now supported in the person properties.
 - Newest comments are now sorted at the top to easily find the most recent comment.

### Improvements

#### User Interface (UI)
 - Webapp plugins can now register components in the App Bar on the right-hand side of the screen. This feature is hidden behind a feature flag and disabled by default.
 - Updated “Terms of Service” terminology to “Terms of Use” product-wide.
 - Added threaded replies to search results when Collapsed Reply Threads is enabled.
 - Updated the “One-click reactions on messages” user setting to “Quick reactions on messages”.
 - Added tab focus support to the global header and user avatars.
 - Added a new Replies banner to the right-hand side Thread viewer.
 - Updated the About Mattermost Team Edition modal to change the community link from `mattermost.org` to `mattermost.com/community/`.
 - Invite to team modal now auto-focuses its email search input.

#### Enterprise Edition
 - Added a new dialog for Remove License confirmation.
 - The **Renew Now** button is no longer shown if the license ID does not exist in the portal. Instead, **Contact Sales** is shown.
 - System Admins are now able to upgrade the server to the Enterprise edition and request the trial license with a single click for a simplified user experience.

#### Administration
 - The config setting ``ServiceSettings.EnableReliableWebSockets`` promoted to general availability. For compatibility with older clients, the server will always return ``true`` for the ``/v4/config/client`` endpoint.
 - Added server support for receiving binary (messagepack encoded) WebSocket messages.
 - Added new flag ``showTeamSidebar`` in ``registerProducts``, which, when set to ``true``, displays the team sidebar in the product.
 - Memberlist logs and buckets are now parsed by DEBUG, INFO, WARN, or ERROR appropriately.
 - Increased key length in plugin KV store to 150.

### Bug Fixes
 - Fixed an issue where when selecting the **Upgrade to Enterprise Edition** option. The upgrade progress bar and the **Restart** button were no longer shown once the progress reached 100%.
 - Fixed an issue where the user avatar wasn’t removed from the participants list after the user’s only post in a thread was deleted.
 - Fixed an issue with the exit animation on the invitation modal.
 - Fixed an issue where the status menu unexpectedly closed when selecting the “Disable Notifications Until” header.
 - Fixed an issue where using CMD/CTRL + SHIFT + F in global threads did not add a search term automatically.
 - Fixed the alignment of the “X” button in the “message deleted” system message.
 - Fixed an issue where the long post “Show More/Less” background was broken in the Thread viewer.
 - Changed Client4 to properly set Content-Type as application/json on API calls.
 - Fixed an issue with post hover menu overlap.

### config.json

#### Changes to Team Edition and Enterprise Edition:
- The config setting ``ServiceSettings.EnableReliableWebSockets`` was removed, and the ability to buffer messages during a connection loss has been promoted to general availability. This setting is enabled for older clients to maintain backwards compatibility.

### Go Version
 - v6.3 is built with Go ``v1.16.7``.

### Known Issues
 - Announcement banner can cause the top team to be partially obstructed [MM-40887](https://mattermost.atlassian.net/browse/MM-40887).
 - File upload might fail for SVG files [MM-38982](https://mattermost.atlassian.net/browse/MM-38982).
 - ``CTRL/CMD + SHIFT + A`` shortcut does not open **Account Settings** [MM-38236](https://mattermost.atlassian.net/browse/MM-38236).
 - Known issues related to the Collapsed Reply Threads (Beta) are [listed here](https://docs.mattermost.com/messaging/organizing-conversations.html#known-issues).
 - Adding an at-mention at the start of a post draft and pressing the leftwards or rightwards arrow can clear the post draft and the undo history [MM-33823](https://mattermost.atlassian.net/browse/MM-33823).
 - Google login fails on the Classic mobile apps.
 - Status may sometimes get stuck as **Away** or **Offline** in High Availability mode with IP Hash turned off.
 - Searching stop words in quotation marks with Elasticsearch enabled returns more than just the searched terms.
 - The team sidebar on the desktop app does not update when channels have been read on mobile.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.
 - Boards are not refreshing on creation. See the [GitHub discussion](https://github.com/mattermost/focalboard/discussions/1971) for more information.
 - Boards export and reimport duplicates boards because all IDs are replaced by new ones on the server. See the [GitHub issue](https://github.com/mattermost/focalboard/issues/1924) for more information.

### Contributors
- [AccountingMattermost](https://github.com/AccountingMattermost), [Adovenmuehle](https://github.com/Adovenmuehle), [agarciamontoro](https://github.com/agarciamontoro), [AGMETEOR](https://github.com/AGMETEOR), [agnivade](https://github.com/agnivade), [amyblais](https://github.com/amyblais), [amynicol1985](https://github.com/amynicol1985), [asaadmahmood](https://github.com/asaadmahmood), [AshishDhama](https://github.com/AshishDhama), [BenLloydPearson](https://github.com/BenLloydPearson), [calebroseland](https://github.com/calebroseland), [chenilim](https://github.com/chenilim), [ChristophKaser](https://github.com/ChristophKaser), [coltoneshaw](https://github.com/coltoneshaw), [cpanato](https://github.com/cpanato), [cpoile](https://github.com/cpoile), [craph](https://github.com/craph), [crspeller](https://github.com/crspeller), [ctlaltdieliet](https://translate.mattermost.com/user/ctlaltdieliet/), [cwarnermm](https://github.com/cwarnermm), [danielsischy](https://github.com/danielsischy), [darmen](https://translate.mattermost.com/user/darmen/), [darmenerk](https://github.com/darmenerk), [deanwhillier](https://github.com/deanwhillier), [devinbinnie](https://github.com/devinbinnie), [dunak-debug](https://github.com/dunak-debug), [enahum](https://github.com/enahum), [esethna](https://github.com/esethna), [ewwollesen](https://github.com/ewwollesen), [gbochora](https://github.com/gbochora), [Grucqq](https://github.com/Grucqq), [hahmadia](https://github.com/hahmadia), [hanzei](https://github.com/hanzei), [harshilsharma63](https://github.com/harshilsharma63), [hmhealey](https://github.com/hmhealey), [iomodo](https://github.com/iomodo), [isacikgoz](https://github.com/isacikgoz), [it33](https://github.com/it33), [jamiehurewitz](https://github.com/jamiehurewitz), [jasonblais](https://github.com/jasonblais), [jayaddison-collabora](https://github.com/jayaddison-collabora), [JenyaFTW](https://github.com/JenyaFTW), [jespino](https://github.com/jespino), [johnsonbrothers](https://github.com/johnsonbrothers), [JoomlaEstonia](https://github.com/JoomlaEstonia), [josephbaylon](https://github.com/josephbaylon), [jprusch](https://github.com/jprusch), [JtheBAB](https://github.com/JtheBAB), [JulienTant](https://github.com/JulienTant), [jupenur](https://github.com/jupenur), [justinegeffen](https://github.com/justinegeffen), [kaakaa](https://github.com/kaakaa), [kamre](https://github.com/kamre), [kayazeren](https://github.com/kayazeren), [koox00](https://github.com/koox00), [krotovkk](https://github.com/krotovkk), [larkox](https://github.com/larkox), [levb](https://github.com/levb), [lieut-data](https://github.com/lieut-data), [M-ZubairAhmed](https://github.com/M-ZubairAhmed), [majo](https://translate.mattermost.com/user/majo/), [maksimatveev](https://github.com/maksimatveev), [master7](https://translate.mattermost.com/user/master7/), [mateioprea](https://github.com/mateioprea), [matt-w99](https://github.com/matt-w99), [matthew-w](https://translate.mattermost.com/user/matthew-w/), [metanerd](https://github.com/metanerd), [mgdelacroix](https://github.com/mgdelacroix), [michelengelen](https://github.com/michelengelen), [mickmister](https://github.com/mickmister), [milotype](https://github.com/milotype), [mjnagel](https://github.com/mjnagel), [mrckndt](https://github.com/mrckndt), [Mshahidtaj](https://github.com/Mshahidtaj), [nab-77](https://github.com/nab-77), [nathanaelhoun](https://github.com/nathanaelhoun), [neallred](https://github.com/neallred), [nickmisasi](https://github.com/nickmisasi), [nikolaizah](https://github.com/nikolaizah), [nishantwrp](https://github.com/nishantwrp), [ogi-m](https://github.com/ogi-m), [olaysco](https://github.com/olaysco), [pablovelezvidal](https://github.com/pablovelezvidal), [Phrynobatrachus](https://github.com/Phrynobatrachus), [poflankov](https://github.com/poflankov), [Profesor08](https://github.com/Profesor08), [puerco](https://github.com/puerco), [rubenmeza](https://github.com/rubenmeza), [sanjaydemansol](https://github.com/sanjaydemansol), [saturninoabril](https://github.com/saturninoabril), [sbishel](https://github.com/sbishel), [SebastianSpeitel](https://github.com/SebastianSpeitel), [seoyeongeun](https://translate.mattermost.com/user/seoyeongeun/), [serhack](https://github.com/serhack), [shadowshot-x](https://github.com/shadowshot-x), [shazm](https://github.com/shazm), [sibasankarnayak](https://github.com/sibasankarnayak), [srkgupta](https://github.com/srkgupta), [stafot](https://github.com/stafot), [streamer45](https://github.com/streamer45), [stylianosrigas](https://github.com/stylianosrigas), [Szymongib](https://github.com/Szymongib), [tilto0822](https://github.com/tilto0822), [tsabi](https://github.com/tsabi), [varghese.jose](https://translate.mattermost.com/user/varghese.jose/), [vinod-demansol](https://github.com/vinod-demansol), [wiersgallak](https://github.com/wiersgallak), [wiggin77](https://github.com/wiggin77), [YairFernando67](https://github.com/YairFernando67), [YC](https://github.com/YC)

## Release v6.2 - [Feature Release](https://docs.mattermost.com/upgrade/release-definitions.html)

- **v6.2.5, released 2022-03-10**
  - Mattermost v6.2.5 contains medium severity level security fixes. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).
- **v6.2.4, released 2022-02-21**
  - Fixed a major web and desktop app performance issue for users with a large accumulated number of Direct Messages and Group Messages.
- **v6.2.3, released 2022-02-03**
  - Mattermost v6.2.3 contains medium level security fixes. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).
  - The default for ``ThreadAutoFollow`` has been changed to ``false``. This does not affect existing configurations where this value is already set to ``true`` [MM-41351](https://mattermost.atlassian.net/browse/MM-41351). 
  - Prevented some instances where operations relating to Collapsed Reply Threads added load to the database server even when the ``ThreadAutoFollow`` and ``CollapsedThreads`` config settings were disabled [MM-41350](https://mattermost.atlassian.net/browse/MM-41350).
  - ``.pages`` content search is no longer available due to technical difficulties.
  - Fixed an issue where MySQL installations re-triggered the v6.0 migration on server restart [MM-41330](https://mattermost.atlassian.net/browse/MM-41330).
- **v6.2.2, released 2022-01-21**
  - Mattermost v6.2.2 contains a medium level security fix. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).
  - Fixed an issue with the v6 migration where the ``Users.Timezone`` column had a default. This affected servers that had Mattermost v4.9 or earlier installed before upgrading to v6.0 or later [MM-39297](https://mattermost.atlassian.net/browse/MM-39297).
  - Fixed an issue where attempting to parse an empty flag resulted in a spurious log line which clogged up the console.
- **v6.2.1, released 2021-12-17**
  - Mattermost v6.2.1 contains a medium level security fix. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).
  - Fixed an issue where a SIGSEGV error occurred after upgrading to v6.2.0 when plugins were disabled in configuration.
- **v6.2.0, released 2021-12-16**
  - Mattermost v6.2.0 contains low to medium level security fixes. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).

### Important Upgrade Notes
 -  Channel results in the channel autocomplete will include private channels. Customers using [Bleve](https://docs.mattermost.com/deploy/bleve-search.html) or [Elasticsearch](https://docs.mattermost.com/scale/elasticsearch.html) for autocomplete will have to reindex their data to get the new results. Since this can take a long time, we suggest disabling autocomplete and running indexing in the background. When this is complete, re-enable autocomplete. Note that only channel members will see private channel names in autocomplete results.
 -  [Collapsed Reply Threads](https://docs.mattermost.com/messaging/organizing-conversations.html), available in beta, are known to have a negative impact on server performance. If you cannot easily scale up and tune your database, or if you are running the Mattermost application server and database server on the same machine, we recommended disabling [``ThreadAutoFollow``](https://docs.mattermost.com/configure/configuration-settings.html#automatically-follow-threads) and [``CollapsedThreads``](https://docs.mattermost.com/configure/configuration-settings.html#collapsed-reply-threads-beta) until Collapsed Reply Threads is promoted to general availability in Q2 2022. Learn more about these [performance considerations here](https://support.mattermost.com/hc/en-us/articles/4413183568276).

**IMPORTANT:** If you upgrade from a release earlier than v6.1, please read the other [Important Upgrade Notes](https://docs.mattermost.com/upgrade/important-upgrade-notes.html).

### Highlights

#### Playbook Updates
 - Added the ability to follow playbook runs to stay informed about the procedures you care about.
 - Added other improvements including the ability to search playbooks, share URLs of individual runs and playbooks, and filter runs by playbook.

#### Boards Updates
 - Added a calendar view to stay on track with deadlines.
 - Added the ability to @mention someone on a card with ease.

### Improvements

#### User Interface (UI)
 - Clarified Latex Rendering config setting descriptions and fixed a broken product documentation link.
 - Updated the "One-click reactions on messages" user setting to "Quick reactions on messages".
 - Updated **Account Settings** terminology to **Profile**.
 - Updated instances of **switch** to **navigate**.
 - Updated in-product text terminology to shift from **comments** to **conversations** and **replies**.
 - Added a **Click to open thread** setting for all users, to allow users to click anywhere on a message to open the reply thread.
 - Do Not Disturb option for **Tomorrow** now displays the expiry time.
 - Recent emojis now get updated based on the default selected skin tone.
 - Updated **SingleImageView** to hide the image name for attached images until the image is collapsed.
 - Moved the expand arrow to the left of an image name. 
 - The image expansion icon now appears on image hover.
 - Added online status to profile images on user autocomplete.
 - App Commands now have an option to be opened as modals.
 - Added support for navigating through Collapsed Reply Threads via arrow keys.
 - Added support for focusing the input box in Collapsed Reply Threads while typing.
 - Added support for blurring the input box in Collapsed Reply Threads by pressing ESCAPE.
 - Adjusted the channel override desktop notification preference for Threads.
 - User interface is now improved when no text is set for a custom status.

#### Performance
 - Added a general performance fix for loading the web application and typing.
 - Improved performance while typing by moving some autocomplete layout calculations.
 - Improved performance by reducing DOM usage during render.

#### Enterprise Edition
 - Implemented a new design for the current **Edition and License** System Console page in Self-Hosted installs.

### Bug Fixes
 - Fixed an issue where OpenID redirects didn't work when hosting Mattermost on a subdirectory.
 - Fixed an issue where the webapp crashed sometimes when clicking on an image file from "Recent files".
 - Fixed an issue where the default log rotation file size was mistakenly set to 10GB, and is now reverted back to 100MB.
 - Fixed an issue where emoji reaction buttons on posts did not respect user permissions.
 - Fixed an issue where unchecking the automatic timezone changed the timezone in the selector.
 - Fixed an issue where emoji names were being truncated too soon in the emoji picker.
 - Fixed an issue where the thread footer did not allow the user to follow a Thread.
 - Fixed an issue where the app crashed when switching to Threads view after leaving a channel.
 - Fixed an issue where Mattermost crashed when deleting a root post from Global Threads.
 - Fixed an issue where push notifications did not clear from the lock screen or the notification center with Collapsed Reply Threads enabled.
 - Fixed an issue where Direct Message notifications were missing the sender name with Collapsed Reply Threads enabled.
 - Fixed an issue where keyboard shortcuts were not working with Global Threads.
 - Fixed an issue where API allowed changing the name of the Town Square channel.
 - Fixed an issue where errors were logged if a user disabled notifications.
 - Fixed an issue where a channel was not immediately removed from the sidebar when the current user was removed from it.
 - Fixed a potential server crash when creating or updating posts with permalink previews.
 - Fixed an issue where permalinks created from saved posts did not correctly redirect to the correct team.
 - Fixed an issue where long file extension names pushed out of the bounds of the module.
 - Fixed slow channel loading for instances with website link previews enabled.
 - Removed real-time updates of a couple of features to prevent overloading servers on user updates. The "This channel has guests" indicator and the number of timezones displayed when notifying members of a group will only be updated on channel change now.
   
### config.json
Multiple setting options were added to ``config.json``. Below is a list of the additions and their default values on install. The settings can be modified in ``config.json``, or the System Console when available.

#### Changes to Team Edition and Enterprise Edition:
 - Under ``ServiceSettings`` in ``config.json``:
   - Added a new config setting ``DeveloperFlags``.
 - Removed ``DesktopLatestVersion`` and ``DesktopMinVersion`` config settings.

### API Changes
 - Added a new ``IsEnterpriseReady()`` plugin API.
 - Added a new ``GET /api/v4/roles`` API endpoint.
 - Added new ``UpdateCustomStatus`` and ``RemoveUserCustomStatus`` plugin APIs for user custom status.
 - Added CRUD methods for user sessions to the plugin API.
 
### Go Version
 - v6.2 is built with Go ``v1.16.7``.

### Known Issues
 - [Collapsed Reply Threads](https://docs.mattermost.com/messaging/organizing-conversations.html) is currently in beta. Before enabling the feature, please ensure you are well versed in the [known issues](https://docs.mattermost.com/messaging/organizing-conversations.html#known-issues), particularly relating to database resource requirements and server performance implications. If you cannot easily scale up your database size, or are running the Mattermost application server and database server on the same machine, we recommended waiting to enable Collapsed Reply Threads until it's [promoted to general availability in Q2 2022](https://mattermost.com/blog/collapsed-reply-threads-ga). Learn more about these [performance considerations here](https://support.mattermost.com/hc/en-us/articles/4413183568276).
 - Member type is missing from autocomplete [MM-38989](https://mattermost.atlassian.net/browse/MM-38989).
 - File upload might fail for SVG files [MM-38982](https://mattermost.atlassian.net/browse/MM-38982).
 - ``CTRL/CMD + SHIFT + A`` shortcut does not open **Settings** [MM-38236](https://mattermost.atlassian.net/browse/MM-38236).
 - Adding an at-mention at the start of a post draft and pressing the leftwards or rightwards arrow can clear the post draft and the undo history [MM-33823](https://mattermost.atlassian.net/browse/MM-33823).
 - Google login fails on the Classic mobile apps.
 - Status may sometimes get stuck as **Away** or **Offline** in High Availability mode with IP Hash turned off.
 - Searching stop words in quotation marks with Elasticsearch enabled returns more than just the searched terms.
 - The team sidebar on the desktop app does not update when channels have been read on mobile.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.
 - Boards are not refreshing on creation. See the [GitHub discussion](https://github.com/mattermost/focalboard/discussions/1971) for more information.
 - When selecting the **Upgrade to Enterprise Edition** button, the upgrade progress bar and the restart button are no longer shown once progress reaches 100%. Users can't restart the server directly from the Mattermost user interface, and must restart the server manually.

### Contributors
 - [aaronrothschild](https://github.com/aaronrothschild), [aeomin](https://github.com/aeomin), [agarciamontoro](https://github.com/agarciamontoro), [AGMETEOR](https://github.com/AGMETEOR), [agnivade](https://github.com/agnivade), [ahills60](https://github.com/ahills60), [alauregaillard](https://github.com/alauregaillard), [amyblais](https://github.com/amyblais), [anchepiece](https://github.com/anchepiece), [angeloskyratzakos](https://github.com/angeloskyratzakos), [anurag6713](https://github.com/anurag6713), [arjitc](https://github.com/arjitc), [asaadmahmood](https://github.com/asaadmahmood), [ashishbhate](https://github.com/ashishbhate), [AshishDhama](https://github.com/AshishDhama), [AWerbrouck](https://github.com/AWerbrouck), [BenCookie95](https://github.com/BenCookie95), [berkeka](https://github.com/berkeka), [bretanac93](https://github.com/bretanac93), [calebroseland](https://github.com/calebroseland), [chenilim](https://github.com/chenilim), [cleferman](https://github.com/cleferman), [clovis1122](https://github.com/clovis1122), [cpanato](https://github.com/cpanato), [cpoile](https://github.com/cpoile), [crspeller](https://github.com/crspeller), [ctlaltdieliet](https://translate.mattermost.com/user/ctlaltdieliet), [cwarnermm](https://github.com/cwarnermm), [daovansonbg](https://github.com/daovansonbg), [De1ain](https://github.com/De1ain), [devinbinnie](https://github.com/devinbinnie), [dipak-demansol](https://github.com/dipak-demansol), [dontoisme](https://github.com/dontoisme), [ekl1773](https://github.com/ekl1773), [emdecr](https://github.com/emdecr), [enahum](https://github.com/enahum), [enelson720](https://github.com/enelson720), [engineereng](https://github.com/engineereng), [Ericliu1912](https://github.com/Ericliu1912), [erik](https://translate.mattermost.com/user/erik), [erni27](https://github.com/erni27), [esethna](https://github.com/esethna), [furqanmlk](https://github.com/furqanmlk), [gabrieljackson](https://github.com/gabrieljackson), [Genei180](https://github.com/Genei180), [gigawhitlocks](https://github.com/gigawhitlocks), [Grucqq](https://github.com/Grucqq), [gtanczyk](https://github.com/gtanczyk), [haardikdharma10](https://github.com/haardikdharma10), [hahmadia](https://github.com/hahmadia), [hanzei](https://github.com/hanzei), [harshilsharma63](https://github.com/harshilsharma63), [hmhealey](https://github.com/hmhealey), [iomodo](https://github.com/iomodo), [iOSGeekster](https://github.com/iOSGeekster), [ironbyte](https://github.com/ironbyte), [isacikgoz](https://github.com/isacikgoz), [it33](https://github.com/it33), [ivernus](https://github.com/ivernus), [jamiehurewitz](https://github.com/jamiehurewitz), [jasonblais](https://github.com/jasonblais), [jayaddison-collabora](https://github.com/jayaddison-collabora), [JenyaFTW](https://github.com/JenyaFTW), [jespino](https://github.com/jespino), [jfrerich](https://github.com/jfrerich), [Johennes](https://github.com/Johennes), [johnsonbrothers](https://github.com/johnsonbrothers), [josephbaylon](https://github.com/josephbaylon), [joseph.jose](https://translate.mattermost.com/user/joseph.jose), [jprusch](https://github.com/jprusch), [jrester](https://github.com/jrester), [JtheBAB](https://github.com/JtheBAB), [jufab](https://github.com/jufab), [JulienTant](https://github.com/JulienTant), [jupenur](https://github.com/jupenur), [justinegeffen](https://github.com/justinegeffen), [kaakaa](https://github.com/kaakaa), [kaitrin](https://github.com/kaitrin), [kamre](https://github.com/kamre), [kayazeren](https://github.com/kayazeren), [kayge](https://github.com/kayge), [kirtilodha](https://github.com/kirtilodha), [KKVANONYMOUS](https://github.com/KKVANONYMOUS), [koox00](https://github.com/koox00), [korvmoij](https://github.com/korvmoij), [kott](https://github.com/kott), [KuSh](https://github.com/KuSh), [larkox](https://github.com/larkox), [levb](https://github.com/levb), [lieut-data](https://github.com/lieut-data), [LSantos06](https://github.com/LSantos06), [lynn915](https://github.com/lynn915), [M-ZubairAhmed](https://github.com/M-ZubairAhmed), [marcvelasco](https://github.com/marcvelasco), [marianunez](https://github.com/marianunez), [majo](https://translate.mattermost.com/user/majo), [maruTA-bis5](https://github.com/maruTA-bis5), [master7](https://translate.mattermost.com/user/master7), [mathiasvr](https://github.com/mathiasvr), [matthew-w](https://translate.mattermost.com/user/matthew-w), [matt-w99](https://github.com/matt-w99), [metanerd](https://github.com/metanerd), [mgdelacroix](https://github.com/mgdelacroix), [michaelgamble](https://github.com/michaelgamble), [michelengelen](https://github.com/michelengelen), [mickmister](https://github.com/mickmister), [milotype](https://github.com/milotype), [mkraft](https://github.com/mkraft), [mr-aboutin](https://github.com/mr-aboutin), [mRuggi](https://github.com/mRuggi), [Mshahidtaj](https://github.com/Mshahidtaj), [namreg](https://github.com/namreg), [nat-gunner](https://github.com/nat-gunner), [nathanaelhoun](https://github.com/nathanaelhoun), [neallred](https://github.com/neallred), [nevyangelova](https://github.com/nevyangelova), [nickmisasi](https://github.com/nickmisasi), [nikolaiz](https://translate.mattermost.com/user/nikolaiz/), [nikolaizah](https://github.com/nikolaizah), [nishantwrp](https://github.com/nishantwrp), [ogi-m](https://github.com/ogi-m), [pablovelezvidal](https://github.com/pablovelezvidal), [pascalhein](https://github.com/pascalhein), [penthaapatel](https://github.com/penthaapatel), [Phrynobatrachus](https://github.com/Phrynobatrachus), [poflankov](https://github.com/poflankov), [prakharporwal](https://github.com/prakharporwal), [Prassud](https://github.com/Prassud), [puerco](https://github.com/puerco), [Quentin](https://translate.mattermost.com/user/Quentin), [rakshit087](https://github.com/rakshit087), [ramiyengar](https://github.com/ramiyengar), [Roy-Orbison](https://github.com/Roy-Orbison), [sadohert](https://github.com/sadohert), [saeid.hmdr](https://translate.mattermost.com/user/saeid.hmdr/), [saeidkh6991](https://github.com/saeidkh6991), [sangramrath](https://github.com/sangramrath), [sarvani1997](https://github.com/sarvani1997), [saturninoabril](https://github.com/saturninoabril), [Sayanta66](https://github.com/Sayanta66), [sbishel](https://github.com/sbishel), [seoyeongeun](https://github.com/seoyeongeun), [serhack](https://github.com/serhack), [shadowshot-x](https://github.com/shadowshot-x), [SharathHuddar](https://github.com/SharathHuddar), [shzmr](https://github.com/shzmr), [sibasankarnayak](https://github.com/sibasankarnayak), [SiderealArt](https://github.com/SiderealArt), [sondv](https://translate.mattermost.com/user/sondv), [spirosoik](https://github.com/spirosoik), [srijit2002](https://github.com/srijit2002), [stafot](https://github.com/stafot), [streamer45](https://github.com/streamer45), [stylianosrigas](https://github.com/stylianosrigas), [Szymongib](https://github.com/Szymongib), [teamzamong](https://github.com/teamzamong), [tsabi](https://github.com/tsabi), [valentinrozman](https://github.com/valentinrozman), [varghese.jose](https://translate.mattermost.com/user/varghese.jose), [vicky-demansol](https://github.com/vicky-demansol), [weblate](https://github.com/weblate), [wiersgallak](https://github.com/wiersgallak), [wiggin77](https://github.com/wiggin77), [Willyfrog](https://github.com/Willyfrog), [YairFernando67](https://github.com/YairFernando67), [YoheiZuho](https://github.com/YoheiZuho), [zchezgi](https://github.com/zchezgi), [Zeezee1210](https://github.com/Zeezee1210), [Ziggiz](https://github.com/Ziggiz)

## Release v6.1 - [Feature Release](https://docs.mattermost.com/upgrade/release-definitions.html)

- **v6.1.3, released 2022-02-03**
  - Mattermost v6.1.3 contains medium level security fixes. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).
  - The default for ``ThreadAutoFollow`` has been changed to ``false``. This does not affect existing configurations where this value is already set to ``true`` [MM-41351](https://mattermost.atlassian.net/browse/MM-41351). 
  - Prevented some instances where operations relating to Collapsed Reply Threads added load to the database server even when the ``ThreadAutoFollow`` and ``CollapsedThreads`` config settings were disabled [MM-41350](https://mattermost.atlassian.net/browse/MM-41350).
  - ``.pages`` content search is no longer available due to technical difficulties.
  - Fixed an issue where MySQL installations re-triggered the v6.0 migration on server restart [MM-41330](https://mattermost.atlassian.net/browse/MM-41330).
- **v6.1.2, released 2022-01-21**
  - Mattermost v6.1.2 contains a medium level security fix. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).
  - Fixed an issue with the v6 migration where the ``Users.Timezone`` column had a default. This affected servers that had Mattermost v4.9 or earlier installed before upgrading to v6.0 or later [MM-39297](https://mattermost.atlassian.net/browse/MM-39297).
- **v6.1.1, released 2021-12-17**
  - Mattermost v6.1.1 contains medium level security fixes. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).
  - Added a general performance fix for loading the web application and typing.
  - Improved performance while typing by moving some autocomplete layout calculations.
  - Improved performance by reducing DOM usage during render.
  - Removed real-time updates of a couple of features to prevent overloading servers on user updates. The "This channel contains guests" indicator and the number of timezones displayed when notifying members of a group will only be updated on channel change now.
  - Fixed slow channel loading for instances with website link previews enabled.
  - Fixed an issue with Focalboard where an empty white screen appeared in Mattermost desktop app on reload.
  - Fixed an issue where v6.1 reported an incorrect mmctl version.
- **v6.1, released 2021-11-16**
  - Mattermost v6.1.0 contains low level security fixes. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).

### Important Upgrade Notes
 - Please refer to [the schema migration analysis](https://gist.github.com/streamer45/997b726a86b5d2a624ac2af435a66086) when upgrading to v6.1.
 - The Bleve index has been updated to use the scorch index type. This new default index type features some efficiency improvements which means that the indexes use significantly less disk space. To use this new type of index, after upgrading the server version, run a purge operation and then a reindex from the Bleve section of the System Console. Bleve is still compatible with the old indexes, so the currently indexed data will work fine if the purge and reindex is not run.
 - A composite index has been added to the jobs table for better query performance. For some customers with a large jobs table, this can take a long time, so we recommend adding the index during off-hours, and then running the migration. A table with more than 1 million rows can be considered as large enough to be updated prior to the upgrade.
   - For PostgreSQL: ``create index concurrently idx_jobs_status_type on jobs (status,type);``
   - For MySQL: ``create index idx_jobs_status_type on Jobs (Status,Type);``
 - [Collapsed Reply Threads](https://docs.mattermost.com/messaging/organizing-conversations.html), available in beta, are known to have a negative impact on server performance. If you cannot easily scale up and tune your database, or if you are running the Mattermost application server and database server on the same machine, we recommended disabling [``ThreadAutoFollow``](https://docs.mattermost.com/configure/configuration-settings.html#automatically-follow-threads) and [``CollapsedThreads``](https://docs.mattermost.com/configure/configuration-settings.html#collapsed-reply-threads-beta) until Collapsed Reply Threads is promoted to general availability in Q2 2022. Learn more about these [performance considerations here](https://support.mattermost.com/hc/en-us/articles/4413183568276).

**IMPORTANT:** If you upgrade from a release earlier than v6.0, please read the other [Important Upgrade Notes](https://docs.mattermost.com/upgrade/important-upgrade-notes.html).

### Highlights

#### Timed Do Not Disturb
 - Added the ability to disable all notifications for a specified period of time to avoid distractions, without losing important messages when you're back.

#### Cross-team Recent Mentions
 - Recent mentions and saved posts now show across all teams.

#### Playbooks Updates
 - Added a wiki-style page with a playbook preview as well as new playbook notifications.

#### Boards Updates
 - Added a new create board user interface, Board calculations to quickly get basic metrics on projects, at-mention notifications, as well as card previews.

### Improvements

#### User Interface (UI)
 - Polish is promoted to an officially supported language.
 - Added one-click reactions for posts. A user's three most recently used emojis display when the user hovers over a message.
 - Added support for selecting names and aliases in the emoji picker.
 - Changed the user interface of the edit-indicator of posts and moved it inline.
 - Added a query param to translate in-product help pages when opened from the Desktop App.
 - Updated in-product text for the invitation modal for clarity.
 - Updated the file attachment limits and sizes within in-product help documentation.
 - Added rendering for posts containing markdown in email notifications.
 - Added support for inline Latex rendering.
 - Added the **Move to...** option menu item to the channel header dropdown.
 - Added keyboard shortcuts to tooltips. The shortcut key component is now used for displaying keys.
 - Added support for Global threads infinite scroll.
 - Added ``@here`` mention to the ``EnableConfirmNotificationsToChannel`` config setting to show a warning modal when over 5 members might be alerted with ``@here``.

#### Integrations
 - Added support for multi-select on Apps slash commands.
 - App commands now make a distinction between the central channel and the right-hand side channel.
 - App bindings now recognize the post menu options for each channel they live in.
 - Added new ``registerMessageWillBeUpdatedHook(newPost, oldPost)`` client-side plugin hook to intercept edited messages.

#### Performance
 - Improved performance around rendering of system messages.
 - Reduced storage-related slow-downs on page load.

#### Administration
 - Bulk imports with attached files now log and continue when a file fails to upload instead of halting.
 - ``get flagged posts`` endpoint will now return only flagged posts for channels the user is a member of.
 - Updated Bleve to v2 to use the scorch index type.
 - Minimum supported browser versions changes:
   - Chrome updated from ``61+`` to ``89+``.
   - Firefox updated from ``60+`` to ``78+``.
   - MacOS updated from ``10.9+`` to ``10.14+``.

#### Enterprise Edition
 - Once the user has selected **Start Trial**, they will see a modal that lists all of the features now available to them through the Enterprise plan.
 - Once a non-licensed server has reached 10 users, a one-time modal is displayed to System Admins encouraging them to start a 30-day trial.
 - Prometheus metrics are now enabled when running a standalone jobserver.

### Bug Fixes
 - Fixed a broken link to the **Custom Emoji** page on servers with a subpath configured.
 - Fixed an issue where a "No results found" error string was displayed in the **Direct Messages** modal.
 - Fixed an issue where the caret was placed in the middle of the emojis when picking two emojis from the emoji picker.
 - Fixed an issue where **System Console > Channels > Channel Management** displayed an option to toggle group management in Team Edition, Starter, and Professional.
 - Fixed an issue where the channel switcher was missing the "(You)" indicator on the user's own Direct Message channel.
 - Fixed an issue where the clock format set by the user was not respected on the edit indicator popover.
 - Replaced Metropolis font files with a new set to correct a kerning issue.
 - Fixed an issue where deep links opened on mobile displayed an incorrect message directing users to open the Desktop app.
 - Addressed various user interface style bugs from v6.0 release.
 - Fixed emails templates for clients that do not support the ``style`` tag.
 - Fixed an issue where the scrollbar was hardly visible with Denim & Sapphire themes.
 - Fixed an issue where creating a bot with an invalid username returned an "invalid email" error.
 - Fixed an issue where using ``/code`` did not render initial whitespace characters.
 - Fixed an issue where **Try Enterprise for Free** option was missing spacing in mobile webview.
 - Fixed an issue where the SQLStore cache was relied on when populating the WebConn channel memberships.
 - Fixed an issue where logging was not re-configured when the server config was changed via the System Console.
 - Fixed a display issue with the Indigo theme when returning from Playbooks to Channels.
 - Fixed an issue where the offline indicator color did not use the correct theme color.
 - Fixed various bugs for the Collapsed Reply Threads (Beta) feature, including:
    - Fixed an issue where the recent sidebar sorting option didn't only consider parent posts.
    - Fixed an issue where a badge was displayed on a thread list when the thread was started by another user in a Direct Message.
    - Fixed an issue where the user avatar was displayed in the participants list after their post was deleted when the user had no other posts in the thread.
    - Fixed an issue where the ephemeral message was not displyaed as the centre post.
    - Fixed an issue with dragging and dropping files on a thread while on the Threads panel.
    - Fixed an issue where permalinks were not highlighting a post on a thread that was already open on the right-hand side.
    - Fixed an issue with missing threads in the Threads list.
   
### config.json
Multiple setting options were added to ``config.json``. Below is a list of the additions and their default values on install. The settings can be modified in ``config.json``, or the System Console when available.

#### Changes to Team Edition and Enterprise Edition:
 - Under ``ServiceSettings`` in ``config.json``:
   - Added ``EnableInlineLatex`` to add support for inline Latex rendering.
 - Under ``JobSettings`` in ``config.json``
   - Added ``CleanupJobsThresholdDays``. This defines the time gap in days beyond which older jobs will be removed. Default is -1 which means the feature is disabled. Setting to 0 will clean all completed jobs.
   
#### Database Changes
 - Extended the maximum size to 256 characters for the following database columns:
    - ``Sessions.Roles``
    - ``ChannelMembers.Roles``
    - ``TeamMembers.Roles``

### API Changes
 - Added a new API endpoint ``POST /api/v4/posts/search`` to perform searches across all channels.
 
### Go Version
 - v6.1 is built with Go ``v1.16.7``.

### Open Source Components
 - Added ``fast-deep-equal``, ``luxon``, and ``react-window-infinite-loader`` to https://github.com/mattermost/mattermost-webapp.
 - Added ``@mattermost/react-native-paste-input`` to https://github.com/mattermost/mattermost-mobile.

### Known Issues
 - [Collapsed Reply Threads](https://docs.mattermost.com/messaging/organizing-conversations.html) is currently in beta. Before enabling the feature, please ensure you are well versed in the [known issues](https://docs.mattermost.com/messaging/organizing-conversations.html#known-issues),  particularly relating to database resource requirements and server performance implications. If you cannot easily scale up your database size, or are running the Mattermost application server and database server on the same machine, we recommended waiting to enable Collapsed Reply Threads until it's [promoted to general availability in Q2 2022](https://mattermost.com/blog/collapsed-reply-threads-ga/). Learn more about these [performance considerations here](https://support.mattermost.com/hc/en-us/articles/4413183568276).
 - Created permalinks from saved posts do not correctly redirect to the correct team [MM-39816](https://mattermost.atlassian.net/browse/MM-39816).
 - Recent Mentions search sometimes includes incorrect results [MM-39867](https://mattermost.atlassian.net/browse/MM-39867).
 - Experimental timezones and custom statuses can cause an increase in CPU usage and database connections for servers with an E20 license. A current workaround is to disable custom statuses or to disable experimental timezones.
 - Webapp sometimes crashes when clicking an image from "Recent files" [MM-38239](https://mattermost.atlassian.net/browse/MM-38239).
 - Member type is missing from autocomplete [MM-38989](https://mattermost.atlassian.net/browse/MM-38989).
 - File upload might fail for SVG files [MM-38982](https://mattermost.atlassian.net/browse/MM-38982).
 - ``Ctrl/Cmd+Shift+A`` shortcut does not open **Account Settings** [MM-38236](https://mattermost.atlassian.net/browse/MM-38236).
 - Adding an at-mention at the start of a post draft and pressing the leftwards or rightwards arrow can clear the post draft and the undo history [MM-33823](https://mattermost.atlassian.net/browse/MM-33823).
 - Google login fails on the Classic mobile apps.
 - Status may sometimes get stuck as **Away** or **Offline** in High Availability mode with IP Hash turned off.
 - Searching stop words in quotation marks with Elasticsearch enabled returns more than just the searched terms.
 - The team sidebar on the desktop app does not update when channels have been read on mobile.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.

### Contributors
 - [A9u](https://github.com/A9u), [aaronrothschild](https://github.com/aaronrothschild), [abhijit-singh](https://github.com/abhijit-singh), [achie27](https://github.com/achie27), [achromik](https://translate.mattermost.com/user/achromik/), [adithyaakrishna](https://github.com/adithyaakrishna), [Adovenmuehle](https://github.com/Adovenmuehle), [aeomin](https://github.com/aeomin), [agarciamontoro](https://github.com/agarciamontoro), [AGMETEOR](https://github.com/AGMETEOR), [agnivade](https://github.com/agnivade), [alauregaillard](https://github.com/alauregaillard), [alejandrovelez7](https://github.com/alejandrovelez7), [alieh-rymasheuski](https://github.com/alieh-rymasheuski), [aloks98](https://github.com/aloks98), [amyblais](https://github.com/amyblais), [anchepiece](https://github.com/anchepiece), [andrewbrown00](https://github.com/andrewbrown00), [angeloskyratzakos](https://github.com/angeloskyratzakos), [anoopmsivadas](https://github.com/anoopmsivadas), [anurag6713](https://github.com/anurag6713), [asaadmahmood](https://github.com/asaadmahmood), [ashishbhate](https://github.com/ashishbhate), [AshishDhama](https://github.com/AshishDhama), [astraldawn](https://github.com/astraldawn), [audreyaudz](https://github.com/audreyaudz), [Audrey Kon](https://github.com/audreyaudz), [Avinaba-Mazumdar](https://github.com/Avinaba-Mazumdar), [avinashlng1080](https://github.com/avinashlng1080), [AWerbrouck](https://github.com/AWerbrouck), [b4sen](https://github.com/b4sen), [banaboi](https://github.com/banaboi), [bartfelder](https://github.com/bartfelder), [bbodenmiller](https://github.com/bbodenmiller), [BenCookie95](https://github.com/BenCookie95), [BenLloydPearson](https://github.com/BenLloydPearson), [bensiauu](https://github.com/bensiauu), [berkeka](https://github.com/berkeka), [bhaveshgoyal182](https://github.com/bhaveshgoyal182), [Bhavin789](https://github.com/Bhavin789), [Bruno-366](https://github.com/Bruno-366), [calebroseland](https://github.com/calebroseland), [caugner](https://github.com/caugner), [chenilim](https://github.com/chenilim), [chetanyakan](https://github.com/chetanyakan), [chrysillala](https://github.com/chrysillala), [cinlloc](https://github.com/cinlloc), [cleferman](https://github.com/cleferman), [cognvn](https://github.com/cognvn), [coltoneshaw](https://github.com/coltoneshaw), [cpanato](https://github.com/cpanato), [cpoile](https://github.com/cpoile), [craph](https://github.com/craph), [crspeller](https://github.com/crspeller), [ctlaltdieliet](https://github.com/ctlaltdieliet), [cwarnermm](https://github.com/cwarnermm), [darkLord19](https://github.com/darkLord19), [DarshanKansara2015](https://github.com/DarshanKansara2015), [deanwhillier](https://github.com/deanwhillier), [DeeJayBro](https://github.com/DeeJayBro), [devinbinnie](https://github.com/devinbinnie), [dialvarezs](https://github.com/dialvarezs), [dimitraz](https://github.com/dimitraz), [dizlv](https://github.com/dizlv), [donno2048](https://github.com/donno2048), [drobiu](https://github.com/drobiu), [Duaard](https://github.com/Duaard), [echobash](https://github.com/echobash), [elyscape](https://github.com/elyscape), [emdecr](https://github.com/emdecr), [emilyacook](https://github.com/emilyacook), [enahum](https://github.com/enahum), [enelson720](https://github.com/enelson720), [EranKricheli](https://github.com/EranKricheli), [erezo9](https://github.com/erezo9), Erik Pfeiffer, [esethna](https://github.com/esethna), [fareskalaboud](https://github.com/fareskalaboud), [fcoiuri](https://github.com/fcoiuri), [firasm](https://github.com/firasm), [furqanmlk](https://github.com/furqanmlk), [gabrieljackson](https://github.com/gabrieljackson), [gagandeepp](https://github.com/gagandeepp), [garanews](https://github.com/garanews), [gaurav-baghel](https://github.com/gaurav-baghel), [Gauravsaha-97](https://github.com/Gauravsaha-97), [GianOrtiz](https://github.com/GianOrtiz), [gigawhitlocks](https://github.com/gigawhitlocks), [gpt14](https://github.com/gpt14), [grsky360](https://github.com/grsky360), [gupsho](https://github.com/gupsho), [haardikdharma10](https://github.com/haardikdharma10), [hahmadia](https://github.com/hahmadia), [hanzei](https://github.com/hanzei), [Hard-Coder05](https://github.com/Hard-Coder05), [harshilsharma63](https://github.com/harshilsharma63), [hmhealey](https://github.com/hmhealey), [Hridoy-31](https://github.com/Hridoy-31), [iamquang95](https://github.com/iamquang95), [icelander](https://github.com/icelander), [igordsm](https://github.com/igordsm), [im-endangered](https://github.com/im-endangered), [iomodo](https://github.com/iomodo), [iOSGeekster](https://github.com/iOSGeekster), [isacikgoz](https://github.com/isacikgoz), [jamiehurewitz](https://github.com/jamiehurewitz), [Jasmin F](https://github.com/jasmezz), [jasonblais](https://github.com/jasonblais), [jayaddison-collabora](https://github.com/jayaddison-collabora), [JenyaFTW](https://github.com/JenyaFTW), [jespino](https://github.com/jespino), [jfrerich](https://github.com/jfrerich), [jlram](https://github.com/jlram), [Johennes](https://github.com/Johennes), [johnsonbrothers](https://github.com/johnsonbrothers), [joremysh](https://github.com/joremysh), [josephbaylon](https://github.com/josephbaylon), [joshalling](https://github.com/joshalling), [jprusch](https://github.com/jprusch), [JtheBAB](https://github.com/JtheBAB), [jufab](https://github.com/jufab), [jupenur](https://github.com/jupenur), [justinegeffen](https://github.com/justinegeffen), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [kaitrin](https://github.com/kaitrin), [kamre](https://github.com/kamre), [kanitmann](https://github.com/kanitmann), [KavyaJaiswal](https://github.com/KavyaJaiswal), [kayazeren](https://github.com/kayazeren), [koox00](https://github.com/koox00), [korvmoij](https://translate.mattermost.com/user/korvmoij/), [krmh04](https://github.com/krmh04), [KuSh](https://github.com/KuSh), [larkox](https://github.com/larkox), [leosunmo](https://github.com/leosunmo), [levb](https://github.com/levb), [lex111](https://github.com/lex111), [lieut-data](https://github.com/lieut-data), [lindy65](https://github.com/lindy65), [lonnelars](https://github.com/lonnelars), [LSantos06](https://github.com/LSantos06), [lynn915](https://github.com/lynn915), [M-ZubairAhmed](https://github.com/M-ZubairAhmed), [maisnamrajusingh](https://github.com/maisnamrajusingh), [majo](https://translate.mattermost.com/user/majo/), [maknop](https://github.com/maknop), [marcvelasco](https://github.com/marcvelasco), [marianunez](https://github.com/marianunez), [Mark E Fuller](https://github.com/mefuller), [Markus Hermann](https://github.com/MarHerUMR), [maruTA-bis5](https://github.com/maruTA-bis5), [master7](https://translate.mattermost.com/user/master7/), [mathiasvr](https://github.com/mathiasvr), [matt-w99](https://github.com/matt-w99), [matthewbirtch](https://github.com/matthewbirtch), [Matthew Williams](https://github.com/matthew-w), [metanerd](https://github.com/metanerd), [mgdelacroix](https://github.com/mgdelacroix), [michelengelen](https://github.com/michelengelen), [michizhou](https://github.com/michizhou), [mickmister](https://github.com/mickmister), [mishmanners](https://github.com/mishmanners), [mjnagel](https://github.com/mjnagel), [mkraft](https://github.com/mkraft), [mohitsaxenaknoldus](https://github.com/mohitsaxenaknoldus), [Mshahidtaj](https://github.com/Mshahidtaj), [NakulChauhan2001](https://github.com/NakulChauhan2001), [naltang](https://github.com/naltang), [namreg](https://github.com/namreg), [naresh1205](https://github.com/naresh1205), [nathanaelhoun](https://github.com/nathanaelhoun), [neallred](https://github.com/neallred), [NeroBurner](https://github.com/NeroBurner), [nevyangelova](https://github.com/nevyangelova), [ngmmartins](https://github.com/ngmmartins), [nishantwrp](https://github.com/nishantwrp), [noviicee](https://github.com/noviicee), [ogi-m](https://github.com/ogi-m), [pablovelezvidal](https://github.com/pablovelezvidal), [pascalhein](https://github.com/pascalhein), [pawankm21](https://github.com/pawankm21), [penthaapatel](https://github.com/penthaapatel), [Phrynobatrachus](https://github.com/Phrynobatrachus), [pikami](https://github.com/pikami), [pjenicot](https://github.com/pjenicot), [poflankov](https://github.com/poflankov), [prabhigupta](https://github.com/prabhigupta), [prakharporwal](https://github.com/prakharporwal), [prapti](https://github.com/prapti), [Privatecoder](https://github.com/Privatecoder), [prograde](https://translate.mattermost.com/user/prograde/), [puerco](https://github.com/puerco), [radiantly](https://github.com/radiantly), [rafaeelaudibert](https://github.com/rafaeelaudibert), [Ray0Emma](https://github.com/Ray0Emma), [rbradleyhaas](https://github.com/rbradleyhaas), [rootbid](https://github.com/rootbid), [Roy-Orbison](https://github.com/Roy-Orbison), [rutulganatra](https://github.com/rutulganatra), [s4kh](https://github.com/s4kh), [sadohert](https://github.com/sadohert), [sahil9001](https://github.com/sahil9001), [sakaitsu](https://github.com/sakaitsu), [sangramrath](https://github.com/sangramrath), [sanjaydemansol](https://github.com/sanjaydemansol), [sapora1](https://github.com/sapora1), [saturninoabril](https://github.com/saturninoabril), [Sayanta66](https://github.com/Sayanta66), [sbishel](https://github.com/sbishel), [seoyeongeun](https://github.com/seoyeongeun), [shadowshot-x](https://github.com/shadowshot-x), [shazm](https://github.com/shazm), [shinnlok](https://github.com/shinnlok), [shzmr](https://github.com/shzmr), [sibasankarnayak](https://github.com/sibasankarnayak), [spinales](https://github.com/spinales), [spirosoik](https://github.com/spirosoik), [srijit2002](https://github.com/srijit2002), [ssensalo](https://github.com/ssensalo), [stafot](https://github.com/stafot), [streamer45](https://github.com/streamer45), [stylianosrigas](https://github.com/stylianosrigas), [svelle](https://github.com/svelle), [syauqy](https://github.com/syauqy), [Szymongib](https://github.com/Szymongib), [TautZuk](https://github.com/TautZuk), [teamzamong](https://translate.mattermost.com/user/teamzamong/), [TheLaw1337](https://github.com/TheLaw1337), [tiago154](https://github.com/tiago154), [triogempar](https://github.com/triogempar), [tsabi](https://github.com/tsabi), [ucyang](https://github.com/ucyang), [vblz](https://github.com/vblz), [vinod-demansol](https://github.com/vinod-demansol), [void-hr](https://github.com/void-hr), [weblate](https://github.com/weblate), [wiersgallak](https://github.com/wiersgallak), [wiggin77](https://github.com/wiggin77), [Willyfrog](https://github.com/Willyfrog), [xMicky24GIT](https://github.com/xMicky24GIT), [yeongeun.seo](https://github.com/seoyeongeun),  [ZeeshanAmjad0495](https://github.com/ZeeshanAmjad0495), [Zeezee1210](https://github.com/Zeezee1210), [zefhemel](https://github.com/zefhemel), [zolikonta](https://github.com/zolikonta), [zulmarij](https://github.com/zulmarij)
 
## Release v6.0 - [Feature Release](https://docs.mattermost.com/upgrade/release-definitions.html)

- **v6.0.4, released 2021-12-17**
  - Mattermost v6.0.4 contains medium level security fixes. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).
  - Added a general performance fix for loading the web application and typing.
  - Improved performance while typing by moving some autocomplete layout calculations.
  - Improved performance by reducing DOM usage during render.
  - Removed real-time updates of a couple of features to prevent overloading servers on user updates. The "This channel contains guests" indicator and the number of timezones displayed when notifying members of a group will only be updated on channel change now.
  - Fixed slow channel loading for instances with website link previews enabled.
  - Fixed an issue where v6.0 reported an incorrect mmctl version.
- **v6.0.3, released 2021-11-15**
  - Mattermost v6.0.3 contains a medium level security fix. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).
  - Fixed a possible panic during data retention jobs when ``DataRetentionSettings.EnableMessageDeletion`` was set to ``true`` [MM-39378](https://mattermost.atlassian.net/browse/MM-39378).
  - Fixed a potential panic during the message export job [MM-39521](https://mattermost.atlassian.net/browse/MM-39521).
  - Fixed some sentry crashes [MM-38565](https://mattermost.atlassian.net/browse/MM-38565), [MM-39208](https://mattermost.atlassian.net/browse/MM-39208), [MM-39420](https://mattermost.atlassian.net/browse/MM-39420).
- **v6.0.2, released 2021-10-27**
  - Mattermost v6.0.2 contains medium level security fixes. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).
  - Fixed a race condition in telemetry IDs on High Availability servers [MM-39343](https://mattermost.atlassian.net/browse/MM-39343).
  - Update prepackaged Boards version to 0.9.4.
- **v6.0.1, released 2021-10-18**
  - Mattermost v6.0.1 contains a medium level security fix. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).
  - Fixed a panic in translations that caused the server to not run properly. The panic caused the server to be terminated [MM-39299](https://mattermost.atlassian.net/browse/MM-39299).
  - Fixed an issue with the v6.0 migration where the ``Users.Timezone`` column had a default. This affected servers that had Mattermost v4.9 or earlier installed before upgrading [MM-39297](https://mattermost.atlassian.net/browse/MM-39297).
  - Fixed an issue where a migration check failed for MariaDB databases. The data type JSON was aliased to ``LONGTEXT`` and the check was failing and causing the database migrations to run every restart.
  - Added a fix to display ``tableName`` and ``columnName`` for JSONB schema failures. When there was a schema upgrade failure related to jsonb columns, the log line didn't mention which table/column was affected.
  - Fixed an issue where selecting the "..." post menu on a System message crashed the webapp [MM-39116](https://mattermost.atlassian.net/browse/MM-39116).
- **v6.0.0, released 2021-10-13**
  - Original 6.0.0 release

### Deprecations

1. [Legacy Command Line Tools](https://docs.mattermost.com/manage/command-line-tools.html). Most commands have been replaced by [mmctl](https://docs.mattermost.com/manage/mmctl-command-line-tool.html) and new commands have been added over the last few months, making this tool a robust replacement.

2. [Slack Import via the web app](https://docs.mattermost.com/onboard/migrating-to-mattermost.html#migrating-from-slack-using-the-mattermost-web-app). The Slack import tool accessible via the Team Setting menu has been replaced by the [mmetl](https://docs.mattermost.com/onboard/migrating-to-mattermost.html#migrating-from-slack-using-the-mattermost-mmetl-tool-and-bulk-import) tool that is much more comprehensive for the types of data it can assist in uploading. 

3. MySQL versions below 5.7.12. Minimum support is now for 5.7.12+. This version introduced a native JSON data type that lets us improve performance and scalability of several database fields (most notably Users and Posts props). Additionally, version 5.6 (our current minimum version) reached [EOL in February 2021](https://www.mysql.com/support/eol-notice.html).

4. Elasticsearch 5 and 6 - [versions 5.x reached EOL in March of 2019, and versions 6.x reached EOL in November 2020](https://www.elastic.co/support/eol). Our minimal supported version with Mattermost v6.0 is Elasticsearch version 7.0.

5. Windows 7 reached [EOL in January 2020](https://support.microsoft.com/en-us/windows/windows-7-support-ended-on-january-14-2020-b75d4580-2cc7-895a-2c9c-1466d9a53962). We no longer provide support for Mattermost Desktop App issues on Windows 7.

6. [DisableLegacyMFAEndpoint](https://docs.mattermost.com/configure/configuration-settings.html#disable-legacy-mfa-api-endpoint) configuration setting.

7. [ExperimentalTimezone](https://docs.mattermost.com/configure/configuration-settings.html#timezone) configuration setting. The config setting is removed and the feature is promoted to general availability.

8. All legacy channel sidebar experimental configuration settings. We encourage customers using these settings to upgrade to v5.32 or later to access [custom, collapsible channel categories](https://mattermost.com/blog/custom-collapsible-channel-categories/) among many other channel organization features. The deprecated settings include:

   - [EnableLegacySidebar](https://docs.mattermost.com/configure/configuration-settings.html#enable-legacy-sidebar)
   - [ExperimentalTownSquareIsReadOnly](https://docs.mattermost.com/configure/configuration-settings.html#town-square-is-read-only-experimental) (Please see [channel moderation settings](https://docs.mattermost.com/onboard/advanced-permissions.html#read-only-channels), which allow you to set any channel as read-only, including Town Square) 
   - [ExperimentalHideTownSquareinLHS](https://docs.mattermost.com/configure/configuration-settings.html#town-square-is-hidden-in-left-hand-sidebar-experimental)
   - [EnableXToLeaveChannelsFromLHS](https://docs.mattermost.com/configure/configuration-settings.html#enable-x-to-leave-channels-from-left-hand-sidebar-experimental)
   - [CloseUnusedDirectMessages](https://docs.mattermost.com/configure/configuration-settings.html#autoclose-direct-messages-in-sidebar-experimental)
   - [ExperimentalChannelOrganization](https://docs.mattermost.com/configure/configuration-settings.html#sidebar-organization)
   - [ExperimentalChannelSidebarOrganization](https://docs.mattermost.com/configure/configuration-settings.html#experimental-sidebar-features)

9. [All configuration settings previously marked as “Deprecated”](https://docs.mattermost.com/configure/configuration-settings.html#deprecated-configuration-settings).

10. Changes to ``mattermost-server/model`` for naming consistency.

### Important Upgrade Notes

 - Longer migration times can be expected. See [this document](https://gist.github.com/streamer45/59b3582118913d4fc5e8ff81ea78b055) for the estimated upgrade times with datasets of 10+ million posts. See [this document](https://gist.github.com/streamer45/868c451164f6e8069d8b398685a31b6e) for the estimated upgrade times with datasets of 70+ million posts. The field type of Data in model.ClusterMessage was changed to []byte from string. Therefore, a major thing to note is that a v6 server is incompatible to run along with a v5 server in a cluster. Customers upgrading from 5.x to 6.x cannot do a High Availability upgrade. While upgrading, it is required that no other v5 server runs when a v6 server is brought up. A v6 server will run significant database schema changes that can cause a large startup time depending on the dataset size. Zero downtime will not be possible, but depending on the efforts made during the migration process, it can be minimized to a large extent. It is recommended to start Mattermost directly and not through systemctl to avoid the server process getting killed during the migration. This can happen since the value of ``TimeoutStartSec`` in the provided systemctl service file is set to 1 hour. Customers using the Mattermost Kubernetes operator should be aware of the above migration information and choose the path that is most appropriate for them. If (1) is acceptable, then the normal upgrade process using the operator will suffice. For minimum downtime, follow (2) before using the operator to update Mattermost following the normal upgrade process.
   1. Low effort, long downtime - This is the usual process of starting a v6 server normally. This has 2 implications: during the migration process, various tables will be locked which will render those tables read-only during that period. Secondly, once the server finishes migration and starts the application, no other v5 server can run in the cluster.
   2. Medium effort, medium downtime - This process will require SQL queries to be executed manually on the server. To avoid causing a table lock, a customer can choose to use the pt-online-schema-change tool for MySQL. For Postgres, the table locking is very minimal. The advantage is that since there are a lot of queries, the customer can take their own time to run individual queries during off-hours. All queries except #11 are safe to be executed this way. Then the usual method of (1) can be followed.
   3. High effort, low downtime - This process requires everything of (2), plus it tries to minimize the impact of query #11. We can do this by following step 2, and then starting v6 along with a running v5 server, and then monitor the application logs. As soon as the v6 application starts up, we need to bring down a v5 node. This minimizes the downtime to only a few seconds.
 - While trying to upgrade to a Mattermost version >= 6.0.x, you might encounter the following error: ``Failed to alter column type. It is likely you have invalid JSON values in the column. Please fix the values manually and run the migration again.`` This means that the particular column has some invalid JSON values which need to be fixed manually. A common fix that is known to work is to wipe out all \u0000 characters. Please follow these steps:
   1. Check the affected values by: ``SELECT COUNT(*) FROM <table> WHERE <column> LIKE '%\u0000%';``
   2. If you get a count more than 0, check those values manually, and confirm they are okay to be removed.
   3. Remove them by ``UPDATE <table> SET <column> = regexp_replace(<column>, '\\u0000', '', 'g') where <column> like '%\u0000%';``
   4. Then try to start Mattermost again.
 - Focalboard plugin has been renamed to Mattermost Boards, and v0.9.1 (released with Mattermost v6.0) is now enabled by default.
 - The advanced logging configuration schema changed. This is a breaking change relative to 5.x. See updated [documentation](https://docs.mattermost.com/comply/audit-log.html).
 - Some breaking changes to plugins are included:
   - Support for left-hand side-specific bot icons was dropped.
   - Removed a deprecated "Backend" field from the plugin manifest.
   - Converted the "Executables" field in the plugin manifest to a map.
 -  [Collapsed Reply Threads](https://docs.mattermost.com/messaging/organizing-conversations.html), available in beta, are known to have a negative impact on server performance. If you cannot easily scale up and tune your database, or if you are running the Mattermost application server and database server on the same machine, we recommended disabling [``ThreadAutoFollow``](https://docs.mattermost.com/configure/configuration-settings.html#automatically-follow-threads) and [``CollapsedThreads``](https://docs.mattermost.com/configure/configuration-settings.html#collapsed-reply-threads-beta) until Collapsed Reply Threads is promoted to general availability in Q2 2022. Learn more about these [performance considerations here](https://support.mattermost.com/hc/en-us/articles/4413183568276).

**IMPORTANT:** If you upgrade from a release earlier than v5.39, please read the other [Important Upgrade Notes](https://docs.mattermost.com/upgrade/important-upgrade-notes.html).

### Highlights

#### Multi-Product Platform
 - Mattermost now ships as one platform with three products - Channels, Playbooks, and Boards.
 - Playbooks and Boards are visible when [plugins are enabled system-wide](https://docs.mattermost.com/configure/configuration-settings.html#enable-plugins). 

#### Global Product Launcher
 - Added a global header for product navigation for Channels, Playbooks, and Boards. This is disabled on the mobile web view and mobile apps.

#### Branding Changes
 - Added a new default brand theme named "Denim".
 - The existing theme names and colors, including "Mattermost", "Organization", "Mattermost Dark", and "Windows Dark" have been updated to the new "Denim", "Sapphire", "Quartz", "Indigo", and "Onyx" theme names and colors, respectively. Anyone using the existing themes will see slightly modified theme colors after their server or workspace is upgraded. The theme variables for the existing "Mattermost", "Organization", "Mattermost Dark", and "Windows Dark" themes will still be accessible in [our documentation](https://docs.mattermost.com/messaging/customizing-theme-colors.html#custom-theme-examples), so a custom theme can be created with these theme variables if desired. Custom themes are unaffected by this change.
 - Added a new light theme named "Quartz" to the default available list of themes.
 - Updated email templates to the new branding.

#### Packaging Changes
 - Updated in-product strings referencing E10 & E20 to [new packaging](https://mattermost.com/pricing).
 - Features moved from legacy E10 to all plans, including Team Edition:
   - System default permissions, e.g. permission to create and archive channels system-wide.
      - Specifically, “System Scheme” only in **System Console > User Management > Permissions**. 
      - Existing permissions/policies in TE/E0 for "Enable Team Creation" and "Allow Team Administrators to edit others’ posts" are properly handled. 
   - Team and Channel management pages (but without channel moderation, e.g. read-only channels).
 - Features moved from legacy E20 to Professional plan:
   - SSO with OpenID Connect, SAML, Google and O365
   - O365 integrations including MS Teams Calling and MS Calendar
   - Jira multi-server support
   - Advanced team permissions
   - Channel moderation
 - E20, Professional, and Enterprise license SKUs are now supported for installing Enterprise plugins.

#### Beta features Promoted to General Availability
   - Archived channels
   - Compliance exports
   - Custom terms of service
   - Guest accounts
   - System roles
   - Plugins

#### Permalink Previews
 - Added support for permalink previews for posts in Mattermost. Previews are generated to minimize context switching when sharing message links in Channels.

#### Tutorial Updates
 - Added a tip to the **Getting Started** page for downloading Desktop Apps.
 - Updated tutorial icons and changed text content in tutorial tips.
 - Updated the default treatment for the ``Add channel`` button to the current color and by team name.
 - Added a tutorial tip for new settings and status buttons.
 - Added a tip for the product switcher. This tip is skipped if not applicable.

### Improvements

#### User Interface (UI)
 - Added “Invite People” to the main "+" button below the hamburger menu.
 - The whole category bounds are now highlighted while holding a channel above a category name on the left-hand side.
 - Updated **Account Settings > Display > Timezone** to be more user friendly.
 - New theme agnostic file preview modal takes up the full screen. The file preview now has information about the user, channel, and the file, and moves away from text-based buttons to icon-based buttons.
 - Increased the limit of uploaded file attachments per post from 5 to 10.
 - Added desktop notifications for followed Threads.
 - Hungarian and English-Australian are now official languages.
 - Added a **Start Trial** call-to action to the **Main Menu**.
 - Changed H1-H3 heading font from Open Sans to Metropolis.

#### Performance
 - Improved typing performance when the emoji autocomplete is open.
 - Added performance improvements for draft storage with multiple tabs open.
 - Improved performance of draft loading.

#### Integrations
 - Pre-packaged Channel Export plugin v1.0.0.
 - Added a "rest field" to the App command parser.
 - Added support for React components in channel header tooltips registered by plugins.
 - Exported ``ChannelInviteModal`` and ``ChannelMembersModal`` components for plugins.

#### Administration
 - Added ``playbooks`` and ``boards`` to restricted team URLs list. Conflict exists if users hit the URL to the team directly without the trailing channel, permalink or threads information (ie server/team) and they have a team name “playbooks” or “boards”. User would expect to be taken to their messaging team.  
 - Added the ability for Team Edition to edit role permissions.
 - Removed a hard-coded override of ``TeamSettings.MaxNotificationsPerChannel`` on unlicensed servers (e.g. Team Edition).
 - Migrated the extraction command to mmctl.
 - Removed the convert channel endpoint to use ``/channels/{channel_id}/privacy`` instead.
 - Removed deprecated ``Posts.ParentId`` in favor of the semantically equivalent ``Posts.RootId``. Also removed ``CommandWebhook.ParentId`` and ``CompliancePost.ParentId`` for the same reason.
 - Removed the following deprecated CLI commands in favor of [mmctl](https://docs.mattermost.com/manage/mmctl-command-line-tool.html):
   - channel
   - command
   - config
   - extract
   - group
   - integrity
   - ldap
   - license
   - logs
   - permissions
   - plugin
   - reset
   - roles
   - sampledata
   - team
   - user
   - webhook

### Bug Fixes
 - Fixed an issue where GitLab ``ButtonText`` and ``ButtonColor`` settings were not reflected on the login screen.
 - Fixed an issue with Collapsed Reply Threads (Beta) where replying to a Thread caused users to re-follow the previously unfollowed Thread.
 - Fixed an issue where floating timestamps appeared incorrectly on the right-hand side with Collapsed Reply Threads (Beta) enabled.
 - Fixed an issue where pinned and saved posts were no longer highlighted.
 - Disabled admin support email status check job on server startup.
 - Fixed an issue on joining a missing channel as a System Admin.
 - Fixed import process for imports with attachments.
 - Fixed an error with app locations and binding filtering.

### config.json
Multiple setting options were added to ``config.json``. Below is a list of the additions and their default values on install. The settings can be modified in ``config.json``, or the System Console when available.

#### Changes to Team Edition and Enterprise Edition:
 - Under ``ServiceSettings`` in ``config.json``:
    - Added ``EnableOnboardingFlow``, for enhanced user onboarding experience feature.
    - Added ``EnablePermalinkPreviews`` to enable permalink previews.
 - Under ``FileSettings`` in ``config.json``:
    - Added ``MaxImageResolution`` config setting to control the maximum dimension (in pixels) of image uploads.
 - Removed all of the following configs:
   - ``EnableOnlyAdminIntegrations``
   - ``RestrictCustomEmojiCreation``
   - ``RestrictPostDelete``
   - ``AllowEditPost``
   - ``ImageProxyType``
   - ``ImageProxyURL``
   - ``ImageProxyOptions``
   - ``UseExperimentalGossip``
   - ``EnableTeamCreation``
   - ``RestrictTeamInvite``
   - ``RestrictPublicChannelManagement``
   - ``RestrictPrivateChannelManagement``
   - ``RestrictPublicChannelCreation``
   - ``RestrictPrivateChannelCreation``
   - ``RestrictPublicChannelDeletion``
   - ``RestrictPrivateChannelDeletion``
   - ``RestrictPrivateChannelManageMembers``
   - ``DisableLegacyMFAEndpoint``
   - ``ExperimentalTownSquareIsReadOnly``
   - ``ExperimentalHideTownSquareinLHS``
   - ``EnableXToLeaveChannelsFromLHS``
   - ``CloseUnusedDirectMessages``
   - ``ExperimentalChannelOrganization``
   - ``ExperimentalChannelSidebarOrganization``
   - ``EnableLegacySidebar``
   - The legacy MFA endpoint
   - ``utils/authorization.go`` and moved any permissions to the ``MakeDefaultRoles()`` function.

### Database Changes
 - Added the following database indexes:
   - ``idx_posts_root_id_delete_at_create_at``
   - ``idx_channels_team_id_display_name``
   - ``idx_channels_team_id_type``
   - ``idx_threads_channel_id_last_reply_at``
   - ``idx_channelmembers_user_id_channel_id_last_viewed_at``
   - ``idx_channelmembers_channel_id_scheme_guest_user_id``
 - Removed the following redundant database indexes:
   - ``idx_posts_root_id``
   - ``idx_channels_team_id``
   - ``idx_threads_channel_id``
   - ``idx_channelmembers_user_id``
 - Updated all references of ``ToJson/FromJson`` methods to be in the form ``ToJSON/FromJSON``.
 - Increased ``Post.Props`` size limit to 800,000 characters.

### API Changes
 - Updated API to use ``per_page`` query parameter instead of ``pageSize``. This makes the threads API consistent with other endpoints, and automatically limits the number of requested threads with our param handling code. The ``pageSize`` query parameter will still be supported until version 6.0 of the server becomes the minimum version required by the mobile client.

### Websocket Event Changes
 - Added Websocket client to products.
 - Added plugin Websocket hooks: ``OnWebSocketConnect``, ``OnWebSocketDisconnect`` and ``WebSocketMessageHasBeenPosted``.

### Library Changes
 - Removed deprecated ``model.ComparePassword`` method.
 - Removed deprecated ``Context.SourcePluginId`` field.
 - Removed ``(*model.Client4).CheckUserMfa``.
 - Removed ``(*model.Client4).GetServerBusyExpires``.
 - Removed MB constant from model package.
 - Removed use of pointers to the following types: 
   - ``model.ChannelList``
   - ``model.ChannelListWithTeamData``
   - ``model.ChannelMembers``
   - ``model.Preferences``
   - ``model.ProductNotices``
 - Renamed ``plugin.Context.IpAddress`` to ``plugin.Context.IPAddress``.
 - Renamed fields in the model package to have more idiomatic names.

### Go Version
 - v6.0 is built with Go ``v1.16.7``.

### Open Source Components
 - Added ``@mattermost/compass-components``, ``@mattermost/compass-icons``, ``styled-components`` and ``timezones.json``, and removed ``react-inlinesvg`` from https://github.com/mattermost/mattermost-webapp.
 - Added ``@types/redux-mock-store`` to https://github.com/mattermost/mattermost-mobile.

### Known Issues
 - [Collapsed Reply Threads](https://docs.mattermost.com/messaging/organizing-conversations.html) is currently in beta. Before enabling the feature, please ensure you are well versed in the [known issues](https://docs.mattermost.com/messaging/organizing-conversations.html#known-issues),  particularly relating to database resource requirements and server performance implications. If you cannot easily scale up your database size, or are running the Mattermost application server and database server on the same machine, we recommended waiting to enable Collapsed Reply Threads until it is [promoted to general availability in Q2 2022](https://mattermost.com/blog/collapsed-reply-threads-ga/). Learn more about these [performance considerations here](https://support.mattermost.com/hc/en-us/articles/4413183568276).
 - Webapp sometimes crashes when clicking an image from "Recent files" [MM-38239](https://mattermost.atlassian.net/browse/MM-38239).
 - Member type is missing from autocomplete [MM-38989](https://mattermost.atlassian.net/browse/MM-38989).
 - File upload might fail for SVG files [MM-38982](https://mattermost.atlassian.net/browse/MM-38982).
 - Deep link opened on mobile shows incorrect text directing the opening to the Desktop app [MM-38913](https://mattermost.atlassian.net/browse/MM-38913).
 - Channel switcher is missing "(You)" indicator on your own Direct Message channel [MM-38798](https://mattermost.atlassian.net/browse/MM-38798).
 - ``Ctrl/Cmd+Shift+A`` shortcut does not open **Account Settings** [MM-38236](https://mattermost.atlassian.net/browse/MM-38236).
 - Indigo theme glitch may occur when returning from Playbooks [MM-38910](https://mattermost.atlassian.net/browse/MM-38910).
 - **System Console > Channels > Channel Management** has an option to toggle group management in Team Edition, Starter, and Professional [MM-39216](https://mattermost.atlassian.net/browse/MM-39216).
 - Experimental timezones and custom statuses can cause an increase in CPU usage and database connections for servers with an E20 license. A current workaround is to disable custom statuses or to disable experimental timezones.
 - Adding an at-mention at the start of a post draft and pressing the leftwards or rightwards arrow can clear the post draft and the undo history [MM-33823](https://mattermost.atlassian.net/browse/MM-33823).
 - Google login fails on the Classic mobile apps.
 - Status may sometimes get stuck as **Away** or **Offline** in High Availability mode with IP Hash turned off.
 - Searching stop words in quotation marks with Elasticsearch enabled returns more than just the searched terms.
 - The team sidebar on the desktop app does not update when channels have been read on mobile.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.

### Contributors
 - [Adovenmuehle](https://github.com/Adovenmuehle), [aeomin](https://github.com/aeomin), [agarciamontoro](https://github.com/agarciamontoro), [AGMETEOR](https://github.com/AGMETEOR), [agnivade](https://github.com/agnivade), [alieh-rymasheuski](https://github.com/alieh-rymasheuski), [amyblais](https://github.com/amyblais), [amynicol1985](https://github.com/amynicol1985), [angeloskyratzakos](https://github.com/angeloskyratzakos), [arpit1912](https://github.com/arpit1912), [asaadmahmood](https://github.com/asaadmahmood), [ashishbhate](https://github.com/ashishbhate), [AshishDhama](https://github.com/AshishDhama), [ashutoshpw](https://github.com/ashutoshpw), [BenCookie95](https://github.com/BenCookie95), [BenLloydPearson](https://github.com/BenLloydPearson), [BoFFire](https://github.com/BoFFire), [calebroseland](https://github.com/calebroseland), [chenilim](https://github.com/chenilim), [chikei](https://github.com/chikei), [cjmartian](https://github.com/cjmartian), [coltoneshaw](https://github.com/coltoneshaw), [cpanato](https://github.com/cpanato), [cpoile](https://github.com/cpoile), [crspeller](https://github.com/crspeller), [ctlaltdieliet](https://github.com/ctlaltdieliet), [CuriousCorrelation](https://github.com/CuriousCorrelation), [cwarnermm](https://github.com/cwarnermm), [danielsischy](https://github.com/danielsischy), [darkLord19](https://github.com/darkLord19), [deanwhillier](https://github.com/deanwhillier), [devinbinnie](https://github.com/devinbinnie), [dihmuzikien](https://github.com/dihmuzikien), [Duaard](https://github.com/Duaard), [emilyacook](https://github.com/emilyacook), [enahum](https://github.com/enahum), [enelson720](https://github.com/enelson720), [esethna](https://github.com/esethna), [flynbit](https://github.com/flynbit), [furqanmlk](https://github.com/furqanmlk), [gabrieljackson](https://github.com/gabrieljackson), [gigawhitlocks](https://github.com/gigawhitlocks), [gruceqq](https://translate.mattermost.com/user/gruceqq/), [haardikdharma10](https://github.com/haardikdharma10), [hahmadia](https://github.com/hahmadia), [hanzei](https://github.com/hanzei), [harshilsharma63](https://github.com/harshilsharma63), [hectorskypl](https://github.com/hectorskypl), [himanshu007-creator](https://github.com/himanshu007-creator), [hmhealey](https://github.com/hmhealey), [ialorro](https://github.com/ialorro), [icelander](https://github.com/icelander), [iomodo](https://github.com/iomodo), [isacikgoz](https://github.com/isacikgoz), [it33](https://github.com/it33), [itao](https://github.com/itao), [ivernus](https://github.com/ivernus), [jasonblais](https://github.com/jasonblais), [jayaddison-collabora](https://github.com/jayaddison-collabora), [jespino](https://github.com/jespino), [jfrerich](https://github.com/jfrerich), [johnsonbrothers](https://github.com/johnsonbrothers), [josephbaylon](https://github.com/josephbaylon), [JtheBAB](https://github.com/JtheBAB), [jtwillis92](https://github.com/jtwillis92), [justinegeffen](https://github.com/justinegeffen), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [kamre](https://github.com/kamre), [kayazeren](https://github.com/kayazeren), [KobeBergmans](https://github.com/KobeBergmans), [koox00](https://github.com/koox00), [krmh04](https://github.com/krmh04), [krutarththakkar](https://github.com/krutarththakkar), [larkox](https://github.com/larkox), [levb](https://github.com/levb), [lieut-data](https://github.com/lieut-data), [M-ZubairAhmed](https://github.com/M-ZubairAhmed), [maisnamrajusingh](https://github.com/maisnamrajusingh), [majidsajadi](https://github.com/majidsajadi), [marianunez](https://github.com/marianunez), [matthewbirtch](https://github.com/matthewbirtch), [matthew.williams](https://translate.mattermost.com/user/matthew-w/), [metanerd](https://github.com/metanerd), [mgdelacroix](https://github.com/mgdelacroix), [michaelgamble](https://github.com/michaelgamble), [michelengelen](https://github.com/michelengelen), [mickmister](https://github.com/mickmister), [migbot](https://github.com/migbot), [mikhailrimashevski](https://github.com/mikhailrimashevski), [mkraft](https://github.com/mkraft), [mlongo4290](https://github.com/mlongo4290), [Mshahidtaj](https://github.com/Mshahidtaj), [neallred](https://github.com/neallred), [neflyte](https://github.com/neflyte), [nevyangelova](https://github.com/nevyangelova), [nickmisasi](https://github.com/nickmisasi), [nikolaizah](https://github.com/nikolaizah), [pablovelezvidal](https://github.com/pablovelezvidal), [petrmifek](https://github.com/petrmifek), [poflankov](https://github.com/poflankov), [puerco](https://github.com/puerco), [rbradleyhaas](https://github.com/rbradleyhaas), [Rina-dsg](https://github.com/Rina-dsg), [rodcorsi](https://github.com/rodcorsi), [Rutam21](https://github.com/Rutam21), [sadohert](https://github.com/sadohert), [sakaitsu](https://translate.mattermost.com/user/sakaitsu/), [saturninoabril](https://github.com/saturninoabril), [Sayanta66](https://github.com/Sayanta66), [sbishel](https://github.com/sbishel), [shazm](https://github.com/shazm), [sibasankarnayak](https://github.com/sibasankarnayak), [spirosoik](https://github.com/spirosoik), [sshiv5768](https://github.com/sshiv5768), [stafot](https://github.com/stafot), [streamer45](https://github.com/streamer45), [stylianosrigas](https://github.com/stylianosrigas), [svelle](https://github.com/svelle), [Szymongib](https://github.com/Szymongib), [thePanz](https://github.com/thePanz), [tsabi](https://translate.mattermost.com/user/tsabi/), [vadimasadchi](https://github.com/vadimasadchi), [vinod-demansol](https://github.com/vinod-demansol), [Westacular](https://github.com/Westacular), [wget](https://github.com/wget), [wiersgallak](https://github.com/wiersgallak), [wiggin77](https://github.com/wiggin77), [Willyfrog](https://github.com/Willyfrog), [yedamao](https://github.com/yedamao), [Zeezee1210](https://github.com/Zeezee1210), [zefhemel](https://github.com/zefhemel)

source/install/proxy-to-mattermost-transport-encryption.rst METASEP

Configuring proxy to Mattermost transport encryption
====================================================

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Mattermost Enterprise Edition E20*

Mattermost is able to encrypt the traffic between the proxy and the application server using TLS.

Prerequisites
-------------

- Operational Mattermost server or cluster.
- Authentication credentials for Mattermost user on application server.

Example environment
-------------------

In this scenario there is one Mattermost application server and one NGINX server, both running Ubuntu 18.04, with the following IPs:

- **transport-encryption-mattermost1:** 10.10.250.146
- **transport-encryption-nginx:** 10.10.250.107

Configuring NGINX
-----------------

On the NGINX server, connect to both servers with a sudo or root user. Open the Mattermost proxy configuration (Refer to `Configuring NGINX with SSL and HTTP/2 (End-User - Proxy) <https://docs.mattermost.com/install/install-rhel-6.html#configuring-nginx-with-ssl-and-http-2>`__ for additional information) and search for the following line twice:

.. code-block:: none

  proxy_pass http://backend;

Change the protocol from ``http`` to ``https``:

.. code-block:: none

  proxy_pass https://backend;

Afterwards do not reload the NGINX server yet to minimize the downtime of the service.

Configuring Mattermost
----------------------

On the Mattermost server, change to the config directory of Mattermost and generate a self-signed certificate that will be used to encrypt the traffic between the proxy server and the application server.

**Note:** Alternatively you can sign a certificate from your company's CA.

.. code-block:: none

  $ cd /opt/mattermost/config
  $ openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
  $ chown root:mattermost *.pem
  $ chmod 640 *.pem


Once complete, open the file ``config.json`` and modify the values ``ConnectionSecurity``, ``TLSCertFile`` and ``TLSKeyFile`` in the ``ServiceSettings`` section.

**Before**

.. code-block:: json

  {
      "ServiceSettings": {
          "SiteURL": "https://transport-encryption.dev.example.com",
          "WebsocketURL": "",
          "LicenseFileLocation": "",
          "ListenAddress": ":8065",
          "ConnectionSecurity": "",
          "TLSCertFile": "",
          "TLSKeyFile": "",
          "...":"..."
      },
      "...":"..."
  }


**After**

.. code-block:: json

  {
      "ServiceSettings": {
          "SiteURL": "https://transport-encryption.dev.example.com",
          "WebsocketURL": "",
          "LicenseFileLocation": "",
          "ListenAddress": ":8065",
          "ConnectionSecurity": "TLS",
          "TLSCertFile": "/opt/mattermost/config/cert.pem",
          "TLSKeyFile": "/opt/mattermost/config/key.pem",
          "...":"..."
      },
      "...":"..."
  }


Restart the Mattermost server and ensure it's up and running:

.. code-block:: none

  $ sudo systemctl restart mattermost
  $ systemctl status mattermost
  ● mattermost.service - Mattermost
     Loaded: loaded (/lib/systemd/system/mattermost.service; static; vendor preset: enabled)
     Active: active (running) since Mon 2019-10-28 16:45:29 UTC; 1h 15min ago
     [...]

Finally, on the **NGINX server**, reload the configuration to ensure that requests are sent on HTTPS:

.. code-block:: none

  $ sudo systemctl reload nginx

source/install/mattermost-kubernetes-operator.rst METASEP
Mattermost Kubernetes Operator
===============================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

What is an operator?
--------------------

In Kubernetes, an operator is a set of product- or application-specific instructions packaged into its own program. It tells an application what to run, where to find it, and how to configure it. An operator can automate complex application deployment and operation activities, such as installation, configuration changes, software updates, failure recovery, and more.

.. warning::

  If you used the Mattermost Kubernetes Operator prior to v1.12.x, or you're still using the ``ClusterInstallation`` Custom Resource, check out `this guide <https://github.com/mattermost/mattermost-operator/blob/master/docs/migration.md>`__ to learn how to migrate to thenew ``Mattermost`` resource.

Confirm resource requirements for production
--------------------------------------------

Running Mattermost in Kubernetes requires different resources based on your total number of users. Minimum requirements are listed in the following table:

.. csv-table::
    :header: "User Count", "Node Count", "Memory per Node", "vCPU per Node"

    "5,000", "6", "8 GB", "4"
    "10,000", "8", "16 GB", "4"
    "25,000", "14", "16 GB", "4"

- These resources take into account all components required for Mattermost, including proxy, database, and file storage.
- Requirements may be significantly lower when using an external database and filestore (recommended).  
- Resource requirements may vary depending on user usage and bot activity.
- For larger installations, it may be beneficial to use nodes for the databases that have more memory and/or are optimized for memory.
- For installations of more than 25,000 users please `contact us <https://mattermost.com/contact-us/>`__ for sizing guidelines.

Try out the Mattermost Operator
-------------------------------

The MySQL operator and MinIO operator are a good way to try out the Mattermost Operator or develop it on a local cluster; however, it's not recommended for production deployments.

1. Install the MySQL operator:

  .. code-block:: sh

    $ kubectl create ns mysql-operator
    $ kubectl apply -n mysql-operator -f https://raw.githubusercontent.com/mattermost/mattermost-operator/master/docs/mysql-operator/mysql-operator.yaml

2. Install the MinIO operator:

  .. code-block:: sh

    $ kubectl create ns minio-operator
    $ kubectl apply -n minio-operator -f https://raw.githubusercontent.com/mattermost/mattermost-operator/master/docs/minio-operator/minio-operator.yaml 

Rolling upgrades
----------------

The Mattermost Kubernetes Operator supports rolling upgrades, so you can upgrade your Mattermost deployment with zero downtime. This process requires at least two replicas as a rolling upgrade cannot be performed if there is only one pod. Replicas are created when a user count is selected and exceeds 100.

New Mattermost releases are announced via our community server, as well as social media and email.

Perform a rolling upgrade
~~~~~~~~~~~~~~~~~~~~~~~~~

1. Log in to your Kubernetes instance.
2. Open the ``mattermost-installation.yaml`` manifest (the one created during installation).
3. Update the ``spec.version`` value to the new version.
4. Save the changes.

Apply the changes with ``kubectl``:

.. code-block:: sh

    $ kubectl apply -n mattermost -f [PATH_TO_MATTERMOST_MANIFEST]

The operator initiates a job in the Kubernetes cluster and once migration is complete the pods are restarted. If necessary, a database migration is also performed.

To view information about the running job, use

.. code-block:: sh

    $ kubectl -n mattermost get jobs

At least one pod is available at all times and once all pods are restarted with the new version the upgrade is complete.

To view the status of the pods and to confirm their state, use

.. code-block:: sh

    $ kubectl -n mattermost get pods

The ``STATUS`` of the pods should be running/ready, with an ``AGE`` of 10-15 seconds.

Restore an existing Mattermost MySQL database
---------------------------------------------

The Mattermost Operator can be used in a backup and restore scenario to apply an existing Mattermost MySQL database to a new Mattermost installation, in its own namespace. This can also be helpful in the event that you need to revert your Mattermost instance's database to the most recent backup point, on your existing installation. In both cases, you will need a backup of your database.

The steps you follow to create and upload your backup depends on the provider you're using and your use case. It's recommended that you consult the relevant documentation or, if your deployment is managed in a different way, consult your Administrator.

It is important to note that this process requires the creation of a new Mattermost installation - editing the existing ``.yaml`` files is not recommended and can result in data loss.

The process described below needs to be completed prior to proceeding with the Mattermost deployment.

1. Create a backup of your database (e.g. using *mysqldump*).
2. Deploy a new server (e.g. an AWS instance).
3. Install a backup program and back up the database on the new server/instance.
4. Upload the backed up database to your cloud storage provider (e.g. Amazon S3).
5. Create a ``secret.yaml`` file:

  a. Open a text editor and create a text file containing your credentials which will be used to access the uploaded database.

  b. Save the file as ``secret.yaml``. The example below is for AWS/S3, where ``name`` indicates the name of this manifest referenced in the install manifest.

    .. code-block:: yaml

      apiVersion: v1
      kind: Secret
      metadata:
        name: test-restore
      type: Opaque
      stringData:
        AWS_ACCESS_KEY_ID: XXXXXXXXXXXX
        AWS_SECRET_ACCESS_KEY: XXXXXXXXXXXX/XXXXXXXXXXXX
        AWS_REGION: us-east-1
        S3_PROVIDER: AWS

6. Create a Mattermost cluster installation manifest by opening a text editor and creating a text file with the following details. The Mattermost installation manifest contains fields which must be edited in line with your configuration and environment requirements. Save the file as ``mattermost-installation.yaml``:

  .. code-block:: yaml

    apiVersion: mattermost.com/v1alpha1
    kind: ClusterInstallation
    metadata:
      name: mm-example-full
    spec:
      size: ""
      ingressName: example.mattermost-example.com
      ingressAnnotations:
        kubernetes.io/ingress.class: nginx
      version: 5.14.0
      mattermostLicenseSecret: ""
      database:
        storageSize: 50Gi
        minio:
        storageSize: 50Gi
      elasticSearch:
        host: ""
        username: ""
        password: ""

7. Create a restore manifest by opening a text editor and creating a text file with the following details. Save the file as ``restore.yaml``:

  .. code-block:: yaml

    apiVersion: mattermost.com/v1alpha1
    kind: MattermostRestoreDB
    metadata:
      name: example-mattermostrestoredb
    spec:
      initBucketURL: s3://my-sample/my-backup.gz
      mattermostClusterName: example-clusterinstallation
      mattermostDBName: mattermostdb
      mattermostDBPassword: supersecure
      mattermostDBUser: ""
      restoreSecret: ""

**Parameters**

- ``mattermostClusterName``: The ClusterInstallation file name.
- ``restoreSecret``: The location of the backup file.
- ``mattermostDBPassword``: The password used to access the database.
- ``mattermostDBUser``: The username required to access the database.
- ``initBucketURL``: The URL of the storage instance/server where the backed up DB is stored.

8. To initiate deployment, apply the file and specify the path where the newly-created files have been saved:

  .. code-block:: sh

      $ kubectl create ns mattermost
      $ kubectl apply -n mattermost -f /path/to/secret.yaml
      $ kubectl apply -n mattermost -f /path/to/mattermost-installation.yaml
      $ kubectl apply -n mattermost -f /path/to/restore.yaml

  The deployment process can be monitored in the Kubernetes user interface. If errors or issues are experienced, review the Mattermost, Operator, and MySQL logs for guidance including error messages. If remediation is not successful, contact Mattermost customer support for assistance.

  Once complete, access your Mattermost instance and confirm that the database has been restored.

Migrate From Helm Chart
--------------------------

If you've installed Mattermost as helm chart deployment, you can easily move to an operator-installed deployment by following the steps below.

1. Create a namespace dedicated to the operator.

.. code-block:: sh

  $ kubectl create ns mattermost-operator

2. Save the secrets from the current installation. If you have extra secrets mounted as a volume, save them as well. To begin, set the ``NAMESPACE`` environment variable to the namespace your Mattermost instance is running in:

.. code-block:: sh
  
  $ export NAMESPACE=mattermost
  $ kubectl get secrets -n $NAMESPACE mattermost-db-secret -o yaml > mattermost-db-secret.yaml
  $ kubectl get secrets -n $NAMESPACE mattermost-license-secret -o yaml > mattermost-license-secret.yaml
  $ kubectl get secrets -n $NAMESPACE cert -o yaml > cert.yaml

3. Change the database secret to match the operator. The helm installation used ``mattermost.dbsecret`` while the operator uses ``DB_CONNECTION_STRING``.

.. code-block:: sh

  $ vim mattermost-db-secret.yaml

.. code-block:: yaml

  apiVersion: v1
  kind: Secret
  metadata:
    name: mattermost-db-secret
  data:
    DB_CONNECTION_STRING: [YOUR_CONNECTION_STRING]

4. Create an S3 Secret. Mattermost operator uses ``secret`` while helm uses environment variables.

.. code-block:: yaml

  apiVersion: v1
  metadata:
    name: s3-secret
  kind: Secret
  stringData:
    accesskey: [S3_ACCESS_KEY]
    secretkey: [S3_ACCESS_KEY]

5. Scale the current installation to 0 and deploy the operator.

.. code-block:: sh

  $ kubectl apply -n mattermost-operator -f https://raw.githubusercontent.com/mattermost/mattermost-operator/master/docs/mattermost-operator/mattermost-operator.yaml
  $ kubectl scale deployment -n $NAMESPACE mattermost-deployment --replicas=0

6. Apply the new secrets in the new namespace.

.. code-block:: sh

  $ kubectl apply -f mattermost-db-secret.yaml -n $NEW_NAMESPACE 
  $ kubectl apply -f mattermost-license-secret.yaml -n $NEW_NAMESPACE
  $ kubectl apply -f cert.yaml -n $NEW_NAMESPACE
  $ kubectl apply -f s3-secret -n $NEW_NAMESPACE

7. Create a Mattermost installation in the same namespace as the new secrets.

.. code-block:: yaml

  apiVersion: installation.mattermost.com/v1beta1
  kind: Mattermost
  metadata:
    name: mm-example
  spec:
    image: mattermost/mattermost-enterprise-edition
    imagePullPolicy: IfNotPresent
    version: 6.0.0
    size: 5000users
    ingress:
      enabled: true
      host: example.mattermost-example.com
      tlsSecret: "cert"
    licenseSecret: "mattermost-db-secret"
    database:
      external:
        secret: "mattermost-db-secret"
    fileStore:
      external:
        url: s3.amazonaws.com
        bucket: my-s3-bucket
        secret: s3-secret
    elasticSearch: {}
    volumeMounts:
    - name: certificates
      mountPath: /etc/ssl/certs/mycert.pem
      subPath: mycert.pem
    volumes:
    - name: certificates
      secret:
        defaultMode: 420
        secretName: cert

Align the manifest to your needs, then save the file as ``mattermost-installation.yaml``. See the `documentation <https://github.com/mattermost/mattermost-operator/blob/master/docs/examples/mattermost_full.yaml>`__ for details about supported fields.
 While recommended filenames are provided, your naming conventions may differ.

8. Apply the new manifest in the relevant namespace.

.. code-block:: sh

  $ kubectl apply -n $NEW_NAMESPACE -f mattermost-installation.yaml

The deployment process can be monitored in the Kubernetes user interface or using the command line by running:

.. code-block:: sh

  $ kubectl -n $NEW_NAMESPACE get mm -w

The installation should be deployed successfully when the Custom Resource reaches a stable state.

9. Configure DNS and use Mattermost.

  When the deployment is complete, obtain the hostname or IP address of your Mattermost deployment using the following command:

  .. code-block:: sh

    $ kubectl -n $NEW_NAMESPACE get ingress

  Copy the resulting hostname or IP address from the ``ADDRESS`` column, open your browser, and connect to Mattermost.

  Use your domain registration service to create a canonical name or IP address record for the ``ingress.host`` in your manifest, pointing to the address you just copied. For example, on AWS you would do this within a hosted zone in Route53.

  Navigate to the ``ingress.host`` URL in your browser and use Mattermost.

  If you just want to try it out on your local machine without configuring the domain, run:

  .. code-block:: sh

    $ kubectl -n $NEW_NAMESPACE port-forward svc/[YOUR_MATTERMOST_NAME] 8065:8065

  Then navigate to ``http://localhost:8065``.
.. include:: faq_kubernetes.rst
  :start-after: :nosearch:
source/install/manage_kubernetes.rst METASEP
:orphan:
:nosearch:

.. _manage_kubernetes:

Managing the Mattermost Kubernetes operator
============================================

.. This page is intentionally not accessible via the LHS navigation pane because it's common content included on other docs pages.

CLI commands
------------

You can manage and monitor your Mattermost installation's installation and deployment process in the CLI, using the commands listed below.

.. code-block:: sh

    $ kubectl -n mattermost get jobs

.. code-block:: sh

    $ kubectl -n mattermost get all

Logs
----

.. code-block:: sh

    $ mattermost logs -f [pod name]

source/install/legacy-self-hosted-changelog.md METASEP
# Mattermost legacy self-hosted changelog

[Mattermost](https://mattermost.com) is an open source platform for secure collaboration across the entire software development lifecycle. This changelog summarizes updates for all self-hosted versions of Mattermost prior to v6.0.

## Latest Mattermost releases
See [changelog in progress](https://bit.ly/2nK3cVf) for the upcoming release, and see the [Mattermost Self-Hosted Changelog](self-hosted-changelog) for details on the latest self-hosted versions of Mattermost including the most recent [Extended Support Release (ESR)](https://docs.mattermost.com/upgrade/extended-support-release.html).

## Release v5.39 - [Quality Release](https://docs.mattermost.com/upgrade/release-definitions.html#quality-release)

- **v5.39.3, released 2021-12-17**
  - Mattermost v5.39.3 contains medium level security fixes. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).
  - Added a general performance fix for loading the web application and typing.
  - Improved performance while typing by moving some autocomplete layout calculations.
  - Improved performance by reducing DOM usage during render.
  - Removed real-time updates of a couple of features to prevent overloading servers on user updates. The "This channel contains guests" indicator and the number of timezones displayed when notifying members of a group will only be updated on channel change now.
  - Fixed an issue where v5.39 reported an incorrect mmctl version.
- **v5.39.2, released 2021-11-15**
  - Mattermost v5.39.1 contains a medium level security fix. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).
- **v5.39.1, released 2021-10-27**
  - Mattermost v5.39.1 contains a medium level security fix. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).
  - Fixed an issue with fetching threads upon websocket reconnection.
  - Fixed a race condition in telemetry IDs on High Availability servers [MM-39343](https://mattermost.atlassian.net/browse/MM-39343).
- **5.39.0, released 2021-09-16**
  - Original 5.39 release

Mattermost v5.39.0 contains a low level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).

### Improvements

#### User Interface (UI)
 - Updated in-product help documentation to fix broken links and to correct outdated information.
 - Italian, Polish, Korean, and Ukrainian languages have been downgraded to alpha. Korean and Ukrainian are [no longer actively maintained](https://handbook.mattermost.com/contributors/join-us/localization#translation-quality).

### Bug Fixes
 - Fixed a possible panic during license validation.
 - Fixed an issue with loading of emojis in message attachment titles.
 - Fixed an issue where the timestamp in deleted messages was not correctly positioned.
 - Changed the whitespace in the refresh bar so that it always displays to the user.
 - Fixed an issue where email invites were not sent when clicking the **Next** button during onboarding.
 - Fixed an issue where clicking "View Message" in an email did not navigate to the post or remember the user's preference to "View in App".
 - Fixed an issue with the detection of certain collapsible images.
 - Prevented users from having the unreads filter enabled when the button to toggle it was not shown.
 - Fixed an issue where Mattermost's shortcut key CTRL+SHIFT+A to open the **Account Settings** clashed with Chrome's CTRL+SHIFT+A that opens a "Search Tabs" pop-up.
 - Fixed a crash when markdown images were present on the message attachments and embedded bindings.
 - Fixed an issue that kept message attachment fields unaligned.
 - Fixed an issue with right-hand side ``SuggestionList`` positioning.
 - Fixed an issue where Mattermost panicked on ``docx`` files uploaded with ``.doc`` extension.
 - Fixed a bug with the auto-responder where it would incorrectly calculate the time interval and never send the message.
 - Fixed a decoding problem for OpenID integration. The requests are now decoded against ``RawURLEncoding``.
 - Fixed various bugs for the Collapsed Reply Threads (Beta) feature, including:
   - Fixed an issue where a gap appeared between the first and second consecutive message from the same user.
   - Fixed an issue where the thread unread state would not update on websocket reconnect.
   - Fixed an issue where the main channel view root post timestamp added a horizontal scrollbar on hover.
   -  The ``ThreadAutoFollow`` setting must now be enabled in order to enable ``CollapsedThreads``.
   - Fixed issue with users re-following a previously unfollowed thread when other users replied to the thread.
   - Clicking code blocks and in-line code no longer open the associated thread.
   - Fixed an issue where two scrollbars appeared in the Threads view on high resolution monitors using zoom.
   - Fixed an issue where the quick channel switcher mention counts did not follow collapsed threads logic.
   - Fixed an issue where threads started by webhooks/integrations were being auto-followed by the webhook/integration creator when collapsed threads was enabled.
   - Fixed an issue where re-connecting to the websocket caused thread mentions to be cleared in the user interface with collapsed reply threads enabled.
   - Fixed an issue where the **New messages** line and date separators overlapped text in a thread.

### Go Version
 - v5.39 is built with Go ``1.16.7``.

### Upcoming Deprecations in Mattermost v6.0

The following deprecations are planned for the Mattermost v6.0 release, which is scheduled for 2021/10/13. This list is subject to change prior to the release.

1. [Legacy Command Line Tools](https://docs.mattermost.com/manage/command-line-tools.html). All commands have been fully replaced by [mmctl](https://docs.mattermost.com/manage/mmctl-command-line-tool.html) and new commands have been added over the last few months, making this tool a full and robust replacement. 

2. [Slack Import via the web app](https://docs.mattermost.com/onboard/migrating-to-mattermost.html#migrating-from-slack-using-the-mattermost-web-app). The Slack import tool accessible via the Team Setting menu is being replaced by the [mmetl](https://docs.mattermost.com/onboard/migrating-to-mattermost.html#migrating-from-slack-using-the-mattermost-mmetl-tool-and-bulk-import) tool that is much more comprehensive for the types of data it can assist in uploading. 

3. MySQL versions below 5.7.7. Minimum support will now be for 5.7.12. This version introduced a native JSON data type that lets us improve performance and scalability of several database fields (most notably Users and Posts props). Additionally, version 5.6 (our current minimum version) reached [EOL in February 2021](https://www.mysql.com/support/eol-notice.html).

4. Elasticsearch 5 and 6 - [versions 5.x reached EOL in March of 2019, and versions 6.x reached EOL in November 2020](https://www.elastic.co/support/eol). Our minimal supported version with Mattermost v6.0 will be Elasticsearch version 7.0.

5. Windows 7 reached [EOL in January 2020](https://support.microsoft.com/en-us/windows/windows-7-support-ended-on-january-14-2020-b75d4580-2cc7-895a-2c9c-1466d9a53962). We will no longer provide support for Mattermost Desktop App issues on Windows 7.

6. [DisableLegacyMFAEndpoint](https://docs.mattermost.com/configure/configuration-settings.html#disable-legacy-mfa-api-endpoint) configuration setting.

7. [ExperimentalTimezone](https://docs.mattermost.com/configure/configuration-settings.html#timezone) configuration setting. The config setting will be removed and the feature will be promoted to general availability.

8. All legacy channel sidebar experimental configuration settings. We encourage customers using these settings to upgrade to v5.32 or later to access [custom, collapsible channel categories](https://mattermost.com/blog/custom-collapsible-channel-categories/) among many other channel organization features. The settings being deprecated include:

   - [EnableLegacySidebar](https://docs.mattermost.com/configure/configuration-settings.html#enable-legacy-sidebar)
   - [ExperimentalTownSquareIsReadOnly](https://docs.mattermost.com/configure/configuration-settings.html#town-square-is-read-only-experimental)
   - [ExperimentalHideTownSquareinLHS](https://docs.mattermost.com/configure/configuration-settings.html#town-square-is-hidden-in-left-hand-sidebar-experimental)
   - [EnableXToLeaveChannelsFromLHS](https://docs.mattermost.com/configure/configuration-settings.html#enable-x-to-leave-channels-from-left-hand-sidebar-experimental)
   - [CloseUnusedDirectMessages](https://docs.mattermost.com/configure/configuration-settings.html#autoclose-direct-messages-in-sidebar-experimental)
   - [ExperimentalChannelOrganization](https://docs.mattermost.com/configure/configuration-settings.html#sidebar-organization)
   - [ExperimentalChannelSidebarOrganization](https://docs.mattermost.com/configure/configuration-settings.html#experimental-sidebar-features)

9. [All configuration settings previously marked as “Deprecated”](https://docs.mattermost.com/configure/configuration-settings.html#deprecated-configuration-settings).

10. Changes to ``mattermost-server/model`` for naming consistency.

### Known Issues
 - [Collapsed Reply Threads](https://docs.mattermost.com/messaging/organizing-conversations.html) is currently in beta. Before enabling the feature, please ensure you are well versed in the [known issues](https://docs.mattermost.com/messaging/organizing-conversations.html#known-issues),  particularly relating to database resource requirements and server performance implications. If you cannot easily scale up your database size, or are running the Mattermost application server and database server on the same machine, we recommended waiting to enable Collapsed Reply Threads until it is [promoted to general availability in Q2 2022](https://mattermost.com/blog/collapsed-reply-threads-ga/). Learn more about these [performance considerations here](https://support.mattermost.com/hc/en-us/articles/4413183568276).
 - Experimental timezones and custom statuses can cause an increase in CPU usage and database connections for servers with an E20 license. A current workaround is to disable custom statuses or to disable experimental timezones.
 - Adding an at-mention at the start of a post draft and pressing the leftwards or rightwards arrow can clear the post draft and the undo history [MM-33823](https://mattermost.atlassian.net/browse/MM-33823).
 - Pinned posts are no longer highlighted [MM-34870](https://mattermost.atlassian.net/browse/MM-34870).
 - Google login fails on the Classic mobile apps.
 - Status may sometimes get stuck as **Away** or **Offline** in High Availability mode with IP Hash turned off.
 - Searching stop words in quotation marks with Elasticsearch enabled returns more than just the searched terms.
 - The team sidebar on the desktop app does not update when channels have been read on mobile.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.

### Contributors
 - [aaronrothschild](https://github.com/aaronrothschild), [adammorawski1](https://github.com/adammorawski1), [Adovenmuehle](https://github.com/Adovenmuehle), [aeomin](https://github.com/aeomin), [agarciamontoro](https://github.com/agarciamontoro), [AGMETEOR](https://github.com/AGMETEOR), [agnivade](https://github.com/agnivade), [amirmoyousefi](https://github.com/amirmoyousefi), [amyblais](https://github.com/amyblais), [amynicol1985](https://github.com/amynicol1985), [anurag6713](https://github.com/anurag6713), [arjitc](https://github.com/arjitc), [ArmanChand](https://github.com/ArmanChand), [asaadmahmood](https://github.com/asaadmahmood), [ashishbhate](https://github.com/ashishbhate), [AshishDhama](https://github.com/AshishDhama), [asimsedhain](https://github.com/asimsedhain), [aspleenic](https://github.com/aspleenic), [BenCookie95](https://github.com/BenCookie95), [BenLloydPearson](https://github.com/BenLloydPearson), [calebroseland](https://github.com/calebroseland), [chenilim](https://github.com/chenilim), [chikei](https://github.com/chikei), [chitramdasgupta](https://github.com/chitramdasgupta), [cobenash](https://github.com/cobenash), [coltoneshaw](https://github.com/coltoneshaw), [cpanato](https://github.com/cpanato), [cpoile](https://github.com/cpoile), [crspeller](https://github.com/crspeller), [ctlaltdieliet](https://github.com/ctlaltdieliet), [cvockrodt](https://github.com/cvockrodt), [cwarnermm](https://github.com/cwarnermm), [dbpolito](https://github.com/dbpolito), [deanwhillier](https://github.com/deanwhillier), [devinbinnie](https://github.com/devinbinnie), [DeviousLab](https://github.com/DeviousLab), [DjMagicFingers](https://github.com/DjMagicFingers), [Duaard](https://github.com/Duaard), [elyscape](https://github.com/elyscape), [emilyacook](https://github.com/emilyacook), [enahum](https://github.com/enahum), [enelson720](https://github.com/enelson720), [engineereng](https://github.com/engineereng), [ewwollesen](https://github.com/ewwollesen), [fksu](https://github.com/fksu), [flynbit](https://github.com/flynbit), [Francois-D](https://github.com/Francois-D), [furqanmlk](https://github.com/furqanmlk), [gabrieljackson](https://github.com/gabrieljackson), [gigawhitlocks](https://github.com/gigawhitlocks), [gozeloglu](https://github.com/gozeloglu), [gruceqq](https://translate.mattermost.com/user/gruceqq/), [haalcala](https://github.com/haalcala), [haardikdharma10](https://github.com/haardikdharma10), [hahmadia](https://github.com/hahmadia), [hanzei](https://github.com/hanzei), [harshilsharma63](https://github.com/harshilsharma63), [hectorskypl](https://github.com/hectorskypl), [hmhealey](https://github.com/hmhealey), [icelander](https://github.com/icelander), [iomodo](https://github.com/iomodo), [isacikgoz](https://github.com/isacikgoz), [it33](https://github.com/it33), [ivanaairenee](https://github.com/ivanaairenee), [jadrales](https://github.com/jadrales), [jamiehurewitz](https://github.com/jamiehurewitz), [jasonblais](https://github.com/jasonblais), [jayaddison-collabora](https://github.com/jayaddison-collabora), [jespino](https://github.com/jespino), [jfrerich](https://github.com/jfrerich), [Johennes](https://github.com/Johennes), [johnsonbrothers](https://github.com/johnsonbrothers), [josephbaylon](https://github.com/josephbaylon), [JtheBAB](https://github.com/JtheBAB), [jufab](https://github.com/jufab), [jupenur](https://github.com/jupenur), [justinegeffen](https://github.com/justinegeffen), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [kamre](https://github.com/kamre), [kayazeren](https://github.com/kayazeren), [KobeBergmans](https://github.com/KobeBergmans), [koox00](https://github.com/koox00), [krutarththakkar](https://github.com/krutarththakkar), [kscheel](https://github.com/kscheel), [larkox](https://github.com/larkox), [LauSam09](https://github.com/LauSam09), [levb](https://github.com/levb), [lieut-data](https://github.com/lieut-data), [lindalumitchell](https://github.com/lindalumitchell), [maisnamrajusingh](https://github.com/maisnamrajusingh), [majidsajadi](https://github.com/majidsajadi), [maliur](https://github.com/maliur), [manojmalik20](https://github.com/manojmalik20), [marianunez](https://github.com/marianunez), [mattermod](https://github.com/mattermod), [matthewbirtch](https://github.com/matthewbirtch), [matthew.williams](https://translate.mattermost.com/user/matthew-w/), [metanerd](https://github.com/metanerd), [mgdelacroix](https://github.com/mgdelacroix), [michelengelen](https://github.com/michelengelen), [mickmister](https://github.com/mickmister), [migbot](https://github.com/migbot), [mkraft](https://github.com/mkraft), [mlongo4290](https://github.com/mlongo4290), [mmskv](https://github.com/mmskv), [mrckndt](https://github.com/mrckndt), [Mshahidtaj](https://github.com/Mshahidtaj), [nat-gunner](https://github.com/nat-gunner), [neallred](https://github.com/neallred), [nevyangelova](https://github.com/nevyangelova), [nikolaizah](https://github.com/nikolaizah), [Nog-Frog](https://github.com/Nog-Frog), [pablovelezvidal](https://github.com/pablovelezvidal), [Prassud](https://github.com/Prassud), [rbradleyhaas](https://github.com/rbradleyhaas), [redrru](https://github.com/redrru), [rodcorsi](https://github.com/rodcorsi), [roopakv](https://github.com/roopakv), [rrey](https://github.com/rrey), [Rutam21](https://github.com/Rutam21), [sakaitsu](https://translate.mattermost.com/user/sakaitsu/), [saturninoabril](https://github.com/saturninoabril), [Sayanta66](https://github.com/Sayanta66), [sbishel](https://github.com/sbishel), [Shahzayb](https://github.com/Shahzayb), [Shaz-25](https://github.com/Shaz-25), [sibasankarnayak](https://github.com/sibasankarnayak), [sonereker](https://github.com/sonereker), [spirosoik](https://github.com/spirosoik), [srkgupta](https://github.com/srkgupta), [stafot](https://github.com/stafot), [streamer45](https://github.com/streamer45), [stylianosrigas](https://github.com/stylianosrigas), [Szymongib](https://github.com/Szymongib), [talesmc](https://github.com/talesmc), [thePanz](https://github.com/thePanz), [tsabi](https://translate.mattermost.com/user/tsabi/), [VA2XJM](https://github.com/VA2XJM), [vadimasadchi](https://github.com/vadimasadchi), [vinod-demansol](https://github.com/vinod-demansol), [wget](https://github.com/wget), [WietseWind](https://github.com/WietseWind), [wiggin77](https://github.com/wiggin77), [Willyfrog](https://github.com/Willyfrog), [yedamao](https://github.com/yedamao), [YJSoft](https://github.com/YJSoft), [zefhemel](https://github.com/zefhemel), [Ziggiz](https://github.com/Ziggiz)

## Release v5.38 - [Feature Release](https://docs.mattermost.com/administration/release-definitions.html#feature-release)

- **v5.38.4, released 2021-11-15**
  - Mattermost v5.38.4 contains a medium level security fix. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).
- **v5.38.3, released 2021-10-27**
  - Mattermost v5.38.3 contains a medium level security fix. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).
  - Fixed a race condition in telemetry IDs on High Availability servers [MM-39343](https://mattermost.atlassian.net/browse/MM-39343).
- **v5.38.2, released 2021-08-26**
  - Upgraded Go version to 1.16.7 to fix an application crash issue.
  - Fixed an issue where mmctl ``config reload`` command was missing local-mode server-side implementation. [MM-38082](https://mattermost.atlassian.net/browse/MM-38082)
- **v5.38.1, released 2021-08-18**
  - Fixed an issue where Playbooks v1.16.0 could not be installed as a pre-packaged plugin [MM-37928](https://mattermost.atlassian.net/browse/MM-37928).
- **v5.38.0, released 2021-08-16**
  - Original 5.38.0 release

Mattermost v5.38.0 contains low to medium level security fixes. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).

### Deprecations
 - The “config watcher” (the mechanism that automatically reloads the ``config.json`` file) has been removed in favor of the ``mmctl config reload`` command, which must be run to apply configuration changes after they are made on disk. This change improves configuration performance and robustness.

### Important Upgrade Notes
 - v5.38 adds fixes for some of the incorrect mention counts and unreads around threads and channels since the introduction of Collapsed Reply Threads (Beta). This fix is done through a SQL migration, and it may take several minutes to complete for large databases. The ``fixCRTChannelMembershipCounts`` fix takes 1 minute and 20 seconds for a database containing approximately 4 million channel memberships and about 130,000 channels. The ``fixCRTThreadCountsAndUnreads`` fix takes about 3 minutes and 30 seconds for a database containing 56367 threads, 124587 thread memberships, and 220801 channel memberships. These are on MySQL v5.6.51.
 - Focalboard v0.8.2 (released with Mattermost v5.38.0) requires Mattermost v5.37+ due to the new database connection system.

**IMPORTANT:** If you upgrade from a release earlier than v5.37, please read the other [Important Upgrade Notes](https://docs.mattermost.com/upgrade/important-upgrade-notes.html).

### Highlights

#### Granular Data Retention Policies (Enterprise E20)
 - A ``data_retention`` type job can now be run even if the global policy is disabled. The granular (i.e. team and channel-specific) policies will be executed when the data retention job is run. Please note there is a known issue where deleted posts get displayed in channels without new activity after the retention job is run.  This issue is tracked with [this ticket](https://mattermost.atlassian.net/browse/MM-36574).

#### Enhanced User Onboarding Experience
 - To help new users get started with Mattermost, new Getting Started steps have been added to the onboarding experience. These steps help users to complete their profile, name their teams, configure desktop notifications, and invite others to join their team. Additionally, once the onboarding is complete, users are provided with helpful tips to get started with channels, plugins, and more.

#### Playbooks Updates
 - ``Incident Collaboration`` was rebranded to ``Playbooks``. Also the channel right-hand sidebar is redesigned, our own playbooks are shared as templates, and more triggers and actions were added.

#### Focalboard Updates
 - Added created-by property and improved performance with shared database connections. Focalboard 0.8.2 requires Mattermost v5.37+ due to a new database connection system.

### Improvements

#### User Interface (UI)
 - Upgraded German language back to an official language.
 - Markdown formatting is now stripped from push notifications.
 - Enabled the **Set Status** button if the custom status hasn't changed from currently set status.
 - Improved default rendering of images inserted via the GIF picker.
 - Small text changes were added to Direct and Group Message menus: **Mute channel** and **Edit Channel Header** now reads as **Mute Conversation** and **Edit Conversation Header**.

#### Performance
 - Improved performance of components that show reactions on posts.
 - Improved performance of certain components when viewing non-Direct Message channels.
 - Added minor improvements to performance of messages posted in the right-hand side.
 - Improved typing performance in affected environments by reducing the frequency in which drafts are saved.

#### Integrations
 - Added icons to apps in the Marketplace.
 - Apps can now add arbitrary markdown in between fields on forms.
 - Added support for markdown in apps forms, interactive dialogs field descriptions, errors, and slash commands.
 - Improved user and channel selector for app commands.
 - Added support for ``react-intl`` and ``<Timestamp/>`` usage in plugins.
 - Added plugin API methods for user access tokens and OAuth apps.

#### Administration
 - Added a new feature to archive and unarchive teams through **System Console** > **Teams**.

### Bug Fixes
 - Fixed an issue where the "Find channel" channel switcher text overflowed beyond the button for some languages.
 - Fixed an issue where inter-plugin requests without a body didn't work.
 - Fixed an issue with opening a dialog from an interactive message when returning an empty response.
 - Fixed an issue where the **Add Members** modal was incorrectly themed on the Mattermost Dark Theme.
 - Fixed a panic in the ``getPrevTrialLicense`` API request when loading the System Console on Team Edition.
 - Fixed an issue where admin advisor notifications were accidentally re-enabled in a previous release.
 - Fixed various bugs for the Collapsed Reply Threads (Beta) feature, including:
   - Fixed an issue where an error occurred while following a thread with no replies.
   - Fixed an issue where ``reply_count`` of 0 was always returned for GET single Post on ``/posts/<postid>`` API.
   - Fixed an issue where following a single message returned a status 500.
   - Fixed an issue where when replying in a thread after unfollowing it, the thread was not auto-followed again.
   - Fixed an issue where when enabling Collapsed Reply Threads, channels that had no new activity were showing as unread.
   - Fixed an issue with thread unreads when the feature was enabled by a user.
   - Fixed an issue where self replies were marking threads as unread.
   - Unread threads are now correctly displayed on app load for teams in the sidebar when Collapsed Reply Threads feature is enabled.
   - Fixed an issue where "Thread" in the thread viewer was displayed vertically in some languages.
   - Fixed an issue where opening global threads containing a root post markdown image crashed the app.
   - Fixed an issue where the app crashed when switching to the Threads view after leaving a channel.
   - Fixed an issue where replying to a thread from the global threads screen marked the channel as read.
   - The **Mark all as unread** button is now no longer disabled for Collapsed Reply Threads.
   - Fixed root posts not being shown as followed for the post creator after receiving the first reply that affected servers with Collapsed Reply Threads enabled and database read replicas configured.

### config.json
Multiple setting options were added to ``config.json``. Below is a list of the additions and their default values on install. The settings can be modified in ``config.json``, or the System Console when available.

#### Changes to Team Edition and Enterprise Edition:
 - Under ``PluginSettings`` in ``config.json``:
    - Added ``ChimeraOAuthProxyURL`` to allow specifying Chimera URL that can be used by plugins to connect with pre-created OAuth applications.
 - The config setting ``EnableReliableWebSockets`` now defaults to ``true``.

### API Changes
 - Added ``CreateChannelSidebarCategory``, ``GetChannelSidebarCategories`` and ``UpdateChannelSidebarCategories`` to the Plugin API.
 - Add a new Plugin API method that allows files to register dropdown menu actions.

### Go Version
 - v5.38 is built with Go ``1.16.0``.

### Open Source Components
 - Added ``classnames`` and ``react-window`` to https://github.com/mattermost/mattermost-webapp/.
 - Added ``@react-native-community/datetimepicker``, ``array.prototype.flat``, and ``base-64`` to https://github.com/mattermost/mattermost-mobile/.

### Upcoming Deprecations in Mattermost v6.0

The following deprecations are planned for the Mattermost v6.0 release, which is scheduled for 2021/10/15. This list is subject to change prior to the release.

1. [Legacy Command Line Tools](https://docs.mattermost.com/manage/command-line-tools.html). All commands have been fully replaced by [mmctl](https://docs.mattermost.com/manage/mmctl-command-line-tool.html) and new commands have been added over the last few months, making this tool a full and robust replacement. 

2. [Slack Import via the web app](https://docs.mattermost.com/onboard/migrating-to-mattermost.html#migrating-from-slack-using-the-mattermost-web-app). The Slack import tool accessible via the Team Setting menu is being replaced by the [mmetl](https://docs.mattermost.com/onboard/migrating-to-mattermost.html#migrating-from-slack-using-the-mattermost-mmetl-tool-and-bulk-import) tool that is much more comprehensive for the types of data it can assist in uploading. 

3. MySQL versions below 5.7.7. Minimum support will now be for 5.7.12. This version introduced a native JSON data type that lets us improve performance and scalability of several database fields (most notably Users and Posts props). Additionally, version 5.6 (our current minimum version) reached [EOL in February 2021](https://www.mysql.com/support/eol-notice.html).

4. Elasticsearch 5 and 6 - [versions 5.x reached EOL in March of 2019, and versions 6.x reached EOL in November 2020](https://www.elastic.co/support/eol). Our minimal supported version with Mattermost v6.0 will be Elasticsearch version 7.0.

5. Windows 7 reached [EOL in January 2020](https://support.microsoft.com/en-us/windows/windows-7-support-ended-on-january-14-2020-b75d4580-2cc7-895a-2c9c-1466d9a53962). We will no longer provide support for Mattermost Desktop App issues on Windows 7.

6. [DisableLegacyMFA](https://docs.mattermost.com/configure/configuration-settings.html#disable-legacy-mfa-api-endpoint) configuration setting.

7. [ExperimentalTimezone](https://docs.mattermost.com/configure/configuration-settings.html#timezone) configuration setting.

8. All legacy channel sidebar experimental configuration settings. We encourage customers using these settings to upgrade to v5.32 or later to access [custom, collapsible channel categories](https://mattermost.com/blog/custom-collapsible-channel-categories/) among many other channel organization features. The settings being deprecated include:

   - [EnableLegacySidebar](https://docs.mattermost.com/configure/configuration-settings.html#enable-legacy-sidebar)
   - [ExperimentalTownSquareIsReadOnly](https://docs.mattermost.com/configure/configuration-settings.html#town-square-is-read-only-experimental)
   - [ExperimentalHideTownSquareinLHS](https://docs.mattermost.com/configure/configuration-settings.html#town-square-is-hidden-in-left-hand-sidebar-experimental)
   - [EnableXToLeaveChannelsFromLHS](https://docs.mattermost.com/configure/configuration-settings.html#enable-x-to-leave-channels-from-left-hand-sidebar-experimental)
   - [CloseUnusedDirectMessages](https://docs.mattermost.com/configure/configuration-settings.html#autoclose-direct-messages-in-sidebar-experimental)
   - [ExperimentalChannelOrganization](https://docs.mattermost.com/configure/configuration-settings.html#sidebar-organization)
   - [ExperimentalChannelSidebarOrganization](https://docs.mattermost.com/configure/configuration-settings.html#experimental-sidebar-features)

9. [All configuration settings previously marked as “Deprecated”](https://docs.mattermost.com/configure/configuration-settings.html#deprecated-configuration-settings).

10. Changes to ``mattermost-server/model`` for naming consistency.

### Known Issues
 - [Collapsed Reply Threads](https://docs.mattermost.com/messaging/organizing-conversations.html) is currently in beta. Before enabling the feature, please ensure you are well versed in the [known issues](https://docs.mattermost.com/messaging/organizing-conversations.html#known-issues),  particularly relating to database resource requirements and server performance implications. If you cannot easily scale up your database size, or are running the Mattermost application server and database server on the same machine, we recommended waiting to enable Collapsed Reply Threads until it is [promoted to general availability in Q2 2022](https://mattermost.com/blog/collapsed-reply-threads-ga/). Learn more about these [performance considerations here](https://support.mattermost.com/hc/en-us/articles/4413183568276).
 - The server version for v5.38.2 for Team Edition is reported as ``5.39.2``.
 - Deleted posts get displayed in channels without new activity after the data retention job is run [MM-36574](https://mattermost.atlassian.net/browse/MM-36574).
 - Adding an at-mention at the start of a post draft and pressing the leftwards or rightwards arrow can clear the post draft and the undo history [MM-33823](https://mattermost.atlassian.net/browse/MM-33823).
 - Emoji counter in the center channel doesn't always update immediately when a reaction is added in the right-hand side [MM-31994](https://mattermost.atlassian.net/browse/MM-31994).
 - Fields on the right column in a message attachment render unevenly [MM-36943](https://mattermost.atlassian.net/browse/MM-36943).
 - Pinned posts are no longer highlighted.
 - Google login fails on the Classic mobile apps.
 - Status may sometimes get stuck as **Away** or **Offline** in High Availability mode with IP Hash turned off.
 - Searching stop words in quotation marks with Elasticsearch enabled returns more than just the searched terms.
 - The team sidebar on the desktop app does not update when channels have been read on mobile.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.

### Contributors
 - [Adovenmuehle](https://github.com/Adovenmuehle), [aeomin](https://github.com/aeomin), [agarciamontoro](https://github.com/agarciamontoro), [AGMETEOR](https://github.com/AGMETEOR), [agnivade](https://github.com/agnivade), [ahmaddanialmohd](https://github.com/ahmaddanialmohd), [aileenpalafox](https://github.com/aileenpalafox), [amyblais](https://github.com/amyblais), [amynicol1985](https://github.com/amynicol1985), [angeloskyratzakos](https://github.com/angeloskyratzakos), [anurag6713](https://github.com/anurag6713), [arjitc](https://github.com/arjitc), [arvinDarmawan](https://github.com/arvinDarmawan), [asaadmahmood](https://github.com/asaadmahmood), [ashishbhate](https://github.com/ashishbhate), [AshishDhama](https://github.com/AshishDhama), [aspleenic](https://github.com/aspleenic), [avinashlng1080](https://github.com/avinashlng1080), [bakurits](https://github.com/bakurits), [bbodenmiller](https://github.com/bbodenmiller), [BenCookie95](https://github.com/BenCookie95), [calebroseland](https://github.com/calebroseland), [chenilim](https://github.com/chenilim), [chikei](https://github.com/chikei), [cognvn](https://github.com/cognvn), [colorfusion](https://github.com/colorfusion), [coltoneshaw](https://github.com/coltoneshaw), [cpanato](https://github.com/cpanato), [cpoile](https://github.com/cpoile), [crspeller](https://github.com/crspeller), [ctlaltdieliet](https://github.com/ctlaltdieliet), [cwarnermm](https://github.com/cwarnermm), [darkLord19](https://github.com/darkLord19), [deanwhillier](https://github.com/deanwhillier), [devinbinnie](https://github.com/devinbinnie), [ditsemto](https://github.com/ditsemto), [DSchalla](https://github.com/DSchalla), [enahum](https://github.com/enahum), [enelson720](https://github.com/enelson720), [engineereng](https://github.com/engineereng), [esethna](https://github.com/esethna), [evelikov](https://github.com/evelikov), [ewwollesen](https://github.com/ewwollesen), [flynbit](https://github.com/flynbit), [furqanmlk](https://github.com/furqanmlk), [gabrieljackson](https://github.com/gabrieljackson), [gbonnefille](https://github.com/gbonnefille), [gigawhitlocks](https://github.com/gigawhitlocks), [gruceqq](https://translate.mattermost.com/user/gruceqq/), [hackercat3211](https://github.com/hackercat3211), [hahmadia](https://github.com/hahmadia), [hanzei](https://github.com/hanzei), [harshilsharma63](https://github.com/harshilsharma63), [hectorskypl](https://github.com/hectorskypl), [hmhealey](https://github.com/hmhealey), [iomodo](https://github.com/iomodo), [isacikgoz](https://github.com/isacikgoz), [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais), [jayaddison-collabora](https://github.com/jayaddison-collabora), [jespino](https://github.com/jespino), [jfrerich](https://github.com/jfrerich), [johnsonbrothers](https://github.com/johnsonbrothers), [josephbaylon](https://github.com/josephbaylon), [jprusch](https://github.com/jprusch), [justinegeffen](https://github.com/justinegeffen), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [kamre](https://github.com/kamre), [kayazeren](https://github.com/kayazeren), [Konghuy](https://github.com/Konghuy), [koox00](https://github.com/koox00), [larkox](https://github.com/larkox), [levb](https://github.com/levb), [lieut-data](https://github.com/lieut-data), [lindalumitchell](https://github.com/lindalumitchell), [lordinkavu](https://github.com/lordinkavu), [lynn915](https://github.com/lynn915), [madhavhugar](https://github.com/madhavhugar), [maisnamrajusingh](https://github.com/maisnamrajusingh), [majidsajadi](https://github.com/majidsajadi), [manojmalik20](https://github.com/manojmalik20), [marianunez](https://github.com/marianunez), [matthewbirtch](https://github.com/matthewbirtch), [matthew.williams](https://translate.mattermost.com/user/matthew-w/), [metanerd](https://github.com/metanerd), [mgdelacroix](https://github.com/mgdelacroix), [michaelgamble](https://github.com/michaelgamble), [michelengelen](https://github.com/michelengelen), [mickmister](https://github.com/mickmister), [mkraft](https://github.com/mkraft), [mlongo4290](https://github.com/mlongo4290), [mrckndt](https://github.com/mrckndt), [Mshahidtaj](https://github.com/Mshahidtaj), [N3rdP1um23](https://github.com/N3rdP1um23), [nat-gunner](https://github.com/nat-gunner), [natalie-hub](https://github.com/natalie-hub), [neallred](https://github.com/neallred), [nevyangelova](https://github.com/nevyangelova), [nickboldt](https://github.com/nickboldt), [nickmisasi](https://github.com/nickmisasi), [nika-begiashvili](https://github.com/nika-begiashvili), [nikolaizah](https://github.com/nikolaizah), [ogi-m](https://github.com/ogi-m), [oh6hay](https://github.com/oh6hay), [pablovelezvidal](https://github.com/pablovelezvidal), [papanireal](https://github.com/papanireal), [petrmifek](https://github.com/petrmifek), [Pezhvak](https://github.com/Pezhvak), [robinmetral](https://github.com/robinmetral), [rodcorsi](https://github.com/rodcorsi), [Roy-Orbison](https://github.com/Roy-Orbison), [sakaitsu](https://translate.mattermost.com/user/sakaitsu/), [saturninoabril](https://github.com/saturninoabril), [Sayanta66](https://github.com/Sayanta66), [source-punk](https://github.com/source-punk), [stafot](https://github.com/stafot), [stevemudie](https://github.com/stevemudie), [streamer45](https://github.com/streamer45), [stylianosrigas](https://github.com/stylianosrigas), [Szymongib](https://github.com/Szymongib), [thePanz](https://github.com/thePanz), [thierrymarianne](https://github.com/thierrymarianne), [tronginc](https://github.com/tronginc), [tsabi](https://translate.mattermost.com/user/tsabi/), [VA2XJM](https://github.com/VA2XJM), [wget](https://github.com/wget), [wiersgallak](https://github.com/wiersgallak), [wiggin77](https://github.com/wiggin77), [Willyfrog](https://github.com/Willyfrog), [xlanor](https://github.com/xlanor), [xuanvi26](https://github.com/xuanvi26), [yedamao](https://github.com/yedamao), [zefhemel](https://github.com/zefhemel)

## Release v5.37 - [Extended Support Release](https://docs.mattermost.com/administration/extended-support-release.html)

- **5.37.10, released 2022-08-31**
  - Improved groups query performance by not counting deleted members.
  - Prevented the request for counting channel members in a group when the feature is disabled to prevent performance problems at scale.
- **v5.37.9, released 2022-03-10**
  - Mattermost v5.37.9 contains medium severity level security fixes. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).
- **v5.37.8, released 2022-02-03**
  - Mattermost v5.37.8 contains medium level security fixes. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).
  - The default for ``ThreadAutoFollow`` has been changed to ``false``. This does not affect existing configurations where this value is already set to ``true`` [MM-41351](https://mattermost.atlassian.net/browse/MM-41351). 
  - Prevented some instances where operations relating to Collapsed Reply Threads added load to the database server even when the ``ThreadAutoFollow`` and ``CollapsedThreads`` config settings were disabled [MM-41350](https://mattermost.atlassian.net/browse/MM-41350).
  - ``.pages`` content search is no longer available due to technical difficulties.
  - Fixed an issue where Actiance compliance jobs caused the Mattermost server process to crash with a panic [MM-41245](https://mattermost.atlassian.net/browse/MM-41245).
- **v5.37.7, released 2022-01-21**
  - Mattermost v5.37.7 contains a medium level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).
  - Added support for channel moderation for Professional-licensed servers [MM-40824](https://mattermost.atlassian.net/browse/MM-40824). 
- **v5.37.6, released 2021-12-17**
  - Mattermost v5.37.6 contains medium level security fixes. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).
  - Added a general performance fix for loading the web application and typing.
  - Improved performance while typing by moving some autocomplete layout calculations.
  - Improved performance by reducing DOM usage during render.
  - Removed real-time updates of a couple of features to prevent overloading servers on user updates. The "This channel contains guests" indicator and the number of timezones displayed when notifying members of a group will only be updated on channel change now.
- **v5.37.5, released 2021-11-30**
  - Fixed an issue where OpenID redirect did not work when hosting Mattermost on a subdirectory [MM-40151](https://mattermost.atlassian.net/browse/MM-40151).
  - Fixed an issue where v5.37 reported an incorrect mmctl version.
- **v5.37.4, released 2021-11-15**
  - Mattermost v5.37.4 contains a medium level security fix. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).
  - Fixed a potential panic during the message export job [MM-39521](https://mattermost.atlassian.net/browse/MM-39521).
  - Fixed some sentry crashes [MM-38565](https://mattermost.atlassian.net/browse/MM-38565), [MM-39208](https://mattermost.atlassian.net/browse/MM-39208).
  - Updated in-product help documentation to fix broken links and to correct outdated information.
- **v5.37.3, released 2021-10-27**
  - Mattermost v5.37.3 contains a medium level security fix. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).
  - Fixed a race condition in telemetry IDs on High Availability servers [MM-39343](https://mattermost.atlassian.net/browse/MM-39343).
  - Fixed import process for imports with attachments [MM-38375](https://mattermost.atlassian.net/browse/MM-38375).
  - Fixed an issue that kept message attachment fields unaligned [MM-36943](https://mattermost.atlassian.net/browse/MM-36943).
- **v5.37.2, released 2021-08-26**
  - Upgraded Go version to 1.16.7 to fix an application crash issue. 
  - Fixed a server panic issue. [MM-37574](https://mattermost.atlassian.net/browse/MM-37574)
  - Fixed an issue where saving or updating user statuses caused the logs to be filled with multiple key insertion errors. [MM-37202](https://mattermost.atlassian.net/browse/MM-37202).
  - Fixed a panic in the ``getPrevTrialLicense`` API request when loading the System Console on Team Edition. [MM-37108](https://mattermost.atlassian.net/browse/MM-37108)
  - Fixed an issue where screen readers read “user object” instead of reading the username or channel in the **Switch Channels** modal.
- **v5.37.1, released 2021-08-04**
  - Mattermost v5.37.1 contains a medium level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).
  - Improved typing performance in affected environments by reducing the frequency at which drafts are saved.
  - Fixed an issue in clustering where a mutex would fail to be unlocked when a timeout happened. [MM-37246](https://mattermost.atlassian.net/browse/MM-37246)
- **v5.37.0, released 2021-07-16**
  - Original 5.37.0 release

### Deprecations
 - The ``platform`` binary and “--platform” flag have been removed. If you are using the “--platform” flag or are using the ``platform`` binary directly to run the Mattermost server application via a systemd file or custom script, you will be required to use only the mattermost binary.

### Important Upgrade Notes
 - [Collapsed Reply Threads](https://mattermost.com/blog/collapsed-reply-threads-beta/) are available as beta in Mattermost Server v5.37 and later. It’s expected that you may experience bugs as we stabilize the feature. In particular, please be aware of [the known issues documented here](https://docs.mattermost.com/messaging/organizing-conversations.html#known-issues).
 - v5.37 adds support for emoji standard v13.0. If you have added a custom emoji in the past that uses one of the new system names, then that custom emoji is going to get overwritten by the system emoji. The workaround is to change the custom emoji name.
 - Parts of Incident Collaboration are now available to all Mattermost editions. As part of this update, Incident Collaboration will require a minimum server version of v5.37. To learn more about what is available in each edition, visit [our pricing page](https://mattermost.com/pricing-self-managed/).
 - Support for Mattermost Server v5.31 [Extended Support Release](https://docs.mattermost.com/administration/extended-support-release.html) will come to the end of its life cycle on October 15, 2021. Upgrading to Mattermost Server v5.37 or later is required.
 - [Collapsed Reply Threads](https://docs.mattermost.com/messaging/organizing-conversations.html), available in beta, are known to have a negative impact on server performance. If you cannot easily scale up and tune your database, or if you are running the Mattermost application server and database server on the same machine, we recommended disabling [``ThreadAutoFollow``](https://docs.mattermost.com/configure/configuration-settings.html#automatically-follow-threads) and [``CollapsedThreads``](https://docs.mattermost.com/configure/configuration-settings.html#collapsed-reply-threads-beta) until Collapsed Reply Threads is promoted to general availability in Q2 2022. Learn more about these [performance considerations here](https://support.mattermost.com/hc/en-us/articles/4413183568276).

**IMPORTANT:** If you upgrade from a release earlier than v5.36, please read the other [Important Upgrade Notes](https://docs.mattermost.com/administration/important-upgrade-notes.html).

### Highlights

#### Collapsed Reply Threads (Beta)
 - We're excited to give you early access to Collapsed Reply Threads (Beta). It can be enabled in the **System Console > Experimental > Collapsed Reply Threads (Beta)**. Learn more about the features and known issues in [our documentation](https://docs.mattermost.com/help/messaging/organizing-conversations.html).

#### Emoji Enhancements with Skin Tone Selection
 - Added support for emoji standard v13.0. Users now have the ability to choose various skin tones using the Mattermost emoji picker. Mobile support is included in v1.45 Mobile App release (July 16th).

#### Improved Enterprise Trial Experience (Enterprise Editions E0, E10, E20)
 - After a Self-Managed trial ends, admins can optionally contact sales or make a purchase in a single click.

#### Focalboard: Grouped Table view, New properties, and More (Beta)
 - Focalboard tables can now be grouped by a property, for example allowing you to quickly see tasks per epic or owner.

#### Incident Collaboration Updates
 - The update includes availability on all editions, playbook keyword monitoring, retrospective report, and playbook dashboard.

#### English-Australian Language Support
 - Mattermost is now available in English-Australian.

### Improvements

#### User Interface (UI)
 - In the at-mention autocomplete, the user’s nickname is no longer shown when (you) is present.
 - Updated the help text on the **Add Users** channel modal.
 - Added the ability to upload ``.jpeg`` files on Linux. Uploading ``.jpg`` files was already supported.
 - The **Channel Switcher** now displays recently viewed channels when launched.
 - Polish, German, and Italian languages were downgraded to beta as they are [no longer actively maintained](https://handbook.mattermost.com/contributors/contributors/localization#translation-quality).
 - Custom statuses can now be set to expire after common time intervals or custom selected dates and times. Mobile App support will be added in a future release.

#### Performance
 - Added some improvements to typing performance.

#### Administration
 - Improved memory performance for large image uploads, particularly PNGs with transparency.
 - Optimized the bulk import process by no longer requiring the server to write the incoming archive to the filesystem when unzipping it.
 - Added channel restore and channel privacy change endpoints to the local mode using the System bot.

### Bug Fixes
 - Fixed an issue where users were unable to set a custom status emoji via slash command. Added the logic for detecting unicode emoji and setting it as a custom status emoji via slash commands.
 - Fixed an issue where messages with fallback text were repeated.
 - Fixed an issue where a persistent unread badge showed on the **Main Menu** when **Enable Marketplace** or **Enable Plugins** was disabled.
 - Fixed an issue where sidebar icons were not aligned with the navigator area icons.
 - Fixed an issue where using CTRL+F in a **Direct Message** channel added the user ID rather than the user's name into the search field.
 - Fixed an issue where user icons were displayed at full opacity in muted channels.
 - Fixed an issue where a redundant ``user_update`` websocket event was generated for bot users.
 - Fixed an issue where a Self-Managed Enterprise Edition E20 trial could be activated more than once without contacting the Mattermost support team.

### config.json
Multiple setting options were added to ``config.json``. Below is a list of the additions and their default values on install. The settings can be modified in ``config.json``, or the System Console when available.

#### Changes to Team Edition and Enterprise Edition:
 - Under ``ServiceSettings`` in ``config.json``:
    - Added ``CollapsedThreads`` to add support for Collapsed Reply Threads (Beta).

#### Database Changes
 - Removed several redundant Database indexes.

### API Changes
 - Added a new field, team_id, to the response of ``POST api/v4/groups/{group_id}/channels/{channel_id}/link`` to add a team ID to the response when linking a channel to a group.
 - Added an optional ``collapsed_threads_supported`` parameter to /channels/members/{userId}/view to indicate that the client supports collapsed threads.
 - Added an optional ``collapsed_threads_supported`` parameter to /users/{userId}/posts/{postId}/set_unread to indicate that the client supports collapsed threads.
 - Updated the webapp to pass ``collapsed_threads_supported`` parameters to the server to indicate that the webapp supports collapsed reply threads.
 - Updated the webapp to correctly mark channels and threads as unread/read when marking root and reply posts as unread/read.
 - Added a new endpoint ``GET /trial-license/prev`` for fetching last used trial license.
 - Added two new fields in ``CustomStatus`` struct and modified the APIs to validate and handle them.

### Go Version
 - v5.37 is built with Go ``1.15.5``.

### Open Source Components
 - Removed ``reselect`` from https://github.com/mattermost/mattermost-webapp/.

### Upcoming Deprecations in Mattermost v6.0

The following deprecations are planned for the Mattermost v6.0 release, which is scheduled for 2021/10/15. This list is subject to change prior to the release.

1. [Legacy Command Line Tools](https://docs.mattermost.com/administration/command-line-tools.html). All commands have been fully replaced by [mmctl](https://docs.mattermost.com/administration/mmctl-cli-tool.html) and new commands have been added over the last few months, making this tool a full and robust replacement. 

2. [Slack Import via the web app](https://docs.mattermost.com/administration/migrating.html?highlight=mmetl#migrating-from-slack-using-the-mattermost-web-app). The Slack import tool accessible via the Team Setting menu is being replaced by the [mmetl](https://docs.mattermost.com/administration/migrating.html#migrating-from-slack-using-the-mattermost-mmetl-tool-and-bulk-import) tool that is much more comprehensive for the types of data it can assist in uploading. 

3. MySQL versions below 5.7.7. Minimum support will now be for 5.7.12. This version introduced a native JSON data type that lets us improve performance and scalability of several database fields (most notably Users and Posts props). Additionally, version 5.6 (our current minimum version) reached [EOL in February 2021](https://www.mysql.com/support/eol-notice.html).

4. Elasticsearch 5 and 6 - [versions 5.x reached EOL in March of 2019, and versions 6.x reached EOL in November 2020](https://www.elastic.co/support/eol). Our minimal supported version with Mattermost v6.0 will be Elasticsearch version 7.0.

5. Windows 7 reached [EOL in January 2020](https://support.microsoft.com/en-us/windows/windows-7-support-ended-on-january-14-2020-b75d4580-2cc7-895a-2c9c-1466d9a53962). We will no longer provide support for the Desktop App issues on Windows 7.

6. [DisableLegacyMFA](https://docs.mattermost.com/configure/configuration-settings.html#disable-legacy-mfa-api-endpoint) configuration setting.

7. [ExperimentalTimezone](https://docs.mattermost.com/configure/configuration-settings.html#timezone) configuration setting.

8. All legacy channel sidebar experimental configuration settings. We encourage customers using these settings to upgrade to v5.32 or later to access [custom, collapsible channel categories](https://mattermost.com/blog/custom-collapsible-channel-categories/) among many other channel organization features. The settings being deprecated include:

   - [EnableLegacySidebar](https://docs.mattermost.com/administration/config-settings.html#enable-legacy-sidebar)
   - [ExperimentalTownSquareIsReadOnly](https://docs.mattermost.com/administration/config-settings.html#town-square-is-read-only-experimental)
   - [ExperimentalHideTownSquareinLHS](https://docs.mattermost.com/administration/config-settings.html#town-square-is-hidden-in-left-hand-sidebar-experimental)
   - [EnableXToLeaveChannelsFromLHS](https://docs.mattermost.com/administration/config-settings.html#enable-x-to-leave-channels-from-left-hand-sidebar-experimental)
   - [CloseUnusedDirectMessages](https://docs.mattermost.com/administration/config-settings.html#autoclose-direct-messages-in-sidebar-experimental)
   - [ExperimentalChannelOrganization](https://docs.mattermost.com/administration/config-settings.html#sidebar-organization)
   - [ExperimentalChannelSidebarOrganization](https://docs.mattermost.com/administration/config-settings.html#experimental-sidebar-features)

9. [All configuration settings previously marked as “Deprecated”](https://docs.mattermost.com/administration/config-settings.html#deprecated-configuration-settings).

10. Changes to ``mattermost-server/model`` for naming consistency.

### Known Issues
 - [Collapsed Reply Threads](https://docs.mattermost.com/messaging/organizing-conversations.html) is currently in beta. Before enabling the feature, please ensure you are well versed in the [known issues](https://docs.mattermost.com/messaging/organizing-conversations.html#known-issues),  particularly relating to database resource requirements and server performance implications. If you cannot easily scale up your database size, or are running the Mattermost application server and database server on the same machine, we recommended waiting to enable Collapsed Reply Threads until it is [promoted to general availability in Q2 2022](https://mattermost.com/blog/collapsed-reply-threads-ga/). Learn more about these [performance considerations here](https://support.mattermost.com/hc/en-us/articles/4413183568276).
 - When upgrading to 5.37.0, the Incident Collaboration plugin may not be automatically installed in some cases.
 - Add Members modal is incorrectly themed on the Mattermost Dark theme [MM-37220](https://mattermost.atlassian.net/browse/MM-37220).
 - ``config.json`` can reset when running the command ``systemctl restart mattermost``, and when running any commands that write to the config (e.g. ``config`` or ``plugin``) [MM-33752](https://mattermost.atlassian.net/browse/MM-33752), [MM-32390](https://mattermost.atlassian.net/browse/MM-32390).
 - Adding an at-mention at the start of a post draft and pressing the leftwards or rightwards arrow can clear the post draft and the undo history [MM-33823](https://mattermost.atlassian.net/browse/MM-33823).
 - Emoji counter in the center channel doesn't always update immediately when a reaction is added in the right-hand side [MM-31994](https://mattermost.atlassian.net/browse/MM-31994).
 - Fields on the right column in a message attachment render unevenly [MM-36943](https://mattermost.atlassian.net/browse/MM-36943).
 - Pinned posts are no longer highlighted.
 - Google login fails on the Classic mobile apps.
 - Status may sometimes get stuck as **Away** or **Offline** in High Availability mode with IP Hash turned off.
 - Searching stop words in quotation marks with Elasticsearch enabled returns more than just the searched terms.
 - The team sidebar on the desktop app does not update when channels have been read on mobile.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.

### Contributors
 - [aaronrothschild](https://github.com/aaronrothschild), [Aashimalik](https://github.com/Aashimalik), [Adovenmuehle](https://github.com/Adovenmuehle), [aedott](https://github.com/aedott), [aeomin](https://github.com/aeomin), [agarciamontoro](https://github.com/agarciamontoro), [AGMETEOR](https://github.com/AGMETEOR), [agnivade](https://github.com/agnivade), [ahmaddanialmohd](https://github.com/ahmaddanialmohd), [ahmadkarlam](https://github.com/ahmadkarlam), [amyblais](https://github.com/amyblais), [amynicol1985](https://github.com/amynicol1985), [angeloskyratzakos](https://github.com/angeloskyratzakos), [anurag6713](https://github.com/anurag6713), [arvinDarmawan](https://github.com/arvinDarmawan), [asaadmahmood](https://github.com/asaadmahmood), [ashishbhate](https://github.com/ashishbhate), [AshishDhama](https://github.com/AshishDhama), [aspleenic](https://github.com/aspleenic), [balan2010](https://github.com/balan2010), [BenCookie95](https://github.com/BenCookie95), [berkeka](https://github.com/berkeka), [calebroseland](https://github.com/calebroseland), [catalintomai](https://github.com/catalintomai), [cedricziel](https://github.com/cedricziel), [chenilim](https://github.com/chenilim), [chetanyakan](https://github.com/chetanyakan), [chikei](https://github.com/chikei), [cognvn](https://github.com/cognvn), [coltoneshaw](https://github.com/coltoneshaw), [cpanato](https://github.com/cpanato), [cpoile](https://github.com/cpoile), [crspeller](https://github.com/crspeller), [ctlaltdieliet](https://github.com/ctlaltdieliet), [cwarnermm](https://github.com/cwarnermm), [danielsischy](https://github.com/danielsischy), [darkLord19](https://github.com/darkLord19), [dbpolito](https://github.com/dbpolito), [devinbinnie](https://github.com/devinbinnie), [elsiehupp](https://github.com/elsiehupp), [elyscape](https://github.com/elyscape), [emilyacook](https://github.com/emilyacook), [enahum](https://github.com/enahum), [enelson720](https://github.com/enelson720), [esethna](https://github.com/esethna), [EugenMayer](https://github.com/EugenMayer), [ewwollesen](https://github.com/ewwollesen), [flynbit](https://github.com/flynbit), [furqanmlk](https://github.com/furqanmlk), [gabrieljackson](https://github.com/gabrieljackson), [gigawhitlocks](https://github.com/gigawhitlocks), [gruceqq](https://translate.mattermost.com/user/gruceqq/), [haardikdharma10](https://github.com/haardikdharma10), [hahmadia](https://github.com/hahmadia), [hanzei](https://github.com/hanzei), [harshilsharma63](https://github.com/harshilsharma63), [hason](https://github.com/hason), [hectorskypl](https://github.com/hectorskypl), [hmhealey](https://github.com/hmhealey), [ialorro](https://github.com/ialorro), [icelander](https://github.com/icelander), [iomodo](https://github.com/iomodo), [isacikgoz](https://github.com/isacikgoz), [it33](https://github.com/it33), [itao](https://github.com/itao), [jamiehurewitz](https://github.com/jamiehurewitz), [jasonblais](https://github.com/jasonblais), [jayaddison-collabora](https://github.com/jayaddison-collabora), [jespino](https://github.com/jespino), [jfrerich](https://github.com/jfrerich), [JoelRummel](https://github.com/JoelRummel), [Johennes](https://github.com/Johennes), [johnsonbrothers](https://github.com/johnsonbrothers), [josephbaylon](https://github.com/josephbaylon), [jplda23](https://github.com/jplda23), [jprusch](https://github.com/jprusch), [jufab](https://github.com/jufab), [justinegeffen](https://github.com/justinegeffen), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [kamre](https://github.com/kamre), [kayazeren](https://github.com/kayazeren), [koox00](https://github.com/koox00), [larkox](https://github.com/larkox), [levb](https://github.com/levb), [lieut-data](https://github.com/lieut-data), [lindalumitchell](https://github.com/lindalumitchell), [lynn915](https://github.com/lynn915), [M-ZubairAhmed](https://github.com/M-ZubairAhmed), [madhavhugar](https://github.com/madhavhugar), [maisnamrajusingh](https://github.com/maisnamrajusingh), [majidsajadi](https://github.com/majidsajadi), [manojmalik20](https://github.com/manojmalik20), [matheusmosca](https://github.com/matheusmosca), [matt-w99](https://github.com/matt-w99), [matthewbirtch](https://github.com/matthewbirtch), [maxerenberg](https://github.com/maxerenberg), [metanerd](https://github.com/metanerd), [mgdelacroix](https://github.com/mgdelacroix), [michelengelen](https://github.com/michelengelen), [mickmister](https://github.com/mickmister), [migbot](https://github.com/migbot), [mkraft](https://github.com/mkraft), [mlongo4290](https://github.com/mlongo4290), [moussetc](https://github.com/moussetc), [MrLemur](https://github.com/MrLemur), [msal4](https://github.com/msal4), [MusiCode1](https://github.com/MusiCode1), [naderm11](https://github.com/naderm11), [neallred](https://github.com/neallred), [nevyangelova](https://github.com/nevyangelova), [ogi-m](https://github.com/ogi-m), [pablovelezvidal](https://github.com/pablovelezvidal), [parsaakbari1209](https://github.com/parsaakbari1209), [prakharporwal](https://github.com/prakharporwal), [prathers](https://github.com/prathers), [rbradleyhaas](https://github.com/rbradleyhaas), [rodcorsi](https://github.com/rodcorsi), [rohit1101](https://github.com/rohit1101), [sadohert](https://github.com/sadohert), [sakaitsu](https://github.com/sakaitsu), [saturninoabril](https://github.com/saturninoabril), [Sayanta66](https://github.com/Sayanta66), [sbishel](https://github.com/sbishel), [senylove1403](https://github.com/senylove1403), [srkgupta](https://github.com/srkgupta), [stafot](https://github.com/stafot), [streamer45](https://github.com/streamer45), [stylianosrigas](https://github.com/stylianosrigas), [Szymongib](https://github.com/Szymongib), [teresa-novoa](https://github.com/teresa-novoa), [thePanz](https://github.com/thePanz), [tsabi](https://translate.mattermost.com/user/tsabi), [txeli](https://github.com/txeli), [wget](https://github.com/wget), [wiersgallak](https://github.com/wiersgallak), [wiggin77](https://github.com/wiggin77), [Willyfrog](https://github.com/Willyfrog), [yulyanaR](https://github.com/yulyanaR)

## Release v5.36 - [Feature Release](https://docs.mattermost.com/administration/release-definitions.html#feature-release)

- **v5.36.2, released 2021-08-04**
  - Mattermost v5.36.2 contains a medium level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
- **v5.36.1, released 2021-06-21**
  - Mattermost v5.36.1 contains a high level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
  - Added performance improvements by reducing the time taken to re-render when a post is received.
- **v5.36.0, released 2021-06-16**
  - Original 5.36.0 release

Mattermost v5.36.0 contains a high level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

### Important Upgrade Notes
 - Gossip clustering mode is now in General Availability and is no longer available as an option. All cluster traffic will always use the gossip protocol. The config setting ``UseExperimentalGossip`` has no effect and has only been kept for compatibility purposes. The setting to use gossip has been removed from the System Console. **Note:** For High Availability upgrades, all nodes in the cluster must use a single protocol. If an existing system is not currently using gossip, one node in a cluster can't be upgraded while other nodes in the cluster use an older version. Customers must either use gossip for their High Availability upgrade, or customers must shut down all nodes, perform the upgrade, and then bring all nodes back up.

**IMPORTANT:** If you upgrade from a release earlier than v5.35, please read the other [Important Upgrade Notes](https://docs.mattermost.com/administration/important-upgrade-notes.html).

### Highlights

#### Focalboard (Beta)
 - Focalboard is now integrated with Mattermost as a beta feature in v5.36. To enable Focalboard, open the Marketplace from the sidebar menu, install the Focalboard plugin, then click on **Configure**, enable it, and save. Update your NGINX or Apache web proxy config following [these steps](https://github.com/mattermost/focalboard/discussions/566).

#### Incident Collaboration (Enterprise Edition E20)
 - Includes automated welcome message, team-wide playbook access, and permission control for playbook creation.

#### Hungarian Language Support (Beta)
 - Mattermost is now available in Hungarian.

### Improvements

#### User Interface (UI)
 - If message autoresponder is set, only one message is now sent to a given user irrespective of how many Direct Message messages the user receives.
 - Added status icons on **Add members** to channel and **Add members** to team lists.
 - Added a keyboard shortcut to focus on the Search bar and search in the current channel.
 - A search tip is now shown when scrolling back in a channel.
 - Improved the error text in the **Edit Channel Header** modal.
 - Added the ability to clear a custom status when only an emoji and no text is set.
 - Redesigned message notification emails.
 - When **Show online availability on profile images** is set to **Off**, the online status icon is hidden from the profile image in the center channel and the right-hand side view.

#### Performance
 - Added a performance improvement to the emoji picker overlay to improve typing performance.
 - Added performance improvements when receiving new posts.

#### Administration
 - ``TCP_NO_DELAY`` is disabled for Websocket connections to allow for higher throughput.
 - Compliance Monitoring CSV files are no longer limited to 30,000 rows.
 - The default value of the [Support Email](https://docs.mattermost.com/administration/config-settings.html#support-email) (previously ``_feedback@mattermost.com_``) has been removed. Admin Advisor will now prompt System Admins about missing configuration for the [Support Email](https://docs.mattermost.com/administration/config-settings.html#support-email). This value is required, and it ensures Mattermost account requests are sent to the correct team for resolution.
 - The **Marketplace** button in the **Main Menu** is now displayed if the user has the ``sysconsole_write_plugins`` permission.
 - Added new feature discoveries in the System Console, including Data Retention Policy and OpenID Connect.
 - Added basic intra-cluster communication support for plugins.
 - Improved error messages for ``/header`` and ``/purpose`` commands.
 - Team-restricted direct channel creation is now also applied to the backend. Previously, this was restricted to the frontend.
 - Refactored the config storing logic to improve its robustness and performance.
 - Added a visual grouping of related settings under AD/LDAP in the System Console.

### Bug Fixes
 - Fixed an issue where bulk export generated invalid Direct Message channels between deactivated users.
 - Fixed an issue where the custom status cleared slash commands on mobile.
 - Fixed an issue with an incorrect error message when trying to change handle via API to another one that already existed.
 - Fixed an issue where LDAP Group Sync didn't work when using SAML (ADFS) for authentication and AD/LDAP Group Sync unless ``EnableSyncWithLdapIncludeAuth`` was set to ``true``, which caused the ``AuthData`` to be stored in AD/LDAP format.
 - Fixed an issue where a user with 'No Access' permission could still access **Groups**, **Channels** and **Teams** configuration pages through a URL.
 - Fixed an issue where **Remove from channel** and **Remove Team Member** menu items were visible in a group-synced channel or team.
 - Fixed various bugs related to hardcoded theme colours.
 - Fixed UI issues related to hardcoded variables and misalignment of the channel header with the **Has guests** text.
 - Fixed an issue with SAML Sign-on where System Admins were unable to modify **Service Provider Login URL** unless ``VerifySignature`` was enabled.
 - Fixed a race condition where enabling plugins would result in spurious errors in the logs.
 - Fixed a bug where team member permissions were not updated after associating a team with a permission scheme.
 - Fixed the responses of the role by ID and all roles of API endpoints when the role was associated to channel schemes.
 - Removed sticky sidebar headings in favor of fixing nesting errors.
 - Fixed an issue where the **Close** button in the **Create New Category** modal was only visible on mouse hover.
 - Fixed a bug where session expiration was extended with activity regardless of what the config setting ``ServiceSettings.ExtendSessionLengthWithActivity`` was set to.
 - Fixed an issue where the ``idmigrate`` command did not update values if they were not already present as LDAP attributes in the ``config.json``.
 - Fixed an issue where the job scheduler server could miss a "changed leader" cluster event.
 - Fixed an issue where using ``Ctrl+Cmd+F`` on the MacOS Desktop App opened the search instead of full-screened the app.
 - Fixed an issue where the message input box was shadowed when uploading a file in the center channel.
 - Fixed an error caused by a post created with a non-string attachment field.
 - Fixed the opacity of the read state in the channel sidebar, as well as enhanced the opacity of the channel icon when the channel was unread.
 - Fixed an issue where users were unable to sign in with O365 authentication when the AuthData was formatted differently between Office365 OAuth and Office 365 OpenID.
 - Fixed an issue where custom emojis for custom statuses were not loaded on page refresh.
 - Fixed an issue where the “Set a status” placeholder in the profile popover was not correctly themed.
 - Fixed an issue where bots showed the integration owner's custom status in the post header in the right-hand side.

### config.json
Multiple setting options were added to ``config.json``. Below is a list of the additions and their default values on install. The settings can be modified in ``config.json``, or the System Console when available.

#### Changes to Team Edition and Enterprise Edition:
 - Under ``ComplianceSettings`` in ``config.json``:
     - Added a new config setting ``BatchSize``. Compliance Monitoring CSV files are no longer limited to 30,000 rows.
 - Under ``SupportSettings`` in ``config.json``:
     - ``SupportEmail`` default value is now empty instead of ``_feedback@mattermost.com_``.
 - Under ``LogSettings`` in ``config.json``:
     - A new setting ``EnableColor`` was added to ``LogSettings`` and ``NotificationLogSettings``. Non-JSON console logs will now be colored if that field is set to ``true``.
 - Under ``ServiceSettings`` in ``config.json``:
     - Added ``EnableReliableWebSockets``, to make WebSocket messages more reliable by bufferring messages during a connection loss and then re-transmitting all unsent messages when the connection is revived.

### API Changes
 - Added support to include config diff in audit records for the related API calls (``updateConfig`` and ``patchConfig``).
 - Response field names changed for experimental API ``GetAllSharedChannels`` to match the field names for other channels APIs.
 - Added a new function to the plugin API, ``RequestTrialLicense``.
 - The ``/ldap/sync`` endpoint now accepts a parameter ``include_removed_members`` which will force all LDAP group members back into the teams and channels synced to that group.
 - Added a new API endpoint to ``removeUserRecentCustomStatus POST /status/custom/recent/delete``.
 - Added ``GetGroupMemberUsers and GetGroupsBySource`` to the plugin API to add plugin support for user groups.
 - Added a new API endpoint ``POST /api/v4/saml/reset_auth_data`` to reset SAML users' AuthData field to their email.
 - Added new API endpoints:
    - ``GET    /data_retention/policies``
    - ``GET    /data_retention/policies_count``
    - ``POST   /data_retention/policies``
    - ``GET    /data_retention/policies/{policy_id}``
    - ``PATCH  /data_retention/policies/{policy_id}``
    - ``DELETE /data_retention/policies/{policy_id}``
    - ``GET    /data_retention/policies/{policy_id}/teams``
    - ``POST   /data_retention/policies/{policy_id}/teams``
    - ``DELETE /data_retention/policies/{policy_id}/teams``
    - ``POST   /data_retention/policies/{policy_id}/teams/search``
    -  ``GET    /data_retention/policies/{policy_id}/channels``
    - ``POST   /data_retention/policies/{policy_id}/channels``
    - ``DELETE /data_retention/policies/{policy_id}/channels``
    - ``POST   /data_retention/policies/{policy_id}/channels/search``
    - ``GET    /users/{user_id}/data_retention/team_policies``
    - ``GET    /users/{user_id}/data_retention/channel_policies``

### Go Version
 - v5.36 is built with Go ``1.15.5``.

### Open Source Components
 - Added ``lodash``, ``memoize-one``, and ``sass`` to https://github.com/mattermost/mattermost-webapp.
 - Added ``react-native-startup-time`` and removed ``react-native-status-bar-size`` from https://github.com/mattermost/mattermost-mobile.

### Upcoming Deprecations in Mattermost v6.0

The following deprecations are planned for the Mattermost v6.0 release, which is scheduled for 2021/10/15. This list is subject to change prior to the release.

1. [Legacy Command Line Tools](https://docs.mattermost.com/administration/command-line-tools.html). All commands have been fully replaced by [mmctl](https://docs.mattermost.com/administration/mmctl-cli-tool.html) and new commands have been added over the last few months, making this tool a full and robust replacement. 

2. [Slack Import via the web app](https://docs.mattermost.com/administration/migrating.html?highlight=mmetl#migrating-from-slack-using-the-mattermost-web-app). The Slack import tool accessible via the Team Setting menu is being replaced by the [mmetl](https://docs.mattermost.com/administration/migrating.html#migrating-from-slack-using-the-mattermost-mmetl-tool-and-bulk-import) tool that is much more comprehensive for the types of data it can assist in uploading. 

3. MySQL versions below 5.7.7. Minimum support will now be for 5.7.12. This version introduced a native JSON data type that lets us improve performance and scalability of several database fields (most notably Users and Posts props). Additionally, version 5.6 (our current minimum version) reached [EOL in February 2021](https://www.mysql.com/support/eol-notice.html).

4. Elasticsearch 5 and 6 - [versions 5.x reached EOL in March of 2019, and versions 6.x reached EOL in November 2020](https://www.elastic.co/support/eol). Our minimal supported version with Mattermost v6.0 will be Elasticsearch version 7.0.

5. Windows 7 reached [EOL in January 2020](https://support.microsoft.com/en-us/windows/windows-7-support-ended-on-january-14-2020-b75d4580-2cc7-895a-2c9c-1466d9a53962). We will no longer provide support for the Desktop App issues on Windows 7.

6. [DisableLegacyMFA](https://docs.mattermost.com/configure/configuration-settings.html#disable-legacy-mfa-api-endpoint) configuration setting.

7. [ExperimentalTimezone](https://docs.mattermost.com/configure/configuration-settings.html#timezone) configuration setting.

8. All legacy channel sidebar experimental configuration settings. We encourage customers using these settings to upgrade to v5.32 or later to access [custom, collapsible channel categories](https://mattermost.com/blog/custom-collapsible-channel-categories/) among many other channel organization features. The settings being deprecated include:

   - [EnableLegacySidebar](https://docs.mattermost.com/administration/config-settings.html#enable-legacy-sidebar)
   - [ExperimentalTownSquareIsReadOnly](https://docs.mattermost.com/administration/config-settings.html#town-square-is-read-only-experimental)
   - [ExperimentalHideTownSquareinLHS](https://docs.mattermost.com/administration/config-settings.html#town-square-is-hidden-in-left-hand-sidebar-experimental)
   - [EnableXToLeaveChannelsFromLHS](https://docs.mattermost.com/administration/config-settings.html#enable-x-to-leave-channels-from-left-hand-sidebar-experimental)
   - [CloseUnusedDirectMessages](https://docs.mattermost.com/administration/config-settings.html#autoclose-direct-messages-in-sidebar-experimental)
   - [ExperimentalChannelOrganization](https://docs.mattermost.com/administration/config-settings.html#sidebar-organization)
   - [ExperimentalChannelSidebarOrganization](https://docs.mattermost.com/administration/config-settings.html#experimental-sidebar-features)

9. [All configuration settings previously marked as “Deprecated”](https://docs.mattermost.com/administration/config-settings.html#deprecated-configuration-settings).

10. Changes to ``mattermost-server/model`` for naming consistency.
 
### Known Issues
 - Batched email notifications from a single post have incorrect title text [MM-36559](https://mattermost.atlassian.net/browse/MM-36559).
 - ``config.json`` can reset when running the command ``systemctl restart mattermost``, and when running any commands that write to the config (e.g. ``config`` or ``plugin``) [MM-33752](https://mattermost.atlassian.net/browse/MM-33752), [MM-32390](https://mattermost.atlassian.net/browse/MM-32390).
 - Adding an at-mention at the start of a post draft and pressing the leftwards or rightwards arrow can clear the post draft and the undo history [MM-33823](https://mattermost.atlassian.net/browse/MM-33823).
 - Emoji counter in the center channel doesn't always update immediately when a reaction is added in the right-hand side [MM-31994](https://mattermost.atlassian.net/browse/MM-31994).
 - Pinned posts are no longer highlighted.
 - Google login fails on the Classic mobile apps.
 - Status may sometimes get stuck as **Away** or **Offline** in High Availability mode with IP Hash turned off.
 - Searching stop words in quotation marks with Elasticsearch enabled returns more than just the searched terms.
 - The team sidebar on the desktop app does not update when channels have been read on mobile.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.

### Contributors
 - [aaronrothschild](https://github.com/aaronrothschild), [abdulsmapara](https://github.com/abdulsmapara), [adamjclarkson](https://github.com/adamjclarkson), [Adovenmuehle](https://github.com/Adovenmuehle), [aeomin](https://github.com/aeomin), [agarciamontoro](https://github.com/agarciamontoro), [agnivade](https://github.com/agnivade), [ahmaddanialmohd](https://github.com/ahmaddanialmohd), [ali-farooq0](https://github.com/ali-farooq0), [amyblais](https://github.com/amyblais), [angeloskyratzakos](https://github.com/angeloskyratzakos), [arjitc](https://github.com/arjitc), [asaadmahmood](https://github.com/asaadmahmood), [ashishbhate](https://github.com/ashishbhate), [avasconcelos114](https://github.com/avasconcelos114), [avddvd](https://github.com/avddvd), [awerries](https://github.com/awerries), [bbodenmiller](https://github.com/bbodenmiller), [bbuehrle](https://github.com/bbuehrle), [bradjcoughlin](https://github.com/bradjcoughlin), [cadavre](https://github.com/cadavre), [calebroseland](https://github.com/calebroseland), [catalintomai](https://github.com/catalintomai), [CEOehis](https://github.com/CEOehis), [chenilim](https://github.com/chenilim), [chikei](https://github.com/chikei), [chuttam](https://github.com/chuttam), [coltoneshaw](https://github.com/coltoneshaw), [cpanato](https://github.com/cpanato), [cpoile](https://github.com/cpoile), [craigwillis-mm](https://github.com/craigwillis-mm), [craph](https://github.com/craph), [crspeller](https://github.com/crspeller), [ctlaltdieliet](https://github.com/ctlaltdieliet), [cwarnermm](https://github.com/cwarnermm), [dantepippi](https://github.com/dantepippi), [dbejanishvili](https://github.com/dbejanishvili), [devinbinnie](https://github.com/devinbinnie), [ejose19](https://github.com/ejose19), [emilyhollinger](https://github.com/emilyhollinger), [enahum](https://github.com/enahum), [enelson720](https://github.com/enelson720), [esethna](https://github.com/esethna), [ethervoid](https://github.com/ethervoid), [ewwollesen](https://github.com/ewwollesen), [faase](https://github.com/faase), [fakela](https://github.com/fakela), [FlaviaBastos](https://github.com/FlaviaBastos), [flynbit](https://github.com/flynbit), [fmunshi](https://github.com/fmunshi), [Francois-D](https://github.com/Francois-D), [funkytwig](https://github.com/funkytwig), [gabrieljackson](https://github.com/gabrieljackson), [gigawhitlocks](https://github.com/gigawhitlocks), [gnello](https://github.com/gnello), [GrigalashviliT](https://github.com/GrigalashviliT), [gruceqq](https://translate.mattermost.com/user/gruceqq/), [grundleborg](https://github.com/grundleborg), [haardikdharma10](https://github.com/haardikdharma10), [hahmadia](https://github.com/hahmadia), [hannaparks](https://github.com/hannaparks), [hanzei](https://github.com/hanzei), [harshilsharma63](https://github.com/harshilsharma63), [hectorskypl](https://github.com/hectorskypl), [hmhealey](https://github.com/hmhealey), [hzeroo](https://github.com/hzeroo), [ialorro](https://github.com/ialorro), [iamsayantan](https://github.com/iamsayantan), [ikeohachidi](https://github.com/ikeohachidi), [iomodo](https://github.com/iomodo), [isacikgoz](https://github.com/isacikgoz), [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais), [jaydeland](https://github.com/jaydeland), [jespino](https://github.com/jespino), [jfrerich](https://github.com/jfrerich), [jgilliam17](https://github.com/jgilliam17), [Johennes](https://github.com/Johennes), [johnsonbrothers](https://github.com/johnsonbrothers), [josephbaylon](https://github.com/josephbaylon), [jprusch](https://github.com/jprusch), [JtheBAB](https://github.com/JtheBAB), [jupenur](https://github.com/jupenur), [justinegeffen](https://github.com/justinegeffen), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [kayazeren](https://github.com/kayazeren), [khos2ow](https://github.com/khos2ow), [kosgrz](https://github.com/kosgrz), [l0r3zz](https://github.com/l0r3zz), [larkox](https://github.com/larkox), [levb](https://github.com/levb), [lieut-data](https://github.com/lieut-data), [liusy182](https://github.com/liusy182), [lynn915](https://github.com/lynn915), [maciejnems](https://github.com/maciejnems), [marianunez](https://github.com/marianunez), [mbecca](https://github.com/mbecca), [metanerd](https://github.com/metanerd), [mgdelacroix](https://github.com/mgdelacroix), [michaelschiffmm](https://github.com/michaelschiffmm), [mickmister](https://github.com/mickmister), [migbot](https://github.com/migbot), [mkraft](https://github.com/mkraft), [mlongo4290](https://github.com/mlongo4290), [mterhar](https://github.com/mterhar), [nadalfederer](https://github.com/nadalfederer), [NassimBounouas](https://github.com/NassimBounouas), [natalie-hub](https://github.com/natalie-hub), [nathanaelhoun](https://github.com/nathanaelhoun), [nevyangelova](https://github.com/nevyangelova), [pankajhirway](https://github.com/pankajhirway), [petya-v](https://github.com/petya-v), [pradeepmurugesan](https://github.com/pradeepmurugesan), [prapti](https://github.com/prapti), [psy-q](https://github.com/psy-q), [Qujja](https://github.com/Qujja), [reflog](https://github.com/reflog), [rodcorsi](https://github.com/rodcorsi), [sakaitsu](https://github.com/sakaitsu), [saturninoabril](https://github.com/saturninoabril), [sbishel](https://github.com/sbishel), [shibasisp](https://github.com/shibasisp), [Shivam010](https://github.com/Shivam010), [shred86](https://github.com/shred86), [spirosoik](https://github.com/spirosoik), [streamer45](https://github.com/streamer45), [stylianosrigas](https://github.com/stylianosrigas), [sudheerDev](https://github.com/sudheerDev), [thefactremains](https://github.com/thefactremains), [TheoVitkovskiy](https://github.com/TheoVitkovskiy), [thePanz](https://github.com/thePanz), [ThiefMaster](https://github.com/ThiefMaster), [tomasmik](https://github.com/tomasmik), [tsabi](https://translate.mattermost.com/user/tsabi), [uhlhosting](https://github.com/uhlhosting), [vesari](https://github.com/vesari), [wget](https://github.com/wget), [wiersgallak](https://github.com/wiersgallak), [wiggin77](https://github.com/wiggin77), [Willyfrog](https://github.com/Willyfrog)

## Release v5.35 - [Feature Release](https://docs.mattermost.com/administration/release-definitions.html#feature-release)

- **v5.35.5, released 2021-08-04**
  - Mattermost v5.35.5 contains a medium level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
- **v5.35.4, released 2021-06-21**
  - Mattermost v5.35.4 contains a high level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
- **v5.35.3, released 2021-06-11**
  - Mattermost v5.35.3 contains a high level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
  - Fixed an issue where missing query parameters in the datasource could cause MySQL servers to crash on startup. [MM-36236](https://mattermost.atlassian.net/browse/MM-36236)
  - Added performance improvements to the emoji picker overlay to improve typing performance and reduced the time taken to re-render when a post is received.
- **v5.35.2, released 2021-06-03**
  - Fixed an issue where subsequent migrations failed to run after running a dot release on new installations. [MM-35931](https://mattermost.atlassian.net/browse/MM-35931)
  - Fixed an issue where the server would crash if content extractor dependencies for PDFs were not present. [MM-35990](https://mattermost.atlassian.net/browse/MM-35990)
  - Fixed an issue where the setting to allow disabling link previews from certain domains was grayed out in the System Console. [MM-35796](https://mattermost.atlassian.net/browse/MM-35796)
  - Fixed an issue where SMTP showed a permission error when upgrading from version < 5.35 to 5.35 or greater. [MM-35861](https://mattermost.atlassian.net/browse/MM-35861)
  - Fixed an issue with extracting OpenDocument Text files as part of content extraction. [MM-36103](https://mattermost.atlassian.net/browse/MM-36103)
- **v5.35.1, released 2021-05-18**
  - Fixed an issue where 5.35.0 migration failed on MySQL installations with an "invalid connection" error due to an issue with the ``readTimeout`` parameter in ``SqlSettings.DataSource`` (default is 30 seconds). The ``readTimeout`` datasource query parameter is now being ignored and the application provided ``SqlSettings.QueryTimeout`` should be used instead. [MM-35767](https://mattermost.atlassian.net/browse/MM-35767)
- **v5.35.0, released 2021-05-16**
  - Original 5.35.0 release

Mattermost v5.35.0 contains low and medium level security fixes. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

#### Important Upgrade Notes
   - Due to the introduction of backend database architecture required for upcoming new features, including Shared Channels and Collapsed Reply Threads, the performance of the migration process for the v5.35 release (May 16, 2021) has been noticeably affected. Depending on the size, type, and version of the database, longer than usual upgrade times should be expected. This can vary from a couple of minutes (average case) to hours (worst case, MySQL 5.x only). A moderate to significant spike in database CPU usage should also be expected during this process. [More details on the performance impact of the migration and possible mitigation strategies are provided here](https://gist.github.com/streamer45/9aee4906639a49ebde68b2f3c0f924c1).
   - v5.35.0 introduces a new feature to search for files. Search results for files shared in the past may be incomplete until a [content extraction command](https://docs.mattermost.com/administration/command-line-tools.html#mattermost-extract-documents-content) is executed to extract and index the content of files already in the database. Instances running Elasticsearch or Bleve search backends will also need to execute a Bulk Indexing after the content extraction is complete. Please see more details in [this blog post](https://mattermost.com/blog/file-search/).
   - The existing password generation logic used during the bulk user import process was comparatively weak. Hence it's advised for admins to immediately reset the passwords for all the users who were generated during the bulk import process and whose password has not been changed even once.
   - In the v5.38 release (August 16, 2021), we will deprecate "config watcher" (the mechanism that automatically reloads the ``config.json file``), in favor of an mmctl command that will need to be run to apply configuration changes after they are made. This change will improve configuration performance and robustness.

**IMPORTANT:** If you upgrade from a release earlier than v5.34, please read the other [Important Upgrade Notes](https://docs.mattermost.com/administration/important-upgrade-notes.html).

### Highlights

#### Apps Framework (Developer Preview)
 - Apps Framework is a new way to integrate with external tools, and allows developers to create interactive apps in Mattermost, using any development language they're comfortable with. The new apps work seamlessly across mobile and desktop clients. This is a developer preview and is not intended for production instances of Mattermost yet. This feature is available for self-managed customers with v5.35 when the Apps Framework Plugin is loaded on an instance. Learn more: https://developers.mattermost.com/integrate/apps/.

#### Search for files and document contents
 - Searching in Mattermost now finds both relevant messages and files in your team’s conversation history. Search will return results for attachments that match the file name or contain matching text content within supported document types. [Learn more](https://mattermost.com/blog/file-search/).

#### Granular Access to System Console Pages (Enterprise E20 Edition)
 - Migrated **Experimental**, **About**, **Reporting**, **Environment**, **Site Configuration**, **Authentication**, **Integrations**, and **Compliance** sections to their respective sub-section permissions.

#### Shared Channels (Experimental, Enterprise Edition E20)
 - Experimental support added for sharing channels between Mattermost clusters. Requires an Enterprise Edition E20 license. The Shared Channels feature is disabled by default.

#### Enterprise Trial Enhancements (Enterprise E20 Edition)
 - Added banners to alert System Admins when an Enterprise Edition E20 trial has started, when there are three days left of the trial, and when the trial is on the last day.

#### Incident Collaboration (Enterprise Edition E20)
 - Updated prepackaged Incident Collaboration plugin with to include ad hoc tasks, stakeholder overview, and more.

### Improvements

#### User Interface (UI)
 - Added support to collapse in-line images over 100px in height.
 - Implemented maximum length validation on the status modal for custom statuses.
 - Synchronized collapsed channel sidebar categories on the server to keep category collapse states in-sync across devices.
 - Empty state is no longer off-centered in the **Channel Switcher**.
 - Ephemeral message created from call response ``markdown`` field is now posted by bot.
 - Added various enhancements to custom status to allow users to switch to recent statuses with less clicks.
 - Users can now see online status on user profile images in the channel switcher.
 - Added a string field to restricted domains configuration with the key ``RestrictLinkPreviews``, and added a UI field for restricted domains under **System Console > Site Configuration > Posts**. Also expanded the logic that determines whether a post has a preview or not.
 - Added an unread badge to the **Main Menu** icon and the **Plugin Marketplace** menu that displays until a System Admin visits the **Plugin Marketplace** for the first time.
 - Profile images are now visible on **Direct Messages** in the channel sidebar.
 - Added channel icons for email notifications as part of email notification redesigns.
 - Direct Messages **More...** modal is now sorted by recent conversations when the modal is opened.
 - Removed legacy Open-Sans fonts and upgraded Open-Sans to v18.

#### Administration
 - Paused Admin Advisor notifications from triggering.
 - Added a command line document extraction command that allows indexing documents by content.
 - Removed the utility function ``model.GeneratePassword()`` for security reasons. An improved version is now being used internally to generate passwords for bulk-imported users.
 - Only the System Admin is allowed to have the ability to assign system roles.
 - Two new gauge metrics were added: ``mattermost_db_replica_lag_abs`` and ``mattermost_db_replica_lag_time``, both containing a label of "node", signifying which database host is the metric from. 
     - These metrics signify the replica lag in absolute terms and in the time dimension capturing the whole picture of replica lag. To use these metrics, a separate config section ``ReplicaLagSettings`` was added under ``SqlSettings``. This is an array of maps which contain three keys: ``DataSource``, ``QueryAbsoluteLag``, and ``QueryTimeLag``. Each map entry is for a single replica instance. ``DataSource`` contains the database credentials to connect to the replica instance. ``QueryAbsoluteLag`` is a plain SQL query that must return a single row of which the first column must be the node value of the Prometheus metric, and the second column must be the value of the lag. ``QueryTimeLag`` is the same as above, but used to measure the time lag. 
     - As an example, for AWS Aurora instances, the ``QueryAbsoluteLag`` can be: ``select server_id highest_lsn_rcvd-durable_lsn as bindiff from aurora_global_db_instance_status()`` where ``server_id=<>`` and ``QueryTimeLag`` can be: ``select server_id, visibility_lag_in_msec aurora_global_db_instance_status()`` where ``server_id=<>``. For MySQL Group Replication, the absolute lag can be measured from the number of pending transactions in the applier queue: ``select member_id, count_transactions_remote_in_applier_queue FROM performance_schema.replication_group_member_stats`` where ``member_id=<>``. Overall, what query to choose is left to the administrator, and depending on the database and need, an appropriate query can be chosen.

### Bug Fixes
 - Fixed link previews on a number of websites, including Reddit.
 - Fixed an issue where SAML assigned Mattermost ``UserID`` as username if the value was invalid and did not log this.
 - Fixed an issue where hover effects for category sorting and **Direct Messages** category limit submenus were too dark on a dark theme.
 - Fixed an issue where users were unable to drag the vertical scroll bar on a PDF preview.
 - Fixed an issue with animations on long posts when highlighted as a permalink.
 - Fixed an issue where the user's nickname was not shown on channel switch.
 - Fixed an issue where deactivated users were not marked as **Deactivated** in the channel switcher.
 - Fixed an issue where queries executed during the upgrade process would pre-emptively time out on the application side.
 - Fixed an issue where users were unable to deactivate MFA for their accounts even if MFA was disabled on the server.
 - Fixed an issue where user settings on API could be set if LDAP Sync was on. For LDAP and SAML users, the following fields cannot be changed via the API if the corresponding LDAP/SAML attributes have been set: first name, last name, position, nickname, email, profile picture. For OAuth users (i.e., GitLab, Google, Office365, and OpenID), the following fields cannot be changed via the API: first name, last name. All users who authenticate via a method other than email cannot change their username via the API.
 - Fixed a possible panic on post creation when the collapsed threads feature was enabled.
 - Fixed a database deadlock that could happen if a sidebar category was updated and deleted at the same time.
 - Fixed an issue where the sidebar **Text Hover BG Theme** color didn’t work on the left-hand side.
 - Fixed an issue where the Team Admin’s current role was presented inconsistently in the different areas of the System Console.
 - Fixed an issue where the **Show more** background color on long posts was broken for permalinks.
 - Fixed an issue where redirecting with JS failed when Content Security Policy was enabled and restricted with ``unsafe-inline``.

### config.json
Multiple setting options were added to ``config.json``. Below is a list of the additions and their default values on install. The settings can be modified in ``config.json``, or the System Console when available.

#### Changes to Team Edition and Enterprise Edition:
 - Under ``ServiceSettings`` in ``config.json``:
     - Added ``EnableFileSearch`` for file search feature.
     - Added ``RestrictLinkPreviews`` setting to allow disabling link previews from certain domains.
 - Under ``FileSettings`` in ``config.json``:
     -  Added ``ExtractContent`` and ``ArchiveRecursion`` for file search feature.
 - Under ``ExperimentalSettings`` in ``config.json``:
     - Added ``EnableRemoteClusterService`` for experimental Shared Channels feature.
 - Under ``SqlSettings`` in ``config.json``:
     - Added ``ReplicaLagSettings``. This is an array of maps which contain three keys: ``DataSource``, ``QueryAbsoluteLag``, and ``QueryTimeLag``.

### Database Changes
 - Added new column in ``ChannelMembers`` table called ``MentionCountRoot``. Please note that the migration can take up to a few minutes on installations with large numbers of channels/users.
 - Added ``TotalMsgCountRoot`` to ``Channels`` table and ``MsgCountRoot`` column to ``ChannelMembers`` table. Please note that the migration can take several minutes to complete on large MySQL instances.

### API Changes
 - Added ``/teams/{team_id}/files/search`` API endpoint for files search.
 - For LDAP and SAML users, the following fields cannot be changed via the API if the corresponding LDAP/SAML attributes have been set: first name, last name, position, nickname, email, profile picture. For OAuth users (i.e., GitLab, Google, Office365, and OpenID), the following fields cannot be changed via the API: first name, last name. All users who authenticate via a method other than email cannot change their username via the API.

### Go Version
 - v5.35 is built with Go ``1.15.5``.

### Open Source Components
 - Added ``country-list``, ``form-data``, ``gfycat-sdk``, ``redux-thunk``, ``rudder-sdk-js``, ``serialize-error`` and ``shallow-equals``, and removed ``mattermost-redux`` from https://github.com/mattermost/mattermost-webapp.

### Known Issues
 - A persistent unread badge on sidebar hamburger menu may show if **Enable Marketplace** or **Enable Plugins** is disabled in the System Console [MM-36160](https://mattermost.atlassian.net/browse/MM-36160).
 - ``config.json`` can reset when running the command ``systemctl restart mattermost``, and when running any commands that write to the config (e.g. ``config`` or ``plugin``) [MM-33752](https://mattermost.atlassian.net/browse/MM-33752), [MM-32390](https://mattermost.atlassian.net/browse/MM-32390).
 - Adding an at-mention at the start of a post draft and pressing the leftwards or rightwards arrow can clear the post draft and the undo history [MM-33823](https://mattermost.atlassian.net/browse/MM-33823).
 - Posts created by bots containing attachments sometimes appear as repeated until the user refreshes the page [MM-30980](https://mattermost.atlassian.net/browse/MM-30980).
 - Emoji counter in the center channel doesn't always update immediately when a reaction is added in the right-hand side [MM-31994](https://mattermost.atlassian.net/browse/MM-31994).
 - Fields on the right column in a message attachment render unevenly [MM-36943](https://mattermost.atlassian.net/browse/MM-36943).
 - Pinned posts are no longer highlighted.
 - Google login fails on the Classic mobile apps.
 - Status may sometimes get stuck as **Away** or **Offline** in High Availability mode with IP Hash turned off.
 - Searching stop words in quotation marks with Elasticsearch enabled returns more than just the searched terms.
 - The team sidebar on the desktop app does not update when channels have been read on mobile.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.

### Contributors
 - [Adovenmuehle](https://github.com/Adovenmuehle), [aedott](https://github.com/aedott), [aeomin](https://github.com/aeomin), [agarciamontoro](https://github.com/agarciamontoro), [AGMETEOR](https://github.com/AGMETEOR), [agnivade](https://github.com/agnivade), [albatrosef](https://github.com/albatrosef), [amyblais](https://github.com/amyblais), [amynicol1985](https://github.com/amynicol1985), [angeloskyratzakos](https://github.com/angeloskyratzakos), [anurag6713](https://github.com/anurag6713), [arvinDarmawan](https://github.com/arvinDarmawan), [asaadmahmood](https://github.com/asaadmahmood), [avinashdhinwa](https://github.com/avinashdhinwa), [bbodenmiller](https://github.com/bbodenmiller), [benarent](https://github.com/benarent), [BenCookie95](https://github.com/BenCookie95), [BharatKalluri](https://github.com/BharatKalluri), [calebroseland](https://github.com/calebroseland), [catalintomai](https://github.com/catalintomai), [chenilim](https://github.com/chenilim), [chetanyakan](https://github.com/chetanyakan), [chikei](https://github.com/chikei), [chrisfromredfin](https://github.com/chrisfromredfin), [codingthat](https://github.com/codingthat), [coltoneshaw](https://github.com/coltoneshaw), [courtneypattison](https://github.com/courtneypattison), [cpanato](https://github.com/cpanato), [cpoile](https://github.com/cpoile), [crspeller](https://github.com/crspeller), [ctlaltdieliet](https://github.com/ctlaltdieliet), [cwarnermm](https://github.com/cwarnermm), [darkLord19](https://github.com/darkLord19), [deanwhillier](https://github.com/deanwhillier), [devinbinnie](https://github.com/devinbinnie), [djanda97](https://github.com/djanda97), [elyscape](https://github.com/elyscape), [enahum](https://github.com/enahum), [enelson720](https://github.com/enelson720), [EricMontague](https://github.com/EricMontague), [esethna](https://github.com/esethna), [ethervoid](https://github.com/ethervoid), [flynbit](https://github.com/flynbit), [furqanmlk](https://github.com/furqanmlk), [gea-ecobricks](https://github.com/gea-ecobricks), [gigawhitlocks](https://github.com/gigawhitlocks), [girish17](https://github.com/girish17), [gruceqq](https://translate.mattermost.com/user/gruceqq/), [grundleborg](https://github.com/grundleborg), [haardikdharma10](https://github.com/haardikdharma10), [hahmadia](https://github.com/hahmadia), [Hampusholmstrom](https://github.com/Hampusholmstrom), [hanzei](https://github.com/hanzei), [harshilsharma63](https://github.com/harshilsharma63), [hastadhana](https://github.com/hastadhana), [hectorskypl](https://github.com/hectorskypl), [hmhealey](https://github.com/hmhealey), [ialorro](https://github.com/ialorro), [icelander](https://github.com/icelander), [IndushaS](https://github.com/IndushaS), [iomodo](https://github.com/iomodo), [isacikgoz](https://github.com/isacikgoz), [it33](https://github.com/it33), [jamiehurewitz](https://github.com/jamiehurewitz), [jasonblais](https://github.com/jasonblais), [jecepeda](https://github.com/jecepeda), [jespino](https://github.com/jespino), [jfrerich](https://github.com/jfrerich), [JoelRummel](https://github.com/JoelRummel), [Johennes](https://github.com/Johennes), [johnsonbrothers](https://github.com/johnsonbrothers), [josephbaylon](https://github.com/josephbaylon), [justinegeffen](https://github.com/justinegeffen), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [kayazeren](https://github.com/kayazeren), [komik966](https://github.com/komik966), [larkox](https://github.com/larkox), [leblanc-simon](https://github.com/leblanc-simon), [levb](https://github.com/levb), [lieut-data](https://github.com/lieut-data), [M-ZubairAhmed](https://github.com/M-ZubairAhmed), [majidsajadi](https://github.com/majidsajadi), [manojmalik20](https://github.com/manojmalik20), [marianunez](https://github.com/marianunez), [matt-w99](https://github.com/matt-w99), [matthewbirtch](https://github.com/matthewbirtch), [maxerenberg](https://github.com/maxerenberg), [metanerd](https://github.com/metanerd), [mgdelacroix](https://github.com/mgdelacroix), [michaelgamble](https://github.com/michaelgamble), [michelengelen](https://github.com/michelengelen), [mickmister](https://github.com/mickmister), [microolapshare](https://github.com/microolapshare), [migbot](https://github.com/migbot), [mjnagel](https://github.com/mjnagel), [mkraft](https://github.com/mkraft), [mlongo4290](https://github.com/mlongo4290), [mrckndt](https://github.com/mrckndt), [muratbayan](https://github.com/muratbayan), [natalie-hub](https://github.com/natalie-hub), [Ndawakh](https://github.com/Ndawakh), [nevyangelova](https://github.com/nevyangelova), [nickmisasi](https://github.com/nickmisasi), [ogi-m](https://github.com/ogi-m), [pablovelezvidal](https://github.com/pablovelezvidal), [prapti](https://github.com/prapti), [qunabu](https://github.com/qunabu), [rbradleyhaas](https://github.com/rbradleyhaas), [reflog](https://github.com/reflog), [rodcorsi](https://github.com/rodcorsi), [sakaitsu](https://github.com/sakaitsu), [saturninoabril](https://github.com/saturninoabril), [sbishel](https://github.com/sbishel), [shazm](https://github.com/shazm), [signalwerk](https://github.com/signalwerk), [spirosoik](https://github.com/spirosoik), [stafot](https://github.com/stafot), [streamer45](https://github.com/streamer45), [stylianosrigas](https://github.com/stylianosrigas), [Szymongib](https://github.com/Szymongib), [teresa-novoa](https://github.com/teresa-novoa), [thebestwj](https://github.com/thebestwj), [TheDarkestDay](https://github.com/TheDarkestDay), [thePanz](https://github.com/thePanz), [uhlhosting](https://github.com/uhlhosting), [wget](https://github.com/wget), [wiersgallak](https://github.com/wiersgallak), [wiggin77](https://github.com/wiggin77), [Willyfrog](https://github.com/Willyfrog), [xlanor](https://github.com/xlanor), [yashjohar](https://github.com/yashjohar), [YJSoft](https://github.com/YJSoft), [YoheiZuho](https://github.com/YoheiZuho), [zefhemel](https://github.com/zefhemel), [ziprandom](https://github.com/ziprandom), [Zukerherr](https://github.com/Zukerherr)

## Release v5.34 - [Feature Release](https://docs.mattermost.com/administration/release-definitions.html#feature-release)

- **v5.34.5, released 2021-06-21**
  - Mattermost v5.34.5 contains a high level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
- **v5.34.4, released 2021-06-11**
  - Mattermost v5.34.4 contains a high level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
  - Fixed an issue where missing query parameters in the datasource could cause MySQL servers to crash on startup. [MM-36236](https://mattermost.atlassian.net/browse/MM-36236)
  - Fixed an issue where plugin icons were displaying as a column instead of as a row on the left-hand side. [MM-36199](https://mattermost.atlassian.net/browse/MM-36199)
- **v5.34.3, released 2021-06-03**
  - Fixed an issue where subsequent migrations failed to run after running a dot release on new installations. [MM-35931](https://mattermost.atlassian.net/browse/MM-35931)
- **v5.34.2, released 2021-04-17**
  - Fixed an issue where installs with some special characters in the MySQL password would break and fail to start.
- **v5.34.1, released 2021-04-15**
  - Fixed an issue where upgrading to v5.34.0 runs a migration that could cause timeouts on MySQL installations. Upgrading to v5.34.1 may also execute missing migrations that were scheduled for v5.32.0. These additions can be lengthy on very big MySQL (version 5.x) installations.
     - Altering of ``Posts.FileIds`` type (PostgreSQL only)
     - Added new column ``ThreadMemberships.UnreadMentions``
     - Added new column ``Channels.Shared``
     - Added new column ``Reactions.UpdateAt``
     - Added new column ``Reactions.DeleteAt``
- **v5.34.0, released 2021-04-15**
  - Original 5.34.0 release

### Highlights

#### Incident Collaboration: Automated actions on incident start (E20 Edition)
 - Users can now configure playbooks to automatically execute key actions when an incident is created to save time and reduce the chance of manual error.

#### Bulgarian and Swedish language support
 - Removed Beta tags from Swedish and Bulgarian languages. Mattermost is now available in 18 languages.

### Improvements

#### User Interface (UI)
 - System Admins now see a prompt to join private channel when joining a private channel via a permalink.
 - Added support for adding in-product notices for external dependency deprecation details.
 - Improved the timezone selector component.
 - Introduced a new theme variable for the team sidebar.
 - Added support for automatic right-to-left (RTL) detection in browsers.
 - Updated the font size for the **Add People** channel modal.
 - Online status is now shown in the channel switcher.
 - Improved the design and layout of email notifications for password resets, member invites, member welcomes, and verifications.

#### Administration
 - Added mmctl commands to create, list, download, and delete export files.
 - Added schema migrations phase 0 (``Teams``, ``TeamMembers``).
 - Removed references to ``SqlLite3`` from the code.
 - Bleve updates are now logged in the config only when there is an actual change in the ``BleveSettings`` instead of on every config update.
 - Profiling the Mattermost server with pprof is now available for Team Edition.
 - Added attributes to split.io feature flags.

### Bug Fixes
 - Fixed unsafe access of properties of the plugin environment during ``ServePluginPublicRequest``.
 - Fixed an issue where the Admin Console > Server Logs did not focus to the sidebar filter upon reload.
 - Fixed an issue where the GIF picker appeared empty instead of showing a “No results” modal when no results were displayed.
 - Fixed an issue where the keyboard accessibility controller was not allowed to resume left-hand side scroll after drag and drop.
 - Fixed an issue where markdown links rendered incorrectly.
 - Fixed an issue where the Slack theme import failed due to changes in formatting of Slack export color schemes.
 - Fixed an issue where tooltips were missing for channels with a long name.
 - Fixed a race condition which would crash the app server due to improper handling of WebSocket closing.
 - Fixed an issue where the PDF zoom failed to respond to zoom in/out/reset actions until the user scrolled.
 - Fixed an issue where, in a reply thread with the right-hand side expanded, attachments in a post draft were hidden behind the center channel text box.
 - Fixed bugs related to replication lag for Enterprise Edition instances configured to use read replicas.
 - Fixed an issue where Compliance Report field headers were not correctly aligned.
 - Fixed an issue where the ``/join`` command was case-sensitive.
 - Fixed an issue where one-character sidebar category names were not displayed.
 - Fixed an issue with a theme discrepancy on Close buttons on some modals in the System Console (when using a custom team theme).
 - Fixed an issue where long text input in the right-hand pane was jumpy when selected.
 - Fixed an issue where the zoom level persisted across multi-attachment PDF previews.
 - Fixed an issue where long image names pushed the show/hide control off the right side of the window.

### config.json
Multiple setting options were added to ``config.json``. Below is a list of the additions and their default values on install. The settings can be modified in ``config.json``, or the System Console when available.

#### Changes to Team Edition and Enterprise Edition:
 - Added ``ExportSettings`` to add support for compressed export files with attachments.

### Go Version
 - v5.34 is built with Go ``1.15.5``.

### Open Source Components
 - Removed ``core-js`` from https://github.com/mattermost/mattermost-mobile.

### Known Issues
 - Text alignment in right-to-left support does not work correctly in v5.34. This issue is fixed in the latest version of the [mattermost-rtl plugin](https://github.com/QueraTeam/mattermost-rtl).
 - Deactivated users are not marked as "Deactivated" in the channel switcher [MM-33910](https://mattermost.atlassian.net/browse/MM-33910).
 - User nickname is not shown on channel switch [MM-33897](https://mattermost.atlassian.net/browse/MM-33897).
 - ``Config.json`` can reset when running the command ``systemctl restart mattermost``, and when running any commands that write to the config (e.g. ``config`` or ``plugin``) [MM-33752](https://mattermost.atlassian.net/browse/MM-33752), [MM-32390](https://mattermost.atlassian.net/browse/MM-32390).
 - The server tries to install E20-required plugins on non-E20 installations [MM-32387](https://mattermost.atlassian.net/browse/MM-32387).
 - Adding an at-mention at the start of a post draft and pressing the leftwards or rightwards arrow can clear the post draft and the undo history [MM-33823](https://mattermost.atlassian.net/browse/MM-33823).
 - Posts created by bots containing attachments sometimes appear as repeated until the user refreshes the page [MM-30980](https://mattermost.atlassian.net/browse/MM-30980).
 - Emoji counter in the center channel doesn't always update immediately when a reaction is added in the right-hand side [MM-31994](https://mattermost.atlassian.net/browse/MM-31994).
 - Reddit link previews no longer work in Mattermost. This affects older versions too [MM-31899](https://mattermost.atlassian.net/browse/MM-31899).
 - Fields on the right column in a message attachment render unevenly [MM-36943](https://mattermost.atlassian.net/browse/MM-36943).
 - Google login fails on the Classic mobile apps.
 - Status may sometimes get stuck as **Away** or **Offline** in High Availability mode with IP Hash turned off.
 - Searching stop words in quotation marks with Elasticsearch enabled returns more than just the searched terms.
 - The team sidebar on the desktop app does not update when channels have been read on mobile.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.

### Contributors
[abdullahceylan](https://github.com/abdullahceylan), [aconitumnapellus](https://github.com/aconitumnapellus), [Adovenmuehle](https://github.com/Adovenmuehle), [aeomin](https://github.com/aeomin), [agarciamontoro](https://github.com/agarciamontoro), [aggmoulik](https://github.com/aggmoulik), [AGMETEOR](https://github.com/AGMETEOR), [agnivade](https://github.com/agnivade), [amyblais](https://github.com/amyblais), [amynicol1985](https://github.com/amynicol1985), [angeloskyratzakos](https://github.com/angeloskyratzakos), [anurag6713](https://github.com/anurag6713), [appleboy](https://github.com/appleboy), [asaadmahmood](https://github.com/asaadmahmood), [asimsedhain](https://github.com/asimsedhain), [bbodenmiller](https://github.com/bbodenmiller), [BenCookie95](https://github.com/BenCookie95), [berkeka](https://github.com/berkeka), [BharatKalluri](https://github.com/BharatKalluri), [calebroseland](https://github.com/calebroseland), [catalintomai](https://github.com/catalintomai), [chenilim](https://github.com/chenilim), [chetanyakan](https://github.com/chetanyakan), [chikei](https://github.com/chikei), [christian-lim](https://github.com/christian-lim), [coltoneshaw](https://github.com/coltoneshaw), [cpanato](https://github.com/cpanato), [cpoile](https://github.com/cpoile), [Crimson-riot](https://github.com/Crimson-riot), [crspeller](https://github.com/crspeller), [ctlaltdieliet](https://github.com/ctlaltdieliet), [cwarnermm](https://github.com/cwarnermm), [CyrilLD](https://github.com/CyrilLD), [danielsischy](https://github.com/danielsischy), [deanwhillier](https://github.com/deanwhillier), [devinbinnie](https://github.com/devinbinnie), [djanda97](https://github.com/djanda97), [ebati](https://github.com/ebati), [enahum](https://github.com/enahum), [enelson720](https://github.com/enelson720), [esethna](https://github.com/esethna), [ethervoid](https://github.com/ethervoid), [firasm](https://github.com/firasm), [flexo3001](https://github.com/flexo3001), [flynbit](https://github.com/flynbit), [furqanmlk](https://github.com/furqanmlk), [gabrieljackson](https://github.com/gabrieljackson), [gigawhitlocks](https://github.com/gigawhitlocks), [gruceqq](https://translate.mattermost.com/user/gruceqq/), [haardikdharma10](https://github.com/haardikdharma10), [hahmadia](https://github.com/hahmadia), [hanzei](https://github.com/hanzei), [haonm](https://github.com/haonm), [hastadhana](https://github.com/hastadhana), [hectorskypl](https://github.com/hectorskypl), [hmhealey](https://github.com/hmhealey), [ianatha](https://github.com/ianatha), [icelander](https://github.com/icelander), [IndushaS](https://github.com/IndushaS), [iomodo](https://github.com/iomodo), [isacikgoz](https://github.com/isacikgoz), [it33](https://github.com/it33), [jamiehurewitz](https://github.com/jamiehurewitz), [jasonblais](https://github.com/jasonblais), [jaydeland](https://github.com/jaydeland), [jbutler992](https://github.com/jbutler992), [jbutlerdev](https://github.com/jbutlerdev), [jespino](https://github.com/jespino), [jfrerich](https://github.com/jfrerich), [jials](https://github.com/jials), [johnsonbrothers](https://github.com/johnsonbrothers), [josephbaylon](https://github.com/josephbaylon), [jp0707](https://github.com/jp0707), [JtheBAB](https://github.com/JtheBAB), [justinegeffen](https://github.com/justinegeffen), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [kayazeren](https://github.com/kayazeren), [khos2ow](https://github.com/khos2ow), [larkox](https://github.com/larkox), [lawrencejohnson](https://github.com/lawrencejohnson), [levb](https://github.com/levb), [lieut-data](https://github.com/lieut-data), [lindalumitchell](https://github.com/lindalumitchell), [lucievr](https://github.com/lucievr), [lutfuahmet](https://github.com/lutfuahmet), [Maekes](https://github.com/Maekes), [mahmud2011](https://github.com/mahmud2011), [mantlecurve](https://github.com/mantlecurve), [matt-w99](https://github.com/matt-w99), [matthewbirtch](https://github.com/matthewbirtch), [maxerenberg](https://github.com/maxerenberg), [metanerd](https://github.com/metanerd), [mgdelacroix](https://github.com/mgdelacroix), [michelengelen](https://github.com/michelengelen), [mickmister](https://github.com/mickmister), [microolapshare](https://github.com/microolapshare), [migbot](https://github.com/migbot), [minecraftchest1](https://github.com/minecraftchest1), [mistikel](https://github.com/mistikel), [mkdbns](https://github.com/mkdbns), [mkraft](https://github.com/mkraft), [mlongo4290](https://github.com/mlongo4290), [mrtpcet](https://github.com/mrtpcet), [msal4](https://github.com/msal4), [Mshahidtaj](https://github.com/Mshahidtaj), [natalie-hub](https://github.com/natalie-hub), [nathanaelhoun](https://github.com/nathanaelhoun), [nevyangelova](https://github.com/nevyangelova), [nronas](https://github.com/nronas), [ogi-m](https://github.com/ogi-m), [opr77](https://github.com/opr77), [pablovelezvidal](https://github.com/pablovelezvidal), [pat-s](https://github.com/pat-s), [phntom](https://github.com/phntom), [pidgelar](https://github.com/pidgelar), [potatogim](https://github.com/potatogim), [prapti](https://github.com/prapti), [Prescise](https://github.com/Prescise), [proffalken](https://github.com/proffalken), [r-52](https://github.com/r-52), [rakhi2104](https://github.com/rakhi2104), [rbradleyhaas](https://github.com/rbradleyhaas), [reflog](https://github.com/reflog), [renjithgr](https://github.com/renjithgr), [rodcorsi](https://github.com/rodcorsi), [saf6260](https://github.com/saf6260), [sakaitsu](https://github.com/sakaitsu), [saturninoabril](https://github.com/saturninoabril), [sbishel](https://github.com/sbishel), [shazm](https://github.com/shazm), [spirosoik](https://github.com/spirosoik), [stafot](https://github.com/stafot), [streamer45](https://github.com/streamer45), [stylianosrigas](https://github.com/stylianosrigas), [svelle](https://github.com/svelle), [Szymongib](https://github.com/Szymongib), [thePanz](https://github.com/thePanz), [toto6038](https://github.com/toto6038), [tsabi](https://github.com/tsabi), [uhlhosting](https://github.com/uhlhosting), [wget](https://github.com/wget), [wiersgallak](https://github.com/wiersgallak), [wiggin77](https://github.com/wiggin77), [Willyfrog](https://github.com/Willyfrog), [xlanor](https://github.com/xlanor), [YoheiZuho](https://github.com/YoheiZuho), [youtsumi](https://github.com/youtsumi), [zefhemel](https://github.com/zefhemel), [Zukerherr](https://github.com/Zukerherr)

## Release v5.33 - [Feature Release](https://docs.mattermost.com/administration/release-definitions.html#feature-release)

- **v5.33.5, released 2021-06-11**
  - Mattermost v5.33.5 contains a high level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
- **v5.33.4, released 2021-06-03**
  - Fixed an issue where subsequent migrations failed to run after running a dot release on new installations. [MM-35931](https://mattermost.atlassian.net/browse/MM-35931)
  - Added a performance improvement to the emoji picker overlay to improve typing performance.
- **v5.33.3, released 2021-03-31**
  - Fixed an issue where, after migrating to OpenID, Office 365 returned different ID attributes based on user type, causing an error for users with expired sessions when they tried to sign in to Mattermost. [MM-34356](https://mattermost.atlassian.net/browse/MM-34356)
- **v5.33.2, released 2021-03-25**
  - Improved typing performance on busy servers with lots of active users and with the new sidebar enabled. [MM-30407](https://mattermost.atlassian.net/browse/MM-30407)
  - Reverted the WebSocket improvement added in v5.33.0 where epoll was used to manually read from a WebSocket connection. It was reverted because unofficial Mattermost builds in several different platforms broke due to the WebSocket changes. [MM-34158](https://mattermost.atlassian.net/browse/MM-34158)
- **v5.33.1, released 2021-03-22**
  - Fixed an issue where WebSockets failed with TLS connections. [MM-34000](https://mattermost.atlassian.net/browse/MM-34000)
  - Fixed a race condition which would crash the app server due to improper handling of WebSocket closing. [MM-33233](https://mattermost.atlassian.net/browse/MM-33233)
  - Fixed an issue where the ``mmctl config`` command  didn't recognize newer settings (e.g. ``ClusterSettings.EnableGossipCompression``)  that were introduced in v5.33.0. [MM-34046](https://mattermost.atlassian.net/browse/MM-34046)
- **v5.33.0, released 2021-03-17**
  - Original 5.33.0 release

Mattermost v5.33.0 contains low-level security fixes. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

### Important Upgrade Notes
 - Deleting a reaction is now a soft delete in the ``Reactions`` table. A schema update is required and may take up to 15 seconds on first run with large data sets.
 - WebSocket handshakes done with an HTTP version lower than 1.1 will result in a warning, and the server will transparently upgrade the version to 1.1 to comply with the WebSocket RFC. This is done to work around incorrect Nginx (and other proxy) configs that do not set the ``proxy_http_version`` directive to 1.1. This facility will be removed in a future Mattermost version. It is strongly recommended to fix the proxy configuration to correctly use the WebSocket protocol.
 
**IMPORTANT:** If you upgrade from a release earlier than v5.32, please read the other [Important Upgrade Notes](https://docs.mattermost.com/administration/important-upgrade-notes.html).

### Highlights

#### OpenID Connect for OAuth 2.0 Authentication (E20 Edition)
 - OpenID Connect enables authentication to Mattermost using any OAuth 2.0 provider that adheres to the OpenID Connect specification. This feature is available for Mobile Apps in the v1.40 release.

#### Support Packet Generation (E10 & E20 Editions)
 - Mattermost provides the ability to download configuration details, logs, and other deployment information when requesting commercial support for Mattermost self-managed E10 or E20 Enterprise editions, or Mattermost Cloud editions.

#### Updated Incident Collaboration Plugin to 1.4.0 (E20 Edition)
 - Added an Incident Timeline to support status updates and other key events shown chronologically in the right-hand sidebar. The timeline enables users to easily gather information for post-incident reports.
 
#### Custom Statuses
 - Users now gain the flexibility to express their current status in any way they prefer. Set a custom status to add a descriptive status message and emoji that’s visible to everyone throughout the app.

### Improvements

#### User Interface (UI)
 - Improved the **Add Members** to channel modal.
 - Added **Formatting** shortcut keys to the **Shortcut** modal.
 - Added localization to the date picker used when searching for posts around a given date.
 - The autocomplete popover is now positioned relative to the @, ~, or / trigger in the post draft.
 - Removed the 5-page limit on previewing PDFs.
 - Added ``files`` as a reserved team name.
 - Searching for a channel by URL now returns the channel.
 - Users are now provided with feedback when creating a custom category name that exceeds the character limit.

#### Notifications
 - Posts from OAuth 2.0 bots no longer trigger mentions for the user.

#### Administration
 - Added an ``ImportDelete`` job to periodically delete unused import files after a configurable retention period has passed.
 - Introduced new ``mattermost_system_server_start_time`` and ``mattermost_jobs_active`` metrics for improved debugging with Grafana dashboards.
 - Deleting a reaction is now a soft delete in the ``Reactions`` table. A schema update is required and may take up to 15 seconds on first run with large data sets.
 - Changed default ``MaxFileSize`` from 50MB to 100MB.
 - Updated Go dependencies to their latest minor version.
 - Added support for compressed export files with attachments.
 - Server crashes due to runtime panics are now captured as a log line.
 - Optimized **Direct Message** creation by fetching all users involved in a single database call.
 - During the user import process, a change in a user's ``NotifyProps`` will not send an email notification. This is done to make it consistent with other parts of the import process where a change in user's attributes would also not send any notifications.
 - Implemented a job to delete unused export files.

### Bug Fixes
 - Fixed an issue where the Database Schema upgrade step for v5.29.1 was not taken into account in releases v5.30 and later.
 - Fixed an issue where ``mmctl channel move`` did not allow moving private channels.
 - Fixed an issue where ``mmctl config set PluginSettings.EnableUploads`` to change a configuration value did not return an error.
 - Fixed an issue where the instructions to search for users in **System Console > Reporting > Server Logs** were not up-to-date.
 - Fixed an issue where no error message was displayed when adding an LDAP Group Synchronized Team in **System Console > User Management > Users**.
 - Fixed an issue where markdown tables did not wrap correctly.
 - Fixed an issue where the search bar styling on dark themes was incorrect on mobile web view.
 - Fixed an issue where the **Main Menu** on webapp appeared more left-aligned than previous releases.
 - Fixed an issue where sticky sidebar headings appeared under **More Unreads**.
 - Fixed an issue where the group channel icon was misaligned in the channel switcher.
 - Fixed an issue where line breaks were ignored when used with inline images.
 - Fixed an issue where the channel switcher did not focus on the first list result after a backspace.
 - Fixed an issue where demoting a user to a guest would not take effect in an environment with read replicas.
 - Fixed a bug with in-product notices where a date constraint might fail to match, which would lead to the notice not being fetched.
 - Fixed an issue where creation of a bot would fail due to replica lag.
 - The ``DownloadComplianceReport`` function in the Golang driver has been fixed to download a full report as a zip archive.
 - Fixed Cache-Control headers to instruct that responses may only be cached on browsers.
 - Fixed a panic when the OAuth discovery endpoint would not return a Cache-Control header.

### config.json
Multiple setting options were added to ``config.json``. Below is a list of the additions and their default values on install. The settings can be modified in ``config.json``, or the System Console when available.

#### Changes to Team Edition and Enterprise Edition:
 - Under ``ClusterSettings`` in ``config.json``:
     - Added ``EnableGossipCompression``, to disable compression in the Gossip protocol. By default the value of the setting is ``true``. This is done to maintain compatibility with old servers in a cluster. Once all servers in a cluster are upgraded, it is recommended to disable this setting for better performance.
 - Under ``SqlSettings`` in ``config.json``:
     - Added ``ConnMaxIdleTimeMilliseconds``, to allow System Admins to control the maximum time a database connection can remain idle. The default value is set to 5 minutes.
 - Under ``TeamSettings`` in ``config.json``:
     - Added ``EnableCustomUserStatuses``, to allow users to set descriptive status messages and optional status emoji that are visible to all users.
    
### Go Version
 - v5.33 is built with Go ``1.15.5``.

### Open Source Components
 - Added ``types/react-overlays``, ``crypto-browserify``, ``process`` and ``stream-browserify``, and removed ``node-semver`` from https://github.com/mattermost/mattermost-webapp.
 - Removed ``isomorphic-fetch`` from https://github.com/mattermost/mattermost-redux.

### API Changes
 - Added a new ``GET /{team_id}/threads/{thread_id}`` API method for retrieving single threads.
 - Added a new ``/exports`` API endpoint to generate and manage export files.
 - Added a new ``/users/{user_id}/teams/{team_id}/threads/mention_counts`` API endpoint.
 - Added a new ``GET /api/v4/cloud/subscription/stats`` API endpoint.
 - Added a new ``GET /api/v4/cloud/subscription/limitreached/invite`` API endpoint.
 - Added new ``PUT /api/v4/users/<id>/status/custom``, ``DELETE /api/v4/users/<id>/status/custom``, and ``DELETE /api/v4/users/<id>/status/custom/recent`` API endpoints.
 - The ``/api/v4/users/me/auth`` API endpoint can no longer be used to change passwords. This was a hidden feature that was not documented, but was nevertheless possible. We have removed this hidden feature.
 - Updated ``/users/{user_id}/teams/{team_id}/threads`` API to support the ``unread=true`` query parameter.
 - The ``/api/v4/users/{user_id}/teams/{team_id}/threads`` API endpoint now accepts "before" and "after" parameters instead of a page index.
 - Removed the session required restriction from the ``GET api/v4/subscription/stats`` API endpoint.

### Websocket Event Changes
 - Improved the WebSocket implementation by using epoll to manually read from a WebSocket connection. As a result, the number of goroutines is expected to go down by half. This implementation is only available on Linux and FreeBSD-based distributions.
 - The ``UserUpdate`` WebSocket Event is now broadcast by two more APIs, ``plugin.UpdateUser`` and ``ConvertBotToUser``.

### Known Issues
 - Config.json can reset when running the command ``systemctl restart mattermost``, and when running any commands that write to the config (e.g. ``config`` or ``plugin``) [MM-33752](https://mattermost.atlassian.net/browse/MM-33752), [MM-32390](https://mattermost.atlassian.net/browse/MM-32390).
 - The server tries to install E20-required plugins on non-E20 installations [MM-32387](https://mattermost.atlassian.net/browse/MM-32387).
 - Adding an at-mention at the start of a post draft, then pressing the left or right arrow can clear the post draft and the undo history [MM-33823](https://mattermost.atlassian.net/browse/MM-33823).
 - In some cases, the **New messages** toast appears without replacing variables with text. [MM-33829](https://mattermost.atlassian.net/browse/MM-33829)
 - Posts created by bots containing attachments sometimes appear as repeated until the user refreshes the page [MM-30980](https://mattermost.atlassian.net/browse/MM-30980).
 - Emoji counter in the center channel doesn't always update immediately when a reaction is added in the right-hand side [MM-31994](https://mattermost.atlassian.net/browse/MM-31994).
 - Reddit link previews no longer work in Mattermost. This affects older versions too [MM-31899](https://mattermost.atlassian.net/browse/MM-31899).
 - Slack theme import fails due to changes in formatting of Slack export color schemes [MM-30531](https://mattermost.atlassian.net/browse/MM-30531).
 - Google login fails on the Classic mobile apps.
 - Status may sometimes get stuck as **Away** or **Offline** in High Availability mode with IP Hash turned off.
 - Searching stop words in quotation marks with Elasticsearch enabled returns more than just the searched terms.
 - The team sidebar on the desktop app does not update when channels have been read on mobile.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.

### Contributors
[a-c-sreedhar-reddy](https://github.com/a-c-sreedhar-reddy), [aaronrothschild](https://github.com/aaronrothschild), [aeomin](https://github.com/aeomin), [agarciamontoro](https://github.com/agarciamontoro), [AGMETEOR](https://github.com/AGMETEOR), [agnivade](https://github.com/agnivade), [Ampit](https://github.com/Ampit), [amyblais](https://github.com/amyblais), [amynicol1985](https://github.com/amynicol1985), [angeloskyratzakos](https://github.com/angeloskyratzakos), [anurag6713](https://github.com/anurag6713), [arjunagl](https://github.com/arjunagl), [ashishbhate](https://github.com/ashishbhate), [aspleenic](https://github.com/aspleenic), [BenCookie95](https://github.com/BenCookie95), [berkeka](https://github.com/berkeka), [bjorge82](https://github.com/bjorge82), [calebroseland](https://github.com/calebroseland), [carantunes](https://github.com/carantunes), [catalintomai](https://github.com/catalintomai), [chenilim](https://github.com/chenilim), [chetanyakan](https://github.com/chetanyakan), [chikei](https://github.com/chikei), [coltoneshaw](https://github.com/coltoneshaw), [cpanato](https://github.com/cpanato), [cpoile](https://github.com/cpoile), [crspeller](https://github.com/crspeller), [ctlaltdieliet](https://github.com/ctlaltdieliet), [cupakob](https://github.com/cupakob), [cwarnermm](https://github.com/cwarnermm), [daniron26](https://github.com/daniron26), [devinbinnie](https://github.com/devinbinnie), [djanda97](https://github.com/djanda97), [DSchalla](https://github.com/DSchalla), [elyscape](https://github.com/elyscape), [enelson720](https://github.com/enelson720), [esethna](https://github.com/esethna), [ethervoid](https://github.com/ethervoid), [flynbit](https://github.com/flynbit), [furqanmlk](https://github.com/furqanmlk), [gabrieljackson](https://github.com/gabrieljackson), [gruceqq](https://translate.mattermost.com/user/gruceqq/), [haardikdharma10](https://github.com/haardikdharma10), [hahmadia](https://github.com/hahmadia), [hanzei](https://github.com/hanzei), [harryfromwork](https://github.com/harryfromwork), [hectorskypl](https://github.com/hectorskypl), [helios1101](https://github.com/helios1101), [hmhealey](https://github.com/hmhealey), [icelander](https://github.com/icelander), [IndushaS](https://github.com/IndushaS), [iomodo](https://github.com/iomodo), [isacikgoz](https://github.com/isacikgoz), [jasonblais](https://github.com/jasonblais), [jatinjtg](https://github.com/jatinjtg), [jaydeland](https://github.com/jaydeland), [jespino](https://github.com/jespino), [jfrerich](https://github.com/jfrerich), [johnsonbrothers](https://github.com/johnsonbrothers), [jomaxro](https://github.com/jomaxro), [josephbaylon](https://github.com/josephbaylon), [jp0707](https://github.com/jp0707), [justinegeffen](https://github.com/justinegeffen), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [kashifsoofi](https://github.com/kashifsoofi), [kayazeren](https://github.com/kayazeren), [kojiGit55](https://github.com/kojiGit55), [komik966](https://github.com/komik966), [koox00](https://github.com/koox00), [kristinakvn](https://github.com/kristinakvn), [larkox](https://github.com/larkox), [LauSam09](https://github.com/LauSam09), [lawrencejohnson](https://github.com/lawrencejohnson), [Leats](https://github.com/Leats), [levb](https://github.com/levb), [lieut-data](https://github.com/lieut-data), [lucievr](https://github.com/lucievr), [lynn915](https://github.com/lynn915), [mahmud2011](https://github.com/mahmud2011), [matthewbirtch](https://github.com/matthewbirtch), [metanerd](https://github.com/metanerd), [mgdelacroix](https://github.com/mgdelacroix), [michelengelen](https://github.com/michelengelen), [mickmister](https://github.com/mickmister), [migbot](https://github.com/migbot), [mkraft](https://github.com/mkraft), [mlongo4290](https://github.com/mlongo4290), [natalie-hub](https://github.com/natalie-hub), [neilharris123](https://github.com/neilharris123), [nevyangelova](https://github.com/nevyangelova), [nronas](https://github.com/nronas), [nurefexc](https://github.com/nurefexc), [ogi-m](https://github.com/ogi-m), [onoklin](https://github.com/onoklin), [pablovelezvidal](https://github.com/pablovelezvidal), [petermcj](https://github.com/petermcj), [Quaqmre](https://github.com/Quaqmre), [rbradleyhaas](https://github.com/rbradleyhaas), [reflog](https://github.com/reflog), [rodcorsi](https://github.com/rodcorsi), [rvillablanca](https://github.com/rvillablanca), [saf6260](https://github.com/saf6260), [saturninoabril](https://github.com/saturninoabril), [sbishel](https://github.com/sbishel), [SezalAgrawal](https://github.com/SezalAgrawal), [SimonSimonB](https://github.com/SimonSimonB), [Soriyyx](https://github.com/Soriyyx), [stafot](https://github.com/stafot), [streamer45](https://github.com/streamer45), [stylianosrigas](https://github.com/stylianosrigas), [sudheerDev](https://github.com/sudheerDev), [Szymongib](https://github.com/Szymongib), [thePanz](https://github.com/thePanz), [TQuock](https://github.com/TQuock), [uhlhosting](https://github.com/uhlhosting), [ultra1394](https://github.com/ultra1394), [vpecinka](https://github.com/vpecinka), [wget](https://github.com/wget), [wiersgallak](https://github.com/wiersgallak)

## Release v5.32 - [Feature Release](https://docs.mattermost.com/administration/release-definitions.html#feature-release)

- **v5.32.1, released 2021-02-17**
  - Fixed an issue where any search containing an underscore failed on PostgreSQL databases. This was fixed by reverting a v5.32.0 feature that added support for searching for terms on PostgreSQL that contain underscores.
- **v5.32.0, released 2021-02-16**
  - Original 5.32.0 release

Mattermost v5.32.0 contains low level security fixes. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

### Compatibility
 - TLS versions 1.0 and 1.1 have been deprecated by browser vendors. Starting in Mattermost Server v5.32 (February 16), mmctl returns an error when connected to Mattermost servers deployed with these TLS versions and System Admins will need to explicitly add a flag in their commands to continue to use them. We recommend upgrading to TLS version 1.2 or higher.
 - PostgreSQL ended long-term support for [version 9.4 in February 2020](https://www.postgresql.org/support/versioning). From v5.26 Mattermost officially supports PostgreSQL version 10 as PostgreSQL 9.4 is no longer supported. New installs will require PostgreSQL 10+. Previous Mattermost versions will continue to be compatible with PostgreSQL 9.4. PostgreSQL 9.4 and all 9.x versions are now fully deprecated in our v5.30 release (December 16, 2020). Please follow the instructions under the Upgrading Section within [the PostgreSQL documentation](https://www.postgresql.org/support/versioning/). Mattermost will now fail to start if the Postgres version is below that.

### Breaking Changes
 - ``ExperimentalChannelOrganization``, ``EnableXToLeaveChannelsFromLHS``, ``CloseUnusedDirectMessages``, and ``ExperimentalHideTownSquareinLHS`` settings are only functional if the Legacy Sidebar (``EnableLegacySidebar``) is enabled since they are not compatible with the new sidebar experience. ``ExperimentalChannelSidebarOrganization`` has been deprecated, since the [new sidebar is now enabled for all users](https://mattermost.com/blog/custom-collapsible-channel-categories/). 
 - Breaking changes to the Golang client API were introduced: ``GetPostThread``, ``GetPostsForChannel``, ``GetPostsSince``, ``GetPostsAfter``, ``GetPostsBefore``, and ``GetPostsAroundLastUnread`` now require an additional collapsedThreads parameter to be passed. Any client making use of these functions will need to update them when upgrading its dependencies.
 - [A breaking change was introduced when upgrading the Go version to v1.15.5](https://golang.org/doc/go1.15#commonname) where user logins fail with AD/LDAP Sync when the certificate of the LDAP Server has no Subject Alternative Name (SAN) in it. Creating a new certificate on the AD/LDAP Server with the SAN inside fixes this.
 
**IMPORTANT:** If you upgrade from a release earlier than v5.31, please read the other [Important Upgrade Notes](https://docs.mattermost.com/administration/important-upgrade-notes.html).

### Highlights

#### General availability of custom, collapsible channel categories
 - Mattermost now gives users flexibility to organize channels and direct messages into custom, collapsible sidebar categories. Users gain full personalization of their sidebar to improve productivity, reduce clutter and focus on what matters. Learn more about [the new channel sidebar enhancements](https://mattermost.com/blog/custom-collapsible-channel-categories/).

#### Self-serve renewals (E10 & E20 Editions)
 - Mattermost is introducing the ability to renew your self-managed E10 or E20 license subscription online with a credit card. This feature creates a frictionless experience for System Administrators to renew their license without the need to contact sales. The renewal process takes place in [the customer portal](https://customers.mattermost.com/signup) and only takes a few minutes to complete.
 
#### Incident Collaboration v1.3.2 (E20 Edition)
 - Pre-packaged Incident Collaboration v1.3.2 offers a more specific incident status and centralized task list.

### Improvements

#### User Interface (UI)
 - Added new languages, Bulgarian and Swedish.
 - Added team sidebar user interface and animation enhancements.
 - Moved the header icons to the left of the header beside the channel description.
 - Added support to move multi-selected groups of channels to another category via the **More options** menu.

#### Plugins
 - Updated bundled plugin packages, including GitHub and Jenkins plugins.
 - Enabled experimental support for ARM64 plugins by allowing any matching ``GOOS-GOOARCH`` combination in the plugin manifest.

#### Administration
 - ``AnalyticsPostCount`` now avoids unnecessary table scans during various background jobs.
 - The Help text for the Rate Limiting setting was updated to explain the purpose of rate limiting.
 - Removed the word "experimental" from the Gossip setting in the System Console.
 - Updated the Go version to v1.15.5.
 - Added support for automatic installation and enablement of plugins using feature flags.
 - Added ``webhook create`` endpoints to local mode and the ability to create webhooks for other users.
 - Added a Mattermost CLI command to initialize the database.
 - Added support for processing import files through the API.
 - Added support for protocol-relative URLs while using the Image Proxy.
 - A Striped LRU cache is now used by default.
 - Added shared channels and ``remote_cluster_service`` under a license check.

### Bug Fixes
 - Fixed an issue where the Admin Filter option was not disabled in the AD/LDAP page for Admin roles with a ``sysconsole_write_authentication`` permission.
 - Fixed an issue where channels would sometimes be removed from custom categories when a user left a team.
 - Fixed an issue where the error text was missing when the team name was left blank on the Team Create page.
 - Fixed an issue where the System Manager was able to download the Compliance Export files.
 - Fixed an issue where themed button colours in interactive message attachments in Mattermost’s default dark theme were mismatched.
 - Fixed an issue where bold and italics shortcuts triggered with CTRL+B on Mac.
 - Fixed an issue where a "Your license does not support cloud requests” log error appeared on self-hosted servers.
 - Fixed an issue where the permissions of a System Admin role got deleted when changing the access level to any permission.
 - Fixed an issue where editing a ``/me`` post behaved differently within the Mattermost Web App and the Mobile App.
 - Fixed an issue where the hover state on category headers did not span the whole width of the left-hand navigation.
 - Fixed an issue where plugins on the left-hand side of the System Console were sorted differently than the ones in the Plugin Management page.
 - Fixed an issue where 15-character team names were truncated when the experimental channel sidebar was enabled.
 - Fixed an issue where the sidebar menus weren't styled correctly in mobile browser view.
 - Fixed an issue where jumping into an archive channel and clicking the link to jump to recent messages sent the user out of the archived channel.
 - Fixed an issue where the tooltip text for copying an incoming webhook URL was unclear.

### config.json
Multiple setting options were added to ``config.json``. Below is a list of the additions and their default values on install. The settings can be modified in ``config.json``, or the System Console when available.

#### Changes to Team Edition and Enterprise Edition:
 - Deprecated the ``ExperimentalChannelSidebarOrganization`` setting and added a new ``EnableLegacySidebar`` setting. The new channel sidebar will be enabled system-wide by default.
 - The ``UseExperimentalGossip`` field under ClusterSettings is now ``true`` by default. This means that new installations will use the Gossip protocol for cluster communication. There will be no changes to existing installations. The Gossip protocol is now considered to be in General Availability and is the recommended clustering mode.
 - Enabled ``ExperimentalDataPrefetch`` for all servers and removed the corresponding setting.
 - Under ``NativeAppSettings`` in ``config.json``:
     - Added a ``AppCustomURLSchemes`` setting to add the ability to redirect to the mobile app after OAuth & SAML auth completion.
    
### Go Version
 - 5.32 is built with Go ``1.15.5``.

### API Changes
 - Thread related API routes now include ``teamId`` path parameter.
 - Changed output of ``Get Threads API`` to include ``total_unread_threads`` instead of ``total_unread_replies``.
 - Added ``collapsedThreads`` and ``collapsedThreadsExtended`` query parameters to:
    - ``api/v4/channels/{channel_id:[A-Za-z0-9]+}/posts``
    - ``api/v4/users/{user_id:[A-Za-z0-9]+}/channels/{channel_id:[A-Za-z0-9]+}/posts/unread``
    - ``api/v4/posts/{post_id:[A-Za-z0-9]+}/thread``

### Database Changes
 - Added a new ``Shared`` column to the ``Channels`` table.

### Known Issues
 - Config.json can reset when running the command ``systemctl restart mattermost``, and when running any commands that write to the config (e.g. ``config`` or ``plugin``) [MM-33752](https://mattermost.atlassian.net/browse/MM-33752), [MM-32390](https://mattermost.atlassian.net/browse/MM-32390).
 - The server tries to install E20 required plugins on non-E20 installations. [MM-32387](https://mattermost.atlassian.net/browse/MM-32387)
 - Some known issues related to the new channel sidebar, such as that the team icon on-click animation is laggy. [MM-32198](https://mattermost.atlassian.net/browse/MM-11820)
 - Adding an at-mention at the start of a post draft, then pressing the left or right arrow can clear the post draft and the undo history [MM-33823](https://mattermost.atlassian.net/browse/MM-33823).
 - Reddit link previews no longer work in Mattermost. [MM-31899](https://mattermost.atlassian.net/browse/MM-31899)
 - Posts created by bots containing attachments sometimes appear as repeated until the user refreshes the page. [MM-30980](https://mattermost.atlassian.net/browse/MM-30980)
 - Emoji counter in the center channel doesn't always update immediately when a reaction is added in the right-hand side. [MM-31994](https://mattermost.atlassian.net/browse/MM-31994)
 - Slow typing has been experienced when the channel sidebar has many channels. [MM-30407](https://mattermost.atlassian.net/browse/MM-30407)
 - Slack theme import fails due to changes in formatting of Slack export color schemes. [MM-30531](https://mattermost.atlassian.net/browse/MM-30531)
 - Google login fails on the Classic mobile apps.
 - Status may sometimes get stuck as **Away** or **Offline** in High Availability mode with IP Hash turned off.
 - Searching stop words in quotation marks with Elasticsearch enabled returns more than just the searched terms.
 - The team sidebar on the desktop app does not update when channels have been read on mobile.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.

### Contributors
[aaronrothschild](https://github.com/aaronrothschild), [Aeiyko](https://github.com/Aeiyko), [aeomin](https://github.com/aeomin), [AGMETEOR](https://github.com/AGMETEOR), [agnivade](https://github.com/agnivade), [ahmaddanialmohd](https://github.com/ahmaddanialmohd), [Ampit](https://github.com/Ampit), [amwolff](https://github.com/amwolff), [amyblais](https://github.com/amyblais), [angeloskyratzakos](https://github.com/angeloskyratzakos), [antwigambrah](https://github.com/antwigambrah), [anurag6713](https://github.com/anurag6713), [arjunagl](https://github.com/arjunagl), [asaadmahmood](https://github.com/asaadmahmood), [ashishbhate](https://github.com/ashishbhate), [aspleenic](https://github.com/aspleenic), [Ayanrocks](https://github.com/Ayanrocks), [balan2010](https://github.com/balan2010), [bbodenmiller](https://github.com/bbodenmiller), [BenCookie95](https://github.com/BenCookie95), [ByeongsuPark](https://github.com/ByeongsuPark), [camgraff](https://github.com/camgraff), [chenilim](https://github.com/chenilim), [chikei](https://github.com/chikei), [chrisfromredfin](https://github.com/chrisfromredfin), [coltoneshaw](https://github.com/coltoneshaw), [compiledsound](https://github.com/compiledsound), [coreyhulen](https://github.com/coreyhulen), [cpanato](https://github.com/cpanato), [cpoile](https://github.com/cpoile), [crspeller](https://github.com/crspeller), [ctlaltdieliet](https://github.com/ctlaltdieliet), [cwarnermm](https://github.com/cwarnermm), [darkLord19](https://github.com/darkLord19), [deanwhillier](https://github.com/deanwhillier), [devinbinnie](https://github.com/devinbinnie), [dmpichugin](https://github.com/dmpichugin), [ebroda](https://github.com/ebroda), [emilyhollinger](https://github.com/emilyhollinger), [emskaplann](https://github.com/emskaplann), [enahum](https://github.com/enahum), [enelson720](https://github.com/enelson720), [esethna](https://github.com/esethna), [FlipEnergy](https://github.com/FlipEnergy), [flynbit](https://github.com/flynbit), [gabrieljackson](https://github.com/gabrieljackson), [gigawhitlocks](https://github.com/gigawhitlocks), [gruceqq](https://translate.mattermost.com/user/gruceqq/), [haardikdharma10](https://github.com/haardikdharma10), [hahmadia](https://github.com/hahmadia), [hanzei](https://github.com/hanzei), [Hassall](https://github.com/Hassall), [hectorskypl](https://github.com/hectorskypl), [hmhealey](https://github.com/hmhealey), [ialorro](https://github.com/ialorro), [iomodo](https://github.com/iomodo), [isacikgoz](https://github.com/isacikgoz), [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais), [jaydeland](https://github.com/jaydeland), [jespino](https://github.com/jespino), [jfrerich](https://github.com/jfrerich), [johnsonbrothers](https://github.com/johnsonbrothers), [josephbaylon](https://github.com/josephbaylon), [jp0707](https://github.com/jp0707), [justinegeffen](https://github.com/justinegeffen), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [kashifsoofi](https://github.com/kashifsoofi), [kayazeren](https://github.com/kayazeren), [khos2ow](https://github.com/khos2ow), [koox00](https://github.com/koox00), [kristinakvn](https://github.com/kristinakvn), [larkox](https://github.com/larkox), [lawrencejohnson](https://github.com/lawrencejohnson), [levb](https://github.com/levb), [lieut-data](https://github.com/lieut-data), [lindalumitchell](https://github.com/lindalumitchell), [lmammino](https://github.com/lmammino), [lucievr](https://github.com/lucievr), [lynn915](https://github.com/lynn915), [madhavhugar](https://github.com/madhavhugar), [marianunez](https://github.com/marianunez), [maxerenberg](https://github.com/maxerenberg), [metanerd](https://github.com/metanerd), [mgdelacroix](https://github.com/mgdelacroix), [mickmister](https://github.com/mickmister), [migbot](https://github.com/migbot), [mlongo4290](https://github.com/mlongo4290), [moschlar](https://github.com/moschlar), [natalie-hub](https://github.com/natalie-hub), [nathanaelhoun](https://github.com/nathanaelhoun), [nevyangelova](https://github.com/nevyangelova), [nickmisasi](https://github.com/nickmisasi), [nikkinagar](https://github.com/nikkinagar), [nronas](https://github.com/nronas), [ogi-m](https://github.com/ogi-m), [onoklin](https://github.com/onoklin), [pablovelezvidal](https://github.com/pablovelezvidal), [prapti](https://github.com/prapti), [R8s6](https://github.com/R8s6), [rbradleyhaas](https://github.com/rbradleyhaas), [reflog](https://github.com/reflog), [rodcorsi](https://github.com/rodcorsi), [rolwin100](https://github.com/rolwin100), [sadohert](https://github.com/sadohert), [saturninoabril](https://github.com/saturninoabril), [sbishel](https://github.com/sbishel), [schunka](https://github.com/schunka), [shazm](https://github.com/shazm), [shuang2411](https://github.com/shuang2411), [SimonSimonB](https://github.com/SimonSimonB), [srkgupta](https://github.com/srkgupta), [stafot](https://github.com/stafot), [streamer45](https://github.com/streamer45), [stylianosrigas](https://github.com/stylianosrigas), [svenseeberg](https://github.com/svenseeberg), [Szymongib](https://github.com/Szymongib), [thePanz](https://github.com/thePanz), [uhlhosting](https://github.com/uhlhosting), [vpecinka](https://github.com/vpecinka), [vraravam](https://github.com/vraravam), [wf6DJd8a3xSSCZbn](https://github.com/wf6DJd8a3xSSCZbn), [wget](https://github.com/wget), [wiersgallak](https://github.com/wiersgallak), [wiggin77](https://github.com/wiggin77), [Willyfrog](https://github.com/Willyfrog), [yukiisbored](https://github.com/yukiisbored)

## Release v5.31 - [ESR](https://docs.mattermost.com/administration/extended-support-release.html)

- **v5.31.9, released 2021-08-04**
  - Mattermost v5.31.9 contains a medium level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
  - Improved typing performance in affected environments by reducing the frequency at which drafts are saved.
- **v5.31.8, released 2021-07-21**
  - Fixed an issue in clustering where a mutex would fail to be unlocked when a timeout happened. [MM-37246](https://mattermost.atlassian.net/browse/MM-37246)
- **v5.31.7, released 2021-06-21**
  - Fixed an issue with an infinite recursion during message export for Hitachi HCP file backends. [MM-36440](https://mattermost.atlassian.net/browse/MM-36440)
- **v5.31.6, released 2021-06-11**
  - Fixed an issue where subsequent migrations failed to run after running a dot release on new installations. [MM-35931](https://mattermost.atlassian.net/browse/MM-35931)
  - Fixed an issue where messages with fallback text were repeated. [MM-30980](https://mattermost.atlassian.net/browse/MM-30980)
- **v5.31.5, released 2021-05-12**
  - Fixed an issue where ``mmctl channel move`` did not allow moving private channels. [MM-32746](https://mattermost.atlassian.net/browse/MM-32746)
- **v5.31.4, released 2021-04-23**
  - Fixed an issue with client-side slash commands being processed by multiple plugins. [MM-35074](https://mattermost.atlassian.net/browse/MM-35074)
- **v5.31.3, released 2021-04-07**
  - Fixed an issue where cluster handlers were not immediately registered after starting the server. This led to issues where jobs were not scheduled until a request hit the cluster. [MM-34179](https://mattermost.atlassian.net/browse/MM-34179)
  - Fixed an issue where the server version was reported as v5.30.0.
- **v5.31.2, released 2021-03-29**
  - Improved typing performance on busy servers with lots of active users and with the new sidebar enabled. [MM-30407](https://mattermost.atlassian.net/browse/MM-30407)
  - Fixed bugs related to replication lag for Enterprise Edition instances configured to use read replicas. [MM-31094](https://mattermost.atlassian.net/browse/MM-31094)
- **v5.31.1, released 2021-02-05**
  - Fixed an issue where the ``config.json`` was sporadically getting reset upon CLI command execution. [MM-32234](https://mattermost.atlassian.net/browse/MM-32234)
  - Fixed an issue where ``FeatureFlags`` section was getting erroneously written to ``config.json``. [MM-32389](https://mattermost.atlassian.net/browse/MM-32389)
  - Fixed an issue where channels were sometimes removed from custom categories when a user left a team. [MM-30314](https://mattermost.atlassian.net/browse/MM-30314)
  - Fixed an issue where users were unable to mark Direct Messages in a thread as unread. [MM-32253](https://mattermost.atlassian.net/browse/MM-32253)
  - Fixed an issue where ``PermanentDeleteChannel`` failed with "failed to get a thread" error. [MM-31731](https://mattermost.atlassian.net/browse/MM-31731)
- **v5.31.0, released 2021-01-16**
  - Original 5.31.0 release

Mattermost v5.31.0 contains a low level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

### Compatibility

 - Support for Mattermost Server v5.25 [Extended Support Release](https://docs.mattermost.com/administration/extended-support-release.html) is coming to the end of its life cycle on April 16, 2021. Upgrading to Mattermost Server v5.31 [Extended Support Release](https://docs.mattermost.com/administration/extended-support-release.html) or later is highly recommended.

### Highlights

#### Improved status updates for [Incident Management (E20 Edition)](https://mattermost.com/incident-management/)
 - Pre-packaged and pre-installed the Mattermost Incident Management v1.2.0, which enables incident responders to easily inform stakeholders of incident status updates.

### Improvements

#### User Interface (UI)
 - Added the ability to mute categories with the experimental channel sidebar feature.
 - Added support for multi-selection of channels when dragging and dropping between channels in the experimental sidebar feature.
 - Group messages are now returned in the channel switcher when only first names are typed.
 - Issuing ``/dnd`` consecutively no longer unexpectedly toggles the user's status between "Do Not Disturb" and "Online", and will only set the user’s status to "Do Not Disturb".

#### Administration
 - Added a new ``manage_remote_clusters`` permission.

### Bug Fixes
 - Fixed an issue where the ``UnreadMentions`` column was missing in the ``ThreadMemberships`` table for servers upgrading from v5.29.0. Admins planning to enable [Collapsed Reply Threads](https://mattermost.com/blog/dev-sneak-peek-collapsed-reply-threads/) (available in beta in Q1 2021) are recommended to upgrade to v5.31.0 or later.
 - Cleaned up the config store on server initialization errors.
 - Fixed an issue where permissions did not grant read and/or write access to the Global Relay configuration settings.
 - Fixed an issue where the site configuration "Read only" permission did not make the "Notice" section read-only for the System Manager.
 - Fixed an issue where importing Client4 in a node server caused an exception due to rudder modules.
 - Fixed an issue where LDAP ``FirstLoginSync`` didn't close the LDAP session.
 - Fixed an issue where line numbers did not line up with the text on code file previews.
 - Fixed an issue where the threshold from the bottom of the screen was sometimes not respected for received messages.
 - Fixed an issue where desktop notifications got sent for every message posted in a Direct Message channel.
    
### Go Version
 - 5.31 is built with Go ``1.14.6``.

### API Changes
 - Added a new ``POST /api/v4/cloud/webhook`` endpoint.

### Websocket Event Changes
 - Added new websocket events ``thread_updated``, ``thread_follow_changed``, and ``thread_read_changed``.
 
### Known Issues
 - The Database Schema Version is displayed as 5.30.0 in the About Mattermost modal.
 - Config.json can reset when running the command ``systemctl restart mattermost`` and when running any commands that write to the config (e.g. ``config`` or ``plugin``) [MM-33752](https://mattermost.atlassian.net/browse/MM-33752), [MM-32390](https://mattermost.atlassian.net/browse/MM-32390).
 - Reddit link previews no longer work in Mattermost. [MM-31899](https://mattermost.atlassian.net/browse/MM-31899)
 - **Discard Changes** confirmation is not displayed when a System Admin adds people on the **System Roles** System Console page and clicks elsewhere before saving the changes. [MM-29927](https://mattermost.atlassian.net/browse/MM-29927)
 - Error text is missing when the team name is left blank on the team creation page. [MM-31361](https://mattermost.atlassian.net/browse/MM-31361)
 - Posts created by bots containing attachments sometimes appear as repeated until the user refreshes the page. [MM-30980](https://mattermost.atlassian.net/browse/MM-30980)
 - Emoji counter in the center channel doesn't always update immediately when a reaction is added in the right-hand side. [MM-31994](https://mattermost.atlassian.net/browse/MM-31994)
 - Slow typing has been experienced when the channel sidebar has many channels. [MM-30407](https://mattermost.atlassian.net/browse/MM-30407)
 - Slack theme import fails due to changes in formatting of Slack export color schemes. [MM-30531](https://mattermost.atlassian.net/browse/MM-30531)
 - A JavaScript error may appear in some cases when dismissing the new messages toast while scrolled up in the right-hand side. [MM-30446](https://mattermost.atlassian.net/browse/MM-30446)
 - The **Admin Filter** option is not disabled on the AD/LDAP page for Admin roles with the ``sysconsole_write_authentication`` permission. [MM-29089](https://mattermost.atlassian.net/browse/MM-29089)
 - Google login fails on the Classic mobile apps.
 - Status may sometimes get stuck as **Away** or **Offline** in High Availability mode with IP Hash turned off.
 - Searching stop words in quotation marks with Elasticsearch enabled returns more than just the searched terms.
 - The team sidebar on the desktop app does not update when channels have been read on mobile.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.

### Contributors
 - [a-c-sreedhar-reddy](https://github.com/a-c-sreedhar-reddy), [aeomin](https://github.com/aeomin), [agnivade](https://github.com/agnivade), [akshaychhajed](https://github.com/akshaychhajed), [amwsis](https://github.com/amwsis), [amyblais](https://github.com/amyblais), [anurag6713](https://github.com/anurag6713), [ashishbhate](https://github.com/ashishbhate), [avinashlng1080](https://github.com/avinashlng1080), [Ayanrocks](https://github.com/Ayanrocks), [calebroseland](https://github.com/calebroseland), [CandyZack](https://github.com/CandyZack), [catalintomai](https://github.com/catalintomai), [chikei](https://github.com/chikei), [cinlloc](https://github.com/cinlloc), [cpanato](https://github.com/cpanato), [CrHasher](https://github.com/CrHasher), [crspeller](https://github.com/crspeller), [ctlaltdieliet](https://github.com/ctlaltdieliet), [cwarnermm](https://github.com/cwarnermm), [daniel-shuy](https://github.com/daniel-shuy), [der-test](https://github.com/der-test), [devinbinnie](https://github.com/devinbinnie), [DigasNikas](https://github.com/DigasNikas), [edtrist](https://github.com/edtrist), [enahum](https://github.com/enahum), [ethervoid](https://github.com/ethervoid), [flynbit](https://github.com/flynbit), [furqanmlk](https://github.com/furqanmlk), [gabrieljackson](https://github.com/gabrieljackson), [girish17](https://github.com/girish17), [gruceqq](https://translate.mattermost.com/user/gruceqq/), [haardikdharma10](https://github.com/haardikdharma10), [hahmadia](https://github.com/hahmadia), [hanzei](https://github.com/hanzei), [hectorskypl](https://github.com/hectorskypl), [HeroicHitesh](https://github.com/HeroicHitesh), [hmhealey](https://github.com/hmhealey), [iomodo](https://github.com/iomodo), [isacikgoz](https://github.com/isacikgoz), [it33](https://github.com/it33), [jakaya123](https://github.com/jakaya123), [jakubnovak998](https://github.com/jakubnovak998), [jasonblais](https://github.com/jasonblais), [JeremyShih](https://github.com/JeremyShih), [jespino](https://github.com/jespino), [josephbaylon](https://github.com/josephbaylon), [justinegeffen](https://github.com/justinegeffen), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [kayazeren](https://github.com/kayazeren), [kcc343](https://github.com/kcc343), [KevinMarioGerard](https://github.com/KevinMarioGerard), [larkox](https://github.com/larkox), [lawrencejohnson](https://github.com/lawrencejohnson), [Leryan](https://github.com/Leryan), [lieut-data](https://github.com/lieut-data), [marianunez](https://github.com/marianunez), [meilon](https://github.com/meilon), [metanerd](https://github.com/metanerd), [mgdelacroix](https://github.com/mgdelacroix), [michelengelen](https://github.com/michelengelen), [mickmister](https://github.com/mickmister), [migbot](https://github.com/migbot), [MikeworX](https://github.com/MikeworX), [mkraft](https://github.com/mkraft), [mlongo4290](https://github.com/mlongo4290), [msal4](https://github.com/msal4), [nevyangelova](https://github.com/nevyangelova), [nickmisasi](https://github.com/nickmisasi), [nronas](https://github.com/nronas), [pablovelezvidal](https://github.com/pablovelezvidal), [reflog](https://github.com/reflog), [rodcorsi](https://github.com/rodcorsi), [sadohert](https://github.com/sadohert), [saturninoabril](https://github.com/saturninoabril), [SBagaria2710](https://github.com/SBagaria2710), [sbishel](https://github.com/sbishel), [sbley](https://github.com/sbley), [snhardin](https://github.com/snhardin), [streamer45](https://github.com/streamer45), [sudheerDev](https://github.com/sudheerDev), [thePanz](https://github.com/thePanz), [tweichart](https://github.com/tweichart), [Tzunhei](https://github.com/Tzunhei), [uhlhosting](https://github.com/uhlhosting), [vraravam](https://github.com/vraravam), [wget](https://github.com/wget), [wiggin77](https://github.com/wiggin77), [Willyfrog](https://github.com/Willyfrog)

## Release v5.30 - [Feature Release](https://docs.mattermost.com/administration/release-definitions.html#feature-release)

- **v5.30.3, released 2021-02-02**
  - Fixed an issue where the **Edition** diagnostics field was reporting as "null" for Team Edition servers on 5.30.
- **v5.30.2, released 2021-01-18**
  - Fixed an issue where the ``UnreadMentions`` column was missing in the ``ThreadMemberships`` table for servers upgrading from v5.29.0. Admins planning to enable [Collapsed Reply Threads](https://mattermost.com/blog/dev-sneak-peek-collapsed-reply-threads/) (available in beta in Q1 2021) are recommended to upgrade to v5.30.2 or later.
- **v5.30.1, released 2020-12-18**
  - Fixed the displayed modal Build Number version to standard semver.
- **v5.30.0, released 2020-12-16**
  - Original 5.30.0 release

### Compatibility
  - PostgreSQL ended long-term support for [version 9.4 in February 2020](https://www.postgresql.org/support/versioning). From v5.26 Mattermost officially supports PostgreSQL version 10 as PostgreSQL 9.4 is no longer supported. New installs will require PostgreSQL 10+. Previous Mattermost versions, including our current ESR, will continue to be compatible with PostgreSQL 9.4. PostgreSQL 9.4 and all 9.x versions are now fully deprecated in our v5.30 release (December 16, 2020). Please follow the instructions under the Upgrading Section within [the PostgreSQL documentation](https://www.postgresql.org/support/versioning/).

### Highlights

#### Incident Management provided out-of-the-box (E20)
 - Pre-packaged and pre-installed the Incident Management as well as Channel Export plugins for enterprise-ready builds.

#### Configure New Admin Roles Permissions in the System Console (E20, Beta)
 - Mattermost [recently released three new pre-built granular administrator roles](https://mattermost.com/blog/mattermost-release-v5-28/) to enable you to selectively delegate administrative tasks to other members of your organization. The three new roles are System Manager, User Manager, and Read-only Admin. Now you can configure specific permissions for these roles directly from the System Console.

### Improvements

#### User Interface
 - @-autocomplete results are now prioritized based on recency and thread activity.
 - File attachments below the size of 10 (KB, MB, GB, TB, etc.) now allow showing fractions.
 - The formatting of the channel header change message was improved.
 - Team invite workflow now shows BOT tags when the search returns bot users.
 - Added the ability to zoom in and out of PDF files.
 - Added support for 16x16 base64 encoded mini images to use with progressive rendering.

#### Notifications
 - Channel-wide mentions are now automatically disabled when a user mutes a channel.

#### Command Line Interface (CLI)
 - Added new local API endpoints for getting, updating, and deleting incoming and outgoing webhooks.
 - Added ``mmctl system version`` endpoint to print the remote server version.
 - Improved the ``mmctl system status`` command output to include all the reported values.

#### Integrations
 - Updated ``icon_emoji`` field in incoming webhooks to allow emojis to be specified with surrounding colons.
 - Dynamic auto-completion is now supported for built-in slash commands.
 - Added plugin hooks for ``ReactionHasBeenAdded`` and ``ReactionHasBeenRemoved``.

#### Administration
 - Added the ability to load a set of custom configuration defaults from a ``MM_CUSTOM_DEFAULTS_PATH`` environment variable.
 - Added AWS metering service support.

#### Enterprise Edition (EE)
 - Added the ability to retrieve compliance files from the System Console.

### Bug Fixes
 - Fixed a performance issue related to typing lag.
 - Fixed an issue where YouTube previews did not display sometimes.
 - Fixed an issue with broken link previews for Twitter links.
 - Fixed an issue where editing a post did not submit with CMD+ENTER.
 - Fixed an issue where users were able to create or edit slash commands to contain more than two slashes in the URL.
 - Fixed an issue where resized emojis were being overwritten with original data.
 - Fixed an issue where the sidebar category **More** menu was not shown when hovering over a long category name.
 - Fixed an issue where a received direct message notification did not show up on the sidebar if the Direct Message channel was newly created.
 - Fixed an issue where a search using **from:** failed to auto-load more results on the right-hand side when Elasticsearch was enabled.
 - Fixed an issue where an s3 file backend ``TestFileConnection`` failed due to permissions if ``S3PathPrefix`` was in use.
 - Fixed an issue where an ID was missing for a Tooltip in ``PostInfo``.

### config.json
Multiple setting options were added to ``config.json``. Below is a list of the additions and their default values on install. The settings can be modified in ``config.json``, or the System Console when available.

#### Changes to Team Edition and Enterprise Edition:
 - Under ``ExperimentalSettings`` in ``config.json``:
   - Added ``EnableSharedChannels``, to support managing shared channels feature.
 - Under ``SamlSettings`` in ``config.json``:
   - Added ``IgnoreGuestsLdapSync``, to ignore guests when using SAML and synchronizing with LDAP.

### Go Version
 - 5.30 is built with Go ``1.14.6``.

### Open Source Components
 - Added ``@stripe/react-stripe-js``, ``@stripe/stripe-js``, and ``@types/country-list`` to https://github.com/mattermost/mattermost-webapp.
 - Removed ``react-native-image-gallery`` from https://github.com/mattermost/mattermost-mobile.
 - Added ``react-native-redash`` and ``react-native-share`` to https://github.com/mattermost/mattermost-mobile.
 
### Database Changes
 - Added a new column ``minipreview`` to ``FileInfo`` table.

### Websocket Event Changes
 - In ``post_deleted`` websocket event, System Admins are now notified when a user initiates a post deletion.

### API Changes
 - Added new local API endpoints for getting, updating, and deleting incoming and outgoing webhooks.
 - Added new API endpoints to work with experimental collapsed threads.
 
### Known Issues
 - The ``config.json`` may reset itself to default values if the binary is run with the root user.
 - Reddit link previews no longer work in Mattermost. This affects older versions too.
 - **Discard Changes** confirmation is not displayed when an admin adds people in the **System Roles** System Console page, then clicks elsewhere before saving the changes.
 - Slow typing has been experienced when the channel sidebar has many channels. This has been reported in older versions too.
 - Slack theme import fails due to changes in formatting of Slack export color schemes.
 - Error text is missing when the team name is left blank on the team creation page.
 - Line numbers do not line up with the text on code file previews.
 - In some cases reply posts cannot be marked as unread.
 - The threshold from the bottom of the screen is sometimes not respected for received messages.
 - Posts created by bots containing attachments sometimes appear as repeated until the user refreshes the page.
 - Emoji counter in the center channel doesn't always update immediately when a reaction is added in the right-hand side.
 - A JavaScript error may appear in some cases when dismissing the new messages toast while scrolled up in the right-hand side.
 - The Admin Filter option is not disabled in AD/LDAP page for admin roles with ``sysconsole_write_authentication`` permission.
 - On a server using a subpath, the URL opens a blank page if the System Admin changes the Site URL in the System Console. To fix this, the System Admin should restart the server.
 - Login does not work when Custom Terms of Service is enabled and MFA is enforced.
 - Google login fails on the Classic mobile apps.
 - Status may sometimes get stuck as **Away** or **Offline** in High Availability mode with IP Hash turned off.
 - Searching stop words in quotes with Elasticsearch enabled returns more than just the searched terms.
 - Searching with Elasticsearch enabled may not always highlight the searched terms.
 - The team sidebar on the desktop app does not update when channels have been read on mobile.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.

### Contributors
 - [adamjclarkson](https://github.com/adamjclarkson), [aeomin](https://github.com/aeomin), [agarciamontoro](https://github.com/agarciamontoro), [agnivade](https://github.com/agnivade), [akshaychhajed](https://github.com/akshaychhajed), [Ampit](https://github.com/Ampit), [amyblais](https://github.com/amyblais), [angeloskyratzakos](https://github.com/angeloskyratzakos), [Ant0wan](https://github.com/Ant0wan), [antifarben](https://github.com/antifarben), [anurag6713](https://github.com/anurag6713), [ashishbhate](https://github.com/ashishbhate), [AugustasV](https://github.com/AugustasV), [avasconcelos114](https://github.com/avasconcelos114), [BenCookie95](https://github.com/BenCookie95), [bhargav50](https://github.com/bhargav50), [ByeongsuPark](https://github.com/ByeongsuPark), [calebroseland](https://github.com/calebroseland), [CandyZack](https://github.com/CandyZack), [catalintomai](https://github.com/catalintomai), [chikei](https://github.com/chikei), [cinlloc](https://github.com/cinlloc), [coltoneshaw](https://github.com/coltoneshaw), [cpanato](https://github.com/cpanato), [cpoile](https://github.com/cpoile), [crspeller](https://github.com/crspeller), [ctlaltdieliet](https://github.com/ctlaltdieliet), [cwarnermm](https://github.com/cwarnermm), [dalcde](https://github.com/dalcde), [daniel-shuy](https://github.com/daniel-shuy), [danielsischy](https://github.com/danielsischy), [darkLord19](https://github.com/darkLord19), [DavidePrincipi](https://github.com/DavidePrincipi), [deanwhillier](https://github.com/deanwhillier), [der-test](https://github.com/der-test), [devinbinnie](https://github.com/devinbinnie), [dizkek](https://github.com/dizkek), [drraghavendra](https://github.com/drraghavendra), [egrinberg](https://github.com/egrinberg), [eltociear](https://github.com/eltociear), [emilyhollinger](https://github.com/emilyhollinger), [enahum](https://github.com/enahum), [enelson720](https://github.com/enelson720), [erezo9](https://github.com/erezo9), [esethna](https://github.com/esethna), [ethervoid](https://github.com/ethervoid), [fagunbhavsar](https://github.com/fagunbhavsar), [FalseHonesty](https://github.com/FalseHonesty), [flynbit](https://github.com/flynbit), [fmunshi](https://github.com/fmunshi), [gabrieljackson](https://github.com/gabrieljackson), [gigawhitlocks](https://github.com/gigawhitlocks), [GodlikePenguin](https://github.com/GodlikePenguin), [gruceqq](https://translate.mattermost.com/user/gruceqq/), [grundleborg](https://github.com/grundleborg), [haardikdharma10](https://github.com/haardikdharma10), [hack3r-0m](https://github.com/hack3r-0m), [hahmadia](https://github.com/hahmadia), [hannaparks](https://github.com/hannaparks), [hanzei](https://github.com/hanzei), [harryfromwork](https://github.com/harryfromwork), [hectorgabucio](https://github.com/hectorgabucio), [hectorskypl](https://github.com/hectorskypl), [hmhealey](https://github.com/hmhealey), [icy-meteor](https://github.com/icy-meteor), [iomodo](https://github.com/iomodo), [isacikgoz](https://github.com/isacikgoz), [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais), [jecepeda](https://github.com/jecepeda), [JeremyShih](https://github.com/JeremyShih), [jespino](https://github.com/jespino), [jfrerich](https://github.com/jfrerich), [jials](https://github.com/jials), [johnsonbrothers](https://github.com/johnsonbrothers), [jomaxro](https://github.com/jomaxro), [josephbaylon](https://github.com/josephbaylon), [jrepe](https://github.com/jrepe), [jupenur](https://github.com/jupenur), [justinegeffen](https://github.com/justinegeffen), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [kaiwalyakoparkar](https://github.com/kaiwalyakoparkar), [kayazeren](https://github.com/kayazeren), [kichloo](https://github.com/kichloo), [KuSh](https://github.com/KuSh), [larkox](https://github.com/larkox), [lawrencejohnson](https://github.com/lawrencejohnson), [lestgabo](https://github.com/lestgabo), [levb](https://github.com/levb), [lieut-data](https://github.com/lieut-data), [lindalumitchell](https://github.com/lindalumitchell), [lindy65](https://github.com/lindy65), [lucianomagrao](https://github.com/lucianomagrao), [lynn915](https://github.com/lynn915), [Manimaran11](https://github.com/Manimaran11), [marianunez](https://github.com/marianunez), [maticbasle](https://github.com/maticbasle), [mbouzada](https://github.com/mbouzada), [meilon](https://github.com/meilon), [metanerd](https://github.com/metanerd), [mgdelacroix](https://github.com/mgdelacroix), [mickmister](https://github.com/mickmister), [migbot](https://github.com/migbot), [MikeworX](https://github.com/MikeworX), [mkraft](https://github.com/mkraft), [mlongo4290](https://github.com/mlongo4290), [morganrconnolly](https://github.com/morganrconnolly), [msal4](https://github.com/msal4), [muety](https://github.com/muety), [natalie-hub](https://github.com/natalie-hub), [nevyangelova](https://github.com/nevyangelova), [nickmisasi](https://github.com/nickmisasi), [nikolaizah](https://github.com/nikolaizah), [nronas](https://github.com/nronas), [ogi-m](https://github.com/ogi-m), [OgmaJ](https://github.com/OgmaJ), [pablovelezvidal](https://github.com/pablovelezvidal), [persianopencart](https://github.com/persianopencart), [phntom](https://github.com/phntom), [pikami](https://github.com/pikami), [prithvijit-dasgupta](https://github.com/prithvijit-dasgupta), [promulo](https://github.com/promulo), [razum2um](https://github.com/razum2um), [rbradleyhaas](https://github.com/rbradleyhaas), [reflog](https://github.com/reflog), [Remakh](https://github.com/Remakh), [Revanth47](https://github.com/Revanth47), [rishabh710](https://github.com/rishabh710), [rodcorsi](https://github.com/rodcorsi), [rvillablanca](https://github.com/rvillablanca), [sadohert](https://github.com/sadohert), [saturninoabril](https://github.com/saturninoabril), [Saucistophe](https://github.com/Saucistophe), [sbishel](https://github.com/sbishel), [seongwon-kang](https://github.com/seongwon-kang), [SezalAgrawal](https://github.com/SezalAgrawal), [shazm](https://github.com/shazm), [shinnlok](https://github.com/shinnlok), [sowmiyamuthuraman](https://github.com/sowmiyamuthuraman), [Spotts9](https://github.com/Spotts9), [sridhar02](https://github.com/sridhar02), [sstaszkiewicz-copperleaf](https://github.com/sstaszkiewicz-copperleaf), [stafot](https://github.com/stafot), [streamer45](https://github.com/streamer45), [stylianosrigas](https://github.com/stylianosrigas), [sudheerDev](https://github.com/sudheerDev), [svelle](https://github.com/svelle), [Szymongib](https://github.com/Szymongib), [tacoelho](https://github.com/tacoelho), [Tak-Iwamoto](https://github.com/Tak-Iwamoto), [tasdomas](https://github.com/tasdomas), [thefactremains](https://github.com/thefactremains), [thePanz](https://github.com/thePanz), [tianlangwu](https://github.com/tianlangwu), [tohn](https://github.com/tohn), [TQuock](https://github.com/TQuock), [trishitapingolia](https://github.com/trishitapingolia), [tw-ayush](https://github.com/tw-ayush), [tweichart](https://github.com/tweichart), [uhlhosting](https://github.com/uhlhosting), [vanya829](https://github.com/vanya829), [VolatianaYuliana](https://github.com/VolatianaYuliana), [vraravam](https://github.com/vraravam), [weblate](https://github.com/weblate), [wget](https://github.com/wget), [wiersgallak](https://github.com/wiersgallak), [wiggin77](https://github.com/wiggin77), [wijayaerick](https://github.com/wijayaerick), [zarej](https://github.com/zarej), [ZombiMigz](https://github.com/ZombiMigz)

## Release v5.29 - [Quality Release](https://handbook.mattermost.com/operations/research-and-development/product/release-process/release-overview)

- **v5.29.2, released 2021-01-18**
  - Fixed an issue where the ``UnreadMentions`` column was missing in the ``ThreadMemberships`` table for servers upgrading from v5.29.0. Admins planning to enable [Collapsed Reply Threads](https://mattermost.com/blog/dev-sneak-peek-collapsed-reply-threads/) (available in beta in Q1 2021) are recommended to upgrade to v5.29.2 or later.
- **v5.29.1, released 2020-12-03**
  - Disabled the xmlsec1-based SAML library in favor of the re-enabled and improved SAML library.
  - Added ``UnreadMentions`` column to ``ThreadMemberships`` table, and fixed server log warnings related to ``ThreadMemberships``. Admins planning to enable [Collapsed Reply Threads](https://mattermost.com/blog/dev-sneak-peek-collapsed-reply-threads/) (available in beta in Q1 2021) are recommended to upgrade to v5.29.1 or later.
- **v5.29.0, released 2020-11-16**
  - Original 5.29.0 release

### Compatibility
 - A new configuration setting ``ThreadAutoFollow`` has been added to support [Collapsed Reply Threads](https://docs.google.com/presentation/d/1QSrPws3N8AMSjVyOKp15FKT7O0fGMSx8YidjSDS4Wng/edit#slide=id.g2f0aecc189_0_245) releasing in beta in Q1 2021. This setting is enabled by default and may affect server performance. It is recommended to review our [documentation on hardware requirements](https://docs.mattermost.com/install/requirements.html#hardware-requirements) to ensure your servers are appropriately scaled for the size of your user base.

**IMPORTANT:** If you upgrade from a release earlier than v5.28, please read the other [Important Upgrade Notes](https://docs.mattermost.com/administration/important-upgrade-notes.html).

### Highlights

#### Channel Moderation Settings now generally available (E20)
 - [Channel moderation](https://docs.mattermost.com/deployment/team-channel-management.html#channels) feature was moved out of beta to general availability.

#### Mattermost Omnibus now generally available
 - [Mattermost Omnibus](https://docs.mattermost.com/help/getting-started/light-install.html) feature was moved out of beta to general availability.

### Improvements

#### User Interface (UI)
 - Added a new browser favicon state for when there are new messages but no mentions.
 - Improved sort order of the channel switcher to prioritize recently viewed channels.
 - Improved filter control for the new channel sidebar to show unread channels without categories.
 - The 'More unreads' banner in the new channel sidebar was updated to match the new mobile app styling.
 - A threshold was added from the bottom of the screen for the new messages toast.

### Bug Fixes
 - Fixed an issue where Enterprise CLI commands would not run.
 - Fixed an issue where the right-hand side comment box got pushed out of the view when a new message was posted in the message thread.
 - Fixed an issue where the color picker colors were missing from the Announcement Banner page in the System Console.
 - Fixed an issue where links in channels headers overlapped in some cases.
 - Fixed an issue where a plugin could create a blank ephymeral post, leading to a white screen.
 - Fixed an issue where the channel switcher dialog was not accessible with a screen reader.
 - Fixed an issue where email addresses were not auto-detected on invites.
 - Fixed an issue where duplicate sidebar categories could be created on first use of the new experimental sidebar.
 - Fixed an issue where installing plugins on a server using ``FileSettings.PathPrefix`` caused issues.
 - Fixed an issue where the error message was unclear when a plugin crashed during a slash command execution.
 - Fixed an issue where bot icon images had too much height.
 - Fixed an issue where tags where nested in Plugin Marketplace labels.
 - Fixed an issue with inconsistent behaviour in channel mentions in message attachments.
 - Fixed an issue where ephemeral posts posted by bot accounts showed a wrong username on the right-hand side.
 - Fixed an issue where the category headings in the experimental sidebar were not sticky and overlapped the More Unreads indicators.
 - Fixed an issue where Automatic Direct Message Replies were not shown on the right-hand side.
 - Fixed an issue where Automatic Direct Message Replies were still showing after the root post was deleted.

### config.json
Multiple setting options were added to ``config.json``. Below is a list of the additions and their default values on install. The settings can be modified in `config.json`, or the System Console when available.

#### Changes to Team Edition and Enterprise Edition:
 - Under ``ServiceSettings`` in ``config.json``:
   - Added ``ThreadAutoFollow``, to add support for collapsed reply threads.
   - Added ``ManagedResourcePaths``, to add support for a setting to use with the Desktop Managed Resources feature.
   
### Go Version
 - 5.29 is built with Go ``1.14.6``.

### Open Source Components
 - Removed ``@types/react-custom-scrollbars`` from https://github.com/mattermost/mattermost-webapp.

### Database Changes
 - Altered some types and defaults in ``SidebarCategories`` table.
 - Added a new column ``Threads.ChannelId``.
 - Added ``UnreadMentions`` column to ``ThreadMembership`` table.

### Known Issues
 - Emoji counter in the center channel doesn't always update immediately when a reaction is added in the right-hand side.
 - A JavaScript error may appear in some cases when dismissing the new messages toast while scrolled up in the right-hand side.
 - Slow typing has been experienced when the channel sidebar has many channels. This has been reported in older versions too.
 - Slack theme import fails due to changes in formatting of Slack export color schemes.
 - Pressing ENTER closes the Account Settings Edit modal when adjusting the settings for desktop notification sound.
 - Admin Filter option is not disabled in AD/LDAP page for admin roles with ``sysconsole_write_authentication`` permission.
 - Twitter link previews no longer work in Mattermost as Twitter has removed OpenGraph data from its pages.
 - On a server using a subpath, the URL opens a blank page if the System Admin changes the Site URL in the System Console. To fix this, the System Admin should restart the server.
 - Login does not work when Custom Terms of Service is enabled and MFA is enforced.
 - Google login fails on the Classic mobile apps.
 - Status may sometimes get stuck as Away or Offline in High Availability mode with IP Hash turned off.
 - Searching stop words in quotes with Elasticsearch enabled returns more than just the searched terms.
 - Searching with Elasticsearch enabled may not always highlight the searched terms.
 - Team sidebar on desktop app does not update when channels have been read on mobile.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.

### Contributors
 - [7quantumphysics](https://github.com/7quantumphysics), [93lykevin](https://github.com/93lykevin), [abdusabri](https://github.com/abdusabri), [Adovenmuehle](https://github.com/Adovenmuehle), [aedott](https://github.com/aedott), [aeomin](https://github.com/aeomin), [agarciamontoro](https://github.com/agarciamontoro), [agnivade](https://github.com/agnivade), [akshaychhajed](https://github.com/akshaychhajed), [akwanmaroso](https://github.com/akwanmaroso), [alexpjohnson](https://github.com/alexpjohnson), [ali-farooq0](https://github.com/ali-farooq0), [altmas5](https://github.com/altmas5), [amsjavan](https://github.com/amsjavan), [amwolff](https://github.com/amwolff), [amyblais](https://github.com/amyblais), [anchepiece](https://github.com/anchepiece), [angeloskyratzakos](https://github.com/angeloskyratzakos), [Ant0wan](https://github.com/Ant0wan), [arc9693](https://github.com/arc9693), [ArcaneDiver](https://github.com/ArcaneDiver), [ArturBa](https://github.com/ArturBa), [ashishbhate](https://github.com/ashishbhate), [AshishMhrzn10](https://github.com/AshishMhrzn10), [asimsedhain](https://github.com/asimsedhain), [aspleenic](https://github.com/aspleenic), [ataboo](https://github.com/ataboo), [attiss](https://github.com/attiss), [AugustasV](https://github.com/AugustasV), [AugustinJose1221](https://github.com/AugustinJose1221), [avasconcelos114](https://github.com/avasconcelos114), [avinashdhinwa](https://github.com/avinashdhinwa), [Ayanrocks](https://github.com/Ayanrocks), [bhargav50](https://github.com/bhargav50), [ByeongsuPark](https://github.com/ByeongsuPark), [calebroseland](https://github.com/calebroseland), [camgraff](https://github.com/camgraff), [carantunes](https://github.com/carantunes), [catalintomai](https://github.com/catalintomai), [CEOehis](https://github.com/CEOehis), [chetanyakan](https://github.com/chetanyakan), [chikei](https://github.com/chikei), [chrisfromredfin](https://github.com/chrisfromredfin), [cinlloc](https://github.com/cinlloc), [cjmartian](https://github.com/cjmartian), [clarmso](https://github.com/clarmso), [coltoneshaw](https://github.com/coltoneshaw), [cpanato](https://github.com/cpanato), [cpoile](https://github.com/cpoile), [crspeller](https://github.com/crspeller), [ctlaltdieliet](https://github.com/ctlaltdieliet), [daniloff200](https://github.com/daniloff200), [deanwhillier](https://github.com/deanwhillier), [der-test](https://github.com/der-test), [devinbinnie](https://github.com/devinbinnie), [devius](https://github.com/devius), [didithilmy](https://github.com/didithilmy), [DigasNikas](https://github.com/DigasNikas), [diode](https://github.com/diode), [dudupopkhadze](https://github.com/dudupopkhadze), [edtrist](https://github.com/edtrist), [emilyacook](https://github.com/emilyacook), [emilyhollinger](https://github.com/emilyhollinger), [enahum](https://github.com/enahum), [enelson720](https://github.com/enelson720), [EnzoBtv](https://github.com/EnzoBtv), [erezo9](https://github.com/erezo9), [ericjaystevens](https://github.com/ericjaystevens), [esethna](https://github.com/esethna), [ethervoid](https://github.com/ethervoid), [evilghostgirl](https://github.com/evilghostgirl), [fakela](https://github.com/fakela), [filipghorbani](https://github.com/filipghorbani), [fireynis](https://github.com/fireynis), [flynbit](https://github.com/flynbit), [fmunshi](https://github.com/fmunshi), [gabrieljackson](https://github.com/gabrieljackson), [Ganzabahl](https://github.com/Ganzabahl), [GodlikePenguin](https://github.com/GodlikePenguin), [goldsziggy](https://github.com/goldsziggy), [gruceqq](https://translate.mattermost.com/user/gruceqq/), [grundleborg](https://github.com/grundleborg), [gupsho](https://github.com/gupsho), [haardikdharma10](https://github.com/haardikdharma10), [hahmadia](https://github.com/hahmadia), [hanzei](https://github.com/hanzei), [hardikmodi1](https://github.com/hardikmodi1), [hectorgabucio](https://github.com/hectorgabucio), [hectorskypl](https://github.com/hectorskypl), [hiendinhngoc](https://github.com/hiendinhngoc), [hirenchauhan2](https://github.com/hirenchauhan2), [hmhealey](https://github.com/hmhealey), [icy-meteor](https://github.com/icy-meteor), [imakish](https://github.com/imakish), [isacikgoz](https://github.com/isacikgoz), [it33](https://github.com/it33), [jasimmons](https://github.com/jasimmons), [jasonblais](https://github.com/jasonblais), [jaydeland](https://github.com/jaydeland), [jaypitroda12](https://github.com/jaypitroda12), [jecepeda](https://github.com/jecepeda), [jekill](https://github.com/jekill), [jespino](https://github.com/jespino), [jfrerich](https://github.com/jfrerich), [jgilliam17](https://github.com/jgilliam17), [jmakhack](https://github.com/jmakhack), [johnsonbrothers](https://github.com/johnsonbrothers), [Jonany](https://github.com/Jonany), [josephbaylon](https://github.com/josephbaylon), [joshuabezaleel](https://github.com/joshuabezaleel), [jufab](https://github.com/jufab), [justinegeffen](https://github.com/justinegeffen), [kaakaa](https://github.com/kaakaa), [kashifsoofi](https://github.com/kashifsoofi), [kayazeren](https://github.com/kayazeren), [khos2ow](https://github.com/khos2ow), [khushijindal](https://github.com/khushijindal), [KrishnaSindhur](https://github.com/KrishnaSindhur), [KuSh](https://github.com/KuSh), [larkox](https://github.com/larkox), [Leryan](https://github.com/Leryan), [lestgabo](https://github.com/lestgabo), [levb](https://github.com/levb), [lieut-data](https://github.com/lieut-data), [lindalumitchell](https://github.com/lindalumitchell), [lindy65](https://github.com/lindy65), [lipmem](https://github.com/lipmem), [lucianomagrao](https://github.com/lucianomagrao), [lushan01](https://github.com/lushan01), [lynn915](https://github.com/lynn915), [M-Buntoro](https://github.com/M-Buntoro), [Manimaran11](https://github.com/Manimaran11), [marcelo-cardozo](https://github.com/marcelo-cardozo), [marianunez](https://github.com/marianunez), [mathiasvr](https://github.com/mathiasvr), [maticbasle](https://github.com/maticbasle), [mattermod](https://github.com/mattermod), [mbouzada](https://github.com/mbouzada), [mdabydeen](https://github.com/mdabydeen), [meilon](https://github.com/meilon), [metanerd](https://github.com/metanerd), [mgdelacroix](https://github.com/mgdelacroix), [michelengelen](https://github.com/michelengelen), [mickmister](https://github.com/mickmister), [migbot](https://github.com/migbot), [MikeworX](https://github.com/MikeworX), [mishkaowner](https://github.com/mishkaowner), [mkraft](https://github.com/mkraft), [mlongo4290](https://github.com/mlongo4290), [MohanSha](https://github.com/MohanSha), [moussetc](https://github.com/moussetc), [n-thumann](https://github.com/n-thumann), [natalie-hub](https://github.com/natalie-hub), [nathanaelhoun](https://github.com/nathanaelhoun), [nbolender](https://github.com/nbolender), [NCC-1031](https://github.com/NCC-1031), [nevyangelova](https://github.com/nevyangelova), [NexWeb](https://github.com/NexWeb), [ng29](https://github.com/ng29), [nickmisasi](https://github.com/nickmisasi), [nikolaizah](https://github.com/nikolaizah), [nizarmah](https://github.com/nizarmah), [ogi-m](https://github.com/ogi-m), [Oppodelldog](https://github.com/Oppodelldog), [outofgamut](https://github.com/outofgamut), [ozdemirburak](https://github.com/ozdemirburak), [palcodes](https://github.com/palcodes), [paulussujono](https://github.com/paulussujono), [Phizzard](https://github.com/Phizzard), [pikami](https://github.com/pikami), [Poussinette](https://github.com/Poussinette), [pranavtharoor](https://github.com/pranavtharoor), [prapti](https://github.com/prapti), [prazolpp](https://github.com/prazolpp), [promulo](https://github.com/promulo), [radoslavius](https://github.com/radoslavius), [Raj-Datta-Manohar](https://github.com/Raj-Datta-Manohar), [RanadeepPolavarapu](https://github.com/RanadeepPolavarapu), [rbradleyhaas](https://github.com/rbradleyhaas), [reflog](https://github.com/reflog), [Revanth47](https://github.com/Revanth47), [rishabh710](https://github.com/rishabh710), [rodcorsi](https://github.com/rodcorsi), [rvillablanca](https://github.com/rvillablanca), [sakaitsu](https://github.com/sakaitsu), [saturninoabril](https://github.com/saturninoabril), [sbishel](https://github.com/sbishel), [seongwon-kang](https://github.com/seongwon-kang), [SezalAgrawal](https://github.com/SezalAgrawal), [ShajithaMohammed](https://github.com/ShajithaMohammed), [shazm](https://github.com/shazm), [shieldsjared](https://github.com/shieldsjared), [shihanng](https://github.com/shihanng), [Shivam7-1](https://github.com/Shivam7-1), [shred86](https://github.com/shred86), [shtelzerartem](https://github.com/shtelzerartem), [sikloidz](https://github.com/sikloidz), [simross](https://github.com/simross), [singh-sarabjeet](https://github.com/singh-sarabjeet), [SinithH](https://github.com/SinithH), [sirMackk](https://github.com/sirMackk), [sowmiyamuthuraman](https://github.com/sowmiyamuthuraman), [spielers](https://github.com/spielers), [spiritbro1](https://github.com/spiritbro1), [sridhar02](https://github.com/sridhar02), [srkgupta](https://github.com/srkgupta), [streamer45](https://github.com/streamer45), [stylianosrigas](https://github.com/stylianosrigas), [sudheerDev](https://github.com/sudheerDev), [sudiptog81](https://github.com/sudiptog81), [Sumindar](https://github.com/Sumindar), [svelle](https://github.com/svelle), [Szymongib](https://github.com/Szymongib), [Tak-Iwamoto](https://github.com/Tak-Iwamoto), [talentedunicorn](https://github.com/talentedunicorn), [tasdomas](https://github.com/tasdomas), [tellustheguru](https://github.com/tellustheguru), [teresa-novoa](https://github.com/teresa-novoa), [thefactremains](https://github.com/thefactremains), [TheoVitkovskiy](https://github.com/TheoVitkovskiy), [thePanz](https://github.com/thePanz), [TQuock](https://github.com/TQuock), [tsabi](https://github.com/tsabi), [tw-ayush](https://github.com/tw-ayush), [uhlhosting](https://github.com/uhlhosting), [utkuufuk](https://github.com/utkuufuk), [vaibhav111tandon](https://github.com/vaibhav111tandon), [vanya829](https://github.com/vanya829), [varunks99](https://github.com/varunks99), [vipul08](https://github.com/vipul08), [vladimirdotk](https://github.com/vladimirdotk), [VolatianaYuliana](https://github.com/VolatianaYuliana), [wget](https://github.com/wget), [wiersgallak](https://github.com/wiersgallak), [wijayaerick](https://github.com/wijayaerick), [Willyfrog](https://github.com/Willyfrog), [yash2189](https://github.com/yash2189)

## Release v5.28 - [Feature Release](https://docs.mattermost.com/process/release-faq.html#release-overview)

- **v5.28.2, released 2020-12-03**
  - Disabled the xmlsec1-based SAML library in favor of the re-enabled and improved SAML library.
- **v5.28.1, released 2020-10-19**
  - Fixed an issue where mmctl Command Line Tool (Beta) was broken on Mattermost server v5.28.0. [MM-29740](https://mattermost.atlassian.net/browse/MM-29740)
  - Fixed an issue where the Compliance Exports were taking too long on large deployments. This was fixed with a performance optimization of the message export query.
- **v5.28.0, released 2020-10-16**
  - Original 5.28.0 release

### Compatibility
 - PostgreSQL ended long-term support for [version 9.4 in February 2020](https://www.postgresql.org/support/versioning). Mattermost is officially supporting PostgreSQL version 10 with v5.26 release as PostgreSQL 9.4 is no longer supported. New installs will require PostgreSQL 10+. Previous Mattermost versions, including our current ESR, will continue to be compatible with PostgreSQL 9.4. We plan on fully deprecating PostgreSQL 9.4 and all 9.x versions in our v5.30 release (December 16, 2020). Please follow the instructions under the Upgrading Section within [the PostgreSQL documentation](https://www.postgresql.org/support/versioning/).
 - Support for Mattermost Server [Extended Support Release](https://docs.mattermost.com/administration/extended-support-release.html) (ESR) 5.19 has come to the end of its lifecycle. Upgrading to Mattermost Server v5.25 or later is required.
 - TLS versions 1.0 and 1.1 have been deprecated by browser vendors. Starting in v5.31 (January 16, 2021) mmctl will return an error when connected to Mattermost servers deployed with these TLS versions and System Admins will need to explicitly add a flag in their commands to continue to use them. We recommend upgrading to TLS version 1.2 or higher.

### Breaking Changes
 - Now when the service crashes, it will generate a coredump instead of just dumping the stack trace to the console. This allows us to preserve the full information of the crash to help with debugging it. For more information about coredumps, please see: https://man7.org/linux/man-pages/man5/core.5.html.  

**IMPORTANT:** If you upgrade from a release earlier than v5.27, please read the other [Important Upgrade Notes](https://docs.mattermost.com/administration/important-upgrade-notes.html).

### Highlights

#### New admin roles to delegate administration tasks to other types of administrators (E20)
 - New admin roles are additional system roles that have access to designated areas of the System Console. This enables you to delegate certain administrative tasks to other members of your organization.

#### Certificate-based authentication with AD/LDAP (E10)
 - You can now improve the security of your AD/LDAP authentication with certificate-based AD/LDAP authentication.

#### Stay current with in-product notices
 - With in-product notices, users and Admins will be made aware of the newest product enhancements from within Mattermost. [Learn more about in-product notices here](https://docs.mattermost.com/administration/notices.html).

### Improvements

#### User Interface (UI)
 - Improved the readability of the toast banner message timestamp, post timestamp, and date separators.
 - Added animation for emoji reactions on webapp.
 - Added the ability to use CTRL+B and CTRL+I to add bold and italics markdown formatting to selected text.
 - Clicking on original message creator's username in discontinuing posts now opens the user's profile popover.
 - Added support for PSD file preview.
 - When the **Enable Latex Rendering** option is set to ``true``, the current code now doesn't highlight.
 - Updated the UX of the **More unreads** indicator in the channel sidebar.
 - **Select Team** list container now scales in width based on browser window width.
 - Added support for signaling login to other tabs (Windows, macOS and Linux browsers).

#### Search
 - Added wildcard support to Bleve.
 - Search terms including stopwords now return matching stopwords instead of an empty result.
 - Removed duplication in ``is_or_search`` and ``IncludeDeletedChannels`` parameters for search.
 - ``*`` characters are now filtered from the search terms in the database.
 - Fixed inconsistencies across product when using ``in:@` / `in:``, such as displaying Direct and Group Messages in ``in:@`` search suggestions.

#### Notifications
 - Added an option in the **Account Settings** to select different desktop notification sounds. This setting is available in supported browsers and in the Desktop app v4.6 and later.

#### Command Line Interface (CLI)
 - Added ``config migrate``, ``config subpath``, ``user delete``, ``integrity``, ``user migrate_auth``, ``moveChannel``, ``updateChannelPrivacy``, ``restoreTeam``, ``channel delete``, and plugin marketplace commands to mmctl.
 
#### Plugins
 - Plugins now start concurrently on server startup.
 - Plugin tooltips are now only rendered when user hovers over a link.
 - Added a ``CreateCommand`` plugin API that creates a slash command that is not handled by the plugin itself.
 
#### Administration
 - Added the ability to upload and remove private and public certificates for LDAP authentication.
 - Added support for resumable file uploads.
 - Added the ability to convert a public channel to private and vice versa via Advanced Permissions.
 - Added filters to search teams in Teams page.
 - Improved logging related to sessions that are not found.
 - Created Grafana enterprise metrics for logging, such as for current queue level(s), rate of logging records emitted, and rate of logging errors.
 - Improved logging when ``GetUser`` fails during MFA Authentication.
 - Added support for sending telemetry via an environment variable set by packages to identify type of deployment (e.g. Docker, Mattermost Omnibus).

### Bug Fixes
 - Fixed an issue where a large number of archived channels caused performance degradation.
 - Fixed an issue where ``group list-ldap`` mmctl command didn't return any results.
 - Fixed an issue where user were allowed to update their profile picture on ADFS setup with SAML and LDAP configured and AD/LDAP Sync enabled.
 - Fixed an issue where patching the config with ``DataSourceReplicas`` caused a panic.
 - Fixed an issue where API invites by email were silently rate-limited.
 - Fixed an issue where deactivated users broke pagination in Manage Members modal.
 - Fixed an issue where an error occurred while inviting more than 20 users to a team via **Invite People**.
 - Fixed an issue where a ``PostUtils.formatText`` crashed when formatting text with unicode emoji.
 - Fixed an issue where a white screen occurred when editing a post and sending the post from a preview mode.
 - Fixed an issue on Microsoft Edge (non-Chromium) where logging out caused the user to get stuck at a loading screen.
 - Fixed an issue where a selected item in the Direct Messages **More** menu didn’t scroll into view when using keyboard navigation.
 - Fixed an issue where users received ghost notifications when the "First name trigger mention" setting was set but the "First Name" was not set.
 - Fixed an issue where post text was partially hidden by the post hover menu.
 - Fixed an issue where users were unable to type color hex value into custom theme color input box.
 - Fixed an issue where the badge with a mention count on the team sidebar did not increment when user was added to a channel.
 - Fixed an issue where Group Message results were prioritized over Direct Message results for Full Name in the user autocomplete.
 - Fixed an issue where the New Message indicator was broken when a webhook owned by the user posted to a channel.
 - Fixed an issue where the active search bar was not vertically aligned with left edge of the right-hand side in tablet view.
 - Fixed an issue where there were two scrollbars showing in the channel switcher.
 - Fixed an issue where the "Start trial" message was unreadable in the System Console on dark theme on first load.
 - Fixed an issue on Firefox where pasting an image also added the file as text.
 - Fixed an issue where Python syntax highlighting handled ``"""`` strangely.
 - Fixed an issue where formatting around inline codes was missing.
 - Fixed an issue where ``GetPluginStatus`` didn't work in a non-cluster environment.

### config.json
Multiple setting options were added to ``config.json``. Below is a list of the additions and their default values on install. The settings can be modified in `config.json`, or the System Console when available.

#### Changes to Team Edition and Enterprise Edition:
 - Under ``LdapSettings`` in ``config.json``:
     - Added ``PublicCertificateFile``, to be able to upload the public certificate to be used for encryption with SAML configuration.
     - Added ``PrivateKeyFile``, to be able to upload the private key to be used for encryption with SAML configuration.
 - Under ``ServiceSettings`` in ``config.json``:
     - Added ``EnableAPIChannelDeletion``, to permanently delete channels for compliance reasons.
     - Added ``EnableAPIUserDeletion``, to permanently delete users for compliance reasons.
 - Under ``NotificationLogSettings`` and ``ExperimentalAuditSettings`` in ``config.json``:
     - Added ``AdvancedLoggingConfig``, to enable configuration options for setting audit targets.
 - Under ``AnnouncementSettings`` in ``config.json``:
     - Added ``AdminNoticesEnabled`` and ``UserNoticesEnabled``, to enable in-product notices to make users and Admins aware of the newest product enhancements from within Mattermost.
 - ``EnableCustomEmoji``, ``EnableGifPicker``, ``ExperimentalViewArchivedChannels`` and ``ExperimentalTimezone`` are now enabled by default for new installs.

### Open Source Components
 - Added ``react-is`` and ``tinycolor2`` to https://github.com/mattermost/mattermost-webapp.
 - Removed ``@types/highlight.js``, ``@typescript-eslint/parser``, ``bootstrap-colorpicker``, and ``intl`` from https://github.com/mattermost/mattermost-webapp.
 - Removed ``react-native-v8`` from https://github.com/mattermost/mattermost-mobile.

### Database Changes
 - Added a new column ``Commands.PluginId``.
 - Changed to data type of ``Teams.Type to varchar(255)``.
 - Changed to data type of ``Teams.SchemeId to varchar(26)``.
 - Changed to data type of ``IncomingWebhooks.Username to varchar(255)``.
 - Changes to data type of ``IncomingWebhooks.IconURL to text",``.

### API Changes
 - Added ``POST /upgrade_to_enterprise`` API endpoint.
 - Added ``GET /upgrade_to_enterprise/status`` API endpoint.
 - Added ``POST /restart`` API endpoint.
 - Added ``GET /warn_metrics/status`` API endpoint.
 - Added ``POST /warn_metrics/ack/:warn_metric_id`` API endpoint.
 
### Known Issues
 - Emoji counter in the center channel doesn't always update immediately when a reaction is added in the right-hand side.
 - Pressing ENTER closes the Account Settings Edit modal when adjusting the settings for desktop notification sound.
 - Admin Filter option is not disabled in AD/LDAP page for admin roles with ``sysconsole_write_authentication`` permission.
 - Twitter link previews no longer work in Mattermost as Twitter has removed OpenGraph data from its pages.
 - On a server using a subpath, the URL opens a blank page if the System Admin changes the Site URL in the System Console. To fix this, the System Admin should restart the server.
 - Login does not work when Custom Terms of Service is enabled and MFA is enforced.
 - Google login fails on the Classic mobile apps.
 - Status may sometimes get stuck as Away or Offline in High Availability mode with IP Hash turned off.
 - Searching stop words in quotes with Elasticsearch enabled returns more than just the searched terms.
 - Searching with Elasticsearch enabled may not always highlight the searched terms.
 - Team sidebar on desktop app does not update when channels have been read on mobile.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.

### Contributors
 - [aaronrothschild](https://github.com/aaronrothschild), [aedott](https://github.com/aedott), [aeomin](https://github.com/aeomin), [agarciamontoro](https://github.com/agarciamontoro), [agnivade](https://github.com/agnivade), [ali-farooq0](https://github.com/ali-farooq0), [amwolff](https://github.com/amwolff), [amyblais](https://github.com/amyblais), [angeloskyratzakos](https://github.com/angeloskyratzakos), [apollo13](https://github.com/apollo13), [archit-p](https://github.com/archit-p), [arshchimni](https://github.com/arshchimni), [asaadmahmood](https://github.com/asaadmahmood), [ashishbhate](https://github.com/ashishbhate), [asimsedhain](https://github.com/asimsedhain), [avasconcelos114](https://github.com/avasconcelos114), [Ayanrocks](https://github.com/Ayanrocks), [bbodenmiller](https://github.com/bbodenmiller), [bhargav50](https://github.com/bhargav50), [calebroseland](https://github.com/calebroseland), [catalintomai](https://github.com/catalintomai), [chikei](https://github.com/chikei), [clarmso](https://github.com/clarmso), [colorfusion](https://github.com/colorfusion), [cpanato](https://github.com/cpanato), [cpoile](https://github.com/cpoile), [crspeller](https://github.com/crspeller), [ctlaltdieliet](https://github.com/ctlaltdieliet), [der-test](https://github.com/der-test), [devinbinnie](https://github.com/devinbinnie), [devius](https://github.com/devius), [DylanWard14](https://github.com/DylanWard14), [elaine-mattermost](https://github.com/elaine-mattermost), [elyscape](https://github.com/elyscape), [emilyhollinger](https://github.com/emilyhollinger), [enahum](https://github.com/enahum), [enelson720](https://github.com/enelson720), [esethna](https://github.com/esethna), [ethervoid](https://github.com/ethervoid), [fakoor](https://github.com/fakoor), [flynbit](https://github.com/flynbit), [fmunshi](https://github.com/fmunshi), [furqanmlk](https://github.com/furqanmlk), [gabrieljackson](https://github.com/gabrieljackson), [gigawhitlocks](https://github.com/gigawhitlocks), [gracion](https://github.com/gracion), [gruceqq](https://translate.mattermost.com/user/gruceqq/), [grundleborg](https://github.com/grundleborg), [hahmadia](https://github.com/hahmadia), [hanzei](https://github.com/hanzei), [hectorskypl](https://github.com/hectorskypl), [hmhealey](https://github.com/hmhealey), [iomodo](https://github.com/iomodo), [isacikgoz](https://github.com/isacikgoz), [it33](https://github.com/it33), [jakubnovak998](https://github.com/jakubnovak998), [jasonblais](https://github.com/jasonblais), [jaydeland](https://github.com/jaydeland), [jecepeda](https://github.com/jecepeda), [JeremyShih](https://github.com/JeremyShih), [jespino](https://github.com/jespino), [jfrerich](https://github.com/jfrerich), [jgilliam17](https://github.com/jgilliam17), [johnsonbrothers](https://github.com/johnsonbrothers), [josephbaylon](https://github.com/josephbaylon), [josephk96](https://github.com/josephk96), [jp0707](https://github.com/jp0707), [JtheBAB](https://github.com/JtheBAB), [jupenur](https://github.com/jupenur), [justinegeffen](https://github.com/justinegeffen), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [kashifsoofi](https://github.com/kashifsoofi), [kayazeren](https://github.com/kayazeren), [khos2ow](https://github.com/khos2ow), [kosgrz](https://github.com/kosgrz), [lanjp](https://github.com/lanjp), [larkox](https://github.com/larkox), [levb](https://github.com/levb), [lieut-data](https://github.com/lieut-data), [lindalumitchell](https://github.com/lindalumitchell), [Lumexralph](https://github.com/Lumexralph), [luryus](https://github.com/luryus), [lynn915](https://github.com/lynn915), [M-ZubairAhmed](https://github.com/M-ZubairAhmed), [marianunez](https://github.com/marianunez), [MathewtheCoder](https://github.com/MathewtheCoder), [mathiusjohnson](https://github.com/mathiusjohnson), [meilon](https://github.com/meilon), [metanerd](https://github.com/metanerd), [mgdelacroix](https://github.com/mgdelacroix), [mickmister](https://github.com/mickmister), [migbot](https://github.com/migbot), [mkraft](https://github.com/mkraft), [mlongo4290](https://github.com/mlongo4290), [mozkomor05](https://github.com/mozkomor05), [natalie-hub](https://github.com/natalie-hub), [nevyangelova](https://github.com/nevyangelova), [nickmisasi](https://github.com/nickmisasi), [nikolaizah](https://github.com/nikolaizah), [ogi-m](https://github.com/ogi-m), [openmohan](https://github.com/openmohan), [prapti](https://github.com/prapti), [rbradleyhaas](https://github.com/rbradleyhaas), [reflog](https://github.com/reflog), [rodcorsi](https://github.com/rodcorsi), [RohitJain13](https://github.com/RohitJain13), [rvillablanca](https://github.com/rvillablanca), [saturninoabril](https://github.com/saturninoabril), [sbishel](https://github.com/sbishel), [shieldsjared](https://github.com/shieldsjared), [sridhar02](https://github.com/sridhar02), [srkgupta](https://github.com/srkgupta), [StevenPhan](https://github.com/StevenPhan), [streamer45](https://github.com/streamer45), [stylianosrigas](https://github.com/stylianosrigas), [sudheerDev](https://github.com/sudheerDev), [Tak-Iwamoto](https://github.com/Tak-Iwamoto), [tasdomas](https://github.com/tasdomas), [teresa-novoa](https://github.com/teresa-novoa), [thefactremains](https://github.com/thefactremains), [thePanz](https://github.com/thePanz), [TQuock](https://github.com/TQuock), [txeli](https://github.com/txeli), [uhlhosting](https://github.com/uhlhosting), [vladimirdotk](https://github.com/vladimirdotk), [wget](https://github.com/wget), [wiersgallak](https://github.com/wiersgallak), [wiggin77](https://github.com/wiggin77), [Willyfrog](https://github.com/Willyfrog)

## Release v5.27 - [Quality Release](https://docs.mattermost.com/process/release-faq.html#release-overview)

- **v5.27.2, released 2020-12-03**
  - Disabled the xmlsec1-based SAML library in favor of the re-enabled and improved SAML library.
- **v5.27.1, released 2020-10-19**
  - Fixed an issue where the Compliance Exports were taking too long on large deployments. This was fixed with a performance optimization of the message export query.
- **v5.27.0, released 2020-09-16**
  - Original 5.27.0 release

Mattermost v5.27.0 contains a low level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

### Improvements
 - Added the ability to upgrade Mattermost from Team Edition to Enterprise Edition directly from the System Console.
 - Added various improvements for Admin Advisor feature (Team Edition), including that the bot messages now appear only once for the 500-user advisory and the banner notification interval is reduced from daily to weekly.
 - Changed the Default Theme setting in the System Console to a drop-down field.

### Bug Fixes
 - Fixed an issue where the server crashed when a Compliance Export job was run for Global Relay EML.
 - Fixed an issue where Compliance Jobs did not restart correctly after a `Warning` status.
 - Fixed an issue where users were not matching on mixed-case SAML assertions.
 - Fixed an issue where Channel Admin was not able to make the default role as Channel Admin for AD/LDAP Groups.
 - Fixed an issue where user role was not added correctly in the Members block in **System Console > Teams**.
 - Fixed an issue where a team stopped loading in the System Console **Filter By**-dropdown when a search was performed and then cleared.
 - Fixed an issue where the ability to demote Admins to members and to deactivate accounts from **System Console > Users** was not available.
 - Fixed an issue where a false message "Group Mentions is already taken" was shown when a System Admin tried to add a channel to an AD/LDAP Group.
 - Fixed an issue where a AD/LDAP group mention of an outsider group was highlighted in a Group Synced channel.
 - Fixed an issue where incoming webhooks owned by a bot did not consistently allow a username override.
 - Fixed an issue where the emoji picker in the Edit Post modal was misaligned.
 - Fixed an issue where pasted unicode emojis failed to appear once posted.
 - Fixed an issue where long text in message edit modal did not scroll with a scroll bar.
 - Fixed an issue with Accessibility where user's name was not displayed in alt text on some images.
 - Fixed an issue where dates on **System Console > Site Statistics - Dates** were displayed out of order on days when there were no posts.
 - Fixed an issue where the Admin Advisor bot was unexpectedly displayed in the **Integrations > Bot Accounts** page.
 - Fixed an issue where a new badge in the channel sidebar category header reappeard after a channel was removed from the category.
 - Fixed an issue where the theme color for **Sidebar Text Active Border** was not currently being used in the active border in the sidebar.
 - Fixed an issue where users saw an incorrect mention count when added to a channel by another user.
 - Fixed an issue where channels created from another browser tab did not immediately appear in the channel sidebar.
 - Fixed an issue where a console error showed when creating a new custom category in the channel sidebar.
 - Fixed an issue where enabling the new channel sidebar created invalid channel links.
 - Fixed an issue where a channel state got broken after an "unallowed" deletion.
 - Fixed an issue where dynamic slash command autocomplete options did not update between requests.
 - Fixed an issue where an incorrect callback URL with OAuth 2.0 allowed users to click **Back to Mattermost** in the authentication window.
 - Fixed an issue where editing "Full Name" got overwritten by Single Sign-On settings.
 - Fixed an issue where "You do not have the appropriate permissions" error was shown for ``warn_metrics`` call for non-admin users.
 - Fixed an issue where the channel switcher sometimes showed a wrong empty state with network API.
 - Fixed an issue where the loader was not hidden when posts were not loading which affected the performance of some Linux distros.
 - Fixed an issue where ``PatchConfig`` caused a panic if ``SiteURL`` was not set.
 - Fixed an issue where a panic occurred when the server was getting a shutdown before ``InitPlugins()`` was able to complete.
 - Fixed an issue where a panic was caused when a user joined a team with default channels archived.
 - Fixed an issue where ``App.GetSidebarCategories()`` panicked on nil returned value.
 - Fixed an issue where the ``SendEmailNotifications`` setting blocked testing the SMTP connection.

### Open Source Components
 - Removed ``@types/redux-mock-store`` and ``tinycolor2`` from https://github.com/mattermost/mattermost-webapp.
 - Added ``bootstrap-colorpicker`` in https://github.com/mattermost/mattermost-webapp.
 - Added ``@react-native-community/clipboard`` in https://github.com/mattermost/mattermost-mobile.

### API Changes
 - Added ``POST api/v4/upgrade_to_enterprise`` API endpoint to be able to execute an inplace upgrade from Team Edition to Enterprise Edition.
 - Added ``GET api/v4/upgrade_to_enterprise/status`` API endpoint to get the current status for the inplace upgrade from Team Edition to Enterprise Edition.
 - Added ``POST api/v4/restart`` API endpoint to restart the system after an upgrade from Team Edition to Enterprise Edition.
 
### Known Issues
 - A blank screen occurs when user edits a post and submits or cancels the edits while on Preview mode.
 - Twitter link previews do not work in Mattermost.
 - On a server using a subpath, the URL opens a blank page if the System Admin changes the Site URL in the System Console. To fix this, the System Admin should restart the server.
 - Login does not work when Custom Terms of Service is enabled and MFA is enforced.
 - Google login fails on the Classic mobile apps.
 - Status may sometimes get stuck as Away or Offline in High Availability mode with IP Hash turned off.
 - Searching stop words in quotes with Elasticsearch enabled returns more than just the searched terms.
 - Searching with Elasticsearch enabled may not always highlight the searched terms.
 - Team sidebar on desktop app does not update when channels have been read on mobile.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.

### Contributors
 - [abdulsmapara](https://github.com/abdulsmapara), [abdusabri](https://github.com/abdusabri), [Adovenmuehle](https://github.com/Adovenmuehle), [aeomin](https://github.com/aeomin), [agarciamontoro](https://github.com/agarciamontoro), [agnivade](https://github.com/agnivade), [aidapira](https://github.com/aidapira), [ali-farooq0](https://github.com/ali-farooq0), [amyblais](https://github.com/amyblais), [amynicol1985](https://github.com/amynicol1985), [angeloskyratzakos](https://github.com/angeloskyratzakos), [ankallio](https://github.com/ankallio), [asaadmahmood](https://github.com/asaadmahmood), [ashishbhate](https://github.com/ashishbhate), [AugustasV](https://github.com/AugustasV), [avasconcelos114](https://github.com/avasconcelos114), [BaaaZen](https://github.com/BaaaZen), [bbodenmiller](https://github.com/bbodenmiller), [bill2004158](https://github.com/bill2004158), [bradjcoughlin](https://github.com/bradjcoughlin), [calebroseland](https://github.com/calebroseland), [catalintomai](https://github.com/catalintomai), [chakatz](https://github.com/chakatz), [chikei](https://github.com/chikei), [corey-robinson](https://github.com/corey-robinson), [cpanato](https://github.com/cpanato), [cpoile](https://github.com/cpoile), [crspeller](https://github.com/crspeller), [ctlaltdieliet](https://github.com/ctlaltdieliet), [danielhelfand](https://github.com/danielhelfand), [DanielSz50](https://github.com/DanielSz50), [dantepippi](https://github.com/dantepippi), [Dartui](https://github.com/Dartui), [dbejanishvili](https://github.com/dbejanishvili), [deanwhillier](https://github.com/deanwhillier), [denniskamp](https://github.com/denniskamp), [der-test](https://github.com/der-test), [devinbinnie](https://github.com/devinbinnie), [djanda97](https://github.com/djanda97), [dpanic](https://github.com/dpanic), [emilyhollinger](https://github.com/emilyhollinger), [enahum](https://github.com/enahum), [enelson720](https://github.com/enelson720), [ericjaystevens](https://github.com/ericjaystevens), [esadur](https://github.com/esadur), [esethna](https://github.com/esethna), [ethervoid](https://github.com/ethervoid), [faase](https://github.com/faase), [fakela](https://github.com/fakela), [flexo3001](https://github.com/flexo3001), [flynbit](https://github.com/flynbit), [fmunshi](https://github.com/fmunshi), [Francois-D](https://github.com/Francois-D), [gabrieljackson](https://github.com/gabrieljackson), [ghasrfakhri](https://github.com/ghasrfakhri), [gigawhitlocks](https://github.com/gigawhitlocks), [grubbins](https://github.com/grubbins), [gruceqq](https://translate.mattermost.com/user/gruceqq/), [hahmadia](https://github.com/hahmadia), [hannaparks](https://github.com/hannaparks), [hanzei](https://github.com/hanzei), [hectorskypl](https://github.com/hectorskypl), [hhhhugi](https://github.com/hhhhugi), [hmhealey](https://github.com/hmhealey), [hryuk](https://github.com/hryuk), [ialorro](https://github.com/ialorro), [icelander](https://github.com/icelander), [iomodo](https://github.com/iomodo), [isacikgoz](https://github.com/isacikgoz), [it33](https://github.com/it33), [jakubnovak998](https://github.com/jakubnovak998), [jasonblais](https://github.com/jasonblais), [javimox](https://github.com/javimox), [jaydeland](https://github.com/jaydeland), [jespino](https://github.com/jespino), [jfrerich](https://github.com/jfrerich), [johnsonbrothers](https://github.com/johnsonbrothers), [josephbaylon](https://github.com/josephbaylon), [joshuabezaleel](https://github.com/joshuabezaleel), [jseiser](https://github.com/jseiser), [JtheBAB](https://github.com/JtheBAB), [Jukie](https://github.com/Jukie), [jupenur](https://github.com/jupenur), [justinegeffen](https://github.com/justinegeffen), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [kayazeren](https://github.com/kayazeren), [kayron8](https://github.com/kayron8), [khos2ow](https://github.com/khos2ow), [kirkjaa](https://github.com/kirkjaa), [larkox](https://github.com/larkox), [levb](https://github.com/levb), [lfbrock](https://github.com/lfbrock), [lieut-data](https://github.com/lieut-data), [lindalumitchell](https://github.com/lindalumitchell), [lindy65](https://github.com/lindy65), [liusy182](https://github.com/liusy182), [Lyimmi](https://github.com/Lyimmi), [lynn915](https://github.com/lynn915), [M-ZubairAhmed](https://github.com/M-ZubairAhmed), [marianunez](https://github.com/marianunez), [meilon](https://github.com/meilon), [metanerd](https://github.com/metanerd), [mgdelacroix](https://github.com/mgdelacroix), [michaelschiffmm](https://github.com/michaelschiffmm), [mickmister](https://github.com/mickmister), [migbot](https://github.com/migbot), [mlongo4290](https://github.com/mlongo4290), [moussetc](https://github.com/moussetc), [mustafayildirim](https://github.com/mustafayildirim), [natalie-hub](https://github.com/natalie-hub), [nathanaelhoun](https://github.com/nathanaelhoun), [nevyangelova](https://github.com/nevyangelova), [nickmisasi](https://github.com/nickmisasi), [nicolailang](https://github.com/nicolailang), [nikolaizah](https://github.com/nikolaizah), [nperera](https://github.com/nperera), [ofpiyush](https://github.com/ofpiyush), [openmohan](https://github.com/openmohan), [phommasy](https://github.com/phommasy), [prapti](https://github.com/prapti), [qerosi](https://github.com/qerosi), [rahulchheda](https://github.com/rahulchheda), [rbradleyhaas](https://github.com/rbradleyhaas), [reflog](https://github.com/reflog), [rmatev](https://github.com/rmatev), [rodcorsi](https://github.com/rodcorsi), [ruzaq](https://github.com/ruzaq), [rvillablanca](https://github.com/rvillablanca), [saturninoabril](https://github.com/saturninoabril), [sbishel](https://github.com/sbishel), [scottjr632](https://github.com/scottjr632), [ShehryarShoukat96](https://github.com/ShehryarShoukat96), [shred86](https://github.com/shred86), [skaramanlis](https://github.com/skaramanlis), [sowmiyamuthuraman](https://github.com/sowmiyamuthuraman), [sridhar02](https://github.com/sridhar02), [srkgupta](https://github.com/srkgupta), [streamer45](https://github.com/streamer45), [stylianosrigas](https://github.com/stylianosrigas), [sudheerDev](https://github.com/sudheerDev), [svelle](https://github.com/svelle), [Szymongib](https://github.com/Szymongib), [TheoVitkovskiy](https://github.com/TheoVitkovskiy), [thePanz](https://github.com/thePanz), [TQuock](https://github.com/TQuock), [TRUNGTar](https://github.com/TRUNGTar), [uhlhosting](https://github.com/uhlhosting), [utkuufuk](https://github.com/utkuufuk), [Vars-07](https://github.com/Vars-07), [Venhaus](https://github.com/Venhaus), [vijaynag-bs](https://github.com/vijaynag-bs), [webchick](https://github.com/webchick), [wget](https://github.com/wget), [wiersgallak](https://github.com/wiersgallak), [wiggin77](https://github.com/wiggin77), [Willyfrog](https://github.com/Willyfrog), [Yohannesseifu](https://github.com/Yohannesseifu), [YushiOMOTE](https://github.com/YushiOMOTE)

## Release v5.26 - [Feature Release](https://docs.mattermost.com/administration/release-definitions.html#feature-release)

- **v5.26.2, released 2020-09-03**
  - Forcefully disabled the SAML Setting "Use Improved SAML Library (Beta)", as we have identified some issues in this feature. Please follow instructions at https://docs.mattermost.com/deployment/sso-saml-before-you-begin.html for enabling SAML using the feature-equivalent ``xmlsec1`` utility.
- **v5.26.1, released 2020-08-25**
  - Fixed an issue where users were unable to use the [``PictureAttribute`` setting](https://docs.mattermost.com/administration/config-settings.html#profile-picture-attribute) with SAML authentication. [MM-27852](https://mattermost.atlassian.net/browse/MM-27852)
  - Fixed an issue where users got unexpectedly logged out from the mobile app when ``ExtendSessionLengthWithActivity`` was enabled as opening the mobile app called an API that overrode session extension triggers of typing, channel change, and posts. [MM-27184](https://mattermost.atlassian.net/browse/MM-27184)
  - Fixed an issue where users experienced a kernel panic during LDAP sync when AuthData value was null. [MM-27965](https://mattermost.atlassian.net/browse/MM-27965)
- **v5.26.0, released 2020-08-16**
  - Original 5.26.0 release

### Compatibility
 - PostgreSQL ended long-term support for [version 9.4 in February 2020](https://www.postgresql.org/support/versioning). Mattermost is officially supporting PostgreSQL version 10 with v5.26 release as PostgreSQL 9.4 is no longer supported. New installs will require PostgreSQL 10+. Previous Mattermost versions, including our current ESR, will continue to be compatible with PostgreSQL 9.4. In our 6.0 release (date to be announced), we plan on fully deprecating PostgreSQL 9.4. Please follow the instructions under the Upgrading Section within [the PostgreSQL documentation](https://www.postgresql.org/support/versioning/).

### Breaking Changes
 - In v5.26, Elasticsearch indexes needed to be recreated. Admins should re-index Elasticsearch using the **Purge index** and then **Index now** button so that all the changes will be included in the index. Systems may be left with a limited search during the indexing, so it should be done during a time when there is little to no activity because it may take several hours.
 - An ``EnableExperimentalGossipEncryption`` option was added under ``ClusterSettings``. If this is set to ``true``, and ``UseExperimentalGossip`` is also ``true``, all communication through the cluster using the gossip protocol will be encrypted. The encryption uses ``AES-256`` by default, and it is not kept configurable by design. However, if one wishes, they can set the value in Systems table manually for the ``ClusterEncryptionKey`` row. A key is a byte array converted to base64. It should be either 16, 24, or 32 bytes to select AES-128, AES-192, or AES-256. To update the key, one can execute ``UPDATE Systems SET Value='<value>' WHERE Name='ClusterEncryptionKey';`` in MySQL and ``UPDATE systems SET value='<value>' WHERE name='ClusterEncryptionKey'`` for PostgreSQL. For any change in this config setting to take effect, the whole cluster must be shutdown first. Then the config change made, and then restarted. In a cluster, all servers either will completely use encryption or not. There cannot be any partial usage.

**IMPORTANT:** If you upgrade from a release earlier than 5.25, please read the other [Important Upgrade Notes](https://docs.mattermost.com/administration/important-upgrade-notes.html).

### Highlights

#### Archive & unarchive channels from the System Console (E20 Edition)
 - Channels can now be archived and unarchived with ease from the System Console.

#### Manage members and channels in System Console using search filters (E20 Edition)
 - Managing members & channels is now lot easier with new search filters.
 
#### Customize log configuration and output targets (E20 Edition)
 - Customize log level records beyond the standard levels of trace, debug, info, and panic, as well as configure different destinations based on discrete log levels.

#### Get help from the Mattermost community via ‘Ask the community’ link
 - You can access the community from a new “Help” menu in the channel header, after which you will create an account on our public [Mattermost Community server](https://community.mattermost.com/) to join a vibrant user community to ask questions and help your peers to troubleshoot issues.

#### Categorize and reorder channels with channel sidebar enhancements (Experimental)
 - Users now have the ability to create custom categories in the sidebar to group channels together for easier navigation, drag channels between or within categories to prioritize conversations most important to you, and much more.

### Improvements

#### User Interface (UI)
 - Improved the styling of a deactivated user's Direct Message channel footer.
 - All emoji aliases are now shown on the emoji picker.
 - Added support for allowing copying and pasting of emoji shortcodes.
 - Added Online, Away, Do Not Disturb, and Offline icons to the status menu for quicker recognition.
 - Increased visibility of user and channel autocomplete suggestions when editing a long post.
 - Added a flag icon to the post hover menu and updated pinned and flagged post styling in the channel.
 - Added support for PostgreSQL & PL/pgSQL syntax highlighting.
 - Expanded the width of server logs page in System Console UI to full screen width.

#### Localization
 - Promoted Russian and Dutch languages to “official”.
 
#### Command Line Interface (CLI)
 - Added new mmctl CLI commands, such as ``ldap idmigrate``, ``user convert``, ``channel move``, and ``user deleteall``.

#### Search
 - Added ability for Elasticsearch to search terms inside links.
 - Searching for a user with a leading "@" in the search term with Elasticsearch now returns results for those users.
 - Added ability to include filtering search/autocompletion by roles.
 - Added ability to search/autocomplete inactive users from Elasticsearch.
 - Added missing methods such as ``PermanenteDeleteByUser`` and ``PermanenteDeleteByChannel`` that update and/or delete entities in the searchlayer.
 - Implemented prefix/suffix search on Teams and Channel pages in System Console.

#### Integrations
 - Added slash command autocomplete functionality to enable commands to be executed on selection (mouse click, tab or enter).
 - Added plugin API endpoint to run a slash command.
 - Implemented ``http.Hijacker`` for plugins' ``ServeHTTP`` to make it possible to upgrade the ``ServeHTTP`` hook to expose a websocket connection.

#### Command Line Interface (CLI)
 - Added the ability to remove non-members of the target team if ``channel move`` fails.

#### Administration
 - Added support for a System Admin warning system that displays warnings in the announcement bar and sends Direct Messages to admins if one or more metric fulfills a certain condition.
 - **System Console > Plugins** section now lists all the installed plugins regardless of the number of configurable settings associated with each plugin.
 - Servers now send a push notification to mobile clients when a user's session expires.
 - Clearing the Site URL in the System Console is no longer allowed.
 - Changed the patch post API endpoint authorization logic to allow the ``edit_others_posts`` permission to function independently from ``edit_own_posts``.
 - Included a response code in the "Received HTTP Request" log line.
 - Added support for a new environment variable ``MM_LICENSE`` which can contain the contents of a license file. When set, this license takes priority over all other license sources.
 - Added support for encryption for gossip protocol.
 - Move gossip protocol to use only gossip.

### Bug Fixes
 - Fixed an issue where an empty outgoing webhook response generated a spurious ERROR.
 - Fixed an issue where quick switch user search was always falling back to the database.
 - Fixed an issue where a user's status was displayed as online while the database status was displayed as offline.
 - Fixed an issue where Elasticsearch indexing job did not index users and/or channels older than the first post.
 - Fixed an issue where Global Relay SMTP connection timeout was not independent of the regular SMTP email settings timeout.
 - Fixed an issue with a poor performance when opening More Direct Messages modal.
 - Fixed an issue where bot username validation message was unclear as it did not mention which value was invalid.
 - Fixed an issue where Command+K input field lost focus when the window lost focus, causing search results to disappear.
 - Fixed an issue where a highlight was missing when users at-mentioned themselves, followed by period, underscore, or hyphen.
 - Fixed an issue where a 500 error was returned by the ``/posts/unread`` endpoint caused by an [integer overflow](https://en.wikipedia.org/wiki/Integer_overflow) when ``limit_after`` was set to 0.
 - Fixed an issue where the footer text in invitation emails was not translated.
 - Fixed an issue where ``PermanentDeleteTeam`` did not return an error but did a soft deletion if ``EnableAPITeamDeletion`` was not set.
 - Fixed an issue on PostgreSQL where logging in using MFA did not respect the uppercase of the email address.

### config.json
Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json`, or the System Console when available.

#### Changes to Team Edition and Enterprise Edition:
 - Under ``ServiceSettings`` in ``config.json``:
   - Added ``ExperimentalDataPrefetch``, to enable messages in all unread channels to be pre-loaded from the server whenever the client reconnects to the network to eliminate loading time when users switch to unread channels.
 - Under ``ClusterSettings`` in ``config.json``:
   - Added ``EnableExperimentalGossipEncryption``, to enable all communication through the cluster using the gossip protocol to be encrypted.
 - Under ``LogSettings`` in ``config.json``:
   - Added ``EnableSentry``, to enable sentry reporting.
   - Added ``AdvancedLoggingConfig``, to enable optional logging capability to allow sending log records to a number of destinations.
 - Under ``FileSettings`` in ``config.json``:
   - Added ``AmazonS3PathPrefix``, to allow using the same S3 bucket for multiple deployments.
 - Under ``EmailSettings`` in ``config.json``:
   - Added ``PushNotificationBuffer``, to remove hardcoded goroutine workers from push notifications to improve notifications arriving in order.
 - Under ``SupportSettings`` in ``config.json``:
   - Added ``EnableAskCommunityLink``, to enable showing a link in the Mattermost channel header under the **Help** menu. When clicked, users are redirected to https://mattermost.com/pl/default-ask-mattermost-community/, where they can join the Mattermost Community to ask questions and help others troubleshoot issues. This option is not available on the mobile apps.
 - Under ``GlobalRelayMessageExportSettings`` in ``config.json``:
   - Added ``SMTPServerTimeout``, to ensure Global Relay SMTP connection timeout is independent of regular email settings timeout.

### Open Source Components
 - Added ``react-native-cookies`` and ``react-native-keyboard-aware-scroll-view``, and removed ``@react-native-community/cookies`` in https://github.com/mattermost/mattermost-mobile.
 - Added ``dynamic-virtualized-list`` and ``prettier`` in https://github.com/mattermost/mattermost-webapp.
 - Added ``rudder-sdk-js`` in https://github.com/mattermost/mattermost-redux.

### Database Changes
 - Added a new column ``Sessions.ExpiredNotify``.

### API Changes
 - Added ``POST api/v4/bots/:bot_id/convert_to_user`` API endpoint to add the ability to convert a bot into a user.
 - Added ``POST api/v4/users/:user_id/convert_to_bot`` API endpoint to add the ability to convert a user into a bot.
 - Added ``GET api/v4/users/:user_id/teams/:team_id/channels/categories`` API endpoint to get a list of sidebar categories that will appear in the user's sidebar on the given team, including a list of channel IDs in each category.
 - Added ``POST api/v4/users/:user_id/teams/:team_id/channels/categories`` API endpoint to create a custom sidebar category for the user on the given team.
 - Added ``PUT api/v4/users/:user_id/teams/:team_id/channels/categories`` API endpoint to update any number of sidebar categories for the user on the given team.
 - Added ``GET api/v4/users/:user_id/teams/:team_id/channels/categories/order`` API endpoint to get the order of the sidebar categories for a user on the given team as an array of IDs.
 - Added ``PUT api/v4/users/:user_id/teams/:team_id/channels/categories/order`` API endpoint to update the order of the sidebar categories for a user on the given team.
 - Added ``GET api/v4/users/:user_id/teams/:team_id/channels/categories/:category_id`` API endpoint to get a single sidebar category for the user on the given team.
 - Added ``PUT api/v4/users/:user_id/teams/:team_id/channels/categories/:category_id`` API endpoint to update a single sidebar category for the user on the given team.
 - Added ``DELETE api/v4/users/:user_id/teams/:team_id/channels/categories/:category_id`` API endpoint to delete a single custom sidebar category for the user on the given team.
 - Added ``POST api/v4/ldap/migrateid`` API endpoint to migrate LDAP IdAttribute to a new value.
 - Added ``GET api/v4/warn_metrics/status`` API endpoint to get the status of a set of metrics (enabled or disabled) from the Systems table.
 - Added ``POST api/v4/warn_metrics/ack/:warn_metric_id`` API endpoint to acknowldge a warning for the ``warn_metric_id`` metric crossing a threshold (or some similar condition being fulfilled).
 - Added ``GET api/v4/groups/:group_id/stats`` API endpoint to retrieve the stats of a given group.
 - Added ``GET api/v4/teams/:team_id/channels/private`` API endpoint to get a list of private channels on a team based on query string parameters.
 - Added ``GET api/v4/users/stats/filtered`` API endpoint to get a count of users in the system matching the specified filters.
 - Added ``POST api/v4/users/:user_id/email/verify/member`` API endpoint to verify the email used by a user without a token.
 - Added ``POST api/v4/users/:user_id/typing`` API endpoint to notify users in the given channel via websocket that the given user is typing.
 - Added Get/Update/Delete user preferences to Plugin API.
 - Added channel ID check for Plugin API ``UploadFile`` to specify the ID of the channel a file will be uploaded to.

### Websocket Event Changes
 - Added ``sidebar_category_created`` Websocket Event.
 - Added ``sidebar_category_updated`` Websocket Event.
 - Added ``sidebar_category_deleted`` Websocket Event.
 - Added ``sidebar_category_order_updated`` Websocket Event.
 - Added ``warn_metric_status_received`` Websocket Event.
 - Added ``warn_metric_status_removed`` Websocket Event.
 
### Known Issues
 - Twitter link previews do not work in Mattermost.
 - Pasted unicode emojis fail to appear once posted.
 - ``CMD+SHIFT+V`` does not paste copied text on MacOS on Safari 12 (Catalina) and Firefox.
 - Enabling Bleve search engine makes the Command Line Interface (CLI) mutually exclusive with the running server. This issue does not apply when using [mmctl Command Line Tool](https://docs.mattermost.com/administration/mmctl-cli-tool.html). 
 - On a server using a subpath, the URL opens a blank page if the System Admin changes the Site URL in the System Console UI. To fix, the System Admin should restart the server.
 - Login does not work when Custom Terms of Service is enabled and MFA is enforced.
 - Google login fails on the Classic mobile apps.
 - Status may sometimes get stuck as away or offline in High Availability mode with IP Hash turned off.
 - Searching stop words in quotes with Elasticsearch enabled returns more than just the searched terms.
 - Searching with Elasticsearch enabled may not always highlight the searched terms.
 - Team sidebar on desktop app does not update when channels have been read on mobile.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.

### Contributors
 - [abdulsmapara](https://github.com/abdulsmapara), [abdusabri](https://github.com/abdusabri), [Adovenmuehle](https://github.com/Adovenmuehle), [aeomin](https://github.com/aeomin), [agarciamontoro](https://github.com/agarciamontoro), [agnivade](https://github.com/agnivade), [aidapira](https://github.com/aidapira), [amyblais](https://github.com/amyblais), [amynicol1985](https://github.com/amynicol1985), [angeloskyratzakos](https://github.com/angeloskyratzakos), [ankallio](https://github.com/ankallio), [asaadmahmood](https://github.com/asaadmahmood), [ashishbhate](https://github.com/ashishbhate), [AugustasV](https://github.com/AugustasV), [avasconcelos114](https://github.com/avasconcelos114), [BaaaZen](https://github.com/BaaaZen), [bbodenmiller](https://github.com/bbodenmiller), [bill2004158](https://github.com/bill2004158), [bradjcoughlin](https://github.com/bradjcoughlin), [calebroseland](https://github.com/calebroseland), [catalintomai](https://github.com/catalintomai), [chakatz](https://github.com/chakatz), [chikei](https://github.com/chikei), [cpanato](https://github.com/cpanato), [cpoile](https://github.com/cpoile), [crspeller](https://github.com/crspeller), [ctlaltdieliet](https://github.com/ctlaltdieliet), [danielhelfand](https://github.com/danielhelfand), [DanielSz50](https://github.com/DanielSz50), [dantepippi](https://github.com/dantepippi), [Dartui](https://github.com/Dartui), [dbejanishvili](https://github.com/dbejanishvili), [deanwhillier](https://github.com/deanwhillier), [denniskamp](https://github.com/denniskamp), [der-test](https://github.com/der-test), [devinbinnie](https://github.com/devinbinnie), [djanda97](https://github.com/djanda97), [dpanic](https://github.com/dpanic), [emilyhollinger](https://github.com/emilyhollinger), [enahum](https://github.com/enahum), [enelson720](https://github.com/enelson720), [ericjaystevens](https://github.com/ericjaystevens), [esadur](https://github.com/esadur), [esethna](https://github.com/esethna), [ethervoid](https://github.com/ethervoid), [faase](https://github.com/faase), [fakela](https://github.com/fakela), [flexo3001](https://github.com/flexo3001), [flynbit](https://github.com/flynbit), [fmunshi](https://github.com/fmunshi), [Francois-D](https://github.com/Francois-D), [gabrieljackson](https://github.com/gabrieljackson), [ghasrfakhri](https://github.com/ghasrfakhri), [gigawhitlocks](https://github.com/gigawhitlocks), [grubbins](https://github.com/grubbins), [gruceqq](https://translate.mattermost.com/user/gruceqq/), [hahmadia](https://github.com/hahmadia), [hannaparks](https://github.com/hannaparks), [hanzei](https://github.com/hanzei), [hectorskypl](https://github.com/hectorskypl), [hhhhugi](https://github.com/hhhhugi), [hmhealey](https://github.com/hmhealey), [hryuk](https://github.com/hryuk), [ialorro](https://github.com/ialorro), [icelander](https://github.com/icelander), [iomodo](https://github.com/iomodo), [isacikgoz](https://github.com/isacikgoz), [it33](https://github.com/it33), [jakubnovak998](https://github.com/jakubnovak998), [jasonblais](https://github.com/jasonblais), [javimox](https://github.com/javimox), [jaydeland](https://github.com/jaydeland), [jespino](https://github.com/jespino), [jfrerich](https://github.com/jfrerich), [johnsonbrothers](https://github.com/johnsonbrothers), [josephbaylon](https://github.com/josephbaylon), [joshuabezaleel](https://github.com/joshuabezaleel), [jseiser](https://github.com/jseiser), [JtheBAB](https://github.com/JtheBAB), [Jukie](https://github.com/Jukie), [jupenur](https://github.com/jupenur), [justinegeffen](https://github.com/justinegeffen), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [kayazeren](https://github.com/kayazeren), [kayron8](https://github.com/kayron8), [khos2ow](https://github.com/khos2ow), [kirkjaa](https://github.com/kirkjaa), [larkox](https://github.com/larkox), [levb](https://github.com/levb), [lfbrock](https://github.com/lfbrock), [lieut-data](https://github.com/lieut-data), [lindalumitchell](https://github.com/lindalumitchell), [lindy65](https://github.com/lindy65), [liusy182](https://github.com/liusy182), [Lyimmi](https://github.com/Lyimmi), [lynn915](https://github.com/lynn915), [M-ZubairAhmed](https://github.com/M-ZubairAhmed), [meilon](https://github.com/meilon), [metanerd](https://github.com/metanerd), [mgdelacroix](https://github.com/mgdelacroix), [michaelschiffmm](https://github.com/michaelschiffmm), [mickmister](https://github.com/mickmister), [migbot](https://github.com/migbot), [mlongo4290](https://github.com/mlongo4290), [mustafayildirim](https://github.com/mustafayildirim), [natalie-hub](https://github.com/natalie-hub), [nathanaelhoun](https://github.com/nathanaelhoun), [nevyangelova](https://github.com/nevyangelova), [nickmisasi](https://github.com/nickmisasi), [nicolailang](https://github.com/nicolailang), [nikolaizah](https://github.com/nikolaizah), [ofpiyush](https://github.com/ofpiyush), [openmohan](https://github.com/openmohan), [phommasy](https://github.com/phommasy), [prapti](https://github.com/prapti), [qerosi](https://github.com/qerosi), [rahulchheda](https://github.com/rahulchheda), [rbradleyhaas](https://github.com/rbradleyhaas), [reflog](https://github.com/reflog), [rmatev](https://github.com/rmatev), [rodcorsi](https://github.com/rodcorsi), [ruzaq](https://github.com/ruzaq), [rvillablanca](https://github.com/rvillablanca), [saturninoabril](https://github.com/saturninoabril), [sbishel](https://github.com/sbishel), [scottjr632](https://github.com/scottjr632), [ShehryarShoukat96](https://github.com/ShehryarShoukat96), [shred86](https://github.com/shred86), [skaramanlis](https://github.com/skaramanlis), [sowmiyamuthuraman](https://github.com/sowmiyamuthuraman), [sridhar02](https://github.com/sridhar02), [srkgupta](https://github.com/srkgupta), [streamer45](https://github.com/streamer45), [stylianosrigas](https://github.com/stylianosrigas), [sudheerDev](https://github.com/sudheerDev), [svelle](https://github.com/svelle), [Szymongib](https://github.com/Szymongib), [TheoVitkovskiy](https://github.com/TheoVitkovskiy), [thePanz](https://github.com/thePanz), [TQuock](https://github.com/TQuock), [TRUNGTar](https://github.com/TRUNGTar), [uhlhosting](https://github.com/uhlhosting), [utkuufuk](https://github.com/utkuufuk), [Vars-07](https://github.com/Vars-07), [Venhaus](https://github.com/Venhaus), [vijaynag-bs](https://github.com/vijaynag-bs), [webchick](https://github.com/webchick), [weblate](https://github.com/weblate), [wget](https://github.com/wget), [wiersgallak](https://github.com/wiersgallak), [wiggin77](https://github.com/wiggin77), [Willyfrog](https://github.com/Willyfrog), [Yohannesseifu](https://github.com/Yohannesseifu), [YushiOMOTE](https://github.com/YushiOMOTE)

## Release v5.25 - [ESR](https://docs.mattermost.com/administration/release-definitions.html#extended-support-release-esr)

- **v5.25.7, released 2020-12-03**
  - Disabled the xmlsec1-based SAML library in favor of the re-enabled and improved SAML library.
- **v5.25.6, released 2020-11-10**
  - Fixed an issue where the Compliance Exports were taking too long on large deployments. This was fixed with a performance optimization of the message export query.
  - Bumped up Go patch version to 1.14.6 to fix an issue where a potential livelock was detected in the app server under heavy load. [MM-26584](https://mattermost.atlassian.net/browse/MM-26584)
- **v5.25.5, released 2020-09-03**
  - Forcefully disabled the SAML Setting "Use Improved SAML Library (Beta)", as we have identified some issues in this feature. Please follow instructions at https://docs.mattermost.com/deployment/sso-saml-before-you-begin.html for enabling SAML using the feature-equivalent ``xmlsec1`` utility. 
- **v5.25.4, released 2020-08-25**
  - Fixed an issue where users were unable to use the [``PictureAttribute`` setting](https://docs.mattermost.com/administration/config-settings.html#profile-picture-attribute) with SAML authentication. [MM-27852](https://mattermost.atlassian.net/browse/MM-27852)
  - Fixed an issue where users got unexpectedly logged out from the mobile app when ``ExtendSessionLengthWithActivity`` was enabled as opening the mobile app called an API that overrode session extension triggers of typing, channel change, and posts. [MM-27184](https://mattermost.atlassian.net/browse/MM-27184)
  - Fixed an issue where users experienced a kernel panic during LDAP sync when AuthData value was null. [MM-27965](https://mattermost.atlassian.net/browse/MM-27965)
  - Fixed an issue where users experienced the Mattermost server crashing on ``(Status).ToClusterJson`` calls. [MM-24544](https://mattermost.atlassian.net/browse/MM-24544)
- **v5.25.3, released 2020-08-12**
  - Fixed an issue where the permission to create user access tokens on environments with OpenID Connect login providers such as GitLab was denied for System Admins. [MM-27623](https://mattermost.atlassian.net/browse/MM-27623)
  - Fixed an issue where deactivated users were included in compliance exports. [MM-27194](https://mattermost.atlassian.net/browse/MM-27194)
  - Fixed an issue where guest user invites did not work in a SAML environment. [MM-27519](https://mattermost.atlassian.net/browse/MM-27519)
  - Fixed an issue where the bulk export didn't finish if a custom data directory was set. [MM-27550](https://mattermost.atlassian.net/browse/MM-27550)
  - Fixed an issue with a performance degradation after upgrading to 5.25.0. [MM-27575](https://mattermost.atlassian.net/browse/MM-27575)
  - Fixed an issue where attempting to pin a post failed if a user did not have the ``channel_mention`` permission on a channel. [MM-26346](https://mattermost.atlassian.net/browse/MM-26346)
- **v5.25.2, released 2020-07-31**
  - Fixed an issue where pages in the System Console didn't scroll up or down in some browser versions. [MM-27168](https://mattermost.atlassian.net/browse/MM-27168)
- **v5.25.1, released 2020-07-23**
  - Smoothed the database query load while syncing teams and channel roles by fetching data in batches. [MM-27114](https://mattermost.atlassian.net/browse/MM-27114)
  - Fixed a bug in pagination which queried more data redundantly. [MM-27187](https://mattermost.atlassian.net/browse/MM-27187)
  - Throttled network traffic by implementing bounded concurrency.
- **v5.25.0, released 2020-07-16**
  - Original 5.25.0 release

Mattermost v5.25.0 contains a low level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

### Breaking Changes
 - Some incorrect instructions regarding SAML setup with Active Directory ADFS for setting the “Relying party trust identifier” were corrected. Although the settings will continue to work, it is encouraged to [modify those settings](https://docs.mattermost.com/deployment/sso-saml-adfs-msws2016.html#add-a-relying-party-trust).
 
**IMPORTANT:** If you upgrade from a release earlier than 5.24, please read the other [Important Upgrade Notes](https://docs.mattermost.com/administration/important-upgrade-notes.html).

### Improvements
 - Added the ability for admins to request a 30-day E20 trial license directly in the System Console.
 - [AD/LDAP Group Sync (E20)](https://docs.mattermost.com/deployment/ldap-group-sync.html) feature was moved out of Beta to General Availability.

### Bug Fixes
 - Fixed an issue where the ability to run a command to export data was erroneously available in Team Edition.
 - Fixed an issue where a user lost access to the current channel and other channels in a team when Team Override Scheme was deleted.
 - Fixed an issue where ADFS for SAML and AD/LDAP using ObjectGUID did not sync correctly.
 - Fixed an issue where LDAP Sync job failed when one of the teams had email restrictions.
 - Fixed an issue where an incorrect session length for SSO login was initiated from the mobile app.
 - Fixed an issue on web mobile narrow view where clicking a hashtag in a channel header did not open the hashtag search.
 - Fixed an issue where license ID was not populated correctly in the license renewal banner.
 - Fixed an issue where an archived team could be fully accessed with the archived team's URL.
 - Fixed an issue where leaving an archived channel did not return user to the last viewed channel.
 - Fixed an issue where bulk import rejected team names prefixed with reserved keywords, even with additional text appended.
 - Fixed an issue where System Admin could no longer manage custom emoji after running ``bin/mattermost permissions reset``.
 - Fixed an issue where a user's role in Team Members dialog did not update when a user was searching for the user.
 - Fixed an issue where Bleve was not correctly setting the query size, missing search results.
 - Fixed an issue where the timezone count was not displayed correctly when a user set a new timezone and then changed it to set automatically.
 - Fixed an issue where existing users were not shown in the Invite Members flow.
 - Fixed an issue where the **System Console > User Management > Users** page was too tall and the **Revoke All Sessions** button was cut off when a license banner was present.
 - Fixed an issue where the **Email verified** banner was red instead of green.
 - Fixed an issue where **Copy Theme Colors** button in **Account Settings > Display > Theme** was not themed correctly.
 - Fixed an issue where archived channel icons were too dark in the Channel Info modal with the Dark Theme.
 - Fixed an issue where the **Save** button was not visible in browser for Safari on iPad device.
 - Fixed an issue where the thumbnail of a user was not displayed correctly when searching for a Direct Message channel.
 - Fixed an issue where text flowed outside the "Invite Members" button in "Invite People" page for some languages.
 - Fixed an issue where the **Next** button in **Main Menu > Manage Members** was not visible to be able to see the last few members of the team.
 - Fixed an issue where a different behavior was seen when pasting a table into message compose and to message edit box.
 - Fixed an issue where one-byte unicode emoji did not support skin tones.
 - Fixed an issue where no error was reported in server logs if a plugin icon was invalid.
 - Fixed an issue where providing AutocompleteData did not log a proper error in the System Console.
 - Fixed an issue where signup password minimum length error messages were inconsistent.
 - Fixed an issue where the right-hand side overlapped the GitHub Plugin tooltip.
 - Fixed an issue where the plugin right-hand side did not show tooltips when a user hovered over the Close or Expand/Shrink icons.
 - Fixed an issue where query string parameters were omitted from interactive dialog request urls.
 - Fixed an issue where ``store.GetPostsSince()`` did not sanitise deleted posts.
 - Fixed an issue with a panic caused by nil pointer dereference in ``importTeam``.
 
### config.json
Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json`, or the System Console when available.

#### Changes to Team Edition and Enterprise Edition:
 - Under ``SamlSettings`` in ``config.json``:
    - Added ``ServiceProviderIdentifier``, as the unique identifier for the Service Provider, usually the same as Service Provider Login Url. In ADFS, this must match the Relying Party Identifier.

### Known Issues
 - Twitter link previews do not work in Mattermost.
 - Highlight is missing when at-mentioning yourself, followed by period, underscore, or hyphen.
 - Ctrl+Enter doesn't post an edited message with "Send messages on Ctrl+Enter" enabled for all messages.
 - Enabling Bleve search engine makes the Command Line Interface (CLI) mutually exclusive with the running server. This issue does not apply when using [mmctl Command Line Tool](https://docs.mattermost.com/administration/mmctl-cli-tool.html). 
 - On a server using a subpath, the URL opens a blank page if the System Admin changes the Site URL in the System Console UI. To fix, the System Admin should restart the server.
 - Login does not work when Custom Terms of Service is enabled and MFA is enforced.
 - Google login fails on the Classic mobile apps.
 - Status may sometimes get stuck as away or offline in High Availability mode with IP Hash turned off.
 - Searching stop words in quotes with Elasticsearch enabled returns more than just the searched terms.
 - Searching with Elasticsearch enabled may not always highlight the searched terms.
 - Team sidebar on desktop app does not update when channels have been read on mobile.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.

### Contributors
 - [aaronrothschild](https://github.com/aaronrothschild), [Adovenmuehle](https://github.com/Adovenmuehle), [aeomin](https://github.com/aeomin), [agarciamontoro](https://github.com/agarciamontoro), [agnivade](https://github.com/agnivade), [ahmaddanialmohd](https://github.com/ahmaddanialmohd), [ali-farooq0](https://github.com/ali-farooq0), [amyblais](https://github.com/amyblais), [angeloskyratzakos](https://github.com/angeloskyratzakos), [asaadmahmood](https://github.com/asaadmahmood), [ashishbhate](https://github.com/ashishbhate), [Ashniu123](https://github.com/Ashniu123), [attilamolnar](https://github.com/attilamolnar), [avasconcelos114](https://github.com/avasconcelos114), [bbodenmiller](https://github.com/bbodenmiller), [bradjcoughlin](https://github.com/bradjcoughlin), [brunoro](https://github.com/brunoro), [CEOehis](https://github.com/CEOehis), [checkaayush](https://github.com/checkaayush), [chikei](https://github.com/chikei), [chuttam](https://github.com/chuttam), [clarmso](https://github.com/clarmso), [corey-robinson](https://github.com/corey-robinson), [cpanato](https://github.com/cpanato), [cpoile](https://github.com/cpoile), [craigwillis-mm](https://github.com/craigwillis-mm), [crspeller](https://github.com/crspeller), [ctlaltdieliet](https://github.com/ctlaltdieliet), [danger89](https://github.com/danger89), [DanielSz50](https://github.com/DanielSz50), [dantepippi](https://github.com/dantepippi), [davebarkerxyz](https://github.com/davebarkerxyz), [deanwhillier](https://github.com/deanwhillier), [der-test](https://github.com/der-test), [devinbinnie](https://github.com/devinbinnie), [DHaussermann](https://github.com/DHaussermann), [dpanic](https://github.com/dpanic), [emilyhollinger](https://github.com/emilyhollinger), [enahum](https://github.com/enahum), [enelson720](https://github.com/enelson720), [ericjaystevens](https://github.com/ericjaystevens), [esethna](https://github.com/esethna), [ethervoid](https://github.com/ethervoid), [Extazx2](https://github.com/Extazx2), [faase](https://github.com/faase), [fakela](https://github.com/fakela), [farah](https://github.com/farah), [fedealconada](https://github.com/fedealconada), [FlaviaBastos](https://github.com/FlaviaBastos), [flynbit](https://github.com/flynbit), [fmunshi](https://github.com/fmunshi), [gabrieljackson](https://github.com/gabrieljackson), [gigawhitlocks](https://github.com/gigawhitlocks), [GrigalashviliT](https://github.com/GrigalashviliT), [GrSto](https://github.com/GrSto), [gruceqq](https://translate.mattermost.com/user/gruceqq/), [grundleborg](https://github.com/grundleborg), [gsagula](https://github.com/gsagula), [hahmadia](https://github.com/hahmadia), [hanzei](https://github.com/hanzei), [harshilsharma63](https://github.com/harshilsharma63), [hectorgabucio](https://github.com/hectorgabucio), [hectorskypl](https://github.com/hectorskypl), [HilaryClarke](https://github.com/HilaryClarke), [hmhealey](https://github.com/hmhealey), [iomodo](https://github.com/iomodo), [isacikgoz](https://github.com/isacikgoz), [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais), [jespino](https://github.com/jespino), [jfrerich](https://github.com/jfrerich), [johnthompson365](https://github.com/johnthompson365), [josephbaylon](https://github.com/josephbaylon), [jseiser](https://github.com/jseiser), [jupenur](https://github.com/jupenur), [justinegeffen](https://github.com/justinegeffen), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [kadir96](https://github.com/kadir96), [kayazeren](https://github.com/kayazeren), [khos2ow](https://github.com/khos2ow), [larkox](https://github.com/larkox), [levb](https://github.com/levb), [lfbrock](https://github.com/lfbrock), [lieut-data](https://github.com/lieut-data), [lindalumitchell](https://github.com/lindalumitchell), [liusy182](https://github.com/liusy182), [lynn915](https://github.com/lynn915), [marianunez](https://github.com/marianunez), [meilon](https://github.com/meilon), [metanerd](https://github.com/metanerd), [mgdelacroix](https://github.com/mgdelacroix), [michaelschiffmm](https://github.com/michaelschiffmm), [mickmister](https://github.com/mickmister), [migbot](https://github.com/migbot), [mitchellroe](https://github.com/mitchellroe), [mkraft](https://github.com/mkraft), [mlongo4290](https://github.com/mlongo4290), [natalie-hub](https://github.com/natalie-hub), [nathanaelhoun](https://github.com/nathanaelhoun), [nevyangelova](https://github.com/nevyangelova), [nickmisasi](https://github.com/nickmisasi), [nperera](https://github.com/nperera), [octoquad](https://github.com/octoquad), [prapti](https://github.com/prapti), [promehul](https://github.com/promehul), [Qovaros](https://github.com/Qovaros), [rahimrahman](https://github.com/rahimrahman), [rbradleyhaas](https://github.com/rbradleyhaas), [reflog](https://github.com/reflog), [rodcorsi](https://github.com/rodcorsi), [Roy-Orbison](https://github.com/Roy-Orbison), [rvillablanca](https://github.com/rvillablanca), [saturninoabril](https://github.com/saturninoabril), [sbishel](https://github.com/sbishel), [srkgupta](https://github.com/srkgupta), [streamer45](https://github.com/streamer45), [stylianosrigas](https://github.com/stylianosrigas), [sudheerDev](https://github.com/sudheerDev), [svelle](https://github.com/svelle), [TheDarkestDay](https://github.com/TheDarkestDay), [thefactremains](https://github.com/thefactremains), [thePanz](https://github.com/thePanz), [uhlhosting](https://github.com/uhlhosting), [waqasraz](https://github.com/waqasraz), [weblate](https://github.com/weblate), [wget](https://github.com/wget), [wiersgallak](https://github.com/wiersgallak), [wiggin77](https://github.com/wiggin77), [will7200](https://github.com/will7200), [Willyfrog](https://github.com/Willyfrog), [ztrayner](https://github.com/ztrayner)

## Release v5.24 - [Feature Release](https://docs.mattermost.com/process/release-faq.html#release-overview)

- **v5.24.3, released 2020-07-23**
  - Smoothed the database query load while syncing teams and channel roles by fetching data in batches. [MM-27114](https://mattermost.atlassian.net/browse/MM-27114)
  - Fixed a bug in pagination which queried more data redundantly. [MM-27187](https://mattermost.atlassian.net/browse/MM-27187)
  - Throttled network traffic by implementing bounded concurrency.
- **v5.24.2, released 2020-06-26**
  - Fixed an issue where changing primary keys during migration did not work with Postgres versions lower than 9.3. [MM-26514](https://mattermost.atlassian.net/browse/MM-26514)
- **v5.24.1, released 2020-06-19**
  - Fixed an issue with a semantic versioning violation of the plugin API that broke plugins using the ``GetGroupByName`` method. [MM-26231](https://mattermost.atlassian.net/browse/MM-26231)
  - Fixed an issue with the Plugin Tooltip implementation that caused links to be truncated when rendered. This issue occured if you are using the recent GitHub plugin v1.0.0 release. All links were affected, regardless if they were related to GitHub. [MM-25808](https://mattermost.atlassian.net/browse/MM-25808)
- **v5.24.0, released 2020-06-16**
  - Original 5.24.0 release

Mattermost v5.24.0 contains low level security fixes. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

### Breaking Changes
 - A new configuration setting, ``ExtendSessionLengthWithActivity`` automatically extends sessions to keep users logged in if they are active in their Mattermost apps. It is recommended to enable this setting to improve user experience if compliant with your organizations policies. [Learn more here](https://mattermost.com/blog/session-expiry-experience).
 - The ``mattermost_http_request_duration_seconds`` histogram metric (in Enterprise Edition) has been removed. This information was already captured by ``mattermost_api_time``, which also contains the api handler name, HTTP method, and the response code. As an example, if you are using ``rate(mattermost_http_request_duration_seconds_sum{server=~"$var"}[5m]) /   rate(mattermost_http_request_duration_seconds_count{server=~"$var"}[5m])`` to measure average call duration, it needs to be replaced with ``sum(rate(mattermost_api_time_sum{server=~"$var"}[5m])) by (instance) /   sum(rate(mattermost_api_time_count{server=~"$var"}[5m])) by (instance)``.
 - Due to fixing performance issues related to emoji reactions, the performance of the upgrade has been affected in that the schema upgrade now takes more time in environments with lots of reactions in their database. These environments are recommended to perform the schema migration during low usage times and potentially in advance of the upgrade. Since this migration happens before the Mattermost Server is fully launched, non-High Availability installs will be unreachable during this time. Please see the [Important Upgrade Notes](https://docs.mattermost.com/administration/important-upgrade-notes.html) for full details.
 - On mobile apps, users will not be able to see LDAP group mentions (E20 feature) in the autocomplete dropdown. Users will still receive notifications if they are part of an LDAP group. However, the group mention keyword will not be highlighted.
 
**IMPORTANT:** If you upgrade from a release earlier than 5.23, please read the other [Important Upgrade Notes](https://docs.mattermost.com/administration/important-upgrade-notes.html).

### Highlights

#### Notify AD/LDAP Groups with a single @mention (Beta) (E20) 
 - Ability to enable mentions for LDAP-synced groups so users can notify the entire group at the same time.

#### Manage users from the System Console (E20)
 - Ability to view and manage members via each team or channel configuration page.

#### Sync profile images from AD/LDAP (E10, E20) 
 - Ability to ensure compliance with corporate policies by automatically syncing profile images from AD/LDAP.

#### Automatically extending user sessions
 - Ability to enable a feature that automatically extends session lengths when users are active on Mattermost apps.

#### Access CLI remotely
 - Ability to manage Mattermost without having direct access to the server with a new Local Mode for mmctl.

#### Improved search filters
 - Ability to use the mouse or keyboard to select search filters instead of typing them manually.
 
#### Slash command autocomplete framework (Beta)
 - Ability to make slash commands easier to use and increase discoverability with a new slash command autocomplete framework for plugins.

#### Full-text search and indexing (Experimental)
 - Ability to use Bleve to execute search functionality instead of the database.

### Improvements

#### Enterprise Edition (EE)
 - Grace period after Enterprise Edition subscription expires was reduced from 15 days to 10 days. Moreover, Enterprise features are now disabled immediately after the grace period is over, instead of only after a server restart. Please see https://mattermost.com/pricing/#faq for more details.

#### User Interface (UI)
 - Added a count for pinned posts header icon.
 - Added the ability to view user profile pop-over when clicking the profile picture or username from the **View Members** and **Manage Members** modals.
 - Improved keyboard usability in the emoji picker search bar.
 - Improved profile popover for posts with overwritten username or icon.
 - Added support for code highlighting of TypeScript files.

#### Notifications
 - Mention notification settings for "Case sensitive first name" and "Non-case sensitive username" are now disabled by default.
 
#### Search
 - Added support for searching by position in user lists such as the **Add Members** menu.
 
#### Integrations
 - Added support for different interactive message button styles.

#### Administration
 - Added the ability to bulk create, update, and delete team members and channel members in the store, as well as bulk import users belonging to different teams and channels.
 - Added auditing support to all Comman Line Interface (CLI) API’s.
 - Replaced "Back to Mattermost" button with a helpful error message in the OAuth 2.0 authentication window when an incorrect Client ID is typed during authentication.
 - Centralized ID validation to a single function.

### Bug Fixes
 - Fixed an issue where database read and search replicas were available in Team Edition, leading to unsupported server configuration.
 - Fixed an issue where Session Idle Timeout setting also unexpectedly affected the mobile app session expiry.
 - Fixed an issue where an unread channel disappeared from a list of unread channels immediately.
 - Fixed an issue where a user's role was not reflected correctly in the **Team Members** modal when the user's role was updated after the modal was opened.
 - Fixed an issue where the autocomplete list of channels remained populated after a user cleared the search on **Add user to a channel** modal.
 - Fixed an issue where Integrations menu was available for member and team admin roles only if with oAuth2 permission.
 - Fixed an issue where empty strings for ``auth_data`` created invalid users for LDAP sync during bulk import.
 - Fixed an issue where bulk import did not report errors when importing posts failed.
 - Fixed an issue where Compliance Export reported "success" when failing to export a missing file.
 - Fixed an issue where the user interface got stuck when leaving an archived channel.
 - Fixed an issue where Unicode characters appeared in users' display names.
 - Fixed an issue where a failed plugin installation from the plugin marketplace retried automatically.
 - Fixed an issue where markdown images hosted by plugins did not appear if local image proxy was enabled.
 
### config.json
Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json`, or the System Console when available.

#### Changes to Team Edition and Enterprise Edition:
 - Under ``ServiceSettings`` in ``config.json``:
     - Added ``ExtendSessionLengthWithActivity`` to enable sessions to be automatically extended when the user is active in their Mattermost client.
     - Added ``EnableLocalMode`` to enable local mode for mmctl.
     - Added ``LocalModeSocketLocation`` to set the path for the socket that the server will create for mmctl to connect and communicate through local mode.
     - Changed ``EnableLinkPreviews`` to default true for new installs.
     - Changed ``SessionLengthWebInDays`` to default to 30 days for new installs.
 - Under ``SqlSettings`` in ``config.json``:
     - Added ``DisableDatabaseSearch`` to disable the use of the database to perform searches.
 - Under ``LdapSettings`` in ``config.json``: 
     - Added ``PictureAttribute`` to configure the attribute in the AD/LDAP server used to synchronize (and lock) the profile picture used in Mattermost.
 - Under ``BleveSettings`` in ``config.json``:
     - Added ``IndexDir`` to set the directory path to use for storing bleve indexes.
     - Added ``EnableIndexing`` to enable the indexing of new posts to occur automatically.
     - Added ``EnableSearching`` to enable search queries to use bleve search.
     - Added ``EnableAutocomplete`` to enable autocomplete queries to use bleve search.
     - Added ``BulkIndexingTimeWindowSeconds`` to determine the maximum time window for a batch of posts being indexed by the Bulk Indexer.
 - Under ``EmailSettings`` in ``config.json``:
     - Changed ``PushNotificationContents`` to default ``full`` for new installs.

### Open Source Components
 - Added ``@types/react-custom-scrollbars`` in https://github.com/mattermost/mattermost-webapp
 - Added ``p-queue`` in https://github.com/mattermost/mattermost-webapp
 - Added ``@react-native-community/cookies`` in https://github.com/mattermost/mattermost-mobile
 - Added ``@react-native-community/masked-view`` in https://github.com/mattermost/mattermost-mobile
 - Added ``analytics-react-native`` in https://github.com/mattermost/mattermost-mobile
 - Added ``react-native-elements`` in https://github.com/mattermost/mattermost-mobile
 - Added ``react-native-file-viewer`` in https://github.com/mattermost/mattermost-mobile
 - Added ``react-native-localize`` in https://github.com/mattermost/mattermost-mobile
 - Added ``react-native-reanimated`` in https://github.com/mattermost/mattermost-mobile
 - Added ``react-native-safe-area-context`` in https://github.com/mattermost/mattermost-mobile
 - Added ``react-native-screens`` in https://github.com/mattermost/mattermost-mobile

### Database Changes
 - Added a new column ``UserGroups.AllowReference``.
 - Changed the primary key on the Reactions table.

### API Changes
 - Added a new route ``POST /api/v4/group/bleve/purge_indexes`` to delete all Bleve indexes and their contents.
 - Added a new route ``GET /api/v4/channels/:channel_id/member_counts_by_group`` to get the channel members counts for each AD/LDAP group that has at least one member in the channel.
 - Added a new route ``GET /api/v4/teams/:team_id/commands/autocomplete_suggestions`` to get a list of autocomplete suggestions.
 - Added a new route ``GET api/v4/users/:user_id/groups`` to get all AD/LDAP groups for a user.
 - Added a new route ``GET api/v4/teams/:team_id/groups_by_channels`` to get a set of AD/LDAP groups associated with the channels in the given team grouped by channel.
 - Added several new APIs for use by mmctl local mode, such as the ability to modify and restore teams with mmctl.

### Websocket Event Changes
 - Added a new ``received_group`` Websocket Event.
 - Added a new ``received_group_associated_to_team`` Websocket Event.
 - Added a new ``received_group_not_associated_to_team`` Websocket Event.
 - Added a new ``received_group_associated_to_channel`` Websocket Event.
 - Added a new ``received_group_not_associated_to_channel`` Websocket Event.

### Known Issues
 - Profile image of a user is not displayed correctly when searching for Direct Message channels.
 - "Email verified" banner is red instead of green.
 - Command+K search results disappear when the input field loses focus when Mattermost window is made unfocused.
 - Enabling Bleve search engine makes the Command Line Interface (CLI) mutually exclusive with the running server. This issue does not apply when using [mmctl Command Line Tool](https://docs.mattermost.com/administration/mmctl-cli-tool.html). 
 - On a server using a subpath, the URL opens a blank page if the System Admin changes the Site URL in the System Console UI. To fix, the System Admin should restart the server.
 - Login does not work when Custom Terms of Service is enabled and MFA is enforced.
 - Google login fails on the Classic mobile apps.
 - Status may sometimes get stuck as away or offline in High Availability mode with IP Hash turned off.
 - Searching stop words in quotes with Elasticsearch enabled returns more than just the searched terms.
 - Searching with Elasticsearch enabled may not always highlight the searched terms.
 - Team sidebar on desktop app does not update when channels have been read on mobile.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.

### Contributors
 - [aaronrothschild](https://github.com/aaronrothschild), [abdulsmapara](https://github.com/abdulsmapara), [adamjclarkson](https://github.com/adamjclarkson), [Adovenmuehle](https://github.com/Adovenmuehle), [aeomin](https://translate.mattermost.com/user/aeomin/), [agarciamontoro](https://github.com/agarciamontoro), [agnivade](https://github.com/agnivade), [ali-farooq0](https://github.com/ali-farooq0), [amyblais](https://github.com/amyblais), [angeloskyratzakos](https://github.com/angeloskyratzakos), [asaadmahmood](https://github.com/asaadmahmood), [ashishbhate](https://github.com/ashishbhate), [avasconcelos114](https://github.com/avasconcelos114), [avddvd](https://github.com/avddvd), [awerries](https://github.com/awerries), [bbodenmiller](https://github.com/bbodenmiller), [bbuehrle](https://github.com/bbuehrle), [bradjcoughlin](https://github.com/bradjcoughlin), [cadavre](https://github.com/cadavre), [calebroseland](https://github.com/calebroseland), [catalintomai](https://github.com/catalintomai), [CEOehis](https://github.com/CEOehis), [chikei](https://github.com/chikei), [chuttam](https://github.com/chuttam), [corey-robinson](https://github.com/corey-robinson), [cpanato](https://github.com/cpanato), [cpoile](https://github.com/cpoile), [craigwillis-mm](https://github.com/craigwillis-mm), [craph](https://github.com/craph), [crspeller](https://github.com/crspeller), [ctlaltdieliet](https://github.com/ctlaltdieliet), [dantepippi](https://github.com/dantepippi), [dbejanishvili](https://github.com/dbejanishvili), [der-test](https://github.com/der-test), [devinbinnie](https://github.com/devinbinnie), [DSchalla](https://github.com/DSchalla), [ejose19](https://github.com/ejose19), [emilyhollinger](https://github.com/emilyhollinger), [enahum](https://github.com/enahum), [enelson720](https://github.com/enelson720), [esethna](https://github.com/esethna), [ethervoid](https://github.com/ethervoid), [faase](https://github.com/faase), [fakela](https://github.com/fakela), [fedealconada](https://github.com/fedealconada), [FlaviaBastos](https://github.com/FlaviaBastos), [flynbit](https://github.com/flynbit), [fmunshi](https://github.com/fmunshi), [Francois-D](https://github.com/Francois-D), [funkytwig](https://github.com/funkytwig), [gabrieljackson](https://github.com/gabrieljackson), [gigawhitlocks](https://github.com/gigawhitlocks), [gnello](https://github.com/gnello), [GrigalashviliT](https://github.com/GrigalashviliT), [gruceqq](https://translate.mattermost.com/user/gruceqq/), [grundleborg](https://github.com/grundleborg), [gsagula](https://github.com/gsagula), [hahmadia](https://github.com/hahmadia), [hannaparks](https://github.com/hannaparks), [hanzei](https://github.com/hanzei), [harshilsharma63](https://github.com/harshilsharma63), [hectorskypl](https://github.com/hectorskypl), [hmhealey](https://github.com/hmhealey), [hzeroo](https://github.com/hzeroo), [ialorro](https://github.com/ialorro), [iamsayantan](https://github.com/iamsayantan), [ikeohachidi](https://github.com/ikeohachidi), [iomodo](https://github.com/iomodo), [isacikgoz](https://github.com/isacikgoz), [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais), [jaydeland](https://github.com/jaydeland), [jespino](https://github.com/jespino), [jfrerich](https://github.com/jfrerich), [josephbaylon](https://github.com/josephbaylon), [JtheBAB](https://github.com/JtheBAB), [jupenur](https://github.com/jupenur), [justinegeffen](https://github.com/justinegeffen), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [Kaya_Zeren](https://twitter.com/kaya_zeren), [khos2ow](https://github.com/khos2ow), [kosgrz](https://github.com/kosgrz), [l0r3zz](https://github.com/l0r3zz), [larkox](https://github.com/larkox), [levb](https://github.com/levb), [lieut-data](https://github.com/lieut-data), [lindalumitchell](https://github.com/lindalumitchell), [liusy182](https://github.com/liusy182), [lynn915](https://github.com/lynn915), [marianunez](https://github.com/marianunez), [mbecca](https://github.com/mbecca), [meilon](https://github.com/meilon), [metanerd](https://github.com/metanerd), [mgdelacroix](https://github.com/mgdelacroix), [michaelschiffmm](https://github.com/michaelschiffmm), [mickmister](https://github.com/mickmister), [migbot](https://github.com/migbot), [mkraft](https://github.com/mkraft), [mlongo4290](https://github.com/mlongo4290), [mterhar](https://github.com/mterhar), [muratbayan](https://github.com/muratbayan), [nadalfederer](https://github.com/nadalfederer), [NassimBounouas](https://github.com/NassimBounouas), [natalie-hub](https://github.com/natalie-hub), [nathanaelhoun](https://github.com/nathanaelhoun), [nevyangelova](https://github.com/nevyangelova), [nperera](https://github.com/nperera), [octoquad](https://github.com/octoquad), [pankajhirway](https://github.com/pankajhirway), [petya-v](https://github.com/petya-v), [pradeepmurugesan](https://github.com/pradeepmurugesan), [prapti](https://github.com/prapti), [psy-q](https://github.com/psy-q), [Qovaros](https://github.com/Qovaros), [Qujja](https://github.com/Qujja), [rbradleyhaas](https://github.com/rbradleyhaas), [reflog](https://github.com/reflog), [rodcorsi](https://github.com/rodcorsi), [saturninoabril](https://github.com/saturninoabril), [sbishel](https://github.com/sbishel), [shibasisp](https://github.com/shibasisp), [Shivam010](https://github.com/Shivam010), [shred86](https://github.com/shred86), [streamer45](https://github.com/streamer45), [stylianosrigas](https://github.com/stylianosrigas), [sudheerDev](https://github.com/sudheerDev), [thefactremains](https://github.com/thefactremains), [TheoVitkovskiy](https://github.com/TheoVitkovskiy), [thePanz](https://github.com/thePanz), [ThiefMaster](https://github.com/ThiefMaster), [tomasmik](https://github.com/tomasmik), [uhlhosting](https://github.com/uhlhosting), [vesari](https://github.com/vesari), [wget](https://github.com/wget), [wiersgallak](https://github.com/wiersgallak), [wiggin77](https://github.com/wiggin77), [Willyfrog](https://github.com/Willyfrog), [ztrayner](https://github.com/ztrayner)

## Release v5.23 - [Quality Release](https://docs.mattermost.com/process/release-faq.html#release-overview)

- **v5.23.2, released 2020-07-23**
  - Smoothed the database query load while syncing teams and channel roles by fetching data in batches. [MM-27114](https://mattermost.atlassian.net/browse/MM-27114)
  - Fixed a bug in pagination which queried more data redundantly. [MM-27187](https://mattermost.atlassian.net/browse/MM-27187)
  - Throttled network traffic by implementing bounded concurrency.
- **v5.23.1, released 2020-06-02**
  - Fixed an issue where ``Content-Type`` was no longer optional in incoming webhook requests and led to errors. [MM-25677](https://mattermost.atlassian.net/browse/MM-25677)
- **v5.23.0, released 2020-05-16**
  - Original 5.23.0 release

Mattermost v5.23.0 contains a low level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

### Compatibility
PostgreSQL ended long-term support for [version 9.4 in February 2020](https://www.postgresql.org/support/versioning). Mattermost will officially be supporting PostgreSQL version 10 with the Mattermost v5.26 release as PostgreSQL 9.4 is no longer supported. New installs will require PostgreSQL version 10. Previous Mattermost versions, including our current ESR, will continue to be compatible with PostgreSQL version 9.4. In our 6.0 release (date to be announced), we plan on fully deprecating PostgreSQL 9.4. 

We highly recommend upgrading to PostgreSQL version 10+. Please follow the instructions under the Upgrading Section within [the PostgreSQL documentation](https://www.postgresql.org/support/versioning/).

### Bug Fixes
 - Fixed an issue where using slash command ``/leave`` failed to leave the channel.
 - Fixed an issue where clicking on a channel link from a Direct Message channel that linked to a different team resulted in a "Page not Found" error.
 - Fixed an issue where reloading a channel caused the channel to be shown as read-only for a few seconds.
 - Fixed an issue where the Channel Export plugin bot channel did not appear on the left-hand side channel sidebar until the user switched to a different channel.
 - Fixed an issue where no channel suggestions were displayed for ``in:`` search modifier for Guest Accounts.
 - Fixed an issue where ``Guest`` tags were not shown in Group Message channel header.
 - Fixed an issue where guest permissions could not be set in Team Override Schemes.
 - Fixed an issue where a "this user didn't get notified" system message was missing if an at-mention was followed by a period and the user was not in the channel.
 - Fixed an issue where batched emails were still sent even if there was activity from the user.
 - Fixed an issue where ``/me`` messages weren't formatted in the right-hand side.
 - Fixed an issue where mentions in header-changed system messages weren't highlighted.
 - Fixed an issue where a thread title was missing when initial message in a thread showed as "message deleted".
 - Fixed an issue where there was no hover effect when mousing over options in Search.
 - Fixed an issue on Firefox where using Alt+arrow stopped working on read-only channels.
 - Fixed an issue where muted channels on another team appeared as unread in team sidebar and browser tab.
 - Fixed an issue where the URL field on Rename Channel modal allowed more than two underscores.
 - Fixed an issue where pasting text from a GitHub code block erased post textbox contents.
 - Fixed an issue where keyboard shortcuts to move between teams conflicted with a native Linux OS shortcut for switching virtual desktops.
 - Fixed an issue where incoming webhooks that contained certain sized attachments resulted in an infinite loop, causing a memory leak.
 - Fixed an issue with errors appearing in logs when sending a direct message to your own account.
 - Fixed an issue with a "Failed to get membership" log spam for bot posts.

### Open Source Components
 - Added ``react-native-mmkv-storage`` in https://github.com/mattermost/mattermost-mobile.
 - Added ``redux-action-buffer`` in https://github.com/mattermost/mattermost-mobile.
 - Added ``redux-reset`` in https://github.com/mattermost/mattermost-mobile.
 - Added ``serialize-error`` in https://github.com/mattermost/mattermost-mobile.

### API Changes
 - Added a new API endpoint ``GET /api/v4/users/known`` to get the list of user IDs of users with any direct relationship with a user. That means any user sharing any channel, including direct and group channels.
 - ``GET /api/v4/teams/:team_id/channels`` no longer requires the ``list_team_channels`` permission.

### Websocket Event Changes
 - Added a new ``update_team_scheme`` Websocket Event.
 
### Known Issues
 - **Copy Theme Colors** button on custom theme Display Settings modal is not themed correctly on Mattermost dark theme.
 - On a server using a subpath, the URL opens a blank page if the System Admin changes the Site URL in the System Console UI. To fix, the System Admin should restart the server.
 - Login does not work when Custom Terms of Service is enabled and MFA is enforced.
 - Google login fails on the Classic mobile apps.
 - Status may sometimes get stuck as away or offline in High Availability mode with IP Hash turned off.
 - Searching stop words in quotes with Elasticsearch enabled returns more than just the searched terms.
 - Searching with Elasticsearch enabled may not always highlight the searched terms.
 - Team sidebar on desktop app does not update when channels have been read on mobile.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.

### Contributors

 - [aaronrothschild](https://github.com/aaronrothschild), [adamjclarkson](https://github.com/adamjclarkson), [Adovenmuehle](https://github.com/Adovenmuehle), [aeomin](https://translate.mattermost.com/user/aeomin/), [agarciamontoro](https://github.com/agarciamontoro), [AGMETEOR](https://github.com/AGMETEOR), [agnivade](https://github.com/agnivade), [ahmaddanialmohd](https://github.com/ahmaddanialmohd), [akarikuu](https://github.com/akarikuu), [Akendo](https://github.com/Akendo), [ali-farooq0](https://github.com/ali-farooq0), [amyblais](https://github.com/amyblais), [angeloskyratzakos](https://github.com/angeloskyratzakos), [AninditaBasu](https://github.com/AninditaBasu), [asaadmahmood](https://github.com/asaadmahmood), [attilamolnar](https://github.com/attilamolnar), [avasconcelos114](https://github.com/avasconcelos114), [avddvd](https://github.com/avddvd), [bakurits](https://github.com/bakurits), [bbodenmiller](https://github.com/bbodenmiller), [bolariin](https://github.com/bolariin), [bradjcoughlin](https://github.com/bradjcoughlin), [cadavre](https://github.com/cadavre), [calebroseland](https://github.com/calebroseland), [catalintomai](https://github.com/catalintomai), [chikei](https://github.com/chikei), [chuttam](https://github.com/chuttam), [ckavili](https://github.com/ckavili), [clarmso](https://github.com/clarmso), [cpanato](https://github.com/cpanato), [cpurta](https://github.com/cpurta), [craigwillis-mm](https://github.com/craigwillis-mm), [crspeller](https://github.com/crspeller), [ctlaltdieliet](https://github.com/ctlaltdieliet), [curiousercreative](https://github.com/curiousercreative), [danger89](https://github.com/danger89), [Danziger](https://github.com/Danziger), [deanwhillier](https://github.com/deanwhillier), [der-test](https://github.com/der-test), [devinbinnie](https://github.com/devinbinnie), [dhadiseputro](https://github.com/dhadiseputro), [DHaussermann](https://github.com/DHaussermann), [ebaker](https://github.com/ebaker), [emilyhollinger](https://github.com/emilyhollinger), [enahum](https://github.com/enahum), [enelson720](https://github.com/enelson720), [esethna](https://github.com/esethna), [ethervoid](https://github.com/ethervoid), [fedealconada](https://github.com/fedealconada), [FlaviaBastos](https://github.com/FlaviaBastos), [flynbit](https://github.com/flynbit), [fmunshi](https://github.com/fmunshi), [Francois-D](https://github.com/Francois-D), [gabrieljackson](https://github.com/gabrieljackson), [gigawhitlocks](https://github.com/gigawhitlocks), [gnello](https://github.com/gnello), [gramakri](https://github.com/gramakri), [gruceqq](https://translate.mattermost.com/user/gruceqq/), [grundleborg](https://github.com/grundleborg), [gsagula](https://github.com/gsagula), [hahmadia](https://github.com/hahmadia), [hajowieland](https://github.com/hajowieland), [hanzei](https://github.com/hanzei), [haydenhw](https://github.com/haydenhw), [hectorskypl](https://github.com/hectorskypl), [hmhealey](https://github.com/hmhealey), [ialorro](https://github.com/ialorro), [iamsayantan](https://github.com/iamsayantan), [icelander](https://github.com/icelander), [igor47](https://github.com/igor47), [iomodo](https://github.com/iomodo), [isacikgoz](https://github.com/isacikgoz), [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais), [jaydeland](https://github.com/jaydeland), [jespino](https://github.com/jespino), [jfrerich](https://github.com/jfrerich), [johnthompson365](https://github.com/johnthompson365), [josephbaylon](https://github.com/josephbaylon), [jupenur](https://github.com/jupenur), [justinegeffen](https://github.com/justinegeffen), [justledbetter](https://github.com/justledbetter), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [Kaya_Zeren](https://twitter.com/kaya_zeren), [larkox](https://github.com/larkox), [levb](https://github.com/levb), [lfbrock](https://github.com/lfbrock), [lieut-data](https://github.com/lieut-data), [lindalumitchell](https://github.com/lindalumitchell), [lynn915](https://github.com/lynn915), [marianunez](https://github.com/marianunez), [MatthewDorner](https://github.com/MatthewDorner), [mbecca](https://github.com/mbecca), [meilon](https://github.com/meilon), [metanerd](https://github.com/metanerd), [mgdelacroix](https://github.com/mgdelacroix), [michaelschiffmm](https://github.com/michaelschiffmm), [mickmister](https://github.com/mickmister), [migbot](https://github.com/migbot), [mkraft](https://github.com/mkraft), [mlongo4290](https://github.com/mlongo4290), [mo2menelzeiny](https://github.com/mo2menelzeiny), [moussetc](https://github.com/moussetc), [natalie-hub](https://github.com/natalie-hub), [nevyangelova](https://github.com/nevyangelova), [Nirei](https://github.com/Nirei), [nvjacobo](https://github.com/nvjacobo), [oguera](https://github.com/oguera), [Pafzedog](https://github.com/Pafzedog), [popstr](https://github.com/popstr), [promulo](https://github.com/promulo), [Qovaros](https://github.com/Qovaros), [rahimrahman](https://github.com/rahimrahman), [rajeshkp](https://github.com/rajeshkp), [rakhi2104](https://github.com/rakhi2104), [rbradleyhaas](https://github.com/rbradleyhaas), [reflog](https://github.com/reflog), [rodcorsi](https://github.com/rodcorsi), [saturninoabril](https://github.com/saturninoabril), [sbishel](https://github.com/sbishel), [shred86](https://github.com/shred86), [srkgupta](https://github.com/srkgupta), [streamer45](https://github.com/streamer45), [stylianosrigas](https://github.com/stylianosrigas), [sudheerDev](https://github.com/sudheerDev), [svelle](https://github.com/svelle), [syuo7](https://github.com/syuo7), [T0biii](https://github.com/T0biii), [theo-o](https://github.com/theo-o), [TheoVitkovskiy](https://github.com/TheoVitkovskiy), [thePanz](https://github.com/thePanz), [uhlhosting](https://github.com/uhlhosting), [vesari](https://github.com/vesari), [vespian](https://github.com/vespian), [VishalSwarnkar](https://github.com/VishalSwarnkar), [wget](https://github.com/wget), [wiersgallak](https://github.com/wiersgallak), [wiggin77](https://github.com/wiggin77), [Willyfrog](https://github.com/Willyfrog), [ztrayner](https://github.com/ztrayner)

## Release v5.22 - [Feature Release](https://docs.mattermost.com/process/release-faq.html#release-overview)

- **v5.22.3, released 2020-05-11**
  - Fixed an issue where channels were shown as read-only when [Channel Moderation feature](https://docs.mattermost.com/deployment/advanced-permissions.html#channel-moderation-beta-e20) was used in High Availability environments. [MM-24987](https://mattermost.atlassian.net/browse/MM-24987)
- **v5.22.2, released 2020-05-05**
  - Fixed an issue where message reply threads did not get correctly imported via [bulk loading tool](https://docs.mattermost.com/deployment/bulk-loading.html). [MM-24707](https://mattermost.atlassian.net/browse/MM-24707)
- **v5.22.1, released 2020-04-23**
  - Fixed an issue where Amazon S3 file storage with IAM credentials failed due to a bug in the ``minio-go`` library. [MM-24388](https://mattermost.atlassian.net/browse/MM-24388)
- **v5.22.0, released 2020-04-16**
  - Original 5.22.0 release

**Release day: 2020-04-16**

Mattermost v5.22.0 contains a low level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

### Compatibility

 - v5.9.0 as our Extended Support Release (ESR) is coming to the end of its lifecycle and upgrading to 5.19.0 ESR or a later version is highly recommended. v5.19.0 will continue to be our current ESR until October 15, 2020. [Learn more in our forum post](https://forum.mattermost.org/t/upcoming-extended-support-release-updates/8526).

### Breaking Changes

 - Due to fixing performance issues related to emoji reactions, the performance of the upgrade has been affected in that the schema upgrade now takes more time in environments with lots of reactions in their database. These environments are recommended to perform the schema migration during low usage times and potentially in advance of the upgrade. Since this migration happens before the Mattermost Server is fully launched, non-High Availability installs will be unreachable during this time.
 - The Channel Moderation Settings feature is supported on mobile app versions v1.30 and later. In earlier versions of the mobile app, users who attempt to post or react to posts without proper permissions will see an error.
 - Direct access to the ``Props`` field in the ``model.Post`` structure has been deprecated. The available ``GetProps()`` and ``SetProps()`` methods should now be used. Also, direct copy of the ``model.Post`` structure must be avoided in favor of the provided ``Clone()`` method.

**IMPORTANT:** If you upgrade from a release earlier than 5.21, please read the other [Important Upgrade Notes](https://docs.mattermost.com/administration/important-upgrade-notes.html).

### Highlights

#### Read-only channels and channel moderation settings (E20) (Beta)
 - System admins can use new channel-specific permissions to create read-only channels, restrict who can post in certain channels, and more. This feature is in beta and ships with Enterprise Edition E20.

#### Team switch shortcuts
 - Added new keyboard shortcuts that allow users to switch to the next or previous team using ``Ctrl/⌘ + Alt + Up/Down`` and switch to a specific team using ``Ctrl/⌘ + Alt + #``.
 - Also added the ability to reorder teams on the sidebar via drag-and-drop.

#### Unarchive Channel option in the archived channels menu
 - Added the ability for users to restore archived channels via the Mattermost interface.
 
#### Channel sidebar reorganization features (Experimental)
 - Added improvements to the channel sidebar, including the ability to collapse categories in the sidebar (e.g., favorites, public channels, private channels, and direct messages) to reduce unnecessary scrolling.

### Improvements

#### User Interface (UI)
 - Added several UI improvements, such as added a "Close Group Message" option to Group Message menu.
 - Added a keyboard shortcut to open/close the right-hand sidebar.
 - Added a keyboard shortcut to add reactions to last message in a channel or a thread.
 - Added infinite scroll to Select Teams screen.
 - Updated the message permalink view.
 
#### Localization
 - Promoted Dutch and Russian languages to Beta.

#### Notifications
 - Added support for notification sounds in Firefox.

#### Plugins
 - Allow searching for files through the plugin API.
 - Allowed prepackaged and local plugins to set ``ReleaseNotesURL``.

#### Integrations
 - In interactive dialogs, the autocomplete lists now render below the input field by default.
 - Extended the payload of slash commands to include a map of the users and channels mentioned in the message to their corresponding identifiers.
 - Added support for recognizing multi-line slash commands without requiring trailing space after the trigger word.
 
#### Bulk Import
 - Added support for exporting and importing the props of a post.

### Bug Fixes
 - Fixed an issue where a user's role was not reflected correctly in the Channel Members Modal when it was updated after the modal was opened.
 - Fixed an issue where verification emails were still sent on servers with SMTP configured when`Enable Email Notifications` and `Require Email Verification` were disabled in the System Console.
 - Fixed an issue where a user account was still created when inviting a new user to a team with an email address that didn't match the team's allowed domain.
 - Fixed an issue where System Admins could not access the Teams menu of the System Console.
 - Fixed an issue where an incorrect time was displayed at midnight when 24-hour clock display was enabled.
 - Fixed an issue where a channel appeared twice on the channel sidebar if the channels were created with a certain arrangement of characters.
 - Fixed an issue where pasting a custom theme caused a white screen.
 - Fixed an issue where a modified Edit Post dialog silently closed on a mouse click outside it.
 - Fixed an issue where users were unable to drag and drop files on Edge.
 - Fixed an issue where the autoresponder responded to every bot post.
 - Fixed an issue where Mattermost was unable to start if a configured mail server was listening but not responding.
 - Fixed an issue where LDAP sync did not finish if read database replica was enabled.
 - Fixed a SIGSEGV crash issue when exporting to CSV.
 - Fixed an issue where Elasticsearch error was output when running unrelated commands.
 - Fixed an issue where importing from slack crashed due to invalid memory access or nil pointer dereference.
 
### config.json
Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json`, or the System Console when available.

#### Changes to Team Edition and Enterprise Edition:
 - Under ``ServiceSettings`` in ``config.json``:
    - Added ``EnableOpenTracing``, to enable a Jaeger client to be instantiated and used to trace each HTTP request as it goes through App and Store layers.
    - Added ``IdleTimeout``, to set an explicit idle timeout in the HTTP server.
    - Added ``ExperimentalChannelSidebarOrganization``, to enable accessing the experimental channel sidebar feature set.
 - Under ``NotificationLogSettings`` in ``config.json``:
    - Added ``SMTPServerTimeout``, to enable the maximum amount of time (in seconds) allowed for establishing a TCP connection between Mattermost and the SMTP server, to be idle before being terminated.
 - Added ``DirectoryId`` object, to enable the ID of the application's AAD directory. 
 - Added ``ExperimentalAuditSettings`` object, to enable the audit settings to output audit records to syslog (local or remote server via TLS) and/or to a local file.

### Open Source Components
 - Added ``core-js`` in https://github.com/mattermost/mattermost-redux.
 - Added ``@types/redux-mock-store`` in https://github.com/mattermost/mattermost-webapp.
 - Added ``react-beautiful-dnd`` in https://github.com/mattermost/mattermost-webapp.
 - Added ``react-native-hw-keyboard-event`` in https://github.com/mattermost/mattermost-mobile.
 - Added ``react-native-v8`` in https://github.com/mattermost/mattermost-mobile.
 - Removed ``jsc-android`` from https://github.com/mattermost/mattermost-mobile.

### Database Changes
 - Various indexes were added.

### API Changes
 - Added ``GET api/v4/channels/:channels/moderations`` and ``PUT api/v4/channels/:channels/moderations/patch`` to support channel moderation settings.
 - Added a ``PUT api/v4/commands/move`` endpoint to move a command to another team.
 - Added a ``GET api/v4/commands`` endpoint to retrieve a command by id.

### Websocket Event Changes
 - Added ``channel_scheme_updated`` Websocket Event.
 
### Known Issues
 - Batched emails are still sent even if any activity from the user is detected.
 - Keyboard shortcut to move between teams conflicts with Linux native OS shortcut.
 - Webapp crashes if the Direct Message modal is open when a guest is removed from a channel.
 - Slash command ``/leave`` fails to leave channel on webapp and crashes the Android app.
 - On a server using a subpath, the URL opens a blank page if the System Admin changes the Site URL in the System Console UI. To fix, the System Admin should restart the server.
 - Login does not work when Custom Terms of Service is enabled and MFA is enforced.
 - Google login fails on the Classic mobile apps.
 - Status may sometimes get stuck as away or offline in High Availability mode with IP Hash turned off.
 - Searching stop words in quotes with Elasticsearch enabled returns more than just the searched terms.
 - Searching with Elasticsearch enabled may not always highlight the searched terms.
 - Team sidebar on desktop app does not update when channels have been read on mobile.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.
 
### Contributors

 - [abdulsmapara](https://github.com/abdulsmapara), [Adovenmuehle](https://github.com/Adovenmuehle), [aeomin](https://translate.mattermost.com/user/aeomin/), [agarciamontoro](https://github.com/agarciamontoro), [AGMETEOR](https://github.com/AGMETEOR), [agnivade](https://github.com/agnivade), [ali-farooq0](https://github.com/ali-farooq0), [allenlai18](https://github.com/allenlai18), [ami9000](https://github.com/ami9000), [amyblais](https://github.com/amyblais), [amynicol1985](https://github.com/amynicol1985), [angeloskyratzakos](https://github.com/angeloskyratzakos), [AninditaBasu](https://github.com/AninditaBasu), [apoxa](https://github.com/apoxa), [asaadmahmood](https://github.com/asaadmahmood), [ashishbhate](https://github.com/ashishbhate), [ashwanisng](https://github.com/ashwanisng), [avasconcelos114](https://github.com/avasconcelos114), [bakurits](https://github.com/bakurits), [Better-Boy](https://github.com/Better-Boy), [bhuvana-guna](https://github.com/bhuvana-guna), [bolariin](https://github.com/bolariin), [bradjcoughlin](https://github.com/bradjcoughlin), [catalintomai](https://github.com/catalintomai), [caugner](https://github.com/caugner), [checkaayush](https://github.com/checkaayush), [chetanyakan](https://github.com/chetanyakan), [chikei](https://github.com/chikei), [chuttam](https://github.com/chuttam), [cometkim](https://github.com/cometkim), [comharris](https://github.com/comharris), [compiledsound](https://github.com/compiledsound), [cpanato](https://github.com/cpanato), [cpoile](https://github.com/cpoile), [crspeller](https://github.com/crspeller), [ctlaltdieliet](https://github.com/ctlaltdieliet), [deanwhillier](https://github.com/deanwhillier), [der-test](https://github.com/der-test), [devinbinnie](https://github.com/devinbinnie), [DHaussermann](https://github.com/DHaussermann), [DSchalla](https://github.com/DSchalla), [Durgaprasad-Budhwani](https://github.com/Durgaprasad-Budhwani), [ebiiim](https://github.com/ebiiim), [enahum](https://github.com/enahum), [enelson720](https://github.com/enelson720), [ericjaystevens](https://github.com/ericjaystevens), [ethervoid](https://github.com/ethervoid), [faase](https://github.com/faase), [fedealconada](https://github.com/fedealconada), [flynbit](https://github.com/flynbit), [fm2munsh](https://github.com/fm2munsh), [gabrieljackson](https://github.com/gabrieljackson), [gruceqq](https://translate.mattermost.com/user/gruceqq/), [grundleborg](https://github.com/grundleborg), [gsagula](https://github.com/gsagula), [hahmadia](https://github.com/hahmadia), [hannaparks](https://github.com/hannaparks), [hanzei](https://github.com/hanzei), [haydenhw](https://github.com/haydenhw), [hectorskypl](https://github.com/hectorskypl), [hiendinhngoc](https://github.com/hiendinhngoc), [HilaryClarke](https://github.com/HilaryClarke), [hmhealey](https://github.com/hmhealey), [iamsayantan](https://github.com/iamsayantan), [iomodo](https://github.com/iomodo), [isacikgoz](https://github.com/isacikgoz), [it33](https://github.com/it33), [JanhaviC15](https://github.com/JanhaviC15), [jasonblais](https://github.com/jasonblais), [jaydeland](https://github.com/jaydeland), [jespino](https://github.com/jespino), [jfrerich](https://github.com/jfrerich), [joewaitye](https://github.com/joewaitye), [johnthompson365](https://github.com/johnthompson365), [josephbaylon](https://github.com/josephbaylon), [josephk96](https://github.com/josephk96), [JtheBAB](https://github.com/JtheBAB), [jupenur](https://github.com/jupenur), [justinegeffen](https://github.com/justinegeffen), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [kajumito](https://github.com/kajumito), [Kaya_Zeren](https://twitter.com/kaya_zeren), [kosgrz](https://github.com/kosgrz), [larkox](https://github.com/larkox), [levb](https://github.com/levb), [lfbrock](https://github.com/lfbrock), [lieut-data](https://github.com/lieut-data), [lindalumitchell](https://github.com/lindalumitchell), [Lumexralph](https://github.com/Lumexralph), [M-ZubairAhmed](https://github.com/M-ZubairAhmed), [MarcoAlejandro](https://github.com/MarcoAlejandro), [marianunez](https://github.com/marianunez), [MatthewDorner](https://github.com/MatthewDorner), [meilon](https://github.com/meilon), [metanerd](https://github.com/metanerd), [mgdelacroix](https://github.com/mgdelacroix), [michaelschiffmm](https://github.com/michaelschiffmm), [mickmister](https://github.com/mickmister), [migbot](https://github.com/migbot), [mkraft](https://github.com/mkraft), [mlongo4290](https://github.com/mlongo4290), [mo2menelzeiny](https://github.com/mo2menelzeiny), [msvbhat](https://github.com/msvbhat), [MuLx10](https://github.com/MuLx10), [nadalfederer](https://github.com/nadalfederer), [natalie-hub](https://github.com/natalie-hub), [NeroBurner](https://github.com/NeroBurner), [nevyangelova](https://github.com/nevyangelova), [phillipahereza](https://github.com/phillipahereza), [Pomyk](https://github.com/Pomyk), [potaito](https://github.com/potaito), [prasoonmayank](https://github.com/prasoonmayank), [promulo](https://github.com/promulo), [rakhi2104](https://github.com/rakhi2104), [rbradleyhaas](https://github.com/rbradleyhaas), [reflog](https://github.com/reflog), [rodcorsi](https://github.com/rodcorsi), [RohitJain13](https://github.com/RohitJain13), [sadohert](https://github.com/sadohert), [saturninoabril](https://github.com/saturninoabril), [sbis04](https://github.com/sbis04), [sbishel](https://github.com/sbishel), [shadabk96](https://github.com/shadabk96), [shibasisp](https://github.com/shibasisp), [sibashisbishi](https://github.com/sibashisbishi), [someone-somenet-org](https://github.com/someone-somenet-org), [sowmiyamuthuraman](https://github.com/sowmiyamuthuraman), [srkgupta](https://github.com/srkgupta), [streamer45](https://github.com/streamer45), [stylianosrigas](https://github.com/stylianosrigas), [sudheerDev](https://github.com/sudheerDev), [svelle](https://github.com/svelle), [teyotan](https://github.com/teyotan), [TheoVitkovskiy](https://github.com/TheoVitkovskiy), [thePanz](https://github.com/thePanz), [thnat1234](https://github.com/thnat1234), [Ths2-9Y-LqJt6](https://github.com/Ths2-9Y-LqJt6), [TQuock](https://github.com/TQuock), [uhlhosting](https://github.com/uhlhosting), [upwell](https://github.com/upwell), [vespian](https://github.com/vespian), [wget](https://github.com/wget), [wiersgallak](https://github.com/wiersgallak), [wiggin77](https://github.com/wiggin77), [Willyfrog](https://github.com/Willyfrog)

## Release v5.21 - [Quality Release](https://docs.mattermost.com/process/release-faq.html#release-overview)

**Release day: 2020-03-16**

Mattermost v5.21.0 contains low level security fixes. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

### Compatibility
 - Honour key value expiry in KVCompareAndSet, KVCompareAndDelete and KVList. We also improved handling of plugin key value race conditions and deleted keys in Postgres.

### Bug Fixes
 - Fixed an issue where switching to an unread channel sometimes got stuck at "Loading..." on certain screen resolutions.
 - Fixed an issue where bots could not be added to group-synced channels or teams.
 - Fixed an issue where a user's authentication method in the System Console was shown as email if it was actually LDAP.
 - Fixed an issue where lines in over 65536 characters caused bulk import to fail.
 - Fixed an issue where code block line numbers were copied when pasting into certain applications.
 - Fixed an issue where the right-hand side reply thread scrolled down after receiving a new message.
 - Fixed an issue where the post menu opened up in the right-hand side made the menu options float off page if the parent post was short with no replies.
 - Fixed an issue where enabling and disabling the demo plugin generated a "connection is shutdown" error.
 - Fixed an issue where deactivated users with whom a user had never interacted in a private message before appeared in the New Direct Message menu.
 - Fixed an issue where clicking on an image in external image preview opened the image within the desktop app.
 - Fixed an issue where users were unable to open email links using View in Browsers option in incognito mode.
 - Fixed an issue where **Invite Guests > Emails** containing upper case letters were rejected.
 - Fixed an issue where a new user got a "No more channels to join" message while scrolling through the channel list.
 - Fixed an issue where clicking on "Terms of Service" and "Privacy Policy" on account creation on the desktop app didn't do anything.
 - Fixed an issue where gendered emojis were rendered with the wrong gender.
 - Fixed an issue where large video file uploads failed on the right-hand side without an appropriate error.
 
### Known Issues
 - Verification emails are still sent on servers with SMTP configured when`Enable Email Notifications` and `Require Email Verification` are disabled in the System Console.
 - On a server using a subpath, the URL opens a blank page if the System Admin changes the Site URL in the System Console UI. To fix, the System Admin should restart the server.
 - Login does not work when Custom Terms of Service is enabled and MFA is enforced.
 - Google login fails on the Classic mobile apps.
 - Status may sometimes get stuck as away or offline in High Availability mode with IP Hash turned off.
 - Searching stop words in quotes with Elasticsearch enabled returns more than just the searched terms.
 - Searching with Elasticsearch enabled may not always highlight the searched terms.
 - Team sidebar on desktop app does not update when channels have been read on mobile.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.
 
### Contributors
 - [adamjclarkson](https://github.com/adamjclarkson), [Adovenmuehle](https://github.com/Adovenmuehle), [aeomin](https://translate.mattermost.com/user/aeomin/), [AGMETEOR](https://github.com/AGMETEOR), [agnivade](https://github.com/agnivade), [ajh3](https://github.com/ajh3), [ali-farooq0](https://github.com/ali-farooq0), [allenlai18](https://github.com/allenlai18), [ami9000](https://github.com/ami9000), [amyblais](https://github.com/amyblais), [andreiavrammsd](https://github.com/andreiavrammsd), [AninditaBasu](https://github.com/AninditaBasu), [Apollo9999](https://github.com/Apollo9999), [asaadmahmood](https://github.com/asaadmahmood), [ashishbhate](https://github.com/ashishbhate), [asutosh97](https://github.com/asutosh97), [avasconcelos114](https://github.com/avasconcelos114), [bbodenmiller](https://github.com/bbodenmiller), [bolariin](https://github.com/bolariin), [bradjcoughlin](https://github.com/bradjcoughlin), [catalintomai](https://github.com/catalintomai), [checkaayush](https://github.com/checkaayush), [chikei](https://github.com/chikei), [chuttam](https://github.com/chuttam), [comharris](https://github.com/comharris), [cpanato](https://github.com/cpanato), [cpoile](https://github.com/cpoile), [crspeller](https://github.com/crspeller), [ctlaltdieliet](https://translate.mattermost.com/user/ctlaltdieliet/), [ctmusicnz](https://github.com/ctmusicnz), [darkdebo](https://github.com/darkdebo), [deanwhillier](https://github.com/deanwhillier), [der-test](https://github.com/der-test), [devinbinnie](https://github.com/devinbinnie), [DHaussermann](https://github.com/DHaussermann), [dkbhadeshiya](https://github.com/dkbhadeshiya), [dlclark](https://github.com/dlclark), [DSchalla](https://github.com/DSchalla), [emilioicai](https://github.com/emilioicai), [enahum](https://github.com/enahum), [enelson720](https://github.com/enelson720), [esethna](https://github.com/esethna), [ethervoid](https://github.com/ethervoid), [faase](https://github.com/faase), [flynbit](https://translate.mattermost.com/user/flynbit/), [fm2munsh](https://github.com/fm2munsh), [gabrieljackson](https://github.com/gabrieljackson), [gigawhitlocks](https://github.com/gigawhitlocks), [gruceqq](https://translate.mattermost.com/user/gruceqq/), [grundleborg](https://github.com/grundleborg), [hahmadia](https://github.com/hahmadia), [hanzei](https://github.com/hanzei), [hectorskypl](https://github.com/hectorskypl), [hmhealey](https://github.com/hmhealey), [ikeohachidi](https://github.com/ikeohachidi), [iomodo](https://github.com/iomodo), [isacikgoz](https://github.com/isacikgoz), [it33](https://github.com/it33), [J35u527](https://github.com/J35u527), [jasonblais](https://github.com/jasonblais), [jasonlanderson](https://github.com/jasonlanderson), [jaydeland](https://github.com/jaydeland), [jespino](https://github.com/jespino), [jfrerich](https://github.com/jfrerich), [johnthompson365](https://github.com/johnthompson365), [josephbaylon](https://github.com/josephbaylon), [joshuabezaleel](https://github.com/joshuabezaleel), [justinegeffen](https://github.com/justinegeffen), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [Kaya_Zeren](https://twitter.com/kaya_zeren), [khos2ow](https://github.com/khos2ow), [larkox](https://github.com/larkox), [lawikip](https://github.com/lawikip), [Lena](https://translate.mattermost.com/user/Lena/), [levb](https://github.com/levb), [lieut-data](https://github.com/lieut-data), [lindalumitchell](https://github.com/lindalumitchell), [M-ZubairAhmed](https://github.com/M-ZubairAhmed), [marianunez](https://github.com/marianunez), [matthewbirtch](https://github.com/matthewbirtch), [meilon](https://github.com/meilon), [metanerd](https://github.com/metanerd), [mgdelacroix](https://github.com/mgdelacroix), [michaelschiffmm](https://github.com/michaelschiffmm), [mickmister](https://github.com/mickmister), [migbot](https://github.com/migbot), [mkraft](https://github.com/mkraft), [mlongo4290](https://github.com/mlongo4290), [nadalfederer](https://github.com/nadalfederer), [natalie-hub](https://github.com/natalie-hub), [nevyangelova](https://github.com/nevyangelova), [njkevlani](https://github.com/njkevlani), [nmlc](https://github.com/nmlc), [opllama2](https://github.com/opllama2), [phillipahereza](https://github.com/phillipahereza), [promulo](https://github.com/promulo), [RajatVaryani](https://github.com/RajatVaryani), [ramkumarrn](https://github.com/ramkumarrn), [rbradleyhaas](https://github.com/rbradleyhaas), [reflog](https://github.com/reflog), [rodcorsi](https://github.com/rodcorsi), [Rulikkk](https://github.com/Rulikkk), [RyanCommits](https://github.com/RyanCommits), [s3than](https://github.com/s3than), [saturninoabril](https://github.com/saturninoabril), [sbishel](https://github.com/sbishel), [sowmiyamuthuraman](https://github.com/sowmiyamuthuraman), [srkgupta](https://github.com/srkgupta), [streamer45](https://github.com/streamer45), [strtw](https://github.com/strtw), [stylianosrigas](https://github.com/stylianosrigas), [sudheerDev](https://github.com/sudheerDev), [svelle](https://github.com/svelle), [thePanz](https://github.com/thePanz), [theriverman](https://github.com/theriverman), [Ths2-9Y-LqJt6](https://github.com/Ths2-9Y-LqJt6), [TQuock](https://github.com/TQuock), [uhlhosting](https://github.com/uhlhosting), [Unkn0wnCat](https://github.com/Unkn0wnCat), [vesari](https://github.com/vesari), [vespian](https://github.com/vespian), [vovapi](https://github.com/vovapi), [wget](https://github.com/wget), [wiersgallak](https://github.com/wiersgallak), [Willyfrog](https://github.com/Willyfrog)

## Release v5.20 - [Feature Release](https://docs.mattermost.com/process/release-faq.html#release-overview)

- **v5.20.2, released 2020-03-12**
  - Fixed an issue where Mattermost server crashed when running a compliance export. [MM-23157](https://mattermost.atlassian.net/browse/MM-23157)
  - Fixed an issue where switching to an unread channel got stuck at "Loading..." in certain screen resolutions. [MM-22698](https://mattermost.atlassian.net/browse/MM-22698)
- **v5.20.1, released 2020-02-16**
  - Fixed an issue where upgrading to v5.20 failed on servers running with ``PluginSettings.Enable = false``, and ``LogSettings.EnableDiagnostics = true``.
- **v5.20.0, released 2020-02-16**
  - Original 5.20.0 release

Mattermost v5.20.0 contains a low level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

### Compatibility

### Breaking Changes
 - Any [pre-packaged plugin](https://docs.mattermost.com/administration/plugins.html#pre-packaged-plugins) that is not enabled in the ``config.json`` will no longer install automatically, but can continue to be installed via the [plugin marketplace](https://docs.mattermost.com/administration/plugins.html#plugin-marketplace).
 - Boolean elements from interactive dialogs are no longer serialized as strings. While we try to avoid breaking changes, this change was necessary to allow both the web and mobile apps to work with the boolean elements introduced with v5.16.
 
**IMPORTANT:** If you upgrade from a release earlier than 5.19, please read the other [Important Upgrade Notes](https://docs.mattermost.com/administration/important-upgrade-notes.html).

### Highlights

#### A Banner to Jump to the Most Recent Posts
 - Ability to jump to the most recent posts in a channel by clicking a banner that automatically appears in busy channels with unread messages.
 
#### Open Email Notifications in the Desktop or Mobile App
 - Ability to open messages from email notifications in the Mattermost desktop or mobile apps instead of being directed to open them in the browser.
 
#### Ship MMCTL with Mattermost
 - Manage servers remotely with `mmctl`, a CLI tool that mimics the Mattermost CLI tool and ships inside Mattermost.

#### Reworked pre-packaged plugins
 - Pre-packaged plugins are now “pre-downloaded” plugins that are available within the Plugin Marketplace, even if your server doesn’t have direct access to the internet.
 
#### Plugin Marketplace Labels
 - Plugins supported by Mattermost and community supported plugins will be visible, making it easier to select an appropriate plugin based on your organization’s security policies.
  
#### Role mapping from LDAP and SAML (E20)
 - Ability to assign and restrict users to roles within Mattermost from your single sign-on (SSO) system.
 
#### Faster SAML install and configuration (E20)
 - Ability to use SAML without installing a separate binary and pull configuration metadata directly from the Identity Provider using an account-specific URL.

### Improvements

#### User Interface (UI)
 - Added support for mute option in Direct Message channel menus.
 - Added a red dot to browser favicon when there are unread mentions.
 - Added support for displaying a left-hand side bot icon in the webapp.
 - User's own username with a suffix 'you' is now shown in the username autocomplete.
 - Allowed user autocomplete to match on terms with spaces.
 - Improved autocomplete highlighting when using mouse and keyboard together.
 - Added support for showing single image thumbnails in compact view.
 - Contents of View Members and Manage Members modals now refresh when a user's role has changed.
 - Filtering search by channel now also shows the channel name and not only its ID.
 - Users now cannot type account input fields longer than the maximum length for first name, last name and email fields.
 
#### Plugins
 - Added a way to show that a plugin requires a certain Mattermost configuration setting.
 - Added support for plugins to add menu items to the Channel Menu.
 
#### Command Line Interface (CLI)
 - Added a CLI command ``webhook move`` for moving outgoing webhooks.
 
#### Bulk Import
 - When bulk import finds an already existing post, it now deletes existing files before importing new ones.
 - Bulk export now includes direct messages from a user to themselves.

#### Administration
 - Added support for Elasticsearch 7.
 - Added ability to inform System Admins when a user who managed bot accounts is deactivated, and enable them to take ownership of the bot.
 - Added LDAP/Elasticsearch/SQL Trace to server logs to make it easier for admins to diagnose problems.
 - Added ``plugins`` to the list of words that a team URL cannot start with.
 - Removed 26 character requirement from post action IDs.

### Bug Fixes
 - Fixed an issue where guest account creation erroneously considered the global list of whitelisted domains.
 - Fixed an issue where inviting multiple users with valid and invalid emails caused the invites for the valid users not to be sent.
 - Fixed an issue where option to invite users by email was displayed even if email invitations were disabled.
 - Fixed an issue where the channel drop-down **Leave Channel** failed to leave the channel on a server with a subpath.
 - Fixed an issue where messages with 2-byte characters didn't get posted.
 - Fixed an issue where links for recent mentions and flagged posts were doubled in smaller window widths.
 - Fixed an issue where opening the right-hand sidebar placed focus in the Search box instead of the Text box.
 - Fixed an issue where **Customization > Site Name** help text didn't match text field behavior.
 - Fixed an issue where the option to mark posts as unread was unexpectedly available when viewing archived channels.
 - Fixed an issue where emoji reactions shifted down a few pixels after clicking.
 - Fixed an issue where pasting code from GitHub resulted in broken markup and loss of text.
 - Fixed an issue where importing theme colours from Slack gave an error.
 - Fixed an issue where navigating to a plugin configuration page in the System Console for a deleted plugin returned a `Not Found` error.
 - Fixed an issue where scroll bar was missing on the welcome tutorial screen in web mobile view.

### config.json
Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json`, or the System Console when available.

#### Changes to Team Edition and Enterprise Edition:
 - Under ``SamlSettings`` in ``config.json``:
    - Added ``IdpMetadataUrl``, to add the URL where Mattermost sends a request to obtain setup metadata from the provider.
    - Added ``EnableAdminAttribute`` and ``AdminAttribute``, to add the attribute in the SAML Assertion for designating System Admins.
 - Under ``LdapSettings`` in ``config.json``:
    - Added ``EnableAdminFilter`` and ``AdminFilter``, to enter a filter to use for designating the System Admin role to users.
 - Under ``PluginSettings`` in ``config.json``:
    - Added ``EnableRemoteMarketplace``, to have the server attempt to connect to the configured Plugin Marketplace to show the latest plugins.
    - Added ``AutomaticPrepackagedPlugins``, so that any pre-packaged plugins enabled in the configuration will be installed or upgraded automatically.

### Open Source Components
 - Added ``@formatjs/intl-pluralrules`` in https://github.com/mattermost/mattermost-webapp.
 - Added ``@formatjs/intl-relativetimeformat`` in https://github.com/mattermost/mattermost-webapp.
 - Added ``custom-protocol-detection`` in https://github.com/mattermost/mattermost-webapp.
 - Added ``react-inlinesvg`` in https://github.com/mattermost/mattermost-webapp.

### Database Changes
 - Added ``Bots.LastIconUpdate`` column.
 - Added ``GroupTeams.SchemeAdmin`` column.
 - Added ``GroupChannels.SchemeAdmin`` column.

### API Changes
 - Added ``PUT /config/patch`` REST API endpoint that uses patch semantics to only update the fields of the config that are provided, while leaving the other fields unchanged.
 - Added ``POST /server_busy``, ``GET /server_busy`` and ``DELETE /server_busy`` REST API endpoints to add the ability to turn off non-critical services when under load.

### Websocket Event Changes
 - Added ``channel_restored`` Websocket Event.
 
### Known Issues
 - Code block line numbers are copied when pasting into certain applications.
 - Deactivated users with whom you never interacted in a private message before appear in New Direct Message menu.
 - Verification emails are still sent on servers with SMTP configured when`Enable Email Notifications` and `Require Email Verification` are disabled in the System Console.
 - On a server using a subpath, the URL opens a blank page if the System Admin changes the Site URL in the System Console UI. To fix, the System Admin should restart the server.
 - Login does not work when Custom Terms of Service is enabled and MFA is enforced.
 - Google login fails on the Classic mobile apps.
 - Status may sometimes get stuck as away or offline in High Availability mode with IP Hash turned off.
 - Searching stop words in quotes with Elasticsearch enabled returns more than just the searched terms.
 - Searching with Elasticsearch enabled may not always highlight the searched terms.
 - Team sidebar on desktop app does not update when channels have been read on mobile.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.
 
### Contributors
[abdusabri](https://github.com/abdusabri), [aeomin](https://translate.mattermost.com/user/aeomin/), [agarciamontoro](https://github.com/agarciamontoro), [AGMETEOR](https://github.com/AGMETEOR), [agnivade](https://github.com/agnivade), [ali-farooq0](https://github.com/ali-farooq0), [allenlai18](https://github.com/allenlai18), [amyblais](https://github.com/amyblais), [andylibrian](https://github.com/andylibrian), [anidok](https://github.com/anidok), [AninditaBasu](https://github.com/AninditaBasu), [anon6789](https://github.com/anon6789), [asaadmahmood](https://github.com/asaadmahmood), [ashishbhate](https://github.com/ashishbhate), [atulya-pandey](https://github.com/atulya-pandey), [avasconcelos114](https://github.com/avasconcelos114), [bbodenmiller](https://github.com/bbodenmiller), [bolariin](https://github.com/bolariin), [bpietraga](https://github.com/bpietraga), [bradjcoughlin](https://github.com/bradjcoughlin), [c-yan](https://github.com/c-yan), [calebroseland](https://github.com/calebroseland), [catalintomai](https://github.com/catalintomai), [CEOehis](https://github.com/CEOehis), [chikei](https://github.com/chikei), [ChrisDobby](https://github.com/ChrisDobby), [chuttam](https://github.com/chuttam), [cjohannsen81](https://github.com/cjohannsen81), [comharris](https://github.com/comharris), [cpanato](https://github.com/cpanato), [crspeller](https://github.com/crspeller), [ctmusicnz](https://github.com/ctmusicnz), [davidjwilkins](https://github.com/davidjwilkins), [DE-mbecker](https://github.com/DE-mbecker), [deanwhillier](https://github.com/deanwhillier), [der-test](https://github.com/der-test), [devinbinnie](https://github.com/devinbinnie), [dlclark](https://github.com/dlclark), [dra](https://github.com/dra), [DSchalla](https://github.com/DSchalla), [emilioicai](https://github.com/emilioicai), [enahum](https://github.com/enahum), [enelson720](https://github.com/enelson720), [enolal826](https://github.com/enolal826), [esdrasbeleza](https://github.com/esdrasbeleza), [ethervoid](https://github.com/ethervoid), [faase](https://github.com/faase), [flexo3001](https://github.com/flexo3001), [fm2munsh](https://github.com/fm2munsh), [gabrieljackson](https://github.com/gabrieljackson), [gigawhitlocks](https://github.com/gigawhitlocks), [gopheros](https://github.com/gopheros), [grubbins](https://github.com/grubbins), [gruceqq](https://translate.mattermost.com/user/gruceqq/), [gsagula](https://github.com/gsagula), [gupsho](https://github.com/gupsho), [hahmadia](https://github.com/hahmadia), [hanzei](https://github.com/hanzei), [hector2](https://github.com/hector2), [hectorskypl](https://github.com/hectorskypl), [hmhealey](https://github.com/hmhealey), [hunterlester](https://github.com/hunterlester), [ikeohachidi](https://github.com/ikeohachidi), [imisshtml](https://github.com/imisshtml), [iomodo](https://github.com/iomodo), [isacikgoz](https://github.com/isacikgoz), [itao](https://github.com/itao), [jasonblais](https://github.com/jasonblais), [jasonlanderson](https://github.com/jasonlanderson), [jaydeland](https://github.com/jaydeland), [jespino](https://github.com/jespino), [jfrerich](https://github.com/jfrerich), [jomaxro](https://github.com/jomaxro), [josephbaylon](https://github.com/josephbaylon), [JtheBAB](https://github.com/JtheBAB), [jupenur](https://github.com/jupenur), [justinegeffen](https://github.com/justinegeffen), [JustinReynolds-MM](https://github.com/JustinReynolds-MM), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [karlmarxlopez](https://github.com/karlmarxlopez), [Kaya_Zeren](https://twitter.com/kaya_zeren), [khos2ow](https://github.com/khos2ow), [kosgrz](https://github.com/kosgrz), [larkox](https://github.com/larkox), [lawikip](https://github.com/lawikip), [Lena](https://translate.mattermost.com/user/Lena/), [levb](https://github.com/levb), [lfbrock](https://github.com/lfbrock), [lieut-data](https://github.com/lieut-data), [lindalumitchell](https://github.com/lindalumitchell), [lindy65](https://github.com/lindy65), [lukewest](https://github.com/lukewest), [lurcio](https://github.com/lurcio), [M-ZubairAhmed](https://github.com/M-ZubairAhmed), [marianunez](https://github.com/marianunez), [meilon](https://github.com/meilon), [metanerd](https://github.com/metanerd), [mgdelacroix](https://github.com/mgdelacroix), [michaelschiffmm](https://github.com/michaelschiffmm), [mickmister](https://github.com/mickmister), [migbot](https://github.com/migbot), [mitchellroe](https://github.com/mitchellroe), [mjthomp95](https://github.com/mjthomp95), [mkraft](https://github.com/mkraft), [mlongo4290](https://github.com/mlongo4290), [nadalfederer](https://github.com/nadalfederer), [natalie-hub](https://github.com/natalie-hub), [niklabh](https://github.com/niklabh), [NiroshaV](https://github.com/NiroshaV), [nmlc](https://github.com/nmlc), [opllama2](https://github.com/opllama2), [phillipahereza](https://github.com/phillipahereza), [Pomyk](https://github.com/Pomyk), [popstr](https://github.com/popstr), [RajatVaryani](https://github.com/RajatVaryani), [rajudev](https://github.com/rajudev), [rascasoft](https://github.com/rascasoft), [rbradleyhaas](https://github.com/rbradleyhaas), [reflog](https://github.com/reflog), [rodcorsi](https://github.com/rodcorsi), [rvillablanca](https://github.com/rvillablanca), [RyanCommits](https://github.com/RyanCommits), [saturninoabril](https://github.com/saturninoabril), [sbishel](https://github.com/sbishel), [scottjr632](https://github.com/scottjr632), [sij507](https://github.com/sij507), [somenet](https://github.com/somenet), [sowmiyamuthuraman](https://github.com/sowmiyamuthuraman), [streamer45](https://github.com/streamer45), [stylianosrigas](https://github.com/stylianosrigas), [sudheerDev](https://github.com/sudheerDev), [svelle](https://github.com/svelle), [tasdomas](https://github.com/tasdomas), [thapakazi](https://github.com/thapakazi), [thefactremains](https://github.com/thefactremains), [themaverikk](https://github.com/themaverikk), [thePanz](https://github.com/thePanz), [TQuock](https://github.com/TQuock), [uhlhosting](https://github.com/uhlhosting), [vesari](https://github.com/vesari), [VishalSwarnkar](https://github.com/VishalSwarnkar), [wget](https://github.com/wget), [wiersgallak](https://github.com/wiersgallak), [wiggin77](https://github.com/wiggin77), [Willyfrog](https://github.com/Willyfrog), [xalkan](https://github.com/xalkan)

## Release v5.19 - [ESR](https://docs.mattermost.com/administration/extended-support-release.html)

Mattermost v5.19.0 contains low to high level security fixes. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

- **v5.19.3, released 2020-06-19**
  - Fixed an issue with the Plugin Tooltip implementation that caused links to be truncated when rendered. This issue occured if you are using the recent GitHub plugin v1.0.0 release. All links were affected, regardless if they were related to GitHub. [MM-25808]
- **v5.19.2, released 2020-04-21**
  - Fixed an issue with unexpected crashes related to any action taken to modify post properties such as push notifications. Note for developers: Direct access to the ``Props`` field in the ``model.Post`` structure has been deprecated. To avoid crash issues, the available ``GetProps()`` and ``SetProps()`` methods should now be used. Also, direct copy of the ``model.Post`` structure must be avoided in favor of the provided ``Clone()`` method. [MM-21378](https://mattermost.atlassian.net/browse/MM-21378)
  - Fixed an issue where a public channel appears in the list of Direct Message channels in the channel sidebar if the channel name is 40 characters long. [MM-23427](https://mattermost.atlassian.net/browse/MM-23427)
- **v5.19.1, released 2020-01-21**
  - Fixed a regression affecting v5.18 and v5.19 where some users were experiencing client-side performance issues. This was mainly affecting users with more than 100 channels listed in the channel sidebar and with channels sorted alphabetically. [MM-20349](https://mattermost.atlassian.net/browse/MM-20349)
- **v5.19.0, released 2020-01-16**
  - Original 5.19.0 release

### Compatibility

#### Breaking Changes
 - ``LockTeammateNameDisplay`` setting was moved to Enterprise Edition E20 as it was erroneously available in Team Edition and Enterprise Edition E10.
 
**IMPORTANT:** If you upgrade from a release earlier than 5.18, please read the other [Important Upgrade Notes](https://docs.mattermost.com/administration/important-upgrade-notes.html).

### Bug Fixes
 - Fixed an issue where email notifications were still sent in some cases while disabled in the user interface.
 - Fixed an issue where **System Console > Site Configuration > Users & Teams > Lock Teammate Name Display** should only have been available on Enterprise Edition E20 but was erroneously available also on Team Edition and Enterprise Edition E10.
 - Fixed an issue where the System Console left-hand side scrollbar was too dark to see.
 - Fixed an issue where inline markdown image links did not open with preview modal.
 - Fixed an issue on Edge where the "+" buttons in channel list were black on Mattermost default theme.
 - Fixed an issue where users were unable to scroll through message textbox autocomplete results using arrow keys.
 - Fixed an issue where clicking a line separator in the Main Menu closed the menu.
 - Fixed an issue where date separator showed long-format timestamps.
 - Fixed an issue where the Menu help text was truncated in English for Do Not Disturb status.
 - Fixed an issue where the height and width parameters in inline images didn't work.
 - Fixed an issue where the day picker in after/before search didn't honor the user's timezone override.
 - Fixed an issue where editing a post and hitting ``<enter>`` in code block saved the post automatically instead of adding a newline.
 - Fixed an issue where users were unable to close the Edit Channel Header modal when opened from the Intro Message.
 - Fixed an issue where opening the channel picker using CTRL+K and then focusing on the message box using CTRL+SHIFT+L did not close the channel picker.
 - Fixed an issue where the at-mention suggestions still highlighted the previous search but not the first suggestion in the list.
 - Fixed an issue where the at-mention autocomplete always opened up in the right-hand side reply thread, sometimes cutting off users in the list.
 - Fixed an issue with a notification badge count inconsistency when push notification setting was set to **All Activity**.
 - Fixed an issue where timestamps on 12-hour format had a leading zero.
 - Fixed an issue with an incorrect error message when attempting to add a bot to a channel if the bot was previously on the team.
 - Fixed an issue where the client license API generated a different ETag for every response.

### API Changes
 - Etag header was added to the API endpoint to get the client license.
 - Oath ``IsTrusted`` configuration can only be changed if the user has the ``manage_system`` permission.
 
### Known Issues
 - Client-side performance issues seen while typing.
 - On a server with a subpath, channel drop-down **Leave Channel** fails to leave the channel.
 - Importing theme colours from Slack gives an error.
 - Inviting multiple users with valid/allowed and invalid emails causes the invites for the valid users not to be sent.
 - Option to invite users by email is displayed even if email invitations are disabled.
 - Users may need to reinstall and delete cache on Classic apps if launching and logging into the app get stuck.
 - On a server using a subpath, the URL opens a blank page if the System Admin changes the Site URL in the System Console UI. To fix, the System Admin should restart the server.
 - Login does not work when Custom Terms of Service is enabled and MFA is enforced.
 - Google login fails on the Classic mobile apps.
 - Status may sometimes get stuck as away or offline in High Availability mode with IP Hash turned off.
 - Searching stop words in quotes with Elasticsearch enabled returns more than just the searched terms.
 - Searching with Elasticsearch enabled may not always highlight the searched terms.
 - Team sidebar on desktop app does not update when channels have been read on mobile.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.
 
### Contributors
[aaronrothschild](https://github.com/aaronrothschild), [abdusabri](https://github.com/abdusabri), [abhisek](https://github.com/abhisek), [aeomin](https://translate.mattermost.com/user/aeomin/), [AGMETEOR](https://github.com/AGMETEOR), [agnivade](https://github.com/agnivade), [ali-farooq0](https://github.com/ali-farooq0), [allenlai18](https://github.com/allenlai18), [alxsah](https://github.com/alxsah), [amyblais](https://github.com/amyblais), [anidok](https://github.com/anidok), [AninditaBasu](https://github.com/AninditaBasu), [asaadmahmood](https://github.com/asaadmahmood), [ashishbhate](https://github.com/ashishbhate), [avegrv](https://github.com/avegrv), [benbhall](https://github.com/benbhall), [bpietraga](https://github.com/bpietraga), [bradjcoughlin](https://github.com/bradjcoughlin), [calebroseland](https://github.com/calebroseland), [catalintomai](https://github.com/catalintomai), [chikei](https://github.com/chikei), [ChrisDobby](https://github.com/ChrisDobby), [comharris](https://github.com/comharris), [cpanato](https://github.com/cpanato), [cpoile](https://github.com/cpoile), [crspeller](https://github.com/crspeller), [darkestofdans](https://github.com/darkestofdans), [der-test](https://github.com/der-test), [devinbinnie](https://github.com/devinbinnie), [DSchalla](https://github.com/DSchalla), [enahum](https://github.com/enahum), [ethervoid](https://github.com/ethervoid), [faase](https://github.com/faase), [fm2munsh](https://github.com/fm2munsh), [gabrieljackson](https://github.com/gabrieljackson), [gigawhitlocks](https://github.com/gigawhitlocks), [gopheros](https://github.com/gopheros), [gruceqq](https://translate.mattermost.com/user/gruceqq/), [gsagula](https://github.com/gsagula), [gupsho](https://github.com/gupsho), [hahmadia](https://github.com/hahmadia), [hannaparks](https://github.com/hannaparks), [hanzei](https://github.com/hanzei), [hectorskypl](https://github.com/hectorskypl), [hmhealey](https://github.com/hmhealey), [icelander](https://github.com/icelander), [igomonov88](https://github.com/igomonov88), [ilgooz](https://github.com/ilgooz), [imisshtml](https://github.com/imisshtml), [iomodo](https://github.com/iomodo), [isacikgoz](https://github.com/isacikgoz), [jasonblais](https://github.com/jasonblais), [jaydeland](https://github.com/jaydeland), [jespino](https://github.com/jespino), [jfrerich](https://github.com/jfrerich), [jimiolaniyan](https://github.com/jimiolaniyan), [JtheBAB](https://github.com/JtheBAB), [justinegeffen](https://github.com/justinegeffen), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [Kaya_Zeren](https://twitter.com/kaya_zeren), [kop](https://github.com/kop), [kosgrz](https://github.com/kosgrz), [larkox](https://github.com/larkox), [Lena](https://translate.mattermost.com/user/Lena/), [lenucksi](https://github.com/lenucksi), [levb](https://github.com/levb), [lieut-data](https://github.com/lieut-data), [lindalumitchell](https://github.com/lindalumitchell), [lurcio](https://github.com/lurcio), [M-ZubairAhmed](https://github.com/M-ZubairAhmed), [MariadeAnton](https://github.com/MariadeAnton), [marianunez](https://github.com/marianunez), [mavegaf](https://github.com/mavegaf), [meilon](https://github.com/meilon), [metanerd](https://github.com/metanerd), [mgdelacroix](https://github.com/mgdelacroix), [michaelschiffmm](https://github.com/michaelschiffmm), [mickmister](https://github.com/mickmister), [migbot](https://github.com/migbot), [mkraft](https://github.com/mkraft), [mlongo4290](https://github.com/mlongo4290), [Mycobee](https://github.com/Mycobee), [nadalfederer](https://github.com/nadalfederer), [natalie-hub](https://github.com/natalie-hub), [nevyangelova](https://github.com/nevyangelova), [nick-brady](https://github.com/nick-brady), [phillipahereza](https://github.com/phillipahereza), [Pomyk](https://github.com/Pomyk), [RajatVaryani](https://github.com/RajatVaryani), [ramkumarvenkat](https://github.com/ramkumarvenkat), [reflog](https://github.com/reflog), [renilJoseph](https://github.com/renilJoseph), [rodcorsi](https://github.com/rodcorsi), [saneletm](https://github.com/saneletm), [saturninoabril](https://github.com/saturninoabril), [sbishel](https://github.com/sbishel), [sij507](https://github.com/sij507), [smacgregor](https://github.com/smacgregor), [src-r-r](https://github.com/src-r-r), [srkgupta](https://github.com/srkgupta), [streamer45](https://github.com/streamer45), [stylianosrigas](https://github.com/stylianosrigas), [sudheerDev](https://github.com/sudheerDev), [sunsingerus](https://github.com/sunsingerus), [svelle](https://github.com/svelle), [themaverikk](https://github.com/themaverikk), [thePanz](https://github.com/thePanz), [tomasmik](https://github.com/tomasmik), [TQuock](https://github.com/TQuock), [uhlhosting](https://github.com/uhlhosting), [valentijnnieman](https://github.com/valentijnnieman), [wget](https://github.com/wget), [wiersgallak](https://github.com/wiersgallak), [wiggin77](https://github.com/wiggin77), [Willyfrog](https://github.com/Willyfrog), [zujko](https://github.com/zujko)

## Release v5.18 - [Feature Release](https://docs.mattermost.com/process/release-faq.html#release-overview)

Mattermost v5.18.0 contains low to high level security fixes. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

- **v5.18.2, released 2020-01-16**
  - Fixed an issue where server crashed when a user updated their Account Settings in a high availability cluster environment, and the corresponding ``user_updated`` event did not reach a guest user. [MM-21481](https://mattermost.atlassian.net/browse/MM-21481)
- **v5.18.1, released 2020-01-08**
  - Mattermost v5.18.1 contains a high level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
  - Fixed an issue where migrating accounts from email to SAML failed. [MM-21472](https://mattermost.atlassian.net/browse/MM-21472)
- **v5.18.0, released 2019-12-16**
  - Original 5.18.0 release

### Compatibility
 
### Important Upgrade Notes
- Marking a post unread from the mobile app requires v1.26 or later. If using v5.18, but mobile is on v1.25 or earlier, marking a post unread from webapp/desktop will only be reflected on mobile the next time the app launches or is brought to the foreground.

### Breaking Changes
 - The Go module path of ``mattermost-server`` was changed to comply with the Go module version specification. Developers using Go modules with ``mattermost-server`` as a dependency must change the module and import paths to ``github.com/mattermost/mattermost-server/v5`` when upgrade this dependency to `v5.18`. See https://blog.golang.org/v2-go-modules for further information.
 - Removed ``Team.InviteId`` from the related Websocket event and sanitized it on all team API endpoints for users without invite permissions.
 - Removed the ability to change the type of a channel using the ``PUT /channels/{channel_id}`` API endpoint. The new ``PUT /channels/{channel_id}/privacy`` endpoint should be used for that purpose.
 
**IMPORTANT:** If you upgrade from a release earlier than 5.17, please read the other [Important Upgrade Notes](https://docs.mattermost.com/administration/important-upgrade-notes.html).

### Highlights
 
#### ID Loaded push notifications (E20)
 - Allows push notifications to be delivered showing the full message contents that are fetched from the server once the notification is delivered to the device. This means that Apple Push Notification Service (APNS) or Google Firebase Cloud Messaging (FCM) cannot read the message contents since only a unique message ID is sent in the notification payload. 
 
#### Allow Plugin Upgrades
 - Added ability to upgrade plugins and prepackaged plugins via the marketplace.
 
#### Mark Posts as Unread
 - When marking a post as unread, the user will land on the unread post the next time they click on the relevant channel.
 
#### mmctl remote CLI tool
 - Allows a system admin to run commands when conventional access to the server via SSH isn't possible.

#### View Archived Channels (Beta)
 - View, share and search for content of archived channels. See more details [here](https://docs.mattermost.com/administration/config-settings.html#allow-users-to-view-archived-channels-beta).

#### Guest Account SAML & LDAP Support (EE)
 - Provision Guests directly from AD/LDAP or SAML upon login. Guests will have no access to any teams or channels until they are assigned.

#### Actiance Improvements (E20)
 - Added events (such as post/file deletion and edit events) to Actiance Export to improve tracking within the Vantage report interface.

#### LDAP Group Sync upgraded to Beta phase (E20)
 - Previously in “Experimental” phase, the linking of AD/LDAP groups to Mattermost groups is now officially in “Beta” phase.

### Improvements

#### User Interface (UI)
 - Disabled email notifications in Do Not Disturb mode.
 - Added support for showing a tooltip on public and private channel names that get truncated.
 - Added support for allowing in-line markdown images to open a preview window.
 - Added line numbers to code blocks that have syntax highlighting.
 - Added support for trimming leading/trailing whitespace on a channel name when a channel is created.

#### Command Line Interface (CLI)
 - Updated CLI command "deleter user" to add ability to delete the given user's group memberships.
 - Created CLI command "config reset" to allow resetting the value of a config setting to its default value.
 
#### Integrations
 - Added ability to disable attachment buttons and fields.
 - Added user_name, team_domain and channel_name metadata when clicking an interactive button.
 - Extended EnsureBot helper function to include bot images.
 - Added support for a generic error message in interactive dialog responses.
 
#### Plugins
 - Added support for interplugin communication.
 - Added support for server version and minimum server version checks in helper methods for plugins.
 - Added support for returning results for individual plugins in **System Console > Search**.
 - Added the ability to add submenus in post dropdowns for plugins.

#### Administration
 - Added support for System Administrators to control Teammate Name Display at the system level.
 - Added support for revoking Guest User Sessions when the Guest Accounts feature is disabled.
 - Added the ability to search in **System Console > Channels** and **System Console > Teams**.
 - Added the ability to add users as another user to the plugin API.
 - Restricted user access to ``/logs`` API endpoint.
 - Added "Remove team" and "Change role" options in Team Membership panel.
 - Added support for disabling channel settings for public and private toggle for default channels.

#### Enterprise Edition (EE)
 - Added SAML login events to the Audits Table.
 - Added support for configuration of SAML crypto hashing algorithms.
 - Added support for not allowing Guest invitations to teams that are managed by LDAP Group Sync.
 - Added support for custom post types to Compliance exports.

### Bug Fixes
 - Fixed an issue where modifying config files caused compliance exports to run twice.
 - Fixed an issue where admins were not able to create LDAP user via /api/v4/users.
 - Fixed some bugs related to the [keyboard accessibility](https://docs.mattermost.com/help/getting-started/accessibility.html) feature.
 - Fixed issues with Guest Accounts feature, such as an issue where the option to make guest users as team admins was erroneously provided in Manage Teams dialog on **System Console > Users**.
 - Fixed an issue where an opened emoji picker floated while the user scrolled in the channel.
 - Fixed an issue where "Your message is too long" warning on the right-hand side reply thread overlapped the Preview button.
 - Fixed an issue where hitting escape to close autocomplete also closed channel header modal.
 - Fixed an issue where negative search filter hypens and occasional random terms were highlighted in search results.
 - Fixed an issue where deactivating a user increased Monthly Active Users and Daily Active Users count by 1 in **System Console > Site Statistics**.
 - Fixed an issue where **Reporting > Statistics** showed 'Loading...' when the value for any of the statistics was zero.
 - Fixed an issue where converting a user to a bot via the command line tool (CLI) did not create an access token and could not be deleted.
 - Fixed an issue where archived channels displayed in **System Console -> Channels** page.

### config.json
Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json`, or the System Console when available.

#### Changes to Team Edition and Enterprise Edition:
 - Under ``TeamSettings``:
   - Added ``LockTeammateNameDisplay`` to add support for System Administrators to control Teammate Name Display at the system level.
 - Under ``LdapSettings``:
   - Added ``GuestFilter`` to be able to enter an AD/LDAP Filter to use when searching for external users who have Guest Access to Mattermost.
 - Under ``SamlSettings``:
   - Added ``SignatureAlgorithm`` to be able to choose a signature algorithm used to sign the request.
   - Added ``CanonicalAlgorithm`` to be able to choose the canonicalization algorithm.
   - Added ``GuestAttribute`` to add support for entering the attribute in the SAML Assertion used to apply a guest role to users.
 - Under ``PluginSettings``:
   - Added ``RequirePluginSignature`` to add support for requiring valid plugin signatures before starting managed or unmanaged plugins.
   - Added ``SignaturePublicKeyFiles`` to add support for specifying public keys to be trusted to validate plugin signatures in addition to the Mattermost plugin signing key built-into the server.
 - Under Push Notification Contents:
   - Added ``id_loaded`` to add an option for full message content being fetched from the server on receipt (*Available in Enterprise Edition E20*).
 - Under ``ServiceSettings``:
   - Removed ``ExperimentalLdapGroupSync`` setting.

### Open Source Components
 - Added ``@types/highlight`` in https://github.com/mattermost/mattermost-webapp.
 - Added ``@typescript-eslint/parser`` in https://github.com/mattermost/mattermost-webapp.
 - Added ``@react-native-community/cameraroll`` in https://github.com/mattermost/mattermost-mobile.
 - Added ``@sentry/react-native`` in https://github.com/mattermost/mattermost-mobile.
 - Added ``form-data`` in https://github.com/mattermost/mattermost-mobile.
 - Added ``react-native-fast-image`` in https://github.com/mattermost/mattermost-mobile.
 - Added ``react-navigation-stack`` in https://github.com/mattermost/mattermost-mobile.
 - Added ``redux-offline`` in https://github.com/mattermost/mattermost-mobile.
 
### API Changes
 - Added POST handler for /plugins/marketplace to install marketplace plugins.
 - Added a ``search_archived`` API endpoint to be able to search archived channels.
 - Added a ``post_unread`` API endpoint to be able to set posts as unread.

### Websocket Event Changes
 - Added marked post as unread Websocket Event.
 - Added guests deactivated Websocket Event.
 
### Known Issues
 - Client-side performance issues seen while typing.
 - System Console left-hand side scrollbar may be too dark to see.
 - Menu help text for Do Not Disturb is truncated in English.
 - Inviting multiple users with valid/allowed and invalid emails causes the invites for the valid users not to be sent.
 - Option to invite users by email is displayed even if email invitations are disabled.
 - Option to mark posts as unread is unexpectedly available when viewing archived channels.
 - Users may need to reinstall and delete cache on Classic apps if launching and logging into the app get stuck.
 - On a server using a subpath, the URL opens a blank page if the System Admin changes the Site URL in the System Console UI. To fix, the System Admin should restart the server.
 - Login does not work when Custom Terms of Service is enabled and MFA is enforced.
 - Google login fails on the Classic mobile apps.
 - Status may sometimes get stuck as away or offline in High Availability mode with IP Hash turned off.
 - Searching stop words in quotes with Elasticsearch enabled returns more than just the searched terms.
 - Searching with Elasticsearch enabled may not always highlight the searched terms.
 - Team sidebar on desktop app does not update when channels have been read on mobile.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.
 
### Contributors
[3mard](https://github.com/3mard), [a8uhnf](https://github.com/a8uhnf), [aaronrothschild](https://github.com/aaronrothschild), [abdusabri](https://github.com/abdusabri), [aeomin](https://translate.mattermost.com/user/aeomin/), [AGMETEOR](https://github.com/AGMETEOR), [agnivade](https://github.com/agnivade), [akshaychhajed](https://github.com/akshaychhajed), [ali-farooq0](https://github.com/ali-farooq0), [allenlai18](https://github.com/allenlai18), [alxsah](https://github.com/alxsah), [amyblais](https://github.com/amyblais), [andresoro](https://github.com/andresoro), [anindha](https://github.com/anindha), [AninditaBasu](https://github.com/AninditaBasu), [arjitc](https://github.com/arjitc), [asaadmahmood](https://github.com/asaadmahmood), [ashishbhate](https://github.com/ashishbhate), [avasconcelos114](https://github.com/avasconcelos114), [bradjcoughlin](https://github.com/bradjcoughlin), [brewsterbhg](https://github.com/brewsterbhg), [bvineyar](https://github.com/bvineyar), [cardoso](https://github.com/cardoso), [catalintomai](https://github.com/catalintomai), [chapa](https://github.com/chapa), [chetanyakan](https://github.com/chetanyakan), [chikei](https://github.com/chikei), [chuttam](https://github.com/chuttam), [cinlloc](https://github.com/cinlloc), [cjohannsen81](https://github.com/cjohannsen81), [cometkim](https://github.com/cometkim), [comharris](https://github.com/comharris), [cpanato](https://github.com/cpanato), [cpoile](https://github.com/cpoile), [cpurta](https://github.com/cpurta), [crspeller](https://github.com/crspeller), [deanwhillier](https://github.com/deanwhillier), [der-test](https://github.com/der-test), [devinbinnie](https://github.com/devinbinnie), [DHaussermann](https://github.com/DHaussermann), [drekar](https://github.com/drekar), [DSchalla](https://github.com/DSchalla), [enahum](https://github.com/enahum), [enolal826](https://github.com/enolal826), [ethervoid](https://github.com/ethervoid), [etoaster](https://github.com/etoaster), [FlaviaBastos](https://github.com/FlaviaBastos), [fm2munsh](https://github.com/fm2munsh), [focusonmx](https://github.com/focusonmx), [g3rv4](https://github.com/g3rv4), [gabrieljackson](https://github.com/gabrieljackson), [gigawhitlocks](https://github.com/gigawhitlocks), [goku321](https://github.com/goku321), [gruceqq](https://translate.mattermost.com/user/gruceqq/), [grundleborg](https://github.com/grundleborg), [gupsho](https://github.com/gupsho), [hahmadia](https://github.com/hahmadia), [hanzei](https://github.com/hanzei), [harshilsharma63](https://github.com/harshilsharma63), [hectorskypl](https://github.com/hectorskypl), [HilalNazli](https://github.com/HilalNazli), [hmhealey](https://github.com/hmhealey), [icelander](https://github.com/icelander), [ilgooz](https://github.com/ilgooz), [imisshtml](https://github.com/imisshtml), [iomodo](https://github.com/iomodo), [ishanray](https://github.com/ishanray), [ivanvc](https://github.com/ivanvc), [jabshire](https://github.com/jabshire), [jasonblais](https://github.com/jasonblais), [jaydeland](https://github.com/jaydeland), [jespino](https://github.com/jespino), [jfrerich](https://github.com/jfrerich), [jgbaylon](https://github.com/jgbaylon), [jimiolaniyan](https://github.com/jimiolaniyan), [johnthompson365](https://github.com/johnthompson365), [joshuabezaleel](https://github.com/joshuabezaleel), [jozuenoon](https://github.com/jozuenoon), [justinegeffen](https://github.com/justinegeffen), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [kanozec](https://github.com/kanozec), [karlmarxlopez](https://github.com/karlmarxlopez), [Kaya_Zeren](https://twitter.com/kaya_zeren), [kdenz](https://github.com/kdenz), [kosgrz](https://github.com/kosgrz), [KuSh](https://github.com/KuSh), [larkox](https://github.com/larkox), [last-partizan](https://github.com/last-partizan), [Lena](https://translate.mattermost.com/user/Lena/), [levb](https://github.com/levb), [lieut-data](https://github.com/lieut-data), [lindalumitchell](https://github.com/lindalumitchell), [M-ZubairAhmed](https://github.com/M-ZubairAhmed), [m4ver1k](https://github.com/m4ver1k), [malaDev](https://github.com/malaDev), [manland](https://github.com/manland), [marianunez](https://github.com/marianunez), [MathewtheCoder](https://github.com/MathewtheCoder), [meilon](https://github.com/meilon), [mgdelacroix](https://github.com/mgdelacroix), [michaelschiffmm](https://github.com/michaelschiffmm), [mickmister](https://github.com/mickmister), [migbot](https://github.com/migbot), [mkraft](https://github.com/mkraft), [mlongo4290](https://github.com/mlongo4290), [natalie-hub](https://github.com/natalie-hub), [nathanmkaya](https://github.com/nathanmkaya), [niklabh](https://github.com/niklabh), [nrekretep](https://github.com/nrekretep), [Pomyk](https://github.com/Pomyk), [pqzx](https://github.com/pqzx), [pradeepmurugesan](https://github.com/pradeepmurugesan), [promulo](https://github.com/promulo), [PunitGr](https://github.com/PunitGr), [r4zorgeek](https://github.com/r4zorgeek), [RajatVaryani](https://github.com/RajatVaryani), [reflog](https://github.com/reflog), [rfoyard](https://github.com/rfoyard), [rodcorsi](https://github.com/rodcorsi), [rvillablanca](https://github.com/rvillablanca), [SamWolfs](https://github.com/SamWolfs), [saneletm](https://github.com/saneletm), [saturninoabril](https://github.com/saturninoabril), [sbishel](https://github.com/sbishel), [scottleedavis](https://github.com/scottleedavis), [Sheshagiri](https://github.com/Sheshagiri), [sij507](https://github.com/sij507), [sphr](https://github.com/sphr), [srkgupta](https://github.com/srkgupta), [sstaszkiewicz-copperleaf](https://github.com/sstaszkiewicz-copperleaf), [steevsachs](https://github.com/steevsachs), [streamer45](https://github.com/streamer45), [stylianosrigas](https://github.com/stylianosrigas), [sudheerDev](https://github.com/sudheerDev), [sunsingerus](https://github.com/sunsingerus), [svelle](https://github.com/svelle), [thePanz](https://github.com/thePanz), [TonPC64](https://github.com/TonPC64), [TQuock](https://github.com/TQuock), [uhlhosting](https://github.com/uhlhosting), [unlikelygeek](https://github.com/unlikelygeek), [valentijnnieman](https://github.com/valentijnnieman), [ventz](https://github.com/ventz), [vinicio](https://github.com/vinicio), [wget](https://github.com/wget), [wiersgallak](https://github.com/wiersgallak), [wiggin77](https://github.com/wiggin77), [Willyfrog](https://github.com/Willyfrog), [wlsf82](https://github.com/wlsf82), [YuikoTakada](https://github.com/YuikoTakada)

## Release v5.17 - [Quality Release](https://docs.mattermost.com/process/release-faq.html#release-overview)

Mattermost v5.17.0 contains medium to high level security fixes. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

- **v5.17.3, released 2020-01-08**
  - Mattermost v5.17.3 contains a high level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
  - Fixed an issue where migrating accounts from email to SAML failed. [MM-21472](https://mattermost.atlassian.net/browse/MM-21472)
- **v5.17.2, released 2019-12-18**
  - Mattermost v5.17.2 contains high level security fixes. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
- **v5.17.1, released 2019-11-25**
  - Fixed an issue where leaving a channel does not work in some cases if the channel was open in another webapp or desktop client. [MM-20206](https://mattermost.atlassian.net/browse/MM-20206)
- **v5.17.0, released 2019-11-16**
  - Original 5.17.0 release

### Bug Fixes
 - Fixed an issue where saving an empty string on Marketplace URL reset the URL instead of showing an error.
 - Fixed an issue where the default permission was such that all users were allowed to invite a guest instead of only System Admins.
 - Fixed an issue where Guest users were shown in the list when adding new members to a channel.
 - Fixed an issue where attempting to configure uninstalled plugins got stuck at "Loading..." without timeout.
 - Fixed an issue where clicking "Search" icon in narrow-width mode caused right-hand side to appear along with loading indicator "...".
 - Fixed an issue where ``@all`` notification was still sent to all users when using TAB to press Cancel on the notification prompt.
 - Fixed an issue where system messages could trigger mentions for username collisions.
 - Fixed an issue where code syntax was not rendering or highlighting as expected in markdown.
 - Fixed an issue where users were not able to attach a file from iPad using Safari.
 - Fixed an issue where ``/code`` was rendering HTML incorrectly.
 - Fixed an issue where clicking "Pinned" icon removed text in the search box.
 - Fixed an issue where **Main Menu > Integrations > OAuth 2.0 Applications** page user interface broke when shrinking the window to a small size.
 - Fixed an issue where no feedback was given on mobile view when the maximum post length had been exceeded.
 - Fixed an issue where dragging or dropping a folder did not scroll the user to the right-hand side text box to make the error more visible.
 - Fixed an issue on mobile browser view where the post menu was split in 2 and users were not able to scroll up to see "Add Reaction" option.
 - Fixed an issue where pressing and holding on teams and channels in the left-hand side opened the context menu on the Desktop App.
 - Fixed an issue where the user popover bled off screen when browser or Desktop App was set to full-screen mode.
 - Fixed an issue where clicking locally installed plugins without a URL opened a new tab to the same page.
 - Fixed an issue where interactive message buttons and menus were not vertically the same size.
 - Fixed an issue where the first element was selected by default in radio elements in interactive buttons.
 - Fixed an issue where search with quotation marks was not returning expected results.
 - Fixed an issue where bulk importer generated invalid passwords for the user object with a missing password key.
 - Fixed an issue where post metadata was returned for deleted posts.
 - Fixed an issue where users were not able to use ``api/v4/websocket`` with a trailing slash.
 - Fixed an issue with subpaths where in-app System Console links were missing in the ``/subpath`` and resulted in a 404 error.
 - Fixed an issue where **Terms of Service** and **Privacy Policy** in **Main Menu > About Mattermost** did not permanently link to Mattermost's policies.
 
### config.json

A setting option was added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json`, or the System Console when available.

#### Changes to Team Edition and Enterprise Edition:
 - Under ``ServiceSettings`` in ``config.json``:
    - Added ``EnableLatex`` to add an option to enable/disable rendering of latex code.
 
### Known Issues
 - Deactivating a user increases Monthly Active Users and Daily Active Users count by 1 in **System Console > Site Statistics**.
 - Negative search filter hypens and occasional random terms are highlighted in search results.
 - Hitting escape to close autocomplete also closes channel header modal.
 - On a server using a subpath, the URL opens a blank page if the System Admin changes the Site URL in the System Console UI. To fix, the System Admin should restart the server.
 - Login does not work when Custom Terms of Service is enabled and MFA is enforced.
 - Google login fails on the Classic mobile apps.
 - Status may sometimes get stuck as away or offline in High Availability mode with IP Hash turned off.
 - Searching stop words in quotes with Elasticsearch enabled returns more than just the searched terms.
 - Searching with Elasticsearch enabled may not always highlight the searched terms.
 - Team sidebar on desktop app does not update when channels have been read on mobile.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.

### Contributors
[a-arias](https://github.com/a-arias), [A-Hilaly](https://github.com/A-Hilaly), [a8uhnf](https://github.com/a8uhnf), [aaronrothschild](https://github.com/aaronrothschild), [abadojack](https://github.com/abadojack), [abdusabri](https://github.com/abdusabri), [abelharisov](https://github.com/abelharisov), [aeomin](https://translate.mattermost.com/user/aeomin/), [AGMETEOR](https://github.com/AGMETEOR), [agnivade](https://github.com/agnivade), [agusl88](https://github.com/agusl88), [akantsevoi](https://github.com/akantsevoi), [akpark](https://github.com/akpark), [akshaychhajed](https://github.com/akshaychhajed), [aladhims](https://github.com/aladhims), [ali-farooq0](https://github.com/ali-farooq0), [amyblais](https://github.com/amyblais), [ananichev](https://github.com/ananichev), [anchepiece](https://github.com/anchepiece), [andresoro](https://github.com/andresoro), [anindha](https://github.com/anindha), [aqche](https://github.com/aqche), [arjitc](https://github.com/arjitc), [asaadmahmood](https://github.com/asaadmahmood), [avasconcelos114](https://github.com/avasconcelos114), [bensooraj](https://github.com/bensooraj), [boonwj](https://github.com/boonwj), [bradjcoughlin](https://github.com/bradjcoughlin), [brewsterbhg](https://github.com/brewsterbhg), [bryanculver](https://github.com/bryanculver), [catalintomai](https://github.com/catalintomai), [cedrickring](https://github.com/cedrickring), [chahat-arora](https://github.com/chahat-arora), [chikei](https://github.com/chikei), [ChrisDobby](https://github.com/ChrisDobby), [chuttam](https://github.com/chuttam), [cinlloc](https://github.com/cinlloc), [codevbus](https://github.com/codevbus), [comharris](https://github.com/comharris), [cpanato](https://github.com/cpanato), [cpoile](https://github.com/cpoile), [crspeller](https://github.com/crspeller), [CSBatchelor](https://github.com/CSBatchelor), [dailos2coders](https://github.com/dailos2coders), [DaKeiser](https://github.com/DaKeiser), [deanwhillier](https://github.com/deanwhillier), [dedifferentiator](https://github.com/dedifferentiator), [der-test](https://github.com/der-test), [devinbinnie](https://github.com/devinbinnie), [DHaussermann](https://github.com/DHaussermann), [dnguy078](https://github.com/dnguy078), [drekar](https://github.com/drekar), [DropNib](https://github.com/DropNib), [enahum](https://github.com/enahum), [esethna](https://github.com/esethna), [FlaviaBastos](https://github.com/FlaviaBastos), [gabrieljackson](https://github.com/gabrieljackson), [gfelixc](https://github.com/gfelixc), [gigawhitlocks](https://github.com/gigawhitlocks), [goku321](https://github.com/goku321), [gruceqq](https://translate.mattermost.com/user/gruceqq/), [grundleborg](https://github.com/grundleborg), [guigui64](https://github.com/guigui64), [gupsho](https://github.com/gupsho), [hahmadia](https://github.com/hahmadia), [hanzei](https://github.com/hanzei), [hector2](https://github.com/hector2), [hectorskypl](https://github.com/hectorskypl), [HelioStrike](https://github.com/HelioStrike), [heowc](https://github.com/heowc), [hmhealey](https://github.com/hmhealey), [hypnoglow](https://github.com/hypnoglow), [iDevoid](https://github.com/iDevoid), [imavroukakis](https://github.com/imavroukakis), [imisshtml](https://github.com/imisshtml), [iomodo](https://github.com/iomodo), [isacikgoz](https://github.com/isacikgoz), [italolelis](https://github.com/italolelis), [iwataka](https://github.com/iwataka), [jairojj](https://github.com/jairojj), [jasminexie](https://github.com/jasminexie), [jasonblais](https://github.com/jasonblais), [jatinjtg](https://github.com/jatinjtg), [JeewhanR](https://github.com/JeewhanR), [jesperhansen17](https://github.com/jesperhansen17), [jespino](https://github.com/jespino), [jfrerich](https://github.com/jfrerich), [jkl5616](https://github.com/jkl5616), [joebordes](https://github.com/joebordes), [johnthompson365](https://github.com/johnthompson365), [jordeguevara](https://github.com/jordeguevara), [jorgeruvalcaba](https://github.com/jorgeruvalcaba), [josephk96](https://github.com/josephk96), [JosephSamela](https://github.com/JosephSamela), [joshuabezaleel](https://github.com/joshuabezaleel), [jozuenoon](https://github.com/jozuenoon), [JtheBAB](https://github.com/JtheBAB), [justinegeffen](https://github.com/justinegeffen), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [karanrn](https://github.com/karanrn), [karlmarxlopez](https://github.com/karlmarxlopez), [kashifsoofi](https://github.com/kashifsoofi), [Kaya_Zeren](https://twitter.com/kaya_zeren), [kethinov](https://github.com/kethinov), [kgeorgiou](https://github.com/kgeorgiou), [larkox](https://github.com/larkox), [laurapareja](https://github.com/laurapareja), [Lena](https://translate.mattermost.com/user/Lena/), [levb](https://github.com/levb), [lieut-data](https://github.com/lieut-data), [lindalumitchell](https://github.com/lindalumitchell), [LK4D4](https://github.com/LK4D4), [lucianomagrao](https://github.com/lucianomagrao), [Lumexralph](https://github.com/Lumexralph), [lurcio](https://github.com/lurcio), [malaDev](https://github.com/malaDev), [manland](https://github.com/manland), [marianunez](https://github.com/marianunez), [mauricio](https://github.com/mauricio), [MayMeow](https://github.com/MayMeow), [mbluemer](https://github.com/mbluemer), [meilon](https://github.com/meilon), [Menelion](https://github.com/Menelion), [mgdelacroix](https://github.com/mgdelacroix), [mhartenbower](https://github.com/mhartenbower), [mickmister](https://github.com/mickmister), [migbot](https://github.com/migbot), [mistikel](https://github.com/mistikel), [mjthomp95](https://github.com/mjthomp95), [mkraft](https://github.com/mkraft), [mlongo4290](https://github.com/mlongo4290), [Mrigank11](https://github.com/Mrigank11), [Muscaw](https://github.com/Muscaw), [Mycobee](https://github.com/Mycobee), [nfriend](https://github.com/nfriend), [nicnicknicky](https://github.com/nicnicknicky), [niklabh](https://github.com/niklabh), [njkevlani](https://github.com/njkevlani), [octoquad](https://github.com/octoquad), [oksmelnik](https://github.com/oksmelnik), [pbitty](https://github.com/pbitty), [Pensu](https://github.com/Pensu), [phillipahereza](https://github.com/phillipahereza), [Phizzard](https://github.com/Phizzard), [pikami](https://github.com/pikami), [Pomyk](https://github.com/Pomyk), [pqzx](https://github.com/pqzx), [pradeepmurugesan](https://github.com/pradeepmurugesan), [ptisserand](https://github.com/ptisserand), [pushkyn](https://github.com/pushkyn), [raghuiamsingh](https://github.com/raghuiamsingh), [RajatVaryani](https://github.com/RajatVaryani), [reflog](https://github.com/reflog), [rfoyard](https://github.com/rfoyard), [rodcorsi](https://github.com/rodcorsi), [rohanjulka19](https://github.com/rohanjulka19), [rv404674](https://github.com/rv404674), [sahilsharma011](https://github.com/sahilsharma011), [SamWolfs](https://github.com/SamWolfs), [sascha-andres](https://github.com/sascha-andres), [saturninoabril](https://github.com/saturninoabril), [sbishel](https://github.com/sbishel), [scottleedavis](https://github.com/scottleedavis), [sdesani](https://github.com/sdesani), [SezalAgrawal](https://github.com/SezalAgrawal), [shahbour](https://github.com/shahbour), [Sheshagiri](https://github.com/Sheshagiri), [simonfrey](https://github.com/simonfrey), [simross](https://github.com/simross), [sourabkumarkeshri](https://github.com/sourabkumarkeshri), [sowmiyamuthuraman](https://github.com/sowmiyamuthuraman), [srkgupta](https://github.com/srkgupta), [steevsachs](https://github.com/steevsachs), [stefan-malcek](https://github.com/stefan-malcek), [streamer45](https://github.com/streamer45), [stylianosrigas](https://github.com/stylianosrigas), [sudheerDev](https://github.com/sudheerDev), [svelle](https://github.com/svelle), [tgkouras](https://github.com/tgkouras), [thekiiingbob](https://github.com/thekiiingbob), [thePanz](https://github.com/thePanz), [ThiefMaster](https://github.com/ThiefMaster), [tpaschalis](https://github.com/tpaschalis), [uhlhosting](https://github.com/uhlhosting), [Vaelor](https://github.com/Vaelor), [valentijnnieman](https://github.com/valentijnnieman), [vdepatla](https://github.com/vdepatla), [VictorAvelar](https://github.com/VictorAvelar), [wget](https://github.com/wget), [wiersgallak](https://github.com/wiersgallak), [willdot](https://github.com/willdot), [Willyfrog](https://github.com/Willyfrog), [wyze](https://github.com/wyze), [xrav3nz](https://github.com/xrav3nz)

## Release v5.16 - [Feature Release](https://docs.mattermost.com/process/release-faq.html#release-overview)

- **v5.16.5, released 2020-01-08**
  - Mattermost v5.16.5 contains a high level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
  - Fixed an issue where migrating accounts from email to SAML failed. [MM-21472](https://mattermost.atlassian.net/browse/MM-21472)
- **v5.16.4, released 2019-12-18**
  - Mattermost v5.16.4 contains high level security fixes. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
- **v5.16.3, released 2019-11-06**
  - (Accessibility) Fixed an issue where keyboard navigation within the right-hand side did not navigate in expected order. [MM-19901](https://mattermost.atlassian.net/browse/MM-19901)
- **v5.16.2, released 2019-10-30**
  - Fixed an issue where Permission Schemes was not working properly on an E10 license. [MM-19556](https://mattermost.atlassian.net/browse/MM-19556)
  - Fixed an issue where switching to an unread channel sometimes got stuck at "Loading...". [MM-19091](https://mattermost.atlassian.net/browse/MM-19091)
- **v5.16.1, released 2019-10-24**
  - Mattermost v5.16.1 contains a high level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
  - (Accessibility) Fixed an issue where "Click here to jump to recent messages" was not accessible via keyboard. [MM-19498](https://mattermost.atlassian.net/browse/MM-19498)
  - (Accessibility) Fixed an issue where post options were skipped when tabbing through a post in search results. [MM-19497](https://mattermost.atlassian.net/browse/MM-19497)
  - (Accessibility) Fixed an issue where F6 did not allow navigating to the right-hand side when a thread wasn't open. [MM-18117](https://mattermost.atlassian.net/browse/MM-18117)
  - Fixed an issue where a change to the production Plugin Marketplace URL wasn't backported to v5.16.0. [MM-19516](https://mattermost.atlassian.net/browse/MM-19516)
- **v5.16.0, released 2019-10-16**
  - Original 5.16.0 release

Mattermost v5.16.0 contains a low level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

### Compatibility

#### Removed and Deprecated Features

 - Support for Internet Explorer (IE11) was removed. Learn more in our [forum post](https://forum.mattermost.org/t/mattermost-is-dropping-support-for-internet-explorer-ie11-in-v5-16/7575).
 
### Breaking Changes
 - The Mattermost Desktop v4.3.0 release includes a change to how desktop notifications are sent from non-secure URLs (http://). Organizations using non-secure Mattermost Servers (http://) will need to update to Mattermost Server versions 5.16.0+, 5.15.1, 5.14.4 or 5.9.5 (ESR) to continue receiving desktop notifications when using Mattermost Desktop v4.3.0 or later.
 - When enabling [Guest Accounts](https://docs.mattermost.com/deployment/guest-accounts.html), all users who have the ability to invite users will be able to invite guests by default.  System admins will need to remove this permission on each role via **System Console > Permissions Schemes**.  In Mattermost Server version 5.17, the System admin will be the only role to automatically get the invite guest permission, however the fix will not be applicable in 5.16 due to database migration processes.

### Highlights

#### Guest Accounts
 - Provides a controlled and secure method for users outside of an organization to collaborate with their organization without allowing the guest to access proprietary or confidential information.

#### Plugin Marketplace
 - The integrations marketplace is built into the product and gives system administrators the ability to discover and install Mattermost plugins that are compatible with the server version you are running.  

#### Improved user management 
 - System Administrators can view a user's team memberships and add a user to additional teams from the System Console without having to be a member of the team.

### Improvements

#### User Interface (UI)
 - Added support for showing TIF image thumbnail previews.
 - Added the ability to remove the custom branding image.
 - Added support for showing channel links as links in email notifications.
 - Added support for direct message permalinks.
 - Changed recent date separators to read Today/Yesterday.

#### Import/Export
 - Added support for including the Theme property on ``UserTeamMemberships`` in bulk exports.

#### Search
 - Added support for excluding results from search.
 
#### Notifications
 - Enabled account related emails when ``SendEmailNotifications`` is set to false.
 
#### Command Line Interface (CLI)
 - Added a ``integrity`` CLI command to verify database integrity.
 
#### Plugins
 - Added the ability for plugins to render custom embed views for posts.
 - Added support for including custom System Console components for plugins.
 - Added support for plugins to close the right-hand sidebar.
 
#### Integrations
 - Added support for introductory markdown paragraph in interactive dialogs.
 - Added a password type for interactive dialogs.
 - Added support for footer and footer_icon in attachments.
 - Added support for boolean elements in interactive dialogs.
 - Added support for a ``radio`` type in interactive dialogs.
 
#### Performance
 - Improved perceived performance of the emoji picker.
 - Improved post list performance by making thread comments be loaded only when needed.
 - Improved quick switcher experience to make the autocomplete feel more like a modal rather than a dropdown.

#### Administration
 - Added the ability for System Administrators to revoke all sessions from all users.
 - Added support for System Administrators to make public channels private and private channels public within the **System Console > User Management > Channel Configuration** page when [Experimental Groups feature](https://docs.mattermost.com/administration/config-settings.html#groups-experimental) is enabled.
 - Added user Id information in the **System Console > Users** page.
 - Updated System Console plugin settings page to expose enable/disable setting.
 - Added ability for System Administrators to view a user's team memberships and add users to additional teams within **System Console > User Management > User Configuration**.
 
### Bug Fixes
 - Fixed an issue where user count did not update if a user automatically joined a channel.
 - Fixed an issue where using the channel autocomplete while editing posts caused the current channel to be unread.
 - Fixed an issue where users were unable to type in any other channel after leaving a draft post in preview mode in one channel and then switching to another channel.
 - Fixed an issue where a user didn't see any unreads when rejoining a team if they were in a Direct Message channel when they left the last team.
 - Fixed an issue where some pre-packaged plugins showed as removable in the user interface.
 - Fixed an issue where clicking "Edit" of another sub-section in Account Settings appeared to save the setting that was currently being edited in an open sub-section in the same modal.
 - Fixed an issue where the System Console user menu did not show all inactive users.
 - Fixed an issue where a JS console error appeared when uploading an image from the right-hand side.
 - Fixed some bugs related to the new [keyboard accessibility](https://docs.mattermost.com/help/getting-started/accessibility.html) feature.
 - Fixed an issue where the ``/leave`` slash command was not working on direct message channels.
 - Fixed an issue where the quick channel switcher box opened behind the header attachment expansion.
 - Fixed an issue on mobile web view where emoji reaction modal was cut off when adding a second reaction via "+" icon.
 - Fixed an issue where the username was not shown in the left-hand side on mobile web view.
 - Fixed an issue where "Thumbs up" emoji did not get added to "Recently Used" section.
 - Fixed an issue where trailing white space was not ignored when saving a bot username.
 - Fixed an issue where enabling channel group constraints turned the admin site blank.
 - Fixed an issue where SQL connections closed prematurely for clusters.
 - Fixed an issue where absolute paths were not honoured in SAML certificates.

### config.json
Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json`, or the System Console when available.

#### Changes to Team Edition and Enterprise Edition:

 - Under ``PluginSettings``:
    - Added ``EnableMarketplace`` (default to true) and ``MarketplaceUrl`` (default to ``https://marketplace.integrations.mattermost.com``), to enable Plugin Marketplace feature.
 - Under ``GuestAccountsSettings``:
    - Added ``Enable``, ``AllowEmailAccounts``, ``EnforceMultifactorAuthentication``, and	``RestrictCreationToDomains``, to enable Guest Accounts feature.
 - Changed ``SqlSettings.DataSource``, ``ElasticsearchSettings.ConnectionUrl``, and ``EmailSettings.SMTPServer`` to default to using localhost (instead of dockerhost).
 - Changed ``NativeAppSettings.AppDownloadLink`` to default to ``https://mattermost.com/download/#mattermostApps`` (instead of ``https://mattermost.com/download/``).
 
### Open Source Components
 - Added ``react-native-android-open-settings`` in https://github.com/mattermost/mattermost-mobile.
 - Added ``react-native-haptic-feedback`` in https://github.com/mattermost/mattermost-mobile.
 - Added ``DefinitelyTyped`` in https://github.com/mattermost/mattermost-webapp.
 - Added ``node-semver`` in https://github.com/mattermost/mattermost-webapp.
 - Added ``regenerator`` in https://github.com/mattermost/mattermost-webapp.
 - Added ``typescript`` in https://github.com/mattermost/mattermost-webapp.
 
### API Changes
 - Added a new ``GET /plugins/marketplace`` API endpoint added to list marketplace plugins.
 - Added a new ``PUT /channels/:channel_id/privacy`` API endpoint to update the privacy of a channel.
 - Added a new ``POST /site_url/test to test`` API endpoint to test the configured site URL.
 - Added a new ``POST /teams/:team_id/invite-guests/email`` API endpoint to invite guest users by email.
 - Added new ``POST /users/:user_id/promote`` and ``POST /users/:user_id/demote`` API endpoints to promote and demote users to guest accounts.
 - Updated the ``PUT /channels/:channel_id/patch`` API endpoint to ensure that the requestor user has permission to see each channel member.
 - Updated the ``GET /channels/:channel_id/stats`` API endpoint to include the pinned post and guest counts.
 - ``PUT /roles/:role_id/patch`` API endpoint now ensures that guest account roles are not updatable without the required license and feature SKU.
 - Several OAuth API endpoints were removed.
 
### Database Changes
 - Added a change to the ``Tokens`` table ``Extra`` column's data type.
 
### Known Issues
 - Saving an empty string on Plugin Marketplace URL resets the URL instead of showing an error.
 - Switching to an unread channel sometimes gets stuck at "Loading...".
 - Attempting to configure uninstalled plugins get stuck at "Loading..." without timeout.
 - Enabling/disabling guest access in System Console fails.
 - Guest users are shown in the list when adding new members to a channel.
 - Negative search filter hypens and occasional random terms are highlighted in search results.
 - ``@all`` notification is still sent to all users when using TAB to press Cancel on the notification prompt.
 - System messages may trigger mentions for name collisions.
 - Hitting escape to close autocomplete also closes channel header modal.
 - Pressing and holding on teams and channels in the left-hand side opens the context menu on desktop apps.
 - Modifying config files causes compliance exports to run twice.
 - On a server using a subpath, the URL opens a blank page if the System Admin changes the Site URL in the System Console UI. To fix, the System Admin should restart the server.
 - Login does not work when Custom Terms of Service is enabled and MFA is enforced.
 - Google login fails on the Classic mobile apps.
 - Status may sometimes get stuck as away or offline in High Availability mode with IP Hash turned off.
 - Searching stop words in quotes with Elasticsearch enabled returns more than just the searched terms.
 - Searching with Elasticsearch enabled may not always highlight the searched terms.
 - Team sidebar on desktop app does not update when channels have been read on mobile.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.

### Contributors
[a-arias](https://github.com/a-arias), [aaronrothschild](https://github.com/aaronrothschild), [abdusabri](https://github.com/abdusabri), [adarj](https://github.com/adarj), [aeomin](https://translate.mattermost.com/user/aeomin/), [AGMETEOR](https://github.com/AGMETEOR), [agusl88](https://github.com/agusl88), [ali-farooq0](https://github.com/ali-farooq0), [amyblais](https://github.com/amyblais), [aneeeshp](https://github.com/aneeeshp), [ankitrgadiya](https://github.com/ankitrgadiya), [anuragbhd](https://github.com/anuragbhd), [arjitc](https://github.com/arjitc), [arshchimni](https://github.com/arshchimni), [asaadmahmood](https://github.com/asaadmahmood), [avasconcelos114](https://github.com/avasconcelos114), [bradjcoughlin](https://github.com/bradjcoughlin), [cardoso](https://github.com/cardoso), [carlosasj](https://github.com/carlosasj), [chikei](https://github.com/chikei), [chuttam](https://github.com/chuttam), [comharris](https://github.com/comharris), [cpanato](https://github.com/cpanato), [cpoile](https://github.com/cpoile), [crspeller](https://github.com/crspeller), [DarrellRichards](https://github.com/DarrellRichards), [deanwhillier](https://github.com/deanwhillier), [der-test](https://github.com/der-test), [devinbinnie](https://github.com/devinbinnie), [dhadiseputro](https://github.com/dhadiseputro), [DHaussermann](https://github.com/DHaussermann), [enahum](https://github.com/enahum), [esdrasbeleza](https://github.com/esdrasbeleza), [esethna](https://github.com/esethna), [freerider7777](https://github.com/freerider7777), [gabrieljackson](https://github.com/gabrieljackson), [gigawhitlocks](https://github.com/gigawhitlocks), [gruceqq](https://translate.mattermost.com/user/gruceqq/), [grundleborg](https://github.com/grundleborg), [hanzei](https://github.com/hanzei), [hector2](https://github.com/hector2), [hectorskypl](https://github.com/hectorskypl), [hmhealey](https://github.com/hmhealey), [hvhallmann](https://github.com/hvhallmann), [imisshtml](https://github.com/imisshtml), [iomodo](https://github.com/iomodo), [it33](https://github.com/it33), [janvt](https://github.com/janvt), [jasonblais](https://github.com/jasonblais), [jespino](https://github.com/jespino), [jfrerich](https://github.com/jfrerich), [jkl5616](https://github.com/jkl5616), [justinegeffen](https://github.com/justinegeffen), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [Kaya_Zeren](https://twitter.com/kaya_zeren), [Lena](https://translate.mattermost.com/user/Lena/), [levb](https://github.com/levb), [lfbrock](https://github.com/lfbrock), [lieut-data](https://github.com/lieut-data), [lindalumitchell](https://github.com/lindalumitchell), [lindy65](https://github.com/lindy65), [liusy182](https://github.com/liusy182), [Lumexralph](https://github.com/Lumexralph), [lurcio](https://github.com/lurcio), [manland](https://github.com/manland), [marianunez](https://github.com/marianunez), [MatthewDorner](https://github.com/MatthewDorner), [mcrwfrd](https://github.com/mcrwfrd), [meilon](https://github.com/meilon), [metanerd](https://github.com/metanerd), [mgdelacroix](https://github.com/mgdelacroix), [mickmister](https://github.com/mickmister), [migbot](https://github.com/migbot), [mjthomp95](https://github.com/mjthomp95), [mkraft](https://github.com/mkraft), [mlongo4290](https://github.com/mlongo4290), [nfriend](https://github.com/nfriend), [niklabh](https://github.com/niklabh), [OCram85](https://github.com/OCram85), [paddatrapper](https://github.com/paddatrapper), [patrickkang](https://github.com/patrickkang), [pbitty](https://github.com/pbitty), [phillipahereza](https://github.com/phillipahereza), [QamarFarooq](https://github.com/QamarFarooq), [RajatVaryani](https://github.com/RajatVaryani), [reflog](https://github.com/reflog), [renilJoseph](https://github.com/renilJoseph), [rodcorsi](https://github.com/rodcorsi), [rohanjulka19](https://github.com/rohanjulka19), [rvillablanca](https://github.com/rvillablanca), [saturninoabril](https://github.com/saturninoabril), [sbishel](https://github.com/sbishel), [scottleedavis](https://github.com/scottleedavis), [Selimix](https://github.com/Selimix), [sij507](https://github.com/sij507), [sowmiyamuthuraman](https://github.com/sowmiyamuthuraman), [srkgupta](https://github.com/srkgupta), [stoerchl](https://github.com/stoerchl), [streamer45](https://github.com/streamer45), [stylianosrigas](https://github.com/stylianosrigas), [sudheerDev](https://github.com/sudheerDev), [tejashreecd](https://github.com/tejashreecd), [tekminewe](https://github.com/tekminewe), [tgkouras](https://github.com/tgkouras), [thekiiingbob](https://github.com/thekiiingbob), [thePanz](https://github.com/thePanz), [threepwood-mm](https://github.com/threepwood-mm), [tnir](https://github.com/tnir), [ulhosting](https://github.com/uhlhosting), [valentijnnieman](https://github.com/valentijnnieman), [wget](https://github.com/wget), [wiersgallak](https://github.com/wiersgallak), [Willyfrog](https://github.com/Willyfrog), [yuya-oc](https://github.com/yuya-oc)

## Release v5.15 - [Quality Release](https://docs.mattermost.com/process/release-faq.html#release-overview)

- **v5.15.5, released 2020-01-08**
  - Fixed an issue where migrating accounts from email to SAML failed. [MM-21472](https://mattermost.atlassian.net/browse/MM-21472)
- **v5.15.4, released 2019-12-18**
  - Mattermost v5.15.4 contains high level security fixes. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
- **v5.15.3, released 2019-11-06**
  - (Accessibility) Fixed an issue where keyboard navigation within the right-hand side did not navigate in expected order. [MM-19901](https://mattermost.atlassian.net/browse/MM-19901)
  - Fixed an issue where switching to an unread channel sometimes got stuck at "Loading...". [MM-19091](https://mattermost.atlassian.net/browse/MM-19091)
- **v5.15.2, released 2019-10-24**
  - Mattermost v5.15.2 contains a high level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
  - (Accessibility) Fixed an issue where "Click here to jump to recent messages" was not accessible via keyboard. [MM-19498](https://mattermost.atlassian.net/browse/MM-19498)
  - (Accessibility) Fixed an issue where post options were skipped when tabbing through a post in search results. [MM-19497](https://mattermost.atlassian.net/browse/MM-19497)
  - (Accessibility) Fixed an issue where F6 did not allow navigating to the right-hand side when a thread wasn't open. [MM-18117](https://mattermost.atlassian.net/browse/MM-18117)
- **v5.15.1, released 2019-10-11**
  - Fixed an issue that will be introduced with a change in upcoming server v5.16 and desktop app v4.3 releases where desktop notifications will be broken as the desktop app will no longer be able to directly interact with the web app. [MM-18819](https://mattermost.atlassian.net/browse/MM-18819)
  - Fixed an issue where server-side telemetry was not reporting back after 5.14 release. [MM-18115](https://mattermost.atlassian.net/browse/MM-18115)
- **v5.15.0, released 2019-09-16**
  - Original 5.15.0 release

Mattermost v5.15.0 contains low level security fixes. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

### Bug Fixes
 - Fixed an issue where an invalid locale caused a white screen.
 - Fixed an issue where rate limited posts failed to load threads.
 - Improved the group linking failure error message and logging to make it clear that the group id attribute is most likely misconfigured.
 - Fixed an issue where the right-hand side did not fetch messages on socket reconnect when a different channel was in center.
 - Fixed an issue where posting a message in an empty channel sometimes caused the channel to display a loading spinner.
 - Fixed an issue where deleting the last post in a channel caused the channel to only display a loading spinner.
 - Fixed an issue with an absence of unread badges on private channels on mobile apps.
 - Fixed an issue where at-sign was missing in front of usernames in push notifications.
 - Fixed some bugs related to the new [keyboard accessibility](https://docs.mattermost.com/help/getting-started/accessibility.html) feature.
 - Fixed an issue where the "@" sign was replaced with keyboard accessibility feature on Italian keyboard.
 - Fixed an issue where joining a new channel with few posts sometimes did not take the user to the bottom of the channel.
 - Fixed an issue where scroll pop sometimes occured with embedded Youtube links.
 - Fixed an issue with stuttery dropdowns in Safari.
 - Fixed an issue where clicking on a post would highlight it after returning to the tab/window.
 - Fixed an issue where SVG attachments bled over into subsequent posts.
 - Fixed an issue where long posts were overlapping in compact view.
 - Fixed an issue where the expand/collapse button in images were underlined.
 - Fixed an issue where incoming webhook URL was clickable and shown as a link on the desktop app.
 - Fixed an issue where the markdown helper text was missing on Edit Channel Header modal.
 - Fixed an issue on mobile view where Edit/Delete/More options were not displayed on the right-hand side after a message was posted.
 - Fixed an issue where the channel mute icon was displayed in the incorrect position when a channel was muted.
 - Fixed an issue where there was an extra menu divider on Town Square channel menu.
 - Fixed an issue on Firefox where post and comment boxes were expanding too early.
 - Fixed an issue where focus was not automatically set on text input box after selecting an emoji from the emoji picker.
 - Fixed an issue where channel changes were not updated for other users until refresh.
 - Fixed an issue where changes to Account Settings were being saved even when the user did not click the **Save** button.
 - Fixed an issue where some of the links in System Console opened the page on the same tab instead of opening it on a new browser/tab.
 - Fixed an issue where installing a plugin via URL failed if the download took longer then 30 seconds.
 - Fixed an issue where plugins did not get disabled when removing them.
 - Fixed an issue where plugin translation files were not updated on web-clients when plugins were upgraded.
 - Fixed an issue where bots could not be added to any team if server wide email domain restriction was enabled.
 - Fixed an issue where pagination broke when adding users to a team.
 - Fixed an issue where list of users were not paginated on warning modal for LDAP group sync team / channel removal.
 - Fixed an issue where enabling LDAP Trace prevented login.
 - Fixed an issue where Google User API Endpoint showed an outdated helper text.
 - Fixed an issue where a markdown image with an SVG briefly displayed for sender with ``EnableSVGs`` set to false.
 - Fixed an issue with an incorrect error message on Custom URL Schemes field.

### Known Issues
 - JS console error may appear when uploading an image from the right-hand side.
 - Scroll pop may occur in channels with markdown images.
 - Trailing white space is not ignored when saving bot user name.
 - Clicking "Edit" of another sub-section in Account Settings appears to save the setting that is currently being edited in an open sub-section in the same modal.
 - Some pre-packaged plugins show as removable in the User Interface.
 - If ``ExperimentalStrictCSRFEnforcement`` is set to True, attempts to use ``/jira subscribe`` fail.
 - Users are unable to type in any other channel after leaving a draft post in preview mode in one channel and then switching to another channel.
 - User count in a channel does not update until after refresh if a user automatically joins a channel.
 - Scrolling upwards while loading more posts sometimes causes you to jump upwards on Firefox.
 - Modifying config files causes compliance exports to run twice.
 - Using channel autocomplete while editing post causes current channel to be unread.
 - On a server using a subpath, the URL opens a blank page if the System Admin changes the Site URL in the System Console UI. To fix, the System Admin should restart the server.
 - Login does not work when Custom Terms of Service is enabled and MFA is enforced.
 - Google login fails on the Classic mobile apps.
 - Status may sometimes get stuck as away or offline in High Availability mode with IP Hash turned off.
 - Searching stop words in quotes with Elasticsearch enabled returns more than just the searched terms.
 - Searching with Elasticsearch enabled may not always highlight the searched terms.
 - Team sidebar on desktop app does not update when channels have been read on mobile.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.
 
### Contributors

 - [a-arias](https://github.com/a-arias), [aaronrothschild](https://github.com/aaronrothschild), [accxiagmbh](https://github.com/accxiagmbh), [aeomin](https://translate.mattermost.com/user/aeomin/), [Akito13](https://github.com/Akito13), [ali-farooq0](https://github.com/ali-farooq0), [Amonith](https://github.com/Amonith), [amyblais](https://github.com/amyblais), [angelbarrera92](https://github.com/angelbarrera92), [ankitrgadiya](https://github.com/ankitrgadiya), [asaadmahmood](https://github.com/asaadmahmood), [atpons](https://github.com/atpons), [bradjcoughlin](https://github.com/bradjcoughlin), [cardoso](https://github.com/cardoso), [cdncat](https://github.com/cdncat), [chikei](https://github.com/chikei), [comharris](https://github.com/comharris), [cpanato](https://github.com/cpanato), [cpoile](https://github.com/cpoile), [crspeller](https://github.com/crspeller), [deanwhillier](https://github.com/deanwhillier), [der-test](https://github.com/der-test), [devinbinnie](https://github.com/devinbinnie), [DHaussermann](https://github.com/DHaussermann), [DSchalla](https://github.com/DSchalla), [eilgin](https://github.com/eilgin), [ejachang](https://github.com/ejachang), [elyscape](https://github.com/elyscape), [enahum](https://github.com/enahum), [esethna](https://github.com/esethna), [eshyong](https://github.com/eshyong), [ethervoid](https://github.com/ethervoid), [g3rv4](https://github.com/g3rv4), [gabrieljackson](https://github.com/gabrieljackson), [gigawhitlocks](https://github.com/gigawhitlocks), [goku321](https://github.com/goku321), [gruceqq](https://translate.mattermost.com/user/gruceqq/), [grundleborg](https://github.com/grundleborg), [hahmadia](https://github.com/hahmadia), [hanzei](https://github.com/hanzei), [healthchecks](https://github.com/healthchecks), [hectorskypl](https://github.com/hectorskypl), [hmhealey](https://github.com/hmhealey), [iomodo](https://github.com/iomodo), [irbrad](https://github.com/irbrad), [it33](https://github.com/it33), [ivenk](https://github.com/ivenk), [janvt](https://github.com/janvt), [jasonblais](https://github.com/jasonblais), [jesperhansen17](https://github.com/jesperhansen17), [jespino](https://github.com/jespino), [jfrerich](https://github.com/jfrerich), [jozuenoon](https://github.com/jozuenoon), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [Kaya_Zeren](https://twitter.com/kaya_zeren), [kdenz](https://github.com/kdenz), [kosgrz](https://github.com/kosgrz), [krjn](https://github.com/krjn), [Lena](https://translate.mattermost.com/user/Lena/), [levb](https://github.com/levb), [lfbrock](https://github.com/lfbrock), [lieut-data](https://github.com/lieut-data), [lindalumitchell](https://github.com/lindalumitchell), [Lisenish](https://github.com/Lisenish), [liusy182](https://github.com/liusy182), [lurcio](https://github.com/lurcio), [manland](https://github.com/manland), [marianunez](https://github.com/marianunez), [MatthewDorner](https://github.com/MatthewDorner), [matthewshirley](https://github.com/matthewshirley), [meilon](https://github.com/meilon), [metanerd](https://github.com/metanerd), [mgdelacroix](https://github.com/mgdelacroix), [michaelgamble](https://github.com/michaelgamble), [mickmister](https://github.com/mickmister), [migbot](https://github.com/migbot), [mjthomp95](https://github.com/mjthomp95), [mkraft](https://github.com/mkraft), [mlongo4290](https://github.com/mlongo4290), [pichouk](https://github.com/pichouk), [Rajakavitha1](https://github.com/Rajakavitha1), [reflog](https://github.com/reflog), [rodcorsi](https://github.com/rodcorsi), [Roy-Orbison](https://github.com/Roy-Orbison), [sadohert](https://github.com/sadohert), [saturninoabril](https://github.com/saturninoabril), [scottleedavis](https://github.com/scottleedavis), [sij507](https://github.com/sij507), [streamer45](https://github.com/streamer45), [stylianosrigas](https://github.com/stylianosrigas), [sudheerDev](https://github.com/sudheerDev), [thekiiingbob](https://github.com/thekiiingbob), [thePanz](https://github.com/thePanz), [threepwood-mm](https://github.com/threepwood-mm), [tnir](https://github.com/tnir), [ulhosting](https://github.com/uhlhosting), [uusijani](https://github.com/uusijani), [wget](https://github.com/wget), [wiersgallak](https://github.com/wiersgallak), [Willyfrog](https://github.com/Willyfrog), [wyze](https://github.com/wyze)

## Release v5.14 - [Feature Release](https://docs.mattermost.com/process/release-faq.html#release-overview)

- **v5.14.5, released 2019-10-24**
  - Mattermost v5.14.5 contains a high level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
- **v5.14.4, released 2019-10-11**
  - Fixed an issue that will be introduced with a change in upcoming server v5.16 and desktop app v4.3 releases where desktop notifications will be broken as the desktop app will no longer be able to directly interact with the web app. [MM-18819](https://mattermost.atlassian.net/browse/MM-18819)
  - Fixed an issue where server-side telemetry was not reporting back after 5.14 release. [MM-18115](https://mattermost.atlassian.net/browse/MM-18115)
- **v5.14.3, released 2019-09-16**
  - Fixed an issue where edited posts were not included in Compliance Export (Beta). [MM-18522](https://mattermost.atlassian.net/browse/MM-18522)
- **v5.14.2, released 2019-08-30**
  - Fixed an issue where Mattermost crashed when date-related search terms `on:` `before:` and `after:` were used in search. [MM-18143](https://mattermost.atlassian.net/browse/MM-18143)
- **v5.14.1, released 2019-08-28**
  - Fixed issues with [keyboard accessibility](https://docs.mattermost.com/help/getting-started/accessibility.html) where post and search textboxes did not read characters when using the arrow keys to move back and forth through the text. [MM-17964](https://mattermost.atlassian.net/browse/MM-17964) and [MM-17974](https://mattermost.atlassian.net/browse/MM-17974)
- **v5.14.0, released 2019-08-16**
  - Original 5.14.0 release

Mattermost v5.14.0 contains a medium level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

### Compatibility

#### Removed and Deprecated Features

 - We are removing support for Internet Explorer (IE11) in Mattermost v5.16.0, which releases on October 16, 2019. Learn more in our [forum post](https://forum.mattermost.org/t/mattermost-is-dropping-support-for-internet-explorer-ie11-in-v5-16/7575).
 
### Breaking Changes

 - Webhooks are now only displayed if the user is the creator of the webhook or a system administrator.
 - With the update from Google+ to Google People, system admins need to ensure the ``GoogleSettings.Scope`` config.json setting is set to ``profile email`` and ``UserAPIEndpoint`` setting should be set to ``https://people.googleapis.com/v1/people/me?personFields=names,emailAddresses,nicknames,metadata`` per [updated documentation](https://docs.mattermost.com/deployment/sso-google.html).

**IMPORTANT:** If you upgrade from a release earlier than 5.13, please read the other [Important Upgrade Notes](https://docs.mattermost.com/administration/important-upgrade-notes.html).

### Highlights

#### Keyboard navigation and screen reader improvements

 - New keyboard navigation improvements enable you to move between app regions—like the post list, channel sidebar, and header—using F6 on the Desktop App and CTRL-F6 on a web browser. You can also use TAB, arrow keys, and ENTER to interact with buttons, links, and other elements in Mattermost.
 - Screen readers are now much more compatible with Mattermost. Buttons, links, and app regions now have accurate readouts that enable visually impaired users to use Mattermost productively with screen readers.
 - [Learn more](https://docs.mattermost.com/help/getting-started/accessibility.html)

#### Bidirectional scrolling to land on oldest unread post
 - No more scrolling required to get to the oldest unread post. Now when the channel opens when there are unreads it opens at the new messages line, regardless of how many unreads exist since the last time the user viewed the channel.

#### Jira V2.1
 - Full list of features in v2.1: https://github.com/mattermost/mattermost-plugin-jira#jira-21-features.

#### System Console tools to manage LDAP Groups within Teams and Channels (EE)
 - New Team and Channel pages in the System Console allow administrators to easily manage teams and channels membership with LDAP Group Synchronization instead of using the CLI group commands released in v5.12.
 
#### Pre-packaged Plugins
 - [Jenkins plugin](https://github.com/mattermost/mattermost-plugin-jenkins) for interacting with jobs and builds via slash commands in Mattermost.
 - [Antivirus plugin](https://github.com/mattermost/mattermost-plugin-antivirus) for scanning files uploaded to Mattermost.
 - [GitLab plugin](https://github.com/mattermost/mattermost-plugin-gitlab) for getting notifications in Mattermost about mentions, review requests and comments.

### Improvements

#### User Interface (UI)
 - Added support for allowing ``+`` and ``.`` in **System Console > Customization > Posts > Custom URL Schemes**.
 - Added support for Range on files needed by Safari to view videos.
 - Added ability to add info cards to the right-hand side section.
 - Added support for rendering emojis in Message Attachment field titles.
 - Changed "About" section references to use the site name when it is configured in **System Console > Custom Branding > Site Name**.
 - Combined "Send messages on CTRL+ENTER" with code block setting.
 - Added ability to upload files on paste when file constructor is not supported (ie. in Edge or IE11).
 
#### Import/Export
 - Added the ability to import Slack corporate export files with direct messages, group messages and private channels.
 - Added support for exporting Global Relay to zip file.

#### Webhooks
- ``EnableWebhookDebugging`` now logs the request id for additional context when debugging.
 - Added support for plugins to dismiss posts through the ``MessageWillBePosted`` hook. Dismissed posts no longer show up as a client-side error.
 - Added an optional "icon_emoji" field to incoming webhooks to use an emoji in place of the display picture when the webhook posts into Mattermost.
 
#### Integrations
 - Added support for interactive dialogs without elements, e.g. for confirmation dialogs.
 - Added support for relative links in interactive message buttons, simplifying plugin development.
 
#### Plugins
 - Added support for plugins to override right-hand sidebar.
 - Added support for plugins to trigger interactive dialogs programmatically, instead of only after a user action.
 
#### Bot Accounts
 - Added an identifier for compliance exports when a message is posted by a bot account.
 - Created a dedicated System Console page at /admin_console/integrations/bot_accounts to organize bot configuration options.
 
#### Command Line Interface (CLI)
 - Added support for converting bot accounts to user accounts with email/password login through the CLI.
 - Extended the config migrate command to handle SAML keys and certificates.
 - Updated CLI channel list and search commands to show if a channel is private.
 - Create CLI command "team modify" to modify team's privacy setting.
 
#### Administration
 - Office365 SSO was promoted out of beta.
 - Removed maximum length from ``LinkMetadata`` value so that links can generate OpenGraph previews and be stored in the database.
 - The config.json file is now generated with build time using defaults in code and not in ``default.json``.
 - Added new settings to have more control over ``BindAddress`` and ``AdvertiseAddress`` in the cluster server to allow users to configure properly in situations where the servers are communicating through another server using NAT.
 - implemented enhanced logging for CSRF warnings by adding the following information to each request: Remote Adddress, Path, User ID, Session ID.
 
#### Enterprise Edition (EE)
 - Added support for signing SAML requests, as required for Infosec approval.
 - Added support for configuring the interface used for cluster peer discovery in High Availability clusters.

### Bug Fixes
 - Fixed an issue where pagination of group members was broken in LDAP Groups.
 - Fixed an issue where the options to leave a team was disabled for all teams and not just the primary team when a primary team was set.
 - Fixed an issue where bulk import got stuck when importing lines were missing the "type" entry.
 - Fixed an issue where titles for webhooks, commands and OAuth apps were no longer bolded in the System Console.
 - Fixed an issue where disabling email notifications also disabled email invites.
 - Fixed an issue where Admins were shown a warning of a user's bot being deactivated even if they already were.
 - Fixed an issue where a bot profile image disappeared when saving bot details.
 - Fixed an issue where plus-sign was not visible on mobile browser view for reacting with a new emoji next to existing reactions.
 - Fixed an issue in the System Console where the UserID in User Activity Logs changed from email to UserID.
 - Fixed an issue where user got a notification to add a bot to a channel when mentioning it.
 - Fixed an issue where permanenently deleting a bot user didn't remove it from the bots table.
 - Fixed an issue where a scroll pop was caused by large image dimensions in markdown.

### config.json

Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json`, or the System Console when available.

#### Changes to Team Edition and Enterprise Edition:

 - Under ``ClusterSettings`` in ``config.json``:
    - Added ``NetworkInterface`` to allow configuring devices to detect the IP in High Availability clusters.
    - Added ``BindAddress`` and ``AdvertiseAddress`` to add more control over bind and advertising address in a cluster server.
 - Under ``ComplianceSettings`` in ``config.json``:
    - Added ``SignRequest`` to add support for signing SAML requests.
 - Under ``PluginSettings`` in ``config.json``:
    - Added ``AllowInsecureDownloadUrl`` to allow servers to download and install a plugin from a remote url via the System Console.

### Open Source Components

 - Added ``core-js`` in https://github.com/mattermost/mattermost-mobile/.
 - Added ``deepmerge`` in https://github.com/mattermost/mattermost-mobile/.
 - Removed ``react-native-bottom-sheet`` from https://github.com/mattermost/mattermost-mobile/.
 - Added ``react-hot-loader`` in https://github.com/mattermost/mattermost-webapp.
 - Removed ``@babel/polyfill`` from https://github.com/mattermost/mattermost-webapp.
 - Removed ``redux-persist-transform-filter`` from https://github.com/mattermost/mattermost-webapp.
 - Removed ``url-search-params-polyfill`` from https://github.com/mattermost/mattermost-webapp.
 - Removed ``whatwg-fetch`` from https://github.com/mattermost/mattermost-webapp.

### API Changes
 - Migrated user API endpoint from Google+ API to People API.
 - Added ``api/v4/channels/group/search`` API endpoint to return the group channels whose members' usernames match the search term.
 - Added ``/api/v4/channels/:channel_id/members_minus_group_members`` API endpoint to determine users who will be removed from a group-synchronized channel.
 - Added ``api/v4/posts/unread`` API endpoint to support landing on the last unread post.
 - Added ``api/v4/teams/:team_id/members_minux_group_members`` API endpoint to determine users who will be removed from a group-synchronized team.
 - Added ``api/v4/users/group_channels`` API endpoint to get an object containing a key per group channel id in the query and its value as a list of users members of that group channel.
 - Added ``api/v4/sessions/revoke/all`` API endpoint to add the ability to revoke sessions from all users.

#### Plugin API
 - Added ``GetBotIconImage``, ``SetBotIconImage`` and ``DeleteBotIconImage`` API endpoints to control bot icon images.
 - Added ``api/v4/plugins/install_from_url`` API endpoint to allow server to download and install a plugin from a remote url.

### Known Issues
 - Users are unable to type in any other channel after leaving a draft post in preview mode in one channel and then switching to another channel.
 - Google User API Endpoint shows outdated helper text.
 - Making a post in an empty channel sometimes causes the channel to display a loading spinner.
 - Deleting the last post in a channel causes the channel to only display a loading spinner.
 - Markdown helper text is missing on Edit Channel Header modal.
 - User count in a channel does not update until after refresh if a user automatically joins a channel.
 - Long posts might overlap in compact view.
 - Joining a new channel with few posts might not take the user to the bottom of the channel.
 - Missing messages can be caused if network fails on API calls.
 - Search help text popover may not display on narrow screen view.
 - Expand/collapse in image icons are underlined.
 - Messages may not load when opening a channel with multiple unread messages.
 - Scrolling upwards while loading more posts sometimes causes you to jump upwards on Firefox.
 - Post and comment boxes are expanding too early on Firefox.
 - Modifying config files causes compliance exports to run twice.
 - Using channel autocomplete while editing post causes current channel to be unread.
 - Scroll pop may occur with embedded Youtube links.
 - Clicking on a post will highlight it after returning to the tab/window.
 - Plugin translation files are not updated on web-client when plugins are upgraded.
 - Changes to Account Settings are being saved even when user does not clicks on Save button.
 - SVG attachments bleed over into subsequent posts.
 - Custom-Attributes plugin might crash.
 - Pagination breaks when adding users to a team.
 - On a server using a subpath, the URL opens a blank page if the System Admin changes the Site URL in the System Console UI. To fix, the System Admin should restart the server.
 - Login does not work when Custom Terms of Service is enabled and MFA is enforced.
 - Google login fails on the Classic mobile apps.
 - Status may sometimes get stuck as away or offline in High Availability mode with IP Hash turned off.
 - Searching stop words in quotes with Elasticsearch enabled returns more than just the searched terms.
 - Searching with Elasticsearch enabled may not always highlight the searched terms.
 - Team sidebar on desktop app does not update when channels have been read on mobile.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.

### Contributors

 - [a-arias](https://github.com/a-arias), [aaronrothschild](https://github.com/aaronrothschild), [aayushbisen](https://github.com/aayushbisen), [adzimzf](https://github.com/adzimzf), [aeomin](https://translate.mattermost.com/user/aeomin/), [AGMETEOR](https://github.com/AGMETEOR), [alejandrosame](https://github.com/alejandrosame), [ali-farooq0](https://github.com/ali-farooq0), [alxsah](https://github.com/alxsah), [amyblais](https://github.com/amyblais), [asaadmahmood](https://github.com/asaadmahmood), [bbodenmiller](https://github.com/bbodenmiller), [bnoggle](https://github.com/bnoggle), [bradjcoughlin](https://github.com/bradjcoughlin), [chikei](https://github.com/chikei), [comharris](https://github.com/comharris), [cpanato](https://github.com/cpanato), [cpoile](https://github.com/cpoile), [crspeller](https://github.com/crspeller), [deanwhillier](https://github.com/deanwhillier), [der-test](https://github.com/der-test), [devinbinnie](https://github.com/devinbinnie), [DSchalla](https://github.com/DSchalla), [elyscape](https://github.com/elyscape), [enahum](https://github.com/enahum), [esethna](https://github.com/esethna), [eshyong](https://github.com/eshyong), [gabrieljackson](https://github.com/gabrieljackson), [gruceqq](https://translate.mattermost.com/user/gruceqq/), [grundleborg](https://github.com/grundleborg), [gupsho](https://github.com/gupsho), [hanzei](https://github.com/hanzei), [hectorskypl](https://github.com/hectorskypl), [hmhealey](https://github.com/hmhealey), [hvhallmann](https://github.com/hvhallmann), [Hyaxia](https://github.com/Hyaxia), [Inconnu08](https://github.com/Inconnu08), [irbrad](https://github.com/irbrad), [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais), [jesperhansen17](https://github.com/jesperhansen17), [jespino](https://github.com/jespino), [jfrerich](https://github.com/jfrerich), [johnthompson365](https://github.com/johnthompson365), [Jonany](https://github.com/Jonany), [joshuabezaleel](https://github.com/joshuabezaleel), [justinegeffen](https://github.com/justinegeffen), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [Kaya_Zeren](https://twitter.com/kaya_zeren), [keaton185](https://github.com/keaton185), [kosgrz](https://github.com/kosgrz), [krjn](https://github.com/krjn), [Lena](https://translate.mattermost.com/user/Lena/), [levb](https://github.com/levb), [lfbrock](https://github.com/lfbrock), [lieut-data](https://github.com/lieut-data), [lindalumitchell](https://github.com/lindalumitchell), [lpadgett](https://github.com/lpadgett), [lurcio](https://github.com/lurcio), [manland](https://github.com/manland), [marianunez](https://github.com/marianunez), [meilon](https://github.com/meilon), [mgdelacroix](https://github.com/mgdelacroix), [mickmister](https://github.com/mickmister), [migbot](https://github.com/migbot), [mjthomp95](https://github.com/mjthomp95), [mkraft](https://github.com/mkraft), [mlongo4290](https://github.com/mlongo4290), [mounicapaladugu](https://github.com/mounicapaladugu), [mzaks](https://github.com/mzaks), [noxer](https://github.com/noxer), [ollykel](https://github.com/ollykel), [PeterDaveHello](https://github.com/PeterDaveHello), [phillipahereza](https://github.com/phillipahereza), [piperRyan](https://github.com/piperRyan), [Rajakavitha1](https://github.com/Rajakavitha1), [RajatVaryani](https://github.com/RajatVaryani), [rajiv-k](https://github.com/rajiv-k), [reflog](https://github.com/reflog), [rexredinger](https://github.com/rexredinger), [rodcorsi](https://github.com/rodcorsi), [rvillablanca](https://github.com/rvillablanca), [saturninoabril](https://github.com/saturninoabril), [scottleedavis](https://github.com/scottleedavis), [Selimix](https://github.com/Selimix), [SezalAgrawal](https://github.com/SezalAgrawal), [srkgupta](https://github.com/srkgupta), [steevsachs](https://github.com/steevsachs), [streamer45](https://github.com/streamer45), [stylianosrigas](https://github.com/stylianosrigas), [sudheerDev](https://github.com/sudheerDev), [svelle](https://github.com/svelle), [tapaswenipathak](https://github.com/tapaswenipathak), [tekminewe](https://github.com/tekminewe), [thekiiingbob](https://github.com/thekiiingbob), [thePanz](https://github.com/thePanz), [ulhosting](https://github.com/uhlhosting), [VolatianaYuliana](https://github.com/VolatianaYuliana), [wget](https://github.com/wget), [wiersgallak](https://github.com/wiersgallak), [Willyfrog](https://github.com/Willyfrog)

## Release v5.13 - [Quality Release](https://docs.mattermost.com/process/release-faq.html#release-overview)

Mattermost v5.13.0 contains low level security fixes. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

- **v5.13.3, released 2019-08-22**
  - Mattermost v5.13.3 contains a medium level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
- **v5.13.2, released 2019-07-24**
  - Fixed performance issues in channels with large message history due to a change made to posts query. [MM-16936](https://mattermost.atlassian.net/browse/MM-16936)
  - Fixed an issue where some settings were not visible in the System Console. [MM-17114](https://mattermost.atlassian.net/browse/MM-17114)
  - Fixed an issue where announcement banner overlapped content. [MM-17115](https://mattermost.atlassian.net/browse/MM-17115)
  - Fixed an issue where the scroll position was not at the new message indicator on switching channels when there were 30-60 unread messages. [MM-17078](https://mattermost.atlassian.net/browse/MM-17078)
- **v5.13.1, released 2019-07-19**
  - Fixed an issue with Jira plugin where creating or attaching to Jira issues failed due to GDPR changes released by Atlassian. Affected Jira Cloud only, not Jira Server or Jira Data Center. [MM-17060](https://mattermost.atlassian.net/browse/MM-17060)
  - Fixed an issue in server logs where messages related to OpenGraph API were unnecessarily reported as errors. [MM-17043](https://mattermost.atlassian.net/browse/MM-17043)
  - Fixed an issue in the System Console without an Enterprise Edition license where **Push Notification Contents** setting was not available. [MM-17008](https://mattermost.atlassian.net/browse/MM-17008)
- **v5.13.0, released 2019-07-16**
  - Original 5.13.0 release

### Compatibility

#### Removed and Deprecated Features

 - We are removing support for Internet Explorer (IE11) in Mattermost v5.16.0, which releases on October 16, 2019. Learn more in our [forum post](https://forum.mattermost.org/t/mattermost-is-dropping-support-for-internet-explorer-ie11-in-v5-16/7575).
 - v4.10.0 as our current Extended Support Release (ESR) is coming to the end of its lifecycle. We will be implementing version v5.9.0 as a new ESR starting July 16, 2019. Learn more in our [forum post](https://forum.mattermost.org/t/extended-support-release-update/7099).

### Bug Fixes
 - Fixed an issue where changing the timezone setting to "Set automatically" did not work on the mobile app.
 - Fixed an issue where the channel introduction content sometimes disappeared on opening a channel.
 - Fixed an issue with missing messages.
 - Fixed an issue where disabling Join/Leave Messages and switching to a specific channel caused a white screen.
 - Fixed an issue where the SMTP server password was no longer concealed in the System Console.
 - Fixed an issue where Notifications and Plugins settings were missing in the System Console for restricted system administrators.
 - Fixed an issue where "Enable AD/LDAP Group Sync" was visible in experimental System Console settings section in Team Edition servers.
 - Fixed an issue where **System Console > SMTP > Connection Security** setting was missing in Team Edition servers.
 - Fixed an issue where "Allow Mobile upload/download Files" options in the System Console where not hidden in Team Edition servers.
 - Fixed an issue where channel links did not work inside brackets.
 - Fixed an issue where uploading a team icon image fired a JS console error and a blank image preview.
 - Fixed an issue on Safari where a user jumped to the top of the Direct Messages selection list every few seconds.
 - Fixed an issue where "Error populating syncables" was seen on login when LDAP groups tried to add a user to a team that was at its maximum number of users.
 - Fixed an issue where the slash command ``/rename`` was restricted to 22-character maximum channel name length.
 - Fixed an issue where Manage Members menu was visible even if a user did not have Manage Member permissions when viewing the Main Menu.
 - Fixed an issue where the "Set a Header" button in the channel introduction was not clickable.
 - Fixed an issue where Group Message and private channel icons in the sidebar were misaligned.
 - Fixed an issue where custom emojis sometimes overlapped in messages.
 - Fixed an issue where bot tags were misaligned in search results and in the "in:" modifier in the search bar autocomplete.
 - Fixed an issue where the post menu divider had a gap in mobile view.
 - Fixed an issue where the bottom of right-hand side was cut off in tablet view.
 - Fixed an issue where the channel dropdown menu user interface was broken in mobile view when Zoom plugin was enabled.
 - Fixed an issue where the Save button was hidden in the System Console when a banner was displayed at the top of the page.
 - Fixed an issue where users were not able to search for split parts of first/last names or for split characters such as ``_`` with elasticsearch autocomplete enabled.
 - Fixed an issue where OAuth endpoints returned application/json content type for HTML redirects.
 - Fixed an issue where json responses were not returned for errors on oauth API endpoints, and a 500 error was returned instead of 4xx errors.
 
### config.json

Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json`, or the System Console when available.

#### Changes to Team Edition and Enterprise Edition:

 - Under ``ElasticsearchSettings`` in ``config.json``:
    - Added ``SkipTLSVerification`` to ignore certificate verification for Elasticsearch.
 
#### Open Source Components

 - Added ``moment-timezone`` in https://github.com/mattermost/mattermost-redux/.

#### Database Changes

 - ``plugins`` type entries in the ``Jobs`` table will be purged on upgrade. This job was incorrectly configured to run every minute, spamming the table with mostly useless records. All old records will be removed on upgrade, and the job will run daily instead.

### Known Issues
 - Cannot leave any team when a default [primary team](https://docs.mattermost.com/administration/config-settings.html#primary-team-experimental) is set.
 - Titles for webhooks, commands and OAuth apps are no longer bolded in the System Console.
 - Users can get logged out of server without a session expiry notification.
 - Desktop app hangs on opening emoji picker.
 - When a primary team is set, the options to leave a team is disabled for all teams, not just the primary team.
 - Plugin crashes the server when calling ``w.WriteHeader(0)``.
 - Bot account profile image disappears when saving bot details.
 - Custom emoji containing specified letters do not appear in emoji autocomplete, unless they start with the letters or have been returned in the autocomplete before.
 - Buttons inside ephemeral messages are not clickable / functional on the mobile app.
 - On a server using a subpath, the URL opens a blank page if the System Admin changes the Site URL in the System Console UI. To fix, the System Admin should restart the server.
 - Login does not work when Custom Terms of Service is enabled and MFA is enforced.
 - Google login fails on the Classic mobile apps.
 - Status may sometimes get stuck as away or offline in High Availability mode with IP Hash turned off.
 - Searching stop words in quotes with Elasticsearch enabled returns more than just the searched terms.
 - Searching with Elasticsearch enabled may not always highlight the searched terms.
 - Team sidebar on desktop app does not update when channels have been read on mobile.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.
 
### Contributors

 - [aaronrothschild](https://github.com/aaronrothschild), [aeomin](https://translate.mattermost.com/user/aeomin/), [adzimzf](https://github.com/adzimzf), [alxsah](https://github.com/alxsah), [amyblais](https://github.com/amyblais), [asaadmahmood](https://github.com/asaadmahmood), [Banyango](https://github.com/Banyango), [bbodenmiller](https://github.com/bbodenmiller), [bezumkin](https://github.com/bezumkin), [bolariin](https://github.com/bolariin), [bradjcoughlin](https://github.com/bradjcoughlin), [carmo-evan](https://github.com/carmo-evan), [chikei](https://github.com/chikei), [cjohannsen81](https://github.com/cjohannsen81), [cometkim](https://github.com/cometkim), [comharris](https://github.com/comharris), [cpanato](https://github.com/cpanato), [cpoile](https://github.com/cpoile), [crspeller](https://github.com/crspeller), [csduarte](https://github.com/csduarte), [cseeger-epages](https://github.com/cseeger-epages), [Dak425](https://github.com/Dak425), [danmaas](https://github.com/danmaas), [deanwhillier](https://github.com/deanwhillier), [dependabot[bot]](https://github.com/dependabot[bot]), [der-test](https://github.com/der-test), [DHaussermann](https://github.com/DHaussermann), [DSchalla](https://github.com/DSchalla), [elyscape](https://github.com/elyscape), [enahum](https://github.com/enahum), [esethna](https://github.com/esethna), [ewwollesen](https://github.com/ewwollesen), [gabrieljackson](https://github.com/gabrieljackson), [georgewitteman](https://github.com/georgewitteman), [GianOrtiz](https://github.com/GianOrtiz), [giorgosdi](https://github.com/giorgosdi), [glebtv](https://github.com/glebtv), [goku321](https://github.com/goku321), [gruceqq](https://translate.mattermost.com/user/gruceqq/), [grundleborg](https://github.com/grundleborg), [gupsho](https://github.com/gupsho), [hanzei](https://github.com/hanzei), [harshilsharma63](https://github.com/harshilsharma63), [hectorskypl](https://github.com/hectorskypl), [hmhealey](https://github.com/hmhealey), [Inconnu08](https://github.com/Inconnu08), [iomodo](https://github.com/iomodo), [it33](https://github.com/it33), [ivenk](https://github.com/ivenk), [jasonblais](https://github.com/jasonblais), [jesperhansen17](https://github.com/jesperhansen17), [jespino](https://github.com/jespino), [jfrerich](https://github.com/jfrerich), [jkl5616](https://github.com/jkl5616), [joewaitye](https://github.com/joewaitye), [johnthompson365](https://github.com/johnthompson365), [Jonany](https://github.com/Jonany), [jsmestad](https://github.com/jsmestad), [JtheBAB](https://github.com/JtheBAB), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [Kaya_Zeren](https://twitter.com/kaya_zeren), [kevinetienne](https://github.com/kevinetienne), [kim95175](https://github.com/kim95175), [kincl](https://github.com/kincl), [kosgrz](https://github.com/kosgrz), [krjn](https://github.com/krjn), [lassimus](https://github.com/lassimus), [Lena](https://translate.mattermost.com/user/Lena/), [letsila](https://github.com/letsila), [levb](https://github.com/levb),[lieut-data](https://github.com/lieut-data), [lindalumitchell](https://github.com/lindalumitchell), [lindy65](https://github.com/lindy65), [lisakycho](https://github.com/lisakycho), [LocalHeroPro](https://github.com/LocalHeroPro), [lurcio](https://github.com/lurcio), [manland](https://github.com/manland), [marianunez](https://github.com/marianunez), [maruTA-bis5](https://github.com/maruTA-bis5), [meilon](https://github.com/meilon), [mgdelacroix](https://github.com/mgdelacroix), [mickmister](https://github.com/mickmister), [migbot](https://github.com/migbot), [mjthomp95](https://github.com/mjthomp95), [mkraft](https://github.com/mkraft), [mlongo4290](https://github.com/mlongo4290), [moksahero](https://github.com/moksahero), [mounicapaladugu](https://github.com/mounicapaladugu), [mstoli](https://github.com/mstoli), [mzaks](https://github.com/mzaks), [nafisfaysal](https://github.com/nafisfaysal), [nils-schween](https://github.com/nils-schween), [patterns](https://github.com/patterns), [piperRyan](https://github.com/piperRyan), [pradeepmurugesan](https://github.com/pradeepmurugesan), [RajatVaryani](https://github.com/RajatVaryani), [reflog](https://github.com/reflog), [renatopeterman](https://github.com/renatopeterman), [rodcorsi](https://github.com/rodcorsi), [rvillablanca](https://github.com/rvillablanca), [saturninoabril](https://github.com/saturninoabril), [scottleedavis](https://github.com/scottleedavis), [SezalAgrawal](https://github.com/SezalAgrawal), [Sheshagiri](https://github.com/Sheshagiri), [srkgupta](https://github.com/srkgupta), [steevsachs](https://github.com/steevsachs), [streamer45](https://github.com/streamer45), [stylianosrigas](https://github.com/stylianosrigas), [sudheerDev](https://github.com/sudheerDev), [svelle](https://github.com/svelle), [tapaswenipathak](https://github.com/tapaswenipathak), [tarikeshaq](https://github.com/tarikeshaq), [tekminewe](https://github.com/tekminewe), [Theaxiom](https://github.com/Theaxiom), [thekiiingbob](https://github.com/thekiiingbob), [thePanz](https://github.com/thePanz), [ThiefMaster](https://github.com/ThiefMaster), [tomasmik](https://github.com/tomasmik), [ulhosting](https://github.com/uhlhosting), [utaani](https://github.com/utaani), [waseem18](https://github.com/waseem18), [wget](https://github.com/wget), [wiersgallak](https://github.com/wiersgallak), [willdot](https://github.com/willdot), [Willyfrog](https://github.com/Willyfrog), [Wipeout55](https://github.com/Wipeout55), [yuya-oc](https://github.com/yuya-oc), [zkry](https://github.com/zkry)

## Release v5.12 - Feature Release

Mattermost v5.12.0 contains low to medium level security fixes. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

- **v5.12.6, released 2019-08-22**
  - Mattermost v5.12.6 contains a medium level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
- **v5.12.5, released 2019-07-19**
  - Fixed an issue with Jira plugin where creating or attaching to Jira issues failed due to GDPR changes released by Atlassian. Affected Jira Cloud only, not Jira Server or Jira Data Center. [MM-17060](https://mattermost.atlassian.net/browse/MM-17060)
- **v5.12.4, released 2019-07-15**
  - Fixed an issue with missing messages. [MM-16921](https://mattermost.atlassian.net/browse/MM-16921)
- **v5.12.3, released 2019-07-09**
  - Fixed an issue where setting the MM_SQLSETTINGS_DATASOURCEREPLICAS environment variable broke the server startup. [MM-16719](https://mattermost.atlassian.net/browse/MM-16719)
- **v5.12.2, released 2019-07-03**
  - Fixed an issue where Net Promoter Score (NPS) went into a loop when [Experimental Enable Automatic Replies feature](https://docs.mattermost.com/administration/config-settings.html#enable-automatic-replies-experimental) was turned on in Account Settings.
- **v5.12.1, released 2019-06-28** 
  - Fixed an issue where messages were sometimes missing after reconnecting the network. [MM-16423](https://mattermost.atlassian.net/browse/MM-16423)
  - Fixed an issue where the client sometimes crashed while viewing a direct message channel. [MM-16480](https://mattermost.atlassian.net/browse/MM-16480)
  - Fixed an issue where Net Promoter Score (NPS) printed an error message in server logs when Error and Diagnostics Reporting was disabled. [MM-16465](https://mattermost.atlassian.net/browse/MM-16465)
  - Fixed an issue where Net Promoter Score (NPS) telemetry reporting surveys were disabled if the setting had not been modified. [MM-16554](https://mattermost.atlassian.net/browse/MM-16554)
- **v5.12.0, released 2019-06-16**
  - Original 5.12.0 release

### Breaking changes since last release

 - If your plugin uses the ``DeleteEphemeralMessage`` plugin API, update it to accept a ``postId string`` parameter. See [documentation](https://developers.mattermost.com/extend/plugins/server/reference/#API.DeleteEphemeralPost) to learn more.
 - Image link and YouTube previews do not display unless **System Console > Enable Link Previews** is enabled. Please ensure that your Mattermost server is connected to the internet and has network access to the websites from which previews are expected to appear. [Learn more here](https://docs.mattermost.com/administration/config-settings.html#enable-link-previews).
 - ``ExperimentalEnablePostMetadata`` setting was removed. Post metadata, including post dimensions, is now stored in the database to correct scroll position and eliminate scroll jumps as content loads in a channel.

**IMPORTANT:** If you upgrade from a release earlier than 5.11, please read the other [Important Upgrade Notes](https://docs.mattermost.com/administration/important-upgrade-notes.html).

### Highlights

#### Infinite Scroll
 - Read messages more easily. Older posts are loaded automatically as you scroll up instead of having to click the "Load more messages" button at the top of the screen. This feature is not supported on Internet Explorer (IE11).
 
#### Bot Accounts
 - Users no longer have to rely on creating fake user accounts to act as bots for integrations. Instead, create a real bot account and use it to generate bot access tokens to interact with users and complete tasks.
 - Users can can also use these bots to post to any channel in the system, whether it’s a private team, private channel or a direct message channel.
 - For Enterprise deployments, bot accounts no longer count as an active user towards licensing subscriptions.
 - To learn more about bot accounts, see [the documentation](https://mattermost.com/pl/default-bot-accounts).
 
#### Jira Plugin 2.0
 - Enhanced existing plugin for a deep two-way integration between Jira and Mattermost.
 - Send notifications for Jira issue creation, issue updates and comments to Mattermost channels.
 - Users can also take quick actions in Mattermost, including creating Jira issues, attaching Mattermost messages to Jira issues, and transitioning issues via slash commands.
 - For a full feature set for 2.0, see https://github.com/mattermost/mattermost-plugin-jira#jira-20-features.
 
#### Pre-packaged Plugins
 - New pre-packaged plugins bundled with this Mattermost release include:
   - [GitHub plugin](https://github.com/mattermost/mattermost-plugin-github) for notifications, reminders and slash commands to stay up-to-date on issues and pull requests. Supports GitHub SaaS and Enterprise versions.
   - [Autolink plugin](https://github.com/mattermost/mattermost-plugin-autolink) to automatically hyperlink text, such as adding links to your issue tracker when someone posts an issue key or number.
   - [Custom Attributes plugin](https://github.com/mattermost/mattermost-plugin-custom-attributes) to add custom attributes in the user profile popover.
   - [Welcome Bot plugin](https://github.com/mattermost/mattermost-plugin-welcomebot) to improve onboarding and HR processes by adding a Welcome Bot that helps add new team members to channels.
   - [Amazon SNS CloudWatch plugin](https://github.com/mattermost/mattermost-plugin-aws-sns) to send alert notifications from [Amazon AWS CloudWatch](https://aws.amazon.com/cloudwatch/) to Mattermost channels via AWS SNS.

#### System Console Reorganization
 - Informational architecture restructure of the System Console to make a more logical flow to the settings and to provide a more cohesive experience for hiding features on the Mattermost Private Cloud product, where the system admin should not have access to change configurations that affect the environment directly.

#### Net Promoter Score (NPS)
 - We are gathering user feedback to help improve user experience and hear directly from our users. The feature can be disabled via **System Console > Plugins > Net Promoter Score**.
 
#### AD/LDAP Group Sync Removals (Enterprise Edition E20)
 - System Admins can manage the membership of private teams and channels with AD/LDAP groups, eliminating the need to individually add and remove members. Users in the groups are automatically removed from the team or channel when removed from an associated group.
 
#### User/Channel Search & Autocomplete in Elasticsearch (Enterprise Edition E20)
 - Added new settings in **System Console > Elasticsearch** to enable [Elasticsearch](https://docs.mattermost.com/deployment/elasticsearch.html) for autocompletion queries. When enabled, Elasticsearch uses its indexed data for user/channel search queries and autocomplete queries.

### Improvements

#### User Interface (UI)
 - Added an option to add a user to a channel from the profile popover.
 - Removed ``@`` for full name display in push notifications.
 
#### Plugins
 - Added support for Markdown in plugin System Console help text fields.
 - Added support for plugins to override ephemeral posts.

#### Localization
 - Promoted Polish language to "official".

#### Command Line Interface (CLI)
 - Added a ``command modify`` CLI command to modify slash commands.
 - Added a ``mattermost user convert --bot`` CLI command to convert user accounts to bot accounts.
 - Implemented a new command ``config migrate`` for migrating configuration to and from the database.
 - For AD/LDAP Group Sync, added the following CLI commands:
   - ``group team enable`` to add the ability to switch a team to be group-constrained.
   - ``group team disable``to add the ability to disable group constraint on the specified team.
   - ``group team list`` to list the groups associated with a team.
   - ``group team status`` to show the group constraint status of the specified team.
   - ``group channel enable`` to add the ability to switch a channel to be group-constrained.
   - ``group channel disable`` to disable group constraint on the specified channel.
   - ``group channel list`` to list the groups associated with a channel.
   - ``group channel status`` to show the group constraint status of the specified channel.
 
#### Administration
 - Added support for running two Mattermost instances on the same domain using subpaths.
 - Added support for importing threads from Slack.

### Bug Fixes
 - Fixed an issue where releasing a mouse click while the cursor was outside of the Rename Channel modal would close the modal.
 - Fixed an issue where a whitepage occured after uploading a plugin with an invalid ``settings_schema`` value.
 - Fixed an issue where the announcement banner overlapped channel content.
 - Fixed an issue where license expiration notice banner could not be dismissed prior to the license expiration date.
 - Fixed an issue where the channel switcher autocomplete didn't function properly when autocompleting the name of a person who was the first person named in a group message channel.
 - Fixed an issue where inline images in markdown preview didn't get expanded.
 - Fixed an issue where replies to the parent post were not left-aligned.
 - Fixed an issue where the timezone picker dropdown closed when trying to drag the scrollbar.
 - Fixed an issue where the ``ExperimentalPrimaryTeam`` config.json setting no longer hid the "Leave Team" option.
 - Fixed an issue where the setting position field for AD/LDAP sync in System Console did not block user from changing it in Account Settings.
 - Fixed an issue where scrolling was not working on iOS browser sign-up and sign-in pages.

### config.json

Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json`, or the System Console when available.

#### Changes to Team Edition and Enterprise Edition:

 - Under ``"PluginSettings":`` in ``config.json``:
   - Added ``"EnableHealthCheck": true``, to ensure all plugins are periodically monitored, and restarted or deactivated based on their health status.
 - Under ``"NotificationLogSettings":`` in ``config.json``:
   - Added ``"EnableConsole": true``, ``"ConsoleLevel": "DEBUG"``, ``"ConsoleJson": true``, ``"EnableFile": true``, ``"FileLevel": "INFO"``, ``"FileJson": true``, and ``"FileLocation": ""``, to implement a structured logger to keep track of push notifications.
 - Under ``"ServiceSettings":`` in ``config.json``:
   - Added ``"EnableBotAccountCreation": false`` to enable bot account creation.
   - Added ``"DisableBotsWhenOwnerIsDeactivated": true`` to disable bots automatically when the owner is deactivated.
   - Added ``"TrustedProxyIPHeader": []``, to explicitly define which IP headers are trusted.

### Database Changes
 - `SchemeGuest` column added to the `TeamMembers` table.
 - `SchemeGuest` column added to the `ChannelMembers` table.
 - `DefaultTeamGuestRole` column added to the `Schemes` table, and set to an empty string.
 - `DefaultChannelGuestRole` column added to the `Schemes` table, and set to an empty string.

### API Changes

#### RESTful API v4 Changes
 - Updated API to use gziphandler wrapper if server is configured to use gzip. This ensures that the Mattermost server can respond to REST API requests with compressed data (via gzip) to reduce the amount of bandwidth used.
 - LDAP Group Sync:
    - Added API endpoints ``getGroupsByChannel`` and ``GetGroupsByTeam`` to retrieve groups by team and by channel.
    - Added ``group_constrained`` API to both ``/users`` and ``/users/search`` endpoints to be able to limit users listed to those allowed by group-constraints.
    - Added the ``GetGroups`` API endpoint to retrieve lists of groups with searching, pagination, and member counts.
 - Disabled Team InviteID modification via Create/Update actions and moved it to a dedicated API endpoint.
    
#### Plugin API v4 Changes
 - Added ``KVCompareAndSet(key string, old []byte, new []byte)`` to Plugin API to add support for transactional semantics with KV Store in plugin framework.

### Known Issues
 - Creating or attaching to Jira issues fails for Jira Cloud. This is resolved in v5.12.5.
 - Messages related to OpenGraph API are unnecessarily reported as errors in the server logs. This is resolved in v5.13.1.
 - **Push Notification Contents** setting is not available in the System Console in servers without an Enterprise Edition license. This is resolved in v5.13.1.
 - Channels with large message history may have performance issues. This is resolved in v5.13.2.
 - **Site Configuration > Notifications > Email Notification Contents** is missing from E10 servers. This is resolved in v5.13.2.
 - Changing announcement banner overlaps content. This is resolved in v5.13.2.
 - Scroll position is not at the new message indicator on switching channels with unreads between 30-60. This is resolved in v5.13.2.
 - Titles for webhooks, commands and OAuth apps are no longer bolded in the System Console.
 - Users can get logged out of server without a session expiry notification.
 - Desktop app hangs on opening emoji picker.
 - When a primary team is set, the options to leave a team is disabled for all teams, not just the primary team.
 - Plugin crashes the server when calling ``w.WriteHeader(0)``.
 - Bot account profile image disappears when saving bot details.
 - Custom emoji containing specified letters do not appear in emoji autocomplete, unless they start with the letters or have been returned in the autocomplete before.
 - Buttons inside ephemeral messages are not clickable / functional on the mobile app.
 - On a server using a subpath, the URL opens a blank page if the System Admin changes the Site URL in the System Console UI. To fix, the System Admin should restart the server.
 - Login does not work when Custom Terms of Service is enabled and MFA is enforced.
 - Google login fails on the Classic mobile apps.
 - Jump link in search results does not always jump to display the expected post.
 - Status may sometimes get stuck as away or offline in High Availability mode with IP Hash turned off.
 - Searching stop words in quotes with Elasticsearch enabled returns more than just the searched terms.
 - Searching with Elasticsearch enabled may not always highlight the searched terms.
 - Team sidebar on desktop app does not update when channels have been read on mobile.
 - Channel scroll position flickers while images and link previews load.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.

### Contributors
- [aeomin](https://translate.mattermost.com/user/aeomin/), [adzimzf](https://github.com/adzimzf), [amyblais](https://github.com/amyblais), [andresoro](https://github.com/andresoro), [asaadmahmood](https://github.com/asaadmahmood), [bolariin](https://github.com/bolariin), [bradjcoughlin](https://github.com/bradjcoughlin), [carmo-evan](https://github.com/carmo-evan), [chahat-arora](https://github.com/chahat-arora), [chikei](https://github.com/chikei), [cjohannsen81](https://github.com/cjohannsen81), [cometkim](https://github.com/cometkim), [comharris](https://github.com/comharris), [composednitin](https://github.com/composednitin), [CooperAtive](https://github.com/CooperAtive), [cpanato](https://github.com/cpanato), [cpoile](https://github.com/cpoile), [crspeller](https://github.com/crspeller), [d28park](https://github.com/d28park), [danmaas](https://github.com/danmaas), [deanwhillier](https://github.com/deanwhillier), [der-test](https://github.com/der-test), [DHaussermann](https://github.com/DHaussermann), [DSchalla](https://github.com/DSchalla), [dustinkirkland](https://github.com/dustinkirkland), [ejachang](https://github.com/ejachang), [enahum](https://github.com/enahum), [esethna](https://github.com/esethna), [evan-a-a](https://github.com/evan-a-a), [farhadab](https://github.com/farhadab), [fjaeger](https://github.com/fjaeger), [gabrieljackson](https://github.com/gabrieljackson), [GianOrtiz](https://github.com/GianOrtiz), [giorgosdi](https://github.com/giorgosdi), [greensteve](https://github.com/greensteve), [gruceqq](https://translate.mattermost.com/user/gruceqq/), [grundleborg](https://github.com/grundleborg), [gupsho](https://github.com/gupsho), [hanzei](https://github.com/hanzei), [hectorskypl](https://github.com/hectorskypl), [henrymori](https://github.com/henrymori), [hmhealey](https://github.com/hmhealey), [icelander](https://github.com/icelander), [iomodo](https://github.com/iomodo), [IshankGulati](https://github.com/IshankGulati), [it33](https://github.com/it33), [ivanaairenee](https://github.com/ivanaairenee), [jasonblais](https://github.com/jasonblais), [JerryFireman](https://github.com/JerryFireman), [jesperhansen17](https://github.com/jesperhansen17), [jespino](https://github.com/jespino), [jfrerich](https://github.com/jfrerich), [jkl5616](https://github.com/jkl5616), [johnthompson365](https://github.com/johnthompson365), [JtheBAB](https://github.com/JtheBAB), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [Kaya_Zeren](https://twitter.com/kaya_zeren), [kkirsche](https://github.com/kkirsche), [kosgrz](https://github.com/kosgrz), [Lena](https://translate.mattermost.com/user/Lena/), [letsila](https://github.com/letsila), [levb](https://github.com/levb), [lieut-data](https://github.com/lieut-data), [lindalumitchell](https://github.com/lindalumitchell), [lindy65](https://github.com/lindy65), [lisakycho](https://github.com/lisakycho), [liusy182](https://github.com/liusy182), [marianunez](https://github.com/marianunez), [matshch](https://github.com/matshch), [meilon](https://github.com/meilon), [mgdelacroix](https://github.com/mgdelacroix), [mickmister](https://github.com/mickmister), [migbot](https://github.com/migbot), [MikeNicholls](https://github.com/MikeNicholls), [mkraft](https://github.com/mkraft), [mlongo4290](https://github.com/mlongo4290), [pichouk](https://github.com/pichouk), [pradeepmurugesan](https://github.com/pradeepmurugesan), [prapti](https://github.com/prapti), [pravan](https://github.com/pravan), [redg3ar](https://github.com/redg3ar), [reflog](https://github.com/reflog), [rodcorsi](https://github.com/rodcorsi), [rvillablanca](https://github.com/rvillablanca), [sapnasivakumar](https://github.com/sapnasivakumar), [saturninoabril](https://github.com/saturninoabril), [scottleedavis](https://github.com/scottleedavis), [seansackowitz](https://github.com/seansackowitz), [sebastien-prudhomme](https://github.com/sebastien-prudhomme), [sergeyzhukov](https://github.com/sergeyzhukov), [stylianosrigas](https://github.com/stylianosrigas), [sudheerDev](https://github.com/sudheerDev), [svelle](https://github.com/svelle), [tapaswenipathak](https://github.com/tapaswenipathak), [thekiiingbob](https://github.com/thekiiingbob), [thePanz](https://github.com/thePanz), [therealpuneeth20](https://github.com/therealpuneeth20), [torgeirl](https://github.com/torgeirl), [ulhosting](https://github.com/uhlhosting), [VolatianaYuliana](https://github.com/VolatianaYuliana), [wget](https://github.com/wget), [wiersgallak](https://github.com/wiersgallak), [Wipeout55](https://github.com/Wipeout55), [z4cco](https://github.com/z4cco) 

## Release v5.11 - Quality Release

Mattermost v5.11.0 contains low level security fixes. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

- **v5.11.1, released 2019-06-20** 
  - Mattermost v5.11.1 contains a medium level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
- **v5.11.0, released 2019-05-16**
  - Original 5.11.0 release

### Breaking changes since last release

 - If your integration uses ``Update.Props == nil`` to clear ``Props``, this will no longer work in 5.11+. Instead, use ``Update.Props == {}`` to clear properties. This change was made because ``Update.Props == nil`` unintentionally cleared all ``Props``, such as the profile picture, instead of preserving them.

**IMPORTANT:** If you upgrade from a release earlier than 5.10, please read the other [Important Upgrade Notes](https://docs.mattermost.com/administration/important-upgrade-notes.html).

### Bug Fixes
 - Fixed an issue where plugin settings link didn't appear until refresh after uploading a plugin in the System Console.
 - Fixed an issue where **System Console** > **Users** bottom section of "user actions" menu was cut off for the last three users in the screen.
 - Fixed an issue where corners on image previews were squared instead of rounded.
 - Fixed an issue where the hover effect was missing on images.
 - Fixed an issue where a post action (via button or menu) reset the profile picture of the webhook post.
 - Fixed an issue where a flagged post containing only file attachments didn't render in the sidebar until loaded in the centre.
 - Fixed an issue where some strings in channel settings weren't localizable.
 - Fixed an issue where clicking "Open" downloaded an image instead of opening it.
 - Fixed an issue where an at-mention user autocomplete overlapped with the channel header when drafting a long message containing a file attachment.
 - Fixed an issue where the reply bar showed gaps between posts in compact view.
 - Fixed an issue where markdown preview of nested lists displayed differently from styling in posted message.
 - Fixed an issue where Safari suggested auto-corrections in the channel switcher.
 - Fixed an issue on Safari where the mention badge count didn't update immediately.
 - Fixed an issue where the post action menu overlapped with posts on iOS/Safari on mobile view.
 - Fixed an issue where interactive dialog's description text colour was difficult to see on dark themes.
 - Fixed an issue where delete permissions for custom emoji team admin role were not always granted.
 - Fixed an issue with a slight scroll pop on reaching loading indictor of search results.
 - Fixed an issue where adding a user to a channel that is in the unreads section caused the channel to become read in the user's view.
 - Fixed an issue where the channel menu dropdown icon had an unnecessary tooltip.
 - Fixed an issue on LDAP Groups where adding a group to a team provided an unnecessary permission confirmation modal.
 - Fixed an issue on mobile view where clicking on the attachment icon didn't bring up the dropdown menu.

### Known Issues
 - Buttons inside ephemeral posts are not clickable / functional on the mobile app.
 - On a server using a subpath, the URL opens a blank page if the system admin changes the Site URL in the System Console UI. The system admin should restart the server to fix it.
 - Login does not work when Custom Terms of Service is enabled and MFA is enforced.
 - Google login fails on the Classic mobile apps.
 - Jump link in search results does not always jump to display the expected post.
 - Status may sometimes get stuck as away or offline in High Availability mode with IP Hash turned off.
 - Searching stop words in quotes with Elasticsearch enabled returns more than just the searched terms.
 - Searching with Elasticsearch enabled may not always highlight the searched terms.
 - Team sidebar on desktop app does not update when channels have been read on mobile.
 - Channel scroll position flickers while images and link previews load.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.
 
### Contributors

Thank you to everyone who contributed to the Mattermost project in April 2019!

[aeomin](https://translate.mattermost.com/user/aeomin/), [akrfjmt](https://github.com/akrfjmt), [ali-farooq0](https://github.com/ali-farooq0), [amyblais](https://github.com/amyblais), [andresoro](https://github.com/andresoro), [asaadmahmood](https://github.com/asaadmahmood), [BotKube](https://www.botkube.io/), [bradjcoughlin](https://github.com/bradjcoughlin), [bytemine GmbH](https://github.com/bytemine), [chikei](https://github.com/chikei), [cometkim](https://github.com/cometkim), [comharris](https://github.com/com/comharris), [CooperAtive](https://github.com/CooperAtive), [coreyhulen](https://github.com/coreyhulen), [courtneypattison](https://github.com/courtneypattison), [cpanato](https://github.com/cpanato), [cpoile](https://github.com/cpoile), [crspeller](https://github.com/crspeller), [csduarte](https://github.com/csduarte), [d28park](https://github.com/d28park), [danmaas](https://github.com/danmaas), [deanwhillier](https://github.com/deanwhillier), [der-test](https://github.com/der-test), [DHaussermann](https://github.com/DHaussermann), [DSchalla](https://github.com/DSchalla), [enahum](https://github.com/enahum), [esethna](https://github.com/esethna), [fcorrea](https://github.com/fcorrea), [gabrieljackson](https://github.com/gabrieljackson), [gnufede](https://github.com/gnufede), [gruceqq](https://translate.mattermost.com/user/gruceqq/), [grundleborg](https://github.com/grundleborg), [hanzei](https://github.com/hanzei), [happygaijin](https://github.com/happygaijin), [harshilsharma](https://github.com/harshilsharma), [hectorskypl](https://github.com/hectorskypl), [Herzum](https://github.com/herzum), [hmhealey](https://github.com/hmhealey), [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais), [jespino](https://github.com/jespino), [jfrerich](https://github.com/jfrerich), [johnbellone](https://github.com/johnbellone), [johnthompson365](https://github.com/johnthompson365), [JVasky](https://github.com/JVasky), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [Kaya_Zeren](https://twitter.com/kaya_zeren), [kingisaac95](https://github.com/kingisaac95), [kmandagie](https://github.com/kmandagie), [kosgrz](https://github.com/kosgrz), [Lena](https://translate.mattermost.com/user/Lena/), [levb](https://github.com/levb), [lfbrock](https://github.com/lfbrock), [lieut-data](https://github.com/lieut-data), [lindalumitchell](https://github.com/lindalumitchell), [liusy182](https://github.com/liusy182), [ljmccaff](https://github.com/ljmccaff), [Mario-Hofstaetter](https://github.com/Mario-Hofstaetter), [meilon](https://github.com/meilon), [mgdelacroix](https://github.com/mgdelacroix), [mickmister](https://github.com/mickmister), [migbot](https://github.com/migbot), [mkraft](https://github.com/mkraft), [mlongo4290](https://github.com/mlongo4290), [MParvin](https://github.com/MParvin), [mstoli](https://github.com/mstoli), [ninanung](https://github.com/ninanung), [oliverJurgen](https://github.com/oliverJurgen), [PeterDaveHello](https://github.com/PeterDaveHello), [prapti](https://github.com/prapti), [reflog](https://github.com/reflog), [rodcorsi](https://github.com/rodcorsi), [RyPoints](https://github.com/RyPoints), [s4kh](https://github.com/s4kh), [sapnasivakumar](https://github.com/sapnasivakumar), [saturninoabril](https://github.com/saturninoabril), [scottleedavis](https://github.com/scottleedavis), [Sheshagiri](https://github.com/Sheshagiri), [stylianosrigas](https://github.com/stylianosrigas), [sudheerDev](https://github.com/sudheerDev), [svelle](https://github.com/svelle), [tengis617](https://github.com/tengis617), [thekiiingbob](https://github.com/thekiiingbob), [thePanz](https://github.com/thepanz), [thepill](https://github.com/thepill), [therealpuneeth20](https://github.com/therealpuneeth20), [ThiefMaster](https://github.com/ThiefMaster), [torgeirl](https://github.com/torgeirl), [tylarb](https://github.com/tylarb), [ulhosting](https://github.com/uhlhosting), [wget](https://github.com/wget), [wiersgallak](https://github.com/wiersgallak), [z4cco](https://github.com/z4cco) 

## Release v5.10 - Feature Release

Mattermost v5.10.0 contains medium to high level security fixes. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

- **v5.10.2, released 2019-06-20** 
  - Mattermost v5.10.2 contains a medium level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
- **v5.10.1, released 2019-05-16** 
  - Fixed an issue on Internet Explorer (IE11) where the system console opened a blank page.
- **v5.10.0, released 2019-04-16**
  - Original 5.10.0 release

### Breaking changes since last release

 - ``SupportedTimezonesPath`` setting in config.json and changes to timezones in the UI based on the timezones.json file was removed. This was made to support [storing configurations in the database](https://docs.mattermost.com/administration/config-in-database.html#configuration-in-the-mattermost-database).

**IMPORTANT:** If you upgrade from a release earlier than 5.9, please read the other [Important Upgrade Notes](https://docs.mattermost.com/administration/important-upgrade-notes.html).

### Highlights
 
#### Interactive Ephemeral Messages
 - Added support for [message actions and buttons](https://docs.mattermost.com/developer/interactive-messages.html) in ephemeral messages.

#### Configuration in Database
 - Added experimental support for storing ``config.json`` in the database, improving the system console experience on read-only filesystems. Storing the configuration in the database is optional, as the existing ``config.json`` remains fully supported.

### Improvements

#### User Interface (UI)
 - Added ability to use "c" and "sh" for code block syntax highlighting.
 - Words that trigger mentions now supports Chinese.
 - Added support for rendering emojis and hyperlinks in message attachment titles.
 - Added support for showing the channel name in the message box.
 - Added support for markdown in plugin system console help text fields.
 - Added ability to convert Excel cells to markdown table when pasting in Mattermost.
 - Added ability to render emojis in interactive message buttons.
 
#### Plugins (Beta)
 - Created a plugin component to override file previews.
 - Added support for plugins to create link tooltips.
 - Added experimental support for plugins to use bot accounts.
 
#### Bulk Import/Export
 - Added User Preference fields in bulk export.
 - Added ability to include direct and group message channels and their posts in bulk export.
 - Added ability to include deactivated users in bulk import.
 
#### Command Line Tools (CLI)
 - Created CLI command ``command show`` to allow seeing detailed information of a slash command.
 - Created CLI command ``webhook show`` to allow seeing detailed information of a webhook.
 - Created CLI command ``team rename`` to allow renaming teams.
 - Created CLI command ``channel search`` to allow searching for channels.
 
#### Administration
 - Improved default session timeout behavour, including changing the default ``SessionLengthWebInDays`` from 30 to 180 days.
 - Added full text search to the system console panel to easily find options in the configuration.
 - (Advanced Permissions) Split managing emoji permissions into "create", "delete own" and "delete others".
 - (Advanced Permissions) Added ``List_Public_Teams``, ``Join_Public_Teams``, ``List_Private_Teams`` and ``Join_Private_Teams`` permissions.
 - Added support for LDAP groups search.
 - Added a setting to the system console to change the minimum length of hashtags.
 - Added support for setting Reply-To header in outbound Mattermost emails.
 - Added support for invalidating all email invitations from the system console.

### Bug Fixes
 - Fixed an issue where enterprise features became immediately unavailable when the enterprise license expired with a 15 day grace period.
 - Fixed an issue where an at-mention for username that starts with "all" did not highlight their entire username.
 - Fixed an issue where the ``migrate_auth`` command did not work with valid license file.
 - Fixed an issue where post metadata was requested if link previews were disabled.
 - Fixed an issue where a channel did not get removed from the unreads section if the user navigated out of it via a permalink.
 - Fixed an issue where a link from Access Control Groups to Group Filter on AD/LDAP did not work for subpath Site URL.
 - Fixed an issue where expired channels appeared in "My Channels" section of channel switcher if using the **Automatically Close Direct Messages** setting.
 - Fixed an issue where the text box reverted to default size after a user returned from the Integrations page.
 - Fixed an issue where the profile popover wasn't allowed to close itself when opened through an at-mention.
 - Fixed an issue where filtering by first name with Korean characters no longer worked for at-mentions.
 - Fixed an issue where the **Remove MFA** option was visible for all users when **Enforce MFA** was enabled.
 
### Compatibility

#### Deprecated Features

 - Deprecated configurable ``timezones.json`` in favour of the existing hard-coded list built into the server.

### config.json

Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json`, or the System Console when available.
 
#### Changes to Team Edition and Enterprise Edition:

- Under ``"ExperimentalSettings":`` in ``config.json``:
   - Added ``"RestrictSystemAdmin": false``, to optionally constrain even system admins from changing critical settings.
- Under ``"ServiceSettings":`` in ``config.json``:
   - Added ``"MinimumHashtagLength": 3``, to add the ability to change the minimum length of hashtags.

### RESTful API Changes
 - Added ``GetUsers`` API method to add the ability to list users.
 - Added ``POST /bots`` to create a bot accounts.
 - Added ``PUT /bots/{bot_user_id}`` to partially update a bot by providing only the fields you want to update.
 - Added ``GET /bots/{bot_user_id}`` to get a bot specified by its bot id.
 - Added ``GET /bots`` to get a page of a list of bots.
 - Added ``POST /bots/{bot_user_id}/disable`` to disable a bot.
 - Added ``POST /bots/{bot_user_id}/enable`` to enable a bot.
 - Added ``POST /bots/{bot_user_id}/assign/{user_id}`` to assign a bot to the specified user.

### Plugin API Changes
 - Added the ``SearchPostsInTeam`` method to add the ability to search posts in a team.
 - Added ``GetTeamMembersForUser`` and ``GetChannelMembersForUser`` to add the ability to get team and channel members for a specific user.
 - Added ``GetBundleInfo() string`` method to add the ability to store assets elsewhere.
 - Added ``CreateBot(bot *model.Bot) (*model.Bot, *model.AppError)`` to create the given bot and corresponding user.
 - Added ``PatchBot(botUserId string, botPatch *model.BotPatch) (*model.Bot, *model.AppError)`` to apply the given patch to the bot and corresponding user.
 - Added ``GetBot(botUserId string, includeDeleted bool) (*model.Bot, *model.AppError)`` to return the given bot.
 - Added ``GetBots(options *model.BotGetOptions) ([]*model.Bot, *model.AppError)`` to return the requested page of bots.
 - Added ``UpdateBotActive(botUserId string, active bool) (*model.Bot, *model.AppError)`` to mark a bot as active or inactive, along with its corresponding user.
 - Added ``PermanentDeleteBot(botUserId string) *model.AppError`` to permanently delete a bot and its corresponding user.

### Database Changes
 - Granted the following permissions for the System Admin, in preparation for an upcoming bot accounts feature:
   - PERMISSION_CREATE_BOT
   - PERMISSION_READ_BOTS
   - PERMISSION_READ_OTHERS_BOTS
   - PERMISSION_MANAGE_BOTS
   - PERMISSION_MANAGE_OTHERS_BOTS
 - `Bots` table was added.

### Known Issues
 - Attachments menu on mobile view is partly cut off on the right-hand side.
 - Clicking on the attachment icon doesn't bring up the dropdown menu on mobile browser.
 - Content for ephemeral messages is not displayed on mobile apps.
 - When login is done through SAML, text in **Account Settings** > **General** > **Email** is misaligned.
 - On a server using a subpath, the URL opens a blank page if the system admin changes the Site URL in the System Console UI. The system admin should restart the server to fix it.
 - Login does not work when Custom Terms of Service is enabled and MFA is enforced.
 - Google login fails on the Classic mobile apps.
 - Jump link in search results does not always jump to display the expected post.
 - Status may sometimes get stuck as away or offline in High Availability mode with IP Hash turned off.
 - Searching stop words in quotes with Elasticsearch enabled returns more than just the searched terms.
 - Searching with Elasticsearch enabled may not always highlight the searched terms.
 - Team sidebar on desktop app does not update when channels have been read on mobile.
 - Channel scroll position flickers while images and link previews load.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.
 
### Contributors

Thank you to everyone who contributed to the Mattermost project in March 2019!

- [7-plus-t](https://github.com/7-plus-t), [aeomin](https://translate.mattermost.com/user/aeomin/), [ali-farooq0](https://github.com/ali-farooq0), [amaddio](https://github.com/amaddio), [amyblais](https://github.com/amyblais), [asaadmahmood](https://github.com/asaadmahmood), [avasconcelos114](https://github.com/avasconcelos114), [bcalik](https://github.com/bcalik), [benschuster788](https://github.com/benschuster788), [bradjcoughlin](https://github.com/bradjcoughlin), [checkaayush](https://github.com/checkaayush), [chetanyakan](https://github.com/chetanyakan), [chikei](https://github.com/chikei), [comharris](https://github.com/comharris), [courtneypattison](https://github.com/courtneypattison), [cpanato](https://github.com/cpanato), [cpoile](https://github.com/cpoile), [crspeller](https://github.com/crspeller), [csduarte](https://github.com/csduarte), [d28park](https://github.com/d28park), [danmaas](https://github.com/danmaas), [dchukmasov](https://github.com/dchukmasov), [deanwhillier](https://github.com/deanwhillier), [der-test](https://github.com/der-test), [DHaussermann](https://github.com/DHaussermann), [DSchalla](https://github.com/DSchalla), [enahum](https://github.com/enahum), [esethna](https://github.com/esethna), [fcorrea](https://github.com/fcorrea), [gnufede](https://github.com/gnufede), [grundleborg](https://github.com/grundleborg), [gruceqq](https://translate.mattermost.com/user/gruceqq/), [gulhe](https://github.com/gulhe), [gupsho](https://github.com/gupsho), [hanzei](https://github.com/hanzei), [harshilsharma](https://github.com/harshilsharma), [hectorskypl](https://github.com/hectorskypl), [hmhealey](https://github.com/hmhealey), [Hobby-Student](https://github.com/Hobby-Student), [it33](https://github.com/it33), [j8r](https://github.com/j8r), [jasonblais](https://github.com/jasonblais), [jespino](https://github.com/jespino), [jk2K](https://github.com/jk2K), [johnsenner](https://github.com/johnsenner), [JtheBAB](https://github.com/JtheBAB), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [Kaya_Zeren](https://twitter.com/kaya_zeren), [kelvintyb](https://github.com/kelvintyb), [kjkeane](https://github.com/kjkeane), [kosgrz](https://github.com/kosgrz), [Lena](https://translate.mattermost.com/user/Lena/), [letsila](https://github.com/letsila), [levb](https://github.com/levb), [lieut-data](https://github.com/lieut-data), [lindalumitchell](https://github.com/lindalumitchell), [m3phistopheles](https://github.com/m3phistopheles), [MartB](https://github.com/MartB), [meilon](https://github.com/meilon), [mgdelacroix](https://github.com/mgdelacroix), [mickmister](https://github.com/mickmister), [migbot](https://github.com/migbot), [MirlanMaksv](https://github.com/MirlanMaksv), [mkraft](https://github.com/mkraft), [mlongo4290](https://github.com/mlongo4290), [nadaa](https://github.com/nadaa), [oliverJurgen](https://github.com/oliverJurgen), [pesintta](https://github.com/pesintta), [reflog](https://github.com/reflog), [rodcorsi](https://github.com/rodcorsi), [Roy-Orbison](https://github.com/Roy-Orbison), [sadohert](https://github.com/sadohert), [sandlis](https://github.com/sandlis), [saturninoabril](https://github.com/saturninoabril), [stylianosrigas](https://github.com/stylianosrigas), [sudheerDev](https://github.com/sudheerDev), [svelle](https://github.com/svelle), [tejasbubane](https://github.com/tejasbubane), [thekiiingbob](https://github.com/thekiiingbob), [thePanz](https://github.com/thepanz), [ulhosting](https://github.com/uhlhosting), [wbernest](https://github.com/wbernest), [wget](https://github.com/wget), [wiersgallak](https://github.com/wiersgallak), [yuya-oc](https://github.com/yuya-oc)

## Release v5.9 - [ESR](https://docs.mattermost.com/administration/extended-support-release.html)

Mattermost v5.9.0 contains low to medium level security fixes. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

- **v5.9.8, released 2020-01-08**
  - Mattermost v5.9.8 contains a high level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
  - Fixed an issue where migrating accounts from email to SAML failed. [MM-21472](https://mattermost.atlassian.net/browse/MM-21472)
- **v5.9.7, released 2019-12-18** 
  - Mattermost v5.9.7 contains high level security fixes. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
- **v5.9.6, released 2019-10-24** 
  - Mattermost v5.9.6 contains a high level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
- **v5.9.5, released 2019-10-12**  
  - Fixed an issue that will be introduced with a change in upcoming server v5.16 and desktop app v4.3 releases where desktop notifications will be broken as the desktop app will no longer be able to directly interact with the web app. [MM-18819](https://mattermost.atlassian.net/browse/MM-18819)
- **v5.9.4, released 2019-08-22** 
  - Mattermost v5.9.4 contains a medium level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
- **v5.9.3, released 2019-07-19** 
  - Fixed an issue with unauthenticated LDAP bind. [MM-17055](https://mattermost.atlassian.net/browse/MM-17055)
- **v5.9.2, released 2019-06-20** 
  - Mattermost v5.9.2 contains a medium level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
- **v5.9.1, released 2019-04-24** 
  - Mattermost v5.9.1 contains a high level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
- **v5.9.0, released 2019-03-16**
  - Original 5.9.0 release
  
### Breaking Changes since last release

 - If **DisableLegacyMfa** setting in ``config.json`` is set to ``true`` and multi-factor authentication is enabled, ensure your users have upgraded to mobile app version 1.17 or later. Otherwise, users who have MFA enabled may not be able to log in successfully. See [Important Upgrade Notes](https://docs.mattermost.com/administration/important-upgrade-notes.html) for more details.
 - The public IP of the Mattermost application server is considered a reserved IP for additional security hardening in the context of untrusted external requests such as Open Graph metadata, webhooks or slash commands. See [Important Upgrade Notes](https://docs.mattermost.com/administration/important-upgrade-notes.html) for more details.

**IMPORTANT:** If you upgrade from another release than 5.8, please read the [Important Upgrade Notes](https://docs.mattermost.com/administration/important-upgrade-notes.html).

### Bug Fixes

 - Fixed an issue where emoji reactions did not appear on posts right away.
 - Fixed an issue where the emoji `Recently Used` cleared entirely after logging out and back in.
 - Fixed an issue where emoji not included in our list of text-based emoji were not rendered as jumboemoji.
 - Fixed an issue where the default server/client locales got reverted to ``en`` on server startup.
 - Fixed an issue where email notification setting in the webapp was out of sync with the mobile apps.
 - Fixed an issue where a broken image displayed on login page if custom branding was enabled but no image had been uploaded.
 - Fixed an issue where at-channel, at-all, at-here followed by a period were not highlighted as mentions.
 - Fixed an issue where the Mattermost icon was pixelated in bookmark rendering on Google Chrome.
 - Fixed an issue where **System Console > Users** page had broken user interface on narrow screens.
 - Fixed an issue where at-channel notification showed incorrect number of timezones.
 - Fixed an issue where leading whitespace with emoji affected emoji size so that they didn't render as jumboemoji.
 - Fixed an issue where the System Console graphs did not load smoothly.
 - Fixed an issue with inconsistent formatting in page header on **System Console > Notifications > Mobile Push**.
 - Fixed an issue where invite tokens with a 48-hour expiry expired after 24 hours.
 - Fixed an issue where a blank screen appeared when opening a group message channel from "More" modal using Enter key.
 - Fixed an issue where Zoom plugin caused link metadata code to print warnings in the System Console.

### config.json

Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json`, or the System Console when available.
 
#### Changes to Team Edition and Enterprise Edition:
 
 - **Enable Image Proxy** setting is now ``false`` by default. See [Important Upgrade Notes](https://docs.mattermost.com/administration/important-upgrade-notes.html) for more details.
 - Under ``"ServiceSettings"`` in ``config.json``:
    - Added ``"DisableLegacyMFA": false,`` to keep the legacy checkMfa endpoint enabled to support mobile versions 1.16 and earlier. See [Important Upgrade Notes](https://docs.mattermost.com/administration/important-upgrade-notes.html) for more details.

### Known Issues

 - On a server using a subpath, the URL opens a blank page if the system admin changes the Site URL in the System Console UI. The system admin should restart the server to fix it.
 - Login does not work when Custom Terms of Service is enabled and MFA is enforced.
 - Google login fails on the Classic mobile apps.
 - User can receive a video call from another browser tab while already on a call.
 - Jump link in search results does not always jump to display the expected post.
 - Status may sometimes get stuck as away or offline in High Availability mode with IP Hash turned off.
 - Searching stop words in quotes with Elasticsearch enabled returns more than just the searched terms.
 - Searching with Elasticsearch enabled may not always highlight the searched terms.
 - Team sidebar on desktop app does not update when channels have been read on mobile.
 - Channel scroll position flickers while images and link previews load.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.
 - CTRL/CMD+U shortcut to upload a file doesn’t work on Firefox.
 
### Contributors

Thank you to everyone who contributed to the Mattermost project in February 2019!

[adzimzf](https://github.com/adzimzf), [aeomin](https://translate.mattermost.com/user/aeomin/), [amyblais](https://github.com/amyblais), [asaadmahmood](https://github.com/asaadmahmood), [aswathkk](https://github.com/aswathkk), [awbraunstein](https://github.com/awbraunstein), [bbodenmiller](https://github.com/bbodenmiller), [BK1603](https://github.com/BK1603), [bradjcoughlin](https://github.com/bradjcoughlin), [chikei](https://github.com/chikei), [cometkim](https://github.com/cometkim), [comharris](https://github.com/comharris), [courtneypattison](https://github.com/courtneypattison), [cpanato](https://github.com/cpanato), [cpoile](https://github.com/cpoile), [crspeller](https://github.com/crspeller), [csduarte](https://github.com/csduarte), [danmaas](https://github.com/danmaas), [dannymohammad](https://github.com/dannymohammad), [deanwhillier](https://github.com/deanwhillier), [der-test](https://github.com/der-test), [DHaussermann](https://github.com/DHaussermann), [dom3k](https://github.com/dom3k), [dos1701](https://github.com/dos1701), [DSchalla](https://github.com/DSchalla), [ejachang](https://github.com/ejachang), [enahum](https://github.com/enahum), [esethna](https://github.com/esethna), [fcorrea](https://github.com/fcorrea), [gabrieljackson](https://github.com/gabrieljackson), [gruceqq](https://translate.mattermost.com/user/gruceqq/), [gupsho](https://github.com/gupsho), [hannaparks](https://github.com/hannaparks), [hanzei](https://github.com/hanzei), [hectorskypl](https://github.com/hectorskypl), [hmhealey](https://github.com/hmhealey), [icelander](https://github.com/icelander), [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais), [jdillard](https://github.com/jdillard), [jespino](https://github.com/jespino), [jfcastroluis](https://github.com/jfcastroluis), [jfrerich](https://github.com/jfrerich), [JtheBAB](https://github.com/JtheBAB), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [Kaya_Zeren](https://twitter.com/kaya_zeren), [kosgrz](https://github.com/kosgrz), [koukouloforos](https://github.com/koukouloforos), [kscheel](https://github.com/kscheel), [Lena](https://translate.mattermost.com/user/Lena/), [levb](https://github.com/levb), [lieut-data](https://github.com/lieut-data), [lindalumitchell](https://github.com/lindalumitchell), [manland](https://github.com/manland), [maruTA-bis5](https://github.com/maruTA-bis5), [meilon](https://github.com/meilon), [mgdelacroix](https://github.com/mgdelacroix), [migbot](https://github.com/migbot), [MirlanMaksv](https://github.com/MirlanMaksv), [mkraft](https://github.com/mkraft), [mlongo4290](https://github.com/mlongo4290), [onnadi-work](https://github.com/onnadi-work), [patniharshit](https://github.com/patniharshit), [pichouk](https://github.com/pichouk), [R-Wang97](https://github.com/R-Wang97), [Robbe7730](https://github.com/Robbe7730), [rodcorsi](https://github.com/rodcorsi), [sadohert](https://github.com/sadohert), [sandlis](https://github.com/sandlis), [sanojsubran](https://github.com/sanojsubran), [saturninoabril](https://github.com/saturninoabril), [staabm](https://github.com/staabm), [sudheerDev](https://github.com/sudheerDev), [svelle](https://github.com/svelle), [tauu](https://github.com/tauu), [thedingwing](https://github.com/thedingwing), [thePanz](https://github.com/thepanz), [ulhosting](https://github.com/uhlhosting), [wget](https://github.com/wget), [wiersgallak](https://github.com/wiersgallak), [yuya-oc](https://github.com/yuya-oc), [zetaab](https://github.com/zetaab)

## Release v5.8 - Feature Release

Mattermost v5.8.0 contains low to high level security fixes. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

- **v5.8.2, released 2019-04-24** 
  - Mattermost v5.8.2 contains a high level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
- **v5.8.1, released 2019-03-16** 
  - Mattermost v5.8.1 contains a medium level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
  - Turned image proxy off by default, unless a server already had it enabled (including new installs). Also, warnings about not getting embedded content for a post were downgraded or removed. See [important upgrade notes](https://docs.mattermost.com/administration/important-upgrade-notes.html) for more details.
- **v5.8.0, released 2019-02-16**
  - Original 5.8.0 release

### Breaking Changes since last release

- The local image proxy has been added, and images displayed within the client are now affected by the ``AllowUntrustedInternalConnections`` setting. See [documentation](https://docs.mattermost.com/administration/image-proxy.html#local-image-proxy) for more details if you have trouble loading images.

**IMPORTANT:** If you upgrade from another release than 5.7, please read the [Important Upgrade Notes](https://docs.mattermost.com/administration/important-upgrade-notes.html).

### Highlights

#### Added support for LDAP Group Sync
 - Lets admins set default team and channel membership based on LDAP groups. See more details [in the documentation](https://docs.mattermost.com/deployment/ldap-group-sync.html).

#### Added multi-factor authentication support to Team Edition
 - See more details on [this Forum post](https://forum.mattermost.org/t/multi-factor-authentication-mfa-in-team-edition/6287).
 
#### Enhanced image performance
 - Improved performance for images by adding support for image proxy servers, which are now integrated into the server and switched on by default.
 - Note that this may cause problems loading images from within your local network due to security settings. See [here](https://docs.mattermost.com/administration/image-proxy.html#local-image-proxy) for more information.

### Improvements

#### User Interface (UI)
 - Improved sorting of emoji in the emoji autocomplete and emoji picker search results.
 - Added support for emoji picker for mobile web view.

#### Notifications
 - Added a channel notification setting to disable at-channel mentions.
 
#### Administration
 - Added the ability to search users by role in **System Console** > **Users**.
 - Added a CLI command to modify an outgoing webhook.
 - Added a CLI command to restore a team.

#### Performance
 - Added network connectivity improvements where the server no longer allows clients to auto-retry posts and to cause posts to appear twice.

#### Slash Commands
 - Added support for sending a message to a different channel than where the slash command was issued from.
 - Added an option to send a message beginning with a "/" from the right-hand side.

#### Plugins
 - Added server support for updating a plugin instead of having to remove and install them as two separate actions.
 
#### Attachments
 - Optimized file attachment memory usage where possible.

### Bug Fixes
 
 - Fixed an issue where "[user] is typing ..." was not removed when a message was composed and sent very quickly.
 - Fixed an issue where an announcement banner displayed when the banner was enabled but the text field was blank.
 - Fixed an issue where a language was not set if selected in Account Settings.
 - Fixed an issue where removing rows from Send Email Invite modal didn't remove them immediately.

### config.json

Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json`, or the System Console when available.
 
#### Changes to Team Edition and Enterprise Edition:
 
 - Under ``"ServiceSettings"`` in ``config.json``:
    - Added ``"ExperimentalLdapGroupSync": false``, to add support for experimental LDAP Group Sync feature. 
 - Under ``"LdapSettings"`` in ``config.json``:  
    - Added ``"GroupFilter": ""``, ``"GroupDisplayNameAttribute": ""`` and ``"GroupIdAttribute": ""``, to add the ability to configure group display name and unique identifier.
 - Under ``"ImageProxySettings":`` in ``config.json``:
    - Added ``"Enable": true,``, ``"ImageProxyType": "local",``, ``"RemoteImageProxyURL": "",`` and ``"RemoteImageProxyOptions": ""``, to allow integrating image proxy into the server and switching it on by default.
 - Under ``"ExperimentalSettings":`` in ``config.json``:
    - Added ``"LinkMetadataTimeoutMilliseconds": 5000`` and ``"DisablePostMetadata": false``, to enable post metadata by default.

### API Changes

#### RESTful API v4 Changes
 - Added ``SearchTeams`` to plugin API to add the ability to search teams.
 - Added ``GetTeamStats`` to plugin API to add the ability to get team statistics.
 - Added ``/api/v4/posts/ids/reactions`` API endpoint to get the bulk reactions for posts.
 - Added ``UpdateUserActive`` to plugin API to allow updating user's status as active or inactive.
 - Add ``GetFile`` to plugin to add the ability to get files.

### Known Issues

 - On a server using a subpath, the URL opens a blank page if the system admin changes the Site URL in the System Console UI. The system admin should restart the server to fix it.
 - Login does not work when Custom Terms of Service is enabled and MFA is enforced.
 - Google login fails on the Classic mobile apps.
 - User can receive a video call from another browser tab while already on a call.
 - Jump link in search results does not always jump to display the expected post.
 - Status may sometimes get stuck as away or offline in High Availability mode with IP Hash turned off.
 - Searching stop words in quotes with Elasticsearch enabled returns more than just the searched terms.
 - Searching with Elasticsearch enabled may not always highlight the searched terms.
 - Team sidebar on desktop app does not update when channels have been read on mobile.
 - Channel scroll position flickers while images and link previews load.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.
 - CTRL/CMD+U shortcut to upload a file doesn’t work on Firefox.
 
### Contributors

Thank you to everyone who contributed to the Mattermost project in January 2019!
 
[adzimzf](https://github.com/adzimzf), [aeomin](https://translate.mattermost.com/user/aeomin/), [amorriscode](https://github.com/amorriscode), [amyblais](https://github.com/amyblais), [ArchRoller](https://github.com/archroller), [asaadmahmood](https://github.com/asaadmahmood), [avasconcelos114](https://github.com/avasconcelos114), [bradjcoughlin](https://github.com/bradjcoughlin), [chikei](https://github.com/chikei), [cometkim](https://github.com/cometkim), [comharris](https://github.com/comharris), [coreyhulen](https://github.com/coreyhulen), [cpanato](https://github.com/cpanato), [crspeller](https://github.com/crspeller), [csduarte](https://github.com/csduarte), [cvitter](https://github.com/cvitter), [danmaas](https://github.com/danmaas), [dannymohammad](https://github.com/dannymohammad), [deanwhillier](https://github.com/deanwhillier), [der-test](https://github.com/der-test), [DHaussermann](https://github.com/DHaussermann), [dmamills](https://github.com/dmamills), [dom3k](https://github.com/dom3k), [DSchalla](https://github.com/DSchalla), [dv29](https://github.com/dv29), [enahum](https://github.com/enahum), [esethna](https://github.com/esethna), [gabrieljackson](https://github.com/gabrieljackson), [grundleborg](https://github.com/grundleborg), [hanzei](https://github.com/hanzei), [hmhealey](https://github.com/hmhealey), [icelander](https://github.com/icelander), [it33](https://github.com/it33), [ja11sop](https://github.com/ja11sop), [jasonblais](https://github.com/jasonblais), [jespino](https://github.com/jespino), [JtheBAB](https://github.com/JtheBAB), [JustinReynolds-MM](https://github.com/JustinReynolds-MM), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [Kaya_Zeren](https://twitter.com/kaya_zeren), [kosgrz](https://github.com/kosgrz), [Lena](https://translate.mattermost.com/user/Lena/), [levb](https://github.com/levb), [lfbrock](https://github.com/lfbrock), [lieut-data](https://github.com/lieut-data), [lindalumitchell](https://github.com/lindalumitchell), [lindy65](https://github.com/lindy65), [maruTA-bis5](https://github.com/maruTA-bis5), [meilon](https://github.com/meilon), [mgdelacroix](https://github.com/mgdelacroix), [mickmister](https://github.com/mickmister), [migbot](https://github.com/migbot), [mkraft](https://github.com/mkraft), [mlongo4290](https://github.com/mlongo4290), [mollyyoung](https://github.com/mollyyoung), [nashik](https://github.com/nashik), [nlowe](https://github.com/nlowe), [Ovski4](https://github.com/Ovski4), [pichouk](https://github.com/pichouk), [pjgrizel](https://github.com/pjgrizel), [pradeepmurugesan](https://github.com/pradeepmurugesan), [robert843](https://github.com/robert843), [rodcorsi](https://github.com/rodcorsi), [rononline](https://github.com/rononline), [ryoon](https://github.com/ryoon), [s4kh](https://github.com/s4kh), [sadohert](https://github.com/sadohert), [sapnasivakumar](https://github.com/sapnasivakumar), [saturninoabril](https://github.com/saturninoabril), [Sheshagiri](https://github.com/Sheshagiri), [sonasingh46](https://github.com/sonasingh46), [sudheerDev](https://github.com/sudheerDev), [svelle](https://github.com/svelle), [thePanz](https://github.com/thepanz), [tomocy](https://github.com/tomocy), [ulhosting](https://github.com/uhlhosting), [unigiriunini](https://github.com/unigiriunini), [wget](https://github.com/wget), [wiersgallak](https://github.com/wiersgallak), [yuya-oc](https://github.com/yuya-oc), [zeroimpl](https://github.com/zeroimpl), [zetaab](https://github.com/zetaab)
 
## Release v5.7 - Quality Release

Mattermost v5.7.0 contains low to medium level security fixes. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

- **v5.7.3, released 2019-03-16** 
  - Mattermost v5.7.3 contains a medium level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
- **v5.7.2, released 2019-02-16** 
  - Mattermost v5.7.2 contains low to medium level security fixes. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
- **v5.7.1, released 2019-02-01** 
  - Mattermost v5.7.1 contains a high level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
- **v5.7.0, released 2019-01-16**
  - Original 5.7.0 release

### Bug Fixes

 - Fixed an issue where push notification to clear unread messages badge from another client was not being forwarded. There are cases on the mobile app where the badge could still linger - see [MM-13722](https://mattermost.atlassian.net/browse/MM-13722) for more details.
 - Fixed a SQL syntax error when a non-existent channelId was attempted to be viewed.
 - Fixed an issue where OpenGraph and Post Metadata cache were purged on any config change with the image proxy enabled.
 - Added a check for percent value on file upload progress to prevent the app from crashing.
 - Fixed an issue where multi-line announcement banner text did not expand its background.
 - Fixed an issue where channel modal text and icons were misaligned if only one channel type was available.
 - Fixed an issue where every channel switch triggered a fetch for users in all Group Message channels for the user.
 - Fixed an issue where the user was not redirected to sign up page to create first account on fresh install.
 - Fixed an issue where scrollbar appeared in team sidebar when a user was a member of too many teams.
 - Fixed an issue where wide images posted by a webhook could be cut off on the right-hand side.
 - Fixed an issue where leaving a team showed a 403 error in the console.
 - Fixed an issue where Code Theme did not save unless other colours were changed.
 - Fixed an issue where Webapp only showed a star or mention count for active team.
 - Fixed an issue where Web mobile view was missing the mute option in the channel menu.
 - Fixed an issue where the "participant is typing" appeared a few seconds after a message was posted.
 - Fixed an issue where a profile popover got cut off on the right-hand side if it included an admin badge and a long username.

### Known Issues

 - Custom Terms of Service returns on refresh after clicking to agree.
 - Google login fails on the Classic mobile apps.
 - User can receive a video call from another browser tab while already on a call.
 - Jump link in search results does not always jump to display the expected post.
 - Status may sometimes get stuck as away or offline in High Availability mode with IP Hash turned off.
 - Searching stop words in quotes with Elasticsearch enabled returns more than just the searched terms.
 - Searching with Elasticsearch enabled may not always highlight the searched terms.
 - Team sidebar on desktop app does not update when channels have been read on mobile.
 - Channel scroll position flickers while images and link previews load.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.
 - CTRL/CMD+U shortcut to upload a file doesn’t work on Firefox.

### Contributors

[aeomin](https://github.com/aeomin), [akhilanandbv003](https://github.com/akhilanandbv003), [amyblais](https://github.com/amyblais), [andrewbanchich](https://github.com/andrewbanchich), [ArchRoller](https://github.com/archroller), [asaadmahmood](https://github.com/asaadmahmood), [bezumkin](https://github.com/bezumkin), [bradjcoughlin](https://github.com/bradjcoughlin), [chetanyakan](https://github.com/chetanyakan), [chikei](https://github.com/chikei), [cometkim](https://github.com/cometkim), [comharris](https://github.com/comharris), [cpanato](https://github.com/cpanato), [crspeller](https://github.com/crspeller), [csduarte](https://github.com/csduarte), [cvitter](https://github.com/cvitter), [danmaas](https://github.com/danmaas), [der-test](https://github.com/der-test), [DHaussermann](https://github.com/DHaussermann), [DSchalla](https://github.com/DSchalla), [enahum](https://github.com/enahum), [esethna](https://github.com/esethna), [grundleborg](https://github.com/grundleborg), [hanzei](https://github.com/hanzei), [hmhealey](https://github.com/hmhealey), [icelander](https://github.com/icelander), [it33](https://github.com/it33), [ja11sop](https://github.com/ja11sop), [jasonblais](https://github.com/jasonblais), [jespino](https://github.com/jespino), [johnthompson365](https://github.com/johnthompson365), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [kayazeren](https://github.com/kayazeren), [kosgrz](https://github.com/kosgrz), [Lena](https://translate.mattermost.com/user/Lena/), [letsila](https://github.com/letsila), [levb](https://github.com/levb), [lfbrock](https://github.com/lfbrock), [lieut-data](https://github.com/lieut-data), [lindalumitchell](https://github.com/lindalumitchell), [meilon](https://github.com/meilon), [mickmister](https://github.com/mickmister), [migbot](https://github.com/migbot), [mkraft](https://github.com/mkraft), [mlongo4290](https://github.com/mlongo4290), [mukulrawat1986](https://github.com/mukulrawat1986), [pichouk](https://github.com/pichouk), [pjgrizel](https://github.com/pjgrizel), [robert843](https://github.com/robert843), [rodcorsi](https://github.com/rodcorsi), [rononline](https://github.com/rononline), [ryoon](https://github.com/ryoon), [s4kh](https://github.com/s4kh), [saturninoabril](https://github.com/saturninoabril), [Schrooms](https://github.com/Schrooms), [sudheerDev](https://github.com/sudheerDev), [svelle](https://github.com/svelle), [thePanz](https://github.com/thePanz), [uhlhosting](https://github.com/uhlhosting), [vaithak](https://github.com/vaithak), [wget](https://github.com/wget), [wiersgallak](https://github.com/wiersgallak), [yakimant](https://github.com/yakimant), [yuya-oc](https://github.com/yuya-oc) 

## Release v5.6 - Feature Release

- **v5.6.5, released 2019-02-16** 
  - Mattermost v5.6.5 contains low to medium level security fixes. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
- **v5.6.4, released 2019-02-01** 
  - Mattermost v5.6.4 contains a high level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
- **v5.6.3, released 2019-01-16**
  - Mattermost v5.6.3 contains medium level security fixes. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
- **v5.6.2, released 2018-12-22** 
  - Fixed JIRA plugin not sending messages back to Mattermost channels.
- **v5.6.1, released 2018-12-20** 
  - Fixed an issue where a user is not redirected to the account creation page on a fresh Mattermost server install.
  - Fixed an issue where file uploads crashed the webapp for some users.
  - Fixed slow channel switching load times, where every channel switch fetched users from all group message channels.
  - Fixed JIRA plugin not working due to a rename of the JIRA plugin directory structure.
- **v5.6.0, released 2018-12-16**
  - Original 5.6.0 release

### Breaking Changes since the last release

 - Replaced WebRTC prototype with other video and audio calling solutions. [Learn more here](https://docs.mattermost.com/deployment/video-and-audio-calling.html).
 - Removed support for IE11 Mobile View due to low usage and instability in order to invest that effort in maintaining a high quality experience on other more used browsers. End users on IE11 will thus have an increased minimum screen size.
 - If EnablePublicChannelsMaterialization setting in config.json is set to false, an offline migration prior to upgrade may be required to synchronize the materialized table for public channels to increase channel search performance in the channel switcher (CTRL/CMD+K), channel autocomplete (~) and elsewhere in the UI. See [Important Upgrade Notes](https://docs.mattermost.com/administration/important-upgrade-notes.html) for more details.
 
**IMPORTANT:** If you upgrade from another release than 5.5, please read the [Important Upgrade Notes](https://docs.mattermost.com/administration/important-upgrade-notes.html).

### Highlights

#### Interactive Dialogs
 - Added support for interactive dialogs to more easily collect structured information from users to perform an action or submit a request via an integration. [Learn more here](https://docs.mattermost.com/developer/interactive-dialogs.html)

#### Languages
 - Added support for Ukrainian language, bringing the number of supported languages to 16.
 - Romanian language promoted out of beta.

#### Command Line Interface (CLI)
 - Added new CLI commands to improve admin productivity, including:
   - ``command create`` to create a custom slash command for a specified team.
   - ``command delete`` to delete a slash command.
   - ``command move`` to move a slash command to a different team.
   - ``command list`` to list all commands on specified teams or all teams by default.
   - ``config get`` to retrieve the value of a config setting by its name in dot notation.
   - ``config set`` to set the value of a config setting by its name in dot notation.
   - ``config show`` to print the current Mattermost configuration in an easy to read format.
   - ``team archive`` to archive teams based on name.
   - ``team search`` to search for teams based on name.
   - ``webhook create-incoming`` to create incoming webhook within specific channel.
   - ``webhook create-outgoing`` to create outgoing webhook within specific channel.
   - ``webhook delete`` to delete a webhook.
   - ``webhook list`` to list all webhooks for a team or across the server.
   - ``webhook modify-incoming`` to modify existing incoming webhook by changing its title, description, channel or icon url.

### Improvements

#### User Interface
 - Added ability to remove profile pictures in Account Settings.
 - Added a new loading bar that shows progress on file uploads.
 - Added a new badge to the profile popover that indicates if a user is a System Admin.
 - Added new channel sidebar reorganization options for the `ExperimentalGroupUnreadChannels` config.json setting, such as the ability to sort channels by recent messages.
 - Added an option to be able to clear search results.

#### Notifications
 - Enabled push notifications by default on new Mattermost installs, via an encrypted TPNS (test push notification service).
 - Added a channel notification setting to disable @-channel @-here @-all notifications in specific channels.

#### Performance
 - Increased performance for returning user autocomplete results.

#### Plugins
 - Added a "min_server_version" field to plugin.json manifest, which enables built-in control for preventing loading plugins that are not compatible with the Mattermost server version.
 - Added ability for plugins to add channel header tooltips.
 - Stopped hashing plugin keys on write to more effectively enumerate the keys stored by a plugin.
 - Removed support for automatically unmarshalling a plugin's server configuration.

#### Bulk Import/Export
 - Added custom emoji and emoji reactions to bulk export tool.
 - Added favorite channels to bulk export tool.
 - Added user and channel notification preferences to bulk export tool.
 - Added the ability to specify an email batching interval for bulk import.

#### Slash Commands
 - Added support for multiple responses from a slash command.
 - Added an option to send a message when an invalid slash command is entered.

#### Administration
 - Added mobile support for Custom Terms of Service (Beta)
 - Removed **System Console > Plugins (Beta) > Configuration** page and moved enabling plugins setting to the **Plugins (Beta) > Management** page.
 - Introduced mlog/human package to consume and reformat structured logging with a human readable output.

#### Enterprise Edition (E20)
 - Data Retention promoted out of beta.

### Bug Fixes
 - Fixed an issue where pinned post list refreshed when a user posted a new message.

### config.json

Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json`, or the System Console when available.

#### Changes to Team Edition and Enterprise Edition:

 - Under ``"ServiceSettings"`` in ``config.json``:
    - Added ``"TLSMinVer": "1.2"``, ``"TLSStrictTransport": false``, ``"TLSStrictTransportMaxAge": 63072000`` and ``"TLSOverwriteCiphers": []``, to configure TLS connection when not using a reverse proxy such as NGINX.
 - Under ``"ExperimentalSettings"`` in ``config.json``:
    - Added ``"EnablePostMetadata": false``, to disable post metadata from being loaded.

### API Changes

#### RESTful API v4 Changes
 - Added ``GET /channels/{channel_id}/timezones`` to get a list of timezones for the users who are in the specified channel.
 - Added ``page`` and ``per_page`` properties to ``POST /teams/{team_id}/posts/search`` call for Elasticsearch paging.
 - Added ``DELETE /users/{user_id}/image`` to remove a user's profile picture.
 - Added ``DELETE /brand/image`` to remove a custom branding image.
 - Added ``POST /actions/dialogs/open`` and ``POST /actions/dialogs/submit`` to open and submit requests via interactive dialogs.

#### Plugin API Changes
 - **Changed ``GetTeamMembers(teamId string, offset, limit int)`` to ``GetTeamMembers(teamId string, page, perPage int)`` to be clearer and consistent with other APIs**
 - **Changed ``GetPublicChannelsForTeam(teamId string, offset, limit int)`` to ``GetPublicChannelsForTeam(teamId string, page, perPage int)`` to be clearer and more consistent with other APIs**
 - Added the following plugin API methods. For more information on each method, see the [server plugin reference](https://developers.mattermost.com/extend/plugins/server/reference/).
     - ``GetChannelsForTeamForUser``     
     - ``GetChannelMembers``
     - ``GetChannelMembersByIds``
     - ``GetChannelStats``
     - ``GetEmoji``
     - ``GetEmojiByName``
     - ``GetEmojiImage``
     - ``GetEmojiList``
     - ``GetPluginConfig``
     - ``SavePluginConfig``
     - ``GetPostsAfter``
     - ``GetPostsBefore``
     - ``GetPostsSince``
     - ``GetPostsForChannel``
     - ``GetPostThread``
     - ``GetProfileImage``
     - ``SetProfileImage``
     - ``GetTeamsForUser``
     - ``GetTeamsUnreadForUser``
     - ``GetTeamIcon``
     - ``SetTeamIcon``
     - ``RemoveTeamIcon``
     - ``GetUsersByUsernames``
     - ``GetUsersInChannel``
     - ``GetUsersInChannelByStatus``
     - ``GetUsersInTeam``
     - ``CreateDirectChannel``
     - ``SearchChannels``
     - ``SearchUsers`` 
     - ``GetFileLink``
     - ``UploadFile``
     - ``SetProfileImage``
     - ``KVSetWithExpiry``
     - ``KVDeleteAll``
     - ``KVList``

#### Database Changes

 - Added ``ExpireAt`` column to the ``PluginKeyValueStore`` table.
 - Migrated user's accepted terms of service data into a new table called ``UserTermsOfService``.
 - Removed ``idx_users_email_lower``, ``idx_users_username_lower``, ``idx_users_nickname_lower``, ``idx_users_firstname_lower`` and ``idx_users_lastname_lower`` indexes.

### Known Issues

 - Login does not work when Custom Terms of Service is enabled and MFA is enforced.
 - Custom Terms of Service returns on refresh after clicking to agree.
 - Google login fails on the Classic mobile apps.
 - User can receive a video call from another browser tab while already on a call.
 - Jump link in search results does not always jump to display the expected post.
 - Status may sometimes get stuck as away or offline in High Availability mode with IP Hash turned off.
 - Searching stop words in quotes with Elasticsearch enabled returns more than just the searched terms.
 - Searching with Elasticsearch enabled may not always highlight the searched terms.
 - Team sidebar on desktop app does not update when channels have been read on mobile.
 - Channel scroll position flickers while images and link previews load.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.
 - CTRL/CMD+U shortcut to upload a file doesn’t work on Firefox.

### Contributors

[aeomin](https://github.com/aeomin), [amorriscode](https://github.com/amorriscode), [amyblais](https://github.com/amyblais), [ArchRoller](https://github.com/archroller), [asaadmahmood](https://github.com/asaadmahmood), [bbodenmiller](https://github.com/bbodenmiller), [bd12](https://github.com/bd12), [chclaus](https://github.com/chclaus), [chetanyakan](https://github.com/chetanyakan), [chikei](https://github.com/chikei), [chrux](https://github.com/chrux), [cobenash](https://github.com/cobenash), [cometkim](https://github.com/cometkim), [comharris](https://github.com/comharris), [cpanato](https://github.com/cpanato), [crspeller](https://github.com/crspeller), [csduarte](https://github.com/csduarte), [danmaas](https://github.com/danmaas), [der-test](https://github.com/der-test), [DSchalla](https://github.com/DSchalla), [enahum](https://github.com/enahum), [esethna](https://github.com/esethna), [grundleborg](https://github.com/grundleborg), [gupsho](https://github.com/gupsho), [gy741](https://github.com/gy741), [hanzei](https://github.com/hanzei), [harshilsharma](https://github.com/harshilsharma), [hmhealey](https://github.com/hmhealey), [icelander](https://github.com/icelander), [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais), [jespino](https://github.com/jespino), [jlevesy](https://github.com/jlevesy), [JustinReynolds-MM](https://github.com/JustinReynolds-MM), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [kayazeren](https://github.com/kayazeren), [knrt10](https://github.com/knrt10), [letsila](https://github.com/letsila), [lieut-data](https://github.com/lieut-data), [lindalumitchell](https://github.com/lindalumitchell), [lindy65](https://github.com/lindy65), [lisakycho](https://github.com/lisakycho), [meilon](https://github.com/meilon), [mickmister](https://github.com/mickmister), [mkraft](https://github.com/mkraft), [mlongo4290](https://github.com/mlongo4290), [mojicaj](https://github.com/mojicaj), [murugesan](https://github.com/pradeepmurugesan), [patniharshit](https://github.com/patniharshit), [pichouk](https://github.com/pichouk), [pjgrizel](https://github.com/pjgrizel), [robert843](https://github.com/robert843), [rodcorsi](https://github.com/rodcorsi), [rononline](https://github.com/rononline), [ryoon](https://github.com/ryoon), [sandlis](https://github.com/sandlis), [saturninoabril](https://github.com/saturninoabril), [scottleedavis](https://github.com/scottleedavis), [sudheerDev](https://github.com/sudheerDev), [svelle](https://github.com/svelle), [thePanz](https://github.com/thePanz), [ThiefMaster](https://github.com/ThiefMaster), [torlenor](https://github.com/torlenor), [tuxfamily](https://github.com/tuxfamily), [uhlhosting](https://github.com/uhlhosting), [vaithak](https://github.com/vaithak), [waseem18](https://github.com/waseem18), [wget](https://github.com/wget), [wiersgallak](https://github.com/wiersgallak), [yuya-oc](https://github.com/yuya-oc), [zeroimpl](https://github.com/zeroimpl), [zetaab](https://github.com/zetaab)

## Release v5.5 - Quality Release

- **v5.5.3, released 2019-02-01** 
  - Mattermost v5.5.3 contains a high level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
- **v5.5.2, released 2019-01-16**
  - Mattermost v5.5.2 contains medium level security fixes. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
- **v5.5.1, released 2018-12-06** 
  - Fixed a bug preventing Elasticsearch v6.0+ from working in Mattermost server versions 5.4 and 5.5.
- **v5.5.0, released 2018-11-16**
  - Original 5.5.0 release

### Bug Fixes
 - Fixed an issue where clicking the two arrows to expand/collapse an image didn't work after posting an image.
 - Fixed an issue where switching authentication methods from email/password to SAML (OKTA and OneLogin) showed session expiry message instead of a success message.
 - Fixed an issue where message drafts occasionally posted to the channel even though user did not take any action to post it.
 - Fixed an issue with Autoresponder feature where the reply message did not get inserted consistently.
 - Fixed an issue where bolded channel names rendered over top of unbolded channel names in desktop.
 - Fixed an issue where config.ServiceSettings.SiteURL could contain a trailing slash.
 - Fixed a caching issue with archiving/unarchiving channels through API.
 - Fixed UX issues when trying to edit pending posts from reply thread.
 - Fixed an issue where "Enable Post Formatting" did not actually require page refresh.
 - Fixed an issue where User AuthService Export value of "" could be incompatible for importer.
 - Fixed an issue where search results that did not match case were not highlighted when returning hashtags in search results.
 - Fixed issues with indentation on the right-hand side in desktop app compact view.
 - Fixed an issue where the post header for bot messages was cutting off username before using available horizontal space.
 - Fixed an issue where "undefined" was briefly shown on refresh with combined system messages.
 - Fixed an issue where profile popover was cut-off at right-hand side root post.
 - Fixed UX issues for some plugins that displayed a blank page when clicking on the "Settings" link from "Management" page in System Console.
 - Fixed an issue where uploading a plugin resulted in a JS error and a blank page.
 - Fixed an issue where some team icons did not fill bounding box on MacOS.
 - Fixed an issue where there was no hover effect on emoji reactions.
 - Fixed an issue where a permanent announcement banner pushed the bottom of a channel sidebar off screen.
 - Fixed an issue where cancelling a change to channel notifications settings appeared to save the change.

### Known Issues

 - Google login fails on the Classic mobile apps.
 - User can receive a video call from another browser tab while already on a call.
 - Jump link in search results does not always jump to display the expected post.
 - Status may sometimes get stuck as away or offline in High Availability mode with IP Hash turned off.
 - Searching stop words in quotes with Elasticsearch enabled returns more than just the searched terms.
 - Team sidebar on desktop app does not update when channels have been read on mobile.
 - Channel scroll position flickers while images and link previews load.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.
 - CTRL/CMD+U shortcut to upload a file doesn’t work on Firefox.

### Contributors

[aeomin](https://github.com/aeomin), [Akash4927](https://github.com/Akash4927), [alexander-akhmetov](https://github.com/alexander-akhmetov), [amogozov](https://github.com/amogozov), [amorriscode](https://github.com/amorriscode), [amyblais](https://github.com/amyblais), [anchepiece](https://github.com/anchepiece), [ArchRoller](https://github.com/archroller), [asaadmahmood](https://github.com/asaadmahmood), [avasconcelos114](https://github.com/avasconcelos114), [Charliekenney23](https://github.com/Charliekenney23), [charvp](https://github.com/charvp), [chetanyakan](https://github.com/chetanyakan), [chikei](https://github.com/chikei), [cjohannsen81](https://github.com/cjohannsen81), [cobenash](https://github.com/cobenash), [cometkim](https://github.com/cometkim), [cored](https://github.com/cored), [coreyhulen](https://github.com/coreyhulen), [cpanato](https://github.com/cpanato), [crspeller](https://github.com/crspeller), [csduarte](https://github.com/csduarte), [cvitter](https://github.com/cvitter), [czertbytes](https://github.com/czertbytes), [danmaas](https://github.com/danmaas), [der-test](https://github.com/der-test), [DHaussermann](https://github.com/DHaussermann), [dos1701](https://github.com/dos1701), [enahum](https://github.com/enahum), [esethna](https://github.com/esethna), [florianeichin](https://github.com/florianeichin), [fraziern](https://github.com/fraziern), [grundleborg](https://github.com/grundleborg), [gupsho](https://github.com/gupsho), [gy741](https://github.com/gy741), [hanzei](https://github.com/hanzei), [harshilsharma](https://github.com/harshilsharma), [harshilsharma](https://github.com/harshilsharma), [hmhealey](https://github.com/hmhealey), [it33](https://github.com/it33), [jasimmons](https://github.com/jasimmons), [jasonblais](https://github.com/jasonblais), [JayaKrishnaNamburu](https://github.com/JayaKrishnaNamburu), [jespino](https://github.com/jespino), [JtheBAB](https://github.com/JtheBAB), [JustinReynolds-MM](https://github.com/JustinReynolds-MM), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [kayazeren](https://github.com/kayazeren), [KerryAlsace](https://github.com/KerryAlsace), [klingtnet](https://github.com/klingtnet), [knrt10](https://github.com/knrt10), [leblanc-simon](https://github.com/leblanc-simon), [lfbrock](https://github.com/lfbrock), [lieut-data](https://github.com/lieut-data), [lindalumitchell](https://github.com/lindalumitchell), [lindy65](https://github.com/lindy65), [lologarithm](https://github.com/lologarithm), [MattMattV](https://github.com/MattMattV), [meilon](https://github.com/meilon), [mkraft](https://github.com/mkraft), [mlongo4290](https://github.com/mlongo4290), [mojicaj](https://github.com/mojicaj), [mukulrawat1986](https://github.com/mukulrawat1986), [n7st](https://github.com/n7st), [pichouk](https://github.com/pichouk), [pjgrizel](https://github.com/pjgrizel), [powhu](https://github.com/powhu), [pradeepmurugesan](https://github.com/pradeepmurugesan), [pushkyn](https://github.com/pushkyn), [robert843](https://github.com/robert843), [rodcorsi](https://github.com/rodcorsi), [rononline](https://github.com/rononline), [ryoon](https://github.com/ryoon), [s4kh](https://github.com/s4kh), [SaashaJoshi](https://github.com/SaashaJoshi), [saturninoabril](https://github.com/saturninoabril), [SergeyShpak](https://github.com/SergeyShpak), [sonasingh46](https://github.com/sonasingh46), [sudheerDev](https://github.com/sudheerDev), [thePanz](https://github.com/thePanz), [torlenor](https://github.com/torlenor), [tyvsmith](https://github.com/tyvsmith), [uhlhosting](https://github.com/uhlhosting), [uusijani](https://github.com/uusijani), [VPashkov](https://github.com/VPashkov), [waseem18](https://github.com/waseem18), [wget](https://github.com/wget), [wiersgallak](https://github.com/wiersgallak), [yuya-oc](https://github.com/yuya-oc)

## Release v5.4 - Feature Release

Release date: 2018-10-16

- Mattermost v5.4.0 contains a low level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

### Breaking Changes since the last release

 - Mattermost mobile app version 1.13+ is required. File uploads will fail on earlier mobile app versions.
 - In certain upgrade scenarios the new Allow Team Administrators to edit others posts setting under General then Users and Teams may be set to True while the Mattermost default in 5.1 and earlier and with new 5.4+ installations is False.

**IMPORTANT:** If you upgrade from another release than 5.3, please read the [Important Upgrade Notes](https://docs.mattermost.com/administration/important-upgrade-notes.html).

### Highlights

#### Basic Export Tool
 - Created a basic exporter tool to extract objects from Mattermost for allowing to merge two servers.

### Improvements

#### Web User Interface (UI)
 - Added a draft indicator in the channel sidebar and channel switcher for channels with unsent messages.
 - Added support for jumboemojis.
 - Added support for searching in direct message and group message channels using the "in:" modifier.
 - Last viewed channel on logout is restored on next session.
 - Added support for consecutive messages in the right-hand side.
 - Added tooltips to post info overlay buttons.
 - Added a feature to post a code block on CTRL + ENTER.
 - Expanded post text box area when composing long posts.
 - Updated the pinned post list when it's open and the channel is switched so that the pinned post list updates to show the other channel's pinned posts.
 - Download of common file types is not forced when viewing a public link.

#### Command Line Interface (CLI)
 - Added a new Command Line Interface for removing all users from a channel.

#### Performance
 - Improved channel switcher performance.

#### Integrations
 - Added interactive menus to message attachments.
 - Added a autotranslation plugin.
 - Added a button to copy the information from webhooks/slash commands such as the url and token.
 - Added "Commented on..." text for files and message attachment type posts.
 - Updated incoming and outgoing webhook description to 500 characters.
 - Added hook ID to webhook requests in server logs.
 - Plugins without a server or webapp component now fail to be activated.

#### Notifications
 - Desktop notifications now follow teammate name display setting.
 - Added a mute/unmute option to channel dropdown menu.
 - Added a mute icon to mobile view.
 - Added support for notifying users when desktop/browser sessions expire.

#### Autocomplete and Focus
 - With "Send messages on CTRL+ENTER = ON", channel and user autocomplete now work.
 - Cursor is now autofocused on edit box before the modal fully loads.
 - Channel autocomplete closes after two consecutive tildes used for strikethrough formatting.
 - If a user begins typing and the cursor is not in an input box, the cursor is automatically put into the center channel text input box.

#### Administration
 - Moved hiding join/leave messages to Team Edition.
 - Added ``edit_others_posts`` as a permission setting for Team Edition.
 - Added account setting option to hide channel switcher button in the sidebar.

#### Compliance
 - Added changes for E20 custom service terms.
 - Team membership can be restricted based on email domains.

### Bug Fixes
 - Fixed an issue where logging in with LDAP account with MFA enabled resulted in "Error trying to authenticate MFA token" error when "Enable sign-in with username" was set to false.
 - Fixed an issue where log-in page flashed briefly during process of verifying an updated email address.
 - Fixed an issue where ""GET /api/v4/redirect_location" responses got stuck when “EnableLinkPreviews” was set to "false”.
 - Fixed an issue where Account Settings teammate name display setting changed when System Console teammate name display setting was changed.

### config.json

Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json`, or the System Console when available.

#### Changes to Enterprise Edition:

 - Under "SqlSettings": in ``config.json``:
   - Added ``"EnablePublicChannelsMaterialization": true``, to increase channel search performance in the channel switcher (CTRL/CMD+K), channel autocomplete (~) and elsewhere in the UI.

### API Changes

#### Plugin API Changes
 - Added slash commands with GET crush query parameters on configured endpoint URL to avoid parameters specified by both the user and Mattermost from being duplicated.
 - Added a GetServerVersion() string method to the plugin API to return the current server version.

#### Database Changes
 - ``Description`` column was added to the ``OutgoingWebhooks`` table.
 - ``Description`` column was added to the ``IncomingWebhooks`` table.
 - ``AcceptedServiceTermsId`` column was added to the ``Users`` table.
 - ``PublicChannels`` table was added.

### Known Issues

 - Google login fails on the Classic mobile apps.
 - User can receive a video call from another browser tab while already on a call.
 - Jump link in search results does not always jump to display the expected post.
 - Status may sometimes get stuck as away or offline in High Availability mode with IP Hash turned off.
 - Searching stop words in quotes with Elasticsearch enabled returns more than just the searched terms.
 - Searching with Elasticsearch enabled may not always highlight the searched terms.
 - Team sidebar on desktop app does not update when channels have been read on mobile.
 - Channel scroll position flickers while images and link previews load.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.
 - CTRL/CMD+U shortcut to upload a file doesn’t work on Firefox.

### Contributors

[aeomin](https://github.com/aeomin), [amyblais](https://github.com/amyblais), [asaadmahmood](https://github.com/asaadmahmood), [ArchRoller](https://github.com/archroller), [avasconcelos114](https://github.com/avasconcelos114), [balcsida](https://github.com/balcsida), [bezumkin](https://github.com/bezumkin), [ccpaging](https://github.com/ccpaging), [chetanyakan](https://github.com/chetanyakan), [chikei](https://github.com/chikei), [cimfalab](https://github.com/cimfalab), [cjbirk](https://github.com/cjbirk), [cometkim](https://github.com/cometkim), [coreyhulen](https://github.com/coreyhulen), [cpanato](https://github.com/cpanato), [crspeller](https://github.com/crspeller), [cvitter](https://github.com/cvitter), [danmaas](https://github.com/danmaas), [der-test](https://github.com/der-test), [DHaussermann](https://github.com/DHaussermann), [dmitrysamuylovpharo](https://github.com/dmitrysamuylovpharo), [DSchalla](https://github.com/DSchalla), [enahum](https://github.com/enahum), [esethna](https://github.com/esethna), [FurmanovD](https://github.com/FurmanovD), [gramakri](https://github.com/gramakri), [greensteve](https://github.com/greensteve), [grundleborg](https://github.com/grundleborg), [gvengel](https://github.com/gvengel), [hanzei](https://github.com/hanzei), [harshilsharma](https://github.com/harshilsharma), [hmhealey](https://github.com/hmhealey), [jasonblais](https://github.com/jasonblais), [jazzzz](https://github.com/jazzzz), [jespino](https://github.com/jespino), [jkurian](https://github.com/jkurian), [JustinReynolds-MM](https://github.com/JustinReynolds-MM), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [kayazeren](https://github.com/kayazeren), [kongr45gpen](https://github.com/kongr45gpen), [lfbrock](https://github.com/lfbrock), [lieut-data](https://github.com/lieut-data), [lindalumitchell](https://github.com/lindalumitchell), [meilon](https://github.com/meilon), [mikroskeem](https://github.com/mikroskeem), [mkraft](https://github.com/mkraft), [mlongo4290](https://github.com/mlongo4290), [n1aba](https://github.com/n1aba), [n7st](https://github.com/n7st), [pichouk](https://github.com/pichouk), [pjgrizel](https://github.com/pjgrizel), [pkuhner](https://github.com/pkuhner), [robert843](https://github.com/robert843), [rodcorsi](https://github.com/rodcorsi), [ryoon](https://github.com/ryoon), [R-Wang97](https://github.com/R-Wang97), [saturninoabril](https://github.com/saturninoabril), [sudheerDev](https://github.com/sudheerDev), [tejasbubane](https://github.com/tejasbubane), [thawn](https://github.com/thawn), [thePanz](https://github.com/thepanz), [ThiefMaster](https://github.com/ThiefMaster), [uhlhosting](https://github.com/uhlhosting), [wget](https://github.com/wget), [xcompass](https://github.com/xcompass), [yuya-oc](https://github.com/yuya-oc), [zetaab](https://github.com/zetaab)

## Release v5.3 - Feature Release

Mattermost v5.3.0 contains a high level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

- **v5.3.1, released 2018-09-19**
  - Fixed an issue where HTML elements such as links did not display correctly for non-English languages.
- **v5.3.0, released 2018-09-16**
  - Original 5.3.0 release

### Breaking Changes since the last release

 - Those servers with Elasticsearch enabled will notice that hashtag search is case-sensitive.

**IMPORTANT:** If you upgrade from another release than 5.2, please read the [Important Upgrade Notes](https://docs.mattermost.com/administration/important-upgrade-notes.html).

### Highlights

#### Search Date Filters
- Search for messages before, on, or after a specified date.

#### IdAttribute Setting for SAML
- Added a new `IdAttribute` setting for SAML, which allows SAML users to change their email address without losing their account.

### Improvements

#### Web User Interface (UI)
- Added ability to set username and profile picture in **Outgoing Webhooks** setup page.
- Added "Deactivate Account" option under **Account Settings > Advanced**.
- Added member count for the **More Direct Messages** list.
- Expanded shortened (e.g. bitly) links for previewable content such as images and YouTube links.

#### Performance
- Improved channel switcher performance by adding a short delay after the last character has been typed before querying  the server for new autocomplete results.

#### Integrations
- Added support for interactive message buttons to, for instance, delete or edit the post after clicking on a message button.

#### Administration
- Created a telemetry event for when telemetry is turned off from the System Console.
- Added support for attachments in Direct Message channels to the [bulk import tool](https://docs.mattermost.com/deployment/bulk-loading.html).

### Bug Fixes
- Fixed an issue where closing an archived channel did not redirect users to the last viewed channel.
- Fixed an issue where users were able to react to existing emojis in an archived channel.
- Fixed an issue where clicking "+" twice to add a public or private channel added a recently archived channel back to the left-hand side.
- Fixed an issue where channel autocomplete appeared to include all public channels, including deleted channels and channels one has never joined.

### config.json

Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json`, or the System Console when available.

#### Changes to Enterprise Edition:

 - Under "SamlSettings": in ``config.json``:
    - Added ``"EnableSyncWithLdapIncludeAuth": false,`` to override the SAML ID attribute with the AD/LDAP ID attribute if configured, or override the SAML Email attribute with the AD/LDAP Email attribute if SAML ID attribute is not present. See [documentation](https://about.mattermost.com/default-saml-ldap-sync) to learn more.
    - Added ``"IdAttribute": "",`` to set the attribute in the SAML Assertion that will be used to bind users from SAML to users in Mattermost.

### API Changes

#### Plugin API Changes (Release Candidate)
 - Added ``postId`` as a property for ``PostDropDownMenuComponent`` and as a parameter for the ``PostDropDownMenuAction`` function to improve the ability to add options to the post "..." action menu.
 - Added ``FileInfo`` and ``file []byte`` to retrieve File Info for a specific fileId and to ensure the file is read for a specific path.
 - Added ``GetLDAPUserAttributes``, which matches the functionality of the ``ldapextras`` built-in plugin that was removed in Mattermst v5.2.

### Known Issues

 - When "Enable sign-in with username" is set to false, logging in with LDAP account with MFA enabled results in "Error trying to authenticate MFA token" error.
 - Google login fails on the Classic mobile apps.
 - User can receive a video call from another browser tab while already on a call.
 - Jump link in search results does not always jump to display the expected post.
 - Status may sometimes get stuck as away or offline in High Availability mode with IP Hash turned off.
 - Searching stop words in quotes with Elasticsearch enabled returns more than just the searched terms.
 - Searching with Elasticsearch enabled may not always highlight the searched terms.
 - Team sidebar on desktop app does not update when channels have been read on mobile.
 - Channel scroll position flickers while images and link previews load.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.
 - CTRL/CMD+U shortcut to upload a file doesn’t work on Firefox.

### Contributors

[aeomin](https://github.com/aeomin), [amyblais](https://github.com/amyblais), [ArchRoller](https://github.com/archroller), [asaadmahmood](https://github.com/asaadmahmood), [chikei](https://github.com/chikei), [cometkim](https://github.com/cometkim), [comharris](https://github.com/comharris), [coreyhulen](https://github.com/coreyhulen), [cpanato](https://github.com/cpanato), [crspeller](https://github.com/crspeller), [csduarte](https://github.com/csduarte), [dcherniv](https://github.com/dcherniv), [der-test](https://github.com/der-test), [DHaussermann](https://github.com/DHaussermann), [dmitrysamuylovpharo](https://github.com/dmitrysamuylovpharo), [DSchalla](https://github.com/DSchalla), [enahum](https://github.com/enahum), [esethna](https://github.com/esethna), [grundleborg](https://github.com/grundleborg), [gvengel](https://github.com/gvengel), [Hanzei](https://github.com/Hanzei), [hmhealey](https://github.com/hmhealey), [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais), [jespino](https://github.com/jespino), [Jessica-c53](https://github.com/Jessica-c53), [JustinReynolds-MM](https://github.com/JustinReynolds-MM), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [kayazeren](https://github.com/kayazeren), [lfbrock](https://github.com/lfbrock), [lieut-data](https://github.com/lieut-data), [lindalumitchell](https://github.com/lindalumitchell), [lindy65](https://github.com/lindy65), [lisakycho](https://github.com/lisakycho), [meilon](https://github.com/meilon), [MerlinDMC](https://github.com/MerlinDMC), [michaelkochub](https://github.com/michaelkochub), [mkraft](https://github.com/mkraft), [mlongo4290](https://github.com/mlongo4290), [n1aba](https://github.com/n1aba), [pichouk](https://github.com/pichouk), [pjgrizel](https://github.com/pjgrizel), [pradeepmurugesan](https://github.com/pradeepmurugesan), [robert843](https://github.com/robert843), [rodcorsi](https://github.com/rodcorsi), [rononline](https://github.com/rononline), [rqtaylor](https://github.com/rqtaylor), [ryoon](https://github.com/ryoon), [R-Wang97](https://github.com/R-Wang97), [saturninoabril](https://github.com/saturninoabril), [sjstyle](https://github.com/sjstyle), [sudheerDev](https://github.com/sudheerDev), [thePanz](https://github.com/thepanz), [ThiefMaster](https://github.com/ThiefMaster), [uhlhosting](https://github.com/uhlhosting), [wget](https://github.com/wget), [wiersgallak](https://github.com/wiersgallak), [yuya-oc](https://github.com/yuya-oc)

## Release v5.2 - Feature Release

 - **v5.2.2, released 2018-09-16**
   - Mattermost v5.2.2 contains a high level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
- **v5.2.1, released 2018-08-23**
  - Disabled the ability to search archived channels by default, given multiple issues were raised after v5.2.0 was released. The feature can be enabled in v5.2.1 via ``ExperimentalViewArchivedChannels`` setting.
- **v5.2.0, released 2018-08-16**
  - Original 5.2.0 release

### Security Update

- Mattermost v5.2.0 contains medium level security fixes. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

### Breaking Changes since the last release

 - Those servers upgrading from v4.1 - v4.4 directly to v5.2 or later and have JIRA enabled will need to re-enable the JIRA plugin after an upgrade.

**IMPORTANT:** If you upgrade from another release than 5.1, please read the [Important Upgrade Notes](https://docs.mattermost.com/administration/important-upgrade-notes.html).

### Highlights

#### Embed Mattermost in Other Apps (Beta)
 - Added support for extensions, which allow you to embed Mattermost in other apps and websites via OAuth 2.0.
 - A sample extension for Chrome [is here](https://github.com/mattermost/mattermost-chrome-extension).

#### Plugins
 - Added support to add/delete and enable/disable plugins via the CLI.
 - See our [demo plugin](https://github.com/mattermost/mattermost-plugin-demo) that demonstrates the capabilities of a Mattermost plugin. For a starting point to write a Mattermost plugin, see our [sample plugin](https://github.com/mattermost/mattermost-plugin-sample).
 - Breaking changes to the plugins framework introduced. To migrate your existing plugins to be compatible with Mattermost 5.2 and later, see our [migration guide](https://developers.mattermost.com/extend/plugins/migration/).

#### Searching Archived Channels
 - Added ability to search for archived channel content on desktop and mobile clients.

#### Romanian Language
 - Added support for Romanian language.

### Improvements

#### Web User Interface (UI)
 - Added experimental custom default channels.
 - Added link to profile pop-over from names in Join/Leave messages.
 - Added support for webhook message attachments to trigger mentions.
 - Stripped markdown formatting characters from desktop notifications and "Commented on..." text.
 - Added ability to bulk import emoji.
 - Added support for file attachments in bulk import.

#### Plugins (All Beta)
 - New [antivirus plugin](https://github.com/mattermost/mattermost-plugin-antivirus) to scan for viruses before uploading a file to Mattermost. Supports [ClamAV anti-virus software](https://www.clamav.net/) across browser, Desktop Apps and the Mobile Apps.
 - New [GitHub plugin](https://github.com/mattermost/mattermost-plugin-github) to subscribe to notifications, and to keep track of unread GitHub messages and open pull requests requiring your attention.
 - [Zoom plugin](https://docs.mattermost.com/integrations/zoom.html) now has one option to start a meeting rather than three separate ones to simplify the user experience.

#### Server Plugins: Release Candidate
 - A release candidate (RC) is released for server plugins. Stable release is expected in v5.3 or v5.4.
 - Added various API methods for plugins to provide the same capabilities as the REST API.
 - Added support to intercept file uploads before the file is uploaded to a Mattermost server.
 - Added support for plugins to respond after a user joins/leaves a channel or a team, or creates a new channel.
 - Added support for plugins to respond prior to or after a user logs in to a Mattermost server.
 - Added support for plugins to update user status. Sample use case is setting a user’s status to Do Not Disturb based on Google Calendar events.
 - Added CSRF tokens that are attached to users sessions. The tokens can be enforced as an alternative to XHR checks in the plugin request system.
 - Added session token to context for ServeHTTP hook.

#### Webapp Plugins: Beta
 - Upcoming Mattermost UI redesign may cause breaking changes to webapp plugins. Hence, webapp plugins remain as beta in v5.2.
 - Added support to override [...] post menu, and paperclip icon for file uploads.
 - Added support for multiple plugins to add components at the same integration points instead of only allowing one plugin to do so.
 - Removed ability to fully override profile popover. Instead, multiple plugins can now add to the profile popover via multiple integration points.
 - For an up-to-date list of pluggable UI components, [see this list in our demo plugin](https://github.com/mattermost/mattermost-plugin-demo/tree/master/webapp#components).

#### Administration
 - In the compliance export status table, in System Console > Compliance > Compliance Export, added a number of exported records to Details column.
 - Added support for cross-origin resource sharing.

#### Command Line Interface (CLI)
 - Enhanced log output from Permanent Delete CLI command to delete FileInfos for a user's posts.
 - Addded channel renaming to CLI.

#### Enterprise Edition
 - Added the Global Relay Export CLI command.
 - Added support to search plugin contents.

### Bug Fixes
 - Fixed an issue where the "Switch Channel" shortcut (⌘K) didn't work on dvorak layout on Mac.
 - Fixed an issue where the Custom Integrations section in the System Console was blank after role changes.
 
### config.json

Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json`, or the System Console when available.

#### Changes to Team Edition and Enterprise Edition:

 - Under "ServiceSettings": in ``config.json``:
      - Added ``"CorsExposedHeaders": ""``, to add a whitelist of headers that will be accessible to the requester.
      - Added ``"CorsAllowCredentials": false``, to allow requests that pass validation to include the ``Access-Control-Allow-Credentials`` header.
      - Added ``"CorsDebug": false``, to print messages to the logs to help when developing an integration that uses CORS.
 - Under "TeamSettings" in ``config.json``:
      - Added ``"ViewArchivedChannels": true``, to allow users to share permalinks and search for content of channels that have been archived.
      - Added ``"ExperimentalDefaultChannels": ""``, to allow choosing the default channels every user is added to automatically after joining a new team.

### API Changes

#### RESTful API v4 Changes
 - ``deleteReaction`` API was added to send the correct value for ``post.HasReactions``.
 - Support for add/delete and enable/disable plugins via CLI was added.
 - File download API was improved to stream files instead of loading them entirely into memory.

#### Websocket Changes
 - Support for add/delete and enable/disable plugins via CLI was added.

#### Database Changes
 - Two new columns were added in the ``OutgoingWebhooks`` table, "Username" and "IconURL".

### Known Issues

 - Google login fails on the Classic mobile apps.
 - User can receive a video call from another browser tab while already on a call.
 - Jump link in search results does not always jump to display the expected post.
 - Status may sometimes get stuck as away or offline in High Availability mode with IP Hash turned off.
 - Searching stop words in quotes with Elasticsearch enabled returns more than just the searched terms.
 - Searching with Elasticsearch enabled may not always highlight the searched terms.
 - Team sidebar on desktop app does not update when channels have been read on mobile.
 - Channel scroll position flickers while images and link previews load.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.
 - CTRL/CMD+U shortcut to upload a file doesn’t work on Firefox.

### Contributors
[aeomin](https://github.com/aeomin), [alanpog](https://github.com/alanpog), [Alexgoodman7](https://github.com/Alexgoodman7), [amyblais](https://github.com/amyblais), [archroller](https://github.com/archroller), [asaadmahmood](https://github.com/asaadmahmood), [burguyd](https://github.com/burguyd), [chikei](https://github.com/chikei), [cometkim](https://github.com/cometkim), [comharris](https://github.com/comharris), [coreyhulen](https://github.com/coreyhulen), [cpanato](https://github.com/cpanato), [crspeller](https://github.com/crspeller), [csduarte](https://github.com/csduarte), [der-test](https://github.com/der-test), [DHaussermann](https://github.com/DHaussermann), [DSchalla](https://github.com/DSchalla), [enahum](https://github.com/enahum), [esethna](https://github.com/esethna), [falcon78921](https://github.com/falcon78921), [fdebrabander](https://github.com/fdebrabander), [grundleborg](https://github.com/grundleborg), [herooftimeandspace](https://github.com/herooftimeandspace), [hmhealey](https://github.com/hmhealey), [icelander](https://github.com/icelander), [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais), [jespino](https://github.com/jespino), [Jessica-c53](https://github.com/Jessica-c53), [JustinReynolds-MM](https://github.com/JustinReynolds-MM), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [kayazeren](https://github.com/kayazeren), [kennethjeremyau](https://github.com/kennethjeremyau), [lfbrock](https://github.com/lfbrock), [lieut-data](https://github.com/lieut-data), [lindalumitchell](https://github.com/lindalumitchell), [lindy65](https://github.com/lindy65), [meilon](https://github.com/meilon), [mkraft](https://github.com/mkraft), [mlongo4290](https://github.com/mlongo4290), [pepf](https://github.com/pepf), [pichouk](https://github.com/pichouk), [pietroglyph](https://github.com/pietroglyph), [pjgrizel](https://github.com/pjgrizel), [pradeepmurugesan](https://github.com/pradeepmurugesan), [rodcorsi](https://github.com/rodcorsi), [Roy-Orbison](https://github.com/Roy-Orbison), [ryoon](https://github.com/ryoon), [santos22](https://github.com/santos22), [saturninoabril](https://github.com/saturninoabril), [scherno2](https://github.com/scherno2), [seansackowitz](https://github.com/seansackowitz), [sudheerDev](https://github.com/sudheerDev), [tejasbubane](https://github.com/tejasbubane), [theblueskies](https://github.com/theblueskies), [ThiefMaster](https://github.com/ThiefMaster), [uhlhosting](https://github.com/uhlhosting), [uusijani](https://github.com/uusijani), [wget](https://github.com/wget), [wiersgallak](https://github.com/wiersgallak), [yuya-oc](https://github.com/yuya-oc)

## Release v5.1 - Feature Release

 - **v5.1.2, released 2018-09-16**
   - Mattermost v5.1.2 contains a high level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
 - **v5.1.1, released 2018-08-07**
   - Mattermost v5.1.1 contains medium level security fixes. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
 - **v5.1.0, released 2018-07-16**
   - Original 5.1.0 release

### Security Update

- Mattermost v5.1.0 contains multiple security fixes ranging from low to high severity. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

### Breaking Changes since the last release

 - ``mattermost export`` CLI command is renamed to ``mattermost export schedule``. Make sure to update your scripts if you use this command.

**IMPORTANT:** If you upgrade from another release than 5.0, please read the [Important Upgrade Notes](https://docs.mattermost.com/administration/important-upgrade-notes.html).

### Highlights

#### Gfycat integration
 - Added easy access to sharing GIFs without leaving the Mattermost interface. System Admins can enable this feature in **System Console > Customization > GIF**.

#### Auto-linking plugin (Beta)
 - Messages can now be formatted into Markdown links automatically before they are saved to the Mattermost database. See [autolink plugin repository](https://github.com/mattermost/mattermost-plugin-autolink) to learn more.

#### Support Mattermost on a subpath
 - Added support for hosting Mattermost at any route (e.g., https://www.example.com/mattermost) with newly added subpath support.

#### CSV Compliance Export ([Enterprise Edition E20](https://mattermost.com/pricing-self-managed/))
 - Extended compliance export feature with CSV format. See [documentation](https://docs.mattermost.com/administration/compliance-export.html) to learn more.

### Improvements

#### Web User Interface
 - Added highlighting for Elasticsearch results.
 - Renamed "Delete Channel" to "Archive Channel". Channels can be unarchived [from the commandline](https://docs.mattermost.com/administration/command-line-tools.html#mattermost-channel-restore).
 - Added Channel Purpose as a searchable field in the "More Channels" menu.

#### Administration
 - Added the ability to reset user emails in **System Console > Users**.
 - Server restart is no longer required to run the job server for the first time.

#### Command Line Interface (CLI)
 - Made the `permissions reset` CLI command able to reset all custom-role related data.
 - When `permanent delete user` CLI command is used, all files uploaded by the user are now deleted as well.
 - ``export`` CLI command was updated to support scheduling exports via `export schedule`, and to export files in Actiance XML and CSV formats.
 - Running the CLI outside of the bin directory is now less error prone.

#### Enterprise Edition E20
 - Added experimental support for certificate-based authentication (CBA) to identify a user or a device before granting access to Mattermost. See [documentation](https://docs.mattermost.com/deployment/certificate-based-authentication.html) to learn more.

### Bug Fixes

 - Fixed an issue where users could not reply to push notifications on iOS.
 - Fixed an issue with an incorrect system message after converting a public channel to private.
 - Fixed an issue with being unable to add emoji reactions after expanding the message details sidebar.
 - Fixed an issue where [rate limiting settings](https://docs.mattermost.com/administration/config-settings.html#rate-limiting) could not be edited in the System Console, and weren't displayed in the User Interface if configured via `config.json`.
 - Fixed an issue where deleted users shown as "Someone" in the Favorite Channels section could not be removed.

### config.json

Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json`, or the System Console when available.

#### Changes to Team Edition and Enterprise Edition:

 - Under "ExperimentalSettings:" in ``config.json``:
    - Added ``"ClientSideCertEnable": false,``, to enable client-side certification for your Mattermost server.
    - Added ``"ClientSideCertCheck": "secondary"``, to control whether email and password are required following client-side certification.
 - Under "ServiceSettings:" in ``config.json``:
    - Added ``"ExperimentalLimitClientConfig": false``, to limit the number of config settings sent to users prior to login. Supported on mobile apps v1.10 and later.
    - Added ``"EnableGifPicker": false,``, ``"GfycatApiKey": 2_KtH_W5,`` and ``"GfycatApiSecret": 3wLVZPiswc3DnaiaFoLkDvB4X0IV6CpMkj4tf2inJRsBY6-FnkT08zGmppWFgeof,`` to enable a built-in GIF integration with Gfycat.
    - Added ``"EnableEmailInvitations": false``, to disable email invitations on the system.
 - Under "SqlSettings:" in ``config.json``:
    - Added ``"ConnMaxLifetimeMilliseconds": 3600000,``, to configure the maximum lifetime for a connection to the database.

### API Changes

#### RESTful API v4 Changes

 - A new ``matches`` field was added to ``POST teams/{team_id}/posts/search`` to return a list of matched terms within the post. This field will only be populated on servers running version v5.1 or greater with Elasticsearch enabled.

### Known Issues

 - Google login fails on the Classic mobile apps.
 - User can receive a video call from another browser tab while already on a call.
 - Jump link in search results does not always jump to display the expected post.
 - Status may sometimes get stuck as away or offline in High Availability mode with IP Hash turned off.
 - Searching stop words in quotes with Elasticsearch enabled returns more than just the searched terms.
 - Searching with Elasticsearch enabled may not always highlight the searched terms.
 - Team sidebar on desktop app does not update when channels have been read on mobile.
 - Channel scroll position flickers while images and link previews load.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.
 - CTRL/CMD+U shortcut to upload a file doesn’t work on Firefox.

### Contributors

[Alexgoodman7](https://github.com/Alexgoodman7), [amyblais](https://github.com/amyblais), [AndersonWebStudio](https://github.com/AndersonWebStudio), [asaadmahmood](https://github.com/asaadmahmood), [Brodan](https://github.com/Brodan), [cjohannsen81](https://github.com/cjohannsen81), [cometkim](https://github.com/cometkim). [comharris](https://github.com/comharris), [coreyhulen](https://github.com/coreyhulen), [cpanato](https://github.com/cpanato), [crspeller](https://github.com/crspeller), [csduarte](https://github.com/csduarte), [cvitter](https://github.com/cvitter), [dmeza](https://github.com/dmeza), [DSchalla](https://github.com/DSchalla), [enahum](https://github.com/enahum), [esethna](https://github.com/esethna), [evelikov](https://github.com/evelikov), [fbartels](https://github.com/fbartels), [greensteve](https://github.com/greensteve), [grundleborg](https://github.com/grundleborg), [hmhealey](https://github.com/hmhealey), [icelander](https://github.com/icelander), [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais), [jespino](https://github.com/jespino), [jkurian](https://github.com/jkurian), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [kennethjeremyau](https://github.com/kennethjeremyau), [lfbrock](https://github.com/lfbrock), [lieut-data](https://github.com/lieut-data), [lindalumitchell](https://github.com/lindalumitchell), [lisakycho](https://github.com/lisakycho), [michaelgamble](https://github.com/michaelgamble), [mkraft](https://github.com/mkraft), [pichouk](https://github.com/pichouk), [Roy-Orbison](https://github.com/Roy-Orbison), [R-Wang97](https://github.com/R-Wang97), [saturninoabril](https://github.com/saturninoabril), [stanchan](https://github.com/stanchan), [sudheerDev](https://github.com/sudheerDev),[svelle](https://github.com/svelle), [tejasbubane](https://github.com/tejasbubane), [ThiefMaster](https://github.com/ThiefMaster), [wiersgallak](https://github.com/wiersgallak), [wildloop](https://github.com/wildloop), [yuya-oc](https://github.com/yuya-oc)

## Release v5.0 - Feature Release

 - **v5.0.3, released 2018-08-07**
   - Mattermost v5.0.3 contains a medium level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
 - **v5.0.2, released 2018-07-16**
   - Mattermost v5.0.2 contains a high severity security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
 - **v5.0.1, released 2018-07-09**
   - Fixed an issue where large Global Relay exports could cause export jobs to fail completely.
 - **v5.0.0, released 2018-06-16**
   - Original 5.0.0 release

### Breaking Changes since the last release

- All API v3 endpoints have been removed. [See documentation](https://api.mattermost.com/#tag/schema) to learn more about how to migrate your integrations to API v4. [Ticket #8708](https://mattermost.atlassian.net/browse/MM-8708).
- `platform` binary has been renamed to mattermost for a clearer install and upgrade experience. **You should point your `systemd` service file at the new `mattermost` binary.** All command line tools, including the bulk loading tool and developer tools, have also been renamed from platform to mattermost. [Ticket #9985](https://mattermost.atlassian.net/browse/MM-9985).
- A Mattermost user setting to configure desktop notification duration in **Account Settings** > **Notifications** > **Desktop Notifications** has been removed.
- Slash commands configured to receive a GET request now have the payload encoded in the query string instead of receiving it in the body of the request, consistent with standard HTTP requests. Although unlikely, this could break custom slash commands that use GET requests incorrectly. [Ticket #10201](https://mattermost.atlassian.net/browse/MM-10201).
- A new `config.json` setting to whitelist types of protocols for auto-linking has been added. [Ticket #9547](https://mattermost.atlassian.net/browse/MM-9547).
- A new `config.json` setting to disable the [permanent APIv4 delete team parameter](https://api.mattermost.com/#tag/teams%2Fpaths%2F~1teams~1%7Bteam_id%7D%2Fput) has been added. The setting is off by default for all new and existing installs, except those deployed on GitLab Omnibus. A System Administrator can enable the API v4 endpoint from the config.json file. [Ticket #9916](https://mattermost.atlassian.net/browse/MM-9916).
- An unused `ExtraUpdateAt` field has been removed from the channel model. [Ticket #9739](https://mattermost.atlassian.net/browse/MM-9739).

**IMPORTANT:** If you upgrade from another release than 4.10, please read the [Important Upgrade Notes](https://docs.mattermost.com/administration/important-upgrade-notes.html).

### Highlights

#### Plugin Intercept
 - Adds support for plugins to intercept posts prior to saving them into the database.
 - Supports use cases such as auto-detecting and censoring restricted words, and auto-linking phrases. [Read our forum post to learn more](https://forum.mattermost.org/t/coming-soon-apiv4-mattermost-post-intercept/4982).

#### Permissions Schemes
 - System Scheme now sets the default permissions inherited system-wide by System Admins, Team Admins, Channel Admins and everyone else.
 - Added new Team Schemes to override the default permissions in specific teams for Team Admins, Channel Admins and all other team members.

#### Increased Character Limit on Posts
 - Increased character limit to 16,383 on new deployments to allow posting long messages and to allow better Markdown formatting, including tables.
 - For existing deployments, read [how to migrate your system](https://docs.mattermost.com/administration/important-upgrade-notes.html) to support the increased character limit.

#### Combined Join/Leave Messages
 - System messages related to joining, leaving, adding and removing people from channels and teams are combined into a single message to save space in channels.

### Improvements

#### Web User Interface
 - Added a feature to collapse image upload using a collapse icon or using the ``/collapse`` command.
 - Added a whitelist for valid types of links when autolinking.
 - Updated the styling of default team icons.

#### Performance
 - Fixed ``update_status`` cluster event being sent thousands of times on restart of app servers.

#### Integrations
 - Slash commands configured to receive a GET request now have the payload encoded in the query string instead of receiving it in the body of the request.
 - Added ability for webhooks to actually be locked to a channel.

#### Notifications
 - Updated email notification subject line and contents for Group Messages.
 - Updated the styling of push notifications.

#### System Console
 - Added a System Console setting to disable the preview mode banner when email notifications are disabled.

#### Administration
 - Added Password Requirements and Customer Branding to Team Edition.
 - Moved Themes per team to Team Edition.

#### Enterprise Edition
 - Added ``LoginIdAttribute`` to allow LDAP users to change their login ID without losing their account.

### Bug Fixes

 - Fixed an issue where ``EnableUserCreation`` was set to `false` when not included in config.json.
 - Fixed an issue where a public channel made private did not disappear automatically from clients not part of the channel.
 - Fixed an issue where team icon did not get automatically saved when removed.
 - Fixed an issue where Town Square channel disappeared from channel list for a non-admin users when "ExperimentalTownSquareIsReadOnly" `config.json` was set to `true` in config.json.

### Compatibility

 - For a list of important changes with Mattermost v5.0, please [see our Forum announcement](https://forum.mattermost.org/t/upcoming-changes-with-mattermost-v5-0/5119).

### config.json

Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json`, or the System Console when available.

#### Changes to Team Edition and Enterprise Edition:

 - Under ``"ServiceSettings":`` in ``config.json``:
   - Added ``"EnableAPITeamDeletion": false,`` to disable the permanent APIv4 delete team parameter.
   - Added ``"ExperimentalEnableHardenedMode": false`` to enable a hardened mode for Mattermost that makes user experience trade-offs in the interest of security.
 - Under ``"EmailSettings":`` in ``config.json``:
   - Added ``"EnablePreviewModeBanner": true,`` to allow Preview Mode banner to be displayed so users are aware that email notifications are disabled.
 - Under ``"ClusterSettings":`` in ``config.json``:
   - Added ``"MaxIdleConns": 100,`` to add the maximum number of idle connections held open from one server to all others in the cluster.
   - Added ``"MaxIdleConnsPerHost": 128,`` to add the maximum number of idle connections held open from one server to another server in the cluster.
   - Added ``"IdleConnTimeoutMilliseconds": 90000`` to add the number of milliseconds to leave an idle connection open between servers in the cluster.
 - Under ``"TeamSettings":`` in ``config.json``:
   - Added ``"ExperimentalHideTownSquareinLHS": false,`` to hide Town Square in the left-hand sidebar if there are no unread messages in the channel.
 - Under ``"DisplaySettings":`` in ``config.json``:
   - Added ``"CustomUrlSchemes": [],``, to add a list of URL schemes that are used for autolinking in message text.
 - Under ``"LdapSettings":`` in ``config.json``:
   - Added ``"LoginIdAttribute": "",`` to add an attribute in the AD/LDAP server used to log in to Mattermost.

#### API Changes

 - All APIv3 endpoints were removed.
 - Improved file upload API to stream files instead of loading them entirely into memory.
 - SAML login endpoints were moved out of API package.
 - ``context.go`` was moved out of Api4 and into web.
 - ``api4/handlers.go`` was created to create the API handlers using the Context and Handler from web.
 - ``web/handlers.go`` was added to define the Handler struct, the base ServeHTTP function and a single web handler.

#### WebSocket Changes

 - Ping/pong and reconnection handling were added to Go WebSocket client.
 - Support was added for WebSocket custom dialer.
 - ``channel_converted`` WebSocket event was added, which is published team-wide whenever a channel is converted from public to private.

### Known Issues

 - [Image proxy](https://docs.mattermost.com/administration/image-proxy.html) cannot be saved in the System Console UI. Configure the settings in your `config.json` file instead.
 - Google login fails on the Classic mobile apps.
 - User can receive a video call from another browser tab while already on a call.
 - Jump link in search results does not always jump to display the expected post.
 - Status may sometimes get stuck as away or offline in High Availability mode with IP Hash turned off.
 - Searching stop words in quotes with Elasticsearch enabled returns more than just the searched terms.
 - Searching with Elasticsearch enabled may not always highlight the searched terms.
 - Team sidebar on desktop app does not update when channels have been read on mobile.
 - Channel scroll position flickers while images and link previews load.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.
 - CTRL/CMD+U shortcut to upload a file doesn’t work on Firefox.

### Contributors

[aeomin](https://translate.mattermost.com/user/aeomin/), [amyblais](https://github.com/amyblais), [AndersonWebStudio](https://github.com/AndersonWebStudio), [asaadmahmood](https://github.com/asaadmahmood), [balasankarc](https://github.com/balasankarc), [chclaus](https://github.com/chclaus), [chikei](https://github.com/chikei), [comharris](https://github.com/comharris), [compilenix](https://github.com/compilenix), [coreyhulen](https://github.com/coreyhulen), [cpanato](https://github.com/cpanato), [crspeller](https://github.com/crspeller), [csduarte](https://github.com/csduarte), [cvitter](https://github.com/cvitter), [der-test](https://github.com/der-test), [dkadioglu](https://github.com/dkadioglu), [DSchalla](https://github.com/DSchalla), [enahum](https://github.com/enahum), [esethna](https://github.com/esethna), [fbartels](https://github.com/fbartels), [gnufede](https://github.com/gnufede), [grundleborg](https://github.com/grundleborg), [haraldkubota](https://github.com/haraldkubota), [hmhealey](https://github.com/hmhealey), [icelander](https://github.com/icelander), [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais), [jespino](https://github.com/jespino), [jordanbuchman](https://github.com/jordanbuchman), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [kayazeren](https://github.com/kayazeren), [lfbrock](https://github.com/lfbrock), [lieut-data](https://github.com/lieut-data), [lindalumitchell](https://github.com/lindalumitchell), [lindy65](https://github.com/lindy65), [lisakycho](https://github.com/lisakycho), [meilon](https://github.com/meilon), [mkraft](https://github.com/mkraft), [mlongo4290](https://github.com/mlongo4290), [odontomachus](https://github.com/odontomachus), [pichouk](https://github.com/pichouk), [pjgrizel](https://github.com/pjgrizel), [rodcorsi](https://github.com/rodcorsi), [Roy-Orbison](https://github.com/Roy-Orbison), [ryoon](https://github.com/ryoon), [R-Wang97](https://github.com/R-Wang97), [saturninoabril](https://github.com/saturninoabril), [sudheerDev](https://github.com/sudheerDev), [thePanz](https://github.com/thepanz), [uturkdogan](https://github.com/uturkdogan), [wget](https://github.com/wget), [wiersgallak](https://github.com/wiersgallak), [yuya-oc](https://github.com/yuya-oc)

## Release v4.10 - [ESR](https://docs.mattermost.com/administration/extended-support-release.html)

 - **v4.10.10, released 2019-06-20** 
   - Mattermost v4.10.10 contains a medium level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
 - **v4.10.9, released 2019-04-24** 
   - Mattermost v4.10.9 contains a medium level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
 - **v4.10.8, released 2019-03-16** 
   - Mattermost v4.10.8 contains a medium level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
 - **v4.10.7, released 2019-02-16** 
   - Mattermost v4.10.7 contains low to medium level security fixes. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
 - **v4.10.6, released 2019-02-01** 
   - Mattermost v4.10.6 contains a high level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
 - **v4.10.5, released 2019-01-16**
   - Mattermost v4.10.5 contains medium level security fixes. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
 - **v4.10.4, released 2018-09-16**
   - Mattermost v4.10.4 contains a high level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
 - **v4.10.3, released 2018-08-07**
   - Mattermost v4.10.3 contains a medium level security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
 - **v4.10.2, released 2018-07-16**
   - Mattermost v4.10.2 contains a high severity security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
 - **v4.10.1, released 2018-06-04**
   - Mattermost v4.10.1 contains a moderate severity security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
   - Fixed an issue where the Mattermost screen went blank when viewing "Manage Members" list while another user was added to the channel.
   - Fixed an issue where [automatic replies](https://docs.mattermost.com/administration/config-settings.html#enable-automatic-replies-experimental) weren't properly posting or suppressing emails.
   - Fixed an issue where a member's roles for a team wasn't properly deleted when the team was deleted via the API, causing crashing issues.
 - **v4.10.0, released 2018-05-16**
   - Original 4.10.0 release

### Highlights

#### Convert Public Channels to Private
 - Team and System Admins can now convert a channel to private from the user interface. System Admins can also convert channels back to public [via the commandline](https://docs.mattermost.com/administration/command-line-tools.html#platform-channel-modify).

#### Performance Improvements
 - Decreased loading time by up to 90% for users with lots of direct and group message channels.

#### Environment Variables Support in GitLab Omnibus
 - Simplified Mattermost administration by supporting environment variables in GitLab Omnibus. See [documentation](https://docs.gitlab.com/omnibus/gitlab-mattermost/#upgrading-gitlab-mattermost-from-versions-prior-to-11-0) to learn more.

### Improvements

#### Web User Interface
 - Removed support for transparent team icons to support any sidebar theme colors and added the ability to remove team icons.
 - Added an experimental setting that users can use to set a custom message that will be automatically sent in response to Direct Messages.
 - Added a loading animation for "Add Members" channel invite modal.
 - Made SHIFT+UP switch keyboard focus to right-hand side if it's already open to the current thread.
 - Removed an unnecessary WebRTC end user setting to avoid user errors and confusion.
 - Added an on-hover effect for image link previews.

 #### Plugins
 - Added better plugin error handling and reporting.

 #### Slash Commands
 - Added ``/invite`` slash command to invite users to a channel.
 - Improved slash command error message when payload has invalid JSON.

 #### Administration
 - Added structured logging to more easily review server logs.
 - Users' client no longer refreshes after changing a System Console or ``config.json`` setting.

 #### Command Line Interface (CLI)
 - Added `/platform team list` command to list all teams on the server..

#### Enterprise Edition E20
 - Added cluster event types to [Performance Monitoring](https://docs.mattermost.com/deployment/metrics.html).

### Bug Fixes

 - Fixed an issue where focus with CTRL/CMD+SHIFT+L was always set to the right-hand side when reply thread was open.
 - Fixed an issue where a user added to a channel wasn't immediately removed from other users' "Add Members" dialog.
 - Fixed an issue where 'Copy Link' context menu option was partially hidden when right-clicking a team in team sidebar.
 - Fixed an issue where a user could not log in to Mattermost when their login id ("authdata") failed to migrate properly during migration from LDAP to SAML.
 - Fixed an issue where plugin configuration was not saved in the System Console.
 - Removed duplicate indexes accidentally created on the ``Channels``, ``Emoji`` and ``OAuthAccessData`` tables.

### Compatibility

#### config.json

Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json`, or the System Console when available.

#### Changes to Team Edition and Enterprise Edition:

 - Under `"TeamSettings"` in `config.json`:
   - Added ``"ExperimentalEnableAutomaticReplies": false,`` to allow users to set a custom message that will be automatically sent in response to Direct Messages.
 - Under `"LogSettings"` in `config.json`:
   - Removed ``FileFormat`` and added ``"FileJson": true,`` and ``"ConsoleJson": true,`` to allow logged events to be written as a machine readable JSON format instead of the be printed as plain text.

#### API Changes

##### RESTful API v4 Changes

 - Support was added to RESTful API for sending ephemeral messages to users.
 - An APIv4 endpoint of ``POST /channels/{channel_id}/convert`` was added to convert a channel from public to private and to restrict this setting to ``team_admin``.
 - An APIv4 endpoint of ``DELETE /teams/{team_id}/image`` was added to remove team icon and restrict it to ``team_admin``.

#### Database Changes

**Users Table:**

 - Migrates SAML `AuthData` to lowercase via `"UPDATE Users SET AuthData=LOWER(AuthData) WHERE AuthService = 'saml'"` query.

**Channels Table:**

 - Removed duplicate `Name_2` index.

**Emoji Table:**

 - Removed duplicate `Name_2` index.

**OAuthAccessData Table:**

 - Removed duplicate `ClientId_2` index.

#### Upcoming Deprecated Features in Mattermost v5.0

The following deprecations are planned for the Mattermost v5.0 release, which is scheduled for summer/2018. This list is subject to change prior to the release.

1. All API v3 endpoints will be removed. [See documentation](https://api.mattermost.com/#tag/schema) to learn more about how to migrate your integrations to API v4. [Ticket #8708](https://mattermost.atlassian.net/browse/MM-8708).
2. `platform` binary will be renamed to mattermost for a clearer install and upgrade experience. All command line tools, including the bulk loading tool and developer tools, will also be renamed from platform to mattermost. [Ticket #9985](https://mattermost.atlassian.net/browse/MM-9985).
3. A Mattermost user setting to configure desktop notification duration in **Account Settings** > **Notifications** > **Desktop Notifications** will be removed.
4. Slash commands configured to receive a GET request will have the payload being encoded in the query string instead of receiving it in the body of the request, consistent with standard HTTP requests. Although unlikely, this could break custom slash commands that use GET requests incorrectly. [Ticket #10201](https://mattermost.atlassian.net/browse/MM-10201).
5. A new `config.json` setting to whitelist types of protocols for auto-linking will be added. [Ticket #9547](https://mattermost.atlassian.net/browse/MM-9547).
6. A new `config.json` setting to disable the [permanent APIv4 delete team parameter](https://api.mattermost.com/#tag/teams%2Fpaths%2F~1teams~1%7Bteam_id%7D%2Fput) will be added. The setting will be off by default for all new and existing installs, except those deployed on GitLab Omnibus. A System Administrator can enable the API v4 endpoint from the config.json file. [Ticket #9916](https://mattermost.atlassian.net/browse/MM-9916).
7. An unused `ExtraUpdateAt` field will be removed from the channel model. [Ticket #9739](https://mattermost.atlassian.net/browse/MM-9739).

### Known Issues

 - Google login fails on the Classic mobile apps.
 - User can receive a video call from another browser tab while already on a call.
 - Jump link in search results does not always jump to display the expected post.
 - Status may sometimes get stuck as away or offline in High Availability mode with IP Hash turned off.
 - Searching stop words in quotes with Elasticsearch enabled returns more than just the searched terms.
 - Searching with Elasticsearch enabled may not always highlight the searched terms.
 - Team sidebar on desktop app does not update when channels have been read on mobile.
 - Channel scroll position flickers while images and link previews load.
 - Numbered lists can sometimes extend beyond the normal post area.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.
 - CTRL/CMD+U shortcut to upload a file doesn’t work on Firefox.

### Contributors
[amyblais](https://github.com/amyblais), [AndersonWebStudio](https://github.com/AndersonWebStudio), [antoineHC](https://github.com/antoineHC), [asaadmahmood](https://github.com/asaadmahmood), [Autre31415](https://github.com/Autre31415), [cometkim](https://github.com/cometkim), [coreyhulen](https://github.com/coreyhulen), [cpanato](https://github.com/cpanato), [crspeller](https://github.com/crspeller), [csduarte](https://github.com/csduarte), [daanlevi](https://github.com/daanlevi), [DSchalla](https://github.com/DSchalla), [enahum](https://github.com/enahum), [esethna](https://github.com/esethna), [grundleborg](https://github.com/grundleborg), [guydemi](https://github.com/guydemi), [hmhealey](https://github.com/hmhealey), [icelander](https://github.com/icelander), [iri-dw](https://github.com/iri-dw), [it33](https://github.com/it33), [james-mm](https://github.com/james-mm), [jasonblais](https://github.com/jasonblais), [jespino](https://github.com/jespino), [jordanbuchman](https://github.com/jordanbuchman), [jwilander](https://github.com/jwilander), [kethinov](https://github.com/kethinov), [koxen](https://github.com/koxen), [lfbrock](https://github.com/lfbrock), [lieut-data](https://github.com/lieut-data), [lindalumitchell](https://github.com/lindalumitchell), [lindy65](https://github.com/lindy65), [lisakycho](https://github.com/lisakycho), [liusy182](https://github.com/liusy182), [Merlin2001](https://github.com/merlin2001), [michaeltaylor-kerauno](https://github.com/michaeltaylor-kerauno), [mkraft](https://github.com/mkraft), [n1aba](https://github.com/n1aba), [pichouk](https://github.com/pichouk), [saturninoabril](https://github.com/saturninoabril), [stanchan](https://github.com/stanchan), [sudheerDev](https://github.com/sudheerDev), [tejasbubane](https://github.com/tejasbubane), [timconner](https://github.com/timconner), [tomo667a](https://github.com/tomo667a), [yuya-oc](https://github.com/yuya-oc)

## Release v4.9 - Feature Release

 - **v4.9.4, released 2018-06-04**
   - Mattermost v4.9.4 contains a moderate severity security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
 - **v4.9.3, released 2018-05-15**
   - Fixed an issue where plugin configuration got corrupted upon saving the configuration via the System Console.
 - **v4.9.2, released 2018-05-04**
   - Fixed an issue with permissions migration when ``AllowEditPost`` was set to "Always".
 - **v4.9.1, released 2018-04-27**
   - Fixed an issue where System Console permissions settings displayed a false error when running High Availability mode.
   - Fixed a race condition on loading roles in the System Console.
   - Reverted a change causing significant performance degradation when loading posts.
   - Fixed a performance issue causing significant initial load time for the Desktop application.
 - **v4.9.0, released 2018-04-16**
   - Original 4.9.0 release

### Highlights

#### Channel Mute
 - Added a `/mute` command, meaning that when a channel is muted, desktop, push and email notifications are not sent for the channel.
 - Channel Mute is also accessible via Channel Notification Preferences.
 - A muted channel gets sorted at the bottom of the left-hand sidebar section.

#### Teammate Name Display Setting
 - Added the setting for rendering of at-mentions by the teammate name display back to the Account Settings.

#### Team Icons
 - Added support for team icons in the team sidebar.

#### Global Relay (Beta) ([Enterprise Edition E20](https://mattermost.com/pricing-self-managed/) Add-On)
 - Added export support for Global Relay as a compliance solution. [Learn more here](https://about.mattermost.com/default-compliance-export-documentation).

### Improvements

#### Web User Interface
 - Users can now set their timezone in **Account Settings > Timezone**.
 - Cursor now returns to the reply thread input box after deleting a reply on the right-hand sidebar.

#### Performance
 - Decreased channel load time by optimizing database queries used to fetch threads and parent posts in a channel.
 - Decreased load time of large channels with 5,000+ messages by up to 90% by optimizing many client functions related to rendering posts and threads.
 - Changing properties other than Site URL in ``/general/logging`` section will now require a server restart before taking effect.

#### Plugins (Beta)
 - Plugins now have more flexibility to format text, emojis and Markdown.
 - Added support for plugins to add actions to the sidebar dropdowns.

#### Administration
 - Added support for AWS Identity and Access Management (IAM) roles for Amazon S3 file storage.
 - Added a "Test Connection" button to test Amazon S3 connection.

#### Enterprise Edition
 - When `ExperimentalTownSquareIsReadOnly` is set to `true`, non-admins can no longer react to messages, pin messages or update channel information.
 - Added cache invalidation totals to [Performance Monitoring](https://docs.mattermost.com/deployment/metrics.html).

### Bug Fixes

 - Fixed server log 404 error messages "We couldn't get the emoji" for numeric emojis.
 - Fixed an issue where cursor jumped to end of line when trying to edit text in the middle of search bar.
 - Fixed an issue where a download link opened images in a new tab instead of downloading them.
 - Fixed an issue where Direct Message channel with yourself did not show up in channel switcher.
 - Fixed an issue where deleting one username from "add member to a channel" field deleted all names.
 - Fixed an issue where View/Manage members should have been sorted by username, not online status.
 - Fixed an issue where a non-system-admin should not see `Is Trusted` option on OAuth 2.0 integrations.
 - Fixed an issue with being unable to click on pinned post, channel members, and so on with keyboard focus on search box.
 - Fixed an issue where Mattermost only imported first user during Slack import.
 - Fixed an issue where cleared search term reappeared after closing RHS.
 - Fixed an issue where a thumbnail appeared larger than expected in center channel when posting an image while the right hand side was open.
 - Fixed an issue with adding users to channels when the usernames contained periods.
 - Fixed an issue with a JavaScript error when using CMD/CTRL-K keyboard shortcut to change channels.
 - Fixed an issue with not being able to get past second page of `/admin_console/users`.
 - Fixed an issue where ALT+UP/DOWN caused error in console and then stopped working.

### Compatibility

 - IE11 Compatibility View now shows an "Unsupported Browser" error page, [given it's not a supported version](https://docs.mattermost.com/install/requirements.html#pc-web-experience).

#### Removed and Deprecated Features

 - To improve the production use of Mattermost with Docker, the docker image is now running a as non-root user and listening on port 8000. Please read the [upgrade instructions](https://github.com/mattermost/mattermost-docker#upgrading-mattermost-to-49) for important changes to existing installations.

- Several configuration settings have been migrated to roles in the database and changing their `config.json` values no longer takes effect. These permissions can still be modified by their respective System Console settings as before. The affected `config.json` settings are:
   - RestrictPublicChannelManagement
   - RestrictPrivateChannelManagement
   - RestrictPublicChannelCreation
   - RestrictPrivateChannelCreation
   - RestrictPublicChannelDeletion
   - RestrictPrivateChannelDeletion
   - RestrictPrivateChannelManageMembers
   - EnableTeamCreation
   - EnableOnlyAdminIntegrations
   - RestrictPostDelete
   - AllowEditPost
   - RestrictTeamInvite
   - RestrictCustomEmojiCreation

For a list of past and upcoming deprecated features, [see our website](https://about.mattermost.com/deprecated-features/).

#### Upcoming Deprecated Features in Mattermost v5.0

The following deprecations are planned for the Mattermost v5.0 release, which is scheduled for summer/2018. This list is subject to change prior to the release.

1. All API v3 endpoints will be removed. [See documentation](https://api.mattermost.com/#tag/APIv3-Deprecation) to learn more about how to migrate your integrations to API v4. [Ticket #8708](https://mattermost.atlassian.net/browse/MM-8708).
2. `platform` binary will be renamed to mattermost for a clearer install and upgrade experience. All command line tools, including the bulk loading tool and developer tools, will also be renamed from platform to mattermost. [Ticket #9985](https://mattermost.atlassian.net/browse/MM-9985).
3. A new `config.json` setting to whitelist types of protocols for auto-linking will be added. [Ticket #9547](https://mattermost.atlassian.net/browse/MM-9547).
4. A new `config.json` setting to disable the [permanent APIv4 delete team parameter](https://api.mattermost.com/#tag/teams%2Fpaths%2F~1teams~1%7Bteam_id%7D%2Fput) will be added. The setting will be off by default for all new and existing installs, except those deployed on GitLab Omnibus. A System Administrator can enable the API v4 endpoint from the config.json file. [Ticket #9916](https://mattermost.atlassian.net/browse/MM-9916).
5. An unused `ExtraUpdateAt` field will be removed from the channel model. [Ticket #9739](https://mattermost.atlassian.net/browse/MM-9739).

#### config.json

Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json`, or the System Console when available.

#### Changes to Team Edition and Enterprise Edition:

 - Under `MessageExportSettings` in `config.json`:
     - Added `"CustomerType": "A9"`, to allow selecting the type of Global Relay customer account the user's organization has.
     - Added `"EmailAddress": ""`, to allow selecting the email address the user's Global Relay server monitors for incoming compliance exports.
 - Under ` "SamlSettings"` in `config.json`:
     - Added `"ScopingIDPProviderId": ""`, to allow an authenticated user to skip the initial login page of their federated Azure AD server, and only require a password to log in.
     - Added `"ScopingIDPName": ""`, to add the name associated with a user's Scoping Identity Provider ID.
 - Under `DisplaySettings"` in `config.json`:
     - Added `"ExperimentalTimezone": false`, to allow selecting the timezone used for timestamps in the user interface and email notifications.

#### API Changes

 - It is required that any new integrations use API v4 endpoints. For more details, and for a complete list of available endpoints, see [https://api.mattermost.com/](https://api.mattermost.com/).
 - All API v3 endpoints have been deprecated and are scheduled for removal in Mattermost v5.0.

#### Database Changes

**Users Table:**

 - Added `Timezone` column.

**Teams Table:**

 - Added `LastTeamIconUpdate` column.

**Channels Table:**

 - Removed `idx_channels_displayname` index.

### Known Issues
 - Google login fails on the Classic mobile apps.
 - User can receive a video call from another browser tab while already on a call.
 - Jump link in search results does not always jump to display the expected post.
 - Status may sometimes get stuck as away or offline in High Availability mode with IP Hash turned off.
 - Searching stop words in quotes with Elasticsearch enabled returns more than just the searched terms.
 - Searching with Elasticsearch enabled may not always highlight the searched terms.
 - Team sidebar on desktop app does not update when channels have been read on mobile.
 - Channel scroll position flickers while images and link previews load.
 - Numbered lists can sometimes extend beyond the normal post area.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.
 - CTRL/CMD+U shortcut to upload a file doesn’t work on Firefox.

### Contributors

[amyblais](https://github.com/amyblais), [AndersonWebStudio](https://github.com/AndersonWebStudio), [asaadmahmood](https://github.com/asaadmahmood), [ccbrown](https://github.com/ccbrown), [chclaus](https://github.com/chclaus), [chumbalum](https://github.com/chumbalum), [cjohannsen81](https://github.com/cjohannsen81), [CoolMoeDee](https://github.com/CoolMoeDee), [coreyhulen](https://github.com/coreyhulen), [cpanato](https://github.com/cpanato), [crspeller](https://github.com/crspeller), [csduarte](https://github.com/csduarte), [dmeza](https://github.com/dmeza), [enahum](https://github.com/enahum), [esethna](https://github.com/esethna), [gajananpp](https://github.com/gajananpp), [GitHubJasper](https://github.com/GitHubJasper), [gnufede](https://github.com/gnufede), [grundleborg](https://github.com/grundleborg), [hmhealey](https://github.com/hmhealey), [icelander](https://github.com/icelander), [it33](https://github.com/it33), [james-mm](https://github.com/james-mm), [jasonblais](https://github.com/jasonblais), [jespino](https://github.com/jespino), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [koxen](https://github.com/koxen), [letsila](https://github.com/letsila), [lieut-data](https://github.com/lieut-data), [lindalumitchell](https://github.com/lindalumitchell), [lindy65](https://github.com/lindy65), [mkraft](https://github.com/mkraft), [moonmeister](https://github.com/moonmeister), [MusikPolice](https://github.com/MusikPolice), [panditsavitags](https://github.com/panditsavitags), [philippe-granet](https://github.com/philippe-granet), [pichouk](https://github.com/pichouk), [qichengzx](https://github.com/qichengzx), [Rudloff](https://github.com/Rudloff), [R-Wang97](https://github.com/R-Wang97), [saturninoabril](https://github.com/saturninoabril), [stanchan](https://github.com/stanchan), [stephenkiers](https://github.com/stephenkiers), [sudheerDev](https://github.com/sudheerDev), [svelle](https://github.com/svelle), [tejasbubane](https://github.com/tejasbubane), [thePanz](https://github.com/thePanz), [timconner](https://github.com/timconner), [tomo667a](https://github.com/tomo667a), [Vorlif](https://github.com/Vorlif), [yuya-oc](https://github.com/yuya-oc)

## Release v4.8 - Feature Release

 - **v4.8.2, released 2018-06-04**
   - Mattermost v4.8.2 contains a moderate severity security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
 - **v4.8.1, released 2018-04-09**
   - Mattermost v4.8.1 contains multiple security fixes ranging from low to high severity. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
   - Fixed a performance issue by removing the `DisplayName` index on the Channels table.
 - **v4.8.0, released 2018-03-16**
   - Original 4.8.0 release

### Security Update

- Mattermost v4.8.0 contains multiple security fixes ranging from low to high severity. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

### Highlights

#### Enhanced compatibility with CloudFront

 - Added support for configuring CloudFront to host Mattermost's static assets.
 - Allows for improved caching performance and shorter load times for those members of your team geographically distributed throughout the world.

#### SAML Migration Command  ([Enterprise Edition E20](https://mattermost.com/pricing-self-managed/))

 - Added a CLI command to easily migrate users to SAML.

### Improvements

#### Web User Interface
 - Added a web app build hash to About Mattermost dialog to tell what version of the web app is being used.
 - Switched search bar to a button in tablet view, to increase how much space is available in the channel header.

#### Performance
 - Reduced load times by optimizing database queries and WebSocket events destined for a single user.
 - Created an iOS endpoint that enables users to upload files larger than 20MB.
 - Improved caching of `getRootPosts` call.

#### 508 Compliance
 - Added alt attribute to profile pictures.

#### Integrations
 - Updated incoming webhooks to accept multipart/form-data content type such as that supplied by `curl -F`.

#### Notifications
 - A system message is now posted when a channel is moved between teams by the CLI command.

#### Authentication
 - Reduced OAuth SSO login errors by falling back to a constructed URL if Site URL is blank.

#### System Console
 - Removed plugin upload setting from System Console UI and prevented switching the setting from the API.
 - Added paging to system console log viewer and set default value of `per_paging` for logs to 1000.

### Bug Fixes
 - Fixed an issue where sidebar unreads text setting was ignored in custom theme.
 - Fixed an issue where emoji picker had an empty line at the bottom of the list.
 - Fixed an issue with Markdown help wrapping on a second line in Edit Message dialog.
 - Fixed an issue where after leaving last team the "Logout" link did nothing.
 - Fixed an issue where focus was sometimes wrong on delete post modal.
 - Fixed an issue where the bulk import tool didn't force Town Square membership.
 - Fixed duplicate calls of the "view" request when switching channels.
 - Fixed an issue where channel name was included in push notifications if someone posted only files with Push Notification Contents set to not include channel name.
 - Fixed an issue where attempting to preview an attached document failed to finish "loading" if the file extension didn't match the actual file type.
 - Fixed an issue where focus was not set to input box after replying to a message in Classic Mobile App.
 - Fixed an issue where a username such as "user.name" gets a highlight only on "name" when @-icon is clicked.
 - Fixed an issue where the "More Unreads Above" indicator didn't always work.
 - Fixed an issue where IE11 posted placeholder from hidden textbox.
 - Fixed an issue where last channel was not remembered after refresh when switching teams.
 - Fixed an issue with no auto-focusing into input text when attaching a file in Classic Mobile App.
 - Fixed an issue with not being able to type with composed characters (e.g. CJK) in View Team Members modal and channel switcher.
 - Fixed an issue where insecure images were loaded by sending client before proxying.
 - Fixed an issue with sandboxing support for CentOS and Bosh.
 - Fixed an issue where JIRA plugin posts were not properly truncated.
 - Fixed an issue where tall/wide emojis appeared stretched in emoji picker.
 - Fixed an issue where web app could not be built if not in a git repository.
 - Fixed an issue where jumping to a search result did not always load the context posts.
 - Fixed an issue where edit box changed size on switching to markdown preview in some languages.

### Compatibility

#### Removed and Deprecated Features

 - All API v3 endpoints have been deprecated and are scheduled for removal in Mattermost v5.0.
 - An unused `ExtraUpdateAt` field will be removed from the channel model in Mattermost v5.0.
 - As Mattermost moves to a role-based permissions system in v4.9, a number of configuration settings will be migrated to roles in the database and changing their `config.json` values will no longer take effect. These permissions can still be modified by their respective System Console settings. The `config.json` settings to be migrated are:
   - RestrictPublicChannelManagement
   - RestrictPrivateChannelManagement
   - RestrictPublicChannelCreation
   - RestrictPrivateChannelCreation
   - RestrictPublicChannelDeletion
   - RestrictPrivateChannelDeletion
   - RestrictPrivateChannelManageMembers
   - EnableTeamCreation
   - EnableOnlyAdminIntegrations
   - RestrictPostDelete
   - AllowEditPost
   - RestrictTeamInvite
   - RestrictCustomEmojiCreation

For a list of past and upcoming deprecated features, [see our website](https://about.mattermost.com/deprecated-features/).

#### config.json

Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json`, or the System Console when available.

#### Changes to Team Edition and Enterprise Edition:

 - Under `ServiceSettings` in `config.json`:
    - Added `AllowCookiesForSubdomains`, to ensure that the domain parameter is set for cookies, which allows the browser to send the cookies to subdomains as well.
    - Added `WebsocketURL`, which allows the server to instruct clients where they should try to connect WebSockets to.
    - Changed `EnableAPIV3` setting to `false` for new installs, as all API v3 endpoints have been deprecated and are scheduled for removal in Mattermost v5.0.

### API Changes

 - It is required that any new integrations use API v4 endpoints. For more details, and for a complete list of available endpoints, see [https://api.mattermost.com/](https://api.mattermost.com/).
 - All API v3 endpoints have been deprecated and are scheduled for removal in Mattermost v5.0.

#### RESTful API v4 Changes

 - Updated `POST /files` to support requests with only the `channel_id` and `filename` defined as query parameters with the contents of a single file in the body of the request.

### Known Issues

 - Google login fails on the Classic mobile apps.
 - User can receive a video call from another browser tab while already on a call.
 - Jump link in search results does not always jump to display the expected post.
 - Status may sometimes get stuck as away or offline in High Availability mode with IP Hash turned off.
 - Searching stop words in quotes with Elasticsearch enabled returns more than just the searched terms.
 - Searching with Elasticsearch enabled may not always highlight the searched terms.
 - Team sidebar on desktop app does not update when channels have been read on mobile.
 - Channel scroll position flickers while images and link previews load.
 - Numbered lists can sometimes extend beyond the normal post area.
 - Slack import through the CLI fails if email notifications are enabled.
 - Push notifications don't always clear on iOS when running Mattermost in High Availability mode.
 - CTRL/CMD+U shortcut to upload a file doesn’t work on Firefox.

### Contributors

[Alexgoodman7](https://github.com/Alexgoodman7), [amyblais](https://github.com/amyblais), [AndersonWebStudio](https://github.com/AndersonWebStudio), [andruwa13](https://github.com/andruwa13), [asaadmahmood](https://github.com/asaadmahmood), [avasconcelos114](https://github.com/avasconcelos114), [billybrown1](https://github.com/billybrown1), [ccbrown](https://github.com/ccbrown), [chumbalum](https://github.com/chumbalum), [cometkim](https://github.com/cometkim), [CoolTomatos](https://github.com/CoolTomatos), [coreyhulen](https://github.com/coreyhulen), [cpanato](https://github.com/cpanato), [crspeller](https://github.com/crspeller), [csduarte](https://github.com/csduarte), [enahum](https://github.com/enahum), [esethna](https://github.com/esethna), [GitHubJasper](https://github.com/GitHubJasper), [gnufede](https://github.com/gnufede), [grundleborg](https://github.com/grundleborg), [hmhealey](https://github.com/hmhealey), [icelander](https://github.com/icelander), [it33](https://github.com/it33), [james-mm](https://github.com/james-mm), [jasonblais](https://github.com/jasonblais), [jespino](https://github.com/jespino), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [kemenaran](https://github.com/kemenaran), [koxen](https://github.com/koxen), [leblanc-simon](https://github.com/leblanc-simon), [letsila](https://github.com/letsila), [lfbrock](https://github.com/lfbrock), [lieut-data](https://github.com/lieut-data), [lindalumitchell](https://github.com/lindalumitchell), [lindy65](https://github.com/lindy65), [lip-d](https://github.com/lip-d), [liusy182](https://github.com/liusy182), [lmikaellukerad](https://github.com/lmikaellukerad), [mkraft](https://github.com/mkraft), [moonmeister](https://github.com/moonmeister), [MusikPolice](https://github.com/MusikPolice), [pichouk](https://github.com/pichouk), [rqtaylor](https://github.com/rqtaylor), [saturninoabril](https://github.com/saturninoabril), [stanchan](https://github.com/stanchan), [stephenkiers](https://github.com/stephenkiers), [tejasbubane](https://github.com/tejasbubane), [thePanz](https://github.com/thePanz), [torgeirl](https://github.com/torgeirl), [Vaelor](https://github.com/Vaelor), [vordimous](https://github.com/vordimous), [XinyueWang94](https://github.com/XinyueWang94), [yuya-oc](https://github.com/yuya-oc)

## Release v4.7 - Feature Release

 - **v4.7.4, released 2018-04-09**
   - Mattermost v4.7.4 contains multiple security fixes ranging from low to high severity. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
   - Fixed a performance issue by removing the `DisplayName` index on the Channels table.
 - **v4.7.3, released 2018-03-09**
   - Mattermost v4.7.3 contains a moderate severity security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
 - **v4.7.2, released 2018-02-23**
   - Fixed an issue where message attachments didn’t render emojis.
   - Fixed an issue where channels with a name 26 characters long were inaccessible with a 404 error.
   - Fixed “We couldn’t get the emoji” server log messages.
   - Fixed an issue with being unable to switch to direct or group message channels via CTRL/CMD+K channel switcher or via “msg/groupmsg” slash commands.
   - Fixed an issue where clicking on "Send Message" from a user's profile popover redirected to Town Square instead of the user's direct message channel.
   - Fixed an issue where links to direct and group message channels opened in a new tab.
 - **v4.7.1, released 2018-02-20**
   - Fixed an issue with [compliance export](https://docs.mattermost.com/administration/compliance-export.html) outputs, resulting in `Failed to update ChannelMemberHistory table` error  messages in the log when a user joins or leaves a channel. Issue updates [posted here](https://mattermost.atlassian.net/browse/MM-9633).
 - **v4.7.0, released 2018-02-16**
   - Original 4.7.0 release

### Security Update

- Mattermost v4.7.0 contains multiple security fixes ranging from low to high severity. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

### Highlights

#### Client-Side Performance

 - Added user-based rate limiting, in addition to rate limiting API access by IP address.
 - Decreased page load time by loading custom emojis asynchronously rather than all on first page load.
 - Optimized channel autocomplete (~) query by returning client-side results immediately.
 - Decreased the size of most image assets by more than 25% by running `pngquant` to remove unnecessary metadata from PNGs.

#### Image Proxy Support

 - Image proxy servers increase performance through a layer of caching, and provide custom options to resize images.
 - Three new configuration keys, `ImageProxyType`, `ImageProxyURL`, `ImageProxyOptions`, ensure that posts served to the client will have their markdown modified such that all images are loaded through a proxy.

#### Updated Image Thumbnails

 - Updated the appearance of image thumbnails, so that single thumbnails will now expand to a larger preview without clicking the image to open the preview window.

#### Experimental Setting for Unreads Sidebar Section

 - Added an experimental setting to group unread channels in the channel sidebar. The setting [must first be enabled by the System Admin](https://docs.mattermost.com/administration/config-settings.html#group-unread-channels-experimental), by replacing `disabled` with either `default_off` or `default_on` in config.json.

### Improvements

#### Web User Interface
 - Added a status icon in the channel member list and sorted it by user status.
 - Added ability to preview images found in link previews.
 - Added a `Copy Link` option for sidebar channels in the Desktop App.
 - Added focus on the text box after hitting "Edit" on Account Settings options.
 - Improved formatting of quotes in the channel header.
 - Added a date separator for search results.
 - Channel names are now sorted correctly in the left-hand-side by taking non-alphabetical characters into consideration (e.g. brackets, hash sign, etc.)

 #### Integrations
 - Added username and profile picture to incoming webhook set up pages.
 - Added support for Slack attachments in outgoing webhook responses.

#### Emoji Picker
 - Added the ability to navigate emoji picker with the keyboard.
 - Added paging and search of custom emojis to webapp emoji picker.

#### Channels
 - Users are directed to the last channel they viewed in a team when switching to that team.
 - Changed URLs of Direct Messages to use the form of `https://servername.com/messages/@username`, letting users open a direct message with each other via URL.

#### Notifications
 - Added a system message when a team is changed from public to private.

#### Plugins (Beta)
 - Zoom plugin now supports on-premise Zoom servers.

#### Enterprise Edition
- Increased max length of `User.Position` field to 128 characters to meet LDAP max length.
- Increased OAuth state parameter limit. Some systems may send a state longer than 128 characters.

### Bug Fixes
 - Fixed an issue where OAuth account creation error page was unformatted.
 - Fixed tab and alt-tab keyboard navigation for links on sign-in page.
 - Fixed an issue where plugin slash commands didn't override username or icon.
 - Fixed an issue where pagination for team members modal showed a next button when there are no more users to show.
 - Fixed an issue where at-channel in `/header` should not trigger confirmation modal.
 - Fixed an issue where auto-generated SAML Service provider login URL had two slashes instead of one.
 - Fixed an issue where no unread mention appeared on non-mobile platform after receiving push notification.
 - Fixed an issue where the text box was hidden by the keyboard when replying to a post in mobile view.
 - Fixed username autocomplete not working with mixed cases.
 - Fixed not being able to type Korean quickly in some dialogs.
 - Fixed an issue where notification preference settings didn't respect case sensitivity for mention highlighting.
 - Fixed where, after an ephemeral message, couldn't use `+:emoji:` to react to the previous message.
 - Fixed Mattermost not loading on Firefox if the `media.peerconnection.enabled` setting in Firefox is set to false.
 - Fixed login screen sometimes flashing before Mattermost server loads.
 - Fixed an issue where bot messages from the Zoom plugin ignored the Zoom API URL field for on-prem Zoom servers.
 - Disabled pull-to-refresh feature on Android (Chrome) to prevent unwanted page refresh.
 - Fixed an issue where clicking `Save` in `Rename Channel` modal without changes did nothing.
 - Fixed emoji picker search being case-sensitive.
 - Fixed timestamp not being clickable in desktop mobile view.
 - Fixed an issue where deleting a team via the API broke the web user interface.

### Compatibility

#### Removed and Deprecated Features

- All API v3 endpoints have been deprecated, and scheduled for removal in Mattermost v5.0.
- The `mentionKeys` prop in post type plugins is now removed to fix case sensitive mention highlighting. Plugins can retrieve the `mentionKeys` prop from the store as needed.
- The permanent query parameter of the DELETE `/teams/{team_id}` APIv4 endpoint is not removed as previously announced, given customer and community feedback.
- As Mattermost moves to a role based permissions system in v4.8, a number of configuration settings will be migrated to roles in the database, and changing their `config.json` values will no longer take effect. These permissions can still be modified by their respective System Console settings. The `config.json` settings to be migrated are:
  - RestrictPublicChannelManagement
  - RestrictPrivateChannelManagement
  - RestrictPublicChannelCreation
  - RestrictPrivateChannelCreation
  - RestrictPublicChannelDeletion
  - RestrictPrivateChannelDeletion
  - RestrictPrivateChannelManageMembers
  - EnableTeamCreation
  - EnableOnlyAdminIntegrations
  - RestrictPostDelete
  - AllowEditPost
  - RestrictTeamInvite

For a list of past and upcoming deprecated features, [see our website](https://about.mattermost.com/deprecated-features/).

#### config.json

Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json`, or the System Console when available.

#### Changes to Team Edition and Enterprise Edition:

 - Under `ServiceSettings` in `config.json`:
    - Added `"ImageProxyType": ""`, `"ImageProxyOptions": ""`, and `"ImageProxyURL": ""` to ensure posts served to the client will have their markdown modified such that all images are loaded through a proxy.
    - Added `"ExperimentalGroupUnreadChannels": disabled` to show an unread channel section in the webapp sidebar. The setting must first be enabled by the System Admin, by replacing `disabled` with either `default_off` or `default_on`.
    - Added `"ExperimentalEnableDefaultChannelLeaveJoinMessages": true` that allows disabling of leave/join messages in the default channel, usually Town Square.
 - Under `RateLimitingSettings` in `config.json`:
    - Added `"VaryByUser": false`, a user-based rate limiting, to rate limit on token and on userID.

### API Changes

 - It is required that any new integrations use API v4 endpoints. For more details, and for a complete list of available endpoints, see [https://api.mattermost.com/](https://api.mattermost.com/).
 - All API v3 endpoints have been deprecated, and scheduled for removal in Mattermost v5.0.

#### RESTful API v4 Changes

 - Added `GetChannelByName` and `GetTeamByName` to auto lowercase team and channel names in API requests. This ensures that the channel name is automatically lowercased for endpoints taking team or channel names as URL parameters.
 - Added `POST /emoji/search`, `GET /emojis/name/{emoji_name}`, and `GET /emoji/autocomplete` to add consistency with user search/autocomplete endpoints. These API endpoints ensure that the benefits of `GET` for important performance related actions such as autocompleting are included.
 - Added `/users/tokens/search` to allow System Admin to be able to find, manage and revoke personal access tokens as needed. This endpoint gets all tokens for all users if one has the `manage_system` permission.

### WebSocket Event Changes

 - Added `delete_team` web socket event to notify client whenever a team is deleted (e.g. via API call).

### Database Changes

**Users Table:**

 - Increased size of `Position` field from 35 to 128 characters.

**OAuthAuthData Table:**

 - Increased size of `State` field from 128 to 1024 characters.

**ChannelMemberHistory Table:**

 - Removed `Email` column.
 - Removed `Username` column.

### Known Issues

- Google login fails on the Classic mobile apps.
- User can receive a video call from another browser tab while already on a call.
- Jump link in search results does not always jump to display the expected post.
- Status may sometimes get stuck as away or offline in High Availability mode with IP Hash turned off.
- Searching stop words in quotes with Elasticsearch enabled returns more than just the searched terms.
- Searching with Elasticsearch enabled may not always highlight the searched terms.
- Team sidebar on desktop app does not update when channels have been read on mobile.
- Channel scroll position flickers while images and link previews load.
- CTRL/CMD+U shortcut to upload a file doesn't work on Firefox.
- Numbered lists can sometimes extend beyond the normal post area.
- Slack import through the CLI fails if email notifications are enabled.
- Push notifications don't always clear on iOS when running Mattermost in High Availability mode.
- `[WARN] plugin sandboxing is not supported. plugins will run with the same access level as the server` log message is created when sandboxing isn't enabled for plugins. If you don't use plugins, you can ignore this message. If you have plugins enabled, [learn how to enable sandboxing](https://developers.mattermost.com/extend/plugins/security/#sandboxing).

### Contributors

[amyblais](https://github.com/amyblais), [AndersonWebStudio](https://github.com/AndersonWebStudio), [andruwa13](https://github.com/andruwa13), [asaadmahmood](https://github.com/asaadmahmood), [bbodenmiller](https://github.com/bbodenmiller), [Brunzer](https://github.com/Brunzer), [ccbrown](https://github.com/ccbrown), [chclaus](https://github.com/chclaus), [cherniavskii](https://github.com/cherniavskii), [CometKim](https://github.com/CometKim), [coreyhulen](https://github.com/coreyhulen), [cpanato](https://github.com/cpanato), [crspeller](https://github.com/crspeller), [csduarte](https://github.com/csduarte), [cvitter](https://github.com/cvitter), [darkman](https://github.com/darkman), [der-test](https://github.com/der-test), [dlahn](https://github.com/dlahn), [enahum](https://github.com/enahum), [esethna](https://github.com/esethna), [fermulator](https://github.com/fermulator), [gig177](https://github.com/gig177), [grundleborg](https://github.com/grundleborg), [Hanzei](https://github.com/Hanzei), [hmhealey](https://github.com/hmhealey), [it33](https://github.com/it33), [james-mm](https://github.com/james-mm), [jarredwitt](https://github.com/jarredwitt), [jasonblais](https://github.com/jasonblais), [jespino](https://github.com/jespino), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [kemenaran](https://github.com/kemenaran), [knechtionscoding](https://github.com/knechtionscoding), [laginha87](https://github.com/laginha87), [lasley](https://github.com/lasley), [letsila](https://github.com/letsila), [lfbrock](https://github.com/lfbrock), [lieut-data](https://github.com/lieut-data), [lindalumitchell](https://github.com/lindalumitchell), [lindy65](https://github.com/lindy65), [liusy182](https://github.com/liusy182), [Matterchen](https://github.com/Matterchen), [mkraft](https://github.com/mkraft), [MusikPolice](https://github.com/MusikPolice), [phuihock](https://github.com/phuihock), [pichouk](https://github.com/pichouk), [Rohlik](https://github.com/Rohlik), [R-Wang97](https://github.com/R-Wang97), [santos22](https://github.com/santos22), [saturninoabril](https://github.com/saturninoabril), [stephenkiers](https://github.com/stephenkiers), [sudheerDev](https://github.com/sudheerDev), [tayre](https://github.com/tayre), [tejasbubane](https://github.com/tejasbubane), [tkbky](https://github.com/tkbky), [Tristramg](https://github.com/Tristramg), [ulm0](https://github.com/ulm0), [watadarkstar](https://github.com/watadarkstar), [xuxip](https://github.com/xuxip), [yeoji](https://github.com/yeoji), [yuya-oc](https://github.com/yuya-oc)

## Release v4.6 - Feature Release

 - **v4.6.3, release date 2018-04-09**
   - Mattermost v4.6.3 contains a low severity security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
 - **v4.6.2, release date 2018-02-23**
   - Mattermost v4.6.2 contains multiple security fixes ranging from low to high severity. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
 - **v4.6.1, release date 2018-01-30**
   - Fixed an issue where Let's Encrypt certificates were broken on Mattermost servers. The cache will be deleted upon upgrade so your certificate will be immediately renewed. Moreover, port 80 must be forwarded through a firewall, with [Forward80To443](https://docs.mattermost.com/administration/config-settings.html#forward-port-80-to-443) `config.json` setting set to `true`, to complete the Let's Encrypt certification.
 - **v4.6.0, released 2018-01-16**
   - Original 4.6.0 release

### Highlights

#### Client-Side Performance

- Decreased channel switching time up to 45% by reducing post mounting time.
- Decreased up to 85% of the memory retained following a channel switch by fixing memory leaks of the `post_time.jsx` component.
- Decreased size of the most used icons and logos by 70-80% by running `pngquant` to remove unnecessary metadata from PNGs.

### Improvements

#### Web User Interface

- Added a loading indicator while pinned posts and flagged posts lists are loading.
- Added a loading indicator to MFA sign in button.
- Added a tooltip for the '+' button when adding emoji reactions.
- Channel switcher (CTRL/CMD+K) now filters by usernames, full names and nicknames.
- Channel links are now rendered in the channel header.
- File names are now shown in attachment previews.

#### Plugins (Beta)

- Plugins now support slash commands.

#### Notifications

- Updated default notification settings for new accounts to provide a better onboarding experience. Each of these can be configured in Account Settings. In particular, the updated default settings include:
   - Desktop notifications only sent for mentions and direct messages.
   - Mobile push notifications only sent when the user is away or offline, not when online.
   - Mentions of the user's first name doesn't trigger mentions.

#### 508 Compliance

- Default language is now declared in HTML for Mattermost webpages.
- Position of status indicators and reply icons updated when no CSS is rendered.
- Use programmatically identifiable headings for team and channel name.

#### Administration

- Incoming webhook display name is now included in the post.Props field for better auditing.
- System Admins can now reset their own password from the System Console users list.

### Bug Fixes

- Username updates are now immediately visible across all browser tabs.
- Server logs no longer contain info messages about initializing plugins when plugins are disabled.
- Fixed Mattermost not loading on Firefox v52.
- Fixed issues with user at-mention autocomplete when using Tab multiple times.
- Fixed an issue where typing an emoji reaction didn't add it to recently used emojis list.
- OAuth and SAML users can now be deactivated from the Mattermost System Console, assuming they are also deactivated in the SSO provider.
- Fixed email address validation for Microsoft Outlook formatted email addresses.
- Fixed an issue where posts sometimes didn't send on iOS Classic app.
- Team name can no longer be edited to be only one character long.
- Editing a message to remove all text no longer deletes the message if it contains a file attachment.
- Fixed an issue where searching for a channel using the second or third word in the name didn't work.
- Other users no longer see deleted GIF previews in reply threads.
- Fixed an issue where channels with Japanese or Cyrillic characters couldn't be created.
- Fixed timestamp minute display for Zoom plugins.
- Fixed an issue where page would load infinitely when trying to join a team with maximum capacity.
- Fixed an issue where channel notification preferences reverted to defaults after updating preferences in one of the channels.

### Compatibility

#### Removed and Deprecated Features

- All API v3 endpoints are now deprecated, and scheduled for removal in Mattermost v5.0.
- The permanent query parameter of the DELETE `/teams/{team_id}` APIv4 endpoint for permanently deleting a team is scheduled for removal in Mattermost v4.7.

For a list of past and upcoming deprecated features, [see our website](https://about.mattermost.com/deprecated-features/).

#### config.json

Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json`, or the System Console when available.

**Changes to Team Edition and Enterprise Edition**:

- Under `ServiceSettings` in `config.json`:
  - Added `"EnableTutorial": true` to control whether tutorial is shown to end users after account creation. This setting is experimental and may be replaced or removed in a future release.
- Under `TeamSettings` in `config.json`:
  - Added `"ExperimentalPrimaryTeam": ""` to set the primary team of the server. This setting is experimental and may be replaced or removed in a future release.
- Under `EmailSettings` in `config.json`:
  - Added `"LoginButtonColor": ""`, `"LoginButtonBorderColor": ""` and `"LoginButtonTextColor": ""` to set the style of the email login button for white labelling purposes.

**Additional Changes to Enterprise Edition**:

- Under `LdapSettings` in `config.json`:
  - Added `"LoginButtonColor": ""`, `"LoginButtonBorderColor": ""` and `"LoginButtonTextColor": ""` to set the style of the LDAP login button for white labelling purposes.
- Under `SamlSettings` in `config.json`:
  - Added `"LoginButtonColor": ""`, `"LoginButtonBorderColor": ""` and `"LoginButtonTextColor": ""` to set the style of the SAML login button for white labelling purposes.

### API Changes

- It is required that any new integrations use API v4 endpoints. For more details, and for a complete list of available endpoints, see [https://api.mattermost.com/](https://api.mattermost.com/).
- All API v3 endpoints are now deprecated, and scheduled for removal in Mattermost v5.0.
- The permanent query parameter of the DELETE `/teams/{team_id}` APIv4 endpoint for permanently deleting a team is scheduled for removal in Mattermost v4.7.

#### RESTful API v4 Changes

- Added `/users/{user_id}/auth` to update a user's authentication method. This can be used to change them to/from LDAP authentication, for example.

#### Plugin API Changes (Beta)

- Added `RegisterCommand` to register a custom slash command. When the command is triggered, your plugin can fulfil it via the `ExecuteCommand` hook.
- Added `UnregisterCommand` to unregister a command previously registered via `RegisterCommand`.
- Added `GetChannelMember` to get a channel membership for a user.

#### Plugin Hook Changes (Beta)

- Added `ExecuteCommand` hook to execute a command that was previously registered via the `RegisterCommand` plugin API.

### Database Changes

**IncomingWebhooks Table:**
- Renamed `PostUsername` column to `Username`.
- Renamed `PostIconURL` column to `IconURL`.

### Known Issues

- Google login fails on the Classic mobile apps.
- User can receive a video call from another browser tab while already on a call.
- Jump link in search results does not always jump to display the expected post.
- Status may sometimes get stuck as away or offline in High Availability mode with IP Hash turned off.
- Searching stop words in quotes with Elasticsearch enabled returns more than just the searched terms.
- Searching with Elasticsearch enabled may not always highlight the searched terms.
- Team sidebar on desktop app does not update when channels have been read on mobile.
- Channel scroll position flickers while images and link previews load.
- CTRL/CMD+U shortcut to upload a file doesn't work on Firefox.
- Numbered lists can sometimes extend beyond the normal post area.
- Slack import through the CLI fails if email notifications are enabled.
- Letters are skipped in a few dialogs when using Korean keyboard in IE11.
- Push notifications don't always clear on iOS when running Mattermost in High Availability mode.
- Deleting a team via the API breaks the user interface.
- Bot messages from the Zoom plugin ignore the Zoom API URL field for on-prem Zoom servers.

### Contributors

- [amyblais](https://github.com/amyblais), [AndersonWebStudio](https://github.com/AndersonWebStudio), [asaadmahmood](https://github.com/asaadmahmood), [ccbrown](https://github.com/ccbrown), [coreyhulen](https://github.com/coreyhulen), [cpanato](https://github.com/cpanato), [crspeller](https://github.com/crspeller), [csduarte](https://github.com/csduarte), [cvitter](https://github.com/cvitter), [dlahn](https://github.com/dlahn), [enahum](https://github.com/enahum), [esethna](https://github.com/esethna), [g3d](https://github.com/g3d), [grundleborg](https://github.com/grundleborg), [hmhealey](https://github.com/hmhealey), [it33](https://github.com/it33), [james-mm](https://github.com/james-mm), [jarredwitt](https://github.com/jarredwitt), [jespino](https://github.com/jespino), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [letsila](https://github.com/letsila), [lfbrock](https://github.com/lfbrock), [lieut-data](https://github.com/lieut-data), [lindalumitchell](https://github.com/lindalumitchell), [lindy65](https://github.com/lindy65), [lisakycho](https://github.com/lisakycho), [liusy182](https://github.com/liusy182), [LordVeovis](https://github.com/LordVeovis), [Matterchen](https://github.com/Matterchen), [mkraft](https://github.com/mkraft), [MusikPolice](https://github.com/MusikPolice), [panditsavitags](https://github.com/panditsavitags), [pichouk](https://github.com/pichouk), [pixelbrackets](https://github.com/pixelbrackets), [pruthvip](https://github.com/pruthvip), [R-Wang97](https://github.com/R-Wang97), [saturninoabril](https://github.com/saturninoabril), [skvale](https://github.com/skvale), [stephenkiers](https://github.com/stephenkiers), [sudheerDev](https://github.com/sudheerDev), [sumantro93](https://github.com/sumantro93), [tayre](https://github.com/tayre), [tborg](https://github.com/tborg), [tejasbubane](https://github.com/tejasbubane), [watadarkstar](https://github.com/watadarkstar), [yuya-oc](https://github.com/yuya-oc)

## Release v4.5 - Feature Release

 - **v4.5.2, release date 2018-02-23**
   - Mattermost v4.5.2 contains multiple security fixes ranging from low to high severity. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
 - **v4.5.1, released 2018-01-16**
   - Fixed an issue where Mattermost wouldn't load on certain versions of Firefox, including v52-54 and v57 in private mode.
 - **v4.5.0, released 2017-12-16**
   - Original 4.5.0 release

### Highlights

#### Zoom Plugin (Beta)

- [Zoom](https://www.zoom.us/) video calling and screensharing plugin. Learn more [here](https://docs.mattermost.com/integrations/zoom.html).
- Manage plugins from the **System Console > Plugins (Beta)** section.

#### Actiance Support (Beta) ([Enterprise Edition E20](https://mattermost.com/pricing-self-managed/) Add-On)

- Compliance export support for [Actiance](https://www.actiance.com/) as a compliance solution. Learn more [here](https://about.mattermost.com/default-compliance-export-documentation).
- Access compliance export from the **System Console > Advanced > Compliance Export (Beta)**.

### Improvements

#### Web User Interface
- `CTRL/CMD` + `/` now toggles the keyboard shortcuts dialog.
- Link previews now appear in the right-hand side in comment threads.
- Timestamp permalinks now open in the current view on desktop and browser.
- Pinned posts are now sorted newest to oldest.
- Updated markdown to better handle non-Latin characters in URLs.
- Added WebRTC call icon to desktop mobile view header.
- Added a '+' sign to quickly add emoji reactions to a post.
- Added support for different emoji skintones.
- Added inline playback for GIF attachments.

#### Integrations

- Added an option for an outgoing webhook to reply to the posted message as a comment.
- JIRA plugin is now bundled as a pre-packaged plugin manageable from the System Console > Plugins > Management.
- Added support for mentions with <@userid>, <!channel>, <!all> and <!here> in webhook posts.
- Personal access tokens can now be temporarily deactivated in the Account Settings.

#### Channels

- Direct Message channels with deactivated users are now hidden in the sidebar and can be reopened from the **More...**  Direct Messages list.
- You can now open a direct message channel with yourself.

#### Notifications

- Removed unnecessary log messages posted when pending email notifications are deleted because a user comes online before the batch is sent.
- Desktop notification icon has been updated on Edge browsers.

#### Keyboard Shortcuts

- Added a `/groupmsg` command to start a new group message channel.
- Added CTRL+SHIFT+L to set focus to the message input box.

#### System Console

- Added a confirm modal to the Data Retention settings page.
- Added settings pages for uploading and managing plugins in the System Console > Plugins (Beta) section.
- Added the ability to revoke a user's sessions from the System Console.

### Bug Fixes

- Closing a direct or group message channel no longer purges channel preferences.
- Users no longer get a blank page after hitting "x" on a deleted message in permalink view.
- Fixed an issue where `AmazonS3Region` defaults to us-east-1 regardless of the value input.
- Channel links render as expected when linking to a channel that the current user does not belong to.
- Uppercase letter is no longer required for a password if the password requirement is set to at least 5 characters and a number.
- Profile image updates are now visible in other active clients and the right-hand side after the change.
- Plugins can no longer be uploaded if they have the same plugin ID.
- Creating a channel with a name including a reserved word no longer breaks the user interface.
- Fixed the AD/LDAP Test Connection button.
- Fixed an issue causing `invalid or expired session` server logs.
- Removed a duplicate error message on the login page after a password reset.
- Fixed an issue where the OAuth ClientID and Secret values were missing after setup.
- Emoji picker now works when the right-hand side is expanded.
- Error messages in the System Console user list no longer breaks the user interface.
- Fixed an issue where only System Admins could edit OAuth apps even if integration creation was not restricted to admins.
- Fixed an issue where "New messages v" bubble didn't always clear in a fresh direct message channel.
- Fixed channel preferences not restoring after closing and reopening a direct or group message channel.

### Compatibility

#### Removed and Deprecated Features
- All APIv3 endpoints are scheduled for removal on January 16, 2018.

For a list of past and upcoming deprecated features, [see our website](https://about.mattermost.com/deprecated-features/).

#### config.json

Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json`, or the System Console when available.

**Changes to Team Edition and Enterprise Edition**:

- Under `ServiceSettings` in `config.json`:
  - Added `"EnablePreviewFeatures": true` to hide the **Advanced** > **Preview re-release features** section from Account Settings.
  - Added `"CloseUnusedDirectMessages": false` to hide inactive direct message channels from the sidebar.
  - Added `"ExperimentalEnableAuthenticationTransfer": true` to set whether users can change authentication methods.
- Under `EmailSettings` in `config.json`:
  - Added `"UseChannelInEmailNotifications": false` to set whether email notifications contain the channel name in the subject line.
- Under `PluginSettings` in `config.json`:
  - Added `"ClientDirectory": "./client/plugins"` to set the location of client plugins.

**Additional Changes to Enterprise Edition**:

- Added `MessageExportSettings` in `config.json`:
  - Added `"EnableExport": false` to enable message export.
  - Added `"DailyRunTime": "01:00"` to set the time for the daily export job.
  - Added `"ExportFromTimestamp": 0` to set the timestamp for which posts to include in the message export.
  - Added `"FileLocation": "export"` to set the message export location.
  - Added `"BatchSize": 10000` to set how many new posts are batched together to a compliance export file.

### API v4 Changes

- It is recommended that any new integrations use API v4 endpoints. For more details, and for a complete list of available endpoints, see [https://api.mattermost.com/](https://api.mattermost.com/).
- All API v3 endpoints are scheduled for removal on January 16, 2018.

### Known Issues

- Google login fails on the Classic mobile apps.
- User can receive a video call from another browser tab while already on a call.
- Jump link in search results does not always jump to display the expected post.
- Status may sometimes get stuck as away or offline in High Availability mode with IP Hash turned off.
- Searching stop words in quotes with Elasticsearch enabled returns more than just the searched terms.
- Searching with Elasticsearch enabled may not always highlight the searched terms.
- Team sidebar doesn't always show unreads from other teams on first load.
- Team sidebar on desktop app does not update when channels have been read on mobile.
- System Admin cannot reset their own password via the System Console.
- Channel scroll position flickers while images and link previews load.
- CTRL/CMD+U shortcut to upload a file doesn't work on Firefox.
- Profile pictures and usernames don't immediately update across tabs or in the right-hand side comment threads.
- Numbered lists can sometimes extend beyond the normal post area.
- Typing an emoji reaction does not add it to recently used emojis.
- Server logs contain messages about initializing plugins even when plugins are disabled.

### Contributors

/mattermost-webapp

- [asaadmahmood](https://github.com/asaadmahmood), [avasconcelos114](https://github.com/avasconcelos114), [ccbrown](https://github.com/ccbrown), [CometKim](https://github.com/CometKim), [coreyhulen](https://github.com/coreyhulen), [cpanato](https://github.com/cpanato), [crspeller](https://github.com/crspeller), [csduarte](https://github.com/csduarte), [deveshjadon98](https://github.com/deveshjadon98), [enahum](https://github.com/enahum), [fraziern](https://github.com/fraziern), [grundleborg](https://github.com/grundleborg), [h2oloopan](https://github.com/h2oloopan), [hmhealey](https://github.com/hmhealey), [jasonblais](https://github.com/jasonblais), [jespino](https://github.com/jespino), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [KishoreFartiyal](https://github.com/KishoreFartiyal), [lfbrock](https://github.com/lfbrock), [mikelinden1](https://github.com/mikelinden1), [mkraft](https://github.com/mkraft), [MusikPolice](https://github.com/MusikPolice), [QuantumKing](https://github.com/QuantumKing), [rickbatka](https://github.com/rickbatka), [R-Wang97](https://github.com/R-Wang97), [santos22](https://github.com/santos22), [saturninoabril](https://github.com/saturninoabril), [sudheerDev](https://github.com/sudheerDev), [tkbky](https://github.com/tkbky), [yth0625](https://github.com/yth0625)

/mattermost-plugin-zoom

- [crspeller](https://github.com/crspeller), [jwilander](https://github.com/jwilander)

/mattermost-server

- [amyblais](https://github.com/amyblais), [ccbrown](https://github.com/ccbrown), [coreyhulen](https://github.com/coreyhulen), [cpanato](https://github.com/cpanato), [cpfeiffer](https://github.com/cpfeiffer), [crspeller](https://github.com/crspeller), [csduarte](https://github.com/csduarte), [enahum](https://github.com/enahum), [grundleborg](https://github.com/grundleborg), [hmhealey](https://github.com/hmhealey), [jasonblais](https://github.com/jasonblais), [jespino](https://github.com/jespino), [jwilander](https://github.com/jwilander), [letsila](https://github.com/letsila), [lindalumitchell](https://github.com/lindalumitchell), [mkraft](https://github.com/mkraft), [mogul](https://github.com/mogul),
[MusikPolice](https://github.com/MusikPolice), [yeoji](https://github.com/yeoji)

/mattermost-mobile

- [cpfeiffer](https://github.com/cpfeiffer), [csduarte](https://github.com/csduarte), [enahum](https://github.com/enahum), [hmhealey](https://github.com/hmhealey), [jarredwitt](https://github.com/jarredwitt), [lfbrock](https://github.com/lfbrock), [mkraft](https://github.com/mkraft)

/docs

- [amyblais](https://github.com/amyblais), [bbodenmiller](https://github.com/bbodenmiller), [ccbrown](https://github.com/ccbrown), [comharris](https://github.com/comharris), [esethna](https://github.com/esethna), [grundleborg](https://github.com/grundleborg), [hmhealey](https://github.com/hmhealey), [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais),
[jespino](https://github.com/jespino), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [lfbrock](https://github.com/lfbrock), [lindalumitchell](https://github.com/lindalumitchell), [lindy65](https://github.com/lindy65), [mkdbns](https://github.com/mkdbns), [mkraft](https://github.com/mkraft), [saturninoabril](https://github.com/saturninoabril)

/mattermost-docker

- [andruwa13](https://github.com/andruwa13), [muffl0n](https://github.com/muffl0n), [pichouk](https://github.com/pichouk), [xcompass](https://github.com/xcompass)

/mattermost-load-test

- [ccbrown](https://github.com/ccbrown), [crspeller](https://github.com/crspeller), [jasonblais](https://github.com/jasonblais)

/mattermost-redux

- [brettmc](https://github.com/brettmc), [ccbrown](https://github.com/ccbrown), [csduarte](https://github.com/csduarte), [enahum](https://github.com/enahum), [hmhealey](https://github.com/hmhealey), [jespino](https://github.com/jespino), [jwilander](https://github.com/jwilander), [mkraft](https://github.com/mkraft), [sudheerDev](https://github.com/sudheerDev)

/mattermost-developer-documentation

- [ccbrown](https://github.com/ccbrown), [coreyhulen](https://github.com/coreyhulen), [crspeller](https://github.com/crspeller), [jwilander](https://github.com/jwilander), [MusikPolice](https://github.com/MusikPolice)

/mattermost-plugin-jira

- [ccbrown](https://github.com/ccbrown)

/mattermost-webrtc

- [enahum](https://github.com/enahum)

/desktop

- [dmeza](https://github.com/dmeza), [jasonblais](https://github.com/jasonblais), [yuya-oc](https://github.com/yuya-oc)

/mattermost-kubernetes

- [cpanato](https://github.com/cpanato)

/mattermost-selenium

- [lindalumitchell](https://github.com/lindalumitchell)

/mattermost-api-reference

- [grundleborg](https://github.com/grundleborg), [jasonblais](https://github.com/jasonblais), [jwilander](https://github.com/jwilander), [saturninoabril](https://github.com/saturninoabril)

/mattermost-ios-classic

- [coreyhulen](https://github.com/coreyhulen)

/mattermost-developer-kit

- [jwilander](https://github.com/jwilander)

/mattermost-build

- [crspeller](https://github.com/crspeller), [mthornba](https://github.com/mthornba)

/marked

- [hmhealey](https://github.com/hmhealey)

## Release v4.4.5 - Feature Release

 - **v4.4.5, release date 2017-12-11**
   - Mattermost v4.4.5 contains a medium severity security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
 - **v4.4.4, release date 2017-12-06**
   - Added a config.json setting, `ClientDirectory`, to set the directory to write web app plugins to. Added to better support plugins in GitLab Omnibus.
 - **v4.4.3, released 2017-12-05**
   - Fixed a medium level security issue affecting servers with [EnableOAuthServiceProvider](https://docs.mattermost.com/administration/config-settings.html#enable-oauth-2-0-service-provider) set to `true` and  [EnableOnlyAdminIntegrations](https://docs.mattermost.com/administration/config-settings.html#restrict-managing-integrations-to-admins) set to `false`. If you're affected, [upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
 - **v4.4.2, released 2017-11-23**
   - Fixed an issue where AD/LDAP accounts get deactivated following an AD/LDAP sync if their email address between the AD/LDAP server and Mattermost don't match case.
   - Fixed synchronization of SAML accounts with AD/LDAP.
   - Fixed AD/LDAP "Test Connection" button in the System Console not working when AD/LDAP login is disabled.
   - Fixed system messages not being translated into user's language set in **Account Settings > Display > Language**.
   - Fixed system messages about channel header updates sometimes being incorrectly formatted.
 - **v4.4.1, released 2017-11-16**
   - Fixed an upgrade issue where an alternative config file location via ``--config`` flag is ignored.
 - **v4.4.0, released 2017-11-16**
   - Original 4.4.0 release

### Highlights

#### Plugins (Beta)
- Beta release of Mattermost plugins, which allow admins to more easily integrate with third-party systems, extend functionality and customize the user interface of your Mattermost server. See [documentation](https://about.mattermost.com/default-plugins) to learn more.

#### Do Not Disturb Status
- Added "Do Not Disturb" status to temporarily turn off all desktop and mobile push notifications.

#### Support SAML sync via AD/LDAP ([Enterprise Edition E20](https://mattermost.com/pricing-self-managed/))
- Added support for periodically synchronizing SAML user attributes, including user deactivation and removal, from AD/LDAP. See [documentation](https://about.mattermost.com/default-saml-ldap-sync) to learn more.

### Improvements

#### Web User Interface
- Added an experimental feature to hide direct and group message channels after 7 days with no new messages. To enable it set `CloseUnusedDirectMessages` in `config.json` to `true`.
- Moved website previews out of beta, configurable in **Account Settings > Display**. Enable link previews in the [System Console](https://docs.mattermost.com/administration/config-settings.html#enable-link-previews).
- Made it easier to add a user to channel if mentioned user is not already a channel member.
- Added "Edit Account Settings" link to the bottom of your own profile popover to more easily edit your settings.
- URL address for internal links such as when hovering over the flag icon, is now hidden for better user experience.
- URL addresses for channels on the left-hand sidebar are now hidden on the desktop app.
- Added a loading spinner to Account Settings dialog after clicking the "Save" button.
- Added full date tooltip to post timestamps in right-hand sidebar and search results.
- Added "@" in front of the username field in user lists.

#### Performance
- Reduced load times by optimizing database queries and adding composite indexes for the `Posts` table.
- Prevented sessions from being stuck in cache by clearing the session cache if permission is denied.
- Improved Elasticsearch bulk indexing query performance.

#### Emoji Picker
- Added emoji picker to the Edit Message dialog.
- Removed categorization when searching for emojis in the emoji picker.

#### Integrations
- Added the ability to edit OAuth 2.0 applications.
- Added improvements for interactive message buttons, such as displaying your username in ephemeral messages triggered by the message buttons.

#### Slash Commands
- Added `/remove` and `/kick` slash commands to remove a user from the channel.

#### WebRTC Video and Audio Calls (Beta)
- When you have multiple browser tabs open and receive a video call, the ringtone stops in all tabs when you accept the call.
- Multiple STUN and TURN servers are now supported.

#### System Console
- Added a setting to disable channel wide (@-channel, @-all) mention confirmation in channels with more than five members.
- Admin now receives a prompt when leaving a System Console page with unsaved changes.

#### Elasticsearch ([Enterprise Edition E20](https://mattermost.com/pricing-self-managed/))
- Added support for batched live indexing for Elasticsearch.
- Added a configurable timeout for Elasticsearch requests.
- Added a table to Elasticsearch System Console page to monitor indexing jobs.
- Elasticsearch connection is now asynchronous so that a broken Elasticsearch server cannot block the startup of the Mattermost server.

### Bug Fixes
- Fixed mobile push notification settings not saving in the System Console.
- Fixes to channel link (~) autocomplete, such as not being able to autocomplete 'Town Square'.
- Fixed an issue where System Console was sometimes temporarily accessible after demoting a user to a member.
- Fixed failure to switch from email to SAML sign-in method if the user's email address has a plus sign.
- Fixed "More Channels" modal not showing the correct the page number when displaying search results.
- Fixed an incorrect error message when trying to add a user to a direct or group message channel via the APIs.
- Fixed an issue where downloading a file containing spaces didn't preserve the name.
- Fixed thumbnail image for .m4r file types.
- Fixed an issue where search in Manage Members dialog didn't update results when there were no matches.
- Fixed an issue where `in:` autocomplete for text search didn't display results after a hyphen in some servers.
- Fixed a missing "No results" screen for Elasticsearch text search.
- Fixed channel member count not updating until refresh when a user is added or removed.
- Fixed timestamp links on desktop app opening permalink view in a new app window.
- Fixed an error caused by creating a new direct message channel via the channel switcher (CTRL/CMD+K).
- Fixed SVG thumbnails not showing a preview.
- Fixed team sidebar showing unreads for deleted channels.
- Fixed a missing indicator when a message is pending but not yet sent.
- Fixed emoji autocomplete appearing when typing an emoticon like :-D.
- Fixed emoji names matching usernames triggering mentions.
- Fixed incorrect order of recent mentions when a hashtag is a word that triggers mentions.
- Fixed webhook message attachments longer than 8000 characters failing to post by truncating them, or splitting to multiple posts if the message has multiple attachments.
- Fixed `/msg` command arbitrarily switching teams.
- Fixed mentions not appearing linked in message drafts when in preview mode.
- Fixed an issue where an existing account could change their email address to one not in the [restricted domain list](https://docs.mattermost.com/administration/config-settings.html#restrict-account-creation-to-specified-email-domains).
- Fixed emoji reactions being added to system messages when using the `+:emoji:` command.
- Fixed an issue where message retention policy didn't work in Postgres databases if there were emoji reactions to delete.

### Compatibility

Composite database indexes were added to the `Posts` table. This may lead to longer upgrade times for servers with more than 1 million messages.

Moreover, LDAP sync now depends on email. If you have AD/LDAP login enabled, make sure all users on your AD/LDAP server have an email address or that their account is deactivated in Mattermost.

#### Removed and Deprecated Features
- All APIv3 endpoints are scheduled for removal on January 16, 2018.

For a list of past and upcoming deprecated features, [see our website](https://about.mattermost.com/deprecated-features/).

#### config.json

Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json`, or the System Console when available.

**Changes to Team Edition and Enterprise Edition**:

- Under `ServiceSettings` in `config.json`:
  - Added `"CloseUnusedDirectMessages": false` to set whether users have the option to automatically close direct and group message channels older than 7 days.
- Under `TeamSettings` in `config.json`:
  - Added `"EnableConfirmNotificationsToChannel": true` to set whether a confirmation is shown for channel wide (@-channel, @-all) mentions in channels with more than five members.
- Under `PluginSettings` in `config.json`:
  - Added `"Enable": true` to set whether plugins are enabled on the server.
  - Added `"EnableUploads": false` to set whether manual plugin uploads are enabled on the server. Disabling will keep existing plugins, including pre-packaged Mattermost plugins, installed on the server.
  - Added `"Directory": "./plugins"` to specify the directory of where plugins are stored.
  - Added `"Plugins": {}` to list installed plugins on the Mattermost server.
  - Added `"PluginStates": {}` to set whether an installed plugin is active or inactive on the Mattermost server.

**Additional Changes to Enterprise Edition**:

- Under `SamlSettings` in `config.json`:
  - Added `EnableSync: false` to set whether AD/LDAP synchronization is enabled.
- Under `LdapSettings` in `config.json`:
  - Added `EnableSyncWithLdap: false` to set whether SAML user attributes, including deactivation, are periodically synchronized from AD/LDAP.
- Under `ElasticsearchSettings` in `config.json`:
  - Added `"LiveIndexingBatchSize": 1` to set how many new posts are batched together before they are added to the Elasticsearch index.
  - Added `"RequestTimeoutSeconds": 30` to set the timeout in seconds for Elasticseaerch calls.
  - Added `"BulkIndexingTimeWindowSeconds": 3600` to set the maximum time window for a batch of posts being indexed by the Bulk Indexer.

### Database Changes

**Posts Table:**
- Added a composite index for `ChannelId, DeleteAt, CreateAt`
- Added a composite index for `ChannelId, UpdateAt`

**UserAccessTokens Table:**
- Added `IsActive` column

### API v4 Changes

- It is recommended that any new integrations use API v4 endpoints. For more details, and for a complete list of available endpoints, see [https://api.mattermost.com/](https://api.mattermost.com/).
- All API v3 endpoints are scheduled for removal on January 16, 2018.

**Added routes (API v4)**
- `POST` at `/users/token/enable`
  - Re-enables a personal access token that was previously disabled.
- `POST` at `/users/token/disable`
  - Disables a personal access token and deletes any sessions that uses the token. The token can be re-enabled using `/users/tokens/enable.`
- `POST` at `/users/{user_id}/sessions/revoke/all`
  - Revokes all user sessions from the provided user id and session id strings.
- `POST` at `/plugins`
  - Uploads a plugin in a compressed .tar.gz.
- `GET` at `/plugins`
  - Gets a list of active and inactive plugins.
- `DELETE` at `/plugins/{plugin_id}`
  - Removes a previously uploaded plugin.
- `POST` at `/plugins/{plugin_id}/activate`
  - Activates an installed plugin.
- `POST` at `/plugins/{plugin_id}/deactivate`
  - Deactivates an active plugin.
- `GET` at `/plugins/webapp`
  - Gets a list of plugin manifests for active plugins with webapp components.

**Modified routes (API v4)**
- `POST` at `/logs`
  - Unauthenticated users can now log ERROR or DEBUG messages when `ServiceSettings.EnableDeveloper` is set to `true`.

### Websocket Event Changes

**Added:**
- `user_role_updated` that occurs when a user role is updated.

### Known Issues

- Google login fails on the Classic mobile apps.
- User can receive a video call from another browser tab while already on a call.
- Jump link in search results does not always jump to display the expected post.
- Scrollbar is sometimes not visible in the left-hand sidebar after switching teams.
- Certain code block labels don't appear while scrolling on iOS mobile web.
- Deleted message doesn't clear unreads or unread mentions.
- Status may sometimes get stuck as away or offline in High Availability mode with IP Hash turned off.
- Searching stop words in quotes with Elasticsearch enabled returns more than just the searched terms.
- Searching with Elasticsearch enabled may not always highlight the searched terms.
- Channel links to channels that the current user does not belong to may not render correctly.
- Team sidebar doesn't always show unreads from other teams on first load.
- Uppercase letter is required for a password if the password requirement is set to at least 5 characters and a number.
- System Admin cannot reset their own password via the System Console.
- Channel scroll position flickers while images and link previews load.
- Closing a direct or group message channel, then re-opening later, doesn't restore channel preferences.
- CTRL/CMD+U shortcut to upload a file doesn't work on Firefox.
- Website previews are not displayed for comments on threads.
- User gets a blank page after hitting "x" on a deleted message in permalink view.
- Profile pictures don't immediately update across tabs or in the right-hand side comment threads.

### Contributors

/mattermost-webapp

- [asaadmahmood](https://github.com/asaadmahmood), [ccbrown](https://github.com/ccbrown), [cherealnice](https://github.com/cherealnice), [CometKim](https://github.com/CometKim), [coreyhulen](https://github.com/coreyhulen), [cpanato](https://github.com/cpanato), [crspeller](https://github.com/crspeller), [enahum](https://github.com/mattermost/enahum), [grundleborg](https://github.com/grundleborg), [hmhealey](https://github.com/hmhealey), [Hyeongmin-Kwon](https://github.com/Hyeongmin-Kwon), [jasonblais](https://github.com/jasonblais), [johncoleman83](https://github.com/johncoleman83), [jwilander](https://github.com/jwilander), [letsila](https://github.com/letsila), [longsleep](https://github.com/mattermost/longsleep), [maruTA-bis5](https://github.com/maruTA-bis5), [MusikPolice](https://github.com/MusikPolice), [R-Wang97](https://github.com/R-Wang97), [ryantm](https://github.com/ryantm), [santos22](https://github.com/mattermost/santos22), [saturninoabril](https://github.com/saturninoabril), [sudheerDev](https://github.com/sudheerDev), [tkbky](https://github.com/tkbky), [yeoji](https://github.com/yeoji), [Zapix](https://github.com/Zapix)

/docs

- [amyblais](https://github.com/amyblais), [asaadmahmood](https://github.com/asaadmahmood), [bbodenmiller](https://github.com/bbodenmiller), [ccbrown](https://github.com/ccbrown), [comharris](https://github.com/comharris), [coreyhulen](https://github.com/coreyhulen), [esethna](https://github.com/esethna), [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais), [jespino](https://github.com/jespino), [jwilander](https://github.com/jwilander), [lfbrock](https://github.com/lfbrock), [lindalumitchell](https://github.com/lindalumitchell), [lindy65](https://github.com/lindy65), [saturninoabril](https://github.com/saturninoabril), [shieldsjared](https://github.com/shieldsjared), [tolidano](https://github.com/tolidano)

/mattermost-server

- [ccbrown](https://github.com/ccbrown), [chclaus](https://github.com/chclaus), [coreyhulen](https://github.com/coreyhulen), [cpanato](https://github.com/cpanato), [crspeller](https://github.com/crspeller), [enahum](https://github.com/enahum), [fraziern](https://github.com/fraziern), [grundleborg](https://github.com/grundleborg), [hmhealey](https://github.com/hmhealey), [ivernus](https://github.com/ivernus), [jasonblais](https://github.com/jasonblais), [jwilander](https://github.com/jwilander), [longsleep](https://github.com/longsleep), [MusikPolice](https://github.com/MusikPolice), [rickbatka](https://github.com/rickbatka), [santos22](https://github.com/santos22), [saturninoabril](https://github.com/saturninoabril), [thePanz](https://github.com/thePanz)

/mattermost-redux

- [ccbrown](https://github.com/ccbrown), [CometKim](https://github.com/CometKim), [enahum](https://github.com/enahum), [fraziern](https://github.com/fraziern), [hmhealey](https://github.com/hmhealey), [jasonblais](https://github.com/jasonblais), [jespino](https://github.com/jespino), [jwilander](https://github.com/jwilander), [MusikPolice](https://github.com/MusikPolice), [rickbatka](https://github.com/rickbatka), [saturninoabril](https://github.com/saturninoabril), [sudheerDev](https://github.com/sudheerDev), [tkbky](https://github.com/tkbky),

/mattermost-mobile

- [csduarte](https://github.com/csduarte), [enahum](https://github.com/enahum), [gelim](https://github.com/gelim), [hmhealey](https://github.com/hmhealey), [jarredwitt](https://github.com/jarredwitt)

/desktop

- [dmeza](https://github.com/dmeza), [jarredwitt](https://github.com/jarredwitt), [yuya-oc](https://github.com/yuya-oc)

/mattermost-docker

- [pichouk](https://github.com/pichouk), [sebgl](https://github.com/sebgl)

/mattermost-api-reference

- [fraziern](https://github.com/fraziern), [jasonblais](https://github.com/jasonblais), [jwilander](https://github.com/jwilander), [rickbatka](https://github.com/rickbatka)

/mattermost-load-test

- [crspeller](https://github.com/crspeller), [jasonblais](https://github.com/jasonblais)

## Release v4.3.4 - Feature Release

 - **v4.3.4, release date 2017-12-11**
   - Mattermost v4.3.4 contains a medium severity security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
 - **v4.3.3, released 2017-12-05**
   - Fixed a medium level security issue affecting servers with [EnableOAuthServiceProvider](https://docs.mattermost.com/administration/config-settings.html#enable-oauth-2-0-service-provider) set to `true` and  [EnableOnlyAdminIntegrations](https://docs.mattermost.com/administration/config-settings.html#restrict-managing-integrations-to-admins) set to `false`. If you're affected, [upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
 - **v4.3.2, released 2017-11-10**
   - Fixed an issue where after creating a new direct message channel via channel switcher (CTRL/CMD+K), all messages fail to post until a page refresh.
 - **v4.3.1, released 2017-10-20**
   - Fixed an upgrade issue where the database schema would appear to be out of date and throw a log warning.
   - Fixed the Idle Timeout setting in `config.json` by changing the setting title from `SessionIdleTimeout` to `SessionIdleTimeoutInMinutes`.
   - Fixed a regression where slash commands were not functional in Direct or Group Messages.
   - Mattermost v4.3.1 contains a low severity security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
 - **v4.3.0, released 2017-10-16**
   - Original 4.3.0 release

### Security Update

- Mattermost v4.3.0 contains multiple security fixes ranging from low to high severity. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

### Highlights

#### Data Retention Beta ([Enterprise Edition E20](https://mattermost.com/pricing-self-managed/))
- Automatically delete old messages and file uploads through custom data retention policies.

#### Languages
- Promoted Italian and Turkish out of beta to release-quality translations.

### Improvements

#### Web User Interface
- Clicking on "More Unreads" bubble on channel sidebar now scrolls you to the next unread channel.
- Added status indicators to direct message channel header.

#### Search
- Improved user search that supports two character full names and usernames.

#### Integrations
- Ephemeral slash command responses now support attachements without text.
- Added CLI command to move custom slash commands between teams.

#### Notifications
- Updating the channel header with channel-wide mentions no longer triggers notifications.

#### Performance
- Improved initial load of the emoji picker, now supporting thousands of custom emojis including GIFs.

#### Enterprise Edition
- Added tables in System Console for AD/LDAP sync, Elasticsearch and Data Retention to track the success of scheduled jobs.
- Added an idle timeout setting to automatically log out users who are inactive for a specified amount of time.
- Elasticsearch can now be used on a shared Elasticsearch cluster.
- Added metrics for monitoring Elasticsearch system health and usage.

### Bug Fixes
- Fixed an issue where closing brackets were ignored in URL links.
- Fixed Leave Team icon size and inconsistent channel header icon hover effects on IE11 mobile view.
- Fixed an issue where right side menu disappeared after viewing search results on IE11 mobile view.
- Fixed other minor UI issues on IE11 desktop view.
- Fixed an issue where system and ephemeral messages could be flagged.
- Error text in Edit modal no longer overlaps with help text.
- Integration message attachments without `pretext` no longer overlap with username in Compact view.
- Fixed channel member list being sorted by username instead of teammate name display.
- "Password updated successfully" bar is now displayed after resetting password.
- Fixed a broken UI for an expired email verification link.
- Fixed integration message attachments not always rendering in comment threads.
- Fixed an issue where "Add Members" dialog would sometimes break.
- Slash command responses now handle charset and boundary sets correctly.
- Deactivated users are no longer counted in the Town Square member count.
- iOS push notifications are now consistently cleared from the homescreen if all mentions are read on another device.
- Webhooks no longer continue sending to the original channel if the target channel is changed.
- Emails containing symbols now render correctly when switching to email authentication from other methods.
- Attempting to open an invalid public file link no longer displays an unformatted error page.
- Interactive message action buttons no longer disappear after updating the message.
- Ticket links posted by the built-in JIRA plug-in are now correct if the JIRA URL has a custom context path.
- Error message is now displayed in the System Console if the localization available languages does not include the default client language.
- Fixed a race condition where bulk import sometimes fails to get team member when importing users.
- Closing the channel switcher on mobile no longer sets focus to the text box.
- Fixed an issue where the wrong channel name might appear in the right-hand side pinned post list.
- Fixed team sidebar now always showing unreads from other teams on first load.

### Compatibility

#### Removed and Deprecated Features
- All APIv3 endpoints are scheduled for removal on January 16, 2018.

For a list of past and upcoming deprecated features, [see our website](https://about.mattermost.com/deprecated-features/).

#### config.json

Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json`, or the System Console when available.

**Changes to Enterprise Edition**:

- Under `ServiceSettings` in `config.json`:
  - Added `"SessionIdleTimeoutInMinutes": 0` to specify how long to wait before logging out inactive users.
- Under `ElasticsearchSettings` in `config.json`:
  - Added `"IndexPrefix": ""` to allow Elasticsearch to be used on a shared Elasticseearch cluster.
- Under `DataRetentionSettings` in `config.json`:
  - Added `"EnableMessageDeletion": false` to enable message deletion.
  - Added `"EnableFileDeletion": false` to enable file deletion.
  - Added `"MessageRetentionDays": 365` to set how long Mattermost keeps messages in channels and direct messages.
  - Added `"FileRetentionDays": 365` to set how long Mattermost keeps file uploads in channels and direct messages.
  - Added `"DeletionJobStartTime": "02:00"` to specify when to start the data retention job.

### API v4 Changes

- It is recommended that any new integrations use APIv4 endpoints. For more details, and for a complete list of available endpoints, see [https://api.mattermost.com/](https://api.mattermost.com/).
- All APIv3 endpoints are scheduled for removal on January 16, 2018.

**Added routes (API v4)**
- `PUT` at `/oauth/apps/{app_id}`
  - Update an OAuth 2.0 client application.
- `GET` at `/data_retention/policy`
  - Gets the current data retention policy details from the server, including what data should be purged and the cutoff times for each data type that should be purged.

**Modified routes (API v4)**
- `POST` at `/channels/members/{user_id}/view`
  - Response includes `last_viewed_at_times` for Mattermost server 4.3 and newer.

### Known Issues

- Google login fails on the Classic mobile apps.
- User can receive a video call from another browser tab while already on a call.
- Jump link in search results does not always jump to display the expected post.
- Scrollbar is sometimes not visible in the left-hand sidebar after switching teams.
- Certain code block labels don't appear while scrolling on iOS mobile web.
- Deleted message doesn't clear unreads or unread mentions.
- Status may sometimes get stuck as away or offline in High Availability mode with IP Hash turned off.
- Searching stop words in quotes with Elasticsearch enabled returns more than just the searched terms.
- Searching with Elasticsearch enabled may not always highlight the searched terms.
- Channel links to channels that the current user does not belong to may not render correctly.
- Missing an indication if a message is pending but not yet sent.
- Recent mention results are not sorted correctly if hashtags is included in "words that trigger mentions".
- SVG thumbnails don't preview in the posted thumbnail.
- Emojis names matching usernames can trigger mentions.
- Integration message attachment fails to post if attachment length exceeds 7900 characters.
- Uppercase letter is required for a password if the password requirement is set to at least 5 characters and a number.
- Message retention policy may not work in Postgres databases if there are emoji reactions to delete.

### Contributors

/mattermost-server

- [ccbrown](https://github.com/ccbrown), [coreyhulen](https://github.com/coreyhulen), [crspeller](https://github.com/crspeller), [enahum](https://github.com/enahum), [grundleborg](https://github.com/grundleborg), [hmhealey](https://github.com/hmhealey), [jasonblais](https://github.com/jasonblais), [jespino](https://github.com/jespino), [jwilander](https://github.com/jwilander), [moonmeister](https://github.com/moonmeister), [MusikPolice](https://github.com/MusikPolice), [n1aba](https://github.com/n1aba), [saturninoabril](https://github.com/saturninoabril)

/mattermost-webapp

- [asaadmahmood](https://github.com/asaadmahmood), [bbodenmiller](https://github.com/bbodenmiller), [ccbrown](https://github.com/ccbrown), [coreyhulen](https://github.com/coreyhulen), [crspeller](https://github.com/crspeller), [enahum](https://github.com/enahum), [grundleborg](https://github.com/grundleborg), [hmhealey](https://github.com/hmhealey), [jasonblais](https://github.com/jasonblais), [jazzzz](https://github.com/jazzzz), [jwilander](https://github.com/jwilander), [R-Wang97](https://github.com/R-Wang97), [saturninoabril](https://github.com/saturninoabril), [sudheerDev](https://github.com/sudheerDev)

/desktop

- [csduarte](https://github.com/csduarte), [dmeza](https://github.com/dmeza), [yuya-oc](https://github.com/yuya-oc)

/mattermost-mobile

- [csduarte](https://github.com/csduarte), [enahum](https://github.com/enahum), [hmhealey](https://github.com/hmhealey), [jarredwitt](https://github.com/jarredwitt), [lfbrock](https://github.com/lfbrock)

/mattermost-api-reference

- [atpons](https://github.com/atpons), [grundleborg](https://github.com/grundleborg), [jwilander](https://github.com/jwilander), [n1aba](https://github.com/n1aba), [pichouk](https://github.com/pichouk)

/docs

- [ccbrown](https://github.com/ccbrown), [crspeller](https://github.com/crspeller), [esethna](https://github.com/esethna), [hmhealey](https://github.com/hmhealey), [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais), [jespino](https://github.com/jespino), [jwilander](https://github.com/jwilander), [lfbrock](https://github.com/lfbrock), [lindy65](https://github.com/lindy65)

/mattermost-developer-kit

- [jwilander](https://github.com/jwilander)

/marked

- [hmhealey](https://github.com/hmhealey)

/mattermost-docker

- [localsnet](https://github.com/localsnet), [pdemagny](https://github.com/pdemagny), [pichouk](https://github.com/pichouk), [tivvit](https://github.com/tivvit)

/mattermost-redux

- [enahum](https://github.com/enahum), [hmhealey](https://github.com/hmhealey), [jespino](https://github.com/jespino), [jwilander](https://github.com/jwilander), [n1aba](https://github.com/n1aba), [saturninoabril](https://github.com/saturninoabril)

/mattermost-selenium

- [lindalumitchell](https://github.com/lindalumitchell)

/mattermost-mattermod

- [crspeller](https://github.com/crspeller), [hmhealey](https://github.com/hmhealey)

/mattermost-build

- [crspeller](https://github.com/crspeller)

## Release v4.2.2 - Feature Release

 - **v4.2.2, release date 2017-12-11**
   - Mattermost v4.2.2 contains a medium severity security fix. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
 - **v4.2.1, released 2017-10-20**
   - Mattermost v4.2.1 contains multiple security fixes ranging from low to high severity. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
 - **v4.2.0, released 2017-09-16**
   - Original 4.2.0 release

### Security Update

- Mattermost v4.2.0 contains multiple security fixes ranging from low to moderate severity. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

### Highlights

#### Interactive Message Buttons
- Added message buttons to support user interactions with posts made by incoming webhooks and custom slash commands.

#### Mobile Support for AppConfig
- iOS and Android mobile apps now support Enterprise Mobility Management (EMM) solutions through integration with [App Config](https://www.appconfig.org/). See [documentation](https://docs.mattermost.com/mobile/mobile-appconfig.html) to learn more.

### Improvements

#### Web User Interface
- Redesigned the channel member list.
- Redesigned the message input box.
- Redesigned the keyboard shortcuts dialog (CTRL/CMD+/).
- Added a loading indicator when selecting a team on team selection page.
- Added an on hover effect for team icons in the team sidebar, and the channel name and favorite button in channel header.
- Added an active state for the channel member icon in channel header.
- Added a "+" icon next to the Direct Messages header on channel sidebar to open a new direct or group message.
- Added a tooltip for Main Menu next to user profile picture.
- Mouse cursor now changes to a "hand selector" when hovering over the paperclip icon to upload a file.

#### Mobile View
- Made hover effects consistent across all header icons.
- Removed transparency of the [...] menu in the right-hand sidebar.
- Reduced opacity in channel info dialog.
- Updated background color of search bar.

#### Integrations
- Added support for Slack-compatible delayed slash commands through the `response_url` parameter.
- Improved handling of content-types for integrations.

#### Notifications
- Added support for plain text version of email notifications.
- Added "Joined the channel" system message for the person who created the channel.

#### Administration
- Added a CLI command `platform channel move` to move a channel to another team.
- CLI command `platform team delete` now lets you delete teams with no channels.

#### Enterprise Edition
- Removed the "Delete Channel" option for private channels, if you're the last channel member and policy setting restricts channel deletion to admins only.
- In multi-node cluster environment, scheduled tasks such as LDAP sync will only happen on a single node through leader election for increased performance.
- Added direct message channels to compliance exports.
- Added a CLI command `platform channel modify` to convert a public channel to private, and vice versa.
- Elasticsearch indexes over a certain age can be aggregated as part of the daily scheduled job.

### Bug Fixes
- Fixed permalinks not always loading in the channel.
- Fixed an issue where a System Admin couldn't scroll to the bottom of the System Console sidebar in Firefox.
- Flag icon and the "x" icon to close website previews now properly aligned for replies in compact view.
- Fixed expand/collapse arrows not being visible for YouTube videos when image links are expanded by default.
- Fixed an issue where reacting to a post in the right-hand sidebar via emoji picker didn't add the emoji to "Recently Used" section.
- Pressing the ESC key no longer clears search box contents.
- Fixed an issue where turning off email batching in the System Console resulted in no email notification option selected in Account Settings.
- Fixed an issue where a user wasn't able to scroll down in message preview mode when using Markdown headings.
- Fixed an issue on Safari browsers where file thumbnails were sometimes blank.
- Fixed an issue where quotes weren't working inside URL links.
- Fixed an error when the language set in **Account Settings > Display** was removed from available languages in **System Console > Localization**.
- Fixed out-of-channel mentions for usernames with dashes and periods.
- Fixed an issue where a missing config setting sometimes caused server panic.
- Jumping to a group message channel from a flagged message list now adds the channel to the channel list.
- Character limits are no enforced when renaming a channel via `/rename`.
- Fixed channel header icons when WebRTC call is on-going.
- Fixed webhook message attachments not appearing in search results or flagged messages list.
- Timestamp on deleted, ephemeral, or pending posts is no longer a permalink, causing a blank page.
- Fixed focus issues on iPad Classic app.
- Fixed an issue where changing other user's profile image as a System Admin via the API didn't work.
- Fixed mention notifications firing for mentions inside triple backticks.
- Collapse and expand arrows no longer shown for image links when no image is available.
- A single collapsed link preview now stays collapsed after page refresh.
- With email batching enabled, if there is activity in Mattermost before email batch is sent, the email notification is not sent.
- Fixed an issue where copying and pasting SVG files into message draft never finish uploading.
- Autocomplete is no longer cut on the channel header modal.
- Fixed email notifications settings appearing saved despite cancelling the change.
- Notification confirmation message no longer appears when sending channel wide @-all and @-channel mentions in code blocks.

### Compatibility

#### Breaking Changes

1 - Mattermost now handles multiple content types for integrations, including plaintext content type. If your integration suddenly prints the JSON payload data instead of rendering the generated message, make sure your integration is returning the `application/json` content-type to retain previous behavior.

2 - By default, user-supplied URLs such as those used for Open Graph metadata, webhooks, or slash commands will no longer be allowed to connect to reserved IP addresses including loopback or link-local addresses used for internal networks.

This change may cause private integrations to break in testing environments, which may point to a URL such as http://127.0.0.1:1021/my-command.

If you point private integrations to such URLs, you may whitelist such domains, IP addresses, or CIDR notations via the [AllowedUntrustedInternalConnections config setting](https://docs.mattermost.com/administration/config-settings.html#allow-untrusted-internal-connections-to) in your local environment. Although not recommended, you may also whitelist the addresses in your production environments. See [documentation to learn more](https://docs.mattermost.com/administration/config-settings.html#allow-untrusted-internal-connections-to).

Push notification, OAuth 2.0 and WebRTC server URLs are trusted and not affected by this setting.

3 - Uploaded file attachments are now grouped by day and stored in `/data/<date-of-upload-as-YYYYMMDD>/teams/...` of your file storage system.

4 - Mattermost `/platform` repo has been separated to `/mattermost-webapp` and `/mattermost-server`. This may affect you if you have a private fork of the `/platform` repo. [More details here](https://forum.mattermost.org/t/mattermost-separating-platform-into-two-repositories-on-september-6th/3708).

#### Removed and Deprecated Features
- All APIv3 endpoints are scheduled for removal on January 16, 2018.

For a list of past and upcoming deprecated features, [see our website](https://about.mattermost.com/deprecated-features/).

#### config.json

The following settings were unintentionally added to ``config.json`` and are removed in Mattermost 4.2.

- Under `SupportSettings` in `config.json`:
  - `"AdministratorsGuideLink": "https://about.mattermost.com/administrators-guide/"`
  - `"TroubleshootingForumLink": "https://about.mattermost.com/troubleshooting-forum/"`
  - `"CommercialSupportLink": "https://about.mattermost.com/commercial-support/"`

Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json`, or the System Console when available.

**Changes to Team Edition and Enterprise Edition**:

- Under `ServiceSettings` in `config.json`:
  - Added `AllowedUntrustedInternalConnections": ""` to specify domains, IP address or CIDR notations for internal connections. Used in testing environments when developing integrations locally on a development machine. Not recommended for use in production.
- Under `TeamSettings` in `config.json`:
  - Added `EnableXToLeaveChannelsFromLHS: false` to set if a user can leave a channel by clicking "X" next to a channel in the channel sidebar. This setting is Beta and may be replaced or removed in a future release.
- Under `FileSettings` in `config.json`:
  - Added `AmazonS3Trace: false` to enable additional debugging for Amazon S3.

**Additional Changes to Enterprise Edition**:

- Under `ElasticsearchSettings` in `config.json`:
  - Added `AggregatePostsAfterDays": ""` to specify the age at which indexes will be aggregated as part of the daily scheduled job
  - Added `PostsAggregatorJobStartTime": ""` to specify the start time of the daily scheduled aggregator job.
- Under `TeamSettings` in `config.json`:
  - Added `ExperimentalTownSquareIsReadOnly: false` to set if Town Square is a read-only channel. Applies to all teams in the Mattermost server. This setting is Beta and may be replaced or removed in a future release.
- Added `ThemeSettings` in `config.json`. These settings are Beta and may be replaced or removed in a future release.
  - Added `"EnableThemeSelection": true` to set whether end users can change their Mattermost theme.
  - Added `"DefaultTheme": "default"` to set default theme for new users.
  - Added `"AllowCustomThemes": true` to set whether end users can set a custom theme.
  - Added `"AllowedThemes": []` to list which built-in Mattermost themes are available to users.

### API v4 Changes
- It is recommended that any new integrations use APIv4 endpoints. For more details, and for a complete list of available endpoints, see [https://api.mattermost.com/](https://api.mattermost.com/).
- All APIv3 endpoints are scheduled for removal on January 16, 2018.

**Added routes (API v4)**
- `POST` at `/posts/{post_id}/actions/{action_id}`
  - To perform a post action, which allows users to interact with integrations through messages.

### Known Issues
- Google login fails on the Classic mobile apps.
- Clicking on a channel during the tutorial makes the tutorial disappear.
- User can receive a video call from another browser tab while already on a call.
- Jump link in search results does not always jump to display the expected post.
- First load of the emoji picker is slow on low-speed connections or on deployments with hundreds of custom emoji.
- Scrollbar is sometimes not visible in the left-hand sidebar after switching teams.
- Certain code block labels don't appear while scrolling on iOS mobile web.
- Deleted message doesn't clear unreads or unread mentions.
- Status may sometimes get stuck as away or offline in High Availability mode with IP Hash turned off.
- Searching stop words in quotes with Elasticsearch enabled returns more than just the searched terms.
- Searching with Elasticsearch enabled may not always highlight the searched terms.
- Channel links to channels that the current user does not belong to may not render correctly.
- Pinned posts list header sometimes shows an incorrect channel name.
- Missing an indication if a message is pending but not yet sent.
- Searching for users with one or two-letter names doesn't work.

### Contributors

/platform

- [asaadmahmood](https://github.com/asaadmahmood), [ccbrown](https://github.com/ccbrown), [coreyhulen](https://github.com/coreyhulen), [cpanato](https://github.com/cpanato), [crspeller](https://github.com/crspeller), [csduarte](https://github.com/csduarte), [dmeza](https://github.com/dmeza), [enahum](https://github.com/enahum), [esethna](https://github.com/esethna), [grundleborg](https://github.com/grundleborg), [hmhealey](https://github.com/hmhealey), [jasonblais](https://github.com/jasonblais), [jwilander](https://github.com/jwilander), [KenmyZhang](https://github.com/KenmyZhang), [lindalumitchell](https://github.com/lindalumitchell), [meilon](https://github.com/meilon), [MusikPolice](https://github.com/MusikPolice), [n1aba](https://github.com/n1aba), [pruthvip](https://github.com/pruthvip), [saturninoabril](https://github.com/saturninoabril), [stanhu](https://github.com/stanhu), [sudheerDev](https://github.com/sudheerDev), [Whiteaj36](https://github.com/Whiteaj36)

/docs

- [amyblais](https://github.com/amyblais), [balasankarc](https://github.com/balasankarc), [esethna](https://github.com/esethna), [hmhealey](https://github.com/hmhealey), [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais), [jwilander](https://github.com/jwilander), [lfbrock](https://github.com/lfbrock), [lindy65](https://github.com/lindy65)

/mattermost-redux

- [aditya-konarde](https://github.com/aditya-konarde), [brettmc](https://github.com/brettmc), [ccbrown](https://github.com/ccbrown), [enahum](https://github.com/enahum), [hmhealey](https://github.com/hmhealey), [jwilander](https://github.com/jwilander), [kevin3274](https://github.com/kevin3274), [saturninoabril](https://github.com/saturninoabril)

/mattermost-mobile

- [csduarte](https://github.com/csduarte), [enahum](https://github.com/enahum), [hmhealey](https://github.com/hmhealey), [lfbrock](https://github.com/lfbrock), [onepict](https://github.com/onepict)

/desktop

- [jasonblais](https://github.com/jasonblais), [yuya-oc](https://github.com/yuya-oc)

/mattermost-kubernetes

- [coreyhulen](https://github.com/coreyhulen), [crspeller](https://github.com/crspeller), [escardin](https://github.com/escardin), [grundleborg](https://github.com/grundleborg)

/mattermost-docker

- [jasonblais](https://github.com/jasonblais), [pichouk](https://github.com/pichouk), [tejasbubane](https://github.com/tejasbubane)

/mattermost-push-proxy

- [coreyhulen](https://github.com/coreyhulen), [enahum](https://github.com/enahum)

/mattermost-mdk

- [jwilander](https://github.com/jwilander)

/mattermost-api-reference

- [ccbrown](https://github.com/ccbrown), [cpanato](https://github.com/cpanato), [jasonblais](https://github.com/jasonblais), [jwilander](https://github.com/jwilander), [prixone](https://github.com/prixone)

/mattermost-load-test

- [crspeller](https://github.com/crspeller)

## Release v4.1.2 - Feature Release

 - **v4.1.2, released 2017-10-20**
   - Mattermost v4.1.2 contains multiple security fixes ranging from low to high severity. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
 - **v4.1.1, released 2017-09-16**
   - Mattermost v4.1.1 contains multiple security fixes ranging from low to medium severity. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
 - **v4.1.0, released 2017-08-16**
   - Original 4.1.0 release

### Security Update

- Mattermost v4.1.0 contains multiple security fixes ranging from low to high severity. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

### Highlights

#### JIRA App
- Built-in JIRA integration that can post to multiple channels using a single webhook. [See documentation](https://about.mattermost.com/default-jira-plugin)

#### Personal Access Tokens
- Enables easier and more flexible integrations by authenticating against the REST API. See [documentation](https://about.mattermost.com/default-user-access-tokens/)

#### Updated iOS and Android Apps
- v1.1 of the Native [iOS](https://itunes.apple.com/us/app/mattermost/id1257222717?mt=8) and [Android](https://play.google.com/store/apps/details?id=com.mattermost.rn&hl=en_CA&gl=US) Apps are released with support for search, group messaging, viewing emoji reactions and improved performance on poor connections.

#### Elasticsearch Beta ([Enterprise Edition E20](https://mattermost.com/pricing-self-managed/))
- Connect your Elasticsearch server to Mattermost, then build and manage your post index via the System Console interface.
- [Elasticsearch](https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html) is a distributed, RESTful search engine supporting highly efficient database searches in a [cluster environment](https://docs.mattermost.com/deployment/cluster.html).

### Improvements

#### Web User Interface
- Ephemeral messages now note that they are "(Only visible to you)" .
- Navigating to an invalid team invite link will now redirect to an error page.
- Cropping of image thumbnails now looks the same before and after posting.
- Clicking on @mentions will now open the contact card for the user.
- User lists now display full name and nickname.
- Added over 500 new emoji.
- Searching on slow connections now shows a loading spinner in the right-hand side.
- Added a close button next to link previews.
- Ephemeral messages will now always appear as parent posts.
- Added [...] menu to search results, pinned posts and flagged posts lists.
- Clicking the username in a profile popover inserts the username to the message box.

#### Notifications
- Added an option to Push Notification Contents to send no channel name or message text
- Updated the default email frequency to 15 minutes if email batching is enabled by the System Admin.
- Users are now prompted from Account Settings to set Edge notification sounds in their browser settings.
- Updated the desktop notification text for incoming webhooks to more accurately reflect the payload.

#### Files
- File uploads in a single message are ordered based on time of upload. When multiple files are selected, files are ordered in alphabetical order based on file name.

#### Administration
- No longer require a refresh after a user is promoted to a Team Admin.
- Announcement banner now supports URLs.
- Bulk importer now supports user preferences, including favorite channels, flagged posts and notification preferences.
- Changed username to be the default name display setting in the System Console.
- Channel member list now follows the Teammate name display configuration setting.
- Added more debugging info to server logs for failed OAuth requests.
- Added a new System Console push notification content setting to only display sender name.
- Added support for unauthenticated, but encrypted SMTP connection.

#### Integrations
- Null values are now ignored in webhook attachments.
- Outgoing webhooks can now fire if the post contains only an attachment.
- Added ``/code`` built-in slash command to create a code block.
- Added ``/purpose`` built-in slash command to set the channel purpose.
- Added ``/rename`` built-in slash command to rename the channel.
- Added ``/leave`` built-in slash command to leave a channel.

#### Enterprise Edition E20
- Added a System Console setting to disable file uploads and downloads on mobile.
- Added a new Email Notification Content setting to specify the amount of detail sent in email notification.
- Added support for server-side encryption of files in Amazon S3, using Amazon S3-managed keys.

### Bug Fixes
- Fixed incorrectly rotated image thumbnails that were uploaded from mobile devices.
- Adding or removing reactions from a post with an image preview no longer causes the preview to expand or collapse.
- JavaScript error no longer thrown when file upload fails due to network interruption.
- Error messages in Account Setting fields no longer stack.
- Fixed Slack Import of non-ascii channel names.
- Changing the search term in the More Direct Messages member list now resets the search.
- Help text for the Channel Switcher (CTRL/CMD+K) is now shown on small desktop windows, and removed on mobile.
- Keyboard shortcut for Account Settings (CTR/CMD+SHIFT+A) now toggles.
- Fixed the Preview button in the text input box and message edit modal.
- Fixed a JavaScript error when switching teams while uploading a file.
- CLI tool to delete all users no longer requires a user argument.
- CLI tool now deletes webhooks and slash commands when deleting teams and channels.
- Custom slash commands no longer throw an error if used in a Direct Message channel.
- System Console now reads and honors the Amazon S3 Region setting.
- Fixed whitespace and trimming on code blocks and empty table cells.
- Disabled the "Create Account" button after the first click so the system does not attempt to create the account twice.
- More Channels modal no longer stops paging after the first two pages.
- Editing channel names now correctly limits character count to 22.
- Fixed broken links on the **System Console > Mobile Push** page.
- `/away` and `/offline` ephemeral messages can no longer contain extra text posted with the slash command.
- Fixed teams being sometimes incorrectly marked unread across tabs.
- Fixed JavaScript error thrown when viewing a channel containing an invalid emoji reaction.
- Periods after URLs are no longer added to the link.
- Recent emoji in emoji picker no longer shows deleted custom emoji.
- Fixed image thumbnails and previews on IE11.
- Fixed message attachments in incoming webhooks and slash commands not always truncating properly.
- Non-admins can now view their previously created integrations.

### Compatibility

#### Removed and deprecated features
- All APIv3 endpoints are scheduled for removal on January 16, 2018.

For a list of past and upcoming deprecated features, [see our website](https://about.mattermost.com/deprecated-features/).

#### config.json

The following settings were unintentionally added to ``config.json`` and will be removed in Mattermost 4.2, released on September 16th.

- Under `SupportSettings` in `config.json`:
  - `"AdministratorsGuideLink": "https://about.mattermost.com/administrators-guide/"`
  - `"TroubleshootingForumLink": "https://about.mattermost.com/troubleshooting-forum/"`
  - `"CommercialSupportLink": "https://about.mattermost.com/commercial-support/"`

Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json`, or the System Console when available.

**Changes to Team Edition and Enterprise Edition**:

- Under `ServiceSettings` in `config.json`:
  - `"EnableUserAccessTokens": false` to enable personal access tokens for integrations to authenticate against the REST API
- Under `EmailSettings` in `config.json`:
  - Added `"EnableSMTPAuth": false` to support SMTP servers requiring no authentication
  - Added `"EmailNotificationContentType": "full"` to specify the amount of detail sent in email notification contents

**Additional Changes to Enterprise Edition**:

- Under `FileSettings` in `config.json`:
  - Added `"AmazonS3SSE": false` to enable server-side encryption for files in Amazon S3.
  - Added `"EnableMobileUpload": true` to enable file uploads on mobile devices
  - Added `"EnableMobileDownload": true` to enable file downloads on mobile devices
- Under `JobSettings` in `config.json`:
  - Added `"RunJobs": true` to enable running jobs on the jobs server
  - Added `"RunScheduler": true` to enable scheduling jobs on the job server
- Under `ElasticsearchSettings` in `config.json`:
  - Added `"ConnectionUrl": "http://dockerhost:9200"` to set the URL of the Elasticsearch server
  - Added `"Username": ""` to specify the username to access the Elasticsearch server
  - Added `"Password": ""` to specify the password to access the Elasticsearch server
  - Added `"EnableIndexing": false` to enable Elasticsearch indexing
  - Added `"EnableSearching": false` to enable searching using Elasticsearch
  - Added `"Sniff": true` to enable sniffing on the Elasticsearch server
  - Added `"PostIndexReplicas": 1` to specify how many replicas to use for each post index
  - Added `"PostIndexShards": 1` to specify how many shards to use for each post index

### Database Changes

**UserAccessToken Table:**
- Added table

**JobStatuses Table:**
- Removed table

**Jobs Table:**
- Added table

**Users Table:**
- Modified ``Roles`` column maximum size from 64 to 256 characters

### API v4 Changes
- Mattermost 4.0 has a stable release of API v4 endpoints. It is recommended that any new integrations use the v4 endpoints. For more details, and for a complete list of available endpoints, see [https://api.mattermost.com/](https://api.mattermost.com/).
- All APIv3 endpoints are scheduled for removal on January 16, 2018.

**Added routes (API v4)**
See [api.mattermost.com](https://api.mattermost.com/) for more details:
- `GET` at `api/v4/jobs`
- `POST` at `api/v4/jobs`
- `GET` at `api/v4/jobs/{job_id:[A-Za-z0-9]+}`
- `POST` at `api/v4/jobs/{job_id:[A-Za-z0-9]+}/cancel`
- `GET` at `api/v4/jobs/type/{job_type:[A-Za-z0-9_-]+}`
- `POST` at `api/v4/elasticsearch/purge_indexes`
- `POST` at `api/v4/users/{user_id:[A-Za-z0-9]+}/tokens`
- `GET` at `api/v4/users/{user_id:[A-Za-z0-9]+}/tokens`
- `GET` at `api/v4/users/{user_id:[A-Za-z0-9]+}/tokens/{token_id:[A-Za-z0-9]+}`
- `POST` at `api/v4/users/{user_id:[A-Za-z0-9]+}/tokens/revoke`

### Known Issues

- Google login fails on the Classic mobile apps.
- Clicking on a channel during the tutorial makes the tutorial disappear.
- User can receive a video call from another browser tab while already on a call.
- Jump link in search results does not always jump to display the expected post.
- First load of the emoji picker is slow on low-speed connections or on deployments with hundreds of custom emoji.
- Scrollbar is sometimes not visible in the left-hand sidebar after switching teams.
- Certain code block labels don't appear while scrolling on iOS mobile web.
- A public channel doesn't always show up in another browser tab or client until after refresh.
- Deleted message doesn't clear unreads or unread mentions.
- Changing the search term in the More Direct Messages modal doesn't reset the page.
- Status may sometimes get stuck as away or offline in High Availability mode with IP Hash turned off.
- Searching stop words in quotes with Elasticsearch enabled returns more than just the searched terms
- Searching with Elasticsearch enabled may not always highlight the searched terms
- Channels links to channels that the current user does not belong to may not render correctly

### Contributors

Many thanks to all our contributors. In alphabetical order:

/mattermost-server

- [94117nl](https://github.com/94117nl), [asaadmahmood](https://github.com/asaadmahmood), [ccbrown](https://github.com/ccbrown), [coreyhulen](https://github.com/coreyhulen), [cpanato](https://github.com/cpanato), [crspeller](https://github.com/crspeller), [csduarte](https://github.com/csduarte), [debanshuk](https://github.com/debanshuk), [dmeza](https://github.com/dmeza), [enahum](https://github.com/enahum), [fraziern](https://github.com/fraziern), [grundelborg](https://github.com/grundelborg), [harshavardhana](https://github.com/harshavardhana), [hmhealey](https://github.com/hmhealey), [jasonblais](https://github.com/jasonblais), [jwilander](https://github.com/jwilander), [lindalumitchell](https://github.com/lindalumitchell), [megos](https://github.com/megos), [moonmeister](https://github.com/moonmeister), [MusikPolice](https://github.com/MusikPolice), [Ppjet6](https://github.com/Ppjet6), [saturninoabril](https://github.com/saturninoabril), [tejaycar](https://github.com/tejaycar), [Whiteaj36](https://github.com/Whiteaj36)

/docs

- [amyblais](https://github.com/amyblais), [bkmgit](https://github.com/bkmgit), [esethna](https://github.com/esethna), [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais), [JeffSchering](https://github.com/JeffSchering), [john-combs](https://github.com/john-combs), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [lindy65](https://github.com/lindy65), [pichouk](https://github.com/pichouk), [prixone](https://github.com/prixone), [Samiksha416](https://github.com/Samiksha416)

/mattermost-mobile

- [csduarte](https://github.com/csduarte), [enahum](https://github.com/enahum), [hmhealey](https://github.com/hmhealey), [lfbrock](https://github.com/lfbrock)

/mattermost-push-proxy

- [coreyhulen](https://github.com/coreyhulen)

/mattermost-redux

- [94117nl](https://github.com/94117nl), [csduarte](https://github.com/csduarte), [enahum](https://github.com/enahum), [grundelborg](https://github.com/grundelborg), [hmhealey](https://github.com/hmhealey), [jwilander](https://github.com/jwilander), [saturninoabril](https://github.com/saturninoabril)

/mattermost-api-reference

- [ccbrown](https://github.com/ccbrown), [grundelborg](https://github.com/grundelborg), [jwilander](https://github.com/jwilander), [thePanz](https://github.com/thePanz)

/mattermost-kubernetes

- [crspeller](https://github.com/crspeller)

/mattermost-docker

- [jminardi](https://github.com/jminardi), [jnbt](https://github.com/jnbt), [pichouk](https://github.com/pichouk)

/mattermost-load-test

- [crspeller](https://github.com/mattermost/crspeller)

/mattermost-bot-sample-golang

- [fkr](https://github.com/fkr), [hmhealey](https://github.com/hmhealey)

## Release v4.0.5 - Feature Release

 - **v4.0.5, released 2017-09-16**
   - Mattermost v4.0.5 contains multiple security fixes ranging from low to medium severity. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
 - **v4.0.4, released 2017-08-18**
   - Mattermost v4.0.4 contains multiple security fixes ranging from low to high severity. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
   - Fixed issue when using single-sign-on with GitLab where using a non-English language option in **System Console > Localization** sometimes resulted in a login failure.
 - **v4.0.3, released 2017-08-10**
   - Fixed issue with `AmazonS3Region` config setting being ignored in Minio file storage setup.
   - Fixed issue when using high availability mode in Enteprise Edition E20 where the bind address wasn't set correctly for the hashicorp memberlist.
 - **v4.0.2, released 2017-07-31**
   - Fixed issue when using single-sign-on with GitLab (and in Enterprise Edition with SAML, Office365 and G Suite), where using a non-English language option in Account Settings resulted in a login failure.
   - Fixed issue with custom slash commands not working in direct message channels.
   - Fixed issue with GitLab and SAML single sign-on in Mattermost mobile apps redirecting to a browser page.
 - **v4.0.1, released 2017-07-18**
   - Fixed issue where pinning or un-pinning messages didn't work if `AllowTimeLimit` config setting is set to `Never`.
   - Fixed issue where uploading or removing the **Service Provider Public Certificate** file in **System Console > SAML** refreshed the page, losing all unchanged settings.
   - Fixed deactivated users appearing in channel member, team member and direct message lists.
   - Fixed PDF previews not loading.
 - **v4.0.0, released 2017-07-16**
   - Original 4.0.0 release

### Security Update

- Mattermost v4.0.0 contains multiple security fixes ranging from low to high severity. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

### Highlights

#### Native iOS and Android Apps
- Second generation mobile apps released for [iOS](https://itunes.apple.com/us/app/mattermost/id1257222717?mt=8) and [Android](https://play.google.com/store/apps/details?id=com.mattermost.rn).
- The apps are [EMM compatible starting with BlackBerry Dynamics](https://mattermost.com/blog/mattermost-2nd-gen-mobile-apps-released-emm-compatible-starting-with-blackberry-dynamics/).

#### Updated Web User Interface
- Updated the appearance of channel header and channel sidebar in the web user interface.
- Updated the default theme, "Mattermost". To try it, go to **Account Settings > Display > Theme**.

#### Emoji Picker
- The emoji picker offers quick access to emoji when composing messages or adding reactions.
- Promoted from Beta, and enabled to all users by default.

#### Languages
- Added Italian translations to the user interface.

#### API v4 (Stable Release)
- Mattermost webapp moved to API v4 endpoints, which allow for more powerful integrations and server interaction.
- API v3 endpoints are supported until January 16, 2018. To learn more about migrating to APIv4 endpoints, [see https://api.mattermost.com/](https://api.mattermost.com/).

#### High Availability ([Enterprise Edition E20](https://mattermost.com/pricing-self-managed/))
- Mattermost servers are dynamically added and removed based on discovery and their cluster name using the hashicorp memberlist.
- Added support for experimental gossip protocol, where the server will attempt to communicate via the gossip protocol over the gossip port.

### Improvements

#### Web User Interface
- Adjusted post spacing to be consistent across Markdown formatting, replies and consecutive posts.
- On hover colour for pin and channel member icons now consistent with flag and recent mentions icons.
- Emojis are now vertically aligned in post view.
- Channel name, header and purpose now update in real time for all users.
- For reply threads in the center channel, the "Commented on" phrase now respects the teammate name display config setting.
- Code block language tag is no longer selectable making it easier to copy the code.
- Aligned the search box with right-hand side reply thread.
- New user profile pictures now update for other users upon refresh.
- Improved rendering of @mention highlighting in message view.

#### Mobile Web
- Added "Create Team" and "Leave Team" options to the Main Menu.
- Updated the look of Account Settings pages on mobile.
- User profile popover no longer gets cropped in the center channel on iOS browser.
- Link preview image now resizes correctly on iOS browser.

#### Notifications
- Unread messages and mentions now sync across browser tabs and devices.
- Improved desktop notifications for webhook attachments.

#### Emoji Picker & Custom Emoji
- Newly created custom emoji immediately display to all users without requiring a refresh.
- Improved position of the emoji picker near the top of the channel or the right-hand side comment thread.

#### Keyboard Shortcuts
- CTRL+SHIFT+K shortcut now toggles the Direct Message dialog open and closed.
- SHIFT+UP now opens a reply thread for the most recent message posted by a user, skipping system messages.

#### Slash Commands
- Added the following built-in slash commands:
  - `/header` command to set the channel header.
  - `/help` command to open the Mattermost help page in a new browser tab.
  - `/open` command to switch or join a channel.
  - `/search` command to search text in messages.
  - `/settings` command to open the Account Settings dialog.
- `/invite_people` slash command is now disabled when account creation is set to false.
- If a message starts with a / but fails to send (either due to timeout or invalid command), the message is put back to the input box.

#### Bulk Import Tool
- Added support for Direct Message channels and posts to the [bulk import tool](https://docs.mattermost.com/deployment/bulk-loading.html).

#### Authentication
- User creation via OAuth (GitLab/Google/Office365) properly restricted to accepted domains, [if specified](https://docs.mattermost.com/administration/config-settings.html#restrict-account-creation-to-specified-email-domains).
- **Invite New Member** dialog validates email addresses against accepted domains, if set.

#### New URL Routes
- Added the ability to Direct Message by email or username with the following new routes for Direct Message channels:
  - `.../teamname/messages/@username`
  - `.../teamname/messages/email`
  - `.../teamname/messages/user_id` (redirects to `...teamname/messages/@username`)
  - `.../teamname/messages/id1_id2` (redirects to `...teamname/messages/@username`)
- Also added a new route for Group Message channels:
  - `.../teamname/messages/generated_id`

#### Link Previews
- After posting a message containing an image link, a preview is loaded only if one is available.

#### Enterprise Edition
- When a SAML user uses a non-supported locale, the language now defaults to English, preventing login issues.

### Bug Fixes
- Emoji picker now closes in Firefox when clicking outside of it.
- [...] menu no longer disappears in the comment thread when hovering over another post.
- New direct messages received while in no teams do not show as unread after rejoining a team.
- Fixed JavaScript errors when receiving messages when not belonging to a team.
- An empty push notification no longer sent for messages only containing file attachments.
- Custom emoji search results no longer filter by creator's first and last name.
- `/expand` and `/collapse` slash commands now properly collapse images in website link previews.
- Group Message channels that are favorited can now be closed.
- Deactivated users now properly listed in Direct and Group Message channels in the left-hand sidebar.
- Fixed search in team and channel Manage Members dialog.
- File upload cancelled if you click "x" on thumbnail while file is uploading in your message draft.
- Status no longer appears offline after joining a new team.
- An empty push notification is no longer sent for messages only containing file attachments.
- Center channel maintains scroll position when new messages are received in the channel.
- Deleting the focused post in permalink view now sends user to normal channel view.
- Max Users per Team setting in **System Console > Users and Teams** no longer includes inactive users.

### Compatibility

#### Breaking Changes

- If you are using NGINX as a proxy for the Mattermost Server, replace the `location /api/v3/users/websocket {` line with `location ~ /api/v[0-9]+/(users/)?websocket$ {` in the `/etc/nginx/sites-available/mattermost` NGINX configuration file. [See documentation to learn more](https://docs.mattermost.com/install/install-ubuntu-1404.html#configuring-nginx-as-a-proxy-for-mattermost-server).
- If you are upgrading a High Availability Cluster: When upgrading from 3.10 or earlier to 4.0 or later, you must manually add new items to the *ClusterSettings* section of your existing ``config.json``. For more information about this, see the *Upgrading to Version 4.0 and Later* section of :doc:`../deployment/cluster`.
 - Microsoft Edge v39 and earlier (EdgeHTML v14 and earlier) has [an issue](https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/8546263/) that may case errors during account creation, login and if MFA is enforced. We recommend upgrading to Edge v40 (or EdgeHTML v15).

#### Removed and deprecated features
- System Console settings in **Files > Images** removed. This includes:
  - Image preview height and width
  - Profile picture height and width
  - Image thumbnail height and width
- Font setting in Account Settings > Display removed.
- Account Settings option **Display** > **Teammate Name Display** moved to the System Console.
- All APIv3 endpoints are scheduled for removal on January 16, 2018.

For a list of past and upcoming deprecated features, [see our website](https://about.mattermost.com/deprecated-features/).

#### config.json

Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json`, or the System Console when available.

**Changes to Team Edition and Enterprise Edition**:

- Under `ServiceSettings` in `config.json`:
   - Added `"EnableEmojiPicker": true` to control whether emoji picker is enabled on the server. Enabling the emoji picker with a large number of custom emoji may slow down performance.
   - Added `"EnableChannelViewedMessages": true` to control whether `channel_viewed` WebSocket event is sent, which syncs unreads across clients and devices. Setting to false can lead to higher performance in large deployments.
   - Added `"EnableAPIv3": true` to control whether version 3 endpoints of the REST API are allowed on the server. If the setting is disabled, integrations that rely on API v3 will fail and can then be identified for migration to API v4.
- Under `TeamSettings` in `config.json`:
   - Added `"TeammateNameDisplay": "username"` to set how to display users' names in posts and the Direct Messages list. Deployments with LDAP or SAML enabled will have this set to `full_name` by default for better experience.
- Under `FileSettings` in `config.json`:
   - Removed System Console settings in **Files > Images**, including:
     - `"ThumbnailWidth": 120`
     - `"ThumbnailHeight": 100`
     - `"PreviewWidth": 1024`
     - `"PreviewHeight": 0`
     - `"ProfileWidth": 128`
     - `"ProfileHeight": 128`
- Under `SqlSettings` in `config.json`:
   - Modified `"QueryTimeout": 30` to also support query timeouts on PostgreSQL, in addition to MySQL.

**Additional Changes to Enterprise Edition**:

- Under `ClusterSettings` in `config.json`:
   - Added `"ClusterName": ""` to set the cluster to join by name. Only nodes with the same cluster name will join together. This is to support Blue-Green deployments or staging pointing to the same database.
   - Added `"OverrideHostname": ""` to override the hostname of this server with this property. It is not recommended to override the Hostname unless needed.
   - Added `"UseIpAddress": true` to control whether the cluster attempts to communicate using the IP Address.
   - Added `"UseExperimentalGossip": false` to control whether the server attempts to communicate via the gossip protocol over the gossip port.
   - Added `"ReadOnlyConfig": true` to control whether changes made to settings in the System Console are ignored. When running in production it is recommended to set this value to true.
   - Added `"GossipPort": 8074` to set the port used for the gossip protocol. Both UDP and TCP should be allowed on this port.
   - Added `"StreamingPort": 8075` to set the port used for streaming data between servers.
   - Removed ``"InterNodeListenAddress": ":8075"`` as this setting is no longer used.
   - Removed ``"InterNodeUrls": []`` as this setting is no longer used.

### API v4 Changes
- Mattermost 4.0 has a stable release of API v4 endpoints. It is recommended that any new integrations use the v4 endpoints. For more details, and for a complete list of available endpoints, see [https://api.mattermost.com/](https://api.mattermost.com/).
- All APIv3 endpoints are scheduled for removal on January 16, 2018.

**Added routes (API v4)**
- `GET` at `/teams/invite/{invite_id}`
  - To retrieve information about a team (including the name and id) corresponding to an invite_id.

**Modified routes (API v4)**
- `DELETE` at `/teams/{team_id}`
  - Added an optional query parameter, `permanent`, to permanently delete a team for compliance reasons.
- `GET` at `/users`
  - Added the `sort` query parameter to add basic sorting when selecting users on a team.
- `GET` at `/emoji`
  - Added paging to the `/emoji` call for increased performance.
- `POST` at `/teams/{team_id}/import`
   - Updated to return a JSON body with the import results under a `results` JSON field to allow more data to be returned in the future without breaking changes.

### Websocket Event Changes

**Added:**
- `channel_updated` that occurs each time channel information is updated (such as name or header), so that the changes are propagated across clients.
- `channel_viewed` that occurs each time you view a channel, propagating the event to all clients and devices and syncing unreads.

### Known Issues

- Google login fails on the Classic mobile apps.
- Edge overlays desktop notification sound and system notification sound.
- Clicking on a channel during the tutorial makes the tutorial disappear.
- User can receive a video call from another browser tab while already on a call.
- Search autocomplete picker is broken on Classic Android app.
- Jump link in search results does not always jump to display the expected post.
- First load of the emoji picker is slow on low-speed connections or on deployments with hundreds of custom emoji.
- Scrollbar is sometimes not visible in the left-hand sidebar after switching teams.
- Certain code block labels don't appear while scrolling on iOS mobile web.
- Outgoing webhooks do not fire when posts have no text content.
- A public channel doesn't always show up in another browser tab or client until after refresh.
- Null values in Slack attachments cause a 500 error for incoming webhooks.
- Keyboard shortcut CTRL/CMD+SHIFT+A does not close Account Settings.
- Deleted message doesn't clear unreads or unread mentions.
- Changing the search term in the More Direct Messages modal doesn't reset the page.
- Status may sometimes get stuck as away or offline in High Availability mode with IP Hash turned off.
- Cannot delete or edit parent posts in right-hand side reply threads.
- Empty cells in Markdown tables render incorrectly.
- `platform user deleteall` CLI command expects a user as an argument.

### Contributors

Many thanks to all our contributors. In alphabetical order:

/mattermost-server

- [94117nl](https://github.com/94117nl), [abustany](https://github.com/abustany), [alexrford](https://github.com/alexrford), [asaadmahmood](https://github.com/asaadmahmood), [ccbrown](https://github.com/ccbrown), [coreyhulen](https://github.com/coreyhulen), [cpanato](https://github.com/cpanato), [crspeller](https://github.com/crspeller), [dmeza](https://github.com/dmeza), [enahum](https://github.com/enahum), [ftKnox](https://github.com/ftKnox), [grundleborg](https://github.com/grundleborg), [hmhealey](https://github.com/hmhealey), [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais), [JeffSchering](https://github.com/JeffSchering), [jwilander](https://github.com/jwilander), [kkamdooong](https://github.com/kkamdooong), [lindalumitchell](https://github.com/lindalumitchell), [megos](https://github.com/megos), [meilon](https://github.com/meilon), [moonmeister](https://github.com/moonmeister), [pieterlexis](https://github.com/pieterlexis), [saturninoabril](https://github.com/saturninoabril), [VeraLyu](https://github.com/VeraLyu), [ZJvandeWeg](https://github.com/ZJvandeWeg)

/mattermost-mobile

- [asaadmahmood](https://github.com/asaadmahmood), [csduarte](https://github.com/csduarte), [enahum](https://github.com/enahum), [hmhealey](https://github.com/hmhealey), [lfbrock](https://github.com/lfbrock), [omar-dev](https://github.com/omar-dev)

/mattermost-redux

- [94117nl](https://github.com/94117nl), [csduarte](https://github.com/csduarte), [enahum](https://github.com/enahum), [grundleborg](https://github.com/grundleborg), [hmhealey](https://github.com/hmhealey), [jarredwitt](https://github.com/jarredwitt), [jwilander](https://github.com/jwilander), [saturninoabril](https://github.com/saturninoabril)

/mattermost-api-reference

- [cpanato](https://github.com/cpanato), [grundleborg](https://github.com/grundleborg), [hmhealey](https://github.com/hmhealey), [jasonblais](https://github.com/jasonblais), [jwilander](https://github.com/jwilander), [Vaelor](https://github.com/Vaelor), [ZJvandeWeg](https://github.com/ZJvandeWeg)

/docs

- [94117nl](https://github.com/94117nl), [acgustafson](https://github.com/acgustafson), [amyblais](https://github.com/amyblais), [ccbrown](https://github.com/ccbrown), [crspeller](https://github.com/crspeller), [esethna](https://github.com/esethna), [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais), [JeffSchering](https://github.com/JeffSchering), [jwilander](https://github.com/jwilander), [kjkeane](https://github.com/kjkeane), [megos](https://github.com/megos), [pieterlexis](https://github.com/pieterlexis)

/desktop

- [yuya-oc](https://github.com/yuya-oc)

/mattermost-kubernetes

- [coreyhulen](https://github.com/coreyhulen)

/mattermost-push-proxy

- [coreyhulen](https://github.com/coreyhulen), [ftKnox](https://github.com/ftKnox)

/mattermost-docker

- [pichouk](https://github.com/pichouk), [tejasbubane](https://github.com/tejasbubane)

/mattermost-load-test

- [crspeller](https://github.com/crspeller), [JeffSchering](https://github.com/JeffSchering)

## Release v3.10.3

 - **v3.10.3, released 2017-08-18**
   - Mattermost v3.10.3 contains multiple security fixes ranging from low to high severity. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
   - Fixed issue when using single-sign-on with GitLab where using a non-English language option in **System Console > Localization** sometimes resulted in a login failure.
 - **v3.10.2, released 2017-07-18**
   - Mattermost v3.10.2 contains low severity security fixes. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
 - **v3.10.1, released 2017-07-16**
   - Mattermost v3.10.1 contains a high severity security fix for an OAuth SSO vulnerability and two additional fixes for low severity security issues. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
 - **v3.10.0, released 2017-06-16**
   - Original 3.10 release

### Highlights

#### Languages
- Added Turkish translations for the user interface.

#### New and Improved Keyboard Shortcuts
- Redesigned the channel switcher (CTRL/CMD+K) for increased productivity.
- Browse direct and group message channels (CTRL/CMD+SHIFT+K) and reply to the most recent message (SHIFT+UP) with new shortcuts.

### Improvements

#### Web User Interface
- Enter key now confirms deletion on the screens to delete a custom emoji and delete a channel.
- Team and channel URLs now replace accented characters with their ASCII equivalents.
- Recent mentions and flagged posts icons in the header are now highlighted when they are active in the right-hand sidebar.
- Empty rows are now ignored in the Send Email Invite modal.
- Enter key now confirms leaving a team from the Leave Team modal.
- Profile popover now opens when clicking a username in mobile browser view.
- /join now allows switching to a private channel to which the user has access.
- Improved the formatting of Mattermost content when copying and pasting to other apps.
- Added the ability for users to view and modify their online status from their profile picture in the header.
- /loadtest command changed to /test.
- Ephemeral messages are removed from the right-hand sidebar after it is reopened.
- Added a markdown preview option to the message editing modal.
- Status indicators are now shown in the Direct Messages list.

#### Notifications
- Added "@here" to the list of channel-wide mentions in Account Settings.
- Added a reminder when your Mattermost window is refreshed if a status override slash command is used to set yourself as /away or /offline.
- Users will see a confirmation dialog when attempting to use @all or @channel in a channel with over 5 users.
- Messages for others being added to a channel no longer trigger channels to be unread.

#### Administration
- Added CLI tool for permanently deleting channels.
- Channel Admins can now delete user's messages within their channel if permitted in the System Console.
- Errors are now logged when failing to load config through the command line.
- Reduced unnecessary database reads and writes when bulk importing users.

#### System Console
- System Console main dropdown menu now has links to the Admin Guide, Troubleshooting Forum, Commercial Support Page and the About Mattermost dialog.
- Added the ability to enable Legacy Signature (AWS Signature V2) with S3 compatible servers.

#### Authentication
- Added a redirect to the appropriate team, channel or post if navigating to a Mattermost URL when logged out.
- Clicking a team invite link now joins the team in all active sessions.

#### Performance
- Upgraded GORP to support connection timeouts on MySQL and missing database columns on MySQL and Postgres.

#### Integrations
- Posts from webhooks that are greater than 4000 characters are now broken into multiple posts.

#### Enterprise Edition
- Added an announcement banner visible to all end users to make maintenance announcements across the system.

### Bug Fixes
- Dragging and dropping a file onto the left-hand sidebar no longer navigates away from Mattermost to open the file in the browser.
- Textbox will no longer overlap the center pane message area as it expands when typing.
- Fixed an issue where statuses could get stuck online after quitting the desktop app or closing the browser window in some cases.
- Profile pictures uploaded on mobile are now rotated in their correct orientation.
- The System Console help text for Minimum Password Length no longer dynamically updates as the input is changed.
- Fixed an issue where the autocomplete list may appear underneath a modal overlay.
- Updated error text when uploading a profile picture that is in an unsupported image format.
- Joined channels no longer appear in the "More..." channels list.
- Wide markdown images no longer cause horizontal scrolling in the center pane.
- Fixed theme styling for button active states.
- Fixed an issue where channels sometimes did not appear read if the channel was in focus when a new message was received.
- Fixed an issue where the autocomplete list would not close after using a slash command.
- Removed the system warning message that appears if mentioning a user that is not a member of a group message.
- Fixed an issue where wide embedded images produce horizontal scroll.
- Fixed a Javascript error that would occur when opening the System Console > SAML page.
- Removed the Channel Admin user interface in Team Edition since the policy restrictions are only available in Enterprise Edition.
- Adding a reaction to an ephemeral message no longer throws a Javascript error.
- Fixed an issue where clicking autocomplete suggestions would not populate the search box with the appropriate text.
- Fixed an issue where the System Console users list ignored the search term after selecting a team from the filter.
- Channel header messages no longer appear cut-off if using a slash.
- Corrected the formatting of the "Edited" indicator in the right-hand sidebar.
- Fixed the positioning of the pin icon and channel header on Edge.

### Compatibility

#### Removed and deprecated features
- System Console settings in **Files > Images** scheduled for removal in July 2017 release. This includes:
  - Image preview height and width
  - Profile picture height and width
  - Image thumbnail height and width
- Font setting in Account Settings > Display scheduled for removal in July 2017 release.
- Account Settings options for **Display** > **Display Font** and **Display** > **Teammate Name Display** are scheduled for removal in July 2017 release.
- All APIv3 endpoints are scheduled for removal six months after APIv4 is stable.

For a list of past and upcoming deprecated features, [see our website](https://about.mattermost.com/deprecated-features/).

#### config.json

Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json`, or the System Console when available.

**Changes to Team Edition and Enterprise Edition**:
 - Under `ServiceSettings` in `config.json`:
   - Added `"GoroutineHealthThreshold": -1,` to set a threshold for number of goroutines.
- Under `SqlSettings` in `config.json`:
   - Added `"QueryTimeout": 30` to set the number of seconds to wait for a response from the database after opening a connection and sending the query.
- Under `FileSettings` in `config.json`:
   - Added `"AmazonS3SignV2": false` to enable Legacy Signature (AWS Signature V2) with S3 compatible servers.

**Additional Changes to Enterprise Edition**:
 - Under `AnnoucementSettings` in `config.json`:
   - Added `"EnableBanner": false,` to enable an announcement banner visible for all users.
   - Added `"BannerText": "",` to specify the text shown in the banner.
   - Added `"BannerColor": "#f2a93b",` to set the banner background color.
   - Added `"BannerTextColor": "#333333",` to set the banner text color.
   - Added `"AllowBannerDismissal": true` to set whether the banner can be dismissed by users.

### API Changes
- Mattermost 3.10 has a release candidate of APIv4 endpoints. To see the complete list of available endpoints, see [https://api.mattermost.com/v4/](https://api.mattermost.com/v4/).
- All APIv3 endpoints are scheduled for removal six months after APIv4 is stable.

**Modified routes (APIv4)**
- `/system/ping` updated to return `500 Internal Server Error` with `{"status": "unhealthy"}` in the response body when `GoroutineHealthThreshold` is set in config.json and the number of goroutines on the server exceeds that threshold. If the number of goroutines is below the threshold or `GoroutineHealthThreshold` is not set in config.json, `200 OK` is returned with no response body.

### Known Issues

- Google login fails on the mobile apps.
- Edge overlays desktop notification sound and system notification sound.
- Status appears offline briefly after joining a new team.
- User popover can get cropped in the center channel on iOS.
- Clicking on a channel during the tutorial makes the tutorial disappear.
- Custom emoji search results filter by the creator's first/last name in addition to the emoji name.
- Reactions are displayed on messages deleted by other users.
- User can receive a video call from another browser tab while already on a call.
- Search autocomplete picker is broken on Android.
- Jump link in search results does not always jump to display the expected post.
- First load of the emoji picker is slow on low-speed connections.
- Emoji picker for reactions doesn't always position correctly.
- Scrollbar is sometimes not visible in the left-hand sidebar after switching teams.
- New direct messages received while in no teams do not show as unread after joining a team.
- User is not logged out immediately when logging self out from Active Sessions list.
- Certain code block labels don't appear while scrolling on iOS mobile web.
- CTRL+SHIFT+K doesn't toggle modal open and closed.
- Deactivated users do not appear in the Direct Message and Group Message sidebar channel list.
- Outgoing webhooks do not fire when posts have no text content.

### Contributors

Many thanks to all our contributors. In alphabetical order:

/mattermost-server

- [asaadmahmood](https://github.com/asaadmahmood), [coreyhulen](https://github.com/coreyhulen), [cpanato](https://github.com/cpanato), [crspeller](https://github.com/crspeller), [dmeza](https://github.com/dmeza), [doh5](https://github.com/doh5), [enahum](https://github.com/enahum), [grundleborg](https://github.com/grundleborg), [harshavardhana](https://github.com/harshavardhana), [hmhealey](https://github.com/hmhealey), [jasonblais](https://github.com/jasonblais), [jwilander](https://github.com/jwilander), [kulak-at](https://github.com/kulak-at), [saturninoabril](https://github.com/saturninoabril), [tjuerge](https://github.com/tjuerge)

/docs

- [cpanato](https://github.com/cpanato), [crspeller](https://github.com/crspeller), [esethna](https://github.com/esethna), [hmhealey](https://github.com/hmhealey),  [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais), [JeffSchering](https://github.com/JeffSchering), [jwilander](https://github.com/jwilander), [kjkeane](https://github.com/kjkeane), [lindy65](https://github.com/lindy65), [mikedaniel18](https://github.com/MikeDaniel18)

/mattermost-api-reference

- [94117nl](https://github.com/94117nl), [cpanato](https://github.com/cpanato),  [hmhealey](https://github.com/hmhealey), [jwilander](https://github.com/jwilander), [senk](https://github.com/senk)

/mattermost-redux

- [94117nl](https://github.com/94117nl), [cpanato](https://github.com/cpanato), [enahum](https://github.com/enahum), [jarredwitt](https://github.com/jarredwitt), [jwilander](https://github.com/jwilander)

/mattermost-mobile

-  [asaadmahmood](https://github.com/asaadmahmood), [cpanato](https://github.com/cpanato), [csduarte](https://github.com/csduarte), [enahum](https://github.com/enahum), [hmhealey](https://github.com/hmhealey), [lfbrock](https://github.com/lfbrock), [rthill](https://github.com/rthill)

/desktop

- [yuya-oc](https://github.com/yuya-oc)

/mattermost-docker

- [carlosasj](https://github.com/carlosasj), [FingerLiu](https://github.com/FingerLiu), [mkdbns](https://github.com/mkdbns),  [pichouk](https://github.com/pichouk), [xcompass](https://github.com/xcompass)

/android

- [coreyhulen](https://github.com/coreyhulen), [der-test](https://github.com/der-test),  [lfbrock](https://github.com/lfbrock)

/mattermost-selenium

- [doh5](https://github.com/doh5),  [lindalumitchell](https://github.com/lindalumitchell)

/gorp

- [jwilander](https://github.com/jwilander)

/ios

- [coreyhulen](https://github.com/coreyhulen), [PrestonL](https://github.com/PrestonL)

/mattermost-kubernetes

- [coreyhulen](https://github.com/coreyhulen)

## Release v3.9.2

 - **v3.9.2, released 2017-07-18**
   - Mattermost v3.9.2 contains low severity security fixes. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
 - **v3.9.1, released 2017-07-16**
   - Mattermost v3.9.1 contains a high severity security fix for an OAuth SSO vulnerability and two additional fixes for low severity security issues. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
 - **v3.9.0, released 2017-05-16**
   - Original 3.9 release

### Security Update

- Mattermost v3.9.0 contains a low severity [security update](https://mattermost.com/security-updates/). [Upgrading to Mattermost v3.9.0](https://docs.mattermost.com/administration/upgrade.html) is highly recommended.

### Highlights

#### Languages

- Added Polish translations for the user interface.

#### Redux

- Mattermost Webapp moved over to Redux for increased performance and more stable infrustructure.

#### APIv4 Release Candidate

- Mattermost HTTP REST APIs moved to v4 endpoints allowing for more powerful integrations and server interaction.
- To learn more about the available APIv4 endpoints, [see our documentation](https://api.mattermost.com/v4/).
- APIv3 endpoints are supported until six months after the stable release of APIv4 endpoints in Q3 of 2017.

### Improvements

#### Web User Interface
- Lower and upper vertical margins for posts are now equal.
- Comments only containing a file attachment have a reduced vertical spacing in the center channel.
- First line of message text is now aligned with username.
- Added padding between timestamp and pinned posts badge in comment threads in compact view.
- Added "View Members" option to Town Square.
- Moved "Start Video Call" option to the bottom of the profile popover.
- Added a confirmation dialog when leaving a private channel.
- User preferences such as display settings now sync between browser tabs, between different browsers, and across devices.

#### Performance
- Added the ability to isolate searches to specific read-replicas for full text search queries for higher performance.
- Added default read and write timeouts for MySQL datasource to prevent hub processing deadlock.
- Added password field to the [bulk import tool](https://docs.mattermost.com/deployment/bulk-loading.html).
- Added the ability to disable full text search queries and statuses via `config.json` for higher performance.

#### Emoji Picker (Beta)
- Enable the emoji picker in **Account Settings > Advanced > Preview pre-release features**.
- Custom emoji now maintains aspect ratio in the emoji picker.
- Improved user experience for closing the Emoji picker after reacting to a message.

#### Keyboard Shortcuts
- Added a link to keyboard shortcuts documentation via the team Main Menu.
- Pressing ENTER once in the channel switcher (CTRL/CMD+K) now switches the channel.
- Using a mouse to select a channel in the channel switcher (CTRL/CMD+K) now switches to the correct channel.

#### Markdown Text Formatting
- Added a margin for Markdown inline images.
- Improved Markdown heading sizes in the desktop view.

#### On-Boarding
- Added "Already have an account? Click here to sign in" link to the sign up page.
- Improved experience of joining a team using an invite link.

#### Files
- SVG files now render in file preview.

#### CLI Tool
- Added new CLI commands:
    - `platform config validate` for validating the `config.json` file.
    - `platform user search` for searching users based on username, email, or user ID.

#### OAuth 2.0 Service Provider
- OAuth 2.0 service provider now always returns the refresh token.
- New refresh token now issued when granting a new access token.

#### System Console
 - Added a confirmation dialog when deactivating a user.
 - Server logs are now always printed in English regardless of Default Server Language, for easier troubelshooting.
 - The `AllowCorsFrom` config setting (in **System Console > Connections > Enable cross-origin requests from**) now supports multiple domain names.
 - Added a setting to disable file and image uploads on messages.

#### Enterprise Edition
 - Added new [performance monitoring metrics](https://docs.mattermost.com/deployment/metrics.html) for
     - The total number of connections to all the search replica databases
     - The total number of WebSocket broadcasts sent

### Bug Fixes
- Long custom emoji names no longer float out of the emoji picker.
- Deleted custom emojis no longer stay in "recently used" section of the emoji picker.
- The maximum length of the "Position" field increased to 64 characters in the database. The previous limit caused problems with LDAP synchronization.
- Pinning a post in center channel no longer changes pinned posts list in the right-hand sidebar.
- Pinning a post in center channel now adds the pinned post badge to search results.
- Fixed error message text for **Edit URL** field in channel creation dialog.
- Disabled config file watcher while running from makefile.
- Fixed Go client's `GetTeamByName()` function.
- Recent mentions search now properly includes `@[username]` in the search.
- Updated error message when entering a password longer than maximum number of characters.
- Don't send the same message multiple times when hitting "Retry" on a failed post.
- Fixed the help text for the channel purpose in private channels.
- When ability to change the header is restricted, "Set a Header" option is no longer shown in the channel intro.
- Mention notifications now trigger if the word is formatted in bold, italic or strikethrough, and won't if it's inside a code block.
- In mobile view, Manage Members menu option no longer reads "View Members" for channel admins.
- Usernames with dots now get mention notifications when followed by a comma or other symbol.
- Deactivated users are no longer listed in the "Manage Members" modal.
- Collapsible Account Setting menus now open properly in iOS Safari and Chrome browsers.
- Removing an expired license now removes the blue bar header message.
- "Next" button in More Channels list now takes you to the top of the next page, instead of the bottom.
- Blue bar "Preview Mode" header message now disappears after enabling email notifications.
- Full name is now editable in Account Settings if the first and last name attributes are not specified in **System Console > Authentication > LDAP**.
- Added a back button to pinned posts list on the right-hand sidebar.
- "Pinned" icon no longer overlaps text on consecutive posts or replies that have Markdown headings.
- Uploading a profile picture on iOS no longer throws an error.
- Fixed group message names in channel switcher (CTRL/CMD+K) for group messages that are not in your sidebar.
- Channel notification preferences no longer appear saved when clicking Cancel.
- Channel creation permissions aren't set to channel admins when it doesn't exist.

### Compatibility

#### Breaking changes:

- If you're using NGINX as a proxy for the Mattermost Server, replace the `location /api/v3/users/websocket {` line with `location ~ /api/v[0-9]+/(users/)?websocket$ {` in the `/etc/nginx/sites-available/mattermost` NGINX configuration file. [See documentation to learn more](https://docs.mattermost.com/install/install-ubuntu-1404.html#configuring-nginx-as-a-proxy-for-mattermost-server).
- Existing email invite links, password reset links, and email verification links in emails generated by your Mattermost server will be invalidated after upgrading to v3.9.0.
- Firefox ESR 45 has an [end-of-life scheduled for June 13](https://en.wikipedia.org/wiki/Firefox_version_history) and is therefore no longer supported. We recommend upgrading to [Firefox ESR 52](https://www.mozilla.org/en-US/firefox/organizations/all/).

#### Removed and deprecated features
- System Console settings in **Files > Images** scheduled for removal in July 2017 release. This includes:
  - Image preview height and width
  - Profile picture height and width
  - Image thumbnail height and width
- All APIv3 endpoints are scheduled for removal six months after APIv4 is stable.

For a list of past and upcoming deprecated features, [see our website](https://about.mattermost.com/deprecated-features/).

#### config.json

Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json`, or the System Console when available.

**Changes to Team Edition and Enterprise Edition**:

 - Under `ServiceSettings` in `config.json`:
   - Added `"EnablePostSearch": true` to control whether users can search messages. Disabling can lead to higher performance in large deployments.
   - Added `"EnableUserStatuses": true` to control whether user statuses are shown in the web user interface. Disabling can lead to higher performance in large deployments.
 - Under `FileSettings` in `config.json`:
   - Added `"EnableFileAttachments": true` to control whether users can upload files and images on messages.

 - Under `EmailSettings` in `config.json`:
   - Removed `"PasswordResetSalt": ""` given tokens are now used for signing of password reset emails.

 - Under `SqlSettings` in `config.json`:
   - Added `"DataSourceSearchReplicas": []` to specify the connection strings for search replica databases for handling search queries.

**Additional Changes to Enterprise Edition**:

 - Under `ServiceSettings` in `config.json`:
   - Added `"LicenseFileLocation": ""` to specify the path and filename of the Enterprise license file on disk. On startup, if Mattermost cannot find a valid license in the database from a previous upload, it will look for the file specified here.

### Database Changes

**OAuthAccessData Table:**
- Added `Scope` column

**PasswordRecovery Table:**
- Removed `PasswordRecovery` table and moved entries to a common token store

### API Changes

- Mattermost 3.9 has a release candidate of APIv4 endpoints. To see the complete list of available endpoints, see [https://api.mattermost.com/v4/](https://api.mattermost.com/v4/).
- All APIv3 endpoints to be removed six months after APIv4 endpoints are stable.

### Websocket Event Changes

- Added `preferences_changed` and `preferences_deleted` to sync preferences between browser tabs, between different browsers, and across devices when a preference is changed or deleted.

### Known Issues

- Google login fails on the mobile apps.
- Slack import doesn't add merged members/e-mail accounts to imported channels.
- User can receive a video call from another browser tab while already on a call.
- Sequential messages from the same user appear as separate posts on mobile view.
- Search autocomplete picker is broken on Android.
- Jump link in search results does not always jump to display the expected post.
- First load of the emoji picker is slow at low connections.
- Emoji picker for reactions doesn't always position correctly.
- Scrollbar is sometimes not visible in the left-hand sidebar after switching teams.
- Emoji picker is sometimes cut off on comment threads on the right-hand sidebar.
- User status can get stuck online after quitting the desktop app or closing the browser window.
- New direct messages received while in no teams do not show as unread after joining a team.
- Profile picture uploaded from mobile appears rotated.
- User is not logged out immediately when logging self out from Active Sessions list.
- Certain code block labels don't appear while scrolling on iOS mobile web.
- System Console user list filter does not show accurate results if applied after entering a search query.

### Contributors

Many thanks to all our contributors. In alphabetical order:

/mattermost-server

- [asaadmahmood](https://github.com/asaadmahmood), [coreyhulen](https://github.com/coreyhulen), [cpanato](https://github.com/cpanato), [crspeller](https://github.com/crspeller), [doh5](https://github.com/doh5), [enahum](https://github.com/enahum), [grundleborg](https://github.com/grundleborg), [gstraube](https://github.com/gstraube) , [hmhealey](https://github.com/hmhealey), [jasonblais](https://github.com/jasonblais), [JeffSchering](https://github.com/JeffSchering), [justinwyer](https://github.com/justinwyer), [jwilander](https://github.com/jwilander), [lindalumitchell](https://github.com/lindalumitchell), [prixone](https://github.com/prixone), [Rudloff](https://github.com/Rudloff), [R-Wang97](https://github.com/R-Wang97), [saturninoabril](https://github.com/saturninoabril), [simon0191](https://github.com/simon0191), [VeraLyu](https://github.com/VeraLyu)

/docs

- [enahum](https://github.com/enahum), [esethna](https://github.com/esethna), [fjarlq](https://github.com/fjarlq), [it33](https://github.com/it33), [ivernus](https://github.com/ivernus), [jasonblais](https://github.com/jasonblais), [JeffSchering](https://github.com/JeffSchering), [justinwyer](https://github.com/justinwyer), [lindy65](https://github.com/lindy65), [senk](https://github.com/senk)

/mattermost-api-reference

- [cpanato](https://github.com/cpanato), [crspeller](https://github.com/crspeller), [dagit](https://github.com/dagit), [hmhealey](https://github.com/hmhealey), [jwilander](https://github.com/jwilander), [saturninoabril](https://github.com/saturninoabril)

/mattermost-redux

- [enahum](https://github.com/enahum), [jarredwitt](https://github.com/jarredwitt), [jwilander](https://github.com/jwilander)

/desktop

- [jasonblais](https://github.com/jasonblais), [jnugh](https://github.com/jnugh), [yuya-oc](https://github.com/yuya-oc)

/mattermost-mobile

- [asaadmahmood](https://github.com/asaadmahmood), [cpanato](https://github.com/cpanato), [csduarte](https://github.com/csduarte), [enahum](https://github.com/enahum), [jasonblais](https://github.com/jasonblais), [lfbrock](https://github.com/lfbrock)

/mattermost-docker

- [esethna](https://github.com/esethna), [pichouk](https://github.com/pichouk), [xcompass](https://github.com/xcompass)

/mattermost-push-proxy

- [coreyhulen](https://github.com/coreyhulen)

/mattermost-selenium

- [doh5](https://github.com/doh5), [lindalumitchell](https://github.com/lindalumitchell), [coreyhulen](https://github.com/)

/mattermost-kubernetes

- [coreyhulen](https://github.com/coreyhulen)

/gcm

- [coreyhulen](https://github.com/coreyhulen), [csduarte](https://github.com/csduarte)

## Release v3.8.3

### Notes on Patch Release

 - **v3.8.3, released 2017-07-16**
   - Mattermost v3.8.3 contains a high severity security fix for an OAuth SSO vulnerability and two additional fixes for low severity security issues. [Upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
 - **v3.8.2, released 2017-04-21**
   - Changed the client to use `window.location.origin` instead of siteURL, fixing WebSocket connection issues with Mattermost 3.8 upgrade.
   - Fixed a few APIv4 endpoints in support of the next [React Native mobile app](https://github.com/mattermost/mattermost-mobile) release.
 - **v3.8.1, released 2017-04-19**
   - Mattermost v3.8.1 contains a security update and [upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).
   - Fixed an issue with Site URL sometimes breaking the OAuth2 login flow, including login using GitLab.
   - Reverted a change preventing LDAP usernames from beginning with a number.
   - Fixed a permission issue with group message channel creation.
 - **v3.8.0, released 2017-04-16**
   - Original 3.8 release

### Security Update

- Mattermost v3.8.0 contains multiple [security updates](https://mattermost.com/security-updates/). [Upgrading to Mattermost v3.8.0](https://docs.mattermost.com/administration/upgrade.html) is highly recommended.

### Highlights

#### Native iOS and Android Apps (Beta)
- Second generation mobile apps, built using React Native, are [available for beta testing](https://mattermost.com/blog/a-native-mobile-experience-second-generation-mobile-apps-released-in-beta/) on [iOS](https://mattermost-fastlane.herokuapp.com/) and [Android](https://play.google.com/apps/testing/com.mattermost.react.native).

#### Pinned Posts
- Important messages can be pinned to the channel for easy reference. Pinned posts are visible to all channel members.

#### Emoji Picker and Improved Emoji Reactions (Beta)
- The picker offers quick access to emoji when composing messages or adding reactions. Enable the emoji picker in **Account Settings > Advanced > Preview pre-release features**.
- The picker is "Beta" while speed of the first load with lots of custom emoji is improved.

#### System Users List
- The System Console now consolidates all users into a system-wide list that can be filtered by team. The users list can be used to manage team membership and team roles for any user on the system.

#### Configure Using Environment Variables
- Override `config.json` settings using environment variables.

### Improvements

#### Web User Interface
- Date separators now appear between posts in the right-hand sidebar.
- Non-square profile pictures are now cropped in the middle rather than being stretched.
- Post timestamps now have an expanded date tooltip.
- The "Add Members" modal now autofocuses on the search box when opened from the "Manage Members" modal.
- Reduced the margins and line height in compact view.
- There is now a confirmation dialog before deleting a custom emoji.
- Updated the error page for invalid permalinks.
- Updated the error page for "Private browsing not supported" in Safari.

#### Performance
- Added index and cache to reactions store

#### Search
- File attachments thumbnails are now shown in search results.
- Flagged posts from other teams are no longer displayed.

#### Channels
- Favorite channels are now sorted alphabetically regardless of channel type.
- Town Square now has a default channel purpose.
- Users added to a group message are now removed from the Direct Messages search list.
- "Private Groups" have been renamed to "Private Channels".

#### Mobile
- Executing a search now closes the keyboard and removes the keyboard focus from the text box.

#### Integrations
- The integrations confirmation page can now be dismissed with the ENTER key.

#### Link Previews
- Updated the UI for link previews by removing an extra blue vertical bar.
- Added support for link preview requests through a separate proxy.

#### Notifications
- Users can no longer configure email notification settings if the notifications are disabled for the system.

#### Onboarding
- Existing users on the server can now easily be added to a team via the Main Menu.

#### Enterprise Edition
- Policy controls for restricting permissions to add and remove members from private channels.
- Added the ability to read the license file from the disk.
- The configuration file is now reloaded after applying an Enterprise Edition license on startup.

### Bug Fixes
- Fixed line wrapping of the timestamp in Account Settings > Security > View Access History.
- Fixed an inconsistent error message when creating a channel with a display name of one or two characters.
- Removed the duplicate "Back" button on the Team Creation page.
- The AltGR key no longer triggers keyboard shortcuts.
- Saving a team name without making changes no longer throws an error message.
- Group messages are now sorted alphabetically with direct messages.
- The "Create Channel" button will now only appear in the "More Channels" modal when the user has the permission to create channels.
- The Town Square channel menu no longer has redundant dividers with certain combinations of System Console > Policy settings.
- Fixed an issue where some conversations would not trigger the channel to appear unread in the left-hand sidebar.
- Fixed an issue where usernames sometimes did not appear when hovering over reactions.
- Fixed an issue where link previews would sometimes cause a horizontal scroll bar to appear.
- iOS code blocks no longer wrap to the next line.
- Removed an extra border in Markdown tables on iOS.
- Usernames in the channel member list are now properly aligned.
- Fixed a console error that was thrown when switching teams.
- Fixed occasionial flickering of channel autocomplete.
- Link preview images no longer appear outside of the preview container.

### Compatibility

#### Breaking changes:
- The **System Console > Configuration > [Site URL](../../administration/config-settings.html#site-url)** field is now mandatory. Set the Site URL in the System Console, or in the `gitlab.rb` file if you are using GitLab Mattermost.
- Server logs are now written to the `mattermost.log` file located in the directory specified in **System Console > Logging > [File Log Directory](../../administration/config-settings.html#file-log-directory)**. Set the directory name in the System Console, or in the `gitlab.rb` file if you are using GitLab Mattermost.

#### Removed and deprecated features
- Backwards compatibility with the old CLI tool is removed in v3.8. See [documentation to learn more about the new CLI tool](https://docs.mattermost.com/administration/command-line-tools.html).
- Deprecated APIv3 routes removed in v3.8:
   - `GET` at `/channels/more` (replaced by /`channels/more/{offset}/{limit}`)
   - `POST` at `/channels/update_last_viewed_at` (replaced by `/channels/view`)
   - `POST` at `/channels/set_last_viewed_at` (replaced by `/channels/view`)
   - `POST` at `/users/status/set_active_channel` (replaced by `/channels/view`)
- All APIv3 endpoints to be removed six months after APIv4 goes stable (replaced by APIv4 endpoints).

For a list of past and upcoming deprecated features, [see our website](https://about.mattermost.com/deprecated-features/).

#### config.json

Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json` or the System Console.

**Changes to Team Edition and Enterprise Edition**:

 - Under `EmailSettings` in `config.json`:
   - Added `"SkipServerCertificateVerification": false` to skip verification of smtp server certificates.

**Additional Changes to Enterprise Edition**:

 - Under `TeamSettings` in `config.json`:
   - Added `"RestrictPrivateChannelManageMembers": all` to set who can add and remove members from private groups.

### Database Changes

**Posts Table:**
- Added `IsPinned` column

### API Changes

**New routes (APIv3):**
- `GET` at `/channels/{channel_id}/pinned`
  - Returns the pinned posts in a channel
- `POST` at `/channels/{channel_id}/posts/{post_id}/pin`
  - Pins a post to a channel
- `POST` at `/channels/{channel_id}/posts/{post_id}/unpin`
  - Unpins a post from a channel

**Removed routes (APIv3):**
- `GET` at `/channels/more` (replaced by /`channels/more/{offset}/{limit}`)
- `POST` at `/channels/update_last_viewed_at` (replaced by `/channels/view`)
- `POST` at `/channels/set_last_viewed_at` (replaced by `/channels/view`)
- `POST` at `/users/status/set_active_channel` (replaced by `/channels/view`)

### Websocket Event Changes

**Added:**
- `added_to_team` that occurs when the current user is added to a team by another user.

**Modified**
- Added a `seq` field to websocket events that increments with each event sent to the client.

### Known Issues

- "Pinned" icon sometimes overlaps image posts.
- Full name is not editable in Account Settings if the first and last name attributes are removed from **System Console > Authentication > LDAP**.
- Usernames with dots do not get mention notifications when followed by a comma.
- Slack import doesn't add merged members/e-mail accounts to imported channels.
- User can receive a video call from another browser tab while already on a call.
- Sequential messages from the same user appear as separate posts on mobile view.
- Search autocomplete picker is broken on Android.
- Jump link in search results does not always jump to display the expected post.
- Blue bar "Preview Mode" header message sometimes does not disappear after enabling email notifications.
- Removing an expired license may not remove the blue bar header message until a refresh.
- First load of the emoji picker is slow at low connections.
- Emoji picker for reactions doesn't always position correctly.
- Deleted custom emoji stay in "recently used" section of the emoji picker.
- Scrollbar is sometimes not visible in the left-hand sidebar after switching teams.

### Contributors

Many thanks to all our contributors. In alphabetical order:

/mattermost-server:

- [aautio](https://github.com/aautio), [asaadmahmood](https://github.com/asaadmahmood), [bonespiked](https://github.com/bonespiked), [bradhowes](https://github.com/bradhowes), [coreyhulen](https://github.com/coreyhulen), [cpanato](https://github.com/cpanato), [crspeller](https://github.com/crspeller), [doh5](https://github.com/doh5), [enahum](https://github.com/enahum), [esethna](https://github.com/esethna), [grundleborg](https://github.com/grundleborg), [hmhealey](https://github.com/hmhealey), [jasonblais](https://github.com/jasonblais), [JeffSchering](https://github.com/JeffSchering), [jostyee](https://github.com/jostyee), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [lindalumitchell](https://github.com/lindalumitchell), [prixone](https://github.com/prixone), [R-Wang97](https://github.com/R-Wang97), [saturninoabril](https://github.com/saturninoabril), [VeraLyu](https://github.com/VeraLyu)

/docs:

- [coreyhulen](https://github.com/coreyhulen), [esethna](https://github.com/esethna), [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais), [JeffSchering](https://github.com/JeffSchering), [jwilander](https://github.com/jwilander), [lindy65](https://github.com/lindy65), [Rohlik](https://github.com/Rohlik)

/mattermost-redux:

- [enahum](https://github.com/enahum), [hmhealey](https://github.com/hmhealey), [jarredwitt](https://github.com/jarredwitt), [jwilander](https://github.com/jwilander)

/mattermost-api-reference:

- [cpanato](https://github.com/cpanato), [grundleborg](https://github.com/grundleborg), [hmhealey](https://github.com/hmhealey), [jwilander](https://github.com/jwilander), [saturninoabril](https://github.com/saturninoabril), [senk](https://github.com/senk)

/mattermost-mobile:

- [csduarte](https://github.com/csduarte), [enahum](https://github.com/enahum), [hmhealey](https://github.com/hmhealey), [jasonblais](https://github.com/jasonblais), [JeffSchering](https://github.com/JeffSchering), [lfbrock](https://github.com/lfbrock), [saturninoabril](https://github.com/saturninoabril)

/mattermost-selenium:

- [coreyhulen](https://github.com/coreyhulen), [lindalumitchell](https://github.com/lindalumitchell)

/desktop:

- [jasonblais](https://github.com/jasonblais), [yuya-oc](https://github.com/yuya-oc)

/mattermost-docker:

- [xcompass](https://github.com/xcompass)

/mattermost-kubernetes:

- [coreyhulen](https://github.com/coreyhulen)

/mattermost-load-test:

- [crspeller](https://github.com/crspeller), [csduarte](https://github.com/csduarte)


## Release v3.7.5

### Notes on Patch Release

 - **v3.7.5, released 2017-04-27**
   - Fixed a number of low to moderate severity security issues, and [upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/)
     - Note: The **System Console > Configuration > [Site URL](../../administration/config-settings.html#site-url)** field is now mandatory. Set the Site URL in the System Console, or in the `gitlab.rb` file if you are using GitLab Mattermost.
 - **v3.7.4, released 2017-04-13**
   - Fixed a number of low to high severity security issues, and [upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/)
 - **v3.7.3, released 2017-03-23**
   - Fixed a high severity security issue, and [upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/)
   - Fixed an issue with telemetry data collection
 - **v3.7.2, released 2017-03-17**
   - Fixed an issue with LDAP, SAML, and OAuth logins where 1 and 2 character usernames displayed incorrectly
 - **v3.7.1, released 2017-03-16**
   - Fixed an issue where some [System Console > Policy settings](https://docs.mattermost.com/administration/config-settings.html#policy) were incorrectly applied to Team Edition, breaking the System Console UI
 - **v3.7.0, released 2017-03-16**
   - Original 3.7 release

### Security Update

- Mattermost v3.7.0 contains a [security update](https://mattermost.com/security-updates/). [Upgrading to Mattermost v3.7.0](https://docs.mattermost.com/administration/upgrade.html) is highly recommended.

### Highlights

#### Group Messaging

- Added support for multi-party direct messages, you can now quickly create conversations with a small group of people directly from the Direct Message list

#### Channel Push Notification Preferences

- Added channel notification preferences for mobile push to customize your notification settings

#### New Website Link Previews

- Improved display of link previews for website content when available, replacing the previous preview feature that handled only a subset of links

#### Bulk User Import Tool

- Convert your existing data into our new import format, and use this tool to import teams, channels, users and posts from other systems

#### Channel Admins ([Enterprise E10 & E20](https://mattermost.com/pricing-self-managed/))

- Added a new "Channel Admin" role to grant permissions for renaming and deleting a channel

#### SAML OneLogin ([Enterprise E20](https://mattermost.com/pricing-self-managed/))

- Added support for OneLogin authentication and account creation via SAML 2.0.

### Improvements

#### Performance

- Loading new users can now be run on a live system without a major impact on performance through the new bulk user import tool
- Optimized SQL queries by adding index for PostId, removing ParentId from delete post queries, and fixing blank post queries
- Increased performance for "user typing..." messages by moving the check from server to client
- Increased performance for direct message channels by removing `MakeDirectChannelVisible` call and adding client handling
- Moved channel permission checks back to using cache
- Added caching for emoji, file info, profile images and website link previews
- Adding index and caching to reactions
- Increased performance when receiving messages by
    - removing the `viewChannel` requests when receiving a new post and only marking the channel as read when switching into it, out of it or when closing the app
    - removing the `view_channel` websocket event from the server
    - removing the `getChannel` and `getTeamUnreads` requests when receiving a new post
    - adding client handling for marking channels and teams unread
    - adding `getMyChannelMembers` request to web app when window becomes active after ten seconds
- Increased time between database recycles
- Improved mobile push proxy connections by disabling keep-alives
- Fixed Minio not properly closing read objects
- Fixed file info caching and emoji reaction issues on Aurora read replicas
- Added reloading, removing and uploading of Enterprise license key to cache purge

#### Web User Interface

- Update status indicators shown in post view
- Show `(Edited)` indicator if a message has been edited
- `(message deleted)` placeholder is no longer shown to the user that deleted the message
- Added a link to Manage Members modal from channel members list
- Added support for image previews if the URL contains a custom query
- Added support for all timecode formats for YouTube previews
- System message is now posted after changing channel purpose
- Reinstated the delete option on system messages
- Clicking on timestamps on messages now open a permalink view
- Removed new lines for system messages posted after updating channel header
- Focus is set back to message box after uploading a file
- Added machine-readable date and time to timestamps
- Adjusted tablet view so the browser URL bar doesn't overlap the message box
- Channel header can now be up to 1024 characters long
- Changed custom theme vector to a list of name value pairs to more easily add new theme colours

#### Mobile

- New push proxy server supports multiple apps (in preparation for the second generation mobile apps)
- New push proxy server is backwards compatible with the old iOS and Android apps
- Unread channels on the channel view are indicated with a red dot, and unread mentions with a red dot and mention count
- Added floating timestamp to mobile right hand side
- Send icon is disabled for messages and comments until a valid message is typed
- Removed redundant search hint popover and updated search buttons
- Removed "@"-symbol preceeding usernames and full names in push notifications

#### Text Formatting

- Added support for explicit image sizes in markdown
- Terms such as `_AAA_BBB_` now italicize correctly
- First backslash is now truncated when posting file paths that start with `\\`
- Markdown isn't rendered for system messages posted after renaming a channel
- Messages beginning with `[some_text]: some_text` now longer post as blank space
- Pipe characters (`|`) in a Markdown table now work

#### Integrations

- Added edit screens for incoming and outgoing webhooks
- When no username is set for a slash command response, the username of the person is now used instead of "webhook"
- Added a confirmation dialog to prevent accidentally deleting an integration

#### Localization

- System messages are now localized based on language set in the Account Settings

#### Onboarding

- Clicking on email verification link now automatically fills in your email address on the sign in page
- On login with GitLab SSO, Mattermost username and email are now synced with GitLab username and email

#### Slack Import

- Added support for Slack's Markdown-like post formatting
- Added support for topic & purpose system messages
- Channels imported from Slack with the same name as a deleted channel now import successfully
- Added support for users who don't have a non-empty email address in Slack

#### System Console

- Added active users statistics to Site Statistics page
- Focus is set to server log control in **System Console > Reporting > Logs** when loading the panel

#### Enterprise Edition

- Added WebSocket events, webhook events and cluster request time logging for Performance Monitoring
- Added new policy settings to **System Console > General > Policy** to
   - restrict who can delete messages
   - restrict whether messages can be edited and for how long

### Bug Fixes

- Fixed an error where a channel would no longer load after using a GitLab built-in Mattermost slash command `/project issue show <number>`
- Outdated results in modal searches are now properly discarded
- Fixed order of channels on the sidebar
- Fixed search highlighting for wildcard searches and hashtags
- Clicking "Send message" link in profile popover in a comment thread, now properly opens the direct message channel
- Fixed channels missing from "More Channels" modal after leaving them
- Fixed webhook messages not appearing in channels the creator wasn't in
- Angled brackets around mailto links now longer autolink
- Fixed an issue where "New messages below" bubble didn't disappear properly on mobile view
- Fixed CLI panic on `platform channel create` command if team does not exist
- Team invite link now directs user to a private team after account creation with LDAP
- `Create a New Team` menu option is now in the Main Menu for System Admins when team creation is disabled
- Fixed the response for malformed command execute request
- New message indicator no longer appears for ephemeral posts
- Fixed emoji aliases not showing up in autocomplete
- Mention badge now properly updates on the team sidebar when switching teams
- (at)-mention preceeded by a "#"-symbol now displays correctly
- Don't allow APIs to create user accounts that start with a number preventing them from signing in
- Using a mouse to choose an emoji from the autocomplete now works
- Fixed syntax highlighting on mobile
- Fixed inconsistent styling of file uploads between mobile and desktop
- Push notifications are no longer missing username when preferences set to "For all activity"
- Fixed a bug where the Go driver was using a wrong URL for `/users/claim/email_to_oauth` route

### Compatibility

#### Removed and deprecated features

 - Removed `ServiceSettings: "SegmentDeveloperKey"` setting in `config.json`
 - Backwards compatibility with the old CLI tool will be removed in Mattermost v3.8 April/2017 release. See [documentation to learn more about the new CLI tool](https://docs.mattermost.com/administration/command-line-tools.html).
 - Deprecated APIv3 routes to be removed in Mattermost v3.8 April/2017 release:
   - `GET` at `/channels/more` (replaced by /`channels/more/{offset}/{limit}`)
   - `POST` at `/channels/update_last_viewed_at` (replaced by `/channels/view`)
   - `POST` at `/channels/set_last_viewed_at` (replaced by `/channels/view`)
   - `POST` at `/users/status/set_active_channel` (replaced by `/channels/view`)
 - All APIv3 endpoints to be removed six months after APIv4 goes stable (replaced by APIv4 endpoints).)

For a list of past and upcoming deprecated features, [see our website](https://about.mattermost.com/deprecated-features/).

#### config.json

Changes from v3.6 to v3.7:

Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json` or the System Console.

**Changes to Team Edition and Enterprise Edition**:

 - Under `ServiceSettings` in `config.json`:
   - Added `"TimeBetweenUserTypingUpdatesMilliseconds": 5000` to control how frequently the "user is typing..." messages are updated
   - Added `"EnableUserTypingMessages": true` to control whether "user is typing..." messages are displayed below the message box
   - Added `"EnableLinkPreviews": false` to control whether a preview of website content is displayed below the message

**Additional Changes to Enterprise Edition**:

 - Under `ServiceSettings` in `config.json`:
   - Added `"RestrictPostDelete": all` to set who can delete messages
   - Added `"AllowEditPost": always` to set whether messages can be edited
   - Added `"PostEditTimeLimit": 300` to set how long messages can be edited, if `"AllowEditPost": time_limit` is specified
   - Added `"ClusterLogTimeoutMilliseconds": 2000` to control frequency of cluster request time logging for [performance monitoring](https://docs.mattermost.com/deployment/metrics.html)

### Database Changes from v3.6 to v3.7

**Posts Table:**
- Added `EditAt` column

### API Changes from v3.6 to v3.7

**New routes (APIv3):**
- `POST` at `/channels/create_group`
  - Creates a new group message channel
- `POST` at `/hooks/incoming/update`
  - Updates an incoming webhook
- `POST` at `/hooks/outgoing/update`
  - Updates an outgoing webhook
- `GET` at `/teams/{team_id}/...`
  - Returns a post list, based on the provided channel and post ID.
- `POST` at `/channels/{channel_id}/update_member_roles`
  - Updates the user's roles in a channel

### Websocket Event Changes from v3.6 to v3.7

**Added:**
- `channel_create` that occurs each time a channel is created
- `group_added` that occures when a new group message channel is created

**Removed:**
- `view_channel` that occurred when a new message was received

### Known Issues

- Slack import doesn't add merged members/e-mail accounts to imported channels
- User can receive a video call from another browser tab while already on a call
- Sequential messages from the same user appear as separate posts on mobile view
- Edge overlays desktop notification sound with system notification sound
- Search autocomplete picker is broken on Android
- Jump link in search results does not always jump to display the expected post
- Running CLI without access to logs causes panic
- Switching channels with CTRL/CMD+K doesn't work properly when using the mouse
- Reacting to a deleted message in the right-hand sidebar throws an error
- Sometimes no email verification is sent to the new email address after changing your email in Account Settings. A workaround is to sign in with the new email address and hitting "Resend Email" on the "Email not verified" page
- Clicking "Load more messages" sometimes brings you to the bottom of the page
- Switching to a channel with unreads sometimes doesn't jump to the correct scrolling position

### Contributors

Many thanks to all our contributors. In alphabetical order:

/mattermost-server

- [aautio](https://github.com/aautio), [akihikodaki](https://github.com/akihikodaki), [andreistanciu24](https://github.com/andreistanciu24), [asaadmahmood](https://github.com/asaadmahmood), [ayadav](https://github.com/ayadav), [AymaneKhouaji](https://github.com/AymaneKhouaji), [bjoernr-de](https://github.com/bjoernr-de), [coreyhulen](https://github.com/coreyhulen), [cpanato](https://github.com/cpanato), [CrEaK](https://github.com/CrEaK), [crspeller](https://github.com/crspeller), [DavidLu1997](https://github.com/DavidLu1997), [debanshuk](https://github.com/debanshuk), [enahum](https://github.com/enahum), [erikgui](https://github.com/erikgui), [favadi](https://github.com/favadi), [gig177](https://github.com/gig177), [grundleborg](https://github.com/grundleborg), [hmhealey](https://github.com/hmhealey), [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais), [jazzzz](https://github.com/jazzzz), [JeffSchering](https://github.com/JeffSchering), [joannekoong](https://github.com/joannekoong), [jostyee](https://github.com/jostyee), [jurgenhaas](https://github.com/jurgenhaas), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [khawerrind](https://github.com/khawerrind), [laur89](https://github.com/laur89), [lfbrock](https://github.com/lfbrock), [mikaoelitiana](https://github.com/mikaoelitiana), [morenoh149](https://github.com/morenoh149), [mpoornima](https://github.com/mpoornima), [pan-feng](https://github.com/pan-feng), [pepf](https://github.com/pepf), [Rudloff](https://github.com/Rudloff), [ruzette](https://github.com/ruzette), [saturninoabril](https://github.com/saturninoabril), [senk](https://github.com/senk), [Zaicon](https://github.com/Zaicon), [ZJvandeWeg](https://github.com/ZJvandeWeg)

/api-reference

- [debanshuk](https://github.com/debanshuk), [enahum](https://github.com/enahum), [jwilander](https://github.com/jwilander), [ruzette](https://github.com/ruzette), [Zaicon](https://github.com/Zaicon)

/docs

- [asaadmahmood](https://github.com/asaadmahmood), [cpanato](https://github.com/cpanato), [crspeller](https://github.com/crspeller), [esethna](https://github.com/esethna), [grundleborg](https://github.com/grundleborg), [hmhealey](https://github.com/hmhealey), [ilabdsf](https://github.com/ilabdsf), [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais), [JeffSchering](https://github.com/JeffSchering), [jostyee](https://github.com/jostyee), [jwilander](https://github.com/jwilander), [lfbrock](https://github.com/lfbrock), [lindy65](https://github.com/lindy65), [matmorel](https://github.com/matmorel), [senk](https://github.com/senk), [vladimirprieto](https://github.com/vladimirprieto), [wget](https://github.com/wget)

/mobile

- [asaadmahmood](https://github.com/asaadmahmood), [csduarte](https://github.com/csduarte), [enahum](https://github.com/enahum), [hmhealey](https://github.com/hmhealey), [jasonblais](https://github.com/jasonblais), [lfbrock](https://github.com/lfbrock)

/docker

- [darkrasid](https://github.com/darkrasid), [nikosch86](https://github.com/nikosch86), [xcompass](https://github.com/xcompass)

/desktop

- [asaadmahmood](https://github.com/asaadmahmood), [jasonblais](https://github.com/jasonblais), [jnugh](https://github.com/jnugh), [yuya-oc](https://github.com/yuya-oc)

/selenium

- [coreyhulen](https://github.com/coreyhulen), [esethna](https://github.com/esethna), [lindalumitchell](https://github.com/lindalumitchell)

/push-proxy

- [coreyhulen](https://github.com/coreyhulen), [jostyee](https://github.com/jostyee), [it33](https://github.com/it33)

/load-test

- [coreyhulen](https://github.com/coreyhulen), [crspeller](https://github.com/crspeller)

## Release v3.6.7

### Notes on Patch Release

 - **v3.6.7, released 2017-04-27**
   - Fixed a number of low to moderate severity security issues, and [upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/)
     - Note: The **System Console > Configuration > [Site URL](../../administration/config-settings.html#site-url)** field is now mandatory. Set the Site URL in the System Console, or in the `gitlab.rb` file if you are using GitLab Mattermost.
 - **v3.6.6, released 2017-04-13**
   - Fixed a number of low to high severity security issues, and [upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/)
   - Fixed an issue where Direct Messages list didn't always properly update in the left-hand sidebar
   - Upgraded MySQL driver for better performance
 - **v3.6.5, released 2017-03-23**
   - Fixed a high severity security issue, and [upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/)
 - **v3.6.4, released 2017-03-16**
   - Fixed an issue where some [System Console > Policy settings](https://docs.mattermost.com/administration/config-settings.html#policy) were incorrectly applied to Team Edition, breaking the System Console UI
 - **v3.6.3, released 2017-03-16**
   - Fixed a security issue, and [upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/)
 - **v3.6.2, released 2017-01-31**
   - Fixed a high severity security issue, and [upgrading](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 14 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/)
   - Improved performance of web sockets and typing messages
   - Note: Some deployments using multiple URLs to reach Mattermost via proxy forwarding are reporting issues with the security fix in 3.6.2. [The issue is being tracked in our ticketing system](https://mattermost.atlassian.net/browse/PLT-5635).
 - **v3.6.1, released 2017-01-19**
   - Fixed a performance regression when sending many notifications at once (for example, when `@all` or `@channel` is used in a channel with many users)
   - Fixed an issue where the config flag for the CLI was not backwards compatible
   - Fixed an upgrade issue where for some databases, the Team Description index was not created properly
   - Fixed an issue with messages not showing up after computer wakes from sleep
 - **v3.6.0, released 2017-01-16**
   - Original 3.6 release.

### Security Update

- Mattermost v3.6.0 contains a [security update](https://mattermost.com/security-updates/). [Upgrading to Mattermost v3.6.0](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Thanks to Julien Ahrens for contributing the security report through the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

### Highlights

#### Team Sidebar
- Added a new sidebar on left-hand side to improve cross-team notifications and team switching
- New sidebar improves user experience on the [Mattermost Desktop Apps](https://mattermost.com/apps) when engaging with multiple teams

#### MFA Enforcement ([Enterprise E10 & E20](https://mattermost.com/pricing-self-managed/))
- Added support for MFA Enforcement. When set to true, all users with email or LDAP authentication are required to set up MFA for their accounts

#### Performance Monitoring ([Enterprise E20](https://mattermost.com/pricing-self-managed/))
- Added support for performance monitoring in large-scale deployments to help optimize systems for maximum performance using integrations with [Prometheus](https://github.com/prometheus/prometheus) and [Grafana](https://grafana.org/)
- Includes metrics for caching, database connections, processing, logins and messaging. See [documentation to learn more](https://docs.mattermost.com/deployment/metrics.html)

#### Improved Command Line Interface
- New version of CLI with a more intuitive interface, interactive help documentation, and some added functionality. See [documentation to learn more](https://docs.mattermost.com/administration/command-line-tools.html)

### Improvements

#### Performance
- Added server-based channel autocomplete, search and paging
- Reduced lag on channel switcher (CTRL/CMD+K) and at-mention autocomplete
- Improved on-boarding performance by removing new user event handling on the client
- Improved channel switching performance by combining API events and only pulling user statuses the client doesn't yet have
- Added session cache directly to web connections
- Added caching for files, user profiles and for the last 60 posts in a channel
- Added ETag for user profile pictures and modified ETag for posts to improve caching validation
- Added caching to post and channel calls
- Fixed channel cache not being sent to a cluster
- Added a configuration setting to disable intensive System Console statistics queries for maximum performance ([Enterprise E10 & E20 only](https://mattermost.com/pricing-self-managed/))

#### Notifications
- Desktop notifications no longer appear for the channel you are actively viewing
- Push and email notifications now follow the setting for Teammate Name Display
- Notifications for @mentions of your username can no longer be turned off

#### Account Settings
- Added a "Position" field, where users can add a job title to be shown in their profile popover

#### Team Settings
- Team description can be set by a Team Admin and is visible to all users on the join teams screen and in the tool tip over the team name
- Slack Import can now import integration messages

#### Slash Commands
- Existing slash commands can now be edited by the creator or by Team and System Admins
- Slash commands now work on the right-hand sidebar
- Added support for slash commands to set the username and icon directly from the reply payload

#### Channels
- System message is now posted for all users when a channel or group is renamed
- Any channel member can now remove other users from the channel

#### Messaging
- Added support for non-alphanumeric unicode characters in hashtags
- Custom Emojis larger than 64kB can now be uploaded and they will be appropriately resized

#### User Interface
- Added a direct message link to the profile popover
- Added an indicator to convey a new message is received when scrolled up in the center pane
- Removed status indicators on posts by webhooks
- Channel switcher (CTRL/CMD+K) search results for direct messages now match message autocomplete
- Autocomplete is now case insensitive for @-mentions, emojis, slash commands and channel linking

#### Enterprise Edition
- Split out channel management permissions into separate settings for creation, deletion, and renaming a channel
- Ability to set the maximum number of users in a channel that will disable @all and @channel notifications
- Added ability to set a user's Position field with LDAP sync or SAML
- New option to purge all in-memory caches for sessions, accounts and channels

### Bug Fixes
- Integrations that post to Direct Message channels now mark the channel as Unread
- @mention autocomplete will now filter on Chinese, Japanese, Korean names
- Text focus is now set on the text input area after channel creation
- Editing old posts no longer causes them to repost for other members of the channel
- Email invitation subject line no longer displays HTML characters in place of apostrophes in the team name
- Current user is no longer displayed in the direct messages modal
- Searching on direct messages modal now happens on typing rather than after hitting ENTER
- More Channels modal now resets search when opening and closing the dialog
- Channel switcher (CTRL/CMD+K) now works for direct message channels of users outside the team
- Using the command line to invite users no longer sends an invalid join team link
- Sleeping and waking your computer while logged into Mattermost no longer causes a console error
- Searching for users in double in quotes in the direct message modal no longer throws an error
- XML file preview no longer throws a JavaScript error
- User autocomplete in message box no longer matches against email
- Channel linking (with ~ shortcut) now works for channels you don't belong to
- Fixed statistics for websockets and database connections in **System Console** > **Site Statistics** to work in [High Availability mode](https://docs.mattermost.com/deployment/cluster.html)
- Slash commands now work in newly created private channels without requiring a refresh
- Zapier app channel dropdown selector works again
- Fixed sign in errors for non-admin accounts when custom emojis are restricted to Team and System Admins
- Fixed encoding of file names when downloading attachments
- Unflagging or flagging a post in the right-hand sidebar no longer forces a scroll to the top of the flagged posts list
- User list in **System Console > Teams** is no longer blank on first load
- Fixed a bug where sometimes the right-hand sidebar would not display properly when switching to view another channel

### Compatibility
Changes from v3.5 to v3.6:

**Special Upgrade Note:**
(Enterprise Edition) If you previously had values set for `RestrictPublicChannelManagement` and `RestrictPrivateChannelManagement`, the new settings for  `RestrictPublicChannelCreation`, `RestrictPrivateChannelCreation`, `RestrictPublicChannelDeletion`, and `RestrictPrivateChannelDeletion` will take those settings as their default values.

#### config.json

Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json` or the System Console.

**Changes to Team Edition and Enterprise Edition**:

Deprecated Settings:

 - Under `ServiceSettings` in `config.json`:
   - `"SegmentDeveloperKey"` to be removed in v3.7

**Additional Changes to Enterprise Edition**:

The following config settings will only work on servers with an Enterprise License that has the feature enabled.

- Under `ServiceSettings` in `config.json`:
   - Added `”EnforceMultifactorAuthentication": false` to control whether MFA in enforced
- Under `TeamSettings` in `config.json`:
   - Changed `"RestrictPublicChannelManagement": "all"` to only control who can edit the channel header, purpose, and name of public channels (previously it also controlled creation and deletion)
  - Changed `"RestrictPrivateChannelManagement": "all"` to only control who can edit the channel header, purpose, and name of private groups (previously it also controlled creation and deletion)
  - Added `"RestrictPublicChannelCreation": "all"` to control who can create public channels
  - Added `"RestrictPrivateChannelCreation": "all"` to control who can create private groups
  - Added `"RestrictPublicChannelDeletion”: "all"` to control who can delete public channels
  - Added `"RestrictPrivateChannelDeletion": "all"` to control who can delete private channels
  - Added `"MaxNotificationsPerChannel": 1000` to set the maximum number of channel members for which `@all` and `@channel` notifications will be sent
- Under `LdapSettings` in `config.json`:
  - Added `"PositionAttribute": ""` to select an LDAP attribute to synchronize for the user position (job title) field
- Under `SamlSettings` in `config.json`:
  - Added `"PositionAttribute": ""` to select an LDAP attribute to synchronize for the user position (job title) field
- Added `MetricsSettings` in `config.json` for performance monitoring settings:
  - Added `"Enable": false` to control whether performance monitoring is enabled
  - Added `"BlockProfileRate": 0` to control the [fraction of goroutine blocking events that are reported in the blocking profile](https://golang.org/pkg/runtime/#SetBlockProfileRate)
  - Added `"ListenAddress": ":8067"` to control the address the server will listen on to expose performance metrics
- Added `AnalyticsSettings` in `config.json` for analytics settings:
  - Added `"MaxUsersForStatistics": 2500` to set the maximum number of users on the server before statistics for total posts, total hashtag posts, total file posts, posts per day, and active users with posts per day are no longer counted (use this setting to improve performance on large instances)

### Database Changes from v3.5 to v3.6

**Posts Table:**
- Added `HasReactions` column

**Teams Table:**
- Added `Description` column

**Users Table:**
- Added `Position` column

**Status Table:**
- Removed `ActiveChannel` column

### API Changes from v3.5 to v3.6

**New routes:**
- Added `POST` at `/commands/update`
  - Updates a slash command
- Added `GET` at `/users/name/{username}`
  - Returns a user matching the given username
- Added `GET` at `/users/email/{email}`
  - Returns a user matching the given email
- Added `GET` at `/users/autocomplete`
  - Returns a list of users on the system that have a username, full name, or nickname that match against the provided term
- Added `GET` at `/teams/name/{team_name}`
  - Returns team object for a given team name
- Added `GET` at `/teams/{team_id}/channels/name/{channel_name}`
  - Returns a channel for a given channel name
- Added `POST` at `/teams/{team_id}/channels/{channel_id}/members/ids`
  - Returns channel member objects for the channel and user IDs specified
- Added `GET` at `/teams/members`
  - Returns an array with the teams the current user belongs to
- Added `GET` at `/teams/unread`
  - Returns an array containing the amount of unread messages and mentions for the teams the current user belongs to
- Added `POST` at `/teams/{team_id}/channels/view`
  - Performs all actions related to viewing a channel, including marking channels as read, clearing push notifications, and updating the active channel
- Added `POST` at `/teams/{team_id}/channels/{channel_id}/posts/{post_id}/reactions/save`
  - Saves an emoji reaction for a post, returns the saved reaction if successful
- Added `POST` at `/teams/{team_id}/channels/{channel_id}/posts/{post_id}/reactions/delete`
  - Removes an emoji reaction for a post in the given channel, returns nil if successful
- Added `GET` at `/teams/{team_id}/channels/{channel_id}/posts/{post_id}/reactions'`
  - Returns a list of all emoji reactions for a post
- Added `GET` at `/admin/invalidate_all_caches`
  - Purge all the in-memory caches for things like sessions, accounts, channels; deployments using High Availability will attempt to purge all the servers in the cluster (this may adversely impact performance)
- Added `GET` at `/channels/more/{offset}/{limit}`
  - Returns a page of public channels the user is not in based on the provided offset and limit
-  Added `POST` at `/channels/more/search`
  - Returns a list of public channels the user is not in that match the search criteria
- Added `GET` at `/channels/autocomplete`
  - Returns a list of public channels that match the provided string

**Deprecated routes:**
- `GET` at `/channels/more` (replaced by /`channels/more/{offset}/{limit}`) to be removed in v3.7
- `POST` at `/channels/update_last_viewed_at` (replaced by `/channels/view`) to be removed in v3.8
- `POST` at `/channels/set_last_viewed_at` (replaced by `/channels/view`) to be removed in v3.8
- `POST` at `/users/status/set_active_channel` (replaced by `/channels/view`) to be removed in v3.8

**Removed routes:**
- `POST` at `/teams/create_from_signup`
- `POST` at `/teams/signup`

**Changed routes:**
 - Updated `teams/{team_id}/commands/execute` endpoint request body field from `channelId` to `channel_id`

### Websocket Event Changes from v3.5 to v3.6

**Added:**
- `update_team` that occurs each time the team info is updated
- `reaction_added` that occurs when an emoji reaction is added to a post
- `reaction_removed` that occurs when an emoji reaction is removed from a post

### Known Issues

- Slack Import doesn't add merged members/e-mail accounts to imported channels
- User can receive a video call from another browser tab while already on a call
- Video calls do not work with Chrome v56 and later
- Sequential messages from the same user appear as separate posts on mobile view
- Edge overlays desktop notification sound with system notification sound
- Deleting a message from a permalink view doesn't show delete until refresh
- Search autocomplete picker is broken on Android

### Contributors

Many thanks to all our contributors. In alphabetical order:

/mattermost-server

- [asaadmahmood](https://github.com/asaadmahmood), [bjoernr-de](https://github.com/bjoernr-de), [bolecki](https://github.com/bolecki), [brendanbowidas](https://github.com/brendanbowidas), [CometKim](https://github.com/CometKim), [coreyhulen](https://github.com/coreyhulen), [cpanato](https://github.com/cpanato), [crspeller](https://github.com/crspeller), [debanshuk](https://github.com/debanshuk), [enahum](https://github.com/enahum), [esethna](https://github.com/esethna), [fraziern](https://github.com/fraziern), [grundleborg](https://github.com/grundleborg), [hmhealey](https://github.com/hmhealey), [it33](https://github.com/it33), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [khawerrind](https://github.com/khawerrind), [lfbrock](https://github.com/lfbrock), [maruTA-bis](https://github.com/maruTA-bis), [pepf](https://github.com/pepf), [raphael0202](https://github.com/raphael0202), [Rudloff](https://github.com/Rudloff), [Yangchen1](https://github.com/Yangchen1), [ZJvandeWeg](https://github.com/ZJvandeWeg)

/docs

- [aureliojargas](https://github.com/aureliojargas), [axilleas](https://github.com/axilleas), [esethna](https://github.com/esethna), [grundleborg](https://github.com/grundleborg), [hmhealey](https://github.com/hmhealey), [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais), [JeffSchering](https://github.com/JeffSchering), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [lfbrock](https://github.com/lfbrock), [lindy65](https://github.com/lindy65), [nils-werner](https://github.com/nils-werner), [okin](https://github.com/okin), [quentinus95](https://github.com/quentinus95), [qyra](https://github.com/qyra), [shieldsjared](https://github.com/shieldsjared), [tejasbubane](https://github.com/tejasbubane), [Tethik](https://github.com/Tethik), [yangchen1](https://github.com/yangchen1), [yumenohosi](https://github.com/yumenohosi), [yuya-oc](https://github.com/yuya-oc), [ZJvandeWeg](https://github.com/ZJvandeWeg)

/mattermost-docker-preview

- [cpanato](https://github.com/cpanato), [hyeseongkim](https://github.com/hyeseongkim), [jasonblais](https://github.com/jasonblais), [mattermost-build](https://github.com/mattermost-build)

/desktop

- [jasonblais](https://github.com/jasonblais), [jnugh](https://github.com/jnugh), [yuya-oc](https://github.com/yuya-oc)

/mattermost-mobile

- [csduarte](https://github.com/csduarte), [enahum](https://github.com/enahum), [hmhealey](https://github.com/hmhealey), [it33](https://github.com/it33), [thomchop](https://github.com/thomchop)

/mattermost-load-test

- [crspeller](https://github.com/crspeller), [it33](https://github.com/it33)

/mattermost-driver-javascript

- [Mattermost-build](https://github.com/Mattermost-build)

/android

- [CometKim](https://github.com/CometKim), [coreyhulen](https://github.com/coreyhulen), [DavidLu1997](https://github.com/DavidLu1997), [dmeza](https://github.com/dmeza), [esethna](https://github.com/esethna)

/mattermost-webrtc

- [enahum](https://github.com/enahum)

/mattermost-api-reference

- [CometKim](https://github.com/CometKim), [cpanato](https://github.com/cpanato), [enahum](https://github.com/enahum), [grundleborg](https://github.com/grundleborg), [hmhealey](https://github.com/hmhealey), [jwilander](https://github.com/jwilander), [MartinDelille](https://github.com/MartinDelille), [trarbr](https://github.com/trarbr), [ZJvandeWeg](https://github.com/ZJvandeWeg)

/mattermost-docker

- [Andrey9kin](https://github.com/Andrey9kin), [esethna](https://github.com/esethna), [jasonblais](https://github.com/jasonblais)

/ios

- [esethna](https://github.com/esethna)

/mattermost-push-proxy

- [coreyhulen](https://github.com/coreyhulen)

Thanks also to those who reported bugs that benefited the release, in alphabetical order:

 - [bjoernr-de](https://github.com/bjoernr-de) ([#5079](https://github.com/mattermost//mattermost-server/issues/5079)), [S6066](https://github.com/S6066) ([#5011](https://github.com/mattermost//mattermost-server/issues/5011))

## Release v3.5.1

### Notes on Patch Release

 - **v3.5.1, released 2016-11-23**
   - Security update to preventing cross-site scripting and remote code execution, thanks to Harrison Healey for [reporting responsibly](https://mattermost.org/responsible-disclosure-policy/).
   - Fixed an issue where usernames would sometimes not appear beside posts and the reply arrow would throw an error.
   - The channel purpose is no longer cut off in the user interface of the **More...** channel menu.
   - Fixed a scroll issue where the center channel didn't always scroll to the bottom when switching channels.
   - Fixed a server error that occurred when searching for users using an asterisk.
   - Fixed an issue where direct message channel headers would sometimes disappear.
   - "New Messages" indicator is fixed so it no longer remains visible after switching channels.
   - Fixed an issue where users could not join a public channel by navigating to the channel URL.
   - Email and push notifications are made asynchronous to fix a delay sending messages when HPNS was enabled.
   - Autocomplete timeout is decreased to make autocomplete more responsive to quick typing.
 - **v3.5.0, released 2016-11-16**
   - Original 3.5 release.

### Security Update

- Mattermost v3.5.1 contains multiple [security updates](https://mattermost.com/security-updates/). [Upgrading to Mattermost v3.5.1](https://docs.mattermost.com/administration/upgrade.html) is highly recommended. Thanks to Alyssa Milburn and Harrison Healey for contributing security reports through the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

### Highlights

#### Languages
- Added Russian translations for the user interface.
- Promoted Chinese (both simplified and traditional), German, French and Japanese to release-quality translations, removing beta tags.

#### Performance improvements for mobile and web experience

 - Ability to download assets in parallel via HTTP2 support.
 - Reduced CPU bottlenecks and optimized SQL queries.
 - Reduced load times through paging controls, server-side search and on-the-fly data loading that requests data as the client needs it.
 - Added paging APIs for profiles, channels and user lists.
 - Added client-scaling for auto-complete and status indicators.
 - Added server-side in-memory caching to reduce DB reads/writes.

#### Connection Security
- TLS is now supported directly on the Mattermost server. Learn more in our [documentation](https://docs.mattermost.com/install/config-tls-mattermost.html).
- Support for automatically fetching certificates through Let's Encrypt.

#### Minio File Storage
- Minio fully manages S3 API requests with automatic bucket location management across S3 regions.

#### Favorite Channels
- Added the ability to select Favorite Channels that appear at the top of the channels sidebar.

#### Video and Audio Calling (early-preview)
- Added early preview of video and audio calling option using self-hosted proxy.
- Intended as working prototype for community development, not recommended for production.
- Early preview does not include logging or detailed documentation.

#### Improved Slack Import
- Added the ability to import files from Slack (CLI command also supported).
- Added the ability to import bot/integration messages, Join/Leave messages, and /me messages.
- Duplicate users are now merged.
- Channel topics, purpose, and users now import correctly.
- Channel links now import correctly.

### Improvements

#### iOS Apps
- Channel settings, account settings, and channel header now render as full screen modals for better visibility
- [...] menu options now displayed larger for better usability
- Keyboard doesn't automatically close when sending a message, letting you quickly send several messages in succession
- When the "Download" link is clicked on files, a "Back" button lets users get back to the app

#### Android Apps
- Channel settings, account settings, and channel header now render as full screen modals for better visibility
- [...] menu options now displayed larger for better usability
- Disabled screen rotation
- Fixed where clicking on download button for a file attachment did nothing
- Keyboard doesn't automatically close when sending a message, letting you quickly send several messages in succession

#### User Interface
- Text (.txt) files now show a preview in the image previewer
- Status indicators are now visible in compact view
- Clicking on a profile picture in center channel or right hand sidebar brings up profile popover
- The "@" and flag icons next to search bar now toggles results
- [...] menu no longer displayed for system messages
- Browser tab name now changes when switching to System Console or Integrations pages
- A loading icon now shows on the team selection page
- On mobile devices, the keyboard now stays open after sending a message to make sending multiple messages easier

#### Notifications
- Notification sound settings are now honored on the [Mattermost Desktop Apps](https://mattermost.com/apps/)
- Push notifications can now be received on more than one device

#### Channel Shortlinking
- Channels can be shortlinked using the ~ character.
- Auto-complete works with both the channel handle and name

#### Integrations
- If a webhook is sent to a direct message channel that has not been created yet, the channel is now automatically created

#### Keyboard Shortcuts
- CTRL/CMD+SHIFT+M now toggles recent mentions results

#### Team Settings
- Team names are now restricted to be a minimum of two characters long, instead of four, to support abbreviated team names

#### System Console
- Maximum number of channels per team is now configurable

#### Enterprise Edition:
- Made the MFA secret key visible, so it's possible to set up Google Authenticator without scanning the QR code

### Bug Fixes
- Files can now be sent in Direct Messages across teams
- Correct login method now shown in System Console user lists
- Channel switcher (CTRL/CMD+K) no longer throws an error when switching to a user outside of your current team
- Channel switcher (CTRL/CMD+K) now works for creating new Direct Message channels
- Channels on the left hand side now sort numerically, alphabetically, and based on locale
- Fixed incorrect error message when trying a team URL with one character
- `/join` no longer throws an error for non-admin accounts
- Added System Message when user joins Off-Topic channel
- Added the "View Members" option to the channel menu on mobile
- Send button is now visible on tablet sized screens

### Compatibility
Changes from v3.4 to v3.5:

#### config.json

Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json` or the System Console.

**Changes to Team Edition and Enterprise Edition**:

- Under `ServiceSettings` in `config.json`:
    - Removed `"RestrictTeamNames": true` that controlled whether newly created team names were restricted.
    - Added `"ConnectionSecurity": ""` to select the type of encryption between Mattermost and your server.
    - Added `"TLSCertFile": ""` to specify the certificate file to use.
    - Added `"TLSKeyFile": ""` to specify the private key to use.
    - Added `"UseLetsEncrypt": false` to enable automatic retreval of certificates from the Let's Encrypt.
    - Added `"LetsEncryptCertificateCacheFile": "./config/letsencrypt.cache"` to specify the file to store certificates retrieved and other data about the Let's Encrypt service.
    - Added `"Forward80To443": false` to enable forwarding of all insecure traffic from port 80 to secure port 443.
    - Added `"ReadTimeout": 300` to specify the maximum time allowed from when the connection is accepted to when the request body is fully read.
    - Added `"WriteTimeout": 300` to specify the maximum time allowed from the end of reading the request headers until the response is written.
- Under `FileSettings` in `config.json`:
    - Addded `AmazonS3SSL": true` to allow insecure connections to Amazon S3.
- Under `RateLimitSettings` in `config.json`:
    - Changed: `"Enable": false` to disable rate limiting by default
    - Added `"MaxBurst": 100` to set the maximum number of requests allowed beyond the per second query limit
- Under `TeamSettings` in `config.json`:
    - Added `"MaxChannelsPerTeam": 2000` to set the maximum number of channels per team
- Under `WebrtcSettings` in `config.json`
    - Added `"Enable": false` to enable one-on-one video calls.
    - Added `"GatewayWebsocketUrl": ""` to specify the websocket used to signal and establish communication between the peers.
    - Added `"GatewayAdminUrl": ""` to specify the URl to obtain valid tokens for each peer to establish the connection.
    - Added `"GatewayAdminSecret": ""` to specify your admin secret password to access the Gateway Admin URL.
    - Added `"StunURI": ""` to specify your STUN URI.
    - Added `"TurnURI": ""` to specify your TURN URI.
    - Added `"TurnUsername": ""` to specify your TURN username
    - Added `"TurnSharedKey": ""` to specify your TURN server shared key to created dynamic passwords to establish the connection.

### Database Changes from v3.4 to v3.5

**FileInfo Table**

- Added `FileInfo` table

**Posts Table**

- Added `FileIds` column
- Added indexes for `DeleteAt`

**Channels Table**, **Commands Table**, **Emoji Table**, **Teams Table**, **IncomingWebhooks Table**, **OutgoingWebhooks Table**

- Added indexes for `CreateAt`
- Added indexes for `UpdateAt`
- Added indexes for `DeleteAt`

**TeamMembers Table**

- Added indexes for `DeleteAt`

**Sessions Table**

- Added indexes for `ExpiresAt`
- Added indexes for `CreateAt`
- Added indexes for `Last ActivityAt`

**Users Table**

- Added indexes for `CreateAt`
- Added indexes for `UpdateAt`
- Added indexes for `DeleteAt`
- Added full text indexes for `idx_users_all_txt`: Username, FirstName, LastName, Nickname, Email
- Added full text indexes for `idx_users_names_txt`:Username, FirstName, LastName, Nickname

### API Changes from v3.4 to v3.5

**New routes:**

- Added `POST` at `/users/search`
    - Search for user profiles based on username, full name and optionally team id.
- Added `GET` at `/users/{offset}/{limit}`
    - Retrieves a page of system-wide users
- Added `POST` at `/teams/{team_id}/update_member_roles`
    - Update a user's roles for the specified team.
- Added `GET` at `/teams/{team_id}/channels/{channel_id}/members/{user_id}`
    - Retrieves the channel member for the specified user. Useful for fetching the channel member after updates are made to it. If the channel member does not exist, then return an error.
- Added `GET` at `/teams/{team_id}/stats`
    - Returns stats for teams which includes total user count and total active user count.
- Added `GET` at `/teams/{team_id}/members/{offset}/{limit}`
    - To page through team members
- Added `POST` at `/teams/{team_id}/members/ids`
    - Retrieves a list of team members based on user ids
- Added `GET` at `/teams/{team_id}/members/{user_id}`
    - Retrieves a single team member
- Added `GET` at `/teams/{team_id}/posts/{post_id}/get_file_infos`
    - Retrieves file attachment info for a post
- Added `GET` at `/channels/{channel_id}/users/{offset}/{limit}`
    - Retrieves profiles for users in the channel
- Added `GET` at `/channels/{channel_id}/users/not_in_channel/{offset}/{limit}`
    - Retrieves profiles for users not in the channel
- Added `POST` at `/webrtc/token`
    - Retrieves a valid token and servers to establish a webrtc connection between the peers

**Moved routes:**

- Updated `GET` at `/channels/{channel_id}/extra_info` to `/channels/{channel_id}/stats`
    - No longer returns a list of channel members and only returns the member count
- Updated `POST` at `/users/profiles/{team_id}` to `/teams/{team_id}/users/{offset}/{limit}`
    - Functionally performs the same, just moves it to match our other APIs that need a team ID.
- Updated `GET` at `/members/{team_id}` to `/teams/{team_id}/members/{offset}/{limit}`
    - Allows paging through team members

**Removed routes:**

- Removed `GET` at `/users/direct_profiles`
- Removed `GET` at `/users/profiles_for_dm_list/{team_id}/{offset}/{limit}`

**Modified Routes**

- Added `POST` at `/users/{user_id}/update_roles`
    - Only allows updating of system wide roles. If you want to update team wide roles, please use the new route `/teams/{team_id}/update_member_roles`

**Changes to File Routes:**

Routes used to get files and their metadata from the server have been changed substantially in 3.5 so that each file will be given a unique identifier to make them easier to use through the API. In addition, the `Filenames` field of each post has been deprecated in favor of the new `FileIds` field.

- The response type of `GET` at `/teams/{team_id}/files/upload` has been changed to return more information about the uploaded file. See [the documentation for this route on api.mattermost.com](https://api.mattermost.com/#tag/files%2Fpaths%2F~1teams~1%7Bteam_id%7D~1files~1upload%2Fpost) for more information
- Split `GET` at `/teams/{team_id}/files/get/{channel_id}/{user_id}/{filename}` into:
    - `GET` at `/files/{file_id}/get`
        - Get a file
    - `GET` at `/files/{file_id}/get_thumbnail`
        - Get a small thumbnail for image files
    - `GET` at `/files/{file_id}/get_preview`
        - Get a medium-sized preview image for image files
- Updated `GET` at `/teams/{team_id}/files/get_info/{channel_id}/{user_id}/{filename}` to `/files/{file_id}/get_info`
- Updated `GET` at `/teams/{team_id}/files/get_public_link` to `/files/{file_id}/get_public_link`
- Added `GET` at `/public/files/{file_id}/get`
    - Get a file without logging in
    - The previous route `GET` at `/public/files/get/{team_id}/{channel_id}/{user_id}/filename` has been deprecated, but will remain available for files that were uploaded prior to 3.5

### Known Issues

- Channel autolinking with `~` only works if you are a member of the channel
- Slack Import doesn't add merged members/e-mail accounts to imported channels
- User can receive a video call from another browser tab while already on a call
- Video calls do not work with Chrome v56 and later
- Sequential messages from the same user appear as separate posts on mobile view
- Slash commands do not work in newly created private channels until a hard refresh
- Edge overlays desktop notification sound with system notification sound
- Pressing escape to close autocomplete clears the textbox on IE11
- Channel switcher doesn't work for users outside of your current team
- Deleting a messages from a permalink view doesn't show delete until refresh
- Channel dropdown selector no longer works in the Zapier App but the Channel ID can still be entered manually
- Search autocomplete picker is broken on Android
- Channel push notification preferences do not work for the inactive teams if you have multiple teams on a single server.

### Contributors

Many thanks to all our contributors. In alphabetical order:

/mattermost-server

- [alsma](https://github.com/alsma), [asaadmahmood](https://github.com/asaadmahmood), [coreyhulen](https://github.com/coreyhulen), [crspeller](https://github.com/crspeller), [DavidLu1997](https://github.com/DavidLu1997), [digitaltoad](https://github.com/digitaltoad), [dmeza](https://github.com/dmeza), [enahum](https://github.com/enahum), [esethna](https://github.com/esethna), [grundleborg](https://github.com/grundleborg), [harshavardhana](https://github.com/harshavardhana), [hmhealey](https://github.com/hmhealey), [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [lfbrock](https://github.com/lfbrock), [npcode](https://github.com/npcode), [R-Wang97](https://github.com/R-Wang97), [Rudloff](https://github.com/Rudloff), [S4KH](https://github.com/S4KH), [shieldsjared](https://github.com/shieldsjared), [thomchop](https://github.com/thomchop), [usmanarif](https://github.com/usmanarif), [wget](https://github.com/wget), [yangchen1](https://github.com/yangchen1)

/ios

- [coreyhulen](https://github.com/coreyhulen), [lfbrock](https://github.com/lfbrock), [thomchop](https://github.com/thomchop)

/desktop

- [asaadmahmood](https://github.com/asaadmahmood), [itsmartin](https://github.com/itsmartin), [jasonblais](https://github.com/jasonblais), [jcomack](https://github.com/jcomack), [jnugh](https://github.com/jnugh), [magicmonty](https://github.com/magicmonty), [Razzeee](https://github.com/Razzeee), [yuya-oc](https://github.com/yuya-oc)

/docs

- [asaadmahmood](https://github.com/asaadmahmood), [chikei](https://github.com/chikei), [crspeller](https://github.com/crspeller), [erikthered](https://github.com/erikthered), [esethna](https://github.com/esethna), [gabx](https://github.com/gabx), [gmorel](https://github.com/gmorel), [grundleborg](https://github.com/grundleborg), [hannaparks](https://github.com/hannaparks), [harshavardhana](https://github.com/harshavardhana), [hmhealey](https://github.com/hmhealey), [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais), [JeffSchering](https://github.com/JeffSchering), [kunthar](https://github.com/kunthar), [lfbrock](https://github.com/lfbrock), [lindy65](https://github.com/lindy65), [npcode](https://github.com/npcode), [reach3r](https://github.com/reach3r), [Rudloff](https://github.com/Rudloff), [rwillmer](https://github.com/rwillmer), [shieldsjared](https://github.com/shieldsjared), [StraylightSky](https://github.com/StraylightSky), [thiyagaraj](https://github.com/thiyagaraj), [yangchen1](https://github.com/yangchen1), [yumenohosi](https://github.com/yumenohosi), [yuya-oc](https://github.com/yuya-oc), [Zhouzi](https://github.com/Zhouzi)

/mattermost-docker

- [5ak3t](https://github.com/5ak3t), [npcode](https://github.com/npcode), [rothgar](https://github.com/rothgar)

/android

- [coreyhulen](https://github.com/coreyhulen), [DavidLu1997](https://github.com/DavidLu1997), [dmeza](https://github.com/dmeza), [it33](https://github.com/it33), [mattchue](https://github.com/mattchue)

/mattermost-bot-sample-golang

- [hmhealey](https://github.com/hmhealey), [pneisen](https://github.com/pneisen)

/mattermost-load-test

- [athingisathing](https://github.com/athingisathing), [coreyhulen](https://github.com/coreyhulen), [crspeller](https://github.com/crspeller), [csduarte](https://github.com/csduarte), [enahum](https://github.com/enahum), [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais)

/mattermost-driver-javascript

- [crspeller](https://github.com/crspeller)

/mattermost-api-reference

- [coreyhulen](https://github.com/coreyhulen), [crspeller](https://github.com/crspeller), [hmhealey](https://github.com/hmhealey), [jwilander](https://github.com/jwilander)

/mattermost-mobile

- [dmeza](https://github.com/dmeza), [hmhealey](https://github.com/hmhealey), [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais), [mfpiccolo](https://github.com/mfpiccolo), [thomchop](https://github.com/thomchop)

## Release v3.4.0

Release date: 2016-09-16

### Highlights

#### Zapier Integration
- Integrate over [700 public cloud applications](https://zapier.com/zapbook/) using [Zapier](https://zapier.com), with full support for Markdown formatting. To start, [click here to accept an invitation to Zapier](https://zapier.com/developer/invite/47050/902cde1eb8e0b3eb1223a2cf05331abd/), then [follow the setup guide](https://docs.mattermost.com/integrations/zapier.html).

#### OAuth 2.0 Service Provider
- Users with an account on a Mattermost server can securely sign in to third-party applications with an OAuth 2.0 protocol. See [documentation](https://docs.mattermost.com/developer/oauth-2-0-applications.html) to learn more.

#### Improved Notifications and Status Indicators
- Users can now control how often email notifications are sent
- Users can now control whether push notifications are sent when they are online, offline or away
- Users can now set the display duration of a desktop notification
- Email notifications now include channel names
- Android push notifications are now cleared after the message is read somewhere else
- /away, /online, /offline can now be used to manually set your status
- Status indicators are now shown on the profile pictures in the centre channel and right hand side

### Improvements

#### Files and Images
- PDFs now show a preview in the image previewer on browsers, desktop apps, and mobile apps

#### Integrations
- After an integration is created, a confirmation screen now displays the relevant token, webhook URL or OAuth client secret

#### System Console
- Added connection security option `PLAIN` for SMTP
- Salt settings in the config.json now ship blank and are autogenerated after install
- Added [Error and Diagnostics Reporting option](https://docs.mattermost.com/administration/config-settings.html#enable-diagnostics-and-error-reporting) to help Mattermost, Inc. improve reliability and performance for your deployment configuration.

#### Slack Import
- Slack import now imports @mentions mapped to user names

#### User Interface
- Improved design of signup pages when multiple account creation methods are enabled
- User profile popover now shows both username and full name (if available)
- @mention autocomplete now groups users according to who is in the channel
- Channel URL no longer updates when the Channel Name changes
- Markdown headings are now rendered in Compact View
- A System Message now posts when new users join Town Square

#### Enterprise Edition:
- Added a CLI tool for creating channels
- Added a display option to hide join/leave messages from view (user added and user removed messages still appear)
- System Admins can now test their LDAP connection using a “Test Connection” button
- FirstName and LastName fields are now optional for LDAP and SAML

### Bug Fixes
- Old public links are now invalidated when the salt is regenerated.
- Messages can now be flagged from the search results list
- Count of unread mentions are no longer mixed when switching between multiple teams.
- Recent Mentions search on mobile no longer contains `@all`
- For those using the mobile view on desktop, CTRL+ENTER now sends messages on mobile web view
- User removed from team now shows up in DM list under "Outside this team"
- Mentions update properly when team is switched

### Compatibility
Changes from v3.3 to v3.4:

**Special Note**

(Only affects servers with public links enabled) After upgrading to v3.4, existing public links will no longer be valid. This is because in past versions, when the Public Link Salt was regenerated existing public links were not invalidated. Now, when the salt is regenerated, existing links are made invalid.

#### config.json

Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json` or the System Console.

**Changes to Team Edition and Enterprise Edition**:

 - Under `EmailSettings` in `config.json`:
    - Added `"EnableEmailBatching": false` to enable batching of email notifications configurable in Account Settings. To enable email batching, the `SiteURL` field must be filled out and `Enable` under `ClusterSettings` must be set to `false` to disable high availability mode.
    - Added `"EmailBatchingBufferSize": 256` to specify the maximum number of notifications batched into a single email.
    - Added `"EmailBatchingInterval": 30` to specify the maximum frequency, in seconds, which the batching job checks for new notifications.

 - Under `LogSettings` in `config.json`:
    - Added `"EnableDiagnostics": true` to increase reliability and performance of Mattermost for your deployment configuration by sending encrypted [error reporting and diagnostic information](https://docs.mattermost.com/administration/config-settings.html#enable-diagnostics-and-error-reporting) to Mattermost, Inc.

**Additional Changes to Enterprise Edition:**

The following config settings will only work on servers with an Enterprise License that has the feature enabled.

- Under `LdapSettings` in `config.json`:
    - `"FirstNameAttribute": ""` is no longer a required field
    - `"LastNameAttribute": ""` is no longer a required field
- Under `SamlSettings` in `config.json`:
    - `"FirstNameAttribute": ""` is no longer a required field
    - `"LastNameAttribute": ""` is no longer a required field

### Database Changes from v3.3 to v3.4

**Status Table**

 - Added `Manual` column.
 - Added `ActiveChannel` column.

### API Changes from v3.3 to v3.4

**New routes:**
 - Added `GET` at `/oauth/authorized`
     - Returns the OAuth2 Apps authorized by the user.  On success it returns a list of sanitized OAuth2 Authorized Apps by the user.
 - Added `POST` at `/oauth/"+clientId+"/deauthorize`
     - Deauthorizes a user on an OAuth 2.0 app, where `clientId` corresponds to the application. Returns status OK on success or an AppError on fail.
 - Added `POST` at `/oauth/"+clientId+"/regen_secret`
     - Generates a new OAuth App Client Secret, where `clientId` corresponds to the application. Returns an OAuth2 App on success. Must be authenticated as a user and the same user who registered the app or a System Admin.
 - Added `POST` at `/admin/ldap_test`
     - Will run a connection test on the current LDAP settings. It will return the standard OK response if settings work. Otherwise it will return an appropriate error.
 - Added `POST` at `/users/status/set_active_channel`
     - Sets the Status.ActiveChannel field which is used to tell if the user is actively viewing a channel or not.
 - Added `GET` at `/admin/recently_active_users/{teamId}`
     - Returns a list of recent active users.

### Known Issues

- Upgrading from 3.2 to 3.4 will be incomplete due to a migration code not being run properly. You can either:
    - Upgrade from 3.2 to 3.3 and then from 3.3 to 3.4, or
    - Upgrade from 3.2 to 3.4, then run the following SQL query to make Mattermost rerun upgrade steps that were not properly completed: `UPDATE Systems SET Value = '3.1.0' WHERE Name = 'Version';`
- Deleted messages don't disappear from the channel for the user who deleted the message, if the message was previously edited and right hand sidebar is open.
- A single collapsed link or image preview re-opens after refresh.
- Files sent in private chat to members in a different team are not accessible.
- YouTube video links show as “Video not found” on Desktop App if "Allow mixed content" is turned on.
- “More” option under Direct Message list no longer shows count of team members not in your direct message list.
- On Firefox, CTRL/CMD+U keyboard shortcut to upload a file doesn’t work.
- Webhook attachments don’t show up in search results.
- Messages sometimes don't appear deleted until the page is refreshed.
- When joining a channel from a public link, the page sometimes loads for a long time and requires a refresh.

### Contributors

Many thanks to all our contributors. In alphabetical order:

/mattermost-server
- [asaadmahmood](https://github.com/asaadmahmood), [coreyhulen](https://github.com/coreyhulen), [crspeller](https://github.com/crspeller), [cybershambles](https://github.com/cybershambles), [daizenberg](https://github.com/daizenberg), [DavidLu1997](https://github.com/DavidLu1997), [enahum](https://github.com/enahum), [esethna](https://github.com/esethna), [gramakri](https://github.com/gramakri), [grundleborg](https://github.com/grundleborg), [hmhealey](https://github.com/hmhealey), [HugoGiraudel](https://github.com/HugoGiraudel), [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais), [joonsun-baek](https://github.com/joonsun-baek), [jwilander](https://github.com/jwilander), [lfbrock](https://github.com/lfbrock), [npcode](https://github.com/npcode), [paranbaram](https://github.com/paranbaram), [phrix32](https://github.com/phrix32), [R-Wang97](https://github.com/R-Wang97), [shieldsjared](https://github.com/shieldsjared)

/ios
- [jasonblais](https://github.com/jasonblais), [lfbrock](https://github.com/lfbrock)

/desktop
- [asaadmahmood](https://github.com/asaadmahmood), [jasonblais](https://github.com/jasonblais), [jgis](https://github.com/jgis), [jnugh](https://github.com/jnugh), [Razzeee](https://github.com/Razzeee), [St-Ex](https://github.com/St-Ex), [yuya-oc](https://github.com/yuya-oc)

/docs
- [asaadmahmood](https://github.com/asaadmahmood), [coreyhulen](https://github.com/coreyhulen), [DavidLu1997](https://github.com/DavidLu1997), [esethna](https://github.com/esethna), [friism](https://github.com/friism), [hmhealey](https://github.com/hmhealey), [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais), [jwilander](https://github.com/jwilander), [kaakaa](https://github.com/kaakaa), [lfbrock](https://github.com/lfbrock), [lindy65](https://github.com/lindy65), [pmccarthy01](https://github.com/pmccarthy01), [rudloff](https://github.com/Rudloff),  [shieldsjared](https://github.com/shieldsjared), [yangchen1](https://github.com/yangchen1)

/mattermost-docker
- [npcode](https://github.com/npcode), [xcompass](https://github.com/xcompass)

/android
- [coreyhulen](https://github.com/coreyhulen), [enahum](https://github.com/enahum), [jasonblais](https://github.com/jasonblais), [jwilander](https://github.com/jwilander), [lfbrock](https://github.com/lfbrock)

/push-proxy
- [jwilander](https://github.com/jwilander)

/mattermost-heroku
- [it33](https://github.com/it33), [jwilander](https://github.com/jwilander)

## Release v3.3.0

Expected release date: 2016-08-16

### Security Update

- Mattermost v3.3.0 contains [security updates](https://mattermost.com/security-updates/). [Upgrading to Mattermost v3.3.0](https://docs.mattermost.com/administration/upgrade.html) is highly recommended.
- Thanks to Bastian Ike for contributing security reports through the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

### Highlights

#### Languages
- Added Dutch, Korean, Simplified Chinese and Traditional Chinese translations for the user interface.
- Promoted Portuguese and Spanish to release-quality translations.

#### Flagged Messages
- Added the ability to flag a message for follow up, so users can track messages they want to go back to later.

#### Improved Statuses
- Improved response time of status indicator changing between online/offline/away.
- Added status indicators to the Direct Message and Channel member lists.
- Added `@here` to mention users who are online.

#### Google SSO ([Enterprise E20](https://mattermost.com/pricing-self-managed/))
- Users can sign in to Mattermost with their Google credentials and new Mattermost user accounts are automatically created on first login.

#### Office 365 SSO (Beta) ([Enterprise E20](https://mattermost.com/pricing-self-managed/))
- Users can sign in to Mattermost with their Office 365 credentials and new Mattermost user accounts are automatically created on first login.

#### High Availability Mode (Beta) ([Enterprise E20](https://mattermost.com/pricing-self-managed/))
- Support for highly available application servers configurable in the System Console and configuration files. See [documentation](https://docs.mattermost.com/deployment/cluster.html) for more details.

### Improvements

#### iOS app
- Fixed issue where “Refresh/Log out” was appearing frequently.
- Fixed issue where center channel appears blank after initial page load.
- Keyboard is now closed when a user executes a search.

#### Mobile (iOS and Android apps)
- Enter key now creates a new line instead of sending the message.
- Added links to the mobile apps in the welcome email, tutorial, and main menu.
- Added a landing page that informs users of the mobile app when they access the site on a mobile web browser.
- Permalinks are now available on mobile.
- Made it easier to click on the ... menu when in the right-hand sidebar view.
- Enable auto-complete for "from:" and "in:".

#### User Interface
- Channel header is now added to the View Info modal.
- Configured channel introduction to respect the full width and centred channel views.
- Removed signup link from sign in page if all signup methods are disabled.
- Improved channel header popover behaviour.

#### Authentication
- The username "matterbot" is now restricted from account creation.
- Link to create an account is hidden on the login page if no account creation methods are turned on in the System Console.
- All team members can View Members for the team or specific channels.

#### Notifications
- Mention notifications can be turned on for any new messages in comment threads that you participate in.

#### Keyboard Shortcuts
- Added icons next to channel names and improved sorting in the channel switcher (CTRL/CMD+K).
- Keyboard shortcuts that open modals can now toggle them open and closed (CTRL/CMD+SHIFT+A, CTRL/CMD+K).

#### Integrations
- Added an option to trigger outgoing webhook if the first word starts with the specified trigger word.

#### System Console
- Username is now added to the System Console users list.
- Legal and Support links are now hidden in the user interface if no link is specified in the System Console.
- If the Terms of Service link is left blank in the System Console then it defaults to the "Mattermost Conditions of Use" page.

#### [Enterprise E10, E20](https://mattermost.com/pricing-self-managed/)

- Added the ability to set different themes for each team.
- Added a checkbox to apply theme settings to all teams of which you are a member.
- Users disabled or removed from the AD/LDAP server are now made “Inactive” in Mattermost (previously their sessions were revoked and could no longer log in, but their account status was not set to “Inactive”).
- Added the ability to force migrating authentication methods.
- Added Site Description field to the System Console > Customization > Custom Branding section.
- AD/LDAP `Bindusername` and `Bindpassword` fields in the System Console are now optional to support anonymous binding.

### Bug Fixes

- The behavior of setting for Link Previews in Account Settings is no longer reversed.
- Hitting the URL of a private team you used to belong to now redirects properly.
- Search terms contained in hashtags are now highlighted in the search results.
- Fixed an issue with quick typesetting on IE-11 and Edge.
- Fixed an issue with uploading SAML certificates if the files were removed from `config.json`.
- Multiple files can now be selected on the file upload dialog of the desktop app.
- Fixed a scrolling issue with the channel switcher.
- Fixed system messages showing a small empty white box.
- Fixed a markdown formatting issue with multiple lists in a row.
- Team Admins can no longer demote System Admins.
- The channel header now respects the setting for Channel Display Mode.
- The System Console no longer freezes if accessing via URL when not logged in.
- Site Name is now restricted to 30 characters to avoid text overflow.
- Error is no longer thrown when switching between teams in the System Console.
- Invalid password error is thrown if System Admin resets a password to something that doesn't meet the specified password requirements.
- Fixed the percentage loading indicator on the image preview modal.
- File upload overlay now appears on Edge.
- Maximum Users per Team and Minimum Password Length now default to reasonable values if a bad input is saved.
- Right-hand side now updates when a new profile picture is saved.
- Channels in the Channel Switcher are sorted by their handle if their display name is identical.
- Setting the length for mobile sessions is now fixed in the System Console.
- The “Test Connection” button in the System Console > Notifications > Email section now properly uses the saved SMTP password.
- System Admins no longer receive a JavaScript error if a new message is received while in the System Console.
- Dropdown in the Manage Members modal is no longer empty for System Admins.
- @all is now correctly highlighted if the trigger setting is selected in Account Settings.
- Fixed unformatted error message on account creation page if no creation methods are enabled.
- Corrected the formatting of some help text in the System Console.
- Color picker in Custom Theme settings now disappears once setting has been saved on mobile.
- System Console menu no longer cuts off long team names.

### Compatibility
Changes from v3.2 to v3.3:

#### config.json

Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json` or the System Console.

**Changes to Team Edition and Enterprise Edition:**

- Under a new section `NativeAppSettings`:
   - Added `"AppDownloadLink": "https://mattermost.com/download/#mattermostApps"` to point towards a download page for native apps.
   - Added `"AndroidAppDownloadLink": "https://about.mattermost.com/mattermost-android-app/"` to point towards the Android app.
   - Added `"IosAppDownloadLink": "https://about.mattermost.com/mattermost-ios-app/"` to point towards the iOS app.
- Under `ServiceSettings`:
    - Added `"SiteURL": ""` to allow the server to overwrite the site_url.
- Under `TeamSettings`:
    - Added `"UserStatusAwayTimeout": 300` to specify the number of seconds before users are considered "away".

**Additional Changes to Enterprise Edition:**

The following config settings will only work on servers with an Enterprise License that has the feature enabled.

- Under `TeamSettings`:
    - Added `"CustomDescriptionText": ""` to set the site description shown in login screens and user interface.
- Under `GoogleSettings` in `config.json`:
   - Changed: `"Scope": "profile email"` to set the standard setting for OAuth to determine the scope of information shared with OAuth client.
   - Changed: `"AuthEndpoint": "https://accounts.google.com/o/oauth2/v2/auth"` to set the authorization endpoint for Google SSO.
   - Changed: `"TokenEndpoint": "https://www.googleapis.com/oauth2/v4/token"` to set the token endpoint for Google SSO.
   - Changed: `"UserApiEndpoint": "https://www.googleapis.com/plus/v1/people/me"` to set the user API endpoint for Google SSO.
- Under a new section `Office365Settings`:
   - Added `"Enable": false` to allow login using Office 365 SSO when set to `true`.
   - Added `"Secret": ""` to set the Client Secret received when registering the application with Google.
   - Added `"Id": ""` to set the Client ID received when registering the application with Google.
   - Added `"Scope": "User.Read"` to set the standard setting for OAuth to determine the scope of information shared with OAuth client.
   - Added `"AuthEndpoint": "https://login.microsoftonline.com/common/oauth2/v2.0/authorize"` to set the authorization endpoint for Office 365 SSO.
   - Added `"TokenEndpoint": "https://login.microsoftonline.com/common/oauth2/v2.0/token"` to set the token endpoint for Office 365 SSO.
   - Added `"UserApiEndpoint": "https://graph.microsoft.com/v1.0/me"` to set the user API endpoint for Office 365 SSO.
- Under `LdapSettings` in `config.json`:
   - `"BindUsername": ""` and `"BindPassword": ""` are no longer required fields, so anonymous binding is possible.
- Under a new section `ClusterSettings`:
    - Added `"Enable": false` to enable High Availability mode.
    - Added `"InterNodeListenAddress": ":8075"` to specify the address the server will listen on for communicating with other servers.
    - Added `"InterNodeUrls": []` to specify the internal/private URLs of all the Mattermost servers separated by commas.

### Database Changes from v3.2 to v3.3

**OAuthAccessData Table**

 - Added `ClientId` column.
 - Added `UserId` column.
 - Removed `AuthCode` column.
 - Set Unique key on `ClientId` and `UserId` columns.
 - Removed index from `idx_oauthaccessdata_auth_code` column.
 - Added indexes to `idx_oauthaccessdata_client_id`, `idx_oauthaccessdata_user_id` and `idx_oauthaccessdata_refresh_token` columns.

**OAuthApps Table**

 - Added `IconURL` column.

**OutgoingWebhooks Table**

 - Added `TriggerWhen` column.

**Status Table**

 - Added `Status` table.

**Users Table**

 - Removed `LastActivityAt` column.
 - Removed `LastPingAt` column.
 - Removed `ThemeProps` column.

### API Changes from v3.2 to v3.3

**Updated admin routes:**
 - Changed `users/status` from `POST` to `GET`

**New admin routes:**
 - Added `GET` at `/posts/flagged/{offset:[0-9]+}/{limit:[0-9]+}`
     - Returns a list of posts that have been flagged by the user; `offset` is the offset to start the page at; `limit` is the max number of posts to return.
 - Added `GET` at `/admin/cluster_status`
     - Returns a json with a status of each of the reachable nodes in the cluster
 - Added `GET` at `/oauth/list`
     - Returns a list of OAuth 2.0 apps registered by the user
 - Added `GET` at `/oauth/app/{clientId:""}`
     - Returns a Sanitized OAuth 2.0 application where `clientId` corresponds to the application
 - Added `POST` at `/oauth/delete`
     - Returns status = OK if the OAuth 2.0 application owned by the current user was successfully deleted.
 - Added `GET` at `/oauth/access_token`
     - Returns the access token for OAuth 2.0 application
 - Added `POST` at `/preferences/delete`
     - Returns status = OK if the list of preferences owned by the current user were successfully deleted.
 - Added `POST` at `/admin/remove_certificate`
     - Returns a map[string]interface{} if removing the x509 base64 Certificates and Private Key files used with SAML exists on the file system.

### Known Issues

- Desktop apps sometimes require a refresh to solve 404 errors.
- Deleted messages don't disappear from the channel for the user who deleted the message, if the message was previously edited and right hand sidebar is open.
- After receiving an error for creating a channel with one character, updated channel name is not saved.
- A single collapsed preview re-opens after refresh.
- Removed user from team still appears in DM list from the team.
- Files sent in private messages to members in a different team are not accessible.
- YouTube videos show as “Video not found” on Desktop App.
- “More” option under Direct Message list no longer shows count of team members not in your direct message list.
- /join sometimes throws an error.
- On Firefox, CTRL/CMD+U keyboard shortcut doesn’t work.
- Sometimes only the last character typed in the channel switcher appears.
- Webhook attachments don’t show up in search results.
- Count of unread mentions are sometimes mixed when switching between multiple teams.
- Office 365 login sometimes causes a bad token error.
- Messages sometimes don't appear deleted until the page is refreshed.
- When joining a channel from a public link, the page sometimes loads for a long time and requires a refresh.
- After leaving a team, joining or creating a team sometimes causes an error.

### Contributors

Many thanks to all our contributors. In alphabetical order:

/mattermost-server

- [asaadmahmood](https://github.com/asaadmahmood), [coreyhulen](https://github.com/coreyhulen), [crspeller](https://github.com/crspeller), [DavidLu1997](https://github.com/DavidLu1997), [eadmund](https://github.com/eadmund), [enahum](https://github.com/enahum), [esethna](https://github.com/esethna), [hmhealey](https://github.com/hmhealey), [jasonblais](https://github.com/jasonblais), [jwilander](https://github.com/jwilander), [lfbrock](https://github.com/lfbrock), [maruTA-bis5](https://github.com/maruTA-bis5), [Rudloff](https://github.com/Rudloff), [samogot](https://github.com/samogot), [yuters](https://github.com/yuters)

/desktop

- [jasonblais](https://github.com/jasonblais), [jnugh](https://github.com/jnugh), [Razzeee](https://github.com/Razzeee), [timroes](https://github.com/timroes), [yuya-oc](https://github.com/yuya-oc)

/android

- [coreyhulen](https://github.com/coreyhulen), [jasonblais](https://github.com/jasonblais)

/ios

- [coreyhulen](https://github.com/coreyhulen), [macdabby](https://github.com/macdabby), [jasonblais](https://github.com/jasonblais)

/docs

- [asaadmahmood](https://github.com/asaadmahmood), [esethna](https://github.com/esethna), [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais), [lfbrock](https://github.com/lfbrock), [lindy65](https://github.com/lindy65)

/mattermost-docker

- [npcode](https://github.com/npcode)

/mattermost-driver-javascript

- [jwilander](https://github.com/jwilander)

/mattermost-bot-sample-golang

- [coreyhulen](https://github.com/coreyhulen), [jasonblais](https://github.com/jasonblais)

If we missed your name, please let us know at feedback@mattermost.com. Recognition is a manual process and mistakes can happen. We want to include anyone who's made a pull request that got merged during the release.

## Release v3.2.0

Release date: 2016-07-16

### Security Update

- Mattermost v3.2.0 contains [multiple security updates](https://mattermost.com/security-updates/). [Upgrading to Mattermost v3.2.0](https://docs.mattermost.com/administration/upgrade.html) is highly recommended.
- Thanks to Bastian Ike, Mohammad Razavi, Steve MacQuiddy, Christer Mjellem Strand and Jonas Arneberg for contributing security reports through the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

### Highlights

#### Languages

- Added German translation for the user interface if enabled by the System Admin from **System Console > Localization > Available Languages**.

#### Custom Emoji

- Create Custom Emoji from the **Main Menu** > **Custom Emoji** when enabled from **System Console** > **Customization** > **Custom Emoji**.
- Restrict the permissions required to create Custom Emoji (Enterprise).

#### Performance
- Gzip compression for static content files decreases time for first page load, enabled from **System Console** > **Configuration**.
- Reduced the total Mattermost package size from 25.7MB to 18.9MB.

#### Policy ([Enterprise E10, E20](https://mattermost.com/pricing-self-managed/))

- Restrict the permission levels required to send team invitiations in **System Console** > **Policy**.
- Restrict the permission levels required to manage public and private channels, including creating, deleting, renaming, and setting the channel header or purpose.

#### SAML Single Sign-On ([Enterprise E20](https://mattermost.com/pricing-self-managed/)):

- Users can sign in to Mattermost with their SAML credentials and new Mattermost user accounts are automatically created on first login. Mattermost pulls user information from SAML, including first and last name, email and username.
- Mattermost officially supports Okta and Microsoft ADFS as the identity providers (IDPs), but you may also try configuring SAML for a custom IDP.

### Improvements

**On-Boarding and Off-Boarding**

- After account creation, users are automatically directed to the team where they were invited instead of the Team Selection page.
- "Get Team Invite Link" is now accessible on mobile.
- Users can now be removed from teams via the **Main Menu** > **Manage Members** modal.

**System Console**

- Updated labeling of System Console settings in the UI for consistency and accuracy.
- ([Enterprise E20](https://mattermost.com/pricing-self-managed/)) High availability support via **Reload Configuration from Disk** and **Recycle Database Connections** buttons had help text added so they're easier to understand.
- Allow System Admins to create teams even if team creation is disabled via the System Console.

**Notifications**

- Address displayed in the email notification footer is now configurable in the System Console.
- Direct Message desktop notifications now display with a "Direct Message" title.

**Web UI**

- Reply button and [...] menu now appear in a hovering UI element to increase the available margin width in the center channel.
- Right-hand sidebar can now be expanded when viewing threads or search results.
- Text emoticons now show up as the first entries in the autocomplete list
- @mention autocomplete now filters on nickname, full name, and username.
- Added an online indicator to the header of Direct Message channels.
- Added database type to the About Mattermost dialog.
- Removed unnecessary resizing when opening and closing the right hand sidebar.
- Removed jumping of the center channel when new messages are posted.
- Updated the channel info dialog to be more user friendly.

**[Enterprise E10, E20](https://mattermost.com/pricing-self-managed/)**

-  [New command line tools](https://docs.mattermost.com/administration/command-line-tools.html) added, such as adding and removing users from channels, and restoring previously deleted channels.
- Added a button to manually trigger AD/LDAP synchronization.
- Updating AD/LDAP Synchronization Interval to no longer require a server restart to take effect.
- Improved logging for AD/LDAP synchronization.
- Added validation to the AD/LDAP settings in the System Console so an error is triggered if required fields are missing.

### Bug Fixes

- Privacy settings in the system console now refresh correctly when hiding email addresses or full names.
- Fixed the cross contamination of new channels created on different teams in the same browser.
- Updated the GitLab SSO error message for clarity if another Mattermost account is already associated with the GitLab account.
- Team creation via GitLab SSO no longer throws an error if email domains are restricted.
- Channel header no longer disappears after renaming a channel
- Testing the email connection in the System Console no longer throws an error.
- Multiline list items are now displayed correctly on new lines.
- Error message is updated when switching from email to GitLab SSO authentication that is already used by another account.
- Timestamps no longer require a page refresh when switching between 12h and 24h display formats.
- Hashtags containing `¿` are now returned with proper highlighting in search results.
- No longer require a page refresh before enabling compliance reporting in the System Console.
- `@all` no longer sends mentions if unselected in Account Settings.
- Users are no longer redirected to the switch teams page after changing authentication method from GitLab SSO to email.
- Invalid MFA token error message now clears correcly from the UI.
- Errors now correctly clear from the UI when changing passwords.
- System Console users list no longer throws an error when trying to demote a member from a System Admin.
- iOS radio buttons no longer stay selected when switching between options.
- Email addresses now display for System Admins even if hidden in the System Console.
- Code themes now save when updated via Account settings.
- File name is now displayed instead of the full path to the file in code snippet previews.
- Config settings are refreshed immediately when **Reload Configuration from Disk** is clicked.
- Preview feature checkboxes now reset after changes are canceled.
- Updated the markdown parser to fix poor handling of certain links.
- Error box highlighting on the claim AD/LDAP account page is fixed to only highlight the invalid input box.
- Errors in the system console are now properly aligned.
- Button to resend verification email no longer throws an error when clicked.
- Direct Messages modal loads faster since it is no longer cleared from memory each time it closes.
- Graphs in the **System Console > Site Statistics** now have the same start date for comparison.
- Fixed an issue where new languages are not added by default. Any server which is upgraded to Mattermost v3.1 will need to manually set **System Console > Localization > Available Languages** blank to have new languages added by default.
- Previously, a few shortcuts that used CTRL were overwriting existing messaging shortcuts in Mac. This has been changed so they only work with CMD. See [documentation](https://docs.mattermost.com/help/messaging/keyboard-shortcuts.html) for more details.
- Email body now contains the `siteURL` when inviting a user by email via CLI (command line interface)
- YouTube videos now stop playing when collapsed.
- Fixed error when adding an incoming webhook to a public channel the user is currently not in.
- Error merssage displayed on password reset page is now formatted correctly.


### Compatibility
Changes from v3.1 to v3.2:

#### config.json

Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json` or the System Console.

**Changes to Team Edition and Enterprise Edition**:

- Under `EmailSettings` in `config.json`:
   - Added `"FeedbackOrganization": ""` to specify organization name and address, which will be displayed on email notifications from Mattermost.

- Under `ServiceSettings` in `config.json`:
   - Added `"EnableCustomEmoji": false`. When set to `true`, enables Custom Emoji option in the Main Menu where users can create customized emoji.

- Under `LocalizationSettings` in `config.json`:
   - Changed: `"AvailableLocales": ""` to allow new languages be added by default.

- Under `LogSettings` in `config.json`:
   - Added `"EnableWebhookDebugging": true`. When set to `true`, contents of incoming webhooks are printed to log files for debugging.

**Additional Changes to Enterprise Edition:**

The following config settings will only work on servers with an Enterprise License that has the feature enabled.

- Under `TeamSettings` in `config.json`:
   - Added `"RestrictTeamInvite": "all"` to set the permissions required to send team invites.
   - Added `"RestrictPublicChannelManagement": "all"` to set the permissions required to manage public channels.
   - Added `"RestrictPrivateChannelManagement": "all"` to set the permissions required to manage private channels.

- Under `ServiceSettings` in `config.json`:
   - Added `"RestrictCustomEmojiCreation": "all"` to set the permissions required to create custom emoji.

- Under `SamlSettings` in `config.json`:
   - Added `"Enable": false` to allow login using SAML. See [documentation](https://docs.mattermost.com/deployment/sso-saml.html) to learn more about configuring SAML for Mattermost.
   - Added `"Verify": false` to control whether Mattermost verifies the signature sent from the SAML Response matches the Service Provider Login URL.
   - Added `"Encrypt": false`to control whether Mattermost will decrypt SAML Assertions encrypted with your Service Provider Public Certificate.
   - Added `"IdpUrl": ""` to set the SAML SSO URL where Mattermost sends a SAML request to start login sequence.
   - Added `"IdpDescriptorUrl": ""` to set the Identity Provider Issuer URL for the Identity Provider you use for SAML requests.
   - Added `"AssertionConsumerServiceURL": ""` to set the Service Provider Login URL.
   - Added `"IdpCertificateFile": ""` to set the public authentication certificate issued by your Identity Provider.
   - Added `"PublicCertificateFile": ""` to set certificate used to generate the signature on a SAML request to the Identity Provider for a service provider initiated SAML login, when Mattermost is the Service Provider.
   - Added `"PrivateKeyFile": ""` to set the private key used to decrypt SAML Assertions from the Identity Provider.
   - Added `"FirstNameAttribute": ""` to set the attribute in the SAML Assertion that will be used to populate the first name of users in Mattermost.
   - Added `"LastNameAttribute": ""` to set the attribute in the SAML Assertion that will be used to populate the last name of users in Mattermost.
   - Added `"EmailAttribute": ""` to set the attribute in the SAML Assertion that will be used to populate the email of users in Mattermost.
   - Added `"UsernameAttribute": ""` to set the attribute in the SAML Assertion that will be used to populate the username of users in Mattermost.
   - Added `"NicknameAttribute": ""` to set the attribute in the SAML Assertion that will be used to populate the nickname of users in Mattermost.
   - Added `"LocaleAttribute": ""` to set the attribute in the SAML Assertion that will be used to populate the language of users in Mattermost.
   - Added `"LoginButtonText": ""` set the text that appears in the login button on the login page.

- Under `LdapSettings` in `config.json`:
   - `"FirstNameAttribute": ""`, `"LastNameAttribute": ""`, `"BindUsername": ""`, and `"BindPassword": ""` are now required fields.
   - Added `"MaxPageSize": 0` to set the maximum number of users that will be requested from the AD/LDAP server at one time.

#### Database Changes from v3.1 to v3.2

**TeamMembers Table**
- Added `DeleteAt` column.

**Emoji Table**
- Added `Emoji` table.

### Known Issues

- In System Console > Notifications > Email the "Test Connection" button does not properly use the saved SMTP password. The temporary workaround is to re-type your SMTP Server Password into the field prior to using the "Test Connection", and then to "Save" afterwards.
- The behavior of setting for Link Previews in Account Settings is reversed.
- “More” option under Direct Message list no longer shows count of team members not in your direct message list.
- Webhook attachments don't show up in search results.
- On Firefox, System Console sidebar completely disappears when an AD/LDAP setting is saved.
- On Firefox, CTRL/CMD+U keyboard shortcut doesn't work.
- `/join` sometimes throws an error.
- Sometimes only the last character typed in the channel switcher appears.
- Formatting of multiple lists in a row breaks markdown.
- Hitting the URL of a private team you used to belong to shows a blank Team Selection page.
- Accessing the System Console URL when logged out causes the browser to hang.
- Youtube videos show as "Video not found" on Desktop App
- Search terms contained in hashtags are not highlighted in the search results.
- Files sent in private messages to members in a different team are not accessible.
- Center channel appears blank after initial page load on iOS.

### Contributors

Many thanks to all our contributors. In alphabetical order:

/mattermost-server
- [42wim](https://github.com/42wim), [apheleia](https://github.com/apheleia), [asaadmahmood](https://github.com/asaadmahmood), [coreyhulen](https://github.com/coreyhulen),[crspeller](https://github.com/crspeller), [DavidLu1997](https://github.com/DavidLu1997), [enahum](https://github.com/enahum), [esethna](https://github.com/esethna), [hmhealey](https://github.com/hmhealey), [iansim](https://github.com/iansim), [it33](https://github.com/it33), [jwilander](https://github.com/jwilander), [kevynb](https://github.com/kevynb), [lfbrock](https://github.com/lfbrock), [samogot](https://github.com/samogot), [tbalthazar](https://github.com/tbalthazar), [tehraven](https://github.com/tehraven), [thiyagaraj](https://github.com/thiyagaraj), [yumenohosi](https://github.com/yumenohosi)

/ios
- [coreyhulen](https://github.com/coreyhulen)

/desktop
- [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais), [magicmonty](https://github.com/magicmonty), [Razzeee](https://github.com/Razzeee), [yuya-oc](https://github.com/yuya-oc)

/docs
- [apheleia](https://github.com/apheleia), [asaadmahmood](https://github.com/asaadmahmood), [crspeller](https://github.com/crspeller), [esethna](https://github.com/esethna), [Fonata](https://github.com/Fonata), [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais), [lfbrock](https://github.com/lfbrock), [lindy65](https://github.com/lindy65), [npcode](https://github.com/npcode), [yangchen1](https://github.com/yangchen1)

/mattermost-driver-javascript
- [coreyhulen](https://github.com/coreyhulen), [crspeller](https://github.com/crspeller), [DavidLu1997](https://github.com/DavidLu1997), [enahum](https://github.com/enahum), [hmhealey](https://github.com/hmhealey), [it33](https://github.com/it33), [samogot](https://github.com/samogot)

/mattermost-docker
- [npcode](https://github.com/npcode)

/mattermost/push-proxy
- [coreyhulen](https://github.com/coreyhulen)

If we missed your name, please let us know at feedback@mattermost.com. Recognition is a manual process and mistakes can happen. We want to include anyone who's made a pull request that got merged during the release.

## Release v3.1.0

Release date: 2016-06-16

### Security Update

- Mattermost v3.1.0 contains [multiple security updates](https://mattermost.com/security-updates/). [Upgrading to Mattermost v3.1.0](https://docs.mattermost.com/administration/upgrade.html) is highly recommended.
- Thanks to Uchida Taishi for contributing security reports through the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

### Highlights

#### Keyboard shortcuts and channel switcher

- Added keyboard shortcuts for navigation, messages and files
- Added channel switcher available from CTRL+K in Windows and CMD+K on Mac.
- See [shortcut documentation](https://docs.mattermost.com/help/messaging/keyboard-shortcuts.html) or use the `/shortcuts` slash command for details.

#### Upgraded System Console

- Re-organized System Console to make settings easier to find for new users.
- Added setting to set default server and client languages.

#### Upgraded Push Notification options

- Added ability for mobile push notifications to trigger on only mentions, all activity and no activity, configurable from **Account Settings** > **Notifications** > **Mobile push notifications**
- Added ability to trigger mobile push notifications while user is logged into Mattermost on desktop.

#### Compact View

- Added "Compact" view option to display more text on a smaller screen, configurable from **Account Settings** > **Display** > **Message Display**.

### Improvements

iOS App
- Account Settings > Notifications option lets users to enable mobile push notifications for chosen activities.
- Push notifications sent even if a user is online on desktop.
- Removed auto-capitalization on login screen, so email is no longer capitalized.

Android App
- Account Settings > Notifications option lets users to enable mobile push notifications for chosen activities.
- Push notifications sent even if a user is online on desktop.
- Removed auto-capitalization on login screen, so email is no longer capitalized.

User Interface

- Account Settings > Display option lets users set channels to compact view.
- Autocomplete closes with ESC button.
- Sequential messages with a username also show profile pictures.
- Channel introduction message conforms to the channel width chosen in Account Settings > Display.
- The message '[user] is typing' now uses the username instead of the display name.
- Date markers now show absolute time.

Performance

- Performance improvements to posting and replying.
- Online status in Direct Message list updated on first load.

Notifications

- `@all` mention added back with equivalent functionality to `@channel`.
- An email notification is now sent when username is changed.

Channels
- Removed the option to leave a channel for the last person in a private group, so private groups can no longer end up in an ownerless state.

Messaging

- Move link preview toggle out of preview feature list and add /collapse and /expand.

Localization

- New settings to configure localization options for teams, including default language.
- [Mattermost Translation Server](https://translate.mattermost.com/) upgraded to better support [localization process](https://docs.mattermost.com/developer/localization.html).

Integrations

- Integrations now support advanced formatting through [message attachments](https://docs.mattermost.com/developer/message-attachments.html).
- Added support for sending `@channel` notifications by using `<!channel>`.
- Added support for raw new lines in the text payload.
- Added validation for command trigger words.

Onboarding

- Slash command `/invite_people [email address]` sends an email invite to your Mattermost team.

Enterprise

- (E10 and higher): Added AD/LDAP synchronization to automatically deactivate Mattermost accounts after AD/LDAP accounts are deactivated. Previous behavior only checked AD/LDAP credentials on sign-in. Synchronization time defaults to one hour and is configurable from **System Console** > **Synchronization Interval**.
- (E20 and higher): Added support for [high availability database configurations](https://docs.mattermost.com/deployment/ha.html) using read replicas and a manual failover process to deploy database reconfigurations without stopping the Mattermost server.

### Bug Fixes

- Incoming webhooks have been made available in all public channels, and in private channels the user belongs to.
- A space between two named emojis is no longer required for correct rendering.
- Emojis now render inside parenthesis or brackets.
- Links that are enclosed with a right parenthesis now work properly.
- Search term highlighting now updates when search terms change but return the same posts.
- Search results now properly highlight for searches containing @username, non-latin characters, terms inside Markdown code blocks, and hashtags containing a dash.
- A single numbered item no longer resets numbering to 1.
- Previews for removed YouTube videos no longer throw a 404 error.
- Team and System Admins can now update channel settings after leaving and rejoining the channel.
- After initial load on iOS, centre channel no longer appears blank.
- When creating a team with a new account, channel introduction message is now displayed.
- Sidebar notification for direct messages now clear once viewed, regardless of which team you are in.
- Custom brand image size is now properly limited on IE11.

### Compatibility
Changes from v3.0 to v3.1:

**config.json**

Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json` or the System Console.

**Changes to Team Edition and Enterprise Edition**:

 - Under `LocalizationSettings` in `config.json`:
    - Added `"DefaultServerLocale": “en”` to set default language for the system messages and logs
    - Added `"DefaultClientLocale": “en”` to set default language for newly created users and for pages where the user hasn't logged in
    - Added `"AvailableLocales": “en,es,fr,ja,pt-BR”` to set which languages are available for users in Account Settings. The language specified in `DefaultClientLocale` should be included in this list.

**Additional Changes to Enterprise Edition:**

The following config settings will only work on servers with an Enterprise License that has the feature enabled.

 - Under `LdapSettings` in `config.json`:
    - Added `"SyncIntervalMinutes": "60"` to allow system admins adjust how frequently Mattermost performs AD/LDAP synchronization to update users

### Known Issues

- “More” option under Direct Message list no longer shows count of team members not in your direct message list.
- Emoji smileys ending with a letter at the end of a message do not auto-complete as expected.
- Incorrect formatting when a new line is added directly after a list.
- On Postgres databases, searching for websites and emails does not work properly and hashtags which end with an inverted questionmark aren't properly highlighted.
- On Firefox, search results for hashtags are not properly highlighted.
- Clicking on a desktop notification from another team doesn’t open the team.
- Webhook attachments don't show up in search results.
- On Firefox, System Console sidebar completely disappears when an AD/LDAP setting is saved
- On Firefox, CTRL/CMD+U keyboard shortcut doesn't work
- Copying and pasting an image from a browser doesn't work
- Youtube videos continue playing when collapsed
- Code theme under Account Settings > Display > Theme doesn't save unless entered in vectorized form
- `/join` sometimes throws an error
- When upgrading to 3.X, syntax highlighting using Solarized code theme is lost
- In Compact view, clicking on a file in the first post in the right hand sidebar attempts to download the file
- Unable to leave a private channel in mobile view
- `@all` notifications received even after being unselected from notification options
- Channel header disappears after renaming a channel (fixed with channel switch)
- Updates to **System Console** > **Privacy** settings for existing users requires a session update
- Invalid config setting causes server to panic on start

### Contributors

Many thanks to all our contributors. In alphabetical order:

/mattermost-server
- [apheleia](https://github.com/apheleia), [ArthurHlt](https://github.com/ArthurHlt), [asaadmahmood](https://github.com/asaadmahmood), [coreyhulen](https://github.com/coreyhulen), [crspeller](https://github.com/crspeller), [DavidLu1997](https://github.com/DavidLu1997), [enahum](https://github.com/enahum), [goofy-bz](https://github.com/goofy-bz), [gramakri](https://github.com/gramakri), [hmhealey](https://github.com/hmhealey), [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais), [jwilander](https://github.com/jwilander), [kevynb](https://github.com/kevynb), [khoa-le](https://github.com/khoa-le), [lfbrock](https://github.com/lfbrock), [rompic](https://github.com/rompic), [ryoon](https://github.com/ryoon), [samogot](https://github.com/samogot), [ScriptAutomate](https://github.com/ScriptAutomate), [tbalthazar](https://github.com/tbalthazar), [tehraven](https://github.com/tehraven/)

/ios
- [coreyhulen](https://github.com/coreyhulen), [lfbrock](https://github.com/lfbrock)

/android
- [coreyhulen](https://github.com/coreyhulen), [DavidLu1997](https://github.com/DavidLu1997), [it33](https://github.com/it33), [lfbrock](https://github.com/lfbrock), [nineinchnick](https://github.com/nineinchnick)

/desktop
- [CarmDam](https://github.com/CarmDam), [it33](https://github.com/it33), [jnugh](https://github.com/jnugh), [MetalCar](https://github.com/MetalCar), [Razzeee](https://github.com/Razzeee), [yuya-oc](https://github.com/yuya-oc)

/docs
- [apheleia](https://github.com/apheleia), [coreyhulen](https://github.com/coreyhulen), [crspeller](https://github.com/crspeller), [DavidLu1997](https://github.com/DavidLu1997), [enahum](https://github.com/enahum), [esethna](https://github.com/esethna), [hannaparks](https://github.com/hannaparks), [hmhealey](https://github.com/hmhealey), [it33](https://github.com/it33), [jasonblais](https://github.com/jasonblais), [lfbrock](https://github.com/lfbrock), [maxlmo](https://github.com/maxlmo), [mkhsueh](https://github.com/mkhsueh), [npcode](https://github.com/npcode), [TwizzyDizzy](https://github.com/TwizzyDizzy)

/mattermost-driver-javascript
- [coreyhulen](https://github.com/coreyhulen), [crspeller](https://github.com/crspeller), [enahum](https://github.com/enahum), [jwilander](https://github.com/jwilander)

/mattermost-docker
- [npcode](https://github.com/npcode), [pierreozoux](https://github.com/pierreozoux)

/mattermost/push-proxy
- [coreyhulen](https://github.com/coreyhulen)

/mattermost/mattermost-docker-preview
- [crspeller](https://github.com/crspeller)

If we missed your name, please let us know at feedback@mattermost.com. Recognition is a manual process and mistakes can happen. We want to include anyone who's made a pull request that got merged during the release.

## Release v3.0.3

Release date: 2016-05-27

Notes on patch releases:
- v3.0.3, released 2016-05-27
   - Fixed an error with AD/LDAP signup if user already existed.
   - Fixed an error where setting language to one of the supported langugages caused a blank page.
   - Fixed an error where upgrading team admins on the primary team with AD/LDAP and Gitlab accounts caused an error.
- v3.0.2, released 2016-05-17
   - Security update to reduce information disclosure, thanks to Andreas Lindh for [reporting responsibly](https://mattermost.org/responsible-disclosure-policy/)
   - Fixed an error where, when using Postgres, attempting to log in with an AD/LDAP that has the same email address or username as an email-based account shows a confusing error message.
   - Fixed an error accounts using email authentation attempt to create new teams.
   - Fixed an error where if you upgrade having never previously saved config.json from System Console, saving from System Console will not work.
- v3.0.1, released 2016-05-16
   - v3.0.1 fixed an error in GitLab SSO, thanks to [ArthurHlt](https://github.com/ArthurHlt) for the pull request fixing the issue.
- v3.0.0, released 2016-05-16
   - Original 3.0 release.

### Security Update

- Mattermost v3.0.3 contains multiple security updates. [Upgrading to Mattermost v3.0.3](https://docs.mattermost.com/administration/upgrade.html#upgrading-to-team-edition-3-0-x-from-2-x) is highly recommended.
- Thanks to Yoni Ramon from the Tesla security team, Andreas Lindh and Uchida Ta for contributing security reports through the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

### Major Version Release

Mattermost 3.0 is a new major version of Mattermost with fundamental changes affecting Mattermost 2.x deployments. [An understanding of the upgrade process from 2.x to 3.0](https://mattermost.org/upgrading-to-mattermost-3-0/), including manual steps, is required to upgrade successfully.

### Highlights

#### Unified Accounts

- Users manage a single account across multiple teams
- Users from different teams can share messages and files
- Improved multi-team login and sign-up experience

#### Enterprise Edition Security, Authentication and Branding Upgrades

- Added multi-factor authentication
- Added multiple Active Directory/LDAP upgrades (TLS, filters, custom labels, nickname support)
- Added tools for custom branding

#### User Interface Upgrades
- New Emoji set
- Added full width option for text display
- Improved UI for managing webhooks and slash commands

#### iOS and Android mobile app improvements
- Added support for multiple teams
- New option to include message snippets in push notifications
- Added auto-correct

### Languages

- Added Japanese translation for user interface.

### Improvements

iOS app
- Added support for multiple teams on the same server.
- Added autocorrect.
- Note: Users of Mattermost 3.0 server need to install new iOS 3.0 app. iOS 2.x apps are not compatible with Mattermost 3.0 server. Also, iOS 3.0 app is not compatible with Mattermost 2.x server.

Android app
- Added support for multiple teams on the same server.
- Added autocorrect.
- Note: Users of Mattermost 3.0 server need to install new Android 3.0 app. Android 2.x apps are not compatible with Mattermost 3.0 server. Also, Android 3.0 app is not compatible with Mattermost 2.x server.

User Interface
- Switched to new emoji set.
- Account Settings > Display option lets users set the channel view to full width.
- Smoother overlay transition when opening sidebar on mobile.
- Back and forward browser buttons can now move back and forward in channel history.

Integrations
- Moved webhooks and slash command settings to a new “Integrations” page.
- Added "Display Name" and “Description” to incoming and outgoing webhooks.
- Changed webhooks to always show the username and profile picture, even if posts are consecutive.
- Added a /msg command to open a direct message channel with another user.

Authentication
- Changed the user model so accounts are per server instead of per team.
- Updated the login flow so users can select which team to open after signing in.
- Combined Email, Username, and AD/LDAP options into one login box so users can enter their credentials and the system will identify which kind of authentication to use.
- GitLab SSO now creates an account from the "Sign In" button if an account previously did not exist.

Files and Attachments
- Added a preview for code files in the image viewer.

Notifications
- Added the option to enable full snippets in push notifications.

Search
- Changed searches to connect terms with "AND" instead of "OR".

Enterprise:
- Added the ability to map nickname to an AD/LDAP field.
- Added the ability to filter AD/LDAP users, so only users selected by the filter can log in to Mattermost.
- Added the option to connect to AD/LDAP with TLS or STARTTLS
- Added the option to replace the “AD/LDAP username” login field placeholder text with custom text.
- Users can now switch between AD/LDAP and email login from Account Settings > Security > Sign-in Method.
- Added the option to sign up with AD/LDAP on the "Get Team Invite" link and email invite sign up pages.
- Added multi-factor authentication.
- Added compliance reporting and the option to generate daily compliance reports.
- Added custom branding, so System Admins can set a custom logo and text on the sign in page.
- Added a command line option to upload a license file.

### Bug Fixes

- Posts from webhooks now fire notifications to the user who created the webhook.
- Edit post option no longer appears, but doesn't work, on other users' posts in the right-hand sidebar.
- Text input box does not stay scrolled to the bottom when drafting a long message in Firefox.
- Webhooks in search results now show the username/profile pic of the bot, instead of the user who set up the webhook.
- Outgoing webhooks triggers now work when followed by any type of white space, instead of only spaces
- "User is typing" message now follows Teammate Name Display setting
- Log in with GitLab on mobile now works in the case where there is a space after the email address
- Links in System Console > Legal and Support settings now open properly even if http or https is not included
- Timestamps are displayed in 12-hour format when set to 24-hour format.

### Compatibility
Changes from v2.2 to v3.0:

**iOS and Android**

Mattermost iOS and Android app v3.0 requires Mattermost server v3.0 and higher.

**APIs**

Web Service API is upgraded to Version 3 and previous Version 1 API is no longer supported. Golang driver, Javascript driver, incoming and outgoing webhooks and Slash commands continue to function as in previous release

**config.json**

Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json` or the System Console.

**Changes to Team Edition and Enterprise Edition**:

- Under `TeamSettings` in `config.json`:
    - Added `"EnableOpenServer": false` to set whether users can sign up to the server without an invite.
    - Removed `"EnableTeamListing": false` since the team directory was replaced with new functionality.

- Under `EmailSettings` in `config.json`:
    -  Added `"PushNotificationContents": "generic"` to set whether push notifications send a generic message (`generic`) or send a snippet of the conversation (`full`)

- Under `SupportSettings` in `config.json`, default support links were changed and need to be manually updated for existing installs:
    - Changed: `"TermsOfServiceLink": "https://about.mattermost.com/default-terms/"`
    - Changed: `"PrivacyPolicyLink": "https://about.mattermost.com/default-privacy-policy/"`
    - Changed: `"AboutLink": "https://about.mattermost.com/default-about/"`
    - Changed: `"HelpLink": "https://about.mattermost.com/default-help/"`
    - Changed: `"ReportAProblemLink": "https://about.mattermost.com/default-report-a-problem/"`
    - Changed: `"SupportEmail": "feedback@mattermost.com"`

**Additional Changes to Enterprise Edition:**

The following config settings will only work on servers with an Enterprise License that has the feature enabled.

- Under `ServiceSettings` in `config.json`:
  - Added `"EnableMultifactorAuthentication": false` to enable Multifactor Authentication

- Under `TeamSettings` in `config.json`:
    -  Added `"EnableCustomBrand": false` to set whether custom branding of the login page is turned on.
    -  Added `"CustomBrandText": ""` to set what text will show up on the login page, if `"EnableCustomBrand":` is set to `true`.

- Under `LdapSettings` in `config.json`:
    - Added `"ConnectionSecurity":""` to set the type of connection security Mattermost uses to connect to AD/LDAP. Options are `""` (no security), `TLS` or `STARTTLS`.
    - Added `"UserFilter": ""` (optional) to set an AD/LDAP Filter to use when searching for user objects.
    - Added `"NicknameAttribute": ""` to set the attribute in the AD/LDAP server that will be used to populate the nickname field in Mattermost.
    - Added `"SkipCertificateVerification": false` to set whether the certificate verification step for TLS or STARTTLS connections is skipped. (For testing purposes only. Should be set to `false` in production.)
    - Added `"LoginFieldName": ""` to set the help text in the login box (for example, AD/LDAP username or Company username).

- Added `ComplianceSettings` to `config.json`:
    - Added `"Enable": false` to set whether compliance reports are enabled.
    - Added `"Directory": "./data/"` to set where the reports are stored.
    - Added `"EnableDaily": false` to set whether Daily Reports are turned on.

#### Database Changes from v2.2 to v3.0

Version 3.0 uses a different database than version 2.0. A one-way change to the database will be required when upgrading from v2.2 to v3.0.

### Known Issues

- “More” option under Direct Message list no longer shows count of team members not in your direct message list.
- Emoji smileys ending with a letter at the end of a message do not auto-complete as expected.
- Incorrect formatting when a new line is added directly after a list.
- Searching for a username or hashtag containing a dot now returns the correct results.
- On Postgres databases, searching for websites, emails, and searching with quotations does not work properly.
- Search term highlighting doesn't update when search terms change but return the same posts.
- Search results don't highlight properly for searches containing @username, non-latin characters, terms inside Markdown code blocks, or hashtags containing a dash.
- Custom brand image size isn’t properly limited on IE11.

### Contributors

Many thanks to all our contributors. In alphabetical order:

/mattermost-server
- [alanmoo](https://github.com/alanmoo), [ArthurHlt](https://github.com/ArthurHlt), [asaadmahmood](https://github.com/asaadmahmood), [augustohp](https://github.com/augustohp),  [brunoqc](https://github.com/brunoqc), [chengweiv5](https://github.com/chengweiv5), [Compaurum](https://github.com/Compaurum), [coreyhulen](https://github.com/coreyhulen), [crspeller](https://github.com/crspeller), [CyrilTerets](https://github.com/CyrilTerets), [DavidLu1997](https://github.com/DavidLu1997), [enahum](https://github.com/enahum), [FeliciousX](https://github.com/FeliciousX), [hauschke](https://github.com/hauschke), [hmhealey](https://github.com/hmhealey), [insin](https://github.com/insin), [it33](https://github.com/it33), [jwilander](https://github.com/jwilander), [khoa-le](https://github.com/khoa-le), [lfbrock](https://github.com/lfbrock), [loafoe](https://github.com/loafoe), [maruTA-bis5](https://github.com/maruTA-bis5), [moogle19](https://github.com/moogle19), [olivierperes](https://github.com/olivierperes), [pjgrizel](https://github.com/pjgrizel), [qcu](https://github.com/qcu), [rodrigocorsi2](https://github.com/rodrigocorsi2), [ryoon](https://github.com/ryoon), [samogot](https://github.com/samogot), [stupied4ever](https://github.com/stupied4ever), [takashibagura](https://github.com/takashibagura), [usmanarif](https://github.com/usmanarif), [yumenohosi](https://github.com/yumenohosi)

/mattermost-docker
- [npcode](https://github.com/npcode), [xcompass](https://github.com/xcompass), [it33](https://github.com/it33)

/ios
- [coreyhulen](https://github.com/coreyhulen), [it33](https://github.com/it33)

/android
- [arusahni](https://github.com/arusahni), [JohnMaguire](https://github.com/JohnMaguire), [lindy65](https://github.com/lindy65), [nicolas-raoul](https://github.com/nicolas-raoul), [ptersilie](https://github.com/ptersilie)

/desktop
- [asaadmahmood](https://github.com/asaadmahmood), [it33](https://github.com/it33), [jeremycook](https://github.com/jeremycook), [lloeki](https://github.com/lloeki), [mgielda](https://github.com/mgielda), [yuya-oc](https://github.com/yuya-oc)

/docs
- [ajerezr](https://github.com/ajerezr), [apheleia](https://github.com/apheleia), [asaadmahmood](https://github.com/asaadmahmood), [crspeller](https://github.com/crspeller), [DavidLu1997](https://github.com/DavidLu1997), [enahum](https://github.com/enahum), [esethna](https://github.com/esethna), [it33](https://github.com/it33), [lfbrock](https://github.com/lfbrock), [lindy65](https://github.com/lindy65), [pjgrizel](https://github.com/pjgrizel), [schemacs](https://github.com/schemacs)

## Release v2.2.0

Release date: 2016-04-16

### Security Update

- Mattermost v2.2.0 contains multiple security updates. [Upgrading to Mattermost v2.2.0](https://docs.mattermost.com/administration/upgrade.html#upgrading-team-edition) is highly recommended.
- Thanks to Jim Hebert from Fitbit Security, Andreas Lindh, and Uchida Taishi for contributing security reports through the [Mattermost Responsible Disclosure Policy](https://mattermost.org/responsible-disclosure-policy/).

### Highlights

#### New themes

- User now have access to additional themes from Account Settings > Display Settings > Themes > See other themes
- A [contest for the user community to contribute new themes is now available.](https://forum.mattermost.org/t/share-your-favorite-mattermost-theme-colors/1330)

#### French language translation

- French language translation is now available.

#### TPNS and EAS options

- [Enterprise App Store](https://docs.mattermost.com/deployment/push.html#enterprise-app-store-eas) (EAS) and [Test Push Notification Service](https://docs.mattermost.com/deployment/push.html#test-push-notifications-service-tpns) (TPNS) option are now included in **System Console** > **Email Settings** > **Push Notification Settings** as built-in options.

### Languages

- Added French language translation (Beta) available from **Account Settings** > **Display**.

### Improvements

User Interface

- New themes can be imported into Mattermost user interface from [production documentation](https://docs.mattermost.com/help/settings/theme-colors.html#custom-theme-examples).

### Bug Fixes

- Characters in some posts will no longer display as HTML entities, such as `&#39;`

### Known Issues

- Regression: Get Public Link downloads a file and does not product a public link.
- Edit post option appears, but doesn't work, on other users' posts in the right-hand sidebar.
- Text input box does not stay scrolled to the bottom when drafting a long message in Firefox.
- File name tooltip stays open after clicking to download.
- Unable to paste images into the text box on Firefox, Safari, and IE11.
- Archived channels are not removed from the "More" menu for the person that archived the channel until after refresh.
- First load of an empty channel does not display the introduction message.
- Search results don't highlight searches for @username, non-latin characters, or terms inside Markdown code blocks.
- Searching for a username or hashtag containing a dot returns a search where the dot is replaced with the "or" operator.
- Hashtags containing a dash incorrectly highlight in the search results.
- Emoji smileys ending with a letter at the end of a message do not auto-complete as expected.
- Incorrect formatting when a new line is added directly after a list.
- Timestamps are displayed in 12-hour format when set to 24-hour format.
- Syntax highlighting code block is missing the label for Latex documents.
- Posts from webhooks do not fire notifications to the user who created the webhook.
- Theme color vector is not updated after making custom changes to a default theme.
- Search term highlighting doesn't update on IE11 when search terms change but return the same posts.
- Team creation via SSO fails when email domain is restricted.

### Contributors

Many thanks to all our external contributors. In no particular order:

- [pjgrizel](https://github.com/pjgrizel), [tbolon](https://github.com/tbolon) , [jblobel](https://github.com/jblobel), [rodrigocorsi2](https://github.com/rodrigocorsi2) , [enahum](https://github.com/enahum), [schemacs](https://github.com/schemacs), [raelga](https://github.com/raelga)

## Release v2.1.0

Release date: 2016-03-16

### Highlights

- New Android application now available.
- New desktop applications for Windows, Mac and Linux now in beta.
- Brazilian Portuguese translation added.

### Security Update

Mattermost v2.1.0 contains a security update for a cross-site scripting vulnerability in Mattermost v1.2, v1.3, v1.4 and v2.0. [Upgrading to Mattermost v2.1.0](https://docs.mattermost.com/administration/upgrade.html#upgrading-team-edition) is highly recommended. Thanks to Luke Arntson for the [RPD report](https://mattermost.org/responsible-disclosure-policy/).

### New Features

Android Application

- New [Mattermost Android App](https://github.com/mattermost/android) supporting push notifications available for devices running Android 4.4.2+. Requires Mattermost server 2.1 and higher. See [list of tested devices](https://github.com/mattermost/android/blob/master/DEVICES.md).

Desktop Application

- New [Desktop Application](https://github.com/mattermost/desktop) for Windows, Mac, and Linux now available as a beta release.

Languages

- Added Portuguese language translation (Beta) available from **Account Settings** > **Display**.

### Improvements

System Console

- Removed unused “Disable File Storage” option from the System Console as it is no longer relevant.
- Added a warning message if a system admin demotes themselves.
- System Console statistics now use a client store instead of fetching data and storing it in state.

Messaging

- Custom slash commands now support temporary messages that appear only to the user that issued the command.
- Username autocomplete list no longer suggests inactive users.

Mobile

- Significant responsiveness and speed improvements using [fastclick](https://github.com/ftlabs/fastclick).
- Team name and username are now shown in the LHS header.
- Added a button to go back to the team URL page from the login page.

Files and Images

- Increased the maximum size of image uploads to 24 megapixels.

User Interface

- Custom theme color selectors are now organized into categories.
- Add Members and Manage Members dialogs can now be filtered using a search bar.
- Deactivated members no longer appear in the channel members list.
- Keyboard focus is set to the text input box in the right-hand sidebar if a user clicks the reply icon.
- Permalinks are now displayed in a Copy Permalink dialog instead of a popover.
- Permalink option is now available from the [...] menu on messages and comments in the right-hand sidebar.
- Reply icon now only appears on-hover for messages that don’t have replies.
- Scroll bar now appears in the center channel.

#### Bug Fixes

- System console user management tab now shows username and email on different lines.
- Yellow text box error no longer appears when the system is connected.
- Wildcard search on MySQL databases is now fixed.
- Usernames in the center channel no longer appear as “...” on login.
- Deleted messages now delete in the right-hand sidebar and center channel without requiring a page refresh.
- Contact us email address in the footer of notification emails now uses the SupportEmail config setting instead of FeedbackEmail.
- Email addresses are now required to have at least one letter before and after the @ sign.
- Firefox desktop notifications are now fixed for some users experiencing missed notifications.
- “User is typing” message containing long usernames no longer causes text wrapping.
- Usernames appearing as “...” in the right-hand sidebar when performing a search is fixed.
- Links that end in image extensions but do not actually link to raw images no longer generate a blank image preview.
- Channel handle field in the Rename Channel dialog is now visible on themes with dark backgrounds.
- Autolinked images no longer persist after the post containing the link is deleted.
- Code theme selector on IE11 now only shows one dropdown arrow and clicking directly on the arrow opens the dropdown.
- Save/Cancel buttons for language selection in Account Settings are now formatted the same as other settings.
- Inconsistent field spacing in the Channel Info dialog is fixed.
- Recent mentions icon no longer jumps to the left of the search bar when the right-hand sidebar is opened.
- Custom slash command hints now show up in the autocomplete list.
- GIF links inside code blocks no longer auto-post the GIFs.
- Changing usernames no longer adds the old username to “words that trigger mentions”.
- Notification email footer is now translated based on the sender’s language setting.
- Slash command `/me` now posts as the user instead of a webhook message.
- Logout slash command now forces logout.
- Public links to file attachments on deleted posts no longer work.
- Error message is now shown in IE11 when uploading more than 5 files or a file over 50 MB.


### Compatibility
Changes from v2.0 to v2.1:

**Android**
- Mattermost Android Application is for use with Mattermost server v2.1 and higher.

**config.json**
- The following setting was added and can be modified under `ServiceSettings` in `config.json` or the System Console.
    - `"AllowCorsFrom": ""` to allow the system to serve HTTP requests to other domains specified.

#### Known Issues

- Edit post option appears, but doesn't work, on other users' posts in the right-hand sidebar.
- Text input box does not stay scrolled to the bottom when drafting a long message in Firefox.
- Some characters in posts may display as HTML entities, such as `&#39;`. This can be fixed by switching to a different language and then back again.
- File name tooltip stays open after clicking to download.
- Unable to paste images into the text box on Firefox, Safari, and IE11.
- Archived channels are not removed from the "More" menu for the person that archived the channel until after refresh.
- First load of an empty channel does not display the introduction message.
- Search results don't highlight searches for @username, non-latin characters, or terms inside Markdown code blocks.
- Searching for a username or hashtag containing a dot returns a search where the dot is replaced with the "or" operator.
- Hashtags containing a dash incorrectly highlight in the search results.
- Emoji smileys ending with a letter at the end of a message do not auto-complete as expected.
- Incorrect formatting when a new line is added directly after a list.
- Timestamps are displayed in 12-hour format when set to 24-hour format.
- Syntax highlighting code block is missing the label for Latex documents.
- Posts from webhooks do not fire notifications to the user who created the webhook.
- Theme color vector is not updated after making custom changes to a default theme.
- Search term highlighting doesn't update on IE11 when search terms change but return the same posts.
- Team creation via SSO fails when email domain is restricted.

#### Contributors

Many thanks to all our external contributors. In no particular order:

- [yuya-oc](https://github.com/yuya-oc), [rodrigocorsi2](https://github.com/rodrigocorsi2), [enahum](https://github.com/enahum), [khoa-le](https://github.com/khoa-le), [alanmoo](https://github.com/alanmoo), [daizenberg](https://github.com/daizenberg), [GuillaumeAmat](https://github.com/GuillaumeAmat), [kernicPanel](https://github.com/kernicPanel), [timlyo](https://github.com/timlyo), [ttyniwa](https://github.com/ttyniwa)

## Release v2.0.0

Expected Release date: 2016-02-16

### Highlights

#### Incremented Version Number: Mattermost "2.0"

- Version number incremented from "1.x" to "2.x" indicating major product changes, including:

##### Localization

- Addition of localization support to entire user interface plus error and log messages
- Added Spanish language translation (Beta quality) available from **Account Settings** > **Display**

##### Enhanced Support for Mobile Devices

- BREAKING CHANGE to APIs: New Android and updated iOS apps require Mattermost server 2.0 and higher
- iOS added app support for GitLab single sign-on
- iOS added app support for AD/LDAP single sign-on (Enterprise Edition only)

##### Upgrade and Deployment Improvements
- Mattermost v2.0 now upgrades from up to two previous major builds (e.g. v1.4.x and v1.3.x)
- Added option to allow use of insecure TLS outbound connections to allow use of self-signed certificates

### New Features

Localization

- Addition of localization support to entire user interface plus error and log messages
- Added Spanish language translation (Beta quality) available from **Account Settings** > **Display**

Slash Commands

- Added [Slack-compatible slash commands](https://docs.mattermost.com/developer/slash-commands.html) to integrate with external systems

iOS

- [iOS app](https://github.com/mattermost/ios) added support for GitLab single sign-on
- [iOS app](https://github.com/mattermost/ios) added support for AD/LDAP single sign-on (Enterprise Edition only)

Android

- New open source Android application compatible with Mattermost 2.0 and higher

System Console

- Added **Site Reports** to view system statistics on posts, channels and users.

### Improvements

Upgrading

- Mattermost v2.0 now upgrades from up to two previous major builds (e.g. v1.4.x and v1.3.x).

Files and Images

- Public links to images and files created by users no longer expire
- OGG attachments now play in preview window on Chrome and Firefox

Onboarding

- “Get Team Invite Link” option is disabled from the main menu if user creation is disabled for the team
- Tutorial colors improved to provide higher contrast with new default theme

Authentication

- Added ability to sign in with username as an alternative to email address
- Switching from email to SSO for sign in now updates email address to use the SSO email

System Console

- Added option to allow use of insecure TLS outbound connections to allow use of self-signed certificates
- Removed unused "Disable File Storage" option from **System Console** > **File Storage**
- Added warning if a user demotes their account from System Administrator

Search

- Hashtag search is no longer case sensitive
- System messages no longer appear in search results
- Date separator added to search results
- Moved the recent mentions icon to the right of the search bar

Messaging
- Changed the comment bubble to a reply arrow to make post replies and the right-hand sidebar more discoverable
- Time stamp next to sequential posts made by users now shows HH:MM instead of on-hover timestamp
- Code blocks now support horizontal scrolling if content exceeds the max width

User Interface

- Away status added to note users who have been idle for more than 5 minutes.
- Long usernames are now truncated in the center channel and right-hand sidebar
- Added more favicon sizes for home screen icons on mobile devices

#### Bug Fixes

- Incorrect “Mattermost unreachable” error on iOS no longer appears
- Dialog to confirm deletion of a post now supports hitting “ENTER” to confirm deletion.
- Keyboard focus on the New Channel modal on IE11 is now contained within the text box.
- LHS indicator for “Unread Posts Above/Below” now displays on IE11
- Unresponsive UI when viewing a permalink is fixed if a user clicks outside the text on the "Click here to jump to recent messages" bar.
- Dismissed blue bar error messages no longer re-appear on page refresh.
- Console error is no longer thrown on first page load in Firefox and Edge.
- Console error and missing notification is fixed for the first direct message received from any user.
- Comment bubble in Firefox no longer appears with a box around it on-hover.
- Home screen icons on Android and iOS devices now appear with the Mattermost logo.
- Switching channels now clears the “user is typing” message below the text input box.
- iOS devices are no longer detected as “unknown” devices in the session history.

### Compatibility
Changes from v1.4 to v2.0:

**iOS**

Mattermost iOS app v2.0 requires Mattermost server v2.0 and higher.

**config.json**

Multiple setting options were added to `config.json`. Below is a list of the additions and their default values on install. The settings can be modified in `config.json` or the System Console.

- Under `ServiceSettings` in `config.json`:
    - `"EnableCommands": false` to set whether users can create slash commands from **Account Settings** > **Integrations** > **Commands**
    - `"EnableOnlyAdminIntegrations": true` to restrict integrations to being created by admins only.
    - `"EnableInsecureOutgoingConnections": false` sets whether outgoing HTTPS requests can accept unverified, self-signed certificates.
    - Optional: `"WebsocketSecurePort" : 443` sets the port on which the secured WebSocket will listen using the `wss` protocol. If this setting is not present in `config.json`, it defaults to `443`.
    - Optional: `"WebsocketPort": 80` sets the port on which the unsecured WebSocket will listen using the `ws` protocol. If this setting is not present in `config.json`, it defaults to `80`.

- Under `EmailSettings` in `config.json`:
    -  `"EnableSignInWithEmail": true` allows users to sign in using their email.
    -  `"EnableSignInWithUsername": false` sets whether users can sign in with their username. Typically only used when email verification is disabled.

**Localization**

There are two new directories for i18n localization JSON files:
- mattermost-server/i18n for server-side localization files
- mattermost-webapp/i18n for client-side localization files

#### Database Changes from v1.4 to v2.0

The following is for informational purposes only, no action needed. Mattermost automatically upgrades database tables from the previous version's schema using only additions.

##### Users Table
1. Added `Locale` column

##### Licenses Table
1. Added `Licenses` Table

##### Commands Table
1. Added `Commands` Table

#### Known Issues

- Navigating to a page with new messages containing inline images added via markdown causes the channel to scroll up and down while loading the inline images.
- Microsoft Edge does not yet support drag and drop for file attachments.
- No error message on IE11 when uploading more than 5 files or a file over 50 MB.
- File name tooltip stays open after clicking to download.
- Scroll bar does not appear in the center channel.
- Unable to paste images into the text box on Firefox, Safari, and IE11.
- Importing from Slack fails to load channels in certain cases.
- System Console > Teams > Statistics > Newly Created Users shows all users as created "just now".
- Username and email display on single line in System Console user management tab.
- Searching for a phrase in quotations returns more than just the phrase on installations with a Postgres database.
- Archived channels are not removed from the "More" menu for the person that archived the channel until after refresh.
- First load of an empty channel does not display the introduction message.
- Search results don't highlight searches for @username, non-latin characters, or terms inside Markdown code blocks.
- Searching for a username or hashtag containing a dot returns a search where the dot is replaced with the "or" operator.
- Search term highlighting doesn't update on IE11 when search terms change but return the same posts.
- Hashtags less than three characters long are not searchable.
- Hashtags containing a dash incorrectly highlight in the search results.
- Users remain in the channel counter after being deactivated.
- Permalinks for the second message or later consecutively sent in a group by the same author displaces the copy link popover or causes an error.
- Emoji smileys ending with a letter at the end of a message do not auto-complete as expected.
- Logout slash command does not force a logout.
- Incorrect formatting when a new line is added directly after a list.
- Timestamps are displayed in 12-hour format when set to 24-hour format.
- GIF links inside code blocks auto-post the GIFs.
- Syntax highlighting code block is missing the label for Latex documents.
- Deleted messages don't delete in the right-hand sidebar until a page refresh.

#### Contributors

Special thanks to [enahum](https://github.com/enahum) for creating the Spanish localization!

Many thanks to all our external contributors. In no particular order:

- [enahum](https://github.com/enahum), [trashcan](https://github.com/trashcan), [khoa-le](https://github.com/khoa-le), [alanmoo](https://github.com/alanmoo), [fallenby](https://github.com/fallenby), [loafoe](https://github.com/loafoe), [gramakri](https://github.com/gramakri), [pawelad](https://github.com/pawelad), [cifvts](https://github.com/cifvts), [rosskusler](https://github.com/rosskusler), [apskim](https://github.com/apskim)

## Release v1.4.0

Expected Release date: 2016-01-16

### Release Highlights

#### Data Center Support

- Deployment guides on Red Hat Enterprise Linux 6 and 7 now available
- Legal disclosure and support links (terms of service, privacy policy, help, about, and support email) now configurable
- Over a dozen new configuration options in System Console

#### Mobile Experience

- iOS reference app [now available from iTunes](https://itunes.apple.com/us/app/mattermost/id984966508?ls=1&mt=8), compiled from [open source repo](https://github.com/mattermost/ios)
- Date headers now show when scrolling on mobile, so you can quickly see when messages were sent
- Added "rapid scroll" support for jumping quickily to bottom of channels on mobile

### New Features

Mobile Experience
- Date headers now show when scrolling on mobile, so you can quickly see when messages were sent
- Added "rapid scroll" support for jumping quickily to bottom of channels on mobile

Authentication

- Accounts can now switch between email and GitLab SSO sign-in options
- New ability to customize session token length

System Console

- Added **Legal and Support Settings** so System Administrators can change the default Terms of Service, Privacy Policy, and Help links
- Under **Service Settings** added options to customize expiry of web, mobile and SSO session tokens, expiry of caches in memory, and an EnableDeveloper option to turn on Developer Mode which alerts users to any console errors that occur

### Improvements

Performance and Testing

- Added logging for email and push notifications events in DEBUG mode

Integrations

- Added support to allow optional parameters in the `Content-Type` of incoming webhook requests

Files and Images

- Animated GIFs autoplay in the image previewer

Notifications and Email

- Changed email notifications to display the server's local timezone instead of UTC

User Interface

- Updated the "About Mattermost" dialog formatting
- Going to domain/teamname now goes to the last channel of your previous session, instead of Town Square
- Various improvements to mobile UI, including a floating date indicator and the ability to quickly scroll to the bottom of the channel

#### Bug Fixes

- Fixed issue where usernames containing a "." did not get mention notifications
- Fixed issue where System Console did not save the "Send push notifications" setting
- Fixed issue with Font Display cancel button not working in Account Settings menu
- Fixed incorrect default for "Team Name Display" settings
- Fixed issue where various media files appeared broken in the media player on some browsers
- Fixed cross-contamination issue when multiple accounts log into the same team on the same browser
- Fixed issue where color pickers did not update when a theme was pasted in
- Increased the maximum number of channels

### Compatibility

#### Config.json Changes from v1.3 to v1.4

Multiple settings were added to `config.json`. Below is a list of the changes and their new default values in a fresh install.

The following options can be modified in the System Console:

- Under `ServiceSettings` in `config.json`:
  - Added: `"EnableDeveloper": false` to set whether developer mode is enabled, which alerts users to any console errors that occur
  - Added: `"SessionLengthWebInDays" : 30` to set the number of days before web sessions expire and users will need to log in again
  - Added: `"SessionLengthMobileInDays" : 30` to set the number of days before native mobile sessions expire
  - Added: `"SessionLengthSSOInDays" : 30` to set the number of days before  SSO sessions expire
  - Added: `"SessionCacheInMinutes" : 10` to set the number of minutes to cache a session in memory
- Added `SupportSettings` section to `config.json`:
  - Added: `"TermsOfServiceLink": "/static/help/terms.html"` to allow System Administrators to set the terms of service link
  - Added: `"PrivacyPolicyLink": "/static/help/privacy.html"` to allow System Administrators to set the privacy policy link
  - Added: `"AboutLink": "/static/help/about.html"` to allow System Administrators to set the about page link
  - Added: `"HelpLink": "/static/help/help.html"` to allow System Administrators to set the help page link
  - Added: `"ReportAProblemLink": "/static/help/report_problem.html"` to allow System Administrators to set the home page for the support website
  - Added: `"SupportEmail":"feedback@mattermost.com"` to allow System Administrators to set an email address for feedback and support requests

The following options are not present in the System Console, and can be modified manually in the `config.json` file:

- Under `FileSettings` in `config.json`:
  - Added: `"AmazonS3Endpoint": ""` to set an endpoint URL for an Amazon S3 instance
  - Added: `"AmazonS3BucketEndpoint": ""` to set an endpoint URL for Amazon S3 buckets
  - Added: `"AmazonS3LocationConstraint": false` to set whether the S3 region is location constrained
  - Added: `"AmazonS3LowercaseBucket": false` to set whether bucket names are fully lowercase or not

#### Known Issues

- When navigating to a page with new messages as well as message containing inline images added via markdown, the channel may move up and down while loading the inline images
- Microsoft Edge does not yet support drag and drop
- No scroll bar in center channel
- Pasting images into text box fails to upload on Firefox, Safari, and IE11
- Public links for attachments attempt to download the file on IE, Edge, and Safari
- Importing from Slack breaks @mentions and fails to load in certain cases with comments on files
- System Console > TEAMS > Statistics > Newly Created Users shows all of the users are created "just now"
- Favicon does not always become red when @mentions and direct messages are received on an inactive browser tab
- Searching for a phrase in quotations returns more than just the phrase on Mattermost installations with a Postgres database
- Deleted/Archived channels are not removed from the "More" menu of the person that deleted/archived the channel until after refresh
- Search results don't highlight searches for @username, non-latin characters, or terms inside Markdown code blocks
- Searching for a username or hashtag containing a dot returns a search where the dot is replaced with the "or" operator
- Hashtags less than three characters long are not searchable
- After deactivating a team member, the person remains in the channel counter
- Certain symbols (<,>,-,+,=,%,^,#,*,|) directly before or after a hashtag cause the message to not show up in a hashtag search
- Security tab > Active Sessions reports iOS devices as "unknown"
- Getting a permalink for the second message or later consecutively sent in a group by the same author displaces the copy link popover or causes an error

#### Contributors

Many thanks to our external contributors. In no particular order:

- [npcode](https://github.com/npcode), [hjf288](https://github.com/hjf288), [apskim](https://github.com/apskim), [ejm2172](https://github.com/ejm2172), [hvnsweeting](https://github.com/hvnsweeting), [benburkert](https://github.com/benburkert), [erikthered](https://github.com/erikthered)

## Release v1.3.0

Release date: 2015-12-16

### Release Highlights

#### iOS App

- New [Mattermost iOS App](https://github.com/mattermost/ios) now available for iPhone, iPad, and iPod Touch
- New [Mattermost Push Notification Service](https://github.com/mattermost/push-proxy) to relay notifications to custom iOS applications

#### Search Upgrades

- Jump to search results in archives using new message permalinks
- It's easier to find what you're looking for with improved auto-complete in search

#### Advanced Formatting

- Express more in symbols, with new emoji auto-complete
- Express more in numbers, with rendering of mathematical expressions using Latex (start code blocks with ```latex)
- Personalize your look with new custom font settings under **Account Settings** > **Display** > **Display Font**

### New Features

Authentication
- Added unofficial SSO support for GitHub.com and GitHub Enterprise using GitLab UI

Archives
- Added permalink feature that lets users link to a post in the message archives
- Added ability to "Jump" to archives from a search result

Account Settings
- Added "Preview pre-release features" setting, to allow user to preview early features ahead of their official release
- Added "Display font" setting, so users can select which font to use

Messaging & Comments
- Added in-line previews for links from select websites and for URLs pointing to an image (enabled via Account Settings -> Advanced -> Preview pre-release features)
- Added emoji autocomplete

Extras
- Added `/loadtest url` tool for manually [testing text processing](https://github.com/mattermost//mattermost-server/tree/master/tests)

### Improvements

Performance
- Updated getProfiles service to return less data
- Refactored several modals to use React-Boostrap
- Refactored the center channel

Messaging & Comments
- Added Markdown support for task lists
- Added "Help" link for messaging
- Added ability to preview a Markdown message before sending (enabled via Account Settings -> Advanced -> Preview pre-release features)

Onboarding
- Minor upgrades to tutorial

User Interface
- Visually combined sequential messages from the same user
- Added ability to rename "Town Square"
- Teammate name display option now applies to messages and comments
- Menus and search improved on mobile UI
- Switched to Emoji One style emojis

#### Bug Fixes

- Removed the @all mention to keep users from accidentally spamming team sites
- Fixed bug where the member list only showed "20" members for channels with more than 20 members
- Fixed bug where the channel sidebar didn't order correctly on Postgres databases
- Fixed bug where search results did not highlight when searching with quotation marks, wildcard, or in: and from: modifiers
- Fixed bug with the cancel button not properly resetting the text in some account settings fields
- Fixed bug where editing a post to be empty caused a 404 error
- Fixed bug where logging out did not work properly on IE11
- Fixed issue where refreshing the page with the right hand sidebar open caused "..." to show up in place of usernames
- Fixed issue where invite to channel modal did not update properly when switching between channels

### Compatibility

#### Config.json Changes from v1.2 to v1.3

Multiple settings were added to `config.json`. These options can be modified in the System Console, or manually updated in the existing config.json file. This is a list of changes and their new default values in a fresh install:
- Under `EmailSettings` in `config.json`:
  - Removed: `"ApplePushServer": ""` which is replaced with `SendPushNotifications` and `PushNotificationServer`
  - Removed: `"ApplePushCertPublic": ""`  which is replaced with `SendPushNotifications` and `PushNotificationServer`
  - Removed: `"ApplePushCertPrivate": ""` which is replaced with `SendPushNotifications` and `PushNotificationServer`
  - Added: `"SendPushNotifications": false` to control whether mobile push notifications are sent to the server specified in `PushNotificationServer`
  - Added: `"PushNotificationServer": ""` to specify the address of the proxy server that re-sends push notifications to their respective services like APNS (Apple Push Notification Services)

#### Known Issues

- System Console does not save Email Settings when "Save" is clicked
- When navigating to a page with new messages as well as message containing inline images added via markdown, the channel may move up and down while loading the inline images
- Microsoft Edge does not yet support drag and drop
- Media files of type .avi .mkv .wmv .mov .flv .mp4a do not play  properly
- No scroll bar in center channel
- Pasting images into text box fails to upload on Firefox, Safari, and IE11
- Slack import @mentions break
- Usernames containing a "." do not get mention notifications

#### Contributors

Many thanks to our external contributors. In no particular order:

- [florianorben](https://github.com/florianorben), [npcode](https://github.com/npcode), [42wim](https://github.com/42wim), [cifvts](https://github.com/cifvts), [rompic](https://github.com/rompic), [jdhoek](https://github.com/jdhoek), [Tsynapse](https://github.com/Tsynapse), [alexgaribay](https://github.com/alexgaribay), [vladikoff](https://github.com/vladikoff), [jonathanwiesel](https://github.com/jonathanwiesel), [tamtamchik](https://github.com/tamtamchik)

## Release v1.2.1

- **Released:** 2015-11-16

### Security Notice

Mattermost v1.2.1 is a Quality Release addressing a security issue in v1.2.0 affecting a newly introduced outgoing webhooks feature. Specifically, in v1.2.0 there was a check missing from outgoing webhooks, so a team member creating outgoing webhooks could in theory find a way to listen to messages in private channels containing popular words like "a", "the", "at", etc. For added security, Mattermost v1.2.1 now installs with incoming and outgoing webhooks disabled by default.

To limit the impact of this security issue, Mattermost v1.2.0 has been removed from the source repo. It is recommended that anyone who's installed v1.2.0 upgrade to v1.2.1 via [the procedure described in the Mattermost Upgrade Guide](https://docs.mattermost.com/administration/upgrade.html#upgrade-team-edition-for-2-2-x-and-earlier).

### Release Highlights

#### Outgoing webhooks

- Mattermost users can now interact with external applications using [outgoing webhooks](https://docs.mattermost.com/developer/webhooks-outgoing.html)
- An [application template](https://github.com/mattermost/mattermost-integration-giphy) demonstrating user queries sent to the Giphy search engine via Mattermost webhooks now available
- A community application, [Matterbridge](https://github.com/42wim/matterbridge?files=1), shows how to use webhooks to connect Mattermost with IRC

#### Search Scope Modifiers

- Adding search term `in:[channel_url_name]` now limits searches within a specific channel
- Adding search term `from:[username]` now limits searches to messages from a specific user

#### Syntax Highlighting

- Syntax highlight for code blocks now available for `Diff, Apache, Makefile, HTTP, JSON, Markdown, JavaScript, CSS, nginx, ObjectiveC, Python, XML, Perl, Bash, PHP, CoffeeScript, C, SQL, Go, Ruby, Java, and ini`

#### Usability Improvements

- Added tutorial to teach new users how to use Mattermost
- Various performance improvements to support teams with hundreds of users
- Direct Messages "More" menu now lets you search for users by username and real name

### Improvements

Onboarding

- New tutorial explaining how to use Mattermost for new users

Messaging and Notifications

- Users can now search for teammates to add to **Direct Message** list via **More** menu
- Users can now personalize Direct Messages list by removing users listed
- Link previews - Adding URL with .gif file adds image below message
- Added new browser tab alerts to indicate unread messages and mentions

Search

- Adding search term `in:[channel_url_name]` now limits searches within a specific channel
- Adding search term `from:[username]` now limits searches to messages from a specific user
- Tip explaining search options when clicking into search box

Integrations

- [Outgoing webhooks](https://docs.mattermost.com/developer/webhooks-outgoing.html) now available
- Made available [application template showing outgoing webhooks working with Mattermost and external application](https://github.com/mattermost/mattermost-integration-giphy)

User Interface

- Member list in Channel display now scrollable, and includes Message button to message channel members directly
- Added ability to edit previous message by hitting UP arrow
- Syntax highlighting added for code blocks
   - Languages include `Diff, Apache, Makefile, HTTP, JSON, Markdown, Java, CSS, nginx, ObjectiveC, Python, XML, Perl, Bash, PHP, CoffeeScript, C, SQL, Go, Ruby, Java, and ini`.
   - Use by adding the name of the language on the first link of the code block, for example: ```python
   - Syntax color theme can be defined under **Account Settings** > **Appearance Settings** > **Custom Theme**
- Updated Drag & Drop UI
- Added 24 hour time display option

Team Settings

- Added Team Settings option to include account creation URL on team login page
- Added Team Settings option to include link to given team on root page
- Ability to rotate invite code for invite URL

Extras

- Added `/shrug KEYWORD` command to output: `¯\_(ツ)_/¯ KEYWORD`
- Added `/me KEYWORD` command to output: _`KEYWORD`_
- Added setting option to send a message on control-enter instead of enter

System Console

- New statistics page
- Configurable option to create an account directly from team page

#### Bug Fixes

- Various fixes to theme colors
- Fixed issue with the centre channel scroll position jumping when right hand side was opened and closed
- Added support for simultaneous login to different teams in different browser tabs
- Incoming webhooks no longer disrupted when channel is deleted
- You can now paste a Mattermost incoming webhook URL into the same field designed for a Slack URL and integrations will work

### Compatibility

- IE 11 new minimum version for IE, since IE 10 share fell below 5% on desktop
- Safari 9 new minimum version for Safari, since Safari 7 and 8 fell below 1% each on desktop

#### Config.json Changes from v1.1 to v1.2

Multiple settings were added to `config.json`. These options can be modified in the System Console, or manually updated in the existing config.json file. This is a list of changes and their new default values in a fresh install:
- Under `TeamSettings` in `config.json`:
  - Added: `"RestrictTeamNames": true` to control whether team names can contain reserved words like www, admin, support, test, etc.
  - Added: `"EnableTeamListing": false` to control whether teams can be listed on the root page of the site
- Under `ServiceSettings` in `config.json`
  - Added: `"EnableOutgoingWebhooks": false` to control whether outgoing webhooks are enabled
  - Changed: `"EnableIncomingWebhooks": true` to `"EnableIncomingWebhooks": false` to turn incoming webhooks off by default, to increase security of default install. Documentation updated to enable webhooks before use.

#### Database Changes from v1.1 to v1.2

The following is for informational purposes only, no action needed. Mattermost automatically upgrades database tables from the previous version's schema using only additions. Sessions table is dropped and rebuilt, no team data is affected by this.

##### Channels Table
1. Renamed `Description` to `Header`
2. Added `Purpose` column with type `varchar(1024)`

##### Preferences Table
1. Added `Preferences` Table

##### Teams Table
1. Added `InviteId` column with type `varchar(32)`
2. Added `AllowOpenInvite` column with type `tinyint(1)`
3. Added `AllowTeamListing` column with type `tinyint(1)`
4. Added `idx_teams_invite_id` index

#### Known Issues

- When navigating to a page with new messages as well as message containing inline images added via markdown, the channel may move up and down while loading the inline images
- Microsoft Edge does not yet support drag and drop
- After upgrading to v1.2 existing users will see the newly added tutorial tips upon login (this is a special case for v1.2 and will not happen in future upgrades)
- Channel list becomes reordered when there are lowercase channel names in a Postgres database
- Member list only shows "20" members for channels with more than 20 members
- Searches containing punctuation are not highlighted in the results (including in: or from: search modifiers and searches with quotations)
- Media files of type .avi .mkv .wmv .mov .flv .mp4a do not play  properly
- Editing a post so that it's text is blank (which should delete it) throws a 404
- No scroll bar in centre channel
- Theme color import from Slack fails to import the “Active Channel” selection color
- Pasting images into text box fails to upload on Firefox and Safari
- Users cannot claim accounts imported from Slack via password reset
- Slack import @mentions break

#### Contributors

Many thanks to our external contributors. In no particular order:

- [florianorben](https://github.com/florianorben), [trashcan](https://github.com/trashcan), [girishso](https://github.com/girishso), [apaatsio](https://github.com/apaatsio), [jlebleu](https://github.com/jlebleu), [stasvovk](https://github.com/stasvovk), [mcmillhj](https://github.com/mcmillhj), [sharms](https://github.com/sharms), [jvasallo](https://github.com/jvasallo), [layzerar](https://github.com/layzerar), [optimistiks](https://github.com/optimistiks), [Tsynapse](https://github.com/Tsynapse), [vinnymac](https://github.com/vinnymac), [yuvipanda](https://github.com/yuvipanda), [toyorg](https://github.com/toyorg)

## Release v1.2.0 (Redacted Release)

- **Final release:** 2015-11-16 (**Note:** This release was removed from public availability and replaced by v1.2.1 owing to a security issue with the new outgoing webhooks feature. See v1.2.1 Release Notes for details).

## Release v1.1.1 (Quality Release)

Released 2015-10-20

### About Quality Releases

This is a Quality Release (v1.1.1) and recommended only for users needing a fix to the specific issue listed below. All other users should use the most recent major stable build release (v1.1.0).

[View more information on Mattermost release numbering](https://docs.mattermost.com/process/release-process.html#release-numbering).

### Release Purpose

#### Provide option for upgrading database from Mattermost v0.7 to v1.1

Upgrading Mattermost v0.7 to Mattermost v1.1 originally required installing Mattermost v1.0 to upgrade from the Mattermost v0.7 database, followed by an install of Mattermost v1.1.

This was problematic for installing Mattermost with GitLab omnibus since GitLab 8.0 contained Mattermost v0.7 and GitLab 8.1 was to include Mattermost v1.1

Therefore Mattermost v1.1.1 was created that can upgrade the database in Mattermost v0.7 to Mattermost v1.1 directly.

Users who configured Mattermost v0.7 within GitLab via the `config.json` file should consult [documentation on upgrading configurations from Mattermost v0.7 to Mattermost v1.1](https://docs.mattermost.com/administration/upgrade.html#upgrade-team-edition-for-2-2-x-and-earlier).

#### Removes 32-char limit on salts

Mattermost v1.1 introduced a 32-char limit on salts that broke the salt generating in GitLab and this restriction was removed for 1.1.1.

## Release v1.1.0

Released: 2015-10-16

### Release Highlights

#### Incoming Webhooks

Mattermost now supports incoming webhooks for channels and private groups. This developer feature is available from the Account Settings -> Integrations menu. Documentation on how developers can use the webhook functionality to build custom integrations, along with samples, is available at https://docs.mattermost.com/guides/integration.html.

### Improvements

Integrations

- Improved support for incoming webhooks, including the ability to override a username and post as a bot instead

Documentation

- Added documentation on config.json and System Console settings
- Docker Toolbox replaces deprecated Boot2Docker instructions in container install documentation

Theme Colors

- Improved appearance of dark themes

System Console

- Client side errors now written to server logs
- Added "EnableSecurityFixAlert" option to receive alerts on relevant security fix alerts
- Various improvements to System Console UI and help text

Messaging and Notifications

- Replaced "Quiet Mode" in the Channel Notification Settings with an option to only show unread indicator when mentioned

### Bug Fixes

- Fixed regression causing "Get Public Link" on images not to work
- Fixed bug where certain characters caused search errors
- Fixed bug where System Administrator did not have Team Administrator permissions
- Fixed bug causing scrolling to jump when the right hand sidebar opened and closed

### Known Issues

- Slack import is unstable due to change in Slack export format
- Uploading a .flac file breaks the file previewer on iOS

### Compatibility

#### Config.json Changes from v1.0 to v1.1

##### Service Settings

Multiple settings were added to `config.json` and System Console UI. Prior to upgrading the Mattermost binaries from the previous versions, these options would need to be manually updated in existing config.json file. This is a list of changes and their new default values in a fresh install:
- Under `ServiceSettings` in `config.json`:
  - Added: `"EnablePostIconOverride": false` to control whether webhooks can override profile pictures
  - Added: `"EnablePostUsernameOverride": false` to control whether webhooks can override profile pictures
  - Added: `"EnableSecurityFixAlert": true` to control whether the system is alerted to security updates

#### Database Changes from v1.0 to v1.1

The following is for informational purposes only, no action needed. Mattermost automatically upgrades database tables from the previous version's schema using only additions. Sessions table is dropped and rebuilt, no team data is affected by this.

##### ChannelMembers Table
1. Removed `NotifyLevel` column
2. Added `NotifyProps` column with type `varchar(2000)` and default value `{}`

### Contributors

Many thanks to our external contributors. In no particular order:

- [chengweiv5](https://github.com/chengweiv5), [pstonier](https://github.com/pstonier), [teviot](https://github.com/teviot), [tmuwandi](https://github.com/tmuwandi), [driou](https://github.com/driou), [justyns](https://github.com/justyns), [drbaker](https://github.com/drbaker), [thomas9987](https://github.com/thomas9987), [chuck5](https://github.com/chuck5), [sjmog](https://github.com/sjmog), [chengkun](https://github.com/chengkun), [sexybern](https://github.com/sexybern), [tomitm](https://github.com/tomitm), [stephenfin](https://github.com/stephenfin)

## Release v1.0.0

Released 2015-10-02

### Release Highlights

#### Markdown

Markdown support is now available across messages, comments and channel descriptions for:

- **Headings** - in five different sizes to help organize your thoughts
- **Lists** - both numbered and bullets
- **Font formatting** - including **bold**, _italics_, ~~strikethrough~~, `code`, links, and block quotes)
- **In-line images** - useful for creating buttons and status messages
- **Tables** - for keeping things organized
- **Emoticons** - translation of emoji codes to images like :sheep: :boom: :rage1: :+1:

See [documentation](https://docs.mattermost.com/help/messaging/formatting-text.html) for full details.

#### Themes

Themes as been significantly upgraded in this release with:

- 4 pre-set themes, two light and two dark, to customize your experience
- 18 detailed color setting options to precisely match the colors of your other tools or preferences
- Ability to import themes from Slack

#### System console and command line tools

Added new web-based System Console for managing instance level configuration. This lets IT admins conveniently:

- _access core settings_, like server, database, email, rate limiting, file store, SSO, and log settings,
- _monitor operations_, by quickly accessing log files and user roles, and
- _manage teams_, with essential functions such as team role assignment and password reset

In addition new command line tools are available for managing Mattermost system roles, creating users, resetting passwords, getting version info and other basic tasks.

Run `./platform -h` for documentation using the new command line tool.


### New Features

Messaging, Comments and Notifications

- Full markdown support in messages, comments, and channel description
- Support for emoji codes rendering to image files

Files and Images

- Added ability to play video and audio files

System Console

- UI to change config.json settings
- Ability to view log files from console
- Ability to reset user passwords
- Ability for IT admin to manage members across multiple teams from single interface

User Interface

- Ability to set custom theme colors
- Replaced single color themes with pre-set themes
- Added ability to import themes from Slack

Integrations

- (Preview) Initial support for incoming webhooks

### Improvements

Documentation

- Added production installation instructions
- Updated software and hardware requirements documentation
- Re-organized install instructions out of README and into separate files
- Added Code Contribution Guidelines
- Added new hardware sizing recommendations
- Consolidated licensing information into LICENSE.txt and NOTICE.txt
- Added markdown documentation

Performance

- Enabled Javascript optimizations
- Numerous improvements in center channel and mobile web

Code Quality

- Reformatted Javascript per Mattermost Style Guide

User Interface

- Added version, build number, build date and build hash under Account Settings -> Security

Licensing

- Compiled version of Mattermost v1.0.0 now available under MIT license

### Bug Fixes

- Fixed issue so that SSO option automatically set `EmailVerified=true` (it was false previously)

### Compatibility

A large number of settings were changed in `config.json` and a System Console UI was added. This is a very large change due to Mattermost releasing as v1.0 and it's unlikely a change of this size would happen again.

Prior to upgrading the Mattermost binaries from the previous versions, the below options would need to be manually updated in your existing config.json file to migrate successfully. This is a list of changes and their new default values in a fresh install:
#### Config.json Changes from v0.7 to v1.0

##### Service Settings

- Under `ServiceSettings` in `config.json`:
  - Moved: `"SiteName": "Mattermost"` which was added to `TeamSettings`
  - Removed: `"Mode" : "dev"` which deprecates a high level dev mode, now replaced by granular controls
  - Renamed: `"AllowTesting" : false` to `"EnableTesting": false` which allows the use of `/loadtest` slash commands during development
  - Removed: `"UseSSL": false` boolean replaced by `"ConnectionSecurity": ""` under `Security` with new options: _None_ (`""`), _TLS_ (`"TLS"`) and _StartTLS_ ('"StartTLS"`)
  - Renamed: `"Port": "8065"` to `"ListenAddress": ":8065"` to define address on which to listen. Must be prepended with a colon.
  - Removed: `"Version": "developer"` removed and version information now stored in `model/version.go`
  - Removed: `"Shards": {}` which was not used
  - Moved: `"InviteSalt": "gxHVDcKUyP2y1eiyW8S8na1UYQAfq6J6"` to `EmailSettings`
  - Moved: `"PublicLinkSalt": "TO3pTyXIZzwHiwyZgGql7lM7DG3zeId4"` to `FileSettings`
  - Renamed and Moved `"ResetSalt": "IPxFzSfnDFsNsRafZxz8NaYqFKhf9y2t"` to `"PasswordResetSalt": "vZ4DcKyVVRlKHHJpexcuXzojkE5PZ5eL"` and moved to `EmailSettings`
  - Removed: `"AnalyticsUrl": ""` which was not used
  - Removed: `"UseLocalStorage": true` which is replaced by `"DriverName": "local"` in `FileSettings`
  - Renamed and Moved: `"StorageDirectory": "./data/"` to `Directory` and moved to `FileSettings`
  - Renamed: `"AllowedLoginAttempts": 10` to `"MaximumLoginAttempts": 10`
  - Renamed, Reversed and Moved: `"DisableEmailSignUp": false` renamed `"EnableSignUpWithEmail": true`, reversed meaning of `true`, and moved to `EmailSettings`
  - Added: `"EnableOAuthServiceProvider": false` to enable OAuth2 service provider functionality
  - Added: `"EnableIncomingWebhooks": false` to enable incoming webhooks feature

##### Team Settings

- Under `TeamSettings` in `config.json`:
  - Renamed: `"AllowPublicLink": true` renamed to `"EnablePublicLink": true` and moved to `FileSettings`
  - Removed: `AllowValetDefault` which was a guest account feature that is deprecated
  - Removed: `"TermsLink": "/static/help/configure_links.html"` removed since option didn't need configuration
  - Removed: `"PrivacyLink": "/static/help/configure_links.html"` removed since option didn't need configuration
  - Removed: `"AboutLink": "/static/help/configure_links.html"` removed since option didn't need configuration
  - Removed: `"HelpLink": "/static/help/configure_links.html"` removed since option didn't need configuration
  - Removed: `"ReportProblemLink": "/static/help/configure_links.html"` removed since option didn't need configuration
  - Removed: `"TourLink": "/static/help/configure_links.html"` removed since option didn't need configuration
  - Removed: `"DefaultThemeColor": "#2389D7"` removed since theme colors changed from 1 to 18, default theme color option may be added back later after theme color design stablizes
  - Renamed: `"DisableTeamCreation": false` to `"EnableUserCreation": true` and reversed
  - Added: ` "EnableUserCreation": true` added to disable ability to create new user accounts in the system

##### SSO Settings

- Under `SSOSettings` in `config.json`:
  - Renamed Category: `SSOSettings` to `GitLabSettings`
  - Renamed: `"Allow": false` to `"Enable": false` to enable GitLab SSO

##### AWS Settings

- Under `AWSSettings` in `config.json`:
  - This section was removed and settings moved to `FileSettings`
  - Renamed and Moved: `"S3AccessKeyId": ""` renamed `"AmazonS3AccessKeyId": "",` and moved to `FileSettings`
  - Renamed and Moved: `"S3SecretAccessKey": ""` renamed `"AmazonS3SecretAccessKey": "",` and moved to `FileSettings`
  - Renamed and Moved: `"S3Bucket": ""` renamed `"AmazonS3Bucket": "",` and moved to `FileSettings`
  - Renamed and Moved: `"S3Region": ""` renamed `"AmazonS3Region": "",` and moved to `FileSettings`

##### Image Settings

- Under `ImageSettings` in `config.json`:
  - Renamed: `"ImageSettings"` section to `"FileSettings"`
  - Added: `"DriverName" : "local"` to specify the file storage method, `amazons3` can also be used to setup S3

##### EmailSettings

- Under `EmailSettings` in `config.json`:
  - Removed: `"ByPassEmail": "true"` which is replaced with `SendEmailNotifications` and `RequireEmailVerification`
  - Added: `"SendEmailNotifications" : "false"` to control whether email notifications are sent
  - Added: `"RequireEmailVerification" : "false"` to control if users need to verify their emails
  - Replaced: `"UseTLS": "false"` with `"ConnectionSecurity": ""` with options: _None_ (`""`), _TLS_ (`"TLS"`) and _StartTLS_ (`"StartTLS"`)
  - Replaced: `"UseStartTLS": "false"` with `"ConnectionSecurity": ""` with options: _None_ (`""`), _TLS_ (`"TLS"`) and _StartTLS_ (`"StartTLS"`)

##### Privacy Settings

- Under `PrivacySettings` in `config.json`:
  - Removed: `"ShowPhoneNumber": "true"` which was not used
  - Removed: `"ShowSkypeId" : "true"` which was not used

### Database Changes from v0.7 to v1.0

The following is for informational purposes only, no action needed. Mattermost automatically upgrades database tables from the previous version's schema using only additions. Sessions table is dropped and rebuilt, no team data is affected by this.

##### Users Table
1. Added `ThemeProps` column with type `varchar(2000)` and default value `{}`

##### Teams Table
1. Removed `AllowValet` column

##### Sessions Table
1. Renamed `Id` column `Token`
2. Renamed `AltId` column `Id`
3. Added `IsOAuth` column with type `tinyint(1)` and default value `0`

##### OAuthAccessData Table
1. Added new table `OAuthAccessData`
2. Added `AuthCode` column with type `varchar(128)`
3. Added `Token` column with type `varchar(26)` as the primary key
4. Added `RefreshToken` column with type `varchar(26)`
5. Added `RedirectUri` column with type `varchar(256)`
6. Added index on `AuthCode` column

##### OAuthApps Table
1. Added new table `OAuthApps`
2. Added `Id` column with type `varchar(26)` as primary key
2. Added `CreatorId` column with type `varchar(26)`
2. Added `CreateAt` column with type `bigint(20)`
2. Added `UpdateAt` column with type `bigint(20)`
2. Added `ClientSecret` column with type `varchar(128)`
2. Added `Name` column with type `varchar(64)`
2. Added `Description` column with type `varchar(512)`
2. Added `CallbackUrls` column with type `varchar(1024)`
2. Added `Homepage` column with type `varchar(256)`
3. Added index on `CreatorId` column

##### OAuthAuthData Table
1. Added new table `OAuthAuthData`
2. Added `ClientId` column with type `varchar(26)`
2. Added `UserId` column with type `varchar(26)`
2. Added `Code` column with type `varchar(128)` as primary key
2. Added `ExpiresIn` column with type `int(11)`
2. Added `CreateAt` column with type `bigint(20)`
2. Added `State` column with type `varchar(128)`
2. Added `Scope` column with type `varchar(128)`

##### IncomingWebhooks Table
1. Added new table `IncomingWebhooks`
2. Added `Id` column with type `varchar(26)` as primary key
2. Added `CreateAt` column with type `bigint(20)`
2. Added `UpdateAt` column with type `bigint(20)`
2. Added `DeleteAt` column with type `bigint(20)`
2. Added `UserId` column with type `varchar(26)`
2. Added `ChannelId` column with type `varchar(26)`
2. Added `TeamId` column with type `varchar(26)`
3. Added index on `UserId` column
3. Added index on `TeamId` column

##### Systems Table
1. Added new table `Systems`
2. Added `Name` column with type `varchar(64)` as primary key
3. Added `Value column with type `varchar(1024)`

### Contributors

Many thanks to our external contributors. In no particular order:

- [jdeng](https://github.com/jdeng), [Trozz](https://github.com/Trozz), [LAndres](https://github.com/LAndreas), [JessBot](https://github.com/JessBot), [apaatsio](https://github.com/apaatsio), [chengweiv5](https://github.com/chengweiv5)

## Release v0.7.0 (Beta1)

Released 2015-09-05

### Release Highlights

#### Improved GitLab Mattermost support

Following the release of Mattermost v0.6.0 Alpha, GitLab 7.14 offered an automated install of Mattermost with GitLab Single Sign-On (co-branded as "GitLab Mattermost") in its omnibus installer.

New features, improvements, and bug fixes recommended by the GitLab community were incorporated into Mattermost v0.7.0 Beta1--in particular, extending support of GitLab SSO to team creation, and restricting team creation to users with verified emails from a configurable list of domains.

#### Slack Import (Preview)

Preview of Slack import functionality supports the processing of an "Export" file from Slack containing account information and public channel archives from a Slack team.

- In the feature preview, emails and usernames from Slack are used to create new Mattermost accounts, which users can activate by going to the Password Reset screen in Mattermost to set new credentials.
- Once logged in, users will have access to previous Slack messages shared in public channels, now imported to Mattermost.

Limitations:

- Slack does not export files or images your team has stored in Slack's database. Mattermost will provide links to the location of your assets in Slack's web UI.
- Slack does not export any content from private groups or direct messages that your team has stored in Slack's database.
- The Preview release of Slack Import does not offer pre-checks or roll-back and will not import Slack accounts with username or email address collisions with existing Mattermost accounts. Also, Slack channel names with underscores will not import. Also, mentions do not yet resolve as Mattermost usernames (still show Slack ID). These issues are being addressed in [Mattermost v0.8.0 Migration Support](https://mattermost.atlassian.net/browse/PLT-22?filter=10002).

### New Features

GitLab Mattermost

- Ability to create teams using GitLab SSO (previously GitLab SSO only supported account creation and sign-in)
- Ability to restrict team creation to GitLab SSO and/or users with email verified from a specific list of domains.

File and Image Sharing

- New drag-and-drop file sharing to messages and comments
- Ability to paste images from clipboard to messages and comments

Messaging, Comments and Notifications

- Send messages faster with from optimistic posting and retry on failure

Documentation

- New style guidelines for Go, React and Javascript

### Improvements

Messaging, Comments and Notifications

- Performance improvements to channel rendering
- Added "Unread posts" in left hand sidebar when notification indicator is off-screen

Documentation

- Install documentation improved based on early adopter feedback

### Bug Fixes

- Fixed multiple issues with GitLab SSO, installation and on-boarding
- Fixed multiple IE 10 issues
- Fixed broken link in verify email function
- Fixed public links not working on mobile

### Contributors

Many thanks to our external contributors. In no particular order:

- [asubset](https://github.com/asubset), [felixbuenemann](https://github.com/felixbuenemann), [CtrlZvi](https://github.com/CtrlZvi), [BastienDurel](https://github.com/BastienDurel), [manusajith](https://github.com/manusajith), [doosp](https://github.com/doosp), [zackify](https://github.com/zackify), [willstacey](https://github.com/willstacey)

Special thanks to the GitLab Mattermost early adopter community who influenced this release, and who play a pivotal role in bringing Mattermost to over 100,000 organizations using GitLab today. In no particular order:

- [cifvts](https://forum.mattermost.org/users/cifvts/activity), [Chryb](https://gitlab.com/u/Chryb), [cookacounty](https://gitlab.com/u/cookacounty), [bweston92](https://gitlab.com/u/bweston92), [mablae](https://gitlab.com/u/mablae), [picharmer](https://gitlab.com/u/picharmer), [cmtonkinson](https://gitlab.com/u/cmtonkinson), [cmthomps](https://gitlab.com/u/cmthomps), [m.gamperl](https://gitlab.com/u/m.gamperl), [StanMarsh](https://gitlab.com/u/StanMarsh), [jeanmarc-leroux](https://gitlab.com/u/jeanmarc-leroux), [dnoe](https://gitlab.com/u/dnoe), [dblessing](https://gitlab.com/u/dblessing), [mechanicjay](https://gitlab.com/u/mechanicjay), [larsemil](https://gitlab.com/u/larsemil), [vga](https://gitlab.com/u/vga), [stanhu](https://gitlab.com/u/stanhu), [kohenkatz](https://gitlab.com/u/kohenkatz), [RavenB1](https://gitlab.com/u/RavenB1), [booksprint](https://forum.mattermost.org/users/booksprint/activity), [scottcorscadden](https://forum.mattermost.org/users/scottcorscadden/activity), [sskmani](https://forum.mattermost.org/users/sskmani/activity), [gosure](https://forum.mattermost.org/users/gosure/activity), [jigarshah](https://forum.mattermost.org/users/jigarshah/activity)

Extra special thanks to GitLab community leaders for successful release of GitLab Mattermost Alpha:

- [marin](https://gitlab.com/u/marin), [sytse](https://gitlab.com/u/sytse)


## Release v0.6.0 (Alpha)

Released 2015-08-07

### Release Highlights

- Simplified on-prem install
- Support for GitLab Mattermost (GitLab SSO, Postgres support, IE 10+ support)

### Compatibility

*Note: While use of Mattermost Preview (v0.5.0) and Mattermost Alpha (v0.6.0) in production is not recommended, we document compatibility considerations for a small number of organizations running Mattermost in production, supported directly by Mattermost product team.*

- Switched Team URLs from team.domain.com to domain.com/team

### New Features

GitLab Mattermost

- OAuth2 support for GitLab Single Sign-On
- PostgreSQL support for GitLab Mattermost users
- Support for Internet Explorer 10+ for GitLab Mattermost users

File and Image Sharing

- New thumbnails and formatting for files and images

Messaging, Comments and Notifications

- Users now see posts they sent highlighted in a different color
- Mentions can now also trigger on user-defined words

Security and Administration

- Enable users to view and log out of active sessions
- Team Admin can now delete posts from any user

On-boarding

- “Off-Topic” now available as default channel, in addition to “Town Square”

### Improvements

Installation

- New "ByPassEmail" setting enables Mattermost to operate without having to set up email
- New option to use local storage instead of S3
- Removed use of Redis to simplify on-premise installation

On-boarding

- Team setup wizard updated with usability improvements

Documentation

- Install documentation improved based on early adopter feedback

### Contributors

Many thanks to our external contributors. In no particular order:

- [ralder](https://github.com/ralder), [jedisct1](https://github.com/jedisct1), [faebser](https://github.com/faebser), [firstrow](https://github.com/firstrow), [haikoschol](https://github.com/haikoschol), [adamenger](https://github.com/adamenger)

## Release v0.5.0 (Preview)

Released 2015-06-24

### Release Highlights

- First release of Mattermost as a team communication service for sharing messagse and files across PCs and phones, with archiving and instant search.

### New Features

Messaging and File Sharing

- Send messages, comments, files and images across public, private and 1-1 channels
- Personalize notifications for unreads and mentions by channel
- Use #hashtags to tag and find messages, discussions and files

Archiving and Search

- Search public and private channels for historical messages and comments
- View recent mentions of your name, username, nickname, and custom search terms

Anywhere Access

- Use Mattermost from web-enabled PCs and phones
- Define team-specific branding and color themes across your devices

source/install/installing-ubuntu-2004-LTS.rst METASEP
.. _install-ubuntu-2004:

Install Mattermost on Ubuntu 20.04 LTS
======================================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Install a production-ready Mattermost system on up to three machines.

.. include:: install-common-intro.rst
  :start-after: :nosearch:

.. contents:: Install and configure the components in the following order. 
  :depth: 2

.. include:: install-ubuntu-2004-server.rst
  :start-after: :nosearch:

Install a database
------------------

.. note:: 
  
  You only need one database: either MySQL or PostgreSQL. See the `database software <https://docs.mattermost.com/install/software-hardware-requirements.html#database-software>`__ documentation for details on database version support.

.. tabs::

  .. tab:: Install MySQL
    
    Install and set up a MySQL database for use by the Mattermost server.

    1. Log into the server that will host the database, and open a terminal window.

    2. Install MySQL.

    3. Run ``sudo mysql_secure_installation`` and follow the instructions.

    4. Log in to MySQL as *root* by running ``sudo mysql``.

    5. Create the Mattermost user *mmuser* by running ``mysql> create user 'mmuser'@'%' identified by 'mmuser-password';``. 
    
      - Use a password that is more secure than ``mmuser-password``.
      - The ``%`` means that mmuser can connect from any machine on the network. However, it's more secure to use the IP address of the machine that hosts Mattermost. For example, if you install Mattermost on the machine with IP address 10.10.10.2, then use the following command: ``mysql> create user 'mmuser'@'10.10.10.2' identified by 'mmuser-password';``

    6. Create the Mattermost database by running ``mysql> create database mattermost;``.

    7. Grant access privileges to the user *mmuser* by running ``mysql> grant all privileges on mattermost.* to 'mmuser'@'%';``.

      .. note::
      
        This query grants the MySQL user we just created all privileges on the database for convenience. If you need more security, use the following query to grant the user only the privileges necessary to run Mattermost: ``mysql> GRANT ALTER, CREATE, DELETE, DROP, INDEX, INSERT, SELECT, UPDATE, REFERENCES ON mattermost.* TO 'mmuser'@'%';``

    8. Log out of MySQL by running ``mysql> exit``. Once the database is installed and the initial setup is complete, you can install the Mattermost server.

  .. tab:: Install PostgreSQL

    Install and set up a PostgreSQL database for use by the Mattermost server. These instructions assume that the IP address of this server is ``10.10.10.1``.

    1. Log in to the server that will host the database, and install PostgreSQL. See the `PostgreSQL <https://www.postgresql.org/download/linux/ubuntu/>`__ documentation for details. When the installation is complete, the PostgreSQL server is running, and a Linux user account called *postgres* has been created.

    2. Access PostgreSQL with **one** of the following options:

      - ``sudo --login --user postgres`` then ``psql`` OR
      - ``sudo -u postgres psql``
  
    3. Create the Mattermost database by running ``postgres=# CREATE DATABASE mattermost;``.

    4. Create the Mattermost user *mmuser* by running ``postgres=# CREATE USER mmuser WITH PASSWORD 'mmuser-password';``.
  
      - Use a password that's more secure than ``mmuser-password``.

    5. Grant the user access to the Mattermost database by running ``postgres=# GRANT ALL PRIVILEGES ON DATABASE mattermost to mmuser;``.

    6. Exit the PostgreSQL interactive terminal by running ``postgres=# \q``.

    7. Log out of the *postgres* account by running ``exit``.

    8. (Optional) If you use separate servers for your database and the Mattermost server, you may allow PostgreSQL to listen on all assigned IP addresses by opening ``/etc/postgresql/{version}/main/postgresql.conf`` as *root* in a text editor, and replacing ``{version}`` with the version of PostgreSQL that's currently running. As a best practice, ensure that only the Mattermost server is able to connect to the PostgreSQL port using a firewall.

      a. Find the following line: ``#listen_addresses = 'localhost'``

      b. Uncomment the line and change ``localhost`` to ``*``: ``listen_addresses = '*'``

      c. Restart PostgreSQL for the change to take effect by running ``sudo systemctl restart postgresql``.

    9. Modify the file ``pg_hba.conf`` to allow the Mattermost server to communicate with the database.

        **If the Mattermost server and the database are on the same machine:**

        a. Open ``/etc/postgresql/{version}/main/pg_hba.conf`` as *root* in a text editor.

        b. Find the following lines:

          ``local   all             all                        peer``
      
          ``host    all             all         ::1/128        ident``

        c. Change ``peer`` and ``ident`` to ``trust``:

          ``local   all             all                        trust``
      
          ``host    all             all         ::1/128        trust``

        **If the Mattermost server and the database are on different machines:**

        a. Open ``/etc/postgresql/{version}/main/pg_hba.conf`` in a text editor as *root* user.

        b. Add the following line to the end of the file, where ``{mattermost-server-IP}`` is the IP address of the Mattermost server: ``host all all {mattermost-server-IP}/32 md5``.

    10. Reload PostgreSQL by running ``sudo systemctl reload postgresql``.

    11. Verify that you can connect with the user *mmuser*.

      - If the Mattermost server and the database are on the same machine, use the following command: ``psql --dbname=mattermost --username=mmuser --password``

      - If the Mattermost server is on a different machine, log into that machine and use the following command: ``psql --host={postgres-server-IP} --dbname=mattermost --username=mmuser --password``

    .. note::

      You might have to install the PostgreSQL client software to use the command.

    The PostgreSQL interactive terminal starts. To exit the PostgreSQL interactive terminal, type ``\q`` and press :kbd:`Enter` on Windows or Linux, or :kbd:`↵` on Mac.

    When the PostgreSQL database is installed, and the initial setup complete, you can install the Mattermost server.

.. include:: install-ubuntu-2004-mattermost.rst
  :start-after: :nosearch:

.. include:: config-mattermost-server.rst
  :start-after: :nosearch:

.. include:: config-tls-mattermost.rst
  :start-after: :nosearch:

.. include:: install-nginx.rst
  :start-after: :nosearch:

.. include:: config-proxy-nginx.rst
  :start-after: :nosearch:

.. include:: config-ssl-http2-nginx.rst
  :start-after: :nosearch:
source/install/installing-ubuntu-1804-LTS.rst METASEP
Install Mattermost on Ubuntu 18.04 LTS
=======================================

|all-plans| |self-hosted|

.. |all-plans| image:: ../images/all-plans-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in Mattermost Free and Starter subscription plans.

.. |self-hosted| image:: ../images/self-hosted-badge.png
  :scale: 30
  :target: https://mattermost.com/deploy
  :alt: Available for Mattermost Self-Hosted deployments.

Install a production-ready Mattermost system on 1 to 3 machines.

.. include:: install-common-intro.rst
  :start-after: :nosearch:

.. contents:: Install and configure the components in the following order. Note that you need only one database, either MySQL or PostgreSQL.
  :backlinks: top
  :local:

.. include:: install-ubuntu-1804-server.rst
  :start-after: :nosearch:

.. include:: install-ubuntu-1804-mysql.rst
  :start-after: :nosearch:

.. include:: install-ubuntu-1804-postgresql.rst
  :start-after: :nosearch:

.. include:: install-ubuntu-1804-mattermost.rst
  :start-after: :nosearch:

.. include:: config-mattermost-server.rst
  :start-after: :nosearch:

.. include:: config-tls-mattermost.rst
  :start-after: :nosearch:

.. include:: install-nginx.rst
  :start-after: :nosearch:

.. include:: config-proxy-nginx.rst
  :start-after: :nosearch:

.. include:: config-ssl-http2-nginx.rst
  :start-after: :nosearch:

source/install/installing-team-edition-helm-chart.rst METASEP
..  _install-mmte-helm-gitlab-helm:

How to install Mattermost Team Edition Helm Chart in a GitLab Helm Chart deployment
=====================================================================================

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

This document describes how to use Mattermost Team Edition Helm Chart in proximity with an existing GitLab Helm Chart deployment. Once the Mattermost Team Edition Helm Chart is installed, GitLab SSO integration is configured which utilizes shared configurations to streamline authentication, storage, encryption, and traffic routing.

As the Mattermost Helm Chart is installed in a separate namespace, it is recommended that ``cert-manager`` and ``nginx-ingress`` be configured to manage cluster-wide ingress and certificate resources.

Prerequisites
--------------

- A running Kubernetes cluster.
- `Helm v2 <https://helm.sh/docs/intro/install/)>`_.
- `Tiller <https://rancher.com/docs/rancher/v2.x/en/installation/ha/helm-init/>`_ (the Helm server-side component) installed on the cluster.

.. note::

  For the Team Edition you can have just one replica running.

Install Mattermost Team Edition Helm Chart
------------------------------------------

This chart creates a Mattermost Team Edition deployment on a Kubernetes cluster using the Helm package manager. For detailed instructions, refer to the `Mattermost Team Edition documentation <https://github.com/mattermost/mattermost-helm/tree/master/charts/mattermost-team-edition>`_.

Deploy the Mattermost Team Edition Helm Chart
----------------------------------------------

Once you have installed the Mattermost Team Edition Helm Chart, you can deploy it using the following command:

.. code-block:: sh

  $ helm repo add mattermost https://helm.mattermost.com
  $ helm repo update
  $ helm upgrade --install mattermost -f values.yaml mattermost/mattermost-team-edition

Wait for the pods to run. Then, using the ingress host you specified in the configuration, access your Mattermost server.

Create an OAuth application with GitLab
----------------------------------------

The next part of the process is setting up the GitLab SSO integration.

To create the OAuth application to allow Mattermost to use GitLab as the authentication provider, please follow the instructions `here <https://docs.mattermost.com/onboard/sso-gitlab.html>`__.

Please take note of the ``Application ID``, ``Application Secret Key``, ``User API Endpoint``, ``Auth Endpoint`` and ``Token Endpoint`` settings, as these values will be used later.

.. note:: 

  Only the default GitLab SSO is officially supported. “Double SSO”, where GitLab SSO is chained to other SSO solutions, is not supported. It may be possible to connect GitLab SSO with AD, LDAP, SAML, or MFA add-ons in some cases, but because of the special logic required they’re not officially supported and are known not to work on some experiences.

Deploy GitLab Helm Chart
-------------------------

To deploy the GitLab Helm Chart, follow the instructions described in the `GitLab cloud native Helm Chart <https://docs.gitlab.com/charts/>`__ documentation.

Here's a light way to install it:

.. code-block:: sh

  $ helm repo add gitlab https://charts.gitlab.io/
  $ helm repo update
  $ helm upgrade --install gitlab gitlab/gitlab \
    --timeout 600 \
    --set global.hosts.domain=<your-domain> \
    --set global.hosts.externalIP=<external-ip> \
    --set certmanager-issuer.email=<email>

- ``<your-domain>``: your desired domain, eg. ``gitlab.example.com``.
- ``<external-ip>``: the external IP pointing to your Kubernetes cluster.
- ``<email>``: email to register in Let's Encrypt to retrieve TLS certificates.

Once you've deployed the GitLab instance, follow the instructions for the `initial login <https://docs.gitlab.com/charts/installation/deployment.html#initial-login>`__.

If you're following a process other than the one provided and experience authentication and/or deployment issues, let us know in our `Troubleshooting forum <https://docs.mattermost.com/install/troubleshooting.html>`__ and we'll be happy to help.

Deploy Mattermost Team Edition Helm Chart with GitLab Helm Chart
----------------------------------------------------------------

When you've successfully authenticated and connected to your GitLab instance, the next step is to integrate the two charts. The steps in this document presume in-chart Minio instance usage. For information about out-of-chart object storage configuration, review `this document <https://gitlab.com/gitlab-org/charts/gitlab/tree/master/doc/charts/registry#storage>`__ for GCS and S3 examples. Alternatively, visit your provider's Help documentation for configuration settings.

Prerequisites:

  - Mattermost Team Edition Helm Chart Version: 3.8.2.
  - A running GitLab Helm Chart release.
  - The name of the secret that holds your PostgreSQL password ``<gitlab>-postgresql-password``.
  - (Optional) The name of the secret that holds your MinIO keys ``<gitlab>-minio-secret``.
  - The service name for your PostgreSQL, ``<gitlab>-postgresql``, and the port. If you installed the GitLab Helm Chart in ``default`` namespace, then the port is ``5432``.
  - (Optional) The service name for MinIO, ``<gitlab>-minio-svc``, and the port. If you installed the GitLab Helm Chart in ``default`` namespace, then the port is ``9000``.
  - The names of ``kubernetes.io/ingress.class``, ``kubernetes.io/ingress.provider``, and ``certmanager.k8s.io/issuer``.
  
To deploy Mattermost Team Edition with GitLab Helm Chart, disable the running ``MySql`` chart and configure ``InitContainer`` and ``Environment variables`` in ``values.yaml``. The list below indicates the values that should be changed. Note that we assume the GitLab chart name is ``gitlab``.

- ``<your-mattermost-domain>``: URL that users will use to access Mattermost, matching the `Site URL field <https://docs.mattermost.com/configure/configuration-settings.html#site-url>`__, e.g. ``mattermost.gitlab.example.com``.
- ``<name-of-your-tls-secret>``: A name to store the TLS certificate for your domains, e.g. ``mattermost-tls``.
- ``<ingress-class>``: The ingress class. In a basic GitLab deployment, this is ``gitlab-nginx``.
- ``<ingress-provider>``: The ingress provider. In a basic GitLab deployment, this is ``nginx``.
- ``<certmanager-issuer>``: The cert manager issuer. In a basic GitLab deployment, this is ``gitlab-issuer``.
- ``<gitlab-ap-secret>``: The Application secret, which you created in step `Create an OAuth application with GitLab`_.
- ``<gitlab-app-id>``: The Application ID, which you created in step `Create an OAuth application with GitLab`_.
- ``<your-gitlab-domain>``: The GitLab domain name, e.g., ``gitlab.example.com``.
- ``<gitlab-postgres.username>``: The GitLab PostgreSQL username. Default is ``gitlab``.
- ``<gitlab-postgres.passwd-secret>``: Secret that holds your PostgreSQL password. Default is ``gitlab-postgresql-password``.
- ``<gitlab-postgres-host>``: Postgres host of your Kubernetes service. Default is ``gitlab-postgresql``.
- ``<gitlab-postgres-port>``: Postgres port of your Kubernetes service. Default is ``5432``.
- ``<mattermost-database-name>``: Mattermost database, e.g., ``mattermost-db``.
- ``<gitlab-minio-host>``: MinIO host of your Kubernetes service. Default is ``gitlab-minio-svc``.
- ``<gitlab-minio-port>``: MinIO port of your Kubernetes service. Default is ``9000``.
- ``<gitlab-minio-secret>``: Secret that holds your MinIO keys. Default is ``gitlab-minio-secret``.
- ``<mattermost-minio-bucket-name>``: Mattermost MinIO bucket name, e.g., ``mattermost-data``.

.. code-block:: sh

  persistence:
    data:
      enabled: false

  # Mattermost configuration:
  configJSON:
    ServiceSettings:
      SiteUrl: "https://<your-mattermost-domain>"
    TeamSettings:
      SiteName: "Mattermost"
    EmailSettings:
      EnableSignUpWithEmail: false

  ingress:
    enabled: true
    path: /
    annotations:
      kubernetes.io/ingress.class:  <ingress-class>
      kubernetes.io/ingress.provider: <ingress-provider>
      certmanager.k8s.io/issuer:  <certmanager-issuer>
    hosts:
      - <your-mattermost-domain>
    tls:
      - secretName: <name-of-your-tls-secret>
        hosts:
          - <your-mattermost-domain>

  auth:
    gitlab:
      Enable: "true"
      Secret: "<gitlab-app-secret>"
      Id: "<gitlab-app-id>"
      Scope: ""
      AuthEndpoint: "https://<your-gitlab-domain>/oauth/authorize"
      TokenEndpoint: "https://<your-gitlab-domain>/oauth/token"
      UserApiEndpoint: "https://<your-gitlab-domain>/api/v4/user"

  externalDB:
    enabled: true
    existingUser: <gitlab-postgres-username>
    existingSecret: "<gitlab-postgres.passwd-secret>"

  mysql:
    enabled: false

  ## Additional env vars
  extraEnvVars:
    - name: POSTGRES_PASSWORD_GITLAB
      valueFrom:
        secretKeyRef:
          name: <gitlab-postgres-passwd-secret>
          key: postgres-password
    - name: POSTGRES_USER_GITLAB
      value: <gitlab-postgres-username>
    - name: POSTGRES_HOST_GITLAB
      value: <gitlab-postgres-host>
    - name: POSTGRES_PORT_GITLAB
      value: "<gitlab-postgres-port>"
    - name: POSTGRES_DB_NAME_MATTERMOST
      value: <mattermost-database-name>
    - name: MM_SQLSETTINGS_DRIVERNAME
      value: "postgres"
    - name: MM_SQLSETTINGS_DATASOURCE
      value: postgres://$(POSTGRES_USER_GITLAB):$(POSTGRES_PASSWORD_GITLAB)@$(POSTGRES_HOST_GITLAB):$(POSTGRES_PORT_GITLAB)/$(POSTGRES_DB_NAME_MATTERMOST)?sslmode=disable&connect_timeout=10
    - name: MINIO_ENDPOINT
      value: <gitlab-minio-host>
    - name: MINIO_PORT
      value: "<gitlab-minio-port>"
    - name: MM_FILESETTINGS_DRIVERNAME
      value: amazons3
    - name: MM_FILESETTINGS_AMAZONS3ENDPOINT
      value: $(MINIO_ENDPOINT):$(MINIO_PORT)
    - name: MM_FILESETTINGS_AMAZONS3ACCESSKEYID
      valueFrom:
        secretKeyRef:
          name: <gitlab-minio-secret>
          key: accesskey
    - name: MM_FILESETTINGS_AMAZONS3SECRETACCESSKEY
      valueFrom:
        secretKeyRef:
          name: <gitlab-minio-secret>
          key: secretkey
    - name: MM_FILESETTINGS_AMAZONS3BUCKET
      value: <mattermost-minio-bucket-name>

  ## Additional init containers
  extraInitContainers: 
    - name: bootstrap-database
      image: "postgres:9.6-alpine"
      imagePullPolicy: IfNotPresent
      env:
        - name: POSTGRES_PASSWORD_GITLAB
          valueFrom:
            secretKeyRef:
              name: <gitlab-postgres.-passwd-secret>
              key: postgres-password
        - name: POSTGRES_USER_GITLAB
          value: <gitlab-postgres-username>
        - name: POSTGRES_HOST_GITLAB
          value:<gitlab-postgres-host>
        - name: POSTGRES_PORT_GITLAB
          value: "<gitlab-postgres-port>"
        - name: POSTGRES_DB_NAME_MATTERMOST
          value: <mattermost-database-name>
      command:
        - sh
        - "-c"
        - |
          if PGPASSWORD=$POSTGRES_PASSWORD_GITLAB psql -h $POSTGRES_HOST_GITLAB -p $POSTGRES_PORT_GITLAB -U $POSTGRES_USER_GITLAB -lqt | cut -d \| -f 1 | grep -qw $POSTGRES_DB_NAME_MATTERMOST; then
          echo "database already exist, exiting initContainer"
          exit 0
          else
          echo "Database does not exist. creating...."
          PGPASSWORD=$POSTGRES_PASSWORD_GITLAB createdb -h $POSTGRES_HOST_GITLAB -p $POSTGRES_PORT_GITLAB -U $POSTGRES_USER_GITLAB $POSTGRES_DB_NAME_MATTERMOST
          echo "Done"
          fi
    - name: create-minio-bucket
      image: "minio/mc:RELEASE.2018-07-13T00-53-22Z"
      env:
        - name: MINIO_ENDPOINT
          value: <gitlab-minio-host>
        - name: MINIO_PORT
          value: "<gitlab-minio-port>"
        - name: MINIO_ACCESS_KEY
          valueFrom:
            secretKeyRef:
              name: <gitlab-minio-secret>
              key: accesskey
        - name: MINIO_SECRET_KEY
          valueFrom:
            secretKeyRef:
              name: <gitlab-minio-secret>
              key: secretkey
        - name: MATTERMOST_BUCKET_NAME
          value: <mattermost-minio-bucket-name>
      command:
        - sh
        - "-c"
        - |
          echo "Connecting to Minio server: http://$MINIO_ENDPOINT:$MINIO_PORT"
          mc config host add myminio http://$MINIO_ENDPOINT:$MINIO_PORT $MINIO_ACCESS_KEY $MINIO_SECRET_KEY
          /usr/bin/mc ls myminio
          echo $?
          /usr/bin/mc ls myminio/$MATTERMOST_BUCKET_NAME > /dev/null 2>&1
          if [ $? -eq 1 ] ; then
            echo "Creating bucket '$MATTERMOST_BUCKET_NAME'"
            /usr/bin/mc mb myminio/$MATTERMOST_BUCKET_NAME
          else
            echo "Bucket '$MATTERMOST_BUCKET_NAME' already exists."
            exit 0
          fi

source/install/installing-mattermost-omnibus.rst METASEP
Install Mattermost Omnibus
==========================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Configure Mattermost Omnibus
-----------------------------

.. note::
  
  Plugin uploads, local mode, and HTTPS are enabled by default. These settings are modified in the ``yaml`` file as described below.

With Mattermost Omnibus, the ``config.json`` file is no longer used as `Omnibus stores the Mattermost configuration in the database <https://docs.mattermost.com/configure/configuation-in-mattermost-database.html>`__. The Omnibus platform itself requires of a configuration of its own, that is stored in ``/etc/mattermost/mmomni.yml``. This file contains the data that Omnibus needs to configure the platform and connect all the services together. So you’ll need to use mmctl to make changes to your Mattermost server configuration using ``mmctl --local config edit``.

For Omnibus to work properly, there are some configuration parameters that are fixed and cannot be changed through the web interface - for example, the port that Mattermost uses to run. Other parameters need to be configured directly in the ``mmomni.yml`` file instead of in the Mattermost web interface or the ``config.json`` file.

The properties that you can configure in this file are:

- ``db_user``: The PostgreSQL database user. This value is generated during the Omnibus installation and should not be changed.
- ``db_password``: The PostgreSQL database password. This value is generated during the Omnibus installation and should not be changed.
- ``fqdn``: The domain name for the Mattermost application. This is the value that is asked during the install process, and it’s used to populate the ``ServiceSettings.SiteURL`` Mattermost configuration property, as well as to retrieve and configure the SSL certificate for the server.
- ``email``: The email address used for certificate communications. This is the value that is asked during the install process, and it will not be used if HTTPS is disabled.
- ``https``: This indicates whether the platform should be configured to use HTTPS or HTTP with values ``true`` or ``false``. The recommended way to install Mattermost is to use HTTPS, but you can disable it if required.
- ``data_directory``: This is the directory where Mattermost stores its data.
- ``enable_plugin_uploads``: This setting can be ``true`` or ``false`` and is used to configure the ``PluginSettings.EnableUploads`` Mattermost configuration property.
- ``enable_local_mode``: This setting can be ``true`` or ``false`` and is used to configure the ``ServiceSettings.EnableLocalMode`` Mattermost configuration property.
- ``nginx_template``: Optional path to a custom NGINX template.

After modifying the ``mmomni.yml`` configuration file, you need to run ``mmomni reconfigure`` for Omnibus to apply the changes and restart Mattermost.

Use a custom NGINX template
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost Omnibus generates an ``nginx`` configuration depending on how the different properties of the ``mmomni.yml`` file are set. However, you may need to customize the configuration further to support other use cases, such as using custom SSL certificates. For those cases, Omnibus supports using a custom ``nginx`` template to generate its configuration. 

To use this feature, you need to copy and modify the original template located at ``/opt/mattermost/mmomni/ansible/playbooks/mattermost.conf`` to a new location. Then, you can either use the variables and internal logic already bundled in the template and modify the parts that you need, or use a fully static configuration instead.

After the template has been customized, add an ``nginx_template`` property to the ``/etc/mattermost/mmomni.yml`` configuration file, and then run ``mmomni reconfigure``. The reconfigure process will use the new template to generate the NGINX final configuration. You can check the contents of the ``/etc/nginx/conf.d/mattermost.conf`` file to validate that the changes were applied successfully.

Please be careful when using this feature, as making changes to the custom template can cause the reconfigure process to fail, or the generated NGINX configuration to be invalid.

This feature is available from Mattermost Omnibus version 5.32.0.

Remove Mattermost Omnibus
---------------------------

If you wish to remove Mattermost and Mattermost Omnibus completely for any reason, you can run this command:

``sudo apt remove --purge mattermost mattermost-omnibus``

Backup and Restore using the Mattermost Omnibus CLI
---------------------------------------------------

Mattermost Omnibus includes a CLI tool: ``mmomni``, which is used to manage configuration.

Server and domain migration as well as backup and restore is now much easier - you can take snapshots of all content in your Mattermost server. This includes all content, users, plugins, configurations, and databases. You can restore on the same server or move to another server at any time.

Backup example:

``mmomni backup -o /tmp/Aug27-2020.tgz``

Restore example:

``mmomni restore /tmp/Aug27-2020.tgz`` and ``mmomni reconfigure``

Future releases may include automation for snapshot management.

Frequently Asked Questions (FAQs)
---------------------------------

What are the ``mmomni`` commands and what do they do?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- ``mmomni backup``: Takes a complete snapshot of your Mattermost server and places the backup file in a specified file location.
- ``mmomni restore``: Restores specified backup file to your Mattermost server.
- ``mmomni reconfigure``: Reruns the process that changes domain, SSL, or any Omnibus-specified restrictions such as the ability to upload plugins. It also applies any changes made to the ``mmomni.yml`` configuration file.
- ``mmomni status``: Shows current status of all Omnibus components.
- ``mmomni tail``: Runs a join tail of logs of all Omnibus components.

Can I install without a domain?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Although the recommended way to install and configure Omnibus is with SSL enabled, if you want to use or test without it, you can run:

``sudo MMO_HTTPS=false apt install mattermost-omnibus``

What happened to ``config.json``?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost Omnibus `stores the configuration of the Mattermost server into the database <https://docs.mattermost.com/configure/configuation-in-mattermost-database.html>`__. You can edit your config by running the following mmctl command after connecting mmctl to the instance: ``mmctl config edit``. If you're logged into the machine as the ``mattermost`` user, you can use ``mmctl --local config edit`` as well.

Are there plans to add other packages to the Omnibus?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Yes! We are planning several packages and currently seeking feedback to help us prioritize these.

Are there plans to support other OS distros?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Yes! We are currently seeking feedback to help us prioritize these.

Can I use MySQL instead of PostgreSQL?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

MySQL is not supported. Omnibus is architected to run with PostgreSQL.

Can I use a license with Omnibus?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Yes. Mattermost Omnibus bundles the free, unlicensed Mattermost Enterprise Edition, and Enterprise features are unlocked when you purchase and upload a license.

Can I use an Omnibus server as part of a cluster?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

No, Omnibus is designed to be a self-contained Mattermost platform, so it expects all the necessary components to be in the same server.

Does the SSL Certificate automatically renew?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Yes. The SSL certificate automatically updated and renewed. Omnibus installs the certbot package to manage the certificate, and it comes with a cron job that you can find at `/etc/cron.d/certbot` that automatically launches the renewal process.

Where can I get help?
~~~~~~~~~~~~~~~~~~~~~

If you have any problems installing Mattermost Omnibus, see the `troubleshooting guide <https://docs.mattermost.com/install/troubleshooting.html>`__ for common error messages, or `join the Mattermost user community for troubleshooting help <https://mattermost.com/pl/default-ask-mattermost-community/>`_.

source/install/install-ubuntu-2004-server.rst METASEP
:nosearch:

.. This page is intentionally not accessible via the LHS navigation pane because it's common content included on other docs pages.

.. _install-ubuntu-2004-server:

Install Ubuntu Server 20.04 LTS
--------------------------------

Install the 64-bit version of Ubuntu Server on each machine that hosts one or more of the components.

1. To install Ubuntu Server 20.04, see the `Ubuntu Installation Guide. <https://help.ubuntu.com/20.04/installation-guide/amd64/index.html>`__

2. After the system is installed, make sure that it's up to date with the most recent security patches. Open a terminal window and issue the following commands:

  ``sudo apt update``

  ``sudo apt upgrade``

Now that the system is up to date, you can start installing the components that make up a Mattermost system.

source/install/install-ubuntu-2004-postgresql.rst METASEP
:nosearch:
.. This page is intentionally not accessible via the LHS navigation pane because it's common content included on other docs pages.

.. _install-ubuntu-1804-postgresql:

Install PostgreSQL Database Server
-----------------------------------

Install and set up the database for use by the Mattermost server. You can install either PostgreSQL or MySQL.

Assume that the IP address of this server is 10.10.10.1.

Install PostgreSQL on Ubuntu Server 20.04
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Log in to the server that will host the database and issue the following command:

  ``sudo apt install postgresql postgresql-contrib``

  When the installation is complete, the PostgreSQL server is running, and a Linux user account called *postgres* has been created.
  
Confirm this version is PostgreSQL version 10 or higher. You can do this by running ``psql -V``. If this isn't version 10 or higher you can reference the PostgreSQL documentation `here <https://www.postgresql.org/download/linux/ubuntu/>`__ to install an updated version of PostgreSQL.

2. Access PostgreSQL with one of the following options:

  - ``sudo --login --user postgres`` then ``psql``
  - ``sudo -u postgres psql``
  
3.  Create the Mattermost database.

  ``postgres=# CREATE DATABASE mattermost;``

4.  Create the Mattermost user *mmuser*.

  ``postgres=# CREATE USER mmuser WITH PASSWORD 'mmuser-password';``

.. note::
  
    Use a password that's more secure than *mmuser-password*.

5.  Grant the user access to the Mattermost database.

  ``postgres=# GRANT ALL PRIVILEGES ON DATABASE mattermost to mmuser;``

6. Exit the PostgreSQL interactive terminal.

  ``postgres=# \q``

7. Log out of the *postgres* account.

  ``exit``

8. (Optional) If you use a different server for your database and the Mattermost server, you may allow PostgreSQL to listen on all assigned IP addresses. To do so, open ``/etc/postgresql/{version}/main/postgresql.conf`` in a text editor as *root* user. Replace ``{version}`` with the version of PostgreSQL that's currently running. As a best practice, ensure that only the Mattermost server is able to connect to the PostgreSQL port using a firewall.

  a. Find the following line:

    ``#listen_addresses = 'localhost'``

  b. Uncomment the line and change ``localhost`` to ``*``:

    ``listen_addresses = '*'``

  c. Restart PostgreSQL for the change to take effect:

    ``sudo systemctl restart postgresql``

9. Modify the file ``pg_hba.conf`` to allow the Mattermost server to communicate with the database.

  **If the Mattermost server and the database are on the same machine:**

    a. Open ``/etc/postgresql/{version}/main/pg_hba.conf`` as *root* in a text editor.

    b. Find the following lines:

      ``local   all             all                        peer``
      
      ``host    all             all         ::1/128        ident``

    c. Change ``peer`` and ``ident`` to ``trust``:

      ``local   all             all                        trust``
      
      ``host    all             all         ::1/128        trust``

  **If the Mattermost server and the database are on different machines:**

    a. Open ``/etc/postgresql/{version}/main/pg_hba.conf`` in a text editor as *root* user.

    b. Add the following line to the end of the file, where ``{mattermost-server-IP}`` is the IP address of the Mattermost server.

      ``host all all {mattermost-server-IP}/32 md5``

10. Reload PostgreSQL:

  ``sudo systemctl reload postgresql``

11. Verify that you can connect with the user *mmuser*.

  - If the Mattermost server and the database are on the same machine, use the following command:

    ``psql --dbname=mattermost --username=mmuser --password``

  - If the Mattermost server is on a different machine, log into that machine and use the following command:

    ``psql --host={postgres-server-IP} --dbname=mattermost --username=mmuser --password``

.. note::

  You might have to install the PostgreSQL client software to use the command.

The PostgreSQL interactive terminal starts. To exit the PostgreSQL interactive terminal, type ``\q`` and press :kbd:`Enter` on Windows or Linux, or :kbd:`↵` on Mac.

With the database installed and the initial setup complete, you can now install the Mattermost server.

source/install/install-ubuntu-2004-mysql.rst METASEP
:nosearch:
.. This page is intentionally not accessible via the LHS navigation pane because it's common content included on other docs pages.

.. _install-ubuntu-2004-mysql:

Install MySQL database server
------------------------------

Install and set up the database for use by the Mattermost server. You can install either MySQL or PostgreSQL.

Install MySQL on Ubuntu Server 20.04
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Log into the server that will host the database, and open a terminal window.

2. Install MySQL.

  ``sudo apt install mysql-server``

3. Run ``sudo mysql_secure_installation`` and follow the instructions.

4. Log in to MySQL as *root*.

  ``sudo mysql``

5. Create the Mattermost user *mmuser*.

  ``mysql> create user 'mmuser'@'%' identified by 'mmuser-password';``

  .. note::
    1. Use a password that is more secure than 'mmuser-password'.
    2. The '%' means that mmuser can connect from any machine on the network. However, it's more secure to use the IP address of the machine that hosts Mattermost. For example, if you install Mattermost on the machine with IP address 10.10.10.2, then use the following command: ``mysql> create user 'mmuser'@'10.10.10.2' identified by 'mmuser-password';``

6. Create the Mattermost database.

  ``mysql> create database mattermost;``

7. Grant access privileges to the user *mmuser*.

  ``mysql> grant all privileges on mattermost.* to 'mmuser'@'%';``

  .. note::
    This query grants the MySQL user we just created all privileges on the database for convenience. If you need more security you can use this query to grant the user only the privileges necessary to run Mattermost.

    ``mysql> GRANT ALTER, CREATE, DELETE, DROP, INDEX, INSERT, SELECT, UPDATE, REFERENCES ON mattermost.* TO 'mmuser'@'%';``

8. Log out of MySQL.

   ``mysql> exit``

With the database installed and the initial setup complete, you can now install the Mattermost server.

source/install/install-ubuntu-2004-mattermost.rst METASEP
:nosearch:
.. This page is intentionally not accessible via the LHS navigation pane because it's common content included on other docs pages.

Install Mattermost server
--------------------------

Install Mattermost Server on a 64-bit machine. Assume that the IP address of this server is 10.10.10.2.

1. Log in to the server that will host Mattermost Server and open a terminal window.

2. Download `the latest version of the Mattermost Server <https://mattermost.com/deploy/>`__. In the following command, replace ``X.X.X`` with the version that you want to download: ``wget https://releases.mattermost.com/X.X.X/mattermost-X.X.X-linux-amd64.tar.gz``.

3. Extract the Mattermost Server files by running ``tar -xvzf mattermost*.gz``.

4. Move the extracted file to the ``/opt`` directory by running ``sudo mv mattermost /opt``.

5. Create the storage directory for files by running ``sudo mkdir /opt/mattermost/data``.

  .. note::

    The storage directory will contain all the files and images that your users post to Mattermost, so you need to make sure that the drive is large enough to hold the anticipated number of uploaded files and images.

6. Set up a system user and group called ``mattermost`` that will run this service, and set the ownership and permissions.
  
  a. Create the Mattermost user and group: ``sudo useradd --system --user-group mattermost``.
  
  b. Set the user and group *mattermost* as the owner of the Mattermost files: ``sudo chown -R mattermost:mattermost /opt/mattermost``.
  
  c. Give write permissions to the *mattermost* group: ``sudo chmod -R g+w /opt/mattermost``.
   
7. Set up the database driver in the file ``/opt/mattermost/config/config.json``. Open the file in a text editor and make the following changes:
  
   **If you are using PostgreSQL:**
 
    a.  Set ``"DriverName"`` to ``"postgres"``
    b.  Set ``"DataSource"`` to the following value, replacing ``<mmuser-password>``  and ``<host-name-or-IP>`` with the appropriate values:

     ``"postgres://mmuser:<mmuser-password>@<host-name-or-IP>:5432/mattermost?sslmode=disable&connect_timeout=10"``.
 
   **If you are using MySQL:**
 
    a.  Set ``"DriverName"`` to ``"mysql"``
    b.  Set ``"DataSource"`` to the following value, replacing ``<mmuser-password>``  and ``<host-name-or-IP>`` with the appropriate values. Also make sure that the database name is ``mattermost`` instead of ``mattermost_test``:

      ``"mmuser:<mmuser-password>@tcp(<host-name-or-IP>:3306)/mattermost?charset=utf8mb4,utf8&writeTimeout=30s"``

8. Set ``"SiteURL"`` to the full base URL of the site (e.g., ``"https://mattermost.example.com"``).

9. Test the Mattermost server to make sure everything works.

  a. Change to the ``mattermost`` directory: ``cd /opt/mattermost``.
      
  b. Start the Mattermost server as the user mattermost: ``sudo -u mattermost ./bin/mattermost``.
  
  When the server starts, it shows some log information and the text ``Server is listening on :8065``. You can stop the server by pressing pressing :kbd:`Ctrl` :kbd:`C` on Windows or Linux, or :kbd:`⌘` :kbd:`C` on Mac, in the terminal window.

10. Set up Mattermost to use *systemd* for starting and stopping.

 a. Create a *systemd* unit file: ``sudo touch /lib/systemd/system/mattermost.service``.
  
 b. Open the unit file as root in a text editor, and copy the following lines into the file:
  
  .. code-block:: none
  
    [Unit]
    Description=Mattermost
    After=network.target
    After=postgresql.service
    BindsTo=postgresql.service

    [Service]
    Type=notify
    ExecStart=/opt/mattermost/bin/mattermost
    TimeoutStartSec=3600
    KillMode=mixed
    Restart=always
    RestartSec=10
    WorkingDirectory=/opt/mattermost
    User=mattermost
    Group=mattermost
    LimitNOFILE=49152
  
    [Install]
      WantedBy=postgresql.service

  .. note::

    - If you are using MySQL, replace ``postgresql.service`` with ``mysql.service`` in two places in the ``[Unit]`` section and one place in the ``[Install]`` section.
    - If you have installed MySQL or PostgreSQL on a dedicated server, then you need to complete the following, otherwise the Mattermost service won't start:
  
      - Remove ``After=postgresql.service`` and ``BindsTo=postgresql.service`` or ``After=mysql.service`` and ``BindsTo=mysql.service`` lines in the ``[Unit]`` section.
      - Replace the ``WantedBy=postgresql.service`` or ``WantedBy=mysql.service`` line in the ``[Install]`` section with ``WantedBy=multi-user.target``.

    - Setting ``WantedBy`` to your local database service ensures that whenever the database service is started, the Mattermost server starts too. This prevents the Mattermost server from stopping to work after an automatic update of the database.

c. Make systemd load the new unit by running ``sudo systemctl daemon-reload``.
  
d. Check to make sure that the unit was loaded by running ``sudo systemctl status mattermost.service``. You should see an output similar to the following:

  .. code-block:: none

    ● mattermost.service - Mattermost
    Loaded: loaded (/lib/systemd/system/mattermost.service; disabled; vendor preset: enabled)
    Active: inactive (dead)
 
e. Start the service by running ``sudo systemctl start mattermost.service``.
  
f. Verify that Mattermost is running: ``curl http://localhost:8065``. You should see the HTML that's returned by the Mattermost server.
  
g. Set Mattermost to start on machine start up by running ``sudo systemctl enable mattermost.service``.

Now that the Mattermost server is up and running, you can do some initial configuration and setup.

source/install/install-ubuntu-1804-server.rst METASEP
:nosearch:
.. _install-ubuntu-1804-server:

Install Ubuntu Server 18.04 LTS
--------------------------------

Install the 64-bit version of Ubuntu Server on each machine that hosts one or more of the components.

Install Ubuntu Server 18.04
~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. To install Ubuntu Server 18.04, see the `Ubuntu Installation Guide. <https://help.ubuntu.com/18.04/installation-guide/amd64/index.html>`__

2. After the system is installed, make sure that it's up to date with the most recent security patches. Open a terminal window and issue the following commands:

  ``sudo apt update``

  ``sudo apt upgrade``

Now that the system is up to date, you can start installing the components that make up a Mattermost system.

To uninstall For Ubuntu 18.04
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Stop the service: ``sudo service mattermost stop``
2. Disable the service: ``sudo systemctl disable mattermost``
3. Remove the service file: ``sudo rm /lib/systemd/system/mattermost.service``
4. Reload systemctl: ``systemctl daemon-reload``

.. warning:: 

  The following commands are permanent and irreversible:
  
  - *Permanently* remove the Mattermost directory: ``sudo rm -rf /opt/mattermost``
  - *Permanently* delete the database: ``DROP DATABASE mattermost;``
source/install/install-ubuntu-1804-postgresql.rst METASEP
:nosearch:
.. _install-ubuntu-1804-postgresql:

Install PostgreSQL database server
----------------------------------

Install and set up the database for use by the Mattermost server. You can install either PostgreSQL or MySQL.

Assume that the IP address of this server is 10.10.10.1.

Install PostgreSQL on Ubuntu Server 18.04
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Log in to the server that will host the database and issue the following command:

  ``sudo apt install postgresql postgresql-contrib``

When the installation is complete, the PostgreSQL server is running, and a Linux user account called *postgres* has been created.
Confirm this version is PostgreSQL version 10 or higher. You can do this by running ``psql -V``. If this isn't version 10 or higher you can reference the PostgreSQL documentation `here <https://www.postgresql.org/download/linux/ubuntu/>`__ to install an updated version of PostgreSQL.

2. Log in to the *postgres* account.

  ``sudo --login --user postgres``

3. Start the PostgreSQL interactive terminal.

  ``psql``

4.  Create the Mattermost database.

  ``postgres=# CREATE DATABASE mattermost;``

5.  Create the Mattermost user *mmuser*.

  ``postgres=# CREATE USER mmuser WITH PASSWORD 'mmuser-password';``

.. note::
   
   Use a password that's more secure than *mmuser-password*.

6.  Grant the user access to the Mattermost database.

  ``postgres=# GRANT ALL PRIVILEGES ON DATABASE mattermost to mmuser;``

7. Exit the PostgreSQL interactive terminal.

  ``postgres=# \q``

8. Log out of the *postgres* account.

  ``exit``

9. (Optional) If you use a different server for your database and the Mattermost app server, you may allow PostgreSQL to listen on all assigned IP addresses. To do so, open ``/etc/postgresql/{version}/main/postgresql.conf`` in a text editor as *root* user. Replace ``{version}`` with the version of PostgreSQL that's currently running. As a best practice, ensure that only the Mattermost server is able to connect to the PostgreSQL port using a firewall.

  a. Find the following line:

    ``#listen_addresses = 'localhost'``

  b. Uncomment the line and change ``localhost`` to ``*``:

    ``listen_addresses = '*'``

  c. Restart PostgreSQL for the change to take effect:

    ``sudo systemctl restart postgresql``

10. Modify the file ``pg_hba.conf`` to allow the Mattermost server to communicate with the database.

  **If the Mattermost server and the database are on the same machine:**

    a. Open ``/etc/postgresql/{version}/main/pg_hba.conf`` in a text editor as *root* user.

    b. Find the following lines:

      ``local   all             all                        peer``
      
      ``host    all             all         ::1/128        ident``

    c. Change ``peer`` and ``ident`` to ``trust``:

      ``local   all             all                        trust``
      
      ``host    all             all         ::1/128        trust``

  **If the Mattermost server and the database are on different machines:**

    a. Open ``/etc/postgresql/{version}/main/pg_hba.conf`` in a text editor as *root* user.

    b. Add the following line to the end of the file, where ``{mattermost-server-IP}`` is the IP address of the machine that contains the Mattermost server.

      ``host all all {mattermost-server-IP}/32 md5``

11. Reload PostgreSQL:

  ``sudo systemctl reload postgresql``

12. Verify that you can connect with the user *mmuser*.

  a. If the Mattermost server and the database are on the same machine, use the following command:

    ``psql --dbname=mattermost --username=mmuser --password``

  b. If the Mattermost server is on a different machine, log into that machine and use the following command:

    ``psql --host={postgres-server-IP} --dbname=mattermost --username=mmuser --password``

.. note::

  You might have to install the PostgreSQL client software to use the command.

The PostgreSQL interactive terminal starts. To exit the PostgreSQL interactive terminal, type ``\q`` and press :kbd:`Enter` on Windows or Linux, or :kbd:`↵` on Mac.

With the database installed and the initial setup complete, you can now install the Mattermost server.

source/install/install-ubuntu-1804-mysql.rst METASEP
:nosearch:
.. _install-ubuntu-1804-mysql:

Install MySQL database server
------------------------------

Install and set up the database for use by the Mattermost server. You can install either MySQL or PostgreSQL.

Install MySQL on Ubuntu Server 18.04
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Log into the server that will host the database, and open a terminal window.

2. Install MySQL.

  ``sudo apt install mysql-server``

3. Run ``mysql_secure_installation`` and follow the instructions.

  ``sudo mysql_secure_installation``

4. Log in to MySQL as root.

  ``sudo mysql``

5. Create the Mattermost user 'mmuser'.

  ``mysql> create user 'mmuser'@'%' identified by 'mmuser-password';``

  .. note::
    1. Use a password that is more secure than 'mmuser-password'.
    2. The '%' means that mmuser can connect from any machine on the network. However, it's more secure to use the IP address of the machine that hosts Mattermost. For example, if you install Mattermost on the machine with IP address 10.10.10.2, then use the following command: ``mysql> create user 'mmuser'@'10.10.10.2' identified by 'mmuser-password';``

6. Create the Mattermost database.

  ``mysql> create database mattermost;``

7. Grant access privileges to the user 'mmuser'.

  ``mysql> grant all privileges on mattermost.* to 'mmuser'@'%';``

  .. note::
    This query grants the MySQL user we just created all privileges on the database for convenience. If you need more security you can use this query to grant the user only the privileges necessary to run Mattermost.

    ``mysql> GRANT ALTER, CREATE, DELETE, DROP, INDEX, INSERT, SELECT, UPDATE, REFERENCES ON mattermost.* TO 'mmuser'@'%';``

8. Log out of MySQL.

   ``mysql> exit``

   .. note::
    If you have installed MySQL on its own server, you need to edit the ``/etc/mysql/mysql.conf.d/mysqld.cnf`` file and comment out the ``bind-address = 127.0.0.1`` using the ``#`` symbol, then restart your sql server.

With the database installed and the initial setup complete, you can now install the Mattermost server.

source/install/install-ubuntu-1804-mattermost.rst METASEP
:nosearch:
Install Mattermost Server
--------------------------

Install Mattermost Server on a 64-bit machine.

Assume that the IP address of this server is 10.10.10.2.

Install Mattermost Server on Ubuntu
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Log in to the server that will host Mattermost Server and open a terminal window.
   
2. Download `the latest version of the Mattermost Server <https://mattermost.com/deploy/>`__. In the following command, replace ``X.X.X`` with the version that you want to download:
  
  ``wget https://releases.mattermost.com/X.X.X/mattermost-X.X.X-linux-amd64.tar.gz``

3. Extract the Mattermost Server files.
   
  ``tar -xvzf mattermost*.gz``

4. Move the extracted file to the ``/opt`` directory.
   
  ``sudo mv mattermost /opt``

5. Create the storage directory for files.
   
  ``sudo mkdir /opt/mattermost/data``

  .. note::

    The storage directory will contain all the files and images that your users post to Mattermost, so you need to make sure that the drive is large enough to hold the anticipated number of uploaded files and images.

6. Set up a system user and group called ``mattermost`` that will run this service, and set the ownership and permissions.
   
  a. Create the Mattermost user and group:

    ``sudo useradd --system --user-group mattermost``

  b. Set the user and group *mattermost* as the owner of the Mattermost files:

    ``sudo chown -R mattermost:mattermost /opt/mattermost``

  c. Give write permissions to the *mattermost* group:

    ``sudo chmod -R g+w /opt/mattermost``

7. Set up the database driver in the file ``/opt/mattermost/config/config.json``. Open the file in a text editor and make the following changes:
   
  -  If you are using PostgreSQL:

    a.  Set ``"DriverName"`` to ``"postgres"``
    b.  Set ``"DataSource"`` to the following value, replacing ``<mmuser-password>``  and ``<host-name-or-IP>`` with the appropriate values:

     ``"postgres://mmuser:<mmuser-password>@<host-name-or-IP>:5432/mattermost?sslmode=disable&connect_timeout=10"``.

  -  If you are using MySQL:

    a.  Set ``"DriverName"`` to ``"mysql"``
    b.  Set ``"DataSource"`` to the following value, replacing ``<mmuser-password>``  and ``<host-name-or-IP>`` with the appropriate values. Also make sure that the database name is ``mattermost`` instead of ``mattermost_test``:

      ``"mmuser:<mmuser-password>@tcp(<host-name-or-IP>:3306)/mattermost?charset=utf8mb4,utf8&writeTimeout=30s"``

8. Also set ``"SiteURL"`` to the full base URL of the site (e.g. ``"https://mattermost.example.com"``).
   
9.  Test the Mattermost server to make sure everything works.
    
    a. Change to the ``mattermost`` directory:

      ``cd /opt/mattermost``

    b. Start the Mattermost server as the user mattermost:

      ``sudo -u mattermost ./bin/mattermost``

  When the server starts, it shows some log information and the text ``Server is listening on :8065``. You can stop the server by pressing pressing :kbd:`Ctrl` :kbd:`C` on Windows or Linux, or :kbd:`⌘` :kbd:`C` on Mac, while in the terminal window.

10. Setup Mattermost to use *systemd* for starting and stopping.
    
  a. Create a *systemd* unit file:

    ``sudo touch /lib/systemd/system/mattermost.service``

  b. Open the unit file as root in a text editor, and copy the following lines into the file:

  .. code-block:: none

    [Unit]
    Description=Mattermost
    After=network.target
    After=postgresql.service
    BindsTo=postgresql.service

    [Service]
    Type=notify
    ExecStart=/opt/mattermost/bin/mattermost
    TimeoutStartSec=3600
    KillMode=mixed
    Restart=always
    RestartSec=10
    WorkingDirectory=/opt/mattermost
    User=mattermost
    Group=mattermost
    LimitNOFILE=49152

    [Install]
    WantedBy=postgresql.service

  .. note::

    If you are using MySQL, replace ``postgresql.service`` with ``mysql.service`` in 2 places in the ``[Unit]`` section and 1 place in the ``[Install]`` section.

  .. note::

    If you have installed MySQL or PostgreSQL on a dedicated server, then you need to

      - Remove ``After=postgresql.service`` and ``BindsTo=postgresql.service`` or ``After=mysql.service`` and ``BindsTo=mysql.service`` lines in the ``[Unit]`` section, and
      - Replace the ``WantedBy=postgresql.service`` or ``WantedBy=mysql.service`` line in the ``[Install]`` section with ``WantedBy=multi-user.target``
  
    or the Mattermost service will not start.

  .. note::

    Setting ``WantedBy`` to your local database service ensures that whenever the database service is started, the Mattermost server starts too. This prevents the Mattermost server from stopping to work after an automatic update of the database.

  c. Make systemd load the new unit.

    ``sudo systemctl daemon-reload``

  d. Check to make sure that the unit was loaded.

    ``sudo systemctl status mattermost.service``

    You should see an output similar to the following:

    .. code-block:: none

      ● mattermost.service - Mattermost
        Loaded: loaded (/lib/systemd/system/mattermost.service; disabled; vendor preset: enabled)
        Active: inactive (dead)

  e. Start the service.

    ``sudo systemctl start mattermost.service``

  f. Verify that Mattermost is running.

    ``curl http://localhost:8065``

    You should see the HTML that's returned by the Mattermost server.

  g. Set Mattermost to start on machine start up.

    ``sudo systemctl enable mattermost.service``
    
Now that the Mattermost server is up and running, you can do some initial configuration and setup.

source/install/install-tar.rst METASEP
:nosearch:
.. This page is intentionally not accessible via the LHS navigation pane because it's common content included on other docs pages.

Install Mattermost server from a tarball
----------------------------------------

.. include:: common-prod-deploy-tar.rst
    :start-after: :nosearch:
source/install/install-rhel-nginx.rst METASEP
:nosearch:

.. This page is intentionally not accessible via the LHS navigation pane because it's common content included on other docs pages.

.. _install-rhel-nginx:

Install NGINX server
---------------------

In a production setting, use a proxy server for greater security and performance of Mattermost:

  -  SSL termination
  -  HTTP to HTTPS redirect
  -  Port mapping ``:80`` to ``:8065``
  -  Standard request logs

1. Log in to the server that will host the proxy, and open a terminal window.

2. Create the file ``/etc/yum.repos.d/nginx.repo`` by running ``sudo touch /etc/yum.repos.d/nginx.repo``.

  If you are on RHEL 8 you can skip to **Step 4. Install NGINX**.

3. Open the file as *root* in a text editor and add the following contents, where *{version}* is **7** for RHEL 7:

  .. code-block:: none
  
    [nginx]
    name=nginx repo
    baseurl=https://nginx.org/packages/rhel/{version}/$basearch/
    gpgcheck=0
    enabled=1

4. Install NGINX by running ``sudo yum install nginx.x86_64``.

5. After the installation is complete, start NGINX by running ``sudo systemctl start nginx``.
    On RHEL 6:
  
6. **Optional** Set NGINX to start at system boot by running ``sudo systemctl enable nginx``.

7. Verify that NGINX is running by running ``curl http://localhost``.
  
  If NGINX is running, you see the following output:
  
  .. code-block:: html
  
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    .
    .
    .
    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html>

**What to do next**

1. Map a fully qualified domain name (FQDN) such as ``mattermost.example.com`` to point to the NGINX server.
2. Configure NGINX to proxy connections from the Internet to the Mattermost Server.

source/install/install-rhel-8.rst METASEP
.. _install-rhel-8:

Install Mattermost on RHEL 8
=============================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

You can also use these instructions to install Mattermost on CentOS 8 or Oracle Linux 8. With the exception of the operating system that you install, the process is identical.

.. include:: install-common-intro.rst
    :start-after: :nosearch:

.. contents:: Install and configure the components in the following order.
  :depth: 2

.. include:: install-rhel-8-server.rst
    :start-after: :nosearch:

Install a database
------------------

.. note:: 
  
  You only need one database: either MySQL or PostgreSQL. See the `database software <https://docs.mattermost.com/install/software-hardware-requirements.html#database-software>`__ documentation for details on database version support.

.. tabs::

  .. tab:: Install MySQL

    Install and set up a MySQL database for use by the Mattermost server.

    1. Log in to the server that will host the database, and open a terminal window.

    2. Install MySQL.

    3. Download and install the latest release package.

    4. Disable the system MySQL by running ``sudo yum module disable mysql``, and install MySQL by running ``sudo yum install mysql-community-server``.

    5. Start the MySQL server by running ``sudo systemctl start mysqld.service``.
  
        .. note::
   
            The first time that you start MySQL:
        
            - The superuser account ``'root'@'localhost'`` is created with a password. Get this password by running ``sudo grep 'temporary password' /var/log/mysqld.log``. 
            - The ``validate_password`` plugin is installed. The plugin forces passwords to contain at least one upper case letter, one lower case letter, one digit, and one special character, and that the total password length is at least eight characters.

    6. Change the root password. 

    7. Set MySQL to start automatically when the machine starts by running ``sudo systemctl enable mysqld``.

    8. Create the Mattermost user *mmuser* by running ``mysql> create user 'mmuser'@'%' identified by 'mmuser-password';``.

        .. note::
        
            - Use a password that's more secure than ``mmuser-password``.
            - The ``%`` means that mmuser can connect from any machine on the network. However, it's more secure to use the IP address of the machine that hosts Mattermost. For example, if you install Mattermost on the machine with IP address ``10.10.10.2``, then use the following command: ``mysql> create user 'mmuser'@'10.10.10.2' identified by 'mmuser-password';``.

    9. Create the Mattermost database by running ``mysql> create database mattermost;``.

    10. Grant access privileges to the user mmuser by running ``mysql> grant all privileges on mattermost.* to 'mmuser'@'%';``.
  
        .. note::
    
            This query grants the MySQL user all privileges on the database for convenience. If you need more security, you can use the following query to grant the user only the privileges necessary to run Mattermost: ``mysql> GRANT ALTER, CREATE, DELETE, DROP, INDEX, INSERT, SELECT, UPDATE, REFERENCES ON mattermost.* TO 'mmuser'@'%';``.
    
    11. Log out of MySQL by running ``mysql> exit``.

    With the database installed and the initial setup complete, you can now install the Mattermost server.

  .. tab:: Install PostgreSQL

    Install and set up a PostgreSQL database for use by the Mattermost server. 

    1. Log in to the server that will host the database, and open a terminal window.

    2. Install PostgreSQL. See the `PostgreSQL <https://www.postgresql.org/download/linux/redhat/>`__ documentation for details. 

    3. Initialize the database by running ``sudo postgresql-setup initdb``.

    4. Set PostgreSQL to start on boot by running ``sudo systemctl enable postgresql``.

    5. Start the PostgreSQL server by running ``sudo systemctl start postgresql``.

    6. Switch to the *postgres* Linux user account that was created during the installation by running ``sudo -iu postgres``.

    7. Start the PostgreSQL interactive terminal by running ``psql``.

    8.  Create the Mattermost database by running ``postgres=# CREATE DATABASE mattermost WITH ENCODING 'UTF8' LC_COLLATE='en_US.UTF-8' LC_CTYPE='en_US.UTF-8' TEMPLATE=template0;``.

    9.  Create the Mattermost user *mmuser* by running ``postgres=# CREATE USER mmuser WITH PASSWORD 'mmuser-password';``.

        .. note::
    
            Use a password that is more secure than ``mmuser-password``.

    10.  Grant the user access to the Mattermost database by running ``postgres=# GRANT ALL PRIVILEGES ON DATABASE mattermost to mmuser;``.

    11. Exit the PostgreSQL interactive terminal by running ``postgres=# \q``.

    12. Log out of the *postgres* account by running ``exit``.

    13. (Optional) If you use separate servers for your database and the Mattermost app server, you may allow PostgreSQL to listen on all assigned IP Addresses. To do so, open ``/etc/postgresql/{version}/main/postgresql.conf`` as *root* in a text editor, and replacing ``{version}`` with the version of PostgreSQL that's currently running. As a best practice, ensure that only the Mattermost server is able to connect to the PostgreSQL port using a firewall.

        a. Open ``/var/lib/pgsql/data/postgresql.conf`` as root in a text editor.

        b. Find the following line: ``#listen_addresses = 'localhost'``.

        c. Uncomment the line and change ``localhost`` to ``*``: ``listen_addresses = '*'``.

        d. Restart PostgreSQL for the change to take effect: ``sudo systemctl restart postgresql``.

    14. Modify the file ``pg_hba.conf`` to allow the Mattermost server to communicate with the database.

        **If the Mattermost server and the database are on the same machine:**

            a. Open ``/var/lib/pgsql/data/pg_hba.conf`` as root in a text editor.

            b. Find the following lines:

             ``local   all             all                        peer``
      
             ``host    all             all         ::1/128        ident``

            c. Change ``peer`` and ``ident`` to ``trust``:

             ``local   all             all                        trust``
      
             ``host    all             all         ::1/128        trust``

        **If the Mattermost server and the database are on different machines:**

            a. Open ``/var/lib/pgsql/data/pg_hba.conf`` as *root* in a text editor.

            b. Add the following line to the end of the file, where *{mattermost-server-IP}* is the IP address of the machine that contains the Mattermost server: ``host all all {mattermost-server-IP}/32 md5``.

    15. Reload PostgreSQL by running ``sudo systemctl reload postgresql``.

    16. Verify that you can connect with the user *mmuser*.

        a. If the Mattermost server and the database are on the same machine, use the following command: ``psql --dbname=mattermost --username=mmuser --password``.

        b. If the Mattermost server is on a different machine, log into that machine and use the following command: ``psql --host={postgres-server-IP} --dbname=mattermost --username=mmuser --password``.

        .. note::
      
            You might have to install the PostgreSQL client software to use the command.

    The PostgreSQL interactive terminal starts. To exit the PostgreSQL interactive terminal, type ``\q`` and press **Enter**.

    With the database installed and the initial setup complete, you can now install the Mattermost server.

.. include:: install-rhel-8-mattermost.rst
    :start-after: :nosearch:

.. include:: config-mattermost-server.rst
    :start-after: :nosearch:

.. include:: config-tls-mattermost.rst
    :start-after: :nosearch:

.. include:: install-rhel-nginx.rst
    :start-after: :nosearch:

.. include:: config-proxy-nginx.rst
    :start-after: :nosearch:

.. include:: config-ssl-http2-nginx.rst
    :start-after: :nosearch:
source/install/install-rhel-8-server.rst METASEP
:nosearch:
.. This page is intentionally not accessible via the LHS navigation pane because it's common content included on other docs pages.

..  _install-rhel-8-server:

Install Red Hat Enterprise Linux 8
-----------------------------------

Install the 64-bit version of RHEL 8 on each machine that hosts one or more of the components.

**To install RHEL 8 Server:**

1. To install RHEL 8, see the `RedHat Installation Instructions <https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/performing_a_standard_rhel_installation/index>`__.

2. After the system is installed, make sure that it's up to date with the most recent security patches. Open a terminal window and issue the following commands:

  ``sudo yum update``
  
  ``sudo yum upgrade``

Now that the system is up to date, you can start installing the components that make up a Mattermost system.

.. note:: 

  Ensure that the ``mailcap`` package is installed as it includes the ``mime.types`` file which is needed for the Mobile App to work correctly.

source/install/install-rhel-8-postgresql.rst METASEP
:nosearch:
.. This page is intentionally not accessible via the LHS navigation pane because it's common content included on other docs pages.

..  _install-rhel-8-postgresql:

Installing PostgreSQL database
------------------------------

1. Log in to the server that will host the database, and open a terminal window.


2. Install PostgreSQL.

  ``sudo yum install postgresql-server postgresql-contrib``
  
Confirm this version is PostgreSQL version 10 or higher. You can do this by running ``psql -V``. If this isn't version 10 or higher you can reference the PostgreSQL documentation [here](https://www.postgresql.org/download/linux/redhat/) to install an updated version of PostgreSQL.

3. Initialize the database.

  ``sudo postgresql-setup initdb``

4. Set PostgreSQL to start on boot.

  ``sudo systemctl enable postgresql``

5. Start the PostgreSQL server.

  ``sudo systemctl start postgresql``

6. Switch to the *postgres* Linux user account that was created during the installation.

  ``sudo -iu postgres``

7. Start the PostgreSQL interactive terminal.

  ``psql``

8.  Create the Mattermost database.

  ``postgres=# CREATE DATABASE mattermost WITH ENCODING 'UTF8' LC_COLLATE='en_US.UTF-8' LC_CTYPE='en_US.UTF-8' TEMPLATE=template0;``

9.  Create the Mattermost user *mmuser*.

  ``postgres=# CREATE USER mmuser WITH PASSWORD 'mmuser-password';``

  .. note::
    Use a password that is more secure than 'mmuser-password'.

10.  Grant the user access to the Mattermost database.

  ``postgres=# GRANT ALL PRIVILEGES ON DATABASE mattermost to mmuser;``

11. Exit the PostgreSQL interactive terminal.

  ``postgres=# \q``

12. Log out of the *postgres* account.

  ``exit``

13. (Optional) If you use a different server for your database and the Mattermost app server, you may allow PostgreSQL to listen on all assigned IP Addresses. To do so, open ``/etc/postgresql/main/postgresql.conf`` as *root* in a text editor. As a best practice, ensure that only the Mattermost server is able to connect to the PostgreSQL port using a firewall.

  a. Open ``/var/lib/pgsql/data/postgresql.conf`` as root in a text editor.

  b. Find the following line:

    ``#listen_addresses = 'localhost'``

  c. Uncomment the line and change ``localhost`` to ``*``:

    ``listen_addresses = '*'``

  d. Restart PostgreSQL for the change to take effect:

    ``sudo systemctl restart postgresql``

14. Modify the file ``pg_hba.conf`` to allow the Mattermost server to communicate with the database.

  **If the Mattermost server and the database are on the same machine:**

    a. Open ``/var/lib/pgsql/data/pg_hba.conf`` as root in a text editor.

    b. Find the following lines:

      ``local   all             all                        peer``
      
      ``host    all             all         ::1/128        ident``

    c. Change ``peer`` and ``ident`` to ``trust``:

      ``local   all             all                        trust``
      
      ``host    all             all         ::1/128        trust``

  **If the Mattermost server and the database are on different machines:**

    a. Open ``/var/lib/pgsql/data/pg_hba.conf`` as *root* in a text editor.

    b. Add the following line to the end of the file, where *{mattermost-server-IP}* is the IP address of the machine that contains the Mattermost server.

      ``host all all {mattermost-server-IP}/32 md5``

15. Reload PostgreSQL:

  ``sudo systemctl reload postgresql``

16. Verify that you can connect with the user *mmuser*.

  a. If the Mattermost server and the database are on the same machine, use the following command:

    ``psql --dbname=mattermost --username=mmuser --password``

  b. If the Mattermost server is on a different machine, log into that machine and use the following command:

    ``psql --host={postgres-server-IP} --dbname=mattermost --username=mmuser --password``

    .. note::
      You might have to install the PostgreSQL client software to use the command.

  The PostgreSQL interactive terminal starts. To exit the PostgreSQL interactive terminal, type ``\q`` and press **Enter**.

With the database installed and the initial setup complete, you can now install the Mattermost server.

source/install/install-rhel-8-mysql.rst METASEP
:nosearch:
.. This page is intentionally not accessible via the LHS navigation pane because it's common content included on other docs pages.

..  _install-rhel-8-mysql:

Installing MySQL database server
--------------------------------

Install and set up the database for use by the Mattermost server. You can install either MySQL or PostgreSQL.

**To install MySQL on RHEL 8**

1. Log in to the server that will host the database, and open a terminal window.

2. Install MySQL.

.. note::
 
  If you have additional questions about the process reference the MySQL docs `here <https://dev.mysql.com/doc/mysql-repo-excerpt/5.6/en/linux-installation-yum-repo.html>`_ that matches your system. If your RHEL is a fresh install, you'll need to add the `MySQL Yum repository <https://dev.mysql.com/doc/mysql-repo-excerpt/5.6/en/linux-installation-yum-repo.html>`_. You can also use the MySQL repo - https://repo.mysql.com/.

3. Download the latest release package using wget:

  ``wget https://dev.mysql.com/get/mysql80-community-release-el8-1.noarch.rpm``
        
4. Once downloaded, install it: ``sudo yum localinstall platform-and-version-specific-package-name.rpm``. This will be the rpm package you installed in step 2. Now run a ``sudo yum update``, this could take some time.

5. Next disable the system MySQL: 

  ``sudo yum module disable mysql`` 
  
    and then install MySQL.

  ``sudo yum install mysql-community-server``

6. Start the MySQL server.

  ``sudo systemctl start mysqld.service``
  
.. note::
   
   The first time that you start MySQL, the superuser account ``'root'@'localhost'`` is created with a password. Run the command below to get this password.
   ``sudo grep 'temporary password' /var/log/mysqld.log``. Also the first time that you start MySQL, the ``validate_password`` plugin is installed. The plugin forces passwords to contain at least one upper case letter, one lower case letter, one digit, and one special character, and that the total password length is at least 8 characters.

7. Change the root password. Log in with the the command below. Use the password found in ``sudo grep 'temporary password' /var/log/mysqld.log``.

  ``mysql -u root -p``

8. Change the password. At the prompt, type the following command. Be sure to replace ``Password42!`` with the password that you want to use:

  ``mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Password42!';``

9. Set MySQL to start automatically when the machine starts.

  ``sudo systemctl enable mysqld``

10. Create the Mattermost user *mmuser*.

  ``mysql> create user 'mmuser'@'%' identified by 'mmuser-password';``

.. note::
    - Use a password that's more secure than *mmuser-password*.
    - The '%' means that *mmuser* can connect from any machine on the network. However, it's more secure to use the IP address of the machine that hosts Mattermost. For example, if you install Mattermost on the machine with IP address 10.10.10.2, then use the following command:

      ``mysql> create user 'mmuser'@'10.10.10.2' identified by 'mmuser-password';``

11. Create the Mattermost database.

  ``mysql> create database mattermost;``

12. Grant access privileges to the user *mmuser*.

  ``mysql> grant all privileges on mattermost.* to 'mmuser'@'%';``
  
  .. note::
    This query grants the MySQL user we just created all privileges on the database for convenience. If you need more security you can use this query to grant the user only the privileges necessary to run Mattermost.
    
    ``mysql> GRANT ALTER, CREATE, DELETE, DROP, INDEX, INSERT, SELECT, UPDATE, REFERENCES ON mattermost.* TO 'mmuser'@'%';``
    
13. Log out of MySQL.

    ``mysql> exit``

With the database installed and the initial setup complete, you can now install the Mattermost server.

source/install/install-rhel-8-mattermost.rst METASEP
:nosearch:
.. This page is intentionally not accessible via the LHS navigation pane because it's common content included on other docs pages.

..  _install-rhel-8-mattermost:

Install Mattermost server
--------------------------

Install Mattermost Server on a 64-bit machine. Assume that the IP address of this server is ``10.10.10.2``.

1. Log in to the server that will host Mattermost Server and open a terminal window.

2. Download `the latest version of the Mattermost Server <https://mattermost.com/deploy/>`__. In the following command, replace ``X.X.X`` with the version that you want to download:

  ``wget https://releases.mattermost.com/X.X.X/mattermost-X.X.X-linux-amd64.tar.gz``

3. Extract the Mattermost Server files.

  ``tar -xvzf *.gz``

4. Move the extracted file to the ``/opt`` directory.

  ``sudo mv mattermost /opt``

5. Create the storage directory for files.

  ``sudo mkdir /opt/mattermost/data``

.. note::
  
  The storage directory will contain all the files and images that your users post to Mattermost, so you need to make sure that the drive is large enough to hold the anticipated number of uploaded files and images.

6. Set up a system user and group called ``mattermost`` that will run this service, and set the ownership and permissions.

  a. ``sudo useradd --system --user-group mattermost``
  b. ``sudo chown -R mattermost:mattermost /opt/mattermost``
  c. ``sudo chmod -R g+w /opt/mattermost``
  d. ``sudo restorecon -R /opt/mattermost``

7. Set up the database driver in the file ``/opt/mattermost/config/config.json``. Open the file as *root* in a text editor and make the following changes:

  -  If you are using PostgreSQL:

    a.  Set ``"DriverName"`` to ``"postgres"``
    b.  Set ``"DataSource"`` to the following value, replacing ``<mmuser-password>`` and ``<host-name-or-IP>`` with the appropriate values:

     ``"postgres://mmuser:<mmuser-password>@<host-name-or-IP>:5432/mattermost?sslmode=disable&connect_timeout=10"``.
  
  -  If you are using MySQL:

    a.  Set ``"DriverName"`` to ``"mysql"``
    b.  Set ``"DataSource"`` to the following value, replacing ``<mmuser-password>`` and ``<host-name-or-IP>`` with the appropriate values. Also make sure that the database name is ``mattermost`` instead of ``mattermost_test``:

      ``"mmuser:<mmuser-password>@tcp(<host-name-or-IP>:3306)/mattermost?charset=utf8mb4,utf8&writeTimeout=30s"``
    
    .. note::

      For a same-machine installation, replace ``<host-name-or-IP>`` above with ``localhost`` or ``127.0.0.1``.

8. Also set ``"SiteURL"`` to the full base URL of the site (e.g. ``"https://mattermost.example.com"``).

9. Test the Mattermost server to make sure everything works.

    a. Change to the ``mattermost`` directory:

      ``cd /opt/mattermost``

    b. Start the Mattermost server as the user *mattermost*:

      ``sudo -u mattermost ./bin/mattermost``

  When the server starts, it shows some log information and the text ``Server is listening on :8065``. You can stop the server by pressing pressing :kbd:`Ctrl` :kbd:`C` on Windows or Linux, or :kbd:`⌘` :kbd:`C` on Mac, in the terminal window.

10. Set up Mattermost to use the ``systemd init`` daemon which handles supervision of the Mattermost process.

  a. Create the Mattermost configuration file:

    ``sudo touch /etc/systemd/system/mattermost.service``

  b. Open the configuration file in a text editor, and copy the following lines into the file:

    .. code-block:: none

      [Unit]
      Description=Mattermost
      After=syslog.target network.target postgresql.service

      [Service]
      Type=notify
      WorkingDirectory=/opt/mattermost
      User=mattermost
      ExecStart=/opt/mattermost/bin/mattermost
      PIDFile=/var/spool/mattermost/pid/master.pid
      TimeoutStartSec=3600
      KillMode=mixed
      LimitNOFILE=49152

      [Install]
      WantedBy=multi-user.target

    .. note::
      If you are using MySQL, replace ``postgresql.service`` with ``mysqld.service`` in the ``[unit]`` section.

  c. Set the service file permissions.

    ``sudo chmod 644 /etc/systemd/system/mattermost.service``

  d. Reload the systemd services.

    ``sudo systemctl daemon-reload``

  e. Set Mattermost to start on boot.

    ``sudo systemctl enable mattermost``

11. Start the Mattermost server.

  ``sudo systemctl start mattermost``

12. Verify that Mattermost is running.

  ``curl http://localhost:8065``

  You should see the HTML that's returned by the Mattermost server.

Now that Mattermost is installed and running, it's time to create the admin user and configure Mattermost for use.

source/install/install-rhel-7.rst METASEP
.. _install-rhel-7:

Installing Mattermost on RHEL 7
=================================

|all-plans| |self-hosted|

.. |all-plans| image:: ../images/all-plans-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in Mattermost Free and Starter subscription plans.

.. |self-hosted| image:: ../images/self-hosted-badge.png
  :scale: 30
  :target: https://mattermost.com/deploy
  :alt: Available for Mattermost Self-Hosted deployments.

You can also use these instructions to install Mattermost on CentOS 7, Oracle Linux 7, or Scientific Linux 7. With the exception of the operating system that you install, the process is identical.

.. include:: install-common-intro.rst
  :start-after: :nosearch:

.. contents:: Install and configure the components in the following order. Note that you need only one database, either MySQL or PostgreSQL.
  :backlinks: top
  :local:

.. include:: install-rhel-7-server.rst
  :start-after: :nosearch:

.. include:: install-rhel-7-mysql.rst
  :start-after: :nosearch:

.. include:: install-rhel-7-postgresql.rst
  :start-after: :nosearch:

.. include:: install-rhel-7-mattermost.rst
  :start-after: :nosearch:

.. include:: config-mattermost-server.rst
  :start-after: :nosearch:

.. include:: config-tls-mattermost.rst
  :start-after: :nosearch:

.. include:: install-rhel-nginx.rst
  :start-after: :nosearch:

.. include:: config-proxy-nginx.rst
  :start-after: :nosearch:

.. include:: config-ssl-http2-nginx.rst
  :start-after: :nosearch:
  

source/install/install-rhel-7-server.rst METASEP
:nosearch:
..  _install-rhel-7-server:

Install Red Hat Enterprise Linux 7
-----------------------------------

Install the 64-bit version of RHEL 7 on each machine that hosts one or more of the components.

Install RHEL 7 Server
~~~~~~~~~~~~~~~~~~~~~~

1. To install RHEL 7, see the `RedHat Installation Instructions <https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Installation_Guide/>`__.

2. After the system is installed, make sure that it's up to date with the most recent security patches. Open a terminal window and issue the following commands:

  ``sudo yum update``
  
  ``sudo yum upgrade``

Now that the system is up to date, you can start installing the components that make up a Mattermost system.

.. note:: 

  Ensure that the ``mailcap`` package is installed as it includes the ``mime.types`` file which is needed for the Mobile App to work correctly.

source/install/install-rhel-7-postgresql.rst METASEP
:nosearch:
..  _install-rhel-7-postgresql:

Install PostgreSQL database
---------------------------

1. Log in to the server that will host the database, and open a terminal window.

2. Download the latest PostgreSQL repository. For more detailed install instructions visit the PostgreSQL docs site `here <https://www.postgresql.org/download/linux/redhat/>`_.

  ``sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm``

3. Install PostgreSQL version 10 or higher. Replace the contents of the ``{version}`` with the version you wish to install.

  ``sudo yum install -y postgresql{version}-server``

  **Example:**
  
  ``sudo yum install -y postgresql13-server``

4. Initialize the database.

  ``sudo /usr/pgsql-{version}/bin/postgresql-{version}-setup initdb``

5. Set PostgreSQL to start on boot.

  ``sudo systemctl enable postgresql-{version}``

6. Start the PostgreSQL server.

  ``sudo systemctl start postgresql-{version}``

7. Switch to the *postgres* Linux user account that was created during the installation.

  ``sudo -iu postgres``

9. Start the PostgreSQL interactive terminal.

  ``psql``

10.  Create the Mattermost database.

  ``postgres=# CREATE DATABASE mattermost WITH ENCODING 'UTF8' LC_COLLATE='en_US.UTF-8' LC_CTYPE='en_US.UTF-8' TEMPLATE=template0;``

11.  Create the Mattermost user 'mmuser'.

  ``postgres=# CREATE USER mmuser WITH PASSWORD 'mmuser-password';``

  .. note::
    Use a password that is more secure than 'mmuser-password'.

12.  Grant the user access to the Mattermost database.

  ``postgres=# GRANT ALL PRIVILEGES ON DATABASE mattermost to mmuser;``

13. Exit the PostgreSQL interactive terminal.

  ``postgres=# \q``

14. Log out of the *postgres* account.

  ``exit``

15. (Optional) If you use a different server for your database and the Mattermost app server, you may allow PostgreSQL to listen on all assigned IP addresses. To do so, open ``/var/lib/pgsql/{version}/data/postgresql.conf`` as root in a text editor. As a best practice, ensure that only the Mattermost server is able to connect to the PostgreSQL port using a firewall.

  a. Open ``/var/lib/pgsql/{version}/data/postgresql.conf`` as root in a text editor.

  b. Find the following line:

    ``#listen_addresses = 'localhost'``

  c. Uncomment the line and change ``localhost`` to ``*``:

    ``listen_addresses = '*'``

  d. Restart PostgreSQL for the change to take effect:

    ``sudo systemctl restart postgresql-{version}``

16. Modify the file ``pg_hba.conf`` to allow the Mattermost server to communicate with the database.

  **If the Mattermost server and the database are on the same machine**:

    a. Open ``/var/lib/pgsql/{version}/data/pg_hba.conf`` as root in a text editor.

    b. Find the following lines:

      ``local   all             all                        peer``
      
      ``host    all             all         ::1/128        ident``

    c. Change ``peer`` and ``ident`` to ``trust``:

      ``local   all             all                        trust``
      
      ``host    all             all         ::1/128        trust``

  **If the Mattermost server and the database are on different machines**:

    a. Open ``/var/lib/pgsql/{version}/data/pg_hba.conf`` as root in a text editor.

    b. Add the following line to the end of the file, where *{mattermost-server-IP}* is the IP address of the machine that contains the Mattermost server.

      ``host all all {mattermost-server-IP}/32 md5``

17. Reload PostgreSQL:

  ``sudo systemctl reload postgresql-{version}``

18. Verify that you can connect with the user *mmuser*.

  a. If the Mattermost server and the database are on the same machine, use the following command:

    ``psql --dbname=mattermost --username=mmuser --password``

  b. If the Mattermost server is on a different machine, log into that machine and use the following command:

    ``psql --host={postgres-server-IP} --dbname=mattermost --username=mmuser --password``

    .. note::
      You might have to install the PostgreSQL client software to use the command.

  The PostgreSQL interactive terminal starts. To exit the PostgreSQL interactive terminal, type ``\q`` and press **Enter**.

With the database installed and the initial setup complete, you can now install the Mattermost server.

source/install/install-rhel-7-mysql.rst METASEP
:nosearch:
..  _install-rhel-7-mysql:

Install MySQL database server
------------------------------

Install and set up the database for use by the Mattermost server. You can install either MySQL or PostgreSQL.

Install MySQL 5.7 on RHEL 7
~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Log in to the server that will host the database, and open a terminal window.

2. Download the MySQL Yum repository from dev.mysql.com.

  ``wget http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm``

3. Install the Yum repository from the file that you downloaded.

  ``sudo yum localinstall mysql57-community-release-el7-9.noarch.rpm``

4. Install MySQL.

  ``sudo yum install mysql-community-server``

5. Start the MySQL server.

  ``sudo systemctl start mysqld.service``
  
  .. note::
    1. The first time that you start MySQL, the superuser account ``'root'@'localhost'`` is created and a temporary password is generated for it.
    2. Also the first time that you start MySQL, the ``validate_password`` plugin is installed. The plugin forces passwords to contain at least one upper case letter, one lower case letter, one digit, and one special character, and that the total password length is at least 8 characters.

6. Obtain the root password that was generated when you started MySQL for the first time.

  ``sudo grep 'temporary password' /var/log/mysqld.log``

7. Change the root password. Login with the password that you obtained from the previous step.

  ``mysql -u root -p``

8. Change the password. At the mysql prompt, type the following command. Be sure to replace ``Password42!`` with the password that you want to use.

  ``mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Password42!';``

9. Set MySQL to start automatically when the machine starts.

  ``sudo systemctl enable mysqld``

10. Create the Mattermost user 'mmuser'.

  ``mysql> create user 'mmuser'@'%' identified by 'mmuser-password';``

  .. note::
    1. Use a password that is more secure than 'mmuser-password'.
    2. The '%' means that mmuser can connect from any machine on the network. However, it's more secure to use the IP address of the machine that hosts Mattermost. For example, if you install Mattermost on the machine with IP address 10.10.10.2, then use the following command:

      ``mysql> create user 'mmuser'@'10.10.10.2' identified by 'mmuser-password';``

11. Create the Mattermost database.

  ``mysql> create database mattermost;``

12. Grant access privileges to the user 'mmuser'.

  ``mysql> grant all privileges on mattermost.* to 'mmuser'@'%';``
  
  .. note::
    This query grants the MySQL user we just created all privileges on the database for convenience. If you need more security you can use this query to grant the user only the privileges necessary to run Mattermost.
    
    ``mysql> GRANT ALTER, CREATE, DELETE, DROP, INDEX, INSERT, SELECT, UPDATE, REFERENCES ON mattermost.* TO 'mmuser'@'%';``
    
13. Log out of MySQL.

    ``mysql> exit``

With the database installed and the initial setup complete, you can now install the Mattermost server.

source/install/install-rhel-7-mattermost.rst METASEP
:nosearch:
..  _install-rhel-7-mattermost:

Install Mattermost Server
-------------------------

Install Mattermost Server on a 64-bit machine.

Assume that the IP address of this server is 10.10.10.2

Install Mattermost Server on RHEL 7
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Log in to the server that will host Mattermost Server and open a terminal window.

2. Download `the latest version of the Mattermost Server <https://mattermost.com/deploy/>`__. In the following command, replace ``X.X.X`` with the version that you want to download:

  ``wget https://releases.mattermost.com/X.X.X/mattermost-X.X.X-linux-amd64.tar.gz``

3. Extract the Mattermost Server files.

  ``tar -xvzf *.gz``

4. Move the extracted file to the ``/opt`` directory.

  ``sudo mv mattermost /opt``

5. Create the storage directory for files.

  ``sudo mkdir /opt/mattermost/data``

  .. note::
    The storage directory will contain all the files and images that your users post to Mattermost, so you need to make sure that the drive is large enough to hold the anticipated number of uploaded files and images.

6. Set up a system user and group called ``mattermost`` that will run this service, and set the ownership and permissions.

  a. ``sudo useradd --system --user-group mattermost``
  b. ``sudo chown -R mattermost:mattermost /opt/mattermost``
  c. ``sudo chmod -R g+w /opt/mattermost``

7. Set up the database driver in the file ``/opt/mattermost/config/config.json``. Open the file as root in a text editor and make the following changes:

  -  If you are using PostgreSQL:

    1.  Set ``"DriverName"`` to ``"postgres"``
    2.  Set ``"DataSource"`` to the following value, replacing ``<mmuser-password>`` and ``<host-name-or-IP>`` with the appropriate values:

     ``"postgres://mmuser:<mmuser-password>@<host-name-or-IP>:5432/mattermost?sslmode=disable&connect_timeout=10"``.

  -  If you are using MySQL:

    1.  Set ``"DriverName"`` to ``"mysql"``
    2.  Set ``"DataSource"`` to the following value, replacing ``<mmuser-password>`` and ``<host-name-or-IP>`` with the appropriate values. Also make sure that the database name is ``mattermost`` instead of ``mattermost_test``:

      ``"mmuser:<mmuser-password>@tcp(<host-name-or-IP>:3306)/mattermost?charset=utf8mb4,utf8&writeTimeout=30s"``

8. Also set ``"SiteURL"`` to the full base URL of the site (e.g. ``"https://mattermost.example.com"``).

9. Test the Mattermost server to make sure everything works.

    a. Change to the ``mattermost`` directory:

      ``cd /opt/mattermost``

    b. Start the Mattermost server as the user mattermost:

      ``sudo -u mattermost ./bin/mattermost``

  When the server starts, it shows some log information and the text ``Server is listening on :8065``. You can stop the server by pressing pressing :kbd:`Ctrl` :kbd:`C` on Windows or Linux, or :kbd:`⌘` :kbd:`C` on Mac, in the terminal window.

10. Set up Mattermost to use the systemd init daemon which handles supervision of the Mattermost process.

  a. Create the Mattermost configuration file:

    ``sudo touch /etc/systemd/system/mattermost.service``

  b. Open the configuration file in your favorite text editor, and copy the following lines into the file:

    .. code-block:: none

      [Unit]
      Description=Mattermost
      After=syslog.target network.target postgresql.service

      [Service]
      Type=notify
      WorkingDirectory=/opt/mattermost
      User=mattermost
      ExecStart=/opt/mattermost/bin/mattermost
      PIDFile=/var/spool/mattermost/pid/master.pid
      TimeoutStartSec=3600
      KillMode=mixed
      LimitNOFILE=49152

      [Install]
      WantedBy=multi-user.target

    .. note::
      If you are using MySQL, replace ``postgresql.service`` by ``mysqld.service`` in the ``[unit]`` section.

  c. Set the service file permissions.

    ``sudo chmod 644 /etc/systemd/system/mattermost.service``

  d. Reload the systemd services.

    ``sudo systemctl daemon-reload``

  e. Set Mattermost to start on boot.

    ``sudo systemctl enable mattermost``

11. Start the Mattermost server.

  ``sudo systemctl start mattermost``

12. Verify that Mattermost is running.

  ``curl http://localhost:8065``

  You should see the HTML that's returned by the Mattermost server.

Now that Mattermost is installed and running, it's time to create the admin user and configure Mattermost for use.

source/install/install-nginx.rst METASEP
:nosearch:
.. This page is intentionally not accessible via the LHS navigation pane because it's common content included on other docs pages.

.. _install-nginx:

Install NGINX server
--------------------
NGINX is a popular web server and is responsible for hosting some of the largest and highest-traffic sites on the internet. It's more resource-friendly than Apache in most cases, and can be used as a web server or reverse proxy.

In a production setting, use a proxy server for greater security and performance of Mattermost.

-  SSL termination
-  HTTP to HTTPS redirect
-  Port mapping ``:80`` to ``:8065``
-  Standard request logs

Install NGINX on Ubuntu Server
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Log in to the server that will host the proxy and open a terminal window.

2. Install NGINX.

  Because NGINX is available in Ubuntu's default repositories, it's possible to install it from these repositories using the ``apt`` packaging system. First, update your local ``apt`` package index for access to the most recent package listings. Then, install ``nginx``:

  ``sudo apt update``
  
  ``sudo apt install nginx``

  After accepting the procedure, ``apt`` will install NGINX and any required dependencies to your server.

3. After installing it, you already have everything you need. You can point your browser to your server IP address. You should see the default NGINX landing page:

  .. image:: /images/install_nginx_welcome.png
    :alt: Example of the default NGINX landing page.

  If you see this page, you've successfully installed NGINX on your web server. This page is included with NGINX to show you that the server is running correctly.

  Or you can also verify it by running ``curl http://localhost``. 

  If NGINX is running, you see the following output:

  .. code-block:: html

    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    .
    .
    .
    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html>

Manage the NGINX process
~~~~~~~~~~~~~~~~~~~~~~~~

Now that you have your web server up and running, let's review some basic management commands. These are all run in the command line interface.

To stop your web server, use: ``sudo systemctl stop nginx``

To start the web server when it's stopped, use: ``sudo systemctl start nginx``
 
To stop and then start the service again, use: ``sudo systemctl restart nginx``
 
If you're simply making configuration changes, NGINX can often reload without dropping connections. To do this, use: ``sudo systemctl reload nginx``
 
By default, NGINX is configured to start automatically when the server boots. If this isn't what you want, you can disable this behavior using: ``sudo systemctl disable nginx``
 
To re-enable the service to start up at boot, use: ``sudo systemctl enable nginx``

What to do next
~~~~~~~~~~~~~~~

1. Map a fully qualified domain name (FQDN) such as ``mattermost.example.com`` to point to the NGINX server.
2. Configure NGINX to proxy connections from the internet to the Mattermost server.

source/install/install-kubernetes.rst METASEP
.. _install-kubernetes:

Install Mattermost on Kubernetes
================================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

.. include:: common-prod-deploy-kubernetes.rst
  :start-after: :nosearch:

source/install/install-ios-app.rst METASEP
iOS setup
=========

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Your Mattermost teams can be accessed on iOS mobile devices via the Mattermost mobile app.

1. Open the App Store on your Apple device running iOS 12.1 or later.
2. Search for "Mattermost" and select **GET** to download the app.
3. Enter your Apple ID Password or use Touch ID to proceed with the install. You may also be asked to provide an Apple Verification Code received through text/phone call, login notification, or **Settings** on your trusted device.
4. Open Mattermost from your homescreen and follow the steps below to log in:

   a. **Enter Server URL:** This is the web address you go to when you want to access Mattermost. Select **Connect** to continue. See the `log in <https://docs.mattermost.com/welcome/sign-in.html>`__ documentation for additional details. 
   b. Enter your **Email or Username** and **Password** provided by your Mattermost System Admin. Select **Log in**.
   
.. tip::
  
  For information on managing your Mattermost profile and setting up `multi-factor authentication <https://docs.mattermost.com/welcome/manage-your-profile.html#multi-factor-authentication>`__, see the `manage your Mattermost profile <https://docs.mattermost.com/welcome/manage-your-profile.html#manage-your-mattermost-profile>`__ documentation.

.. include:: ../upgrade/upgrading-to-v60.rst
  :start-after: :nosearch:

source/install/install-docker.rst METASEP
..  _docker-local-machine:

Install Mattermost via Docker
==============================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Prerequisites
-------------

If you don't have Docker installed, follow the instructions below based on your operating system:

.. tabs::

  .. tab:: macOS

    Install `Docker for Mac <https://docs.docker.com/installation/mac/>`__.

  .. tab:: Windows 10

    Install `Docker for Windows <https://docs.docker.com/installation/windows/>`__.

  .. tab:: Ubuntu

    Follow the `Install Docker Engine on Ubuntu <https://docs.docker.com/engine/install/ubuntu/>`__ documentation, or you can use the Docker package from the Ubuntu repositories:

    .. code:: bash

      sudo apt update
      sudo apt install docker.io
      sudo systemctl start docker

  .. tab:: Fedora

    Follow the `Install Docker Engine on Fedora <https://docs.docker.com/engine/installation/linux/fedora/>`__ documentation, or you can use the Moby package (Moby is the FOSS upstream project to Docker) from the Fedora repositories:

    .. code:: bash

      sudo dnf install moby-engine
      sudo systemctl start docker

.. _Preview Mattermost on Docker:

.. include:: common-local-deploy-docker.rst
  :start-after: :nosearch:

Troubleshooting your preview deployment
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The **Preview Mode** Docker instance for Mattermost is designed for product evaluation, and sets ``SendEmailNotifications=false`` so the product can function without enabling email. See the `Configuration Settings <https://docs.mattermost.com/configure/configuration-settings.html>`__ documentation to customize your deployment.

To update your Mattermost preview image and container, you must first stop and delete your existing **mattermost-preview** container by running the following commands:

.. code:: bash

  docker pull mattermost/mattermost-preview
  docker stop mattermost-preview
  docker rm mattermost-preview

Once the new image is pulled and the container is stopped and deleted you need to run the ``docker run`` command from above.

.. important::
  On Linux, include ``sudo`` in front of all ``docker`` commands.

To access a shell inside the container, run the following command:

.. code:: bash

   docker exec -ti mattermost-preview /bin/bash

.. _Deploy Mattermost on Docker:

Deploy Mattermost on Docker for production use
----------------------------------------------

.. include:: common-prod-deploy-docker.rst
  :start-after: :nosearch:

Upgrade from ``mattermost-docker``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

For an in-depth guide to upgrading from the deprecated `mattermost-docker repository <https://github.com/mattermost/mattermost-docker>`__, please refer to `this document <https://github.com/mattermost/docker/blob/main/scripts/UPGRADE.md>`__. For additional help pr questions, please refer to `this issue <https://github.com/mattermost/mattermost-docker/issues/489>`__.

Installing a different version of Mattermost
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Shut down your deployment.

2. Run ``git pull`` to fetch any recent changes to the repository, paying attention to any potential ``env.example`` changes.

3. Adjust the ``MATTERMOST_IMAGE_TAG`` in the ``.env`` file to point your desired `enterprise <(https://hub.docker.com/r/mattermost/mattermost-enterprise-edition/tags?page=1&ordering=last_updated>`__ or `team <https://hub.docker.com/r/mattermost/mattermost-team-edition/tags?page=1&ordering=last_updated>`__ image version.

4. Redeploy Mattermost.

Troubleshooting your production deployment
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Docker
^^^^^^

If deploying on an M1 Mac and encountering permission issues in the Docker container, `redo the third step <#create-the-required-directores-and-set-their-permissions>`__ and skip this command:

.. code:: bash

  sudo chown -R 2000:2000 ./volumes/app/mattermost

If having issues deploying on Docker generally, ensure the docker daemon is enabled and running:

.. code:: bash

  sudo systemctl enable --now docker

To remove all data and settings for your Mattermost deployment:

.. code:: bash

  sudo rm -rf ./volumes

Postgres
^^^^^^^^

You can change the Postgres username and/or password (recommended) in the ``.env`` file.

TLS & Nginx
^^^^^^^^^^^

For an in-depth guide to configuring the TLS certificate and key for Nginx, please refer to `this document in the repository <https://github.com/mattermost/docker/blob/main/docs/issuing-letsencrypt-certificate.md>`__.

Further help
~~~~~~~~~~~~~

If you encounter other problems while installing Mattermost, please refer to our `troubleshooting guide <https://docs.mattermost.com/install/troubleshooting.html>`__. 

source/install/install-debian.rst METASEP
.. _install-debian:

Installing Mattermost on Debian Buster
=======================================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Install a production-ready Mattermost system on up to three machines.

.. include:: install-common-intro.rst
  :start-after: :nosearch:

.. contents:: Install and configure the components in the following order.
  :depth: 2

.. include:: install-tar.rst
  :start-after: :nosearch:

Install a database
------------------

.. note:: 
  
  You only need one database: either MySQL or PostgreSQL. See the `database software <https://docs.mattermost.com/install/software-hardware-requirements.html#database-software>`__ documentation for details on database version support.

.. tabs::

  .. tab:: Install MySQL

    Install and set up a MySQL database for use by the Mattermost server.

    1. Log into the server that will host the database, and open a terminal window.

    2. Download the MySQL repository package by running ``wget https://dev.mysql.com/get/mysql-apt-config_0.8.13-1_all.deb``.

    3. Install the repository by running ``sudo dpkg -i mysql-apt-config*``.

    4. Update your local package list by running ``sudo apt-get update``.

    5. Add the MySQL repo MySQL by running ``sudo apt-get install mysql-server``.

      .. note::
    
        During the install, you'll be prompted to create a password for the MySQL root user. Make a note of the password because you'll need it in the next step.

    6. Log in to MySQL as *root* by running ``mysql -u root -p``. When prompted, enter the root password that you created when installing MySQL.

    7. Create the Mattermost user ``mmuser`` by running ``mysql> create user 'mmuser'@'%' identified by 'mmuser-password';``.

      .. note::
    
        - Use a password that is more secure than ``mmuser-password``.
        - The ``%`` means that mmuser can connect from any machine on the network. However, it's more secure to use the IP address of the machine that hosts Mattermost. For example, if you install Mattermost on the machine with IP address 10.10.10.2, then use the following command: ``mysql> create user 'mmuser'@'10.10.10.2' identified by 'mmuser-password';``.

    8. Create the Mattermost database by running ``mysql> create database mattermost;``.

    9. Grant access privileges to the user ``mmuser`` by running ``mysql> grant all privileges on mattermost.* to 'mmuser'@'%';``.
  
      .. note::
    
        This query grants the MySQL user we just created all privileges on the database for convenience. If you need more security, you can use the following query to grant the user only the privileges necessary to run Mattermost: ``mysql> GRANT ALTER, CREATE, DELETE, DROP, INDEX, INSERT, SELECT, UPDATE, REFERENCES ON mattermost.* TO 'mmuser'@'%';``.

    10. Log out of MySQL by running ``mysql> exit``. Once the database is installed, and the initial setup is complete, you can install the Mattermost server.

  .. tab:: Install PostgreSQL

    Install and set up a PostgreSQL database for use by the Mattermost server. These instructions assume that the IP address of this server is ``10.10.10.1``.

    1. Log in to the server that will host the database, and install PostgreSQL. See the `PostgreSQL <https://www.postgresql.org/download/linux/debian/>`__ documentation for details. When the installation is complete, the PostgreSQL server is running, and a Linux user account called *postgres* has been created.

    2. Log in to the *postgres* account by running ``sudo --login --user postgres``.

    3. Start the PostgreSQL interactive terminal by running ``psql``.

    4. Create the Mattermost database by running ``postgres=# CREATE DATABASE mattermost;``.

    5. Create the Mattermost user 'mmuser' by running ``postgres=# CREATE USER mmuser WITH PASSWORD 'mmuser-password';``.

      .. note::
      
        Use a password that is more secure than ``mmuser-password``.

    6. Grant the user access to the Mattermost database by running ``postgres=# GRANT ALL PRIVILEGES ON DATABASE mattermost to mmuser;``.

    7. Exit the PostgreSQL interactive terminal by running ``postgres=# \q``.

    8. Log out of the *postgres* account by running ``exit``.

    9. (Optional) If you use separate servers for your database and the Mattermost app server, you may allow PostgreSQL to listen on all assigned IP Addresses. To do so, open ``/etc/postgresql/{version}/main/postgresql.conf`` as *root* in a text editor, and replacing ``{version}`` with the version of PostgreSQL that's currently running. As a best practice, ensure that only the Mattermost server is able to connect to the PostgreSQL port using a firewall.

      a. Find the following line: ``#listen_addresses = 'localhost'``.

      b. Uncomment the line and change ``localhost`` to ``*``: ``listen_addresses = '*'``.

      c. Restart PostgreSQL for the change to take effect: ``sudo systemctl restart postgresql``.

    10. Modify the file ``pg_hba.conf`` to allow the Mattermost server to communicate with the database.

      **If the Mattermost server and the database are on the same machine**:

        a. Open ``/etc/postgresql/9.4/main/pg_hba.conf`` in a text editor as *root* user.

        b. Find the following lines:

          ``local   all             all                        peer``
      
          ``host    all             all         ::1/128        ident``

        c. Change ``peer`` and ``ident`` to ``trust``:

          ``local   all             all                        trust``
      
          ``host    all             all         ::1/128        trust``

      **If the Mattermost server and the database are on different machines**:

        a. Open ``/etc/postgresql/9.4/main/pg_hba.conf`` in a text editor as *root* user.

        b. Add the following line to the end of the file, where ``{mattermost-server-IP}`` is the IP address of the machine that contains the Mattermost server: ``host all all {mattermost-server-IP}/32 md5``.

    11. Reload PostgreSQL by running ``sudo systemctl reload postgresql``.

    12. Verify that you can connect with the user *mmuser*.

      a. If the Mattermost server and the database are on the same machine, use the following command: ``psql --dbname=mattermost --username=mmuser --password``

      b. If the Mattermost server is on a different machine, log into that machine and use the following command: ``psql --host={postgres-server-IP} --dbname=mattermost --username=mmuser --password``

    .. note::
      
      You might have to install the PostgreSQL client software to use the command.

    The PostgreSQL interactive terminal starts. To exit the PostgreSQL interactive terminal, type ``\q`` and press :kbd:`Enter` on Windows or Linux, or :kbd:`↵` on Mac. 
    
    With the database installed and the initial setup complete, you can now install the Mattermost server.

.. include:: config-mattermost-server.rst
  :start-after: :nosearch:

.. include:: config-tls-mattermost.rst
  :start-after: :nosearch:

.. include:: install-nginx.rst
  :start-after: :nosearch:

.. include:: config-proxy-nginx.rst
  :start-after: :nosearch:

.. include:: config-ssl-http2-nginx.rst
  :start-after: :nosearch:
source/install/install-debian-server.rst METASEP
:orphan:
:nosearch:
.. _install-debian-server:
.. This page is intentionally not accessible via the LHS navigation pane because it's common content included on other docs pages.

Install Debian Buster
----------------------

Install the 64-bit version of Debian on each machine that hosts one or more of the components.

**To install Debian Buster:**

1. To install Debian Buster, see `Debian Installation documentation <https://www.debian.org/releases/buster/installmanual>`__ for details.

2. After the system is installed, make sure that it's up to date with the most recent security patches. Open a terminal window and issue the following commands as root:

  ``apt-get update``

  ``apt-get upgrade``

3. Install *sudo* and *curl* for use later in the installation: ``apt-get install sudo curl gnupg``.

4. Add your username to the sudo group. In the following command, replace {username} with your own username: ``usermod -a -G sudo {username}``.

Now that the system is up to date and your user is in the sudo group, you can start installing the components that make up a Mattermost system.

source/install/install-debian-postgresql.rst METASEP
:nosearch:
.. _install-debian-postgresql:

Install PostgreSQL database server
-----------------------------------

Install and set up the database for use by the Mattermost server. You can install either PostgreSQL or MySQL.

Assume that the IP address of this server is 10.10.10.1

Install PostgreSQL on Debian Buster
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Log in to the server that will host the database and issue the following command:

  ``sudo apt-get install postgresql postgresql-contrib``

  When the installation is complete, the PostgreSQL server is running, and a Linux user account called *postgres* has been created.

2. Log in to the *postgres* account.

  ``sudo --login --user postgres``

3. Start the PostgreSQL interactive terminal.

  ``psql``

4.  Create the Mattermost database.

  ``postgres=# CREATE DATABASE mattermost;``

5.  Create the Mattermost user 'mmuser'.

  ``postgres=# CREATE USER mmuser WITH PASSWORD 'mmuser-password';``

  .. note::
    Use a password that is more secure than 'mmuser-password'.

6.  Grant the user access to the Mattermost database.

  ``postgres=# GRANT ALL PRIVILEGES ON DATABASE mattermost to mmuser;``

7. Exit the PostgreSQL interactive terminal.

  ``postgres=# \q``

8. Log out of the *postgres* account.

  ``exit``

9. (Optional) If you use a different server for your database and the Mattermost app server, you may allow PostgreSQL to listen on all assigned IP Addresses. To do so, open ``/etc/postgresql/9.4/main/postgresql.conf`` as root in a text editor. As a best practice, ensure that only the Mattermost server is able to connect to the PostgreSQL port using a firewall.

  a. Find the following line:

    ``#listen_addresses = 'localhost'``

  b. Uncomment the line and change ``localhost`` to ``*``:

    ``listen_addresses = '*'``

  d. Restart PostgreSQL for the change to take effect:

    ``sudo systemctl restart postgresql``

10. Modify the file ``pg_hba.conf`` to allow the Mattermost server to communicate with the database.

  **If the Mattermost server and the database are on the same machine**:

    a. Open ``/etc/postgresql/9.4/main/pg_hba.conf`` as root in a text editor.

    b. Find the following lines:

      ``local   all             all                        peer``
      
      ``host    all             all         ::1/128        ident``

    c. Change ``peer`` and ``ident`` to ``trust``:

      ``local   all             all                        trust``
      
      ``host    all             all         ::1/128        trust``

  **If the Mattermost server and the database are on different machines**:

    a. Open ``/etc/postgresql/9.4/main/pg_hba.conf`` as root in a text editor.

    b. Add the following line to the end of the file, where *{mattermost-server-IP}* is the IP address of the machine that contains the Mattermost server.

      ``host all all {mattermost-server-IP}/32 md5``

11. Reload PostgreSQL:

  ``sudo systemctl reload postgresql``

12. Verify that you can connect with the user *mmuser*.

  a. If the Mattermost server and the database are on the same machine, use the following command:

    ``psql --dbname=mattermost --username=mmuser --password``

  b. If the Mattermost server is on a different machine, log into that machine and use the following command:

    ``psql --host={postgres-server-IP} --dbname=mattermost --username=mmuser --password``

    .. note::
      You might have to install the PostgreSQL client software to use the command.

  The PostgreSQL interactive terminal starts. To exit the PostgreSQL interactive terminal, type ``\q`` and press **Enter**.

With the database installed and the initial setup complete, you can now install the Mattermost server.

source/install/install-debian-mysql.rst METASEP
:nosearch:
.. _install-debian-mysql:

Install MySQL database server
-----------------------------

Install and set up the database for use by the Mattermost server. You can install either MySQL or PostgreSQL.

Install MySQL on Debian Buster
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Log into the server that will host the database, and open a terminal window.

2. Download the MySQL repository package.

  ``wget https://dev.mysql.com/get/mysql-apt-config_0.8.13-1_all.deb``

3. Install the repository

  ``sudo dpkg -i mysql-apt-config*``

4. Update your local package list.

  ``sudo apt-get update``

5. Add the MySQL repo MySQL.

  ``sudo apt-get install mysql-server``

  .. note::
    During the install, you'll be prompted to create a password for the MySQL root user. Make a note of the password because you'll need it in the next step.

6. Log in to MySQL as root.

  ``mysql -u root -p``

  When prompted, enter the root password that you created when installing MySQL.

7. Create the Mattermost user 'mmuser'.

  ``mysql> create user 'mmuser'@'%' identified by 'mmuser-password';``

  .. note::
    1. Use a password that is more secure than 'mmuser-password'.
    2. The '%' means that mmuser can connect from any machine on the network. However, it's more secure to use the IP address of the machine that hosts Mattermost. For example, if you install Mattermost on the machine with IP address 10.10.10.2, then use the following command:

  ``mysql> create user 'mmuser'@'10.10.10.2' identified by 'mmuser-password';``

8. Create the Mattermost database.

  ``mysql> create database mattermost;``

9. Grant access privileges to the user 'mmuser'.

  ``mysql> grant all privileges on mattermost.* to 'mmuser'@'%';``
  
  .. note::
    This query grants the MySQL user we just created all privileges on the database for convenience. If you need more security you can use this query to grant the user only the privileges necessary to run Mattermost.
    
    ``mysql> GRANT ALTER, CREATE, DELETE, DROP, INDEX, INSERT, SELECT, UPDATE, REFERENCES ON mattermost.* TO 'mmuser'@'%';``

10. Log out of MySQL.

  ``mysql> exit``

With the database installed and the initial setup complete, you can now install the Mattermost server.

source/install/install-common-intro.rst METASEP
:nosearch:

.. This page is intentionally not accessible via the LHS navigation pane because it's common content included on other docs pages.

A complete Mattermost installation consists of three major components: a proxy server, a database server, and the Mattermost server. You can install all components on one machine, or you can install each component on its own machine. If you have only two machines, then install the proxy and the Mattermost server on one machine, and install the database on the other machine.

For the database, you can install either MySQL or PostgreSQL. The proxy is NGINX.

.. note::
  If you have any problems installing Mattermost, see the `troubleshooting guide <https://docs.mattermost.com/install/troubleshooting.html>`__, or `join the Mattermost user community for troubleshooting help <https://mattermost.com/pl/default-ask-mattermost-community/>`_.
  
  For help with inviting users to your system, see `inviting team members <https://docs.mattermost.com/channels/manage-channel-members.html>`__ and other `getting started information <https://docs.mattermost.com/getting-started/admin-onboarding-tasks.html#getting-started-tasks>`__.
  
  To submit an improvement or correction to this page, select **Edit** in the top-right corner of the page.
source/install/install-centos-oracle-scientific.rst METASEP
Installing Mattermost on CentOS, Oracle Linux, and Scientific Linux
===================================================================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

To install Mattermost on CentOS, Oracle Linux, and Scientific Linux, you can use the instructions for installing Mattermost on RHEL. With the exception of the operating system that you install, the process is identical.

To install Mattermost on CentOS 7, Oracle Linux 7, and Scientific Linux 7, see :doc:`install-rhel-7`

To install Mattermost on CentOS 8 and Oracle Linux 8, see :doc:`install-rhel-8`

source/install/install-android-app.rst METASEP
Android setup
=============

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Your Mattermost teams can be accessed on Android mobile devices by downloading the Mattermost mobile app.

1. Open the Play Store on your Android device.
2. Search for "Mattermost" and select **INSTALL** to download the app.
3. Open Mattermost from your homescreen and enter your team and account information to login:

   a. **Enter Server URL:** This is the web address you go to when you want to access Mattermost. See the `log in <https://docs.mattermost.com/welcome/log-in.html>`__ documentation for additional details. 
   b. **Log in to Mattermost:** This is your account login information as described by one of the following login methods:

.. _Okta: https://developer.okta.com/docs/guides/saml_guidance.html
.. _Microsoft ADFS: https://msdn.microsoft.com/en-us/library/bb897402.aspx
.. _documentation: https://docs.mattermost.com/onboard/sso-saml.html
.. _App Store: https://geo.itunes.apple.com/us/app/mattermost/id984966508?mt=8
.. _Google Play Store: https://play.google.com/store/apps/details?id=com.mattermost.mattermost&hl=en

.. tip::

  For information on managing your Mattermost profile and setting up `multi-factor authentication <https://docs.mattermost.com/welcome/manage-your-profile.html#multi-factor-authentication>`__, see the `manage your Mattermost profile <https://docs.mattermost.com/welcome/manage-your-profile.html#manage-your-mattermost-profile>`__ documentation.

.. include:: ../upgrade/upgrading-to-v60.rst
  :start-after: :nosearch:

source/install/heroku.rst METASEP
:orphan:

Mattermost preview using Heroku
===============================

Quickly set up Mattermost in Preview Mode to explore product functionality using Heroku.

This configuration is not recommended for use in production, as it currently does not support email notifications. Also note that for persistent file storage AmazonS3 must be used, as local storage will be deleted periodically when the Heroku process restarts.

Heroku installation
--------------------

1. Sign up for a free account on `Heroku <https://www.heroku.com/>`__

2. Click the |HerokuDeploy|_ button

.. |HerokuDeploy| image:: https://www.herokucdn.com/deploy/button.svg
.. _HerokuDeploy: https://heroku.com/deploy?template=https://github.com/mattermost/mattermost-heroku

3. (Optional) Customize the default settings in Heroku

  - ``App Name``: Optionally select a name for your application (this will be used in the app URL)
  - ``Runtime Selection``: Select which region your app should run in (United States or Europe)
  - ``Config Variables``:

    - ``MATTERMOST_DOWNLOAD_URI``: The URI to the compiled Mattermost binary you would like to run. Defaults to current release.
    - ``FILE_SETTINGS__DRIVER_NAME``: Select the type of file storage to use (``local`` or ``amazons3``). AmazonS3 is required for persistent file storage.
    - ``FILE_SETTINGS__AMAZON_S3_ACCESS_KEY_ID``: The access key for your Amazon S3. Only required for driver name `amazons3`.
    - ``FILE_SETTINGS__AMAZON_S3_SECRET_ACCESS_KEY``: The secret access key for your Amazon S3. Only required for driver name amazons3.
    - ``FILE_SETTINGS__AMAZON_S3_BUCKET``: The name you selected for your S3 bucket in AWS. Only required for driver name amazons3.
    - ``FILE_SETTINGS__AMAZON_S3_REGION``: The AWS region you selected when creating your S3 bucket. Refer to `AWS Reference Documentation <https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region>`__ and choose this variable from the Region column.

4. Click **"Deploy for Free"**


After Heroku finishes setting up the app, click "View" and your Mattermost Preview should be up and running. You will be taken to the account creation page, where you can enter credentials to create an account and get started.

source/install/faq_kubernetes.rst METASEP
:orphan:
:nosearch:

Frequently Asked Questions
--------------------------

What's the difference between the Mattermost Operator and Helm Charts?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The Mattermost Operator is a self-contained set of application/product-specific instructions that runs inside Kubernetes and facilitates application
management and deployment.

Helm is a tool used to deploy Kubernetes manifests to a cluster, but does not facilitate application management.

Does the Mattermost Operator replace the Helm Chart?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

No. Helm is a good mechanism to deploy operators and other applications but doesn't facilitate application management. 

Is minIO the only available storage option?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

No, other options and operators can be added.

Do I have to install a separate SQL server to use the Mattermost Operator?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

No, you can use the operator on top of your existing deployment without setting up another database. We will shortly
be providing steps for this configuration.

Can you use blue-green deployments with different database schemas?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Currently this is not supported as it introduces the possibility of missing a data entry in the database.

Are environment variables supported?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Yes. However, ``config.json`` file settings will be overridden if the `$MM_SQLSETTINGS_DATASOURCE` environment variable is set. See the `Environment Variables <https://docs.mattermost.com/configure/configuration-settings.html#environment-variables>`__ configuration settings documentation for details.

Issues configuring Login with SAML on Kubernetes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

For some SAML authentication configurations, ``502`` status code response can appear during login attempts due to requests being too large.
This can be caused by the default ``proxy-buffer-size`` setting for NGINX Ingress being too low.
To fix this issue, configure an appropriate buffer size (8k or 16k should be sufficient for most cases) with NGINX annotation by adding it to the Mattermost manifest under ``spec.ingressAnnotations``:

.. code-block:: yaml

  ...
  spec:
  ...
    ingress:
    ...
      annotations:
        nginx.ingress.kubernetes.io/proxy-buffer-size: 16k
  ...

Use caution when changing the buffer size as it may slightly impact NGINX performance. Exact values are machine-dependent.

source/install/enterprise-install-upgrade.rst METASEP
..  _ee-install:

Enterprise install and upgrade
===============================

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

Mattermost Enterprise Edition is free to use in "team mode" without Enterprise features enabled. Mattermost offers two subscription plans, including Professional and Enterprise. You can `compare their features online <https://mattermost.com/pricing-feature-comparison/>`__.

Once you've downloaded and installed Mattermost, start an Enterprise trial via **Product menu > System Console > Edition and License > Start trial**. You can view `pricing and feature information <https://mattermost.com/pricing/>`__ and purchase a `license key online <https://customers.mattermost.com/login/>`__.

Installing Enterprise Edition
-----------------------------

To install Mattermost Enterprise Edition directly please use one of the following guides:

* `Production Kubernetes Deployment <https://docs.mattermost.com/install/install-kubernetes.html>`__
* `Production Enterprise Edition on Ubuntu 18.04 <https://docs.mattermost.com/install/install-ubuntu-1804.html>`__
* `Production Enterprise Edition on RHEL 7 <https://docs.mattermost.com/install/install-rhel-7.html>`__
* `Production Enterprise Edition on RHEL 8 <https://docs.mattermost.com/install/install-rhel-8.html>`__
* `Production Enterprise Edition on Debian Stretch <https://docs.mattermost.com/install/install-debian.html>`__
* `Production Enterprise Edition using Docker and Docker Compose <https://github.com/mattermost/docker>`__

Upgrading to Mattermost Enterprise Edition
--------------------------------------------

Checking your Mattermost edition and version
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

If you're already running Mattermost v5.39 or earlier, you can check the Mattermost edition and version from the command line using:

`mattermost version`

To check your edition and version from the web or desktop interface, open **Product menu > About Mattermost**.

- **Mattermost Enterprise Edition** indicates you can apply a license key to enable Enterprise features.
- **Mattermost Team Edition** indicates you're using the open source version and need to upgrade (per upgrade instructions below) before a license key can be applied.

Upgrading to Enterprise Edition from Mattermost Team Edition
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The open source Mattermost Team Edition is functionally identical to the commercial Mattermost Enterprise Edition in its free "team mode", but there is no ability to unlock Enterprise features.

To enable unlocking Enterprise features, replace the Mattermost Team Edition binary with a Mattermost Enterprise Edition binary via an `upgrade procedure <https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html>`__.

If you'd like to back up Mattermost prior to upgrading, `the migration guide <https://docs.mattermost.com/onboard/migrating-to-mattermost.html>`__  outlines the process required to back up and restore your database.

Upgrading to Enterprise Edition in GitLab Omnibus
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

GitLab Omnibus runs the open source Mattermost Team Edition. To upgrade to Mattermost Enterprise Edition, follow these steps:

1. Disable the built-in Mattermost instance on GitLab Omnibus:

- Go to ``/etc/gitlab/gitlab.rb`` and set the following line to false:

.. code-block:: text

   mattermost['enable'] = false

- Then run the following command to apply the updated setting:

.. code-block::
  
  sudo gitlab-ctl reconfigure

2. Install Mattermost using `one of the guides above <https://docs.mattermost.com/install/ee-install.html#installing-enterprise-edition>`__.
3. Migrate the database used by GitLab Mattermost for your new Enterprise Edition instance.
4. (Optional) Set up `GitLab slash command integration <https://docs.gitlab.com/ee/user/project/integrations/mattermost_slash_commands.html>`__ with your Mattermost instance.

If you need to migrate Team Edition prior to install, `please follow the migration guide <https://docs.mattermost.com/onboard/migrating-to-mattermost.html>`__.

Upgrading Enterprise Edition to a newer version
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Upgrade a previous version of Mattermost Enterprise Edition to a later version by following the `upgrade procedure <https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html>`__.

Converting Team Edition to Enterprise Edition
----------------------------------------------

From Mattermost v5.27 on, if you're running a Linux system with x86-64 architecture, you can convert Team Edition to Enterprise in the System Console using a built-in conversion utility. This tool is recommended if you'd like to run an Enterprise trial or want to upgrade to Enterprise or Professional on standalone servers.

.. note::

  * If you're using Mattermost in a managed environment, such as GitLab Omnibus, and want to start an Enterprise Edition trial, you can use this tool. However if you plan to upgrade permanently and scale your production environment, we strongly recommend installing a new standalone server and following the appropriate `migration process <https://docs.mattermost.com/onboard/migrating-to-mattermost.html>`_.
  * If you're using a modified version of Mattermost, using this tool will overwrite your changes and replace them with the official Enterprise Edition binary.
  * For versions prior to v5.27, please follow `these upgrade instructions <https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html#upgrading-team-edition-to-enterprise-edition>`_.

Navigate to **Product menu > System Console > Edition and License** and select **Upgrade to Enterprise Edition**.

During the upgrade process, the Mattermost Enterprise Edition binary file that matches your current server version is downloaded, decompressed, and extracted. The Team Edition binary is then replaced by the Enterprise Edition version. Once this process is complete, you're prompted to restart your server.

The Mattermost version listed in **Product menu > System Console > Edition and License** will change from **Team Edition** to **Enterprise Edition**, and you can now activate an Enterprise Edition trial or upload a license.

Permissions and limitations
~~~~~~~~~~~~~~~~~~~~~~~~~~~

If you're using a package manager, such as GitLab Omnibus, to manage your Mattermost installation the Mattermost system user won't have sufficient permissions to perform the upgrade. If this is the case, you'll need to change the file permissions manually.

Changing the permissions in this way doesn't affect your Mattermost deployment or impact any data. The permission change is done solely for the upgrade.

To change the permissions using the command line on the Mattermost server, you need access to the command line tool as *mattermost* user. 
Open the command line tool on the Mattermost server and ``cd`` to the Mattermost installation directory. Run the following commands (replacing ``<PathToBinaryFile>`` with the appropriate path - typically ``/opt/mattermost/bin/mattermost``) to change the ownership of the binary file to *mattermost* user and grant write access:

.. code-block:: none

  chown mattermost <PathToBinaryFile>
  chmod +w <PathToBinaryFile>

In the Mattermost System Console, retry the upgrade. When the upgrade is complete, return to the command prompt on the Mattermost server and run the following command to restore the file permissions, replacing ``<OriginalFileOwner>`` with the appropriate value:

.. code-block:: none

  chown <OriginalFileOwner> <PathToBinaryFile>
  chmod -w <PathToBinaryFile>

Note that automated updates or actions performed by other System Admins after the conversion can overwrite the changes, possibly reverting the system to Team Edition. This includes the ``run gitlab-ctl configure`` command to update Mattermost within GitLab Omnibus. If this occurs, you won't be able to use Enterprise Edition features until converting the server back, but none of your data will be affected.

Troubleshooting
~~~~~~~~~~~~~~~~

Mattermost has reverted to Team Edition
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

If you converted Team Edition to Enterprise Edition on a managed deployment and then upgraded, the upgrade will have overwritten Enterprise Edition with the latest version of Team Edition.

You can convert to Enterprise Edition again by following the steps above. If you plan to use Mattermost Enterprise Edition permanently, we recommend migrating your server to a self-hosted one.

The manual process reset my file permissions
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

If you manually changed your file permissions, you can change them back.

1. Open the command line tool on the Mattermost server.
2. ``cd`` to the Mattermost installation directory (typically ``/opt/mattermost/bin/mattermost``).
3. Enter: 

.. code-block:: none
  
  chown <OriginalFileOwner> <PathToBinaryFile>
  chmod -w <PathToBinaryFile>

File permissions error
^^^^^^^^^^^^^^^^^^^^^^^

If your Mattermost deployment is part of a managed package you may receive file permissions errors and the upgrade will fail. You can edit the permissions settings manually:

1. Open the command line tool on the Mattermost server.
2. ``cd`` to the Mattermost installation directory (typically ``/opt/mattermost/bin/mattermost``).
3. Enter: 

.. code-block:: none

  chown <OriginalFileOwner> <PathToBinaryFile>
  chmod -w <PathToBinaryFile>

Incompatible system architecture
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

This tool is currently only compatible with Linux systems using x86-64 architecture. If you’re running Mattermost on a different architecture, please follow the manual upgrade process.

Can’t retrieve Enterprise Edition binary file
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

If the upgrade fails due to file retrieval failure, unavailable binary, or connectivity error, please check your proxy settings and try again. If the problem persists, follow the manual upgrade process instead.

source/install/desktop-msi-installer-and-group-policy-install.rst METASEP
.. _desktop-msi-gpo:

Desktop MSI installer and group policy installation guides (beta) 
==================================================================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This guide provides steps to install the MSI and use Group Policies in Windows Professional or Enterprise. The MSI installer package can be downloaded `here <https://github.com/mattermost/desktop/releases/tag/v5.1.1>`_. 

.. note::
    The Mattermost MSI installer and Group Policy (GPO) definitions are in Beta. If you are using this installer or GPOs and have feedback, particularly if you are an organization executing remote deployments, please contact us in the `MSI Installer channel on our Community server <https://community.mattermost.com/core/channels/msi-installer>`_ or on our `community forum <https://forum.mattermost.com/>`_. We hope to promote this installer out of Beta when the known issues are addressed and we are confident that the various deployment scenarios expected in production environments are tested sufficiently with the help of organizations using this Beta. Feedback is highly appreciated.

.. contents::
    :backlinks: top

Download group policy and MSI installer files
----------------------------------------------

1. Using a newly created Windows VM or dedicated Windows computer, make sure to use a Windows version that supports ``Edit group policy`` out of the box (i.e. Windows 10 Pro or Enterprise).

   .. image:: ../images/desktop/msi_gpo/msi_gpo_installation_test_00001.png
      :alt: When downloading group policy and MIS installer files, ensure to use a Windows version that supports Edit group policy. 

2. Navigate to the `Mattermost Desktop <https://github.com/mattermost/desktop>`__ repo on `Github.com <https://github.com/>`__.

   .. image:: ../images/desktop/msi_gpo/msi_gpo_installation_test_00002.png
      :alt: Go to the mattermost/desktop repository on GitHub.

3. Navigate to the release page for `version v5.1.1 <https://github.com/mattermost/desktop/releases/tag/v5.1.1>`__ and download the appropriate installer for your version of Windows (32-bit vs. 64-bit).

4. Download the `source.zip <https://github.com/mattermost/desktop/archive/v5.1.1.zip>`__ file as well to extract group policy files.

   .. image:: ../images/desktop/msi_gpo/msi_gpo_installation_test_00003.png
      :alt: In the mattermost/desktop repository on GitHub, go to the release page for the latest desktop release, then download the installer for your version of Windows. Download the source.zip file as well to extract group policy files.

Instal group policy files locally
---------------------------------

1. Browse to the folder the above files were downloaded to and unzip the ``desktop-5.1.1.zip`` file in place.

   .. image:: ../images/desktop/msi_gpo/msi_gpo_installation_test_00004.png
      :alt: Go to the install download directory on your machine and unzip the ZIP file.

2. Navigate to the unzipped ``desktop-5.1.1\resources\windows\gpo`` folder and copy the contents.

   .. image:: ../images/desktop/msi_gpo/msi_gpo_installation_test_00005.png 
      :alt: Go to the \resources\windows\gpo directory and copy its contents.

3. Navigate to the ``C:\Windows\PolicyDefinitions`` folder and paste the files copied in the last step. 

   .. image:: ../images/desktop/msi_gpo/msi_gpo_installation_test_00006.png
      :alt: Go to the Windows\PolicyDefinitions directory and paste the files you copied in the previous step.

4. Verify the ``mattermost.admx`` file is in the ``C:\Windows\PolicyDefinitions`` folder.

   .. image:: ../images/desktop/msi_gpo/msi_gpo_installation_test_00007.png
      :alt: Verify the mattermost.admx file is present in the Windows\PolicyDefinitions directory.

5. Verify the ``mattermost.adml`` file is in the ``C:\Windows\PolicyDefinitions\en-US`` folder.

   .. image:: ../images/desktop/msi_gpo/msi_gpo_installation_test_00008.png
      :alt: Verify the mattermost.adml file is present in the Windows\PolicyDefinitions\en-US directory.

.. note::

   * ``\\FQDNDomain\sysvol\FQDNDomain\Policies\PolicyDefinitions`` can be used instead of ``C:\Windows\PolicyDefinitions`` if available.
   * ``\\FQDNDomain\sysvol\FQDNDomain\Policies\PolicyDefinitions\en-US`` can be used instead of ``C:\Windows\PolicyDefinitions\en-US`` if available.

Configure Mattermost using group policy settings
-------------------------------------------------

1. Run the ``Edit group policy`` application by selecting ``Start``, typing ``gpedit`` into the search field, then selecting the resulting ``Edit group policy`` search option.

   .. image:: ../images/desktop/msi_gpo/msi_gpo_installation_test_00009.png
      :alt: When configuring Mattermost using group policy settings, run the Edit group policy application by going to Start, typing gpedit into the search field, then selecting the resulting Edit group policy search option.

2. In the ``Edit group policy`` window, navigate to ``Local Computer Policy\Computer Configuration\Administrative Templates\Mattermost``. In this example, double-click on ``DefaultServerList`` to set one or more default servers that will appear on app launch. 

   .. image:: ../images/desktop/msi_gpo/msi_gpo_installation_test_00010.png
      :alt: In the Edit group policy window, go to Local Computer Policy > Computer Configuration > Administrative Templates > Mattermost. To set one or more default servers to appear on app launch, for example, double-click on DefaultServerList to begin.

3. In the resulting window for ``DefaultServerList``, select **Enabled** to turn the feature on, then select the **Show…** button in the **Options:** section of the window to add default servers.

   .. image:: ../images/desktop/msi_gpo/msi_gpo_installation_test_00011.png
      :alt: In the DefaultServerList window, enable the feature, then select Show..., located under Options, to add the default servers.

4. In the resulting window, add desired Mattermost servers using a memorable name (i.e., Community) and the web URL of the Mattermost server (i.e., https://community.mattermost.com).

5. Select **OK** twice, then close the **Edit group policy** app.

   .. image:: ../images/desktop/msi_gpo/msi_gpo_installation_test_00012.png
      :alt: Add the default servers by name and by URL, then select OK twice to close the Edit group policy application.

Verify group policy settings have been applied
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Open up the ``Registry Editor`` by selecting **Start**, typing ``Registry Editor`` in the search field, then selecting the **Registry Editor** option in the search results.

   .. image:: ../images/desktop/msi_gpo/msi_gpo_installation_test_00013.png
      :alt: When verifying group policy settings, open the Registery Editor by going to Start, typing Registry Editor into the search field, then selecting the resulting Registry Editor search option.

2. In the **Registry Editor** window, navigate to ``Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Mattermost\DefaultServerList`` and verify the servers you added using the **Edit group policy** app are listed.

3. Once verified, close the **Registry Editor**.

   .. image:: ../images/desktop/msi_gpo/msi_gpo_installation_test_00014.png
      :alt: Go to Computer > HKEY_LOCAL_MACHINE > SOFTWARE > Policies > Mattermost > DefaultServerList to veryfiy the servers you added, then close the Registry Editor.

Install the Mattermost Desktop App using the MSI installer
------------------------------------------------------------

1. Within the folder the MSI installer was downloaded to, double-click on the MSI installer to begin the Mattermost Desktop installation process.

   .. image:: ../images/desktop/msi_gpo/msi_gpo_installation_test_00015.png
      :alt: Go to the folder where you downloaded the Mattermost Desktop App, and double-click on the MSI file to begin the installation process.

2. Installation of the MSI requires admin permission, so accept the resulting request to allow the installer to make changes to your device.

   .. image:: ../images/desktop/msi_gpo/msi_gpo_installation_test_00016.png
      :alt: You'll be prompted to allow the Mattermost Desktop App to make changes to your system. You must select Yes to continue with the installation process.

3. Select ``Finish`` when the installation is complete.

   .. image:: ../images/desktop/msi_gpo/msi_gpo_installation_test_00017.png
      :alt: When the installation is complete, select Finish.

Verify group policy settings in the installed desktop app
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Launch the newly installed Mattermost app from the **Start** menu.

2. Verify the app loads the first server you defined in the **Edit group policy** app.

   .. image:: ../images/desktop/msi_gpo/msi_gpo_installation_test_00018.png
      :alt: Verify group policy settings in the Mattermost Desktop App by opening the app from the Start menu, and verifying that the app loads the first server you defined in the Edit group policy. 

Silent installation guide
-------------------------

Perform a silent installation of MSI by running the following command:

``msiexec /i mattermost-desktop-v5.1.1-x64.msi /qn``

.. note::
   You'll need to change this command as new versions of the Mattermost Desktop App are released.

source/install/desktop-custom-dictionaries.rst METASEP
Desktop App custom dictionaries
===============================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

.. |vertical-3-dots| image:: ../images/dots-vertical_F01D9.svg
  :height: 24px
  :width: 24px
  :alt: Navigate Desktop App options on Windows or Linux.

On Windows or Linux, Mattermost desktop app v4.7.1 and later supports custom dictionary definitions served through a URL. If custom dictionaries aren't specified, default dictionary definitions are obtained automatically from Chromium's CDNs (content delivery networks).

.. note::
  
  On macOS, the Mattermost desktop app uses dictionary definitions provided by Apple that can't be customized.

Prepare custom dictionaries
---------------------------

On Windows and Linux, the Mattermost desktop app uses `Hunspell Dictionary definitions <https://hunspell.github.io/>`_ by default. You can download a copy of these dictionary definitions and modify them to fit specific needs. 

To access a copy of these dictionary definitions:

1. Download a copy of ``hunspell_dictionaries.zip`` from the `latest electron release <https://github.com/electron/electron/releases/latest>`__. 

2. Extract the dictionary definitions from the ZIP file.

3. Convert the filenames to lowercase. (Chromium expects ``en-us`` rather than ``en-US``). Once renamed, these definition files match the usage of using Chromium's CDN ones, and you can modify the definitions as needed.

4. Serve the extracted and converted files from a web server, and note the URL to the root folder of the dictionaries. Specify this URL as the **alternate dictionary URL** in the desktop app.

Configure the Desktop App
-------------------------

1. In the Mattermost Desktop App, go to Settings by selecting |vertical-3-dots| **> File > Settings**. 

2. Under **App Options**, ensure that the **Check spelling** option is enabled. 

3. Select **Use an alternative dictionary URL** to specify the URL to the root folder of your custom dictionaries, then select **Save**.

Remove custom dictionaries
--------------------------

Select **Revert to default** to stop using the specified dictionary definitions, and revert to default dictionary definitions.
source/install/desktop-app-managed-resources.rst METASEP
Desktop managed resources
==========================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

The Mattermost desktop app supports managed resources. A managed resource can be any service available on the same hostname using the same protocol as the Mattermost server.

.. note::
    Using this feature requires a `custom build of the Mattermost desktop app <https://docs.mattermost.com/deploy/desktop-app.html>`_.

Add the path of a managed resource to your configuration file. When selected, it opens as a pop-up window in the Mattermost desktop app.

In addition to customizing the Mattermost Desktop App, the `Managed Resource Paths <https://docs.mattermost.com/configure/configuration-settings.html#managed-resource-paths>`_ setting on the Mattermost server must be configured.

In the below example we add the managed resource ``/video``.

.. code-block:: json

    [...]
    managedResources: ['trusted', 'video'],
    [...]

Here are two example server URLs each with valid and invalid managed resource URLs:

- Mattermost server: ``https://mattermost.my.org``

  - A valid video service: ``https://mattermost.my.org/video``

  - A valid conference service: ``https://mattermost.my.org/conference``

  - An invalid video service using a different protocol: ``http://mattermost.my.org/video``

  - An invalid conference service having a different origin: ``https://conference.my.org``

- Mattermost server: ``https://my.org/mattermost``

  - A valid video service: ``https://my.org/video``

  - A valid conference service: ``https://my.org/conference``

  - An invalid video service using a different protocol: ``http://my.org/video``
  
  - An invalid conference service having a different origin: ``https://conference.my.org``

source/install/desktop-app-install.rst METASEP
Desktop App install guides
===========================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

.. |more-icon-vertical| image:: ../images/dots-vertical_F01D9.svg
  :alt: Use the More icon in the top left corner to access Mattermost desktop apps customization settings.

The Mattermost desktop app is available for Linux, Mac, and Windows operating systems. The Desktop App supports all the features of the web experience, plus the following features:

- `Connect to multiple Mattermost servers <https://docs.mattermost.com/welcome/manage-desktop-app-server-connections.html>`__ from a single interface, and navigate between servers using keyboard shortcuts.
- `Auto-start Mattermost <https://docs.mattermost.com/welcome/customize-desktop-app-experience.html>`__ when a user logs into their machine.
- `Add Mattermost <https://docs.mattermost.com/welcome/customize-desktop-app-experience.html>`__ to the Windows Start menu, the Taskbar, the Dock, or the System Tray.
- (Windows/macOS) `Deep link to the desktop app <https://docs.mattermost.com/welcome/customize-desktop-app-experience.html>`__ via the ``mattermost://`` protocol if the app is already installed.
- (Linux) `Set up Desktop Entry <https://docs.mattermost.com/welcome/customize-desktop-app-experience.html>`__ for the application to more easily `integrate into a desktop environment <https://wiki.archlinux.org/index.php/Desktop_entries>`__.

Install and update the Mattermost desktop app
---------------------------------------------

You can `download the desktop app directly from our Downloads page <https://mattermost.com/apps/>`__. You can also use the following installation guides for Linux, Mac, and Windows.

.. tabs::

  .. tab:: Ubuntu/Debian

    A ``.deb`` package is available for Debian 9 and for Ubuntu releases 18.04 LTS or later. Automatic app updates aren’t supported. You must update your app manually.

    1. At the command line, set up the Mattermost repository on your system: 

       .. code-block:: none
    
        curl -o- https://deb.packages.mattermost.com/setup-repo.sh | sudo bash

    2. Install the Mattermost desktop app: 
    
       .. code-block:: none

        sudo apt install mattermost-desktop

    3. Update the Mattermost desktop app: 
    
       .. code-block:: none

        sudo apt upgrade mattermost-desktop

    **Snapcraft package**

    A snap is available for systems that have Snapcraft installed. Snapcraft is installed by default on Ubuntu 16.04 and later, but for most other Linux distributions you can install it manually. To install Snapcraft, see `Install snapd <https://snapcraft.io/docs/core/install>`__ on the Snapcraft website for details.

    1. At the command line, execute the following command: 
    
       .. code-block:: none

        sudo snap install mattermost-desktop --beta

    2. Run Mattermost as a desktop app.

    .. tip:: 
      You can review the current version of your Desktop App by selecting the **More** |more-icon-vertical| icon located in the top left corner of the Mattermost window, then selecting **Help > Version...**.

  .. tab:: CentOS/RHEL

    Beta ``.rpm`` packages are available for CentOS and RHEL 7 and 8. Automatic app updates aren't supported. You must update your app manually.

    **Install the Mattermost Desktop App**

    1. Download the latest version of the Mattermost desktop app:

      - 64-bit systems `mattermost-desktop-5.1.1-linux-x86_64.rpm <https://releases.mattermost.com/desktop/5.1.1/mattermost-desktop-5.1.1-linux-x86_64.rpm>`__
      - 32-bit systems `mattermost-desktop-5.1.1-linux-i686.rpm <https://releases.mattermost.com/desktop/5.1.1/mattermost-desktop-5.1.1-linux-i686.rpm>`__

    2. At the command line, execute one of the following commands based on the package you downloaded:

      - 64-bit systems:
      
        .. code-block:: none

          sudo rpm -i mattermost-desktop-5.1.1-linux-x86_64.rpm

      - 32-bit systems:
      
        .. code-block:: none
        
          sudo rpm -i mattermost-desktop-5.1.1-linux-i686.rpm

    3. Run Mattermost as a desktop app.

    **Manually update the Desktop App**

    - 64-bit systems:
    
      .. code-block:: none

        sudo rpm -u mattermost-desktop-5.1.1-linux-x86_64.rpm

    - 32-bit systems:
    
      .. code-block:: none
 
        sudo rpm -u mattermost-desktop-5.1.1-linux-i686.rpm

    .. tip:: 
      You can review the current version of your desktop app by selecting the **More** |more-icon-vertical| icon located in the top left corner of the Mattermost window, then selecting **Help > Version...**.

  .. tab:: Generic Linux

    A beta AppImage distribution of a compressed tarball is available. Automatic app updates aren’t supported. You must update your app manually. 

    1. Download the latest version of the Mattermost desktop app:

      - 64-bit systems: `mattermost-desktop-5.1.1-linux-x64.tar.gz <https://releases.mattermost.com/desktop/5.1.1/mattermost-desktop-5.1.1-linux-x64.tar.gz>`__
      - 32-bit systems: `mattermost-desktop-5.1.1-linux-ia32.tar.gz <https://releases.mattermost.com/desktop/5.1.1/mattermost-desktop-5.1.1-linux-ia32.tar.gz>`__

    2. Extract the archive to a convenient location, then execute ``mattermost-desktop`` located inside the extracted directory.

    3. To create a Desktop launcher, open the file ``README.md``, and follow the instructions in the **Desktop launcher** section.

  .. tab:: macOS

    MacOS 10.15+ is required. You have two ways to install the desktop app, and how you install the app determines whether it updates automatically.

    **Install from the App Store**

    We recommend that you install the desktop app from the `App Store <https://apps.apple.com/app/mattermost-desktop/id1614666244>`__. When you install through the App Store, your desktop app updates automatically when a new release is available.

    **Download the Desktop App from GitHub**

    You can `download the desktop app directly from our GitHub release page <https://github.com/mattermost/desktop/releases>`__. However, when you install the desktop app this way, you can't manually check for updates, and updates won't be installed automatically.
    
    1. Download the latest version of the Mattermost desktop app:
      
      - `Intel systems <https://releases.mattermost.com/desktop/5.1.1/mattermost-desktop-5.1.1-mac-x64.dmg>`__
      - `M1 systems <https://releases.mattermost.com/desktop/5.1.1/mattermost-desktop-5.1.1-mac-m1.dmg>`__ (Beta)

    2. Double-click the download to open the disk image.

    3. Drag the Mattermost application to the **Applications** folder.

    .. tip:: 
      You can review the current version of your desktop app by selecting **Mattermost > About Mattermost** from the macOS menu bar. 

  .. tab:: Windows

    Windows 8.1+ is required. Automatic app updates are supported and enabled. When a new version of the desktop app is released, your app updates automatically.

    **Install the Mattermost Desktop App**

    1. Download the latest version of the Mattermost desktop app: `32/64-bit version of Windows <https://releases.mattermost.com/desktop/5.1.1/mattermost-desktop-setup-5.1.1-win.exe>`__
    2. From the **\Downloads** folder, right-click on the file ``mattermost-desktop-setup-5.1.1-win.exe``, then select **Open** to start an installer for the app. Once finished, the Mattermost desktop app opens automatically.

    **MSI Installer and group policies (beta)**

    You can download the latest version of the Mattermost desktop app MSI installer (Beta):

    - MSI for `64-bit version of Windows <https://releases.mattermost.com/desktop/5.1.1/mattermost-desktop-5.1.1-x64.msi>`__
    - MSI for `32-bit version of Windows <https://releases.mattermost.com/desktop/5.1.1/mattermost-desktop-5.1.1-x86.msi>`__

    The following group policies are available:

    +--------------------------+------------------------------------------------------------+----------------------+----------------------------+------------------+
    | Group policy             | Description                                                | Mattermost release   | Setting                    | State options    |
    +==========================+============================================================+======================+============================+==================+
    | Enable Server Management | If disabled, management of servers in the                  | v4.3 or later        | ``EnableServerManagement`` | - Not Configured |   
    |                          | app settings are disabled.                                 |                      |                            | - Enabled        |
    |                          |                                                            |                      |                            | - Disabled       |
    +--------------------------+------------------------------------------------------------+----------------------+----------------------------+                  |
    | Default Server List      | Define one or more default, permanent servers.             | v4.3 or later        | ``DefaultServerList``      |                  |
    +--------------------------+------------------------------------------------------------+----------------------+----------------------------+                  |
    | Automatic Updates        | If disabled, automatic Desktop App updates are disabled.   | v5.1 or later        | ``EnableAutoUpdates``      |                  |
    +--------------------------+------------------------------------------------------------+----------------------+----------------------------+------------------+

    **Disable automatic updates**      
    
    Automatic desktop app updates can be disabled by configuring the supported group policy. See the `MSI installer and group policy documentation <https://docs.mattermost.com/install/desktop-msi-installer-and-group-policy-install.html>`__ for instructions on installing the Mattermost Desktop App via an MSI installer, and configuring supported group policies. Changes to group policies require you to restart Mattermost for those changes to take effect.
    
Additional documentation resources
----------------------------------

The following additional documentation resources are also available for the Mattermost desktop app:

- `Desktop App changelog <https://docs.mattermost.com/install/desktop-app-changelog.html>`__
- `Minimum software requirements <https://docs.mattermost.com/install/software-hardware-requirements.html#desktop-apps>`__
- `Configure your Desktop App experience <https://docs.mattermost.com/welcome/customize-desktop-app-experience.html>`__
- `Source code <https://github.com/mattermost/desktop>`__
- `Contributor’s guide <https://developers.mattermost.com/contribute/desktop>`__

Troubleshooting your Desktop App installation
----------------------------------------------

"Installation has failed" dialog
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The app data might be corrupted. Remove all the files in ``%LOCALAPPDATA%\mattermost``, then try reinstalling the app.
    
"The application "Mattermost" can't be opened" dialog
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

On macOS Catalina, this dialog can be triggered if the Mac Archive Utility is the default method for decompressing files. In this case using a third-party tool such as `Keka <https://www.keka.io>`__ or `Unarchiver <https://macpaw.com/the-unarchiver>`__ may resolve the problem.

Desktop App window is black and doesn't load the page
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. First, make sure you have installed the latest desktop app version.
2. Clear your cache and reload the app from **View > Clear Cache and Reload** or press :kbd:`Ctrl` :kbd:`Shift` :kbd:`R` on Windows or Linux, or :kbd:`⌘` :kbd:`⇧` :kbd:`R` on Mac.
3. Quit the app and restart it to see if the issue clears.
4. Disable GPU hardware acceleration from **File > Settings** on Windows and Linux or **Mattermost > Settings** on macOS, and unselect **Use GPU hardware acceleration**.
5. If you are using a special video driver, such as Optimus, try disabling it to see if the problem is resolved.

If none of the above steps resolve the issue, please open a new ticket in the `Mattermost Troubleshooting Forum <https://forum.mattermost.com/t/how-to-use-the-troubleshooting-forum/150>`__.

Desktop App is not visible, but the Mattermost icon is in the Task Bar
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This issue can occur on Windows in a multiple-monitor setup. When you disconnect the monitor that Mattermost is displayed on, Mattermost continues to display at screen coordinates that no longer exist.

To resolve this issue, you can reset the desktop app screen location by deleting the screen location file. When the file is not present, the desktop app displays on the primary monitor by default.

To reset the desktop app screen location:

1. If the desktop app is running, right-click the Mattermost icon in the task bar, then select **Close Window**.
2. Open Windows File Explorer, and go to the ``%APPDATA%\\Mattermost`` folder.
3. Delete the file ``bounds-info.json``.

Desktop App constantly refreshes the page
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This issue can occur when ``localStorage`` has an unexpected state. To resolve the issue:

- Windows: Open Windows File Explorer, go to the ``%APPDATA%\Mattermost`` folder, then delete the ``Local Storage`` folder.
- Mac: Open Finder, go to the ``~/Library/Application Support/Mattermost`` folder, then delete the ``Local Storage`` folder.
- Linux: Open the File Manager, go to the ``~/.config/Mattermost`` folder, then delete the ``Local Storage`` folder. Linux file managers may hide folders starting with a period by default. You can delete them from the terminal using ``rm -rf ~/.config/Mattermost``.
      
Desktop App constantly asks to log in to Mattermost server
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This issue can occur after a crash or unexpected shutdown of the desktop app that causes the app data to be corrupted. To resolve the issue:

- Windows: Open Windows File Explorer, go to the ``%APPDATA%\\Mattermost`` folder, then delete the ``IndexedDB`` folder and the ``Cookies`` and ``Cookies-journal`` files.
- Mac: Open Finder, go to the ``~/Library/Application Support/Mattermost`` folder, then delete the ``IndexedDB`` folder and the ``Cookies`` and ``Cookies-journal`` files.
- Linux: Open the file manager, go to the ``~/.config/Mattermost`` folder, then delete the ``IndexedDB`` folder and the ``Cookies`` and ``Cookies-journal`` files. Linux file managers may hide folders starting with a period by default. You can delete them from the terminal using ``rm -rf ~/.config/Mattermost``.

"Internal error: BrowserWindow 'unresponsive' event has been emitted"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Selecting **Show Details** on the dialog provides logs. Ways to resolve the issue:

1. Clear the cache via **View > Clear Cache and Reload** or press :kbd:`Ctrl` :kbd:`Shift` :kbd:`R` on Windows or Linux, or :kbd:`⌘` :kbd:`⇧` :kbd:`R` on Mac.
2. Go to App Settings via **File > Settings** (or by pressing :kbd:`Ctrl` :kbd:`,` on Windows or Linux, or :kbd:`⌘` :kbd:`,` on Mac) and unselect hardware acceleration.
  
Desktop app not responsive within Citrix Virtual Apps or Desktop Environment
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Append ``Mattermost.exe;`` to the Registry Key ``HKLM\SYSTEM\CurrentControlSet\Services\CtxUvi\UviProcessExcludes`` and reboot the system.

For further assistance, review the `Troubleshooting forum <https://forum.mattermost.com/c/trouble-shoot>`__ for previously reported errors, or `join the Mattermost user community for troubleshooting help <https://mattermost.com/pl/default-ask-mattermost-community/>`__.

Report Desktop App issues
-------------------------

When reporting issues found in the Mattermost Desktop App, it's helpful to include the contents of the Developer Tools Console along with `the information on this page <https://support.mattermost.com/hc/en-us/articles/360060662492-Opening-a-Support-Ticket-for-Self-Managed-Deployments>`__. 

To access the Developer Tools Console:

1. In the menu bar, go to **View > Developer Tools for Current Tab**.
2. Select the **Console** tab.
3. Right-click the log entry, then select **Save As**.
4. Save the file, then send it along with a description of your issue.
5. Close the console to disable the Developer Tools.

You can open an additional set of developer tools for each server you have added to the desktop app. The tools can be opened by pasting this command in the Developer Tools Console you opened with the steps described above:

``document.getElementsByTagName("webview")[0].openDevTools();`` 

Windows
~~~~~~~

.. raw:: html

  <iframe width="560" height="315" src="https://www.youtube.com/embed/jnutU-g2QA8" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>

macOS
~~~~~

.. raw:: html

  <iframe width="560" height="315" src="https://www.youtube.com/embed/avKDRodDS3s" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>

To submit an improvement or correction to this documentation, select **Edit** at the top of this page.

source/install/desktop-app-changelog.rst METASEP
Desktop application changelog
==============================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Latest Mattermost Desktop App releases:

- `Release v5.1 <#id1>`_
- `Release v5.0 <#id6>`_
- `Release v4.7 <#id22>`_
- `Release v4.6 <#id40>`_
- `Release v4.5 <#id52>`_
- `Release v4.4 <#id69>`_

Release v5.1
--------------

- **v5.1.1, released 2022-06-27**
 - Upgraded to Electron v18.3.0.
 - Fixed an issue where a channel name matching the server subpath would not be navigable.
 - Fixed an issue where the ``hideOnStart`` setting didn't work.
 - Fixed an issue where the certificate error dialog box would reappear infinitely.
 - Fixed an issue where the first client certificate could not be selected.
 - Restored Windows ZIP builds.
- **v5.1.0, released 2022-05-16**
 - Original v5.1.0 release

**Download Binaries:** `Mattermost Desktop on GitHub <https://github.com/mattermost/desktop/releases/latest>`_

**Note:** Mattermost v5.1.0 contains a low severity level security fix. Upgrading is highly recommended. Details will be posted on our `security updates page <https://mattermost.com/security-updates/>`__ 30 days after release as per the `Mattermost Responsible Disclosure Policy <https://mattermost.com/security-vulnerability-report//>`__.

Compatibility
~~~~~~~~~~~~~~~

- Desktop Apps are required to be used with any `supported Extended Support Release or a newer Mattermost server version <https://docs.mattermost.com/upgrade/release-lifecycle.html>`_.

Highlights
~~~~~~~~~~~~~~~

- Added `a Desktop App auto-updater <https://docs.mattermost.com/install/desktop-app-install.html>`_. The app now automatically checks for new updates on app start up. Note that the Mac builds provided on GitHub do not support auto-updates.

Improvements
~~~~~~~~~~~~~~~

Mac
^^^^^^
- Mattermost can now be installed on the `Mac App Store <https://apps.apple.com/app/mattermost-desktop/id1614666244>`_. Even if you’re already using Mattermost desktop on Mac, you can download and install it via the Mac App Store to access future automatic updates.

Linux
^^^^^^

- Updated the Linux closing behaviour to allow the app to close complely when pressing ``X``.
- Changed the default setting for **Leave app running in notification area when application window is closed** on Linux to ``false`` by default.

All Platforms
^^^^^^^^^^^^^

- Added the ability in Calls to select which window to share when screensharing.
- Added a new config setting "Launch app minimized" to be able to auto-launch the app minimized when the application is launched on startup.
- When the **Add Server** modal pops up for the first time when the app is launched, the modal now stays open instead of closes on mouse click until the first server has been added.
- Added a new setting/preference to always open the Desktop App in full screen.
- The app now uses ``ctrl+=`` and ``cmd+=`` to zoom in to match the behavior of Chrome and Firefox.
- Changed the wording in the **File > View** menu from ``Tab`` to ``Server`` to reflect recent changes in the user interface.
- Added the ability to copy the version string into clipboard from **Menu > Help > Version**.
- Added a menu item **Window > Show Servers** to show a list of servers.
- Removed the reference to the flashing window on the Settings page to avoid confusion when the window doesn't flash.

Architectural Changes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- Major version upgrade of Electron to v18.0.3. Electron is the underlying technology used to build the Desktop app.

Bug Fixes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Linux
^^^^^^^^^^^^^
- Fixed an issue where the app window and taskbar did not flash when notifications were received.

All Platforms
^^^^^^^^^^^^^
- Fixed an issue where customized URIs were not supported on the desktop app.
- Fixed an issue where parsed, but technically invalid URIs could not be opened in the browser.
- Fixed an issue where a channel name with an asterisk at the front would cause unreads to return a false positive.
- Fixed an issue where opening a new tab view caused the original view to go to the requested link as well.
- Fixed an issue where users could add the same server name or URL twice.
- Fixed an issue where the URL view prevented users from clicking a button directly above it.
- Fixed an issue where the tray icon theme toggle was not hidden when the icon itself wasn't enabled.
- Fixed an issue where a redundant icon was present in Windows 10+ notifications.
- Fixed an issue where unreads on a different team wouldn't trigger an unread badge in the Desktop App.
- Fixed an issue where retrying to load tabs indefinitely instead of stopping after a few tries was not supported.
- Fixed issues with the loading screen to make it more reliable.
- Fixed an issue where ``Shift+Alt`` moved the focus to the top menu.
- Fixed an issue where external links at the bottom of the page were not clickable.
- Fixed an issue where mentions/unreads did not take precedence when setting the badge/tray icon.
- Fixed an issue where the macOS dock would stay open after clicking the tray icon.
- Fixed an issue where the URL view would persist once the user had moved their mouse off of an external URL.

Known Issues
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- Mattermost Desktop App v5.1.0 cannot be launched twice on Windows servers with the role "Remote Desktop Session Host".
- Desktop App may become unresponsive and crash when initiating a screen reader `MM-44058 <https://mattermost.atlassian.net/browse/MM-44058>`_.
- Crashes might be be experienced in some Linux desktop clients. This is an upstream bug in the ``libnotifyapp`` library. A recommended workaround is to disable the system tray icon in the Desktop settings.
- On apps using GPO configurations, when adding a second server tab, it is possible to drag and drop tabs but they will jump back to the original position when releasing the mouse.

Contributors
~~~~~~~~~~~~~~

- `ChristophKaser <https://github.com/ChristophKaser>`_, `coltoneshaw <https://github.com/coltoneshaw>`_, `devinbinnie <https://github.com/devinbinnie>`_, `JulienTant <https://github.com/JulienTant>`_, `oh6hay <https://github.com/oh6hay>`_, `Profesor08 <https://github.com/Profesor08>`_, `shadowshot-x <https://github.com/shadowshot-x>`_, `streamer45 <https://github.com/streamer45>`_, `svelle <https://github.com/svelle>`_ , `Willyfrog <https://github.com/Willyfrog>`_.

Release v5.0
--------------

- **v5.0.4, release 2022-02-04**
 - Fixed an issue where Desktop App toast notifications didn't work in v5.0.3.
 - Restored **Minimize to tray** option for Windows, and added the ability to override the tray icon color.
- **v5.0.3, released 2022-02-01**
 - Fixed an issue where a user might get an erroneous "Your session has expired" error and be unable to login.
 - Fixed an issue where the app could crash while trying to reload a page that is currently loading.
 - Fixed an issue where OS-level shortcuts could cause an unexpected focus behavior in the app.
 - Fixed an issue where Linux users might not see the **Add Server** modal.
 - Fixed an issue that prevented the export channel log from being downloaded from Playbooks.
- **v5.0.2, released 2021-11-15**
 - Fixed an issue where the Desktop app crashed intermittently when switching between tabs while a tab was loading.
 - Fixed an issue where the app didn't raise the window from the tray icon when clicking on the taskbar icon.
- **v5.0.1, released 2021-10-22**
 - Fixed issue with desktop notification sounds not working correctly.
 - Fixed an issue where using a proxy server with the Desktop app caused the app to crash.
 - Fixed the new server modal not being accessible on Linux when no other servers existed.
 - Fixed an issue where switching from Boards/Playbooks to Channels caused a reload in the Channels view.
 - Fixed an issue with GPO and built-in servers not working correctly with Boards/Playbooks tabs.
 - Fixed an issue where the top bar buttons on Windows 8 were missing.
 - Reduced the size of some builds by removing unnecessary files.
- **v5.0.0, released 2021-10-13**
 - Original v5.0.0 release

**Download Binaries:** `Mattermost Desktop on GitHub <https://github.com/mattermost/desktop/releases/latest>`_

**Note:** Mattermost v5.0.0 contains a low level security fix. Upgrading is highly recommended. Details will be posted on our `security updates page <https://mattermost.com/security-updates/>`__ 30 days after release as per the `Mattermost Responsible Disclosure Policy <https://mattermost.com/security-vulnerability-report//>`__.

Compatibility
~~~~~~~~~~~~~~~

- Desktop Apps are required to be used with any `supported Extended Support Release or a newer Mattermost server version <https://docs.mattermost.com/upgrade/release-lifecycle.html>`_.

Breaking Changes / Upgrade Notes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- Some keyboard shortcuts and menu items were updated to work with the new Desktop App layout. ``Ctrl+#`` is used for changing tabs and ``Ctrl+Shft+#`` is used for changing servers.

Highlights
~~~~~~~~~~~~~~~

- Redesigned title bar allows users to seamlessly work in Channels, Playbooks, and Boards across multiple servers with minimal context switching.

Improvements
~~~~~~~~~~~~~~~

MacOS
^^^^^^
- Made the window menu on macOS more consistent with system standards.

All Platforms
^^^^^^^^^^^^^

- Added support for multiple languages to be used by the spellchecker. This can be configured in the desktop preferences.
- Updated loading screen visuals.
- Added a dark mode for settings and modals.
- Changed the server selection to use a dropdown instead of tabs.
- Added support for dragging and dropping of the server dropdown items to re-order servers.
- Converted the tabs interface to support multiple configurable tabs based on the added server to easily access Boards and Playbooks via tabs in the window header.
- Removed the **Server Management** screen from **Settings**, and added Edit/Delete buttons to the new dropdown, as users can now configure and edit their servers from the server dropdown menu.
- Added a checkbox to certificate error modal that allows users to permanently distrust a certificate.

Architectural Changes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- Major version upgrade of Electron to v14.1. Electron is the underlying technology used to build the Desktop app.
- Added a RPM build option to the Electron builder.
- Added Universal binaries for MacOS users.
- Migrated to Bootstrap v4 and refreshed the interface. Migrated to ``react-beautiful-dnd`` instead of ``react-smooth-dnd`` for a cleaner experience.

Bug Fixes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Linux
^^^^^^^^^^^^^
- Fixed the tray icon size on Linux.
- Fixed an issue where pressing ``Alt+<somekey>`` could cause the menu bar to disable and overlap the top bar on Linux.

All Platforms
^^^^^^^^^^^^^
- Fixed an issue where resizing the app while in the System Console caused a white bar to appear at the top.
- Fixed an issue where the right-click menu was missing from the ``jira connect`` modal.
- Fixed an issue where the app would render off screen and the user would have trouble getting the window in view.

Known Issues
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- Unread messages icon may be missing from the taskbar on Windows following 4.7.0 upgrade `MM-37807 <https://mattermost.atlassian.net/browse/MM-37807>`_.
- Crashes might be be experienced in some Linux desktop clients. This is an upstream bug in the ``libnotifyapp`` library. A recommended workaround is to disable the system tray icon in the Desktop settings.
- On some Linux distros, a sandbox setting is preventing apps from opening links in the browser (see https://github.com/electron/electron/issues/17972#issuecomment-486927073). While this is fixed for most installers, it is not on the tgz. In this case manual intervention is required via ``$ chmod 4755 <installpath>/chrome-sandbox``.
- Pressing Enter multiple times during Basic Authentication causes a crash.
- On apps using GPO configurations, when adding a second server tab, it is possible to drag and drop tabs but they will jump back to the original position when releasing the mouse.

Contributors
~~~~~~~~~~~~~~

- `devinbinnie <https://github.com/devinbinnie>`_, `elsiehupp <https://github.com/elsiehupp>`_, `jtwillis92 <https://github.com/jtwillis92>`_, `koox00 <https://github.com/koox00>`_, `svelle <https://github.com/svelle>`_ , `Westacular <https://github.com/Westacular>`_, `Willyfrog <https://github.com/Willyfrog>`_

Release v4.7
--------------

**Download Binaries:** `Mattermost Desktop on GitHub <https://github.com/mattermost/desktop/releases/latest>`_

- **v4.7.2, released 2021-09-13**
 - Upgraded to Electron v12.0.16.
 - Fixed an issue where the **Add Server** screen appeared on each startup on servers with GPO.
 - Fixed an issue where the window would flash on Windows and Linux when a new mention arrived regardless of the setting to turn it on/off.
 - Added desktop notifications for followed threads.
- **v4.7.1, released 2021-08-03**
 - Mattermost v4.7.1 contains a medium level security fix. Upgrading is highly recommended. Details will be posted on our `security updates page <https://mattermost.com/security-updates/>`__ 30 days after release as per the `Mattermost Responsible Disclosure Policy <https://mattermost.com/security-vulnerability-report/>`__.
 - Added support to allow users to specify a different download location for Hunspell dictionaries.
 - Fixed an issue where the notification badge did not get cleared when reading a channel with unread messages until navigating away from the channel.
 - Fixed an issue where the top bar menu, and the minimize, maximize and close icons did not work on 4.7.0 on Windows 10 if GPU acceleration was disabled.
 - Reverted to Electron v12.0.1 to fix an issue where clicking in the searchbox to highlight search terms dragged the desktop window.
 - Fixed an issue to prevent a crash on malformed default download locations.
- **v4.7.0, released 2021-06-23**
 - Original v4.7.0 release

**Note:** Mattermost v4.7.0 contains low to medium level security fixes. Upgrading is highly recommended. Details will be posted on our `security updates page <https://mattermost.com/security-updates/>`__ 30 days after release as per the `Mattermost Responsible Disclosure Policy <https://mattermost.com/security-vulnerability-report/>`__.

Compatibility
~~~~~~~~~~~~~~~

- Desktop Apps are required to be used with any `supported Extended Support Release or a newer Mattermost server version <https://docs.mattermost.com/upgrade/release-lifecycle.html>`_.

Highlights
~~~~~~~~~~~~~~~

- Added support for Electron BrowserView, an underlying architecture change that improves performance and offers snappier interactions (i.e., less lag), lower CPU usage, and faster launch times.

Improvements
~~~~~~~~~~~~~~~

Windows
^^^^^^^^^^^^^
- Windows desktop now automatically switches between light and dark themes based on the operating system settings.

All Platforms
^^^^^^^^^^^^^
- Added a setting to specify the default desktop app download location.
- Improved the launch screen and loading indicator.
- Restored deeplinking.
- Improved the spell check dictionary to provide more accurate spelling suggestions in more languages. The spell check language is now automatically based on the operating system setting.
- Added improvements to be consistent with the use of URL and URL libraries.
- Ctrl/CMD + F functionality has been replaced with in-channel search (requires Mattermost server v5.36+).
- Updated the Content Security Policy for Desktop App to avoid warnings in the dev tools.
- On Linux and Windows, each settings menu is now in a separate window.
- Shortened the maximum length (width) for server tab names to 224px.
- Updated the menu bar and system tray icons for improved contrast.
- Removed ``libappnotify1`` as a dependency requirement in Debian installers as it's no longer shipped in Debian's Bullseye. It's still recommended to install where available.

Architectural Changes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- Major version upgrade of Electron to v12.0.10. Electron is the underlying technology used to build the Desktop app.
- Added support for Electron BrowserView.
- Added support for M1 architecture (beta) in the build pipeline.

Bug Fixes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Windows
^^^^^^^^^^^^^
- Fixed an issue where Windows desktop notifications did not auto-dismiss when another notification arrived.
- Fixed an issue on Windows where the **Pin to Taskbar** icon got lost during an upgrade.
- Fixed an issue with the MSI build that caused notifications to not open the application and navigate to the correct channel.

MacOS
^^^^^^^^^^^^^
- Fixed an issue where changing the theme from the **System Preferences** changed the tray icon, but the red/blue dot indicating unreads got removed.
- Fixed an issue where there was an invisible Mattermost icon in the top menu bar.

Linux
^^^^^^^^^^^^^
- Fixed an issue where Shift+Alt moved the focus to the main menu instead of changing keyboard layout.

All Platforms
^^^^^^^^^^^^^
- Fixed an issue where special characters were not shown for server names using GPO.
- Fixed an issue where the close/back button in permanent link media previews was missing.
- Fixed an issue where the text input focus was lost when closing the **Settings** window.
- Fixed an issue where saving the desktop app settings didn't remove the **saving** indicator in the settings window.
- Fixed an issue where the jewel indicating the number of mentions was not shown in the tab.
- Fixed an issue where the desktop linting didn't match the webapp linting.
- Fixed an issue where clicking on a notification did nothing when the wrong server tab was selected.
- Fixed an issue where users were unable to copy text from desktop **About** window.

Known Issues
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- The new spellchecker connects to Google servers for downloading updated dictionaries.
- Unread messages icon may be missing from the taskbar on Windows following 4.7.0 upgrade `MM-37807 <https://mattermost.atlassian.net/browse/MM-37807>`_.
- Clicking on **View > Find** doesn't work `MM-36606 <https://mattermost.atlassian.net/browse/MM-36606>`_.
- Right click menu is missing from the ``jira connect`` modal `MM-36032 <https://mattermost.atlassian.net/browse/MM-36032>`_.
- Search field is focused on first start of the app `MM-35249 <https://mattermost.atlassian.net/browse/MM-35249>`_.
- The ``create_desktop_file.sh`` script is removed from the .tar.gz release. As a workaround, it can be downloaded from `GitHub here <https://github.com/mattermost/desktop/blob/master/src/assets/linux/create_desktop_file.sh>`_.
- An error may occur when installing the MSI Installer on any Windows version.
- Crashes might be be experienced in some Linux desktop clients. This is an upstream bug in the ``libnotifyapp`` library. A recommended workaround is to disable the system tray icon in the Desktop settings.
- On some Linux distros, a sandbox setting is preventing apps from opening links in the browser (see https://github.com/electron/electron/issues/17972#issuecomment-486927073). While this is fixed for most installers, it is not on the tgz. In this case manual intervention is required via ``$ chmod 4755 <installpath>/chrome-sandbox``.
- Pressing Enter multiple times during Basic Authentication causes a crash.
- On apps using GPO configurations, when adding a second server tab, it is possible to drag and drop tabs but they will jump back to the original position when releasing the mouse.

Contributors
~~~~~~~~~~~~~~
- `devinbinnie <https://github.com/devinbinnie>`_, `FalseHonesty <https://github.com/FalseHonesty>`_, `nevyangelova <https://github.com/nevyangelova>`_, `petermcj <https://github.com/petermcj>`_, `wget <https://github.com/wget>`_, `Willyfrog <https://github.com/Willyfrog>`_.

Release v4.6
----------------------------

**Download Binaries:** `Mattermost Desktop on GitHub <https://github.com/mattermost/desktop/releases/latest>`_

- **v4.6.2, released 2021-01-25**

 - Fixed an issue where logging in to ``gitlab.com`` did not work on the Desktop App. `MM-31626 <https://mattermost.atlassian.net/browse/MM-31626>`_
 - Fixed an issue where macOS entitlements had not been enabled for using camera and microphone on the Desktop App for third-party plugins such as Jitsi. `MM-31987 <https://mattermost.atlassian.net/browse/MM-31987>`_

- **v4.6.1, released 2020-10-26**

 - Fixed an issue where desktop app notification sounds did not work on Desktop App v4.6.0. `MM-29921 <https://mattermost.atlassian.net/browse/MM-29921>`_

- **v4.6.0, released 2020-10-16**

 - Original v4.6.0 release

Improvements
~~~~~~~~~~~~~~~

All Platforms
^^^^^^^^^^^^^
- Added a setting to be able to select different desktop notification sounds (Requires Mattermost server v5.28+).
- ``Show Mattermost icon in the menu bar`` setting is now enabled by default for new installs on Mac, and ``Show icon in the notification area`` and ``Leave app running in the notification area when application window is closed`` settings are are now enabled by default for new installs on Ubuntu.
- The default window frame and server tabs are now used on older Windows and Linux OS versions.
- Added Russian and Ukrainian language spellcheckers.
- Added support for allowing access to managed resources.
- The same default protocols as in the server are now used in the autolink plugin.

Bug Fixes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

All Platforms
^^^^^^^^^^^^^
- Fixed an issue where the app window started as maximized when the "Start app on login" setting was enabled. The Desktop App no longer shows in the system tray and the parameter ``--hidden`` was removed. This setting is not respected when AppImage file (Unofficial) is used.
- Fixed an issue where the **Add server** modal fields were missing the right-click menu.
- Fixed an issue where users did not see the right-click menu with Copy and Paste options on the login page when using the desktop app to login to an external application.
- Fixed an issue where the URL bar was shown in the bottom left corner when hovering over a timestamp or internal links.
- Fixed an issue where a Javascript error occurred when a separate OAuth window was open.
- Fixed an issue where users were unable to resize the desktop app vertically from the top tab bar.
- Fixed an issue where some links pointing to the System Console did not work on the desktop app.

Known Issues
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Unlocking the Desktop App on macOS marks the currently viewed channel as read. `MM-31429 <https://mattermost.atlassian.net/browse/MM-31429>`_
- On Ubuntu, auto-focus is lost when using ALT+TAB to switch between windows. `MM-29705 <https://mattermost.atlassian.net/browse/MM-29705>`_
- Crashes might be be experienced in some Linux desktop clients. This is an upstream bug in the ``libnotifyapp`` library and a recommended workaround is to disable the system tray icon in the Desktop settings.
- On some Linux distros, a sandbox setting is preventing apps from opening links in the browser (see https://github.com/electron/electron/issues/17972#issuecomment-486927073). While this is fixed for most installers, it is not on the tgz. In this case manual intervention is required via ``$ chmod 4755 <installpath>/chrome-sandbox``.
- Pressing Enter multiple times during Basic Authentication causes a crash.
- On apps using GPO configurations, when adding a second server tab, it is possible to drag and drop tabs but they will jump back to the original position when releasing the mouse.

Contributors
~~~~~~~~~~~~~~~

Many thanks to all our contributors. In alphabetical order:

- `devinbinnie <https://github.com/devinbinnie>`_, `dpanic <https://github.com/dpanic>`_, `jekill <https://github.com/jekill>`_, `jupenur <https://github.com/jupenur>`_, `M-ZubairAhmed <https://github.com/M-ZubairAhmed>`_, `nevyangelova <https://github.com/nevyangelova>`_, `rvillablanca <https://github.com/rvillablanca>`_, `wget <https://github.com/wget>`_, `Willyfrog <https://github.com/Willyfrog>`_.


Release v4.5
----------------------------

**Download Binaries:** `Mattermost Desktop on GitHub <https://github.com/mattermost/desktop/releases/tag/v4.5.4>`_

- **v4.5.4, released 2020-09-11**

 - Fixed an issue where Help and Report a Problem website links configured to point to Mattermost channels didn't work. `MM-28595 <https://mattermost.atlassian.net/browse/MM-28595>`_

- **v4.5.3, released 2020-08-25**

 - Fixed an issue where users were unable to log in to the desktop app when users had to select a certificate for authentication that requires a pin even when there was only one option to manage a certificate login. `MM-27331 <https://mattermost.atlassian.net/browse/MM-27331>`_

- **v4.5.2, released 2020-07-20**

 - Fixed an issue on Linux app started as a blank screen when both “Show icon in the notification area" and "Start app on login" were enabled. `MM-26832 <https://mattermost.atlassian.net/browse/MM-26832>`_

- **v4.5.1, released 2020-07-13**

 - Mattermost v4.5.1 contains a high level security fix. `Upgrading <https://docs.mattermost.com/administration/upgrade.html>`__ is highly recommended. Details will be posted on our `security updates page <https://mattermost.com/security-updates/>`__ 30 days after release as per the `Mattermost Responsible Disclosure Policy <https://mattermost.com/security-vulnerability-report/>`__.

- **v4.5.0, released 2020-06-16**

 - Original v4.5.0 release

Improvements
~~~~~~~~~~~~~~~

All Platforms
^^^^^^^^^^^^^

- Added a spell checker for Polish language. 
- Added support for triggering a desktop notification when a file download is complete.
- Added support for the cursor focus to be on the Server Name field when clicking on the ``+`` tab to add a new server.
- Defaulted "Flash app window and taskbar icon when a new message is received" setting to ``True``.

Mac
^^^^^^^^^^^^^

- On Mac, a closed window now reopens with ``CMD+Tab`` keyboard shortcut.

Architectural Changes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- Major version upgrade of Electron to v7.0.0. Electron is the underlying technology used to build the Desktop apps.

Bug Fixes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

All Platforms
^^^^^^^^^^^^^

- Fixed an issue where the Desktop app could not authenticate with SAML with an IdP relay.
- Fixed an issue where a moved server tab did not stay in focus.
- Fixed an issue where right-clicking and then clicking "Save Image" didn't work.
- Fixed an issue where trusting self-signed certificates kept asking for trust.
- Fixed an issue where a link to the root of a server caused a "Channel not Found" error if the URL didn't end with a ``/``.
- Fixed an issue where using ESC or Cancel to close the Add Server modal did not return focus to previously selected text input.
- Fixed an issue where OneLogin links opened up in the app itself making it impossible to go back to the app.
- Fixed an issue where links on "Cannot connect to Mattermost" error didn't work.

Windows
^^^^^^^^^^^^^
- Fixed an issue where Windows Desktop notifications were delayed compared to other notification channels.
- Fixed an issue where Windows Desktop Menu option was read as "Unlabel 0 button".
- Fixed an issue where a white bar was present on the right-hand side of the Settings screen when Add Server modal was open.

Mac
^^^^^^^^^^^^^
- Fixed an issue where double clicking the top bar no longer minimized or maximized the window.
- Fixed an issue where users were unable to reposition the app by using click, hold and drag on the left side of the header.
- Fixed an issue where server display name field lost focus when using ``CMD+Tab`` to navigate away and back to the app.
- Fixed an issue where a long server address didn't wrap correctly in the new server settings page.
- Fixed an issue where copy and pasting into Atlassian login fields pasted text in the wrong place.

Known Issues
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- A visible cursor focus is missing on the login screen directly after adding a new server via "+" to the right of the server tabs. `MM-25984 <https://mattermost.atlassian.net/browse/MM-25984>`_
- Right-click menu is missing on "Add server" modal fields. `MM-26017 <https://mattermost.atlassian.net/browse/MM-26017>`_
- Double notifications are received on Ubuntu for at-mentions. `MM-26012 <https://mattermost.atlassian.net/browse/MM-26012>`_
- The current window frame and server tabs are not styled consistently with the rest of the OS in Windows 7 or Linux. `MM-22751 <https://mattermost.atlassian.net/browse/MM-22751>`_
- Crashes might be be experienced in some linux desktop clients. This is an upstream bug in the ``libnotifyapp`` library and a recommended workaround is to disable the system tray icon in the Desktop settings.
- On some Linux distros, a sandbox setting is preventing apps from opening links in the browser (see https://github.com/electron/electron/issues/17972#issuecomment-486927073). While this is fixed for most installers, it is not on the tgz. In this case manual intervention is required via ``$ chmod 4755 <installpath>/chrome-sandbox``.
- Pressing Enter multiple times during Basic Authentication causes a crash.
- On apps using GPO configurations, when adding a second server tab, it is possible to drag and drop tabs but they will jump back to the original position when releasing the mouse.

Contributors
~~~~~~~~~~~~~~~

Many thanks to all our contributors. In alphabetical order:

- `deanwhillier <https://github.com/deanwhillier>`_, `devinbinnie <https://github.com/devinbinnie>`_, `hanzei <https://github.com/hanzei>`_, `hunterlester <https://github.com/hunterlester>`_, `JtheBAB <https://github.com/JtheBAB>`_, `jupenur <https://github.com/jupenur>`_, `justledbetter <https://github.com/justledbetter>`_, `nevyangelova <https://github.com/nevyangelova>`_, `wget <https://github.com/wget>`_, `Willyfrog <https://github.com/Willyfrog>`_.

Release v4.4
----------------------------

**Download Binaries:** `Mattermost Desktop on GitHub <https://github.com/mattermost/desktop/releases/tag/v4.4.2>`_

- **v4.4.2, released 2020-05-11**

 - Fixed an issue on Windows where a channel was marked as read if the app was closed on a channel where the message was posted. `MM-23215 <https://mattermost.atlassian.net/browse/MM-23215>`_

- **v4.4.1, released 2020-04-22**

 - Fixed an issue where the Desktop client opened to a blank white Window when using GPO-set teams. `MM-23082 <https://mattermost.atlassian.net/browse/MM-23082>`_
 - Fixed an issue where Google oAuth with Gmail addresses did not work on the Desktop app for plugins. `MM-23057 <https://mattermost.atlassian.net/browse/MM-23057>`_
 - Fixed an issue where Windows Desktop notifications were delayed. `MM-22552 <https://mattermost.atlassian.net/browse/MM-22552>`_
 - Fixed an issue where the app sometimes didn't restore to the right position but "jumped" to a different place in the display when minimizing the app and then maximizing it. `MM-23195 <https://mattermost.atlassian.net/browse/MM-23195>`_
 - Fixed an issue where users were not able to paste text into the login screen. `MM-23784 <https://mattermost.atlassian.net/browse/MM-23784>`_
 - Fixed an issue where back/forward navigation on the OAuth window caused the app to crash. `MM-23153 <https://mattermost.atlassian.net/browse/MM-23153>`_

- **v4.4.0, released 2020-02-16**

 - Original v4.4.0 release

**Note:** Mattermost v4.4.0 contains low to medium level security fixes. `Upgrading <https://docs.mattermost.com/administration/upgrade.html>`__ is highly recommended. Details will be posted on our `security updates page <https://mattermost.com/security-updates/>`__ 30 days after release as per the `Mattermost Responsible Disclosure Policy <https://mattermost.com/security-vulnerability-report/>`__.

**Breaking Changes** 

- Due to moving to a new configuration version to support the new tabbar for the ability to rearrange the server tab order, it is recommended to do a backup of previous config if you want to downgrade your Desktop App version afterwards.

Improvements
~~~~~~~~~~~~~~~

All Platforms
^^^^^^^^^^^^^

- Added support for Certificate Authentication, including PIV Card authentication.
- Improved server tab organization and visuals with the ability to reorder server tabs via drag-and-drop, notification updates that make it easier to tell when new messages or mentions come in, and a new dark theme.
- Added a spell checker for Italian language.
- Added auto focus on Server Display Name input field.

Architectural Changes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- Major version upgrade of Electron to v6.0.0. Electron is the underlying technology used to build the Desktop apps.

Bug Fixes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

All Platforms
^^^^^^^^^^^^^

- Fixed an issue where downgrading the app caused login issues.
- Fixed an issue where Ctrl+C or Ctrl+V didn't work on Electron modals or developer tools.
- Fixed an issue where navigation with Ctrl/Cmd+Tab stopped on disconnected server.
- Fixed an issue where a new desktop window was created after clicking on a permalink to a channel on a different server.
- Fixed an issue where changing the spellchecker on the app did not suggest words in that language.
- Fixed an issue where the app window didn't save "floating" app position.
- Fixed an issue where copying and pasting into Atlassian login fields pasted text in the wrong place.

Windows
^^^^^^^^^^^^^

- Fixed an issue where installing v4.3.1 MSI installer did not remove the previous desktop app version.
- Fixed an issue where an attachment name would lose its extension if it was edited during download.
- Fixed an issue where the unread mention badge broke with more than 100 mentions.

Mac
^^^^^^^^^^^^^

- Fixed an issue where the DMG install window user interface was missing styling.
- Updated the look of Add New Server icon on the Settings page.
- Fixed an issue where the app could not recover from a connection error after leaving a computer to sleep for a few days.

Known Issues
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- The current window frame and server tabs are not styled consistently with the rest of the OS in Windows 7 or Linux. `MM-22751 <https://mattermost.atlassian.net/browse/MM-22751>`_
- No notification on Windows if the app is closed on the channel where the message is posted. `MM-23215 <https://mattermost.atlassian.net/browse/MM-23215>`_
- Crashes might be be experienced in some linux desktop clients. This is an upstream bug in the ``libnotifyapp`` library and a recommended workaround is to disable the system tray icon in the Desktop settings.
- On some Linux distros, a sandbox setting is preventing apps from opening links in the browser (see https://github.com/electron/electron/issues/17972#issuecomment-486927073). While this is fixed for most installers, it is not on the tgz. In this case manual intervention is required via ``$ chmod 4755 <installpath>/chrome-sandbox``.
- Pressing Enter multiple times during Basic Authentication causes a crash.
- The confirmation dialog from UAC names MSI installers with random numbers.
- On apps using GPO configurations, when adding a second server tab, it is possible to drag and drop tabs but they will jump back to the original position when releasing the mouse.

Contributors
~~~~~~~~~~~~~~~

Many thanks to all our contributors. In alphabetical order:

- `allenlai18 <https://github.com/allenlai18>`_, `cpanato <https://github.com/cpanato>`_,  `deanwhillier <https://github.com/deanwhillier>`_, `devinbinnie <https://github.com/devinbinnie>`_, `hunterlester <https://github.com/hunterlester>`_, `JtheBAB <https://github.com/JtheBAB>`_, `jupenur <https://github.com/jupenur>`_, `kethinov <https://github.com/kethinov>`_, `rascasoft <https://github.com/rascasoft>`_, `Willyfrog <https://github.com/Willyfrog>`_, `xalkan <https://github.com/xalkan>`_.

Release v4.3
----------------------------

**Download Binaries:** `Mattermost Desktop on GitHub <https://github.com/mattermost/desktop/releases/tag/4.3.2>`__

- **v4.3.2, released 2019-11-29**

 - Mattermost v4.3.0 contains a low level security fix. `Upgrading <https://docs.mattermost.com/administration/upgrade.html>`__ is highly recommended. Details will be posted on our `security updates page <https://mattermost.com/security-updates/>`__ 30 days after release as per the `Mattermost Responsible Disclosure Policy <https://mattermost.com/security-vulnerability-report/>`_.
 - Fixed an issue where the app started into white screen after a system reboot on Windows. `MM-19649 <https://mattermost.atlassian.net/browse/MM-19649>`_
 - Fixed an issue where `CMD+Z` didn't undo on the Mac desktop app. `MM-19198 <https://mattermost.atlassian.net/browse/MM-19198>`_
 - Fixed an issue where users were unable to zoom in/out except on the first server tab. `MM-19032 <https://mattermost.atlassian.net/browse/MM-19032>`_
 - Fixed an issue where right-click + "Copy" did not work in some instances. `MM-19324 <https://mattermost.atlassian.net/browse/MM-19324>`_
 - Fixed an issue where email links in profile popovers didn't work. `MM-19596 <https://mattermost.atlassian.net/browse/MM-19596>`_

- **v4.3.1, released 2019-10-22**

 - Fixed an issue where Mac desktop app was not notarized correctly for installing on MacOS Catalina. `MM-19555 <https://mattermost.atlassian.net/browse/MM-19555>`_

- **v4.3.0, released 2019-10-17**

 - Original v4.3.0 release

**Note:** Mattermost v4.3.0 contains medium level security fixes. `Upgrading <https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html>`__ is highly recommended. Details will be posted on our `security updates page <https://mattermost.com/security-updates/>`__ 30 days after release as per the `Mattermost Responsible Disclosure Policy <https://mattermost.com/security-vulnerability-report/>`__.

**Breaking Change** 

The Mattermost Desktop v4.3.0 release includes a change to how desktop notifications are sent from non-secure URLs (http://). Organizations using non-secure Mattermost Servers (http://) will need to update to Mattermost Server versions 5.16.0+, 5.15.1, 5.14.4 or 5.9.5 (ESR) to continue receiving desktop notifications when using Mattermost Desktop v4.3.0 or later.

Improvements
~~~~~~~~~~~~~~~

All Platforms
^^^^^^^^^^^^^

- Added support for maintaining a user's online status while the desktop app is in the background but the user is interacting with their computer. Requires Mattermost Server v5.16.0, v5.15.1, v5.14.4 or later.
- Updated spellchecker dictionaries for English.
- Added support for exposing Webview Developer Tools via View Menu.
- Improved the styling of the session expiry mention badge in the tab bar.
- Improved the wording of the invalid certificate dialog.
- Improved accessibility support for the menu bar items.

Windows
^^^^^^^^^^^^^

- Added support for MSI installer (Beta) to allow deploying Mattermost desktop app to the computer program files (accessible by any user accounts rather than a specific user account on the machine).
- Added support for Group Policies (GPO) to allow admins to set default servers and enable/disable the ability to add/remove servers.

Mac
^^^^^^^^^^^^^

- Added a flag to enable MacOS dark mode title bar.

Architectural Changes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- Major version upgrade of Electron to v5.0.0. Electron is the underlying technology used to build the Desktop apps.

Bug Fixes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

All Platforms
^^^^^^^^^^^^^

- Fixed an issue where opening the emoji picker froze the desktop app.
- Fixed an issue where jumbo emoji didn't render for unsupported unicode emojis.
- Fixed an issue where username and password were not being passed for HTTP basic authentication.
- Fixed an issue where switching server tabs on app load caused a visual size glitch.
- Fixed various desktop app notification issues.
- Fixed an issue where the unread count changed after opening the quick switcher.
- Fixed an issue where clicking on some links in System Console opened the links on the app itself.
- Fixed an issue where the "Help" button opened in a new browser tab instead of below the textbox in the default system browser.
- Fixed an issue where Mattermost opened both on fullscreen and on a smaller window when closing the app in fullscreen.
- Fixed an issue to prevent the app from restarting in full-screen mode.
- Fixed an issue where the dot and mention counts in server tab jewels were not centered.
- Fixed an issue where the dot in notification badges was off centre.

Windows
^^^^^^^^^^^^^

- Fixed an issue where Ctrl+M shortcut minimized the Windows app and sent a message.
- Fixed an issue where clicking the tooltip button dismissed the tooltip.

Mac
^^^^^^^^^^^^^

- Fixed an issue where using the red Close button to close the window caused a blank screen when the window was maximized.
- Fixed an issue where ``Cmd + Option + Shift + v`` and ``Cmd + Shift + v`` didn't work on MacOS desktop app.
- Fixed an issue where the timezones were incorrect in OSX High Sierra.

Known Issues
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- Users are unable to zoom in/out on the desktop app. This bug will be fixed after a major version upgrade of Electron to v6.0.0.
- ``CMD+Z`` doesn't undo on the Mac desktop app.
- Unable to exit full screen Youtube videos.
- "RIght-click + Copy" does not work.
- Notifications appear in sequence rather than stacking on Windows.
- Clicking on notifications when using the MSI installer(s) doesn't focus the app or the channel that triggered the notification.

Contributors
~~~~~~~~~~~~~~~

Many thanks to all our contributors. In alphabetical order:

- `asaadmahmood <https://github.com/asaadmahmood>`_, `aswathkk <https://github.com/aswathkk>`_, `crspeller <https://github.com/crspeller>`_, `deanwhillier <https://github.com/deanwhillier>`_, `devinbinnie <https://github.com/devinbinnie>`_, `esethna <https://github.com/esethna>`_, `jespino <https://github.com/jespino>`_, `JtheBAB <https://github.com/JtheBAB>`_, `manland <https://github.com/manland>`_, `mickmister <https://github.com/mickmister>`_, `MikeNicholls <https://github.com/MikeNicholls>`_, `PeterDaveHello <https://github.com/PeterDaveHello>`_, `sethitow <https://github.com/sethitow>`_, `steevsachs <https://github.com/steevsachs>`_, `svelle <https://github.com/svelle>`_, `wget <https://github.com/wget>`_, `Willyfrog <https://github.com/Willyfrog>`_, `yuya-oc <https://github.com/yuya-oc>`_

Release v4.2.3
----------------------------

This release contains a bug fix for all platforms.

- **Release date:** August 9, 2019
- **Download Binary:** `Windows 32-bit <https://releases.mattermost.com/desktop/4.2.3/mattermost-setup-4.2.3-win32.exe>`__ | `Windows 64-bit <https://releases.mattermost.com/desktop/4.2.3/mattermost-setup-4.2.3-win64.exe>`__ | `Mac <https://releases.mattermost.com/desktop/4.2.3/mattermost-desktop-4.2.3-mac.dmg>`__ | `Linux 64-bit <https://releases.mattermost.com/desktop/4.2.3/mattermost-desktop-4.2.3-linux-x64.tar.gz>`__ 
- **View Source Code:** `Mattermost Desktop on GitHub <https://github.com/mattermost/desktop/releases/tag/v4.2.3>`__

Bug Fixes
~~~~~~~~~~~~~~~

All Platforms
^^^^^^^^^^^^^

- Fixed an issue where the server URL entry prior to v4.2.2 could include malformed URLs that failed in v4.2.2 and later due to stricter validation. https://github.com/mattermost/desktop/pull/1015

Release v4.2.2
----------------------------

This release contains a bug fix for all platforms.

- **Release date:** August 7, 2019

Bug Fixes
~~~~~~~~~~~~~~~

All Platforms
^^^^^^^^^^^^^

- Mattermost v4.2.2 contains high level security fixes. `Upgrading <https://mattermost.com/apps>`_ is recommended. Details will be posted on our `security updates page <https://mattermost.com/security-updates/>`_ 30 days after release as per the `Mattermost Responsible Disclosure Policy <https://mattermost.com/security-vulnerability-report/>`_.

Release v4.2.1
----------------------------

This release contains a bug fix for all platforms.

- **Release date:** March 20, 2019
- **Download Binary:** `Windows 32-bit <https://releases.mattermost.com/desktop/4.2.1/mattermost-setup-4.2.1-win32.exe>`__ | `Windows 64-bit <https://releases.mattermost.com/desktop/4.2.1/mattermost-setup-4.2.1-win64.exe>`__ | `Mac <https://releases.mattermost.com/desktop/4.2.1/mattermost-desktop-4.2.1-mac.dmg>`__ | `Linux 64-bit <https://releases.mattermost.com/desktop/4.2.1/mattermost-desktop-4.2.1-linux-x64.tar.gz>`__ 
- **View Source Code:** `Mattermost Desktop on GitHub <https://github.com/mattermost/desktop/releases/tag/v4.2.1>`__

Bug Fixes
~~~~~~~~~~~~~~~

All Platforms
^^^^^^^^^^^^^

- Fixed an issue where some links opened in a smaller window in the Mattermost app. This issue only affected installations with a `Site URL <https://docs.mattermost.com/administration/config-settings.html#site-url>`_ configured to use a subpath.

Release v4.2.0
----------------------------

- **Release date:** November 27, 2018
- **Download Binary:** `Windows 32-bit <https://releases.mattermost.com/desktop/4.2.0/mattermost-setup-4.2.0-win32.exe>`__ | `Windows 64-bit <https://releases.mattermost.com/desktop/4.2.0/mattermost-setup-4.2.0-win64.exe>`__ | `Mac <https://releases.mattermost.com/desktop/4.2.0/mattermost-desktop-4.2.0-mac.dmg>`__ | `Linux 64-bit <https://releases.mattermost.com/desktop/4.2.0/mattermost-desktop-4.2.0-linux-x64.tar.gz>`__ 
- **View Source Code:** `Mattermost Desktop on GitHub <https://github.com/mattermost/desktop/releases/tag/v4.2.0>`__

**Note:** Mattermost v4.2.0 contains a high level security fix. `Upgrading <https://docs.mattermost.com/administration/upgrade.html>`__ is highly recommended. Details will be posted on our `security updates page <https://mattermost.com/security-updates/>`__ 30 days after release as per the `Mattermost Responsible Disclosure Policy <https://mattermost.com/security-vulnerability-report/>`__.

Improvements
~~~~~~~~~~~~~~~

All Platforms
^^^^^^^^^^^^^

- Added English (UK), Portuguese (BR), Spanish (ES) and Spanish (MX) to the spell checker.
- Added `Ctrl/Cmd+F` shortcut to work as browser-like search.
- Preserved case of first letter in spellcheck.
- Added support for session expiry notification.

Windows
^^^^^^^^^^^^^

- Set "app start on login" preference as enabled by default and synchronized its state with config.json.

Mac
^^^^^^^^^^^^^

- Added **.dmg** package to support installation.
- Added "Hide" option to Login Items in Preferences.

Linux
^^^^^^^^^^^^^

- [tar.gz] Added support for using SVG icons for Linux application menus in place of PNG icons.
- Updated categories in order to be listed under the appropriate submenu of the application starter.
- Set "app start on login" preference as enabled by default and synchronized its state with config.json.
- Added AppImage packages as an unofficial build.

Architectural Changes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- Major version upgrade of Electron to v2.0.12. Electron is the underlying technology used to build the Desktop apps.
- Artifact names are now configured via `electron-builder.json`.

Contributors
~~~~~~~~~~~~~~~

Many thanks to all our contributors. In alphabetical order:

- `danmaas <https://github.com/danmaas>`__, `hmhealey <https://github.com/hmhealey>`__, `j1mc <https://github.com/j1mc>`__, `jasonblais <https://github.com/jasonblais>`__, `lieut-data <https://github.com/lieut-data>`__, `rodcorsi <https://github.com/rodcorsi>`__, `scherno2 <https://github.com/scherno2>`__, `sudheerDev <https://github.com/sudheerDev>`__, `svelle <https://github.com/svelle>`__, `torlenor <https://github.com/torlenor>`__, `yuya-oc <https://github.com/yuya-oc>`__

Release v4.1.2
----------------------------

This release contains a bug fix for all platforms.

- **Release date:** May 25, 2018
- **Download Binary:** `Windows 32-bit <https://releases.mattermost.com/desktop/4.1.2/mattermost-setup-4.1.2-win32.exe>`__ | `Windows 64-bit <https://releases.mattermost.com/desktop/4.1.2/mattermost-setup-4.1.2-win64.exe>`__ | `Mac <https://releases.mattermost.com/desktop/4.1.2/mattermost-desktop-4.1.2-mac.zip>`__ | `Linux 64-bit <https://releases.mattermost.com/desktop/4.1.2/mattermost-desktop-4.1.2-linux-x64.tar.gz>`__ 
- **View Source Code:** `Mattermost Desktop on GitHub <https://github.com/mattermost/desktop/tree/v4.1.2>`__

Bug Fixes
~~~~~~~~~~~~~~~

All Platforms
^^^^^^^^^^^^^

- Fixed an issue where the popup dialog to authenticate a user to their proxy or server didn't work.

Release v4.1.1
----------------------------

This release contains multiple bug fixes for Mac due to an incorrect build for v4.1.0. Windows and Linux apps are not affected.

- **Release date:** May 17, 2018
- **Download Binary:** `Windows 32-bit <https://releases.mattermost.com/desktop/4.1.1/mattermost-setup-4.1.1-win32.exe>`__ | `Windows 64-bit <https://releases.mattermost.com/desktop/4.1.1/mattermost-setup-4.1.1-win64.exe>`__ | `Mac <https://releases.mattermost.com/desktop/4.1.1/mattermost-desktop-4.1.1-mac.zip>`__ | `Linux 64-bit <https://releases.mattermost.com/desktop/4.1.1/mattermost-desktop-4.1.1-linux-x64.tar.gz>`__ 
- **View Source Code:** `Mattermost Desktop on GitHub <https://github.com/mattermost/desktop/tree/v4.1.1>`__

Bug Fixes
~~~~~~~~~~~~~~~

Each of the issues listed below are already fixed for Windows and Linux v4.1.0.

Mac
^^^^^^^^^^^^^

- Fixed an issue where right-clicking an image, then choosing "Save Image", did nothing.
- Fixed an issue that prevented typing in the form fields on the add server dialog when launched from the server tab bar.
- Fixed an issue that could cause an error message on the add new server dialog to be misleading.
- Fixed an issue where timestamps in message view showed no URL on hover.
- Fixed an issue where quitting and reopening the app required the user to log back in to Mattermost.
- Fixed an issue where adding a new server sometimes caused a blank page.
- Fixed deep linking via ``mattermost://`` protocol spawning a new copy of the Desktop App on the taskbar.
 
Release v4.1.0
--------------

Release date: May 16, 2018

Improvements
~~~~~~~~~~~~~~~

All Platforms
^^^^^^^^^^^^^

- Improved stability and performance

  - Reduced memory usage by periodically clearing cache.
  - Fixed app crashing when a server tab was drag-and-dropped to the message view.
  - Added an option to disable GPU hardware acceleration in App Settings to improve stability in some systems.
  - Fixed Windows crash issues during installation.
  - Fixed Mac and Linux crashing after toggling "Show Mattermost icon in menu bar" app setting.

- Updated design for loading animation icon.
- Improved appearance of server tabs.
- Enabled `Certificate Transparency <https://www.certificate-transparency.org/what-is-ct>`__ verification in HTTPS.

Windows
^^^^^^^^^^^^^

- [Windows 7/8] Desktop notifications now respect the duration setting set in the Control Panel.

Architectural Changes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- Major version upgrade of Electron from v1.7.13 to v1.8.4. Electron is the underlying technology used to build the Desktop apps.
- Mac download files now use Zip packages rather than tar.gz files.
- ES6 ``import`` and ``export`` now replace the ``require`` and ``modul.export`` modules for better development.
- Storybook added to more easily develop React componets without executing the desktop app.

Bug Fixes
~~~~~~~~~~~~~~~

All Platforms
^^^^^^^^^^^^^

- Fixed an issue where an incorrect spellchecker language was used for non ``en-US`` locales on initial installation.
- Fixed an issue where error page appeared when U2F device was used for multi-factor authentication through single sign-on.
- Fixed an issue where right-clicking an image, then choosing "Save Image", did nothing.
- Fixed an issue that prevented typing in the form fields on the add server dialog when launched from the server tab bar.
- Fixed an issue that could cause an error message on the add new server dialog to be misleading.

Windows
^^^^^^^^^^^^^

- Fixed an issue where ``file://`` protocol was not working. Note that localhost URLs are not yet supported.

Known Issues
~~~~~~~~~~~~~~~

All Platforms
^^^^^^^^^^^^^

- Clicking on a video preview opens another Mattermost window in addition to downloading the file.
- Insecure connection produces hundreds of log messages.

Windows
^^^^^^^^^^^^^

- App window doesn't save "floating" app position.
- [Windows 7] Sometimes app tries to render a page inside the app instead of in a new browser tab when clicking links].
- [Windows 10] Incorrect task name in Windows 10 startup list.
- Mattermost UI sometimes bleeds over a file explorer.
- When auto-starting the desktop app, the application window is included in Windows tab list.

Mac
^^^^^^^^^^^^^

- The application crashes when a file upload dialog is canceled without closing Quick Look.
- When the app auto-starts, app page opens on screen instead of being minimized to Dock.

Linux (Beta)
^^^^^^^^^^^^^

- [Ubuntu - 64 bit] Right clicking taskbar icon and choosing **Quit** only minimizes the app.
- [Ubuntu - 64 bit] Direct message notification sometimes comes as a streak of line instead of a pop up.

Contributors
~~~~~~~~~~~~~~~

Many thanks to all our contributors. In alphabetical order:

- `Autre31415 <https://github.com/Autre31415>`__, `dmeza <https://github.com/dmeza>`__, `hmhealey <https://github.com/hmhealey>`__, `jasonblais <https://github.com/jasonblais>`__, `kethinov <https://github.com/kethinov>`__, `lieut-data <https://github.com/lieut-data>`__, `lip-d <https://github.com/lip-d>`__, `mkraft <https://github.com/mkraft>`__, `yuya-oc <https://github.com/yuya-oc>`__

Release v4.0.1
--------------

Release date: March 28, 2018

This release contains multiple security updates for Windows, Mac and Linux, and it is highly recommended that users upgrade to this version.

Architectural Changes
~~~~~~~~~~~~~~~~~~~~~

- Minor version upgrade of Electron from v1.7.11 to v1.7.13. Electron is the underlying technology used to build the Desktop apps.

Bug Fixes
~~~~~~~~~~~~~~~

All Platforms
^^^^^^^^^^^^^

- Disabled Certificate Transparency verification that produced unnecessary certificate errors.

Release 4.0.0
--------------

Release date: January 29, 2018

This release contains multiple security updates for Windows, Mac and Linux, and it is highly recommended that users upgrade to this version.

Improvements
~~~~~~~~~~~~~~~

All Platforms
^^^^^^^^^^^^^

- Added a dialog to allow the user to reopen the desktop app if it quits unexpectedly.
- Mattermost animation icon is now displayed when loading a page, instead of a blank screen.
- Added a dialog to request permissions to show desktop notifications or to use microphone and video for video calls from untrusted origins.
- The "Saved" indicator now appears for both Server Management and App Options on the Settings page.
- Close button on the Settings page now has a hover effect.
- Added new admin configuration settings for:

   - Disabling server management where the user cannot add or edit the server URL.
   - Setting one or more pre-configured server URLs for the end user.
   - Customizing the link in **Help > Learn More..**.

Windows
^^^^^^^^^^^^^

- Added support for protocol deep linking where the desktop app opens via `mattermost://` link if app is already installed.
- Added the ability to more easily white-label the Mattermost taskbar icon on custom builds.

Mac
^^^^^^^^^^^^^

- Added support for protocol deep linking where the desktop app opens via `mattermost://` link if app is already installed.
- Added `Ctrl+Tab` and `Ctrl+Shift+Tab` shortcuts to switch between server tabs.
- Added the option to bounce the Dock icon when receiving a notification.

Architectural Changes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- Major version upgrade of Electron from v1.6.11 to v1.7.11. Electron is the underlying technology used to build the Desktop apps.
- The app now uses CSS to style the user interface. Styles are also divided into React's inline `style` and CSS.
- Yarn is now used to manage dependencies across Windows, Mac and Linux builds.
- Build is now run automatically before packaging the apps with `npm run package`.
- Removed hardcoded product name references.
- Added an `rm` command to `npm`, which removes all dynamically generated files to make it easy to reset the app between builds and branches.

Bug Fixes
~~~~~~~~~~~~~~~

All Platforms
^^^^^^^^^^^^^

- Fixed the close button of the Settings page not working on first installation.
- Fixed the app publisher referring to Yuya Ochiai instead of Mattermost, Inc.
- Fixed font size not always persisting across app restarts.
- Fixed an automatic reloading of the app when a DNS or network error page is manually reloaded with CTRL/CMD+R.
- Fixed an issue where changing font size caused rendering issues on next restart.
- Fixed an issue where after adding a server on the Settings page, focus remained on the "Add new server" link.
- Fixed an issue where SAML certificate file couldn't be uploaded from the file upload dialog.

Windows
^^^^^^^^^^^^^

- Fixed desktop notifications not working when the window was minimized from an inactive state.
- Fixed the uninstaller not removing all files correctly.

Mac
^^^^^^^^^^^^^

- Fixed an issue where after uploading a file, focus wasn't put back to the text box.
- Fixed a mis-aligned `+` button in the server tab bar.

Linux
^^^^^^^^^^^^^

- Fixed the main window not being minimized when the app is launched via "Start app on Login" option.

Known Issues
~~~~~~~~~~~~~~~

All Platforms
^^^^^^^^^^^^^

- Insecure connection produces hundreds of log messages.

Windows
^^^^^^^^^^^^^

- App window doesn't save "floating" app position.
- Windows 7: Sometimes the app tries to render the page inside the app instead of in a new browser tab when clicking links.
- Windows 10: Incorrect task name in Windows 10 start-up list.

Mac
^^^^^^^^^^^^^

- The application crashes when a file upload dialog is canceled without closing Quick Look.
- When the app auto-starts, app page opens on screen instead of being minimized to Dock.
- You have to click twice when a window is out of focus to have actions performed.

Linux (Beta)
^^^^^^^^^^^^^

- Ubuntu - 64 bit: Right clicking taskbar icon and choosing **Quit** only minimizes the app.
- Ubuntu - 64 bit: Direct message notification sometimes renders as a streak or line instead of a pop up.

Contributors
~~~~~~~~~~~~~~~

Many thanks to all our contributors. In alphabetical order:

 - `csduarte <https://github.com/csduarte>`__, `dmeza <https://github.com/dmeza>`__, `jasonblais <https://github.com/jasonblais>`__, `jarredwitt <https://github.com/jarredwitt>`__, `wvds <https://github.com/wvds>`__, `yuya-oc <https://github.com/yuya-oc>`__

----

Release 3.7.1
--------------

Release date: August 30, 2017

This release contains a security update for Windows, Mac and Linux, and it is highly recommended that users upgrade to this version.

Improvements and Bug Fixes
~~~~~~~~~~~~~~~~~~~~~~~~~~~

Windows
^^^^^^^^^^^^^

 - Client no longer freezes intermittently, such as when receiving desktop notifications.
 - [Windows 8.1/10] Added support for running the desktop app across monitors of different DPI.
 - [Windows 7/8] Clicking on a desktop notification now opens the message.

Release 3.7.0
--------------

Release date: May 9th, 2017

Improvements
~~~~~~~~~~~~

All Platforms
^^^^^^^^^^^^^

- Added an inline spell checker for English, French, German, Spanish, and Dutch.
- Removed an obsolete "Display secure content only" option, following an `upgrade of the Electron app to Chrome v56 <https://github.com/electron/electron/commit/2e0780308c7ef2258422efd34c968091d7cd5b65>`__.
- Reset app window position when restoring it off-screen from a minimized state.
- Improved page loading and app view rendering.

Windows
^^^^^^^^^^^^^

- [Windows 7/8] Added support for sound when a desktop notification is received.
- Removed obsolete support for Japanese fonts.
- The application window now respects 125% display resolution.

Bug Fixes
~~~~~~~~~~~~

All Platforms
^^^^^^^^^^^^^

- An extra row is no longer added after switching channels with CTRL/CMD+K shortcut.
- Fixed an issue where an unexpected extra app window opened after clicking a public link of an uploaded file.
- Fixed JavaScript errors when refreshing the page.
- Fixed vertical alignment of the Add Server "+" button in the server tab bar.

Windows
^^^^^^^^^^^^^

- Focus is now set to the next top-level window after closing the main app window.
- Fixed an issue where the app remained in the `"classic" ALT+TAB window switcher <https://www.askvg.com/how-to-get-windows-xp-styled-classic-alttab-screen-in-windows-vista-and-7/>`__ after closing the main app window.

Mac
^^^^^^^^^^^^^

- Fixed an issue where the application was not available on the Dock after a computer reboot.
- Fixed an issue where Quick Look couldn't be closed after opening the file upload dialog.

Linux (Beta)
^^^^^^^^^^^^^

- Fixed an issue where the setting was not saved after changing the tray icon theme.

Known Issues
~~~~~~~~~~~~

All Platforms
^^^^^^^^^^^^^

- `If you click twice on the tab bar, and then attempt to use the "Zoom in/out" to change font size, the app window doesn't render properly <https://github.com/mattermost/desktop/issues/334>`__
- `Holding down CTRL, SHIFT or ALT buttons and clicking a channel opens a new application window <https://github.com/mattermost/desktop/issues/406>`__
- `Unable to upload a SAML certificate file from the file upload dialog <https://github.com/mattermost/desktop/issues/497>`__

Windows
^^^^^^^^^^^^^

- [Windows 7] `Sometimes the app tries to render the page inside the app instead of in a new browser tab when clicking links <https://github.com/mattermost/desktop/issues/369>`__

Mac
^^^^^^^^^^^^^

- `After uploading a file with a keyboard shortcut, focus isn't set back to the message box <https://github.com/mattermost/desktop/issues/341>`__
- The application crashes when a file upload dialog is canceled without closing Quick Look.

Linux (Beta)
^^^^^^^^^^^^^

- [Ubuntu - 64 bit] `Right clicking taskbar icon and choosing **Quit** only minimizes the app <https://github.com/mattermost/desktop/issues/90#issuecomment-233712183>`__
- [Ubuntu - 64 bit] `Direct message notification comes as a streak of line instead of a pop up <https://github.com/mattermost/mattermost-server/issues/3589>`__

Contributors
~~~~~~~~~~~~

Many thanks to all our contributors. In alphabetical order:

- `jasonblais <https://github.com/jasonblais>`__, `jnugh <https://github.com/jnugh>`__, `yuya-oc <https://github.com/yuya-oc>`__

Thanks also to those who reported bugs that benefited the release, in alphabetical order:

- `esethna <https://github.com/esethna>`__ (`#524 <https://github.com/mattermost/desktop/issues/524>`__), `hanzei <https://github.com/hanzei>`__ (`#523 <https://github.com/mattermost/desktop/issues/523>`__)

----

Release 3.6.0
--------------

Release date: February 28, 2017

Upgrading to Mattermost server 3.6 or later is recommended, as new features for the desktop app have been added following the release of the team sidebar.

Improvements
~~~~~~~~~~~~

 - Added support for unread indicators following the release of team sidebar in Mattermost server 3.6
 - Removed a confusing CTRL/CMD+S shortcut for searching within a Mattermost team
 - Added support for SAML OneLogin and Google authentication for Enterprise users
 - Switching to a server from the system tray icon, from "Window" menu bar item, or through CTRL/CMD+{n} shortcut now works while viewing the Settings page
 - Streamlined desktop server management:

   - "Team Management" changed to "Server Management" following the release of team sidebar in Mattermost server 3.6
   - Added a "+" icon to the desktop server tab bar to more easily sign into a new Mattermost server
   - Added an option to sign in to another Mattermost server from **File > Sign in to Another Server**
   - Clicking "Add new server" on the Settings page opens a dialog instead of a new row
   - Clicking "Remove" next to a server now requires a confirmation to prevent a user from removing the server by accident
   - Clicking "Edit" next to a server on the Settings page opens a dialog
   - Clicking on a server on the Settings page opens the corresponding server tab

 - Simplified desktop app options:

   - App options now auto-save when changed
   - Added supporting help text for each option
   - Removed "Leave app running in menu bar when application window is closed" setting for Mac, which is not applicable for that platform
   - Removed "Toggle window visibility when clicking on the tray icon" setting for Windows, given the behavior is inconsistent with typical Windows app behavior
   - Removed "Hide menu bar" setting to avoid users not being able to use the menu bar and the Settings page

Bug Fixes
~~~~~~~~~~~~

All Platforms
^^^^^^^^^^^^^

- Mattermost window no longer opens on a display screen that has been disconnected
- Mention badges no longer persist after logging out of a Mattermost server
- After right-clicking an image or a link, the "Copy Link" option no longer moves around when clicking different places afterwards
- Fixed an issue where minimum window size is not set
- Changed target resolution size to 1000x700 to prevent unintended issues on the user interface
- Fixed an issue where the application menu is not updated when the config file is saved in the Settings page
- Fixed login issues with local development environment
- Removed a white screen which was momentarily displayed on startup

Windows
^^^^^^^^^^^^^

- Fixed an issue where an unexpected window appears while installing or uninstalling
- Fixed an issue where the maximized state of the application window was not restored on re-launch if "Start app on Login" setting is enabled

Linux (Beta)
^^^^^^^^^^^^^

- Fixed an issue where tray icon wasn't shown by default even when "Show icon in the notification area" setting is enabled
- Fixed an issue where the maximized state of the application window was not restored on re-launch if "Start app on login" setting is enabled

Known Issues
~~~~~~~~~~~~

All Platforms
^^^^^^^^^^^^^

 - `If you click twice on the tab bar, and then attempt to use the "Zoom in/out" to change font size, the app window doesn't render properly <https://github.com/mattermost/desktop/issues/334>`__
 - `After using CTRL+K, an added row appears in the message box <https://github.com/mattermost/desktop/issues/426>`__
 - `Holding down CTRL, SHIFT or ALT buttons and clicking a channel opens a new application window <https://github.com/mattermost/desktop/issues/406>`__

Windows
^^^^^^^^^^^^^

 - [Windows 7] `Sometimes the app tries to render the page inside the app instead of in a new browser tab when clicking links <https://github.com/mattermost/desktop/issues/369>`__

Mac
^^^^^^^^^^^^^

 - `After uploading a file with a keyboard shortcut, focus isn't set back to the message box <https://github.com/mattermost/desktop/issues/341>`__

Linux (Beta)
^^^^^^^^^^^^^

 - [Ubuntu - 64 bit] `Right clicking taskbar icon and choosing **Quit** only minimizes the app <https://github.com/mattermost/desktop/issues/90#issuecomment-233712183>`__
 - [Ubuntu - 64 bit] `Direct message notification comes as a streak of line instead of a pop up <https://github.com/mattermost/mattermost-server/issues/3589>`__

Contributors
~~~~~~~~~~~~

Many thanks to all our contributors. In alphabetical order:

 - `asaadmahmood <https://github.com/asaadmahmood>`__, `jasonblais <https://github.com/jasonblais>`__, `jnugh <https://github.com/jnugh>`__, `yuya-oc <https://github.com/yuya-oc>`__

----

Release v3.5.0
--------------

Release date: December 14, 2016

Improvements
~~~~~~~~~~~~

All Platforms
^^^^^^^^^^^^^

-  URL address is shown when hovering over links with a mouse
-  Added CTRL+SHIFT+MINUS as a shortcut for decreasing font size (zooming out)
-  Reduce upgrade issues by properly clearing cache when updating the desktop app to a new version (the application cache will be purged whenever the desktop app version changes)
-  When launching the app from the command line interface, unnecessary warning messages are no longer sent if connecting to a trusted https connection without a ``certificate.json`` file

Windows
^^^^^^^

-  Link addresses can now be copied and pasted inside the app

Bug Fixes
~~~~~~~~~

All Platforms
^^^^^^^^^^^^^

-  YouTube previews now work, even if mixed content is allowed
-  Fixed an incorrect cursor mode for "Edit" and "Remove" buttons on the Settings page
-  Fixed an issue where "Zoom in/out" settings did not properly work
-  When disconnected from Mattermost, the "Cannot connect to Mattermost" page is now properly aligned at the top of the window

Windows
^^^^^^^

-  The menu bar option for "Redo" is now properly shown as CTRL+Y

Mac
^^^

-  Fixed an issue where the default download folder was ``Macintosh HD``
-  Removed an unexpected "Show Tab Bar" menu item on macOS 10.12

Linux (Beta)
^^^^^^^^^^^^

-  Fixed an issue where the option "Leave app running in notification area when the window is closed" was never enabled.

Known Issues
~~~~~~~~~~~~

All Platforms
^^^^^^^^^^^^^

-  `If you click twice on the tab bar, and then attempt to use the "Zoom in/out" to change font size, the app window doesn't render properly <https://github.com/mattermost/desktop/issues/334>`__
-  `Direct messages cause notification icons to appear on all team tabs, which don't clear until you click on each team <https://github.com/mattermost/desktop/issues/160>`__
-  `After right-clicking an image or a link, the "Copy Link" option sometimes moves around when clicking different places afterwards <https://github.com/mattermost/desktop/issues/340>`__

Windows
^^^^^^^

-  [Windows 7] `Sometimes the app tries to render clicked linked inside the app, instead of in a new browser tab <https://github.com/mattermost/desktop/issues/369>`__

Mac
^^^

-  `After uploading a file with a keyboard shortcut, focus isn't set back to the message box <https://github.com/mattermost/desktop/issues/341>`__

Linux (Beta)
^^^^^^^^^^^^

-  [Ubuntu - 64 bit] `Right clicking taskbar icon and choosing Quit only minimizes the
   app <https://github.com/mattermost/desktop/issues/90#issuecomment-233712183>`__
-  [Ubuntu - 64 bit] `Direct message notification pop ups do not properly render <https://github.com/mattermost/mattermost-server/issues/3589>`__

Contributors
~~~~~~~~~~~~

Many thanks to all our contributors. In alphabetical order:

-  `itsmartin <https://github.com/itsmartin>`__,
   `jasonblais <https://github.com/jasonblais>`__,
   `jcomack <https://github.com/jcomack>`__,
   `jnugh <https://github.com/jnugh>`__,
   `kytwb <https://github.com/kytwb>`__,
   `magicmonty <https://github.com/magicmonty>`__,
   `Razzeee <https://github.com/Razzeee>`__,
   `yuya-oc <https://github.com/yuya-oc>`__

Thanks also to those who reported bugs that benefited the release, in alphabetical order:

- ellisd (`#383 <https://github.com/mattermost/desktop/issues/383>`__), `it33 <https://github.com/it33>`__ (`#384 <https://github.com/mattermost/desktop/issues/384>`__), `jnugh <https://github.com/jnugh>`__ (`#392 <https://github.com/mattermost/desktop/issues/392>`__), `lfbrock <https://github.com/lfbrock>`__ (`#382 <https://github.com/mattermost/desktop/issues/382>`__), `yuya-oc <https://github.com/yuya-oc>`__ (`#391 <https://github.com/mattermost/desktop/issues/391>`__)

--------------

Release v3.4.1
--------------

Release date: September 30, 2016

This release contains a security update and it is highly recommended that users upgrade to this version.

Version number updated to 3.4 to make numbering consistent with Mattermost server and mobile app releases. This change will not imply monthly releases.

-  v3.4.1, released 2016-09-30

   -  (Mac) Fixed an issue where the app window pops up second to foreground when a new message is received

-  v3.4.0, released 2016-09-22

   -  Original v3.4 release

Improvements
~~~~~~~~~~~~

All Platforms
^^^^^^^^^^^^^

-  Current team and channel name shown in window title bar
-  Team tab is bolded for unread messages and has a red dot with a count of unread mentions
-  Added new shortcuts:

   -  CTRL+S; CMD+S on Mac: sets focus on the Mattermost search box
   -  ALT+Left Arrow; CMD+[ on Mac: go to previous page in history
   -  ALT+Right Arrow; CMD+] on Mac: go to next page in history

-  Upgraded the Settings page user interface
-  The app now tries to reconnect periodically if a page fails to load
-  Added validation for name and URL when adding a new team on the Settings page

Windows
^^^^^^^

-  Added access to the settings menu from the system tray icon
-  Only one instance of the desktop application will now load at a time
-  Added an option to configure whether a red badge is shown on taskbar icon for unread messages

Mac
^^^

-  Added an option to configure whether a red badge is shown on taskbar icon for unread messages

Linux (Beta)
^^^^^^^^^^^^

-  Added an option to flash taskbar icon when a new message is received
-  Added a badge to count mentions on the taskbar icon (for Unity)
-  Added a script, ``create_desktop_file.sh`` to create ``Mattermost.desktop`` desktop entry to help `integrate the application into a desktop environment <https://wiki.archlinux.org/index.php/Desktop_entries>`__ more easily
-  Added access to the settings menu from the system tray icon
-  Only one instance of the desktop application will now load at a time

Bug Fixes
~~~~~~~~~

All Platforms
^^^^^^^^^^^^^

-  Cut, copy and paste are shown in the user interface only when the commands are available
-  Copying link addresses now work properly
-  Saving images by right-clicking the image preview now works
-  Refreshing the app page no longer takes you to the team selection page, but keeps you on the current channel
-  Fixed an issue where the maximized state of the app window was lost in some cases
-  Fixed an issue where shortcuts didn't work when switching applications or tabs in some cases

Windows
^^^^^^^

-  Removed misleading shortcuts from the system tray menu
-  Removed unclear desktop notifications when the application page fails to load
-  Fixed the Mattermost icon for desktop notifications in Windows 10
-  Fixed an issue where application icon at the top left of the window was pixelated
-  Fixed an issue where the application kept focus after closing the app window

Linux (Beta)
^^^^^^^^^^^^

-  Removed misleading shortcuts from the system tray menu
-  Removed unclear desktop notifications when the application page fails to load

Known Issues
~~~~~~~~~~~~

All Platforms
^^^^^^^^^^^^^

-  YouTube videos do not work if mixed content is enabled from app settings

Windows
^^^^^^^

-  Copying a link address and pasting it inside the app doesn't work

Linux (Beta)
^^^^^^^^^^^^

-  [Ubuntu - 64 bit] Right clicking taskbar icon and choosing **Quit** only minimizes the app
-  [Ubuntu - 64 bit] `Direct message notification comes as a streak of line instead of a pop up <https://github.com/mattermost/mattermost-server/issues/3589>`__

Contributors
~~~~~~~~~~~~

Many thanks to all our contributors. In alphabetical order:

-  `akashnimare <https://github.com/akashnimare>`__,
   `asaadmahmood <https://github.com/asaadmahmood>`__,
   `jasonblais <https://github.com/jasonblais>`__,
   `jgis <https://github.com/jgis>`__,
   `jnugh <https://github.com/jnugh>`__,
   `Razzeee <https://github.com/Razzeee>`__,
   `St-Ex <https://github.com/St-Ex>`__,
   `timroes <https://github.com/timroes>`__,
   `yuya-oc <https://github.com/yuya-oc>`__

--------------

Release v1.3.0
--------------

Release date: 2016-07-18

`Download the latest version here <https://mattermost.com/apps>`__.

Improvements
~~~~~~~~~~~~

All Platforms
^^^^^^^^^^^^^

-  Added auto-reloading when tab fails to load the team.
-  Added the ability to access all of your teams by right clicking the system tray icon.

Menu Bar
''''''''

-  New Keyboard Shortcuts

   -  Adjust text size

      -  CTRL+0 (Menu Bar -> View -> Actual Size): Reset the zoom level.
      -  CTRL+PLUS (Menu Bar -> View -> Zoom In): Increase text size
      -  CTRL+MINUS (Menu Bar -> View -> Zoom Out): Decrease text size

   -  Control window

      -  CTRL+W (Menu Bar -> Window -> Close): On Linux, this minimizes the main window.
      -  CTRL+M (Menu Bar -> Window -> Minimize)

   -  Switch teams (these shotcuts also reopen the main window)

      -  CTRL+{1-9} (Menu Bar -> Window -> [Team name]): Open the *n*-th tab.
      -  CTRL+TAB or ALT+CMD+Right (Menu Bar -> Window -> Select Next Team): Switch to the next window.
      -  CTRL+SHIFT+TAB or ALT+CMD+Left (Menu Bar -> Window -> Select Previous Team): Switch to the previous window.
      -  Right click on the tray item, to see an overview of all your teams. You can also select one and jump right into it.

   -  Added **Help** to the Menu Bar, which includes

      -  Link to `Mattermost Docs <https://docs.mattermost.com>`__
      -  Field to indicate the application version number.

Settings Page
'''''''''''''

-  Added a "+" button next to the **Teams** label, which allows you to add more teams.
-  Added the ability to edit team information by clicking on the pencil icon to the right of the team name.

Windows
^^^^^^^

-  Added an installer for better install experience.
-  The app now minimizes to the system tray when application window is closed.
-  Added an option to launch application on login.
-  Added an option to blink the taskbar icon when a new message has arrived.
-  Added tooltip text for the system tray icon in order to show count of unread channels/mentions.
-  Added an option to toggle the app to minimize/restore when clicking on the system tray icon.

Mac
^^^

-  Added colored badges to the menu icon when there are unread channels/mentions.
-  Added an option to minimize the app to the system tray when application window is closed.

Linux (Beta)
^^^^^^^^^^^^

-  Added an option to show the icon on menu bar (requires libappindicator1 on Ubuntu).
-  Added an option to launch application on login.
-  Added an option to minimize the app to the system tray when application window is closed.

Other Changes
~~~~~~~~~~~~~

-  Application license changed from MIT License to Apache License, Version 2.0.

Bug Fixes
~~~~~~~~~

All platforms
^^^^^^^^^^^^^

-  Fixed authentication dialog not working for proxy.

Windows
^^^^^^^

-  Fixed the blurred system tray icon.
-  Fixed a redundant description appearing in the pinned start menu on Windows 7.

Mac
^^^

-  Fixed two icons appearing on a notification.

Known Issues
~~~~~~~~~~~~

Linux (Beta)
^^^^^^^^^^^^^

-  [Ubuntu - 64 bit] Right clicking taskbar icon and choosing **Quit** only minimizes the app
-  [Ubuntu - 64 bit] `Direct message notification comes as a streak of line instead of a pop up <https://github.com/mattermost/mattermost-server/issues/3589>`__

Contributors
~~~~~~~~~~~~

Many thanks to all our contributors. In alphabetical order:

-  `CarmDam <https://github.com/CarmDam>`__,
   `it33 <https://github.com/it33>`__,
   `jasonblais <https://github.com/jasonblais>`__,
   `jnugh <https://github.com/jnugh>`__,
   `magicmonty <https://github.com/magicmonty>`__,
   `MetalCar <https://github.com/MetalCar>`__,
   `Razzeee <https://github.com/Razzeee>`__,
   `yuya-oc <https://github.com/yuya-oc>`__

--------------

Release v1.2.1 (Beta)
-----------------------------

Release date: 2016-05-24

This release contains a security update and it is highly recommended that users upgrade to this version.

-  v1.2.1, released 2016-05-24

   -  Fixed an issue where "Electron" appeared in the title bar on startup.
   -  Added a dialog to confirm use of non-http(s) protocols prior to opening links. For example, clicking on a link to ``file://test`` will open a dialog to confirm the user intended to open a file.
   -  (Windows and OS X) Added a right-click menu option for tray icon to open the Desktop application.

-  v1.2.0, released 2016-05-13

   -  Original v1.2 release

Improvements
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

All Platforms
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

-  Improved the style for tab badges.
-  Added **Allow mixed content** option to render images with ``http://``.
-  Added the login dialog for ``http`` authentication.

Mac
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

-  Added an option to show a black dot indicating unread messages on the team tab bar.

Linux
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

-  Added **.deb** packages to support installation.

Bug Fixes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

All Platforms
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

-  Node.js environment is enabled in the new window.
-  The link other than ``http://`` and ``https://`` is opened by clicking.

Linux
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

-  Desktop notification is shown as a dialog on Ubuntu 16.04.

Known issues
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

-  The shortcuts can't switch teams twice in a row.
-  The team pages are not correctly rendered until the window is resized when the zoom level is changed.

Contributors
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Many thanks to all our contributors. In alphabetical order:

-  `asaadmahmood <https://github.com/asaadmahmood>`__,
   `jeremycook <https://github.com/jeremycook>`__,
   `jnugh <https://github.com/jnugh>`__,
   `jwilander <https://github.com/jwilander>`__,
   `mgielda <https://github.com/mgielda>`__,
   `lloeki <https://github.com/lloeki>`__,
   `yuya-oc <https://github.com/yuya-oc>`__

Release v1.1.1 (Beta)
-----------------------------

Release date: 2016-04-13

This release contains a security update and it is highly recommended that users upgrade to this version.

-  v1.1.1, released 2016-04-13

   -  If the specified team URL on the **Settings** page contains an additional space, the app now properly redirects to the team page
   -  ALT+SHIFT now opens the menu on Cinnamon desktop environment.

-  v1.1.0, released 2016-03-30

   -  Original v1.1 release

The ``electron-mattermost`` project is now the official desktop application for the Mattermost open source project.

Changes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

All platforms
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

-  Rename project from ``electron-mattermost`` to ``desktop``
-  Rename the executable file from ``electron-mattermost`` to ``Mattermost``
-  The configuration directory is also different from previous versions.
-  Should execute following command to take over ``config.json``.

   -  Windows:
      ``mkdir %APPDATA%\Mattermost and copy %APPDATA%\electron-mattermost\config.json %APPDATA%\Mattermost\config.json``
   -  OS X:
      ``ditto ~/Library/Application\ Support/electron-mattermost/config.json ~/Library/Application\ Support/Mattermost/config.json``
   -  Linux:
      ``mkdir -p ~/.config/Mattermost && cp ~/.config/electron-mattermost/config.json ~/.config/Mattermost/config.json``

Improvements
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

All platforms
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

-  Refined the application icon.
-  Show error messages when the application fails to load the Mattermost server.
-  Show confirmation dialog to continue connection when there is a certificate error.
-  Added validation to check whether **Name** or **URL** are blank when adding or editing a team on the **Settings** page.
-  Added simple basic HTTP authentication (requires a command line).

Windows
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

-  Show a small circle on the tray icon when there are new messages.

Bug Fixes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Windows
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

-  **File** > **About** now shows the version number dialog.

Linux
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

-  **File** > **About** now shows the version number dialog.
-  Ubuntu: Notifications now work properly.
-  The view mp longer crashes when freetype 2.6.3 is used on the system.

Known issues
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

All platforms
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

-  Basic authentication is not working and requires a command line.
-  Some keyboard shortcuts are missing (e.g. CTRL+W, CMD+PLUS).

Windows
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

-  Application does not appear properly in Windows volume mixer.

**List of releases before the project was promoted as the official
desktop application for Mattermost.**

`Release v1.0.7 (Unofficial) -
2016-02-20 <https://github.com/mattermost/desktop/releases/tag/v1.0.7>`__

`Release v1.0.6 (Unofficial) -
2016-02-16 <https://github.com/mattermost/desktop/releases/tag/v1.0.6>`__

`Release v1.0.5 (Unofficial) -
2016-02-13 <https://github.com/mattermost/desktop/releases/tag/v1.0.5>`__

`Release v1.0.4 (Unofficial) -
2016-02-12 <https://github.com/mattermost/desktop/releases/tag/v1.0.4>`__

`Release v1.0.3 (Unofficial) -
2016-02-03 <https://github.com/mattermost/desktop/releases/tag/v1.0.3>`__

`Release v1.0.2 (Unofficial) -
2016-01-16 <https://github.com/mattermost/desktop/releases/tag/v1.0.2>`__

`Release v1.0.1 (Unofficial) -
2016-01-06 <https://github.com/mattermost/desktop/releases/tag/v1.0.1>`__

`Release v1.0.0 (Unofficial) -
2015-12-27 <https://github.com/mattermost/desktop/releases/tag/v1.0.0>`__

`Release v0.5.1 (Unofficial) -
2015-12-12 <https://github.com/mattermost/desktop/releases/tag/v0.5.1>`__

`Release v0.5.0 (Unofficial) -
2015-12-06 <https://github.com/mattermost/desktop/releases/tag/v0.5.0>`__

`Release v0.4.0 (Unofficial) -
2015-11-03 <https://github.com/mattermost/desktop/releases/tag/v0.4.0>`__

`Release v0.3.0 (Unofficial) -
2015-10-24 <https://github.com/mattermost/desktop/releases/tag/v0.3.0>`__

`Release v0.2.0 (Unofficial) -
2015-10-14 <https://github.com/mattermost/desktop/releases/tag/v0.2.0>`__

`Release v0.1.0 (Unofficial) -
2015-10-10 <https://github.com/mattermost/desktop/releases/tag/v0.1.0>`__

source/install/deprecated-features.rst METASEP
Removed and deprecated features for Mattermost
==============================================

This page describes features that are removed from support for Mattermost, or will be removed in a future update (deprecated), and provides early notice about future changes that might affect your use of Mattermost. This information is subject to change with future releases, and might not include each deprecated feature.

Removed features in upcoming versions
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


Removed features by Mattermost version
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost Server v6.0.0
^^^^^^^^^^^^^^^^^^^^^^^^

- `Legacy Command Line Tools <https://docs.mattermost.com/manage/command-line-tools.html>`__. Most commands have been replaced by `mmctl <https://docs.mattermost.com/manage/mmctl-command-line-tool.html>`_ and new commands have been added over the last few months, making this tool a full and robust replacement.
- `Slack Import via the web app <https://docs.mattermost.com/administration/migrating.html?highlight=mmetl#migrating-from-slack-using-the-mattermost-web-app>`_. The Slack import tool accessible via the Team Setting menu is being replaced by the mmetl tool that is much more comprehensive for the types of data it can assist in uploading.
- MySQL versions below 5.7.12. Minimum support will now be for 5.7.12. This version introduced a native JSON data type that lets us improve performance and scalability of several database fields (most notably Users and Posts props). Additionally, version 5.6 (our current minimum version) reached `EOL in February 2021 <https://www.mysql.com/support/eol-notice.html>`_.
- Elasticsearch 5 and 6. `Versions 5.x reached EOL in March of 2019, and versions 6.x reached EOL in November 2020 <https://www.elastic.co/support/eol>`_. Our minimal supported version with Mattermost v6.0 will be Elasticsearch version 7.0.
- Windows 7 reached `EOL in January 2020 <https://support.microsoft.com/en-us/windows/windows-7-support-ended-on-january-14-2020-b75d4580-2cc7-895a-2c9c-1466d9a53962>`_. We will no longer provide support for the desktop app issues on Windows 7.
- `DisableLegacyMFAEndpoint <https://docs.mattermost.com/administration/config-settings.html#disable-legacy-mfa-api-endpoint>`_ configuration setting.
- `Experimental Timezone <https://docs.mattermost.com/administration/config-settings.html#timezone>`_ configuration setting.
- All legacy channel sidebar experimental configuration settings. We encourage customers using these settings to upgrade to v5.32 or later to access custom, collapsible channel categories among many other channel organization features. The settings being deprecated include:
  
  - `EnableLegacySidebar <https://docs.mattermost.com/administration/config-settings.html#enable-legacy-sidebar>`_
  - `ExperimentalTownSquareIsReadOnly <https://docs.mattermost.com/administration/config-settings.html#town-square-is-read-only-experimental>`_
  - `ExperimentalHideTownSquareinLHS <https://docs.mattermost.com/administration/config-settings.html#town-square-is-hidden-in-left-hand-sidebar-experimental>`_
  - `EnableXToLeaveChannelsFromLHS <https://docs.mattermost.com/administration/config-settings.html#enable-x-to-leave-channels-from-left-hand-sidebar-experimental>`_
  - `CloseUnusedDirectMessages <https://docs.mattermost.com/administration/config-settings.html#autoclose-direct-messages-in-sidebar-experimental>`_
  - `ExperimentalChannelOrganization <https://docs.mattermost.com/administration/config-settings.html#sidebar-organization>`_
  - `ExperimentalChannelSidebarOrganization <https://docs.mattermost.com/administration/config-settings.html#experimental-sidebar-features>`_

- `All configuration settings previously marked as “Deprecated” <https://docs.mattermost.com/administration/config-settings.html#deprecated-configuration-settings>`_.
- Changes to mattermost-server/model for naming consistency.

Mattermost Server v5.38.0
^^^^^^^^^^^^^^^^^^^^^^^^^

- In the v5.38 release (August 16, 2021), the “config watcher” (the mechanism that automatically reloads the “config.json“ file), has been removed in favor of the “mmctl config“ command that will need to be run to apply configuration changes after they are made. This change will improve configuration performance and robustness.

Mattermost Server v5.37.0
^^^^^^^^^^^^^^^^^^^^^^^^^

- The “platform“ binary and “–platform” flag have been removed. If you are using the “–platform” flag or are using the “platform“ binary directly to run the Mattermost server application via a systemd file or custom script, you will be required to use only the “mattermost“ binary.

Mattermost Server v5.32.0
^^^^^^^^^^^^^^^^^^^^^^^^^

- TLS versions 1.0 and 1.1 have been deprecated by browser vendors. Starting in Mattermost Server v5.32 (February 16), mmctl returns an error when connected to Mattermost servers deployed with these TLS versions and System Admins will need to explicitly add a flag in their commands to continue to use them. We recommend upgrading to TLS version 1.2 or higher.

Mattermost Server v5.30.0
^^^^^^^^^^^^^^^^^^^^^^^^^

- PostgreSQL ended long-term support for `version 9.4 in February 2020 <https://www.postgresql.org/support/versioning>`_. From v5.26 Mattermost officially supports PostgreSQL version 10 as PostgreSQL 9.4 is no longer supported. New installs will require PostgreSQL 10+. Previous Mattermost versions, including our current ESR, will continue to be compatible with PostgreSQL 9.4. PostgreSQL 9.4 and all 9.x versions are now fully deprecated in our v5.30 release (December 16). Please follow the instructions under the Upgrading Section within `the PostgreSQL documentation <https://www.postgresql.org/support/versioning/>`_.

Mattermost Server v5.16.0
^^^^^^^^^^^^^^^^^^^^^^^^^

- Removed support for Internet Explorer (IE11) in Mattermost v5.16.0. Learn more in our `forum post <https://forum.mattermost.org/t/mattermost-is-dropping-support-for-internet-explorer-ie11-in-v5-16/7575>`_.

Mattermost Server v5.12.0
^^^^^^^^^^^^^^^^^^^^^^^^^

- ExperimentalEnablePostMetadata setting was removed. Post metadata, including post dimensions, is now stored in the database to correct scroll position and eliminate scroll jumps as content loads in a channel.

Mattermost Server v5.6.0
^^^^^^^^^^^^^^^^^^^^^^^^^

- Removed support for WebRTC in beta, and replaced it with other video and audio calling solutions. Learn more in our `documentation <https://docs.mattermost.com/deployment/video-and-audio-calling.html>`_.
- Removed support for IE11 Mobile View due to low usage and instability in order to invest that effort in maintaining a high quality experience on other more used browsers. End users on IE11 will thus have an increased minimum screen size. Mobile View is still supported on Chrome, Firefox, Safari, Edge as well as the desktop apps.

Mattermost Server v5.0.0
^^^^^^^^^^^^^^^^^^^^^^^^

- All API v3 endpoints removed. API v3 endpoints are no longer supported as of Mattermost v4.6 release on January 16th, 2018, and are replaced by API v4 endpoints which were released on July 16th, 2017. See `https://api.mattermost.com <https://api.mattermost.com>`_ to learn more.
- Desktop Notification Duration in Account Settings removed due to inconsistencies on various browsers and operating systems.
- An unused “ExtraUpdateAt” field removed from the channel model.
- ``platform`` binary renamed to mattermost for a clearer install and upgrade experience. All command line tools, including the bulk loading tool and developer tools, also renamed from platform to mattermost.
- Slash commands configured to receive a GET request now have the payload encoded in the query string instead of receiving it in the body of the request, consistent with standard HTTP requests. Although unlikely, this could break custom slash commands that use GET requests incorrectly.
- A new ``config.json`` setting to whitelist types of protocols for auto-linking added.
- A new ``config.json`` setting to disable the `permanent APIv4 delete team parameter <https://api.mattermost.com/#tag/teams%2Fpaths%2F~1teams~1%7Bteam_id%7D%2Fput>`_ added. The setting is off by default for all new and existing installs, except those deployed on GitLab Omnibus. A System Admin can enable the API v4 endpoint from the ``config.json`` file.

Mattermost Server v4.9.0
^^^^^^^^^^^^^^^^^^^^^^^^

- A number of permissions configuration settings will be migrated to roles in the database, and changing their config.json values will no longer take effect. These permissions can still be modified by their respective System Console settings. See `changelog <https://docs.mattermost.com/install/self-managed-changelog.html>`_ for more details.

Mattermost Server v4.0.0
^^^^^^^^^^^^^^^^^^^^^^^^

- System Console settings in **Files > Images**, including:
  
  - Image preview height and width
  - Profile picture height and width
  - Image thumbnail height and width

- Font setting in **Account Settings > Display**
- Teammate Name Display setting moved to the System Console

Mattermost Server v3.8.0
^^^^^^^^^^^^^^^^^^^^^^^^

- Old CLI tool (replaced by `an upgraded CLI tool <https://docs.mattermost.com/administration/command-line-tools.html>`_)
- APIv3 endpoints:
  
  - “GET at /channels/more” (replaced by “/channels/more/{offset}/{limit}”)
  - “POST at /channels/update_last_viewed_at” (replaced by “/channels/view”)
  - “POST at /channels/set_last_viewed_at” (replaced by “/channels/view”)
  - “POST at /users/status/set_active_channel” (replaced by “/channels/view”)

Mattermost Server v3.7.0
^^^^^^^^^^^^^^^^^^^^^^^^

- “ServiceSettings: SegmentDeveloperKey” setting in ``config.json``

source/install/deploying-team-edition-on-bitnami.rst METASEP
.. _deploy-bitnami:

Deploy Mattermost on Bitnami
=============================

Deploy your Mattermost Team Edition server in the cloud with one simple click using one of `several Bitnami cloud images <https://bitnami.com/stack/mattermost/cloud>`__.

Deployment options include:

- `Amazon Web Services <https://aws.amazon.com/marketplace/pp/prodview-smvm2q422uo6c>`__
- `Microsoft Azure <https://azuremarketplace.microsoft.com/en-us/marketplace/apps/bitnami.mattermost>`__
- `Google Cloud Platform <https://console.cloud.google.com/marketplace/product/bitnami-launchpad/mattermost>`__

Alternatively, you may also deploy to `Debian 9 VMware virtual machines <https://bitnami.com/stack/mattermost/virtual-machine>`__.

If you migrate from Bitnami to a self-hosted installation with MySQL database, read these notes in our migration guide: `Migrating from Bitnami <https://docs.mattermost.com/onboard/migrating-to-mattermost.html#migrating-from-bitnami>`__.

source/install/deploy-cloudron.rst METASEP
:orphan:

.. _deploy-cloudron:

.. This page is intentionally NOT accessible from the LHS, and is no longer maintained in this repository. Unofficial content has moved to the User Forum.

Deploy Mattermost on Cloudron (unofficial)
==========================================

Unofficial, community-maintained guides for deploying Mattermost on Cloudron.

.. important:: This unofficial guide is maintained by the Mattermost community and this deployment configuration is not yet officially supported by Mattermost, Inc. You can `edit this page on GitHub <https://github.com/mattermost/docs/blob/master/source/install/deploy-cloudron.rst>`__.

Mattermost is available as a 1-click install on `Cloudron <https://cloudron.io>`__. For those unaware,
Cloudron makes it easy to run apps like Mattermost on your server and keep them up-to-date and secure.

.. image:: https://cloudron.io/img/button.svg
   :target: https://cloudron.io/button.html?app=org.mattermost.cloudronapp

Installation
------------

To get started, first `install Cloudron <https://cloudron.io/get.html>`__ on a VPS provider like Digital Ocean
and then install Mattermost from the `Cloudron Store <https://cloudron.io/store/org.mattermost.cloudronapp.html>`__.

The Mattermost app will be configured with MySQL and SMTP email notifications service.

Demo
----

A demo is available `here <https://my.demo.cloudron.io>`__ (username: ``cloudron``, password: ``cloudron``).

Package Source
--------------

The Cloudron package (with automated tests) is developed `here <https://git.cloudron.io/cloudron/mattermost-app>`__.

source/install/database-transport-encryption.rst METASEP
Configuring database transport encryption
==========================================

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Mattermost Enterprise Edition E20*

Mattermost is able to encrypt the traffic between the database and the application using TLS. This guide describes the setup steps for a single, separate MySQL server.

Prerequisites
-------------

- Operational Mattermost server or cluster.
- Operational MySQL server.
- Confirmed connectivity between Mattermost and MySQL server.
- Authentication credentials for Mattermost user on MySQL server.

Example environment
-------------------

In this scenario there is one Mattermost application server and one MySQL server, both running Ubuntu 18.04, with the following IPs:

- **transport-encryption-mattermost1:** 10.10.250.146
- **transport-encryption-mysql1:** 10.10.250.148

Configuring MySQL
-----------------

As a first step, connect to both servers with a sudo or root user.

Execute the following command to prepare the server for SSL connections:

``sudo mysql_ssl_rsa_setup --uid=mysql``

This generates self-signed certificates in ``/var/lib/mysql/`` that the MySQL server uses to encrypt the connection. If you would like to use certificates from your company CA, please follow the MySQL documentation for configuration steps.

**Note:** Optionally, it can be enforced that all connections must be made via a local socket connection or TLS. To do this, open ``/etc/mysql/mysql.conf.d/mysqld.cnf`` and append the following line to the file:

``require_secure_transport = ON``

Any connection to the MySQL server must now be made with secure transport enabled.

Last but not least, restart the server and confirm it is up and running:

  .. code-block:: none

    root@transport-encryption-mysql1:~# systemctl restart mysql
    root@transport-encryption-mysql1:~# systemctl status mysql
    ● mysql.service - MySQL Community Server
       Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
       Active: active (running) since Fri 2019-10-18 16:41:25 UTC; 2s ago
      Process: 8380 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid (code=exited, status=0/SUCCESS)
      Process: 8360 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
     Main PID: 8382 (mysqld)
        Tasks: 27 (limit: 2361)
       CGroup: /system.slice/mysql.service
               └─8382 /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid

    Oct 18 16:41:25 transport-encryption-mysql1 systemd[1]: Stopped MySQL Community Server.
    Oct 18 16:41:25 transport-encryption-mysql1 systemd[1]: Starting MySQL Community Server...
    Oct 18 16:41:25 transport-encryption-mysql1 systemd[1]: Started MySQL Community Server.

Configuring Mattermost
----------------------

On the Mattermost server, open the file ``config.json`` and look for the ``DataSource`` value in the ``SqlSettings`` section. It should look similar to this:

``"DataSource": "mmuser:sad09zusaopdhsad123@tcp(10.10.250.148:3306)/mattermost?charset=utf8mb4,utf8\u0026writeTimeout=30s",``

At the end of the line, we can configure that TLS must be turned on with the ``tls`` flag which supports the following values:

- true (Require TLS + a trusted certificate)
- false
- skip-verify (Require TLS + accept self-signed)
- preferred (Try TLS, fallback to unencrypted)

In our case we need to use ``skip-verify`` since we use a self-signed certificate. The configuration setting will now look like this:

``"DataSource": "mmuser:sad09zusaopdhsad123@tcp(10.10.250.148:3306)/mattermost?charset=utf8mb4,utf8\u0026writeTimeout=30s&tls=skip-verify",``

If you're running Mattermost in a cluster, be sure to update the value on each node of the cluster. If you are using configuration in the database, be sure to update the ``systemd`` unit file and enable TLS for the configuration store.

Once complete, restart the Mattermost server and ensure the system is operational:

.. code-block:: none

  ubuntu@transport-encryption-mattermost1:~$ sudo systemctl restart mattermost
  ubuntu@transport-encryption-mattermost1:~$ systemctl status mattermost
  ● mattermost.service - Mattermost
     Loaded: loaded (/lib/systemd/system/mattermost.service; static; vendor preset: enabled)
     Active: active (running) since Fri 2019-10-18 16:47:08 UTC; 3s ago
    Process: 3424 ExecStartPre=/opt/mattermost/bin/pre_start.sh (code=exited, status=0/SUCCESS)
   Main PID: 3443 (mattermost)
      Tasks: 20 (limit: 2361)
     CGroup: /system.slice/mattermost.service
             ├─3443 /opt/mattermost/bin/mattermost --config=mysql://mmuser:sad09zusaopdhsad123@tcp(10.10.250.148:3306)/mattermost?charset=utf8mb4,utf8&writeTimeout=30s&tls=skip-verify
             └─3459 plugins/com.mattermost.nps/server/dist/plugin-linux-amd64

  Oct 18 16:47:08 transport-encryption-mattermost1 mattermost[3443]: {"level":"debug","ts":1571417228.8637397,"caller":"scheduler/worker.go:36","msg":"Worker started","worker":"Plugins"}
  Oct 18 16:47:08 transport-encryption-mattermost1 mattermost[3443]: {"level":"debug","ts":1571417228.8639545,"caller":"jobs/jobs_watcher.go:38","msg":"Watcher Started"}
  Oct 18 16:47:08 transport-encryption-mattermost1 mattermost[3443]: {"level":"info","ts":1571417228.8641603,"caller":"jobs/schedulers.go:72","msg":"Starting schedulers."}
  Oct 18 16:47:08 transport-encryption-mattermost1 mattermost[3443]: {"level":"debug","ts":1571417228.8645394,"caller":"app/web_hub.go:436","msg":"Hub for index 0 is starting with goroutine 3923"}
  Oct 18 16:47:08 transport-encryption-mattermost1 mattermost[3443]: {"level":"debug","ts":1571417228.8648505,"caller":"app/web_hub.go:436","msg":"Hub for index 1 is starting with goroutine 3924"}
  Oct 18 16:47:08 transport-encryption-mattermost1 mattermost[3443]: {"level":"debug","ts":1571417228.8656101,"caller":"web/static.go:31","msg":"Using client directory at /opt/mattermost/client"}
  Oct 18 16:47:08 transport-encryption-mattermost1 mattermost[3443]: {"level":"info","ts":1571417228.8681324,"caller":"commands/server.go:105","msg":"Sending systemd READY notification."}
  Oct 18 16:47:08 transport-encryption-mattermost1 systemd[1]: Started Mattermost.
  Oct 18 16:47:08 transport-encryption-mattermost1 mattermost[3443]: {"level":"debug","ts":1571417228.9003174,"caller":"jobs/schedulers.go:166","msg":"Next run time for scheduler","scheduler_name":"MigrationsSched
  Oct 18 16:47:08 transport-encryption-mattermost1 mattermost[3443]: {"level":"debug","ts":1571417228.9025588,"caller":"jobs/schedulers.go:166","msg":"Next run time for scheduler","scheduler_name":"PluginsSchedule

source/install/config-tls-mattermost.rst METASEP
:nosearch:
.. This page is intentionally not accessible via the LHS navigation pane because it's common content included on other docs pages.

Configure TLS on Mattermost server
-----------------------------------

You have two options if you want users to connect with HTTPS:

  1. Set up TLS on Mattermost server.
  2. Install a proxy such as NGINX and set up TLS on the proxy.

The easiest option is to set up TLS on the Mattermost Server, but if you expect to have more than 200 users, use a proxy for better performance. A proxy server also provides standard HTTP request logs.

.. note::

   Your Mattermost server must be accessible from the Let's Encrypt CA in order to verify your domain name and issue the certificate. Be sure to open your firewall and configure any reverse proxies to forward traffic to ports 80 and 443. More information can be found `at Let's Encrypt <https://letsencrypt.org/how-it-works/>`_.

Configure TLS on the Mattermost server
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. In **System Console > Environment > Web Server** (or **System Console > General > Configuration** in versions prior to 5.12).

  a. Change the **Listen Address** setting to ``:443``.
  b. Change the **Connection Security** setting to ``TLS``.
  c. Change the **Forward port 80 to 443** setting to ``true``.

2. Activate the ``CAP_NET_BIND_SERVICE`` capability to allow Mattermost to bind to low ports.

  ``sudo setcap cap_net_bind_service=+ep /opt/mattermost/bin/mattermost``

3. Install the security certificate. You can use `Let's Encrypt <https://letsencrypt.org/>`__ to automatically install and setup the certificate, or you can specify your own certificate.

To use a Let's Encrypt certificate
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The certificate is retrieved the first time that a client tries to connect to the Mattermost server. Certificates are retrieved for any hostname a client tries to reach the server at.

    a. Change the **Use Let's Encrypt** setting to ``true``.
    b. Restart the Mattermost server for these changes to take effect.

.. note::
   
   If Let's Encrypt is enabled, forward port 80 through a firewall, with `Forward80To443 <https://docs.mattermost.com/configure/configuration-settings.html#forward-port-80-to-443>`__ ``config.json`` setting set to ``true`` to complete the Let's Encrypt certification.

To use your own certificate
~~~~~~~~~~~~~~~~~~~~~~~~~~~

    a. Change the **Use Let's Encrypt** setting to ``false``.
    b. Change the **TLS Certificate File** setting to the location of the certificate file.
    c. Change the **TLS Key File** setting to the location of the private key file.
    d. Restart the Mattermost server for these changes to take effect.

.. note::
  
  Password-protected certificates are not supported.
   
Use TLS on NGINX (as a proxy)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. note::
  
  Do not set up TLS on Mattermost before before doing so for NGINX. It breaks the connection as the TLS prevents it from successfully communicating with the Mattermost server.

- NGINX will act as a forward proxy to encrypt the traffic between the client and Mattermost server. After installing the SSL certificate, the incoming traffic will be handled via NGINX on port 443 exposed to the internet, proxy to the Mattermost server running on port 80.
- (Optional) Upstream encryption between NGINX to Mattermost server is allowed.
- Follow `NGINX's guide on setting up SSL Termination for TCP Upstream Servers <https://docs.nginx.com/nginx/admin-guide/security-controls/terminating-ssl-tcp/>`__.
 
Other helpful resources:

- `NGINX's SSL blog <https://www.nginx.com/blog/nginx-ssl/>`__
- `NGINX's SSL guide <https://docs.nginx.com/nginx/admin-guide/security-controls/terminating-ssl-http/>`__

source/install/config-ssl-http2-nginx.rst METASEP
:orphan:
:nosearch:
.. This page is intentionally not accessible via the LHS navigation pane because it's common content included on other docs pages.

.. _config-ssl-http2-nginx:

Configure NGINX with SSL and HTTP/2
-----------------------------------

NGINX is configured using a file in the ``/etc/nginx/sites-available`` directory. You need to create the file and then enable it. When creating the file, you need the IP address of your Mattermost server and the fully qualified domain name (FQDN) of your Mattermost website.

Using SSL gives greater security by ensuring that communications between Mattermost clients and the Mattermost server are encrypted. It also allows you to configure NGINX to use the HTTP/2 protocol.

Although you can configure HTTP/2 without SSL, both Firefox and Chrome browsers support HTTP/2 on secure connections only.

You can use any certificate that you want, but these instructions show you how to download and install certificates from `Let's Encrypt <https://letsencrypt.org/>`__, a free certificate authority.

.. note::
   
   If Let’s Encrypt is enabled, forward port 80 through a firewall, with `Forward80To443 <https://docs.mattermost.com/configure/configuration-settings.html#forward-port-80-to-443>`__ ``config.json`` setting set to ``true`` to complete the Let’s Encrypt certification. See the `Let's Encrypt/Certbot documentation <https://certbot.eff.org>`_ for additional assistance.

1. Log in to the server that hosts NGINX and open a terminal window.

2. Open the your Mattermost ``nginx.conf`` file as *root* in a text editor, then update the ``{ip}`` address in the ``upstream backend`` to point towards Mattermost (such as ``127.0.0.1:8065``), and update the ``server_name`` to be your domain for Mattermost.

  .. note::
   
   - On Ubuntu this file is located at ``/etc/nginx/sites-available/``. If you don't have this file, run ``sudo touch /etc/nginx/sites-available/mattermost``.
   - On CentOS/RHEL this file is located at ``/etc/nginx/conf.d/``. If you don't have this file, run ``sudo touch /etc/nginx/conf.d/mattermost``.
   - Note that the IP address included in the examples in this documentation may not match your network configuration. 
   - If you're running NGINX on the same machine as Mattermost, and NGINX resolves ``localhost`` to more than one IP address (IPv4 or IPv6), we recommend using ``127.0.0.1`` instead of ``localhost``. 
   
  .. code-block:: none

   upstream backend {
       server {ip}:8065;
       keepalive 32;
       }

   proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=mattermost_cache:10m max_size=3g inactive=120m use_temp_path=off;

   server {
       listen 80 default_server;
       server_name mattermost.example.com;

       location ~ /api/v[0-9]+/(users/)?websocket$ {
           proxy_set_header Upgrade $http_upgrade;
           proxy_set_header Connection "upgrade";
           client_max_body_size 50M;
           proxy_set_header Host $http_host;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_set_header X-Forwarded-Proto $scheme;
           proxy_set_header X-Frame-Options SAMEORIGIN;
           proxy_buffers 256 16k;
           proxy_buffer_size 16k;
           client_body_timeout 60;
           send_timeout 300;
           lingering_timeout 5;
           proxy_connect_timeout 90;
           proxy_send_timeout 300;
           proxy_read_timeout 90s;
           proxy_pass http://backend;
       }

       location / {
           client_max_body_size 50M;
           proxy_set_header Connection "";
           proxy_set_header Host $http_host;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_set_header X-Forwarded-Proto $scheme;
           proxy_set_header X-Frame-Options SAMEORIGIN;
           proxy_buffers 256 16k;
           proxy_buffer_size 16k;
           proxy_read_timeout 600s;
           proxy_cache mattermost_cache;
           proxy_cache_revalidate on;
           proxy_cache_min_uses 2;
           proxy_cache_use_stale timeout;
           proxy_cache_lock on;
           proxy_http_version 1.1;
           proxy_pass http://backend;
       }
   }


3. Remove the existing default sites-enabled file by running ``sudo rm /etc/nginx/sites-enabled/default`` (Ubuntu) or ``sudo rm /etc/nginx/conf.d/default`` (RHEL 8).

4. Enable the Mattermost configuration by running ``sudo ln -s /etc/nginx/sites-available/mattermost /etc/nginx/sites-enabled/mattermost`` (Ubuntu) or ``sudo ln -s /etc/nginx/conf.d/mattermost /etc/nginx/conf.d/default.conf`` (RHEL 8).
   
5. Run ``sudo nginx -t`` to ensure your configuration is done properly. If you get an error, look into the NGINX config and make the needed changes to the file under ``/etc/nginx/sites-available/mattermost``.

6. Restart NGINX by running ``sudo systemctl start nginx``.

7. Verify that you can see Mattermost through the proxy by running ``curl http://localhost``.

  If everything is working, you will see the HTML for the Mattermost signup page. You will see invalid certificate when accessing through the IP or localhost. Use the full FQDN domain to verify if the SSL certificate has pinned properly and is valid.

8. Install and update Snap by running ``sudo snap install core; sudo snap refresh core``.

9. Install the Certbot package by running ``sudo snap install --classic certbot``.

10. Add a symbolic link to ensure Certbot can run by running ``sudo ln -s /snap/bin/certbot /usr/bin/certbot``.

11. Run the Let's Encrypt installer dry-run to ensure your DNS is configured properly by running ``sudo certbot certonly --dry-run``.

  This will prompt you to enter your email, accept the TOS, share your email, and select the domain you're activating certbot for. This will validate that your DNS points to this server properly and you are able to successfully generate a certificate. If this finishes successfully, proceed to step 12.
  
12. Run the Let's Encrypt installer by running ``sudo certbot``. This will run certbot and will automatically edit your NGINX config file for the site(s) selected.
  
13. Ensure your SSL is configured properly by running ``curl https://{your domain here}``

14. Finally, we suggest editing your config file again to increase your SSL security settings above the default Let's Encrypt. This is the same file from Step 2 above. Edit it to look like the below:

  .. code-block:: none

   upstream backend {
       server {ip}:8065;
      keepalive 32;
       }

   proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=mattermost_cache:10m max_size=3g inactive=120m use_temp_path=off;

   server {
       server_name mattermost.example.com;

       location ~ /api/v[0-9]+/(users/)?websocket$ {
           proxy_set_header Upgrade $http_upgrade;
           proxy_set_header Connection "upgrade";
           client_max_body_size 50M;
           proxy_set_header Host $http_host;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_set_header X-Forwarded-Proto $scheme;
           proxy_set_header X-Frame-Options SAMEORIGIN;
           proxy_buffers 256 16k;
           proxy_buffer_size 16k;
           client_body_timeout 60;
           send_timeout 300;
           lingering_timeout 5;
           proxy_connect_timeout 90;
           proxy_send_timeout 300;
           proxy_read_timeout 90s;
           proxy_http_version 1.1;
           proxy_pass http://backend;
       }

       location / {
           client_max_body_size 50M;
           proxy_set_header Connection "";
           proxy_set_header Host $http_host;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_set_header X-Forwarded-Proto $scheme;
           proxy_set_header X-Frame-Options SAMEORIGIN;
           proxy_buffers 256 16k;
           proxy_buffer_size 16k;
           proxy_read_timeout 600s;
           proxy_cache mattermost_cache;
           proxy_cache_revalidate on;
           proxy_cache_min_uses 2;
           proxy_cache_use_stale timeout;
           proxy_cache_lock on;
           proxy_http_version 1.1;
           proxy_pass http://backend;
       }

       listen 443 ssl http2; # managed by Certbot
       ssl_certificate /etc/letsencrypt/live/mattermost.example.com/fullchain.pem; # managed by Certbot
       ssl_certificate_key /etc/letsencrypt/live/mattermost.example.com/privkey.pem; # managed by Certbot
       # include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
       ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

       ssl_session_timeout 1d;

       # Enable TLS versions (TLSv1.3 is required upcoming HTTP/3 QUIC).
       ssl_protocols TLSv1.2 TLSv1.3;

       # Enable TLSv1.3's 0-RTT. Use $ssl_early_data when reverse proxying to
       # prevent replay attacks.
       #
       # @see: https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_early_data
       ssl_early_data on;

       ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-SHA;
       ssl_prefer_server_ciphers on;
       ssl_session_cache shared:SSL:50m;
       # HSTS (ngx_http_headers_module is required) (15768000 seconds = six months)
       add_header Strict-Transport-Security max-age=15768000;
       # OCSP Stapling ---
       # fetch OCSP records from URL in ssl_certificate and cache them
       ssl_stapling on;
       ssl_stapling_verify on;
   }


   server {
       if ($host = mattermost.example.com) {
           return 301 https://$host$request_uri;
       } # managed by Certbot


       listen 80 default_server;
       server_name mattermost.example.com;
       return 404; # managed by Certbot

   }

15.  Check that your SSL certificate is set up correctly.

  * Test the SSL certificate by visiting a site such as https://www.ssllabs.com/ssltest/index.html.
  * If there’s an error about the missing chain or certificate path, there is likely an intermediate certificate missing that needs to be included.

NGINX configuration FAQ
~~~~~~~~~~~~~~~~~~~~~~~

Why are Websocket connections returning a 403 error?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

This is likely due to a failing cross-origin check. A check is applied for WebSocket code to see if the ``Origin`` header is the same as the host header. If it's not, a 403 error is returned. Open the file ``/etc/nginx/sites-available/mattermost`` as *root* in a text editor and make sure that the host header being set in the proxy is dynamic:

.. code-block:: none
  :emphasize-lines: 4

  location ~ /api/v[0-9]+/(users/)?websocket$ {
    proxy_pass            http://backend;
    (...)
    proxy_set_header      Host $host;
    proxy_set_header      X-Forwarded-For $remote_addr;
  }

Then in ``config.json`` set the ``AllowCorsFrom`` setting to match the domain being used by clients. You may need to add variations of the host name that clients may send. Your NGINX log will be helpful in diagnosing the problem.

.. code-block:: none
  :emphasize-lines: 2

  "EnableUserAccessTokens": false,
  "AllowCorsFrom": "domain.com domain.com:443 im.domain.com",
  "SessionLengthWebInDays": 30,

For other troubleshooting tips for WebSocket errors, see `potential solutions here <https://docs.mattermost.com/install/troubleshooting.html#please-check-connection-mattermost-unreachable-if-issue-persists-ask-administrator-to-check-websocket-port>`__.

How do I setup an NGINX proxy with the Mattermost Docker installation?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

1. Find the name of the Mattermost network and connect it to the NGINX proxy.

.. code-block:: none

  docker network ls
  # Grep the name of your Mattermost network like "mymattermost_default".
  docker network connect mymattermost_default nginx-proxy

2. Restart the Mattermost Docker containers.

.. code-block:: none

  docker-compose stop app
  docker-compose start app

.. tip::

  You don't need to run the 'web' container, since NGINX proxy accepts incoming requests.

3. Update your ``docker-compose.yml`` file to include a new environment variable ``VIRTUAL_HOST`` and an ``expose`` directive.

.. code-block:: none

  environment:
    # set same as db credentials and dbname
    - MM_USERNAME=mmuser
    - MM_PASSWORD=mmuser-password
    - MM_DBNAME=mattermost
    - VIRTUAL_HOST=mymattermost.tld
  expose:
    - "80"
    - "443"

Why does NGINX fail when installing Gitlab CE with Mattermost on Azure?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

You may need to update the Callback URLs for the Application entry of Mattermost inside your GitLab instance.

1. Log in to your GitLab instance as the admin.
2. Go to **Admin > Applications**.
3. Select **Edit** on GitLab-Mattermost.
4. Update the callback URLs to your new domain/URL.
5. Save the changes.
6. Update the external URL for GitLab and Mattermost in the ``/etc/gitlab/gitlab.rb`` configuration file.

Why does Certbot fail the http-01 challenge?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. code-block:: none

  Requesting a certificate for yourdomain.com
  Performing the following challenges:
  http-01 challenge for yourdomain.com
  Waiting for verification...
  Challenge failed for domain yourdomain.com
  http-01 challenge for yourdomain.com
  Cleaning up challenges
  Some challenges have failed.
   
If you see the above errors this is typically because Certbot wasn't able to access port 80. This can be due to a firewall or other DNS configuration. Make sure that your A/AAAA records are pointing to this server and your ``server_name`` within the NGINX config doesn't have a redirect.

.. note::
   If you're using Cloudflare you'll need to disable ``force traffic to https``.

Certbot rate limiting
^^^^^^^^^^^^^^^^^^^^^

If you're running certbot as stand-alone you'll see this error:

.. code-block:: none

      Error: Could not issue a Let's Encrypt SSL/TLS certificate for example.com.
      One of the Let's Encrypt rate limits has been exceeded for example.com.
      See the related Knowledge Base article for details.
      Details
      Invalid response from https://acme-v02.api.letsencrypt.org/acme/new-order.
      Details:
      Type: urn:ietf:params:acme:error:rateLimited
      Status: 429
      Detail: Error creating new order :: too many failed authorizations recently: see https://letsencrypt.org/docs/rate-limits/

If you're running Let's Encrypt within Mattermost you'll see this error:

.. code-block:: none

    {"level":"error","ts":1609092001.752515,"caller":"http/server.go:3088","msg":"http: TLS handshake error from ip:port: 429 urn:ietf:params:acme:error:rateLimited: Error creating new order :: too many failed authorizations recently: see https://letsencrypt.org/docs/rate-limits/","source":"httpserver"}

This means that you've attempted to generate a cert too many times. You can find more information `here <https://letsencrypt.org/docs/rate-limits>`_.

source/install/config-proxy-nginx.rst METASEP
:orphan:
:nosearch:
.. This page is intentionally not accessible via the LHS navigation pane because it's common content included on other docs pages.

.. _config-proxy-nginx:

Configure NGINX as a proxy for Mattermost server
------------------------------------------------

NGINX is configured using a file in the ``/etc/nginx/sites-available`` directory. You need to create the file and then enable it. When creating the file, you need the IP address of your Mattermost server and the fully qualified domain name (FQDN) of your Mattermost website.

1. Log in to the server that hosts NGINX and open a terminal window.
2. Create a configuration file for Mattermost by running 

  ``sudo touch /etc/nginx/sites-available/mattermost`` on Ubuntu
  ``sudo touch /etc/nginx/conf.d/mattermost`` on RHEL 8

3. Open the file ``/etc/nginx/sites-available/mattermost`` (Ubuntu) or  ``/etc/nginx/conf.d/mattermost`` (RHEL 8) as *root* user in a text editor and replace its contents, if any, with the following lines. Make sure that you use your own values for the Mattermost server IP address and FQDN for *server_name*.

SSL and HTTP/2 with server push are enabled in the provided configuration example.

  .. note::
  
    - If you're going to use Let's Encrypt to manage your SSL certificate, stop at step 3 and see the `NGINX HTTP/2 and SSL product documentation <https://docs.mattermost.com/install/config-ssl-http2-nginx.html>`__ for details.
    - You'll need valid SSL certificates in order for NGINX to pin the certificates properly. Additionally, your browser must have permissions to accept the certificate as a valid CA-signed certificate.
    - Note that the IP address included in the examples in this documentation may not match your network configuration.
    - If you're running NGINX on the same machine as Mattermost, and NGINX resolves ``localhost`` to more than one IP address (IPv4 or IPv6), we recommend using ``127.0.0.1`` instead of ``localhost``. 

  .. code-block:: none

    upstream backend {
       server 10.10.10.2:8065;
       keepalive 32;
    }

    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=mattermost_cache:10m max_size=3g inactive=120m use_temp_path=off;

    server {
      listen 80 default_server;
      server_name   mattermost.example.com;
      return 301 https://$server_name$request_uri;
    }

    server {
       listen 443 ssl http2;
       server_name    mattermost.example.com;

       http2_push_preload on; # Enable HTTP/2 Server Push

       ssl on;
       ssl_certificate /etc/letsencrypt/live/{domain-name}/fullchain.pem;
       ssl_certificate_key /etc/letsencrypt/live/{domain-name}/privkey.pem;
       ssl_session_timeout 1d;

       # Enable TLS versions (TLSv1.3 is required upcoming HTTP/3 QUIC).
       ssl_protocols TLSv1.2 TLSv1.3;

       # Enable TLSv1.3's 0-RTT. Use $ssl_early_data when reverse proxying to
       # prevent replay attacks.
       #
       # @see: https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_early_data
       ssl_early_data on;

       ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384';
       ssl_prefer_server_ciphers on;
       ssl_session_cache shared:SSL:50m;
       # HSTS (ngx_http_headers_module is required) (15768000 seconds = six months)
       add_header Strict-Transport-Security max-age=15768000;
       # OCSP Stapling ---
       # fetch OCSP records from URL in ssl_certificate and cache them
       ssl_stapling on;
       ssl_stapling_verify on;

       add_header X-Early-Data $tls1_3_early_data;

       location ~ /api/v[0-9]+/(users/)?websocket$ {
           proxy_set_header Upgrade $http_upgrade;
           proxy_set_header Connection "upgrade";
           client_max_body_size 50M;
           proxy_set_header Host $http_host;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_set_header X-Forwarded-Proto $scheme;
           proxy_set_header X-Frame-Options SAMEORIGIN;
           proxy_buffers 256 16k;
           proxy_buffer_size 16k;
           client_body_timeout 60;
           send_timeout 300;
           lingering_timeout 5;
           proxy_connect_timeout 90;
           proxy_send_timeout 300;
           proxy_read_timeout 90s;
           proxy_http_version 1.1;
           proxy_pass http://backend;
       }

       location / {
           client_max_body_size 50M;
           proxy_set_header Connection "";
           proxy_set_header Host $http_host;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_set_header X-Forwarded-Proto $scheme;
           proxy_set_header X-Frame-Options SAMEORIGIN;
           proxy_buffers 256 16k;
           proxy_buffer_size 16k;
           proxy_read_timeout 600s;
           proxy_cache mattermost_cache;
           proxy_cache_revalidate on;
           proxy_cache_min_uses 2;
           proxy_cache_use_stale timeout;
           proxy_cache_lock on;
           proxy_http_version 1.1;
           proxy_pass http://backend;
       }
    }

    # This block is useful for debugging TLS v1.3. Please feel free to remove this
    # and use the `$ssl_early_data` variable exposed by NGINX directly should you
    # wish to do so.
    map $ssl_early_data $tls1_3_early_data {
      "~." $ssl_early_data;
      default "";
    }

4. Remove the existing default sites-enabled file by running ``sudo rm /etc/nginx/sites-enabled/default`` (Ubuntu) or ``sudo rm /etc/nginx/conf.d/default`` (RHEL 8)

5. Enable the mattermost configuration by running ``sudo ln -s /etc/nginx/sites-available/mattermost /etc/nginx/sites-enabled/mattermost`` (Ubuntu) or ``sudo ln -s /etc/nginx/conf.d/mattermost /etc/nginx/conf.d/default.conf`` (RHEL 8)

6. Restart NGINX by running ``sudo systemctl restart nginx``.

7. Verify that you can see Mattermost through the proxy by running ``curl https://localhost``.

  If everything is working, you will see the HTML for the Mattermost signup page.

8. Restrict access to port 8065.

  By default, the Mattermost server accepts connections on port 8065 from every machine on the network. Use your firewall to deny connections on port 8065 to all machines except the machine that hosts NGINX and the machine that you use to administer the Mattermost server. If you're installing on Amazon Web Services, you can use Security Groups to restrict access.

Now that NGINX is installed and running, you can configure it to use SSL, which allows you to use HTTPS connections and the HTTP/2 protocol.
source/install/config-mattermost-server.rst METASEP
:orphan:
:nosearch:
.. This page is intentionally not accessible via the LHS navigation pane because it's common content included on other docs pages.

Configure Mattermost server
----------------------------

Create the System Admin user and set up Mattermost for general use.

1. Open a browser and navigate to your Mattermost instance. For example, if the IP address of the Mattermost server is ``10.10.10.2`` then go to http://10.10.10.2:8065.

2. Create the first team and user. The first user in the system has the ``system_admin`` role, which gives you access to the System Console.

3. To open the System Console, select the Product menu in the top-left corner of the navigation panel, then select **System Console**.

4. Set the site URL:

  * Open **System Console > Environment > Web Server**.
  * In the **Site URL** field, set the URL that users point their browsers at. For example, *https://mattermost.example.com*. If you're using HTTPS, make sure that you set up TLS, either on Mattermost server or on a proxy.

5. Set up email notifications.

  * In **Site Configuration > Notifications** make the following changes:

    - Set **Enable Email Notifications** to **true**
    - Set **Notification Display Name** to **No-Reply**
    - Set **Notification From Address** to *{your-domain-name}* For example, *example.com*
  
  * In **System Console > Environment > SMTP** make the following changes:

    - Set **SMTP Server Username** to *{SMTP-username}* For example, *admin@example.com*
    - Set **SMTP Server Password** to *{SMTP-password}*
    - Set **SMTP Server** to *{SMTP-server}* For example, *mail.example.com*
    - Set **SMTP Server Port** to *465*
    - Set **Connection Security** to *TLS* or *STARTTLS*, depending on what the SMTP server accepts

  * Select **Save**
  * Select **Test Connection**.
  
6. Open **System Console > Environment > File Storage** to set up the file and image storage location.

  * If you store the files locally, set **File Storage System** to *Local File System*, and then either accept the default for the **Local Storage Directory** or enter a location. The location must be a directory that exists and has write permissions for the Mattermost server. It can be an absolute path or a relative path. Relative paths are relative to the ``mattermost`` directory.
  * If you store the files on Amazon S3, set **File Storage System** to *Amazon S3* and enter the appropriate values for your Amazon account.
 
.. note::

    * Files and images that users attach to their messages are not stored in the database. Instead, they're stored in a location that you specify, such as the local file system or in Amazon S3.
    * Make sure that the location has enough free space. The amount of storage required depends on the number of users and the number and size of files that users attach to messages.
 
7. Select **Save** to apply the configuration.

8. Review and configure any other settings that may be applicable.

9. Restart Mattermost by running ``sudo systemctl restart mattermost``.

source/install/common-prod-deploy-tar.rst METASEP
:orphan:
:nosearch:
.. This page is intentionally not accessible via the LHS navigation pane because it's common content included on other docs pages.

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

These instructions outline how to install Mattermost Server on a 64-bit Linux host from a compressed tarball, and assume the IP address of the Mattermost server is 10.10.10.2.

**Minimum system requirements**

- Hardware: 2 vCPUs/cores with 4GB RAM (support for 1,000-2,000 users)
- Database: MySQL v8+ or PostgreSQL v12+
- Network ports required:

   - Application ports 80/443, TLS, TCP Inbound
   - Administrator Console port 8065, TLS, TCP Inbound
   - SMTP port 10025, TCP/UDP Outbound

**Deploy Generic Linux**

1. Log in to the server that will host Mattermost Server and open a terminal window.

2. Download `the latest version of the Mattermost Server <https://mattermost.com/deploy/>`__. In the following command, replace ``X.X.X`` with the version that you want to download:
  
   .. code:: bash

    wget https://releases.mattermost.com/X.X.X/mattermost-X.X.X-linux-amd64.tar.gz

3. Extract the Mattermost Server files.
  
   .. code:: bash
            
    tar -xvzf mattermost*.gz

4. Move the extracted file to the ``/opt`` directory.
  
   .. code:: bash
            
    sudo mv mattermost /opt

5. Create the storage directory for files.

   .. code:: bash
            
    sudo mkdir /opt/mattermost/data
  
.. note::
    
  The storage directory will contain all the files and images that your users post to Mattermost, so you need to make sure that the drive is large enough to hold the anticipated number of uploaded files and images.

6. Set up a system user and group called ``mattermost`` that will run this service, and set the ownership and permissions.
  
  a. Create the Mattermost user and group.
        
     .. code:: bash

        sudo useradd --system --user-group mattermost
  
  b. Set the user and group *mattermost* as the owner of the Mattermost files.
    
     .. code:: bash
            
        sudo chown -R mattermost:mattermost /opt/mattermost
  
  c. Give write permissions to the *mattermost* group.
        
     .. code:: bash
            
        sudo chmod -R g+w /opt/mattermost

7. Set up the database driver in the file ``/opt/mattermost/config/config.json``. Open the file in a text editor and make the following changes:
  
   **If you're using PostgreSQL:**

   Set ``"DriverName"`` to ``"postgres"``
   Set ``"DataSource"`` to the following value, replacing ``<mmuser-password>``  and ``<host-name-or-IP>`` with the appropriate values: ``"postgres://mmuser:<mmuser-password>@<host-name-or-IP>:5432/mattermost?sslmode=disable&connect_timeout=10",``
  
   **If you're using MySQL:**

   Set ``"DriverName"`` to ``"mysql"``
   Set ``"DataSource"`` to the following value, replacing ``<mmuser-password>``  and ``<host-name-or-IP>`` with the appropriate values. Also make sure that the database name is ``mattermost`` instead of ``mattermost_test``: ``"mmuser:<mmuser-password>@tcp(<host-name-or-IP>:3306)/mattermost?charset=utf8mb4,utf8&writeTimeout=30s"``

8. Test the Mattermost server to make sure everything works.
    
  a. Change to the Mattermost directory.
            
     .. code:: bash
            
      cd /opt/mattermost
            
  b. Start the Mattermost server as the user mattermost.
            
     .. code:: bash
            
      sudo -u mattermost bin/mattermost
  
    When the server starts, it shows some log information and the text ``Server is listening on :8065``. You can stop the server by pressing :kbd:`Ctrl` :kbd:`C` on Windows or Linux, or :kbd:`⌘` :kbd:`C` on Mac, in the terminal window.

9. Set up Mattermost to use *systemd* for starting and stopping.
  
  a. Create a *systemd* unit file.
    
     .. code:: bash
            
      sudo touch /lib/systemd/system/mattermost.service
  
  b. Open the unit file as *root* in a text editor, and copy the following lines into the file.
  
     .. code-block:: none

      [Unit]
      Description=Mattermost
      After=network.target
      After=postgresql.service
      BindsTo=postgresql.service
      [Service]
      Type=notify
      ExecStart=/opt/mattermost/bin/mattermost
      TimeoutStartSec=3600
      KillMode=mixed
      Restart=always
      RestartSec=10
      WorkingDirectory=/opt/mattermost
      User=mattermost
      Group=mattermost
      LimitNOFILE=49152
      [Install]
      WantedBy=multi-user.target
  
  .. note::
    
      * If you're using MySQL, replace ``postgresql.service`` with ``mysql.service`` in two places in the ``[Unit]`` section.
      * If you've installed MySQL or PostgreSQL on a dedicated server, you need to remove the ``After=mysql.service`` and ``BindsTo=mysql.service`` or the ``After=postgresql.service`` and ``BindsTo=postgresql.service`` lines in the ``[Unit]`` section or the Mattermost service won't start.
    
  c. Make systemd load the new unit.
    
     .. code:: bash
            
      sudo systemctl daemon-reload
  
  d. Check to make sure that the unit was loaded.
    
     .. code:: bash
            
      sudo systemctl status mattermost.service
    
  You should see an output similar to the following:
    
  .. code-block:: none
                
    mattermost.service - Mattermost
    Loaded: loaded (/lib/systemd/system/mattermost.service; disabled; vendor preset: enabled)
    Active: inactive (dead)
  
  e. Start the service.
    
     .. code:: bash
            
      sudo systemctl start mattermost.service
  
  f. Verify that Mattermost is running.
    
     .. code:: bash
            
      curl http://localhost:8065
    
  You should see the HTML that's returned by the Mattermost server. If a firewall is used, external requests to port 8065 may be blocked. Use ``sudo ufw allow 8065`` to open port 8065.
  
  g. Set Mattermost to start on machine start up.

     .. code:: bash
            
      sudo systemctl enable mattermost.service

Once you're Mattermost server is up and running, create your first Mattermost user, `invite more users <https://docs.mattermost.com/channels/manage-channel-members.html>`__, and explore the Mattermost platform. 
source/install/common-prod-deploy-omnibus.rst METASEP
:orphan:
:nosearch:
.. This page is intentionally not accessible via the LHS navigation pane because it's common content included on other docs pages.

Mattermost bundles the components of a Mattermost deployment into a single installation, called **Omnibus**. Mattermost Omnibus currently supports Ubuntu's ``bionic`` and ``focal`` distributions. The package bundles the free, unlicensed Mattermost Enterprise version of Mattermost, and leverages the `apt package manager <https://ubuntu.com/server/docs/package-management>`__ to install and update the platform components. A custom CLI and ansible recipes link the components together and configures them.

**Minimum system requirements**

- Hardware: 2 vCPUs/cores with 4GB RAM (support for 1,000-2,000 users)
- Database: MySQL v8+ or PostgreSQL v12+
- Network ports required: 

  - Application ports 80/443, TLS, TCP Inbound
  - Administrator Console port 8065, TLS, TCP Inbound
  - SMTP port 10025, TCP/UDP Outbound

**Deploy Omnibus**

1. In a terminal window, run the following command to configure the repositories needed for a PostgreSQL database, configure an NGINX web server to act as a proxy, configure certbot to issue and renew the SSL certificate, and configure the Mattermost Omnibus repository so that you can run the install command.

   .. code-block:: none

    curl -o- https://deb.packages.mattermost.com/repo-setup.sh | sudo bash

2. Install the Omnibus package.

   .. code-block:: none

    sudo apt install mattermost-omnibus -y

  To issue the certificate, the installer requests a domain name and an email address from you. These are used to generate the certificate and deliver any related communications. After all the packages are installed, Omnibus runs ansible scripts that configure all the platform components and starts the server. 

    .. note::

      If you encounter ``EXPKEYSIG``, this indicates that the certificate is expired. To obtain a new certificate, run the following commands:

       .. code-block:: none

        sudo apt-key remove 44774B28
        sudo curl -o- https://deb.packages.mattermost.com/pubkey.gpg | sudo apt-key add -
        sudo apt update

3. Open a browser and navigate to your Mattermost domain either by domain name (e.g. ``mymattermostserver.com``), or by the server's IP address if you're not using a domain name. 

4. Create your first Mattermost user, `invite more users <https://docs.mattermost.com/channels/manage-channel-members.html>`__, and explore the Mattermost platform. 

   .. note:: 

    We recommend installing and configuring Omnibus with SSL enabled; however, you can run the following command to disable SSL: ``sudo MMO_HTTPS=false apt install mattermost-omnibus``.

Update Mattermost Omnibus
-------------------------

Mattermost Omnibus is integrated with the apt package manager. When a new Mattermost version is released, run: ``sudo apt update && sudo apt upgrade`` to download and update your Mattermost instance.

source/install/common-prod-deploy-kubernetes.rst METASEP
:orphan:
:nosearch:
.. This page is intentionally not accessible via the LHS navigation pane because it's common content included on other docs pages.

You can install and deploy a production-ready Mattermost system on a Kubernetes cluster using the Mattermost Kubernetes Operator in practically any environment with less IT overhead and more automation.

You'll need a `Kubernetes cluster <https://kubernetes.io/docs/setup/>`__ running version 1.16 or higher,  Kubernetes CLI `kubectl <https://kubernetes.io/docs/reference/kubectl/overview/>`__ installed on local machine, and a basic understanding of Kubernetes concepts (such as deployments, pods) and actions (such as applying manifests, viewing pod logs). Running Mattermost in Kubernetes requires resources based on your total number of users. See the `Mattermost Kubernetes Operator <https://docs.mattermost.com/install/mattermost-kubernetes-operator.html>`__ documentation to learn more about the minimum Kubernetes cluster resources Mattermost requires at different scales.

.. tip::
    
    If you’re unsure about which environment you want to use for your Kubernetes cluster, we suggest using a managed service such as as `Amazon EKS <https://aws.amazon.com/eks/>`__, `Azure Kubernetes Service <https://azure.microsoft.com/en-ca/services/kubernetes-service/>`__, `Google Kubernetes Engine <https://cloud.google.com/kubernetes-engine/>`__, or `DigitalOcean Kubernetes <https://www.digitalocean.com/products/kubernetes/>`__.

**Install the operators**

Operators are installed using ``kubectl``, and each operator is created in its own namespace. You can install and run multiple Mattermost installations in the same cluster using different namespaces.

1. Install NGINX ingress controller by following the instructions `here <https://kubernetes.github.io/ingress-nginx/deploy/>`__.

2. Install the Mattermost Operator:

   .. code-block:: sh

    $ kubectl create ns mattermost-operator
    $ kubectl apply -n mattermost-operator -f https://raw.githubusercontent.com/mattermost/mattermost-operator/master/docs/mattermost-operator/mattermost-operator.yaml

.. tip::

    To install the operators using the Mattermost Operator Helm chart, follow the instructions `here <https://github.com/mattermost/mattermost-helm/tree/master/charts/mattermost-operator>`__.

**Deploy Mattermost**
  
1. (Mattermost Enterprise only) Create a Mattermost license secret by opening a text editor and creating a secret manifest containing the Mattermost license. Replace ``[LICENSE_FILE_CONTENTS]`` below with the contents of your Mattermost license file. Save the file as ``mattermost-license-secret.yaml``.

  .. code-block:: yaml

    apiVersion: v1
    kind: Secret
    metadata:
      name: mattermost-license
    type: Opaque
    stringData:
      license: [LICENSE_FILE_CONTENTS]

2. Create an installation manifest file locally in a text editor by copying and pasting contenst from the Mattermost installation manifest, and adjusting fields for your configuration and environment. 

  .. code-block:: yaml

    apiVersion: installation.mattermost.com/v1beta1
    kind: Mattermost
    metadata:
      name: mm-example-full                         # Chose the desired name
    spec:
      size: 5000users                               # Adjust to your requirements
      ingress:
        enabled: true
        host: example.mattermost-example.com        # Adjust to your domain
        annotations:
          kubernetes.io/ingress.class: nginx
      version: 6.0.1
      licenseSecret: ""                             # If you have created secret in step 1, put its name here
    
  Save the file as ``mattermost-installation.yaml``. While recommended file names are provided, your naming conventions may differ. 

  Some of the most commonly-used fields include:

  .. csv-table::
    :header: "Field", "Description", "Must Edit"

    "metadata.name", "The name of your Mattermost as it will be shown in Kubernetes. The shorter the better.", "Yes"
    "spec.size", "The size of your installation. This can be '100users', '1000users, '5000users', '10000users', or '25000users'.", "Yes"
    "spec.ingress.host", "The DNS for your Mattermost installation.", "Yes"
    "spec.version", "The Mattermost version.", "No"
    "spec.licenseSecret", "The name of the Kubernetes secret containing your license (e.g. mattermost-license). Required for Enterprise deployments.", "No"
    "spec.mattermostEnv", "List of custom environment variables for the Mattermost instance.", "No"
    
    Additional fields are documented `in the example <https://github.com/mattermost/mattermost-operator/blob/master/docs/examples/mattermost_full.yaml>`__.
    If you have previous experience with Kubernetes Custom Resources, you can also check the `Custom Resource Definition <https://github.com/mattermost/mattermost-operator/blob/master/config/crd/bases/installation.mattermost.com_mattermosts.yaml>`__.

3. Create external database secret. (Skip if using MySQL and MinIO operators).

  The database secret needs to be created in the namespace that will hold the Mattermost installation. The secret should contain the following data:

  .. csv-table::
    :header: "Key", "Description", "Required"

    "DB_CONNECTION_STRING", "Connection string to the database.", "Yes"
    "MM_SQLSETTINGS_DATASOURCEREPLICAS", "Connection string to read replicas of the database.", "No"
    "DB_CONNECTION_CHECK_URL", "The URL used for checking that the database is accessible.", "No"

  Example secret for AWS Aurora compatible with PostgreSQL:

  .. code-block:: yaml

    apiVersion: v1
    data:
      DB_CONNECTION_CHECK_URL: cG9zdGdyZXM6Ly91c2VyOnN1cGVyX3NlY3JldF9wYXNzd29yZEBteS1kYXRhYmFzZS5jbHVzdGVyLWFiY2QudXMtZWFzdC0xLnJkcy5hbWF6b25hd3MuY29tOjU0MzIvbWF0dGVybW9zdD9jb25uZWN0X3RpbWVvdXQ9MTAK
      DB_CONNECTION_STRING: cG9zdGdyZXM6Ly91c2VyOnN1cGVyX3NlY3JldF9wYXNzd29yZEBteS1kYXRhYmFzZS5jbHVzdGVyLWFiY2QudXMtZWFzdC0xLnJkcy5hbWF6b25hd3MuY29tOjU0MzIvbWF0dGVybW9zdD9jb25uZWN0X3RpbWVvdXQ9MTAK
      MM_SQLSETTINGS_DATASOURCEREPLICAS: cG9zdGdyZXM6Ly91c2VyOnN1cGVyX3NlY3JldF9wYXNzd29yZEBteS1kYXRhYmFzZS5jbHVzdGVyLXJvLWFiY2QudXMtZWFzdC0xLnJkcy5hbWF6b25hd3MuY29tOjU0MzIvbWF0dGVybW9zdD9jb25uZWN0X3RpbWVvdXQ9MTAK
    kind: Secret
    metadata:
      name: my-postgres-connection
    type: Opaque

  .. note:: 

    - For PostgreSQL databases, the connection is checked with `pg_isready <https://www.postgresql.org/docs/9.3/app-pg-isready.html>`__ so the ``DB_CONNECTION_CHECK_URL`` is the same as connection string.
    - For MySQL databases, the check is performed via HTTP call; therefore ``DB_CONNECTION_CHECK_URL`` should be an HTTP URL.

4. Create external filestore secret (Skip if using MySQL and MinIO operators).

  The filestore secret needs to be created in the namespace that will hold the Mattermost installation. The secret should contain the following data:

  .. csv-table::
    :header: "Key", "Description", "Required"

    "accesskey", "Filestore access key.", "Yes"
    "secretkey", "Filestore secret key.", "Yes"

  Example secret for AWS S3:

  .. code-block:: yaml

    apiVersion: v1
    data:
      accesskey: QUNDRVNTX0tFWQo=
      secretkey: U1VQRVJfU0VDUkVUX0tFWQo=
    kind: Secret
    metadata:
      name: my-s3-iam-access-key
    type: Opaque

5. Adjust installation manifest (Skip if using MySQL and MinIO operators).

  To instruct Mattermost Operator to use the external database, modify Mattermost manifest by adding the following fields:

  .. code-block:: yaml

    spec:
    ...
      database:
        external:
          secret: my-postgres-connection

  To instruct Mattermost Operator to use the external filestore, modify Mattermost manifest by adding the following fields:

  .. code-block:: yaml

    spec:
    ...
      fileStore:
        external:
          url: s3.amazonaws.com
          bucket: my-s3-bucket
          secret: my-s3-iam-access-key

  Additionally when using Amazon S3, set the ``MM_FILESETTINGS_AMAZONS3SSE`` and ``MM_FILESETTINGS_AMAZONS3SSL`` environment variables to ``true``:

  .. code-block:: yaml

    spec:
    ...
      mattermostEnv:
        ...
        - name: MM_FILESETTINGS_AMAZONS3SSE
          value: "true"
        - name: MM_FILESETTINGS_AMAZONS3SSL
          value: "true"

  Example Mattermost manifest configured with both external databases and filestore:

  .. code-block:: yaml

    apiVersion: installation.mattermost.com/v1beta1
    kind: Mattermost
    metadata:
      name: mm-example-external-db
    spec:
      size: 5000users
      ingress:
        enabled: true
        host: example.mattermost-example.com
        annotations:
          kubernetes.io/ingress.class: nginx
      version: 6.0.1
      licenseSecret: ""
      database:
        external:
          secret: my-postgres-connection
      fileStore:
        external:
          url: s3.amazonaws.com
          bucket: my-s3-bucket
          secret: my-s3-iam-access-key
      mattermostEnv:
      - name: MM_FILESETTINGS_AMAZONS3SSE
        value: "true"
      - name: MM_FILESETTINGS_AMAZONS3SSL
        value: "true"

6. Apply the installation manifest file. Manifests are applied with ``kubectl``. Before running the commands make sure you are connected to your Kubernetes cluster.

  a. Create the Mattermost namespace:

    .. code-block:: sh

        $ kubectl create ns mattermost

  b. (Mattermost Enterprise only) apply the license file by specifying the path to the file you created in step 1:

    .. code-block:: sh

        $ kubectl apply -n mattermost -f [PATH_TO_LICENCE_SECRET_MANIFEST]

  c. Apply the installation file by specifying the path to the file you created in step 2:

    .. code-block:: sh

        $ kubectl apply -n mattermost -f [PATH_TO_MATTERMOST_MANIFEST]

  The deployment process can be monitored in the Kubernetes user interface or in command line by running:

  .. code-block:: sh

    $ kubectl -n mattermost get mm -w

  The installation should be deployed successfully, when the Custom Resource reaches the ``stable`` state.

7. Configure DNS and use Mattermost.

  When the deployment is complete, obtain the hostname or IP address of your Mattermost deployment using the following command:

  .. code-block:: sh

    $ kubectl -n mattermost get ingress

  Copy the resulting hostname or IP address from the ``ADDRESS`` column, open your browser, and connect to Mattermost.

  Use your domain registration service to create a canonical name or IP address record for the ``ingress.host`` in your manifest, pointing to the address you just copied. For example, on AWS you would do this within a hosted zone in Route53.

  Navigate to the ``ingress.host`` URL in your browser and use Mattermost.

  If you just want to try it out on your local machine without configuring the domain, run:

  .. code-block:: sh

    $ kubectl -n mattermost port-forward svc/[YOUR_MATTERMOST_NAME] 8065:8065

  Then navigate to http://localhost:8065.








 




source/install/common-prod-deploy-docker.rst METASEP
:orphan:
:nosearch:
.. This page is intentionally not accessible via the LHS navigation pane because it's common content included on other docs pages.

You'll need `Docker Engine <https://docs.docker.com/engine/install/>`__ and `Docker Compose <https://docs.docker.com/compose/install/>`__ (release 1.28 or later) Follow the steps in the `Mattermost Docker Setup README <https://github.com/mattermost/docker#mattermost-docker-setup>`__ or follow the steps below.

Encountering issues with your Docker deployment? See the `Docker deployment troubleshooting <https://docs.mattermost.com/install/troubleshooting.html#docker-deployments>`__ documentation for details.
      
1. In a terminal window, clone the repository and enter the directory.

   .. code:: bash
        
      git clone https://github.com/mattermost/docker
      cd docker

2. Create your ``.env`` file by copying and adjusting the ``env.example`` file.

   .. code:: bash
        
      cp env.example .env

.. important::
    
      At a minimum, you must edit the ``DOMAIN`` value in the ``.env`` file to correspond to the domain for your Mattermost server.

3. Create the required directories and set their permissions.

   .. code:: bash
        
      mkdir -p ./volumes/app/mattermost/{config,data,logs,plugins,client/plugins,bleve-indexes}
      sudo chown -R 2000:2000 ./volumes/app/mattermost

4. Configure TLS for NGINX *(optional)*. If you're not using the included NGINX reverse proxy, you can skip this step.

   **If creating a new certificate and key:**

   .. code:: bash
  
      bash scripts/issue-certificate.sh -d <YOUR_MM_DOMAIN> -o ${PWD}/certs

   To include the certificate and key, uncomment the following lines in your ``.env`` file and ensure they point to the appropriate files.

   .. code:: bash
  
      #CERT_PATH=./certs/etc/letsencrypt/live/${DOMAIN}/fullchain.pem
      #KEY_PATH=./certs/etc/letsencrypt/live/${DOMAIN}/privkey.pem

   **If using a pre-existing certificate and key:**

   .. code:: bash
  
            mkdir -p ./volumes/web/cert
            cp <PATH-TO-PRE-EXISTING-CERT>.pem ./volumes/web/cert/cert.pem
            cp <PATH-TO-PRE-EXISTING-KEY>.pem ./volumes/web/cert/key-no-password.pem

   To include the certificate and key, ensure the following lines in your ``.env`` file points to the appropriate files.

   .. code:: bash
  
            CERT_PATH=./volumes/web/cert/cert.pem
            KEY_PATH=./volumes/web/cert/key-no-password.pem

5. Configure SSO with GitLab *(optional)*. If you want to use SSO with GitLab, and you're using a self-signed certificate, you have to add the PKI chain for your authority. This is required to avoid the ``Token request failed: certificate signed by unknown authority`` error.
      
   To add the PKI chain, uncomment this line in your ``.env`` file, and ensure it points to your ``pki_chain.pem`` file:

   .. code:: bash
  
      #GITLAB_PKI_CHAIN_PATH=<path_to_your_gitlab_pki>/pki_chain.pem
        
   Then uncomment this line in your ``docker-compose.yml`` file, and ensure it points to the same ``pki_chain.pem`` file:

   .. code:: bash

      # - ${GITLAB_PKI_CHAIN_PATH}:/etc/ssl/certs/pki_chain.pem:ro

6. Deploy Mattermost.

   **Without using the included NGINX:**

   .. code:: bash
  
      sudo docker-compose -f docker-compose.yml -f docker-compose.without-nginx.yml up -d

   To access your new Mattermost deployment, navigate to ``http://<YOUR_MM_DOMAIN>:8065/`` in your browser.

   To shut down your deployment:

   .. code:: bash
  
      sudo docker-compose -f docker-compose.yml -f docker-compose.without-nginx.yml down

   **Using the included NGINX:**

   .. code:: bash
  
      sudo docker-compose -f docker-compose.yml -f docker-compose.nginx.yml up -d

   To access your new Mattermost deployment via HTTPS, navigate to ``https://<YOUR_MM_DOMAIN>/`` in your browser.

   To shut down your deployment:

   .. code:: bash
  
      sudo docker-compose -f docker-compose.yml -f docker-compose.nginx.yml down
      
7. Create your first Mattermost System Admin user, `invite more users <https://docs.mattermost.com/channels/manage-channel-members.html>`__, and explore the Mattermost platform. 
source/install/common-local-deploy-docker.rst METASEP
:nosearch:
.. This page is intentionally not accessible via the LHS navigation pane because it's common content included on other docs pages.

Preview Mattermost using Docker
-------------------------------

You can install Mattermost server in **Preview Mode** using the `Mattermost Docker Preview Image <https://github.com/mattermost/mattermost-docker-preview>`__ image to explore Mattermost product functionality on a single local machine.

.. important::

    This local image is self-contained (i.e., it has an internal database and works out of the box). Dropping a container using this image removes data and configuration as expected. You can see the `configuration settings <https://docs.mattermost.com/configure/configuration-settings.html>`__ documentation to learn more about customizing your preview deployment.
    
    However, **Preview Mode** shouldn't be used in a production environment, as it uses a known password string, contains other non-production configuration settings, has email disabled, keeps no persistent data (all data lives inside the container), and doesn't support upgrades. 

1. Install `Docker <https://www.docker.com/get-started/>`__.

2. Once you have Docker, run the following command in a terminal window:

  .. code:: bash

    docker run --name mattermost-preview -d --publish 8065:8065 mattermost/mattermost-preview

3. When Docker is done fetching the image, navigate to ``http://localhost:8065/`` in your browser to preview Mattermost.
source/install/cluster-transport-encryption.rst METASEP
Configuring cluster transport encryption
========================================

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Mattermost Enterprise Edition E20*

Mattermost is able to encrypt the messages sent within the cluster of a deployment using SSH tunneling. The guide walks through the deployment of this solution on Ubuntu 18.04, but it can be adapted for any Linux operating system.

While this document only describes the configuration of a three-node cluster, it is by no means limited to that number.

Prerequisites
-------------

- SSH port whitelisted between each node of the deployment.
- Active ufw/iptables on each node.
- Access to the root/sudo user of each node for configuration.
- A configured Mattermost cluster.
- Mattermost running with a dedicated service user.
- Mattermost service is stopped on each cluster node.

.. note:: 
  Support on the application level is currently in development and, when available, will deprecate this document.

Example environment
-------------------

In this scenario there are three application nodes in our environment with the following hostname/IP mapping:

- **transport-encryption-mattermost1:** 10.10.250.146
- **transport-encryption-mattermost2:** 10.10.250.231
- **transport-encryption-mattermost3:** 10.10.250.165

Preparations
------------

- Connect to each Mattermost server with a sudo or root user.
- Make a note of the IP from each cluster member used for the internal communication.
- Ensure ``AllowTcpForwarding`` is enabled in ``/etc/ssh/sshd_config`` of each cluster node.

SSH authentication
------------------

On each node, generate a SSH key-pair for the service account. In our scenario this is called ``mattermost``:

.. code-block:: none

  $ sudo -u mattermost ssh-keygen -t rsa
    Generating public/private rsa key pair.
    Enter file in which to save the key (/home/mattermost/.ssh/id_rsa):
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /home/mattermost/.ssh/id_rsa.
    Your public key has been saved in /home/mattermost/.ssh/id_rsa.pub.
    The key fingerprint is:
    SHA256:redacted mattermost@transport-encryption-mattermost1


The location of the SSH key itself is irrelevant if company policies require the usage of another storage location.

Next, ensure that the SSH public key of each node is added to the ``authorized_keys`` file of the other nodes of the cluster. To do so, copy the contents of ``/home/mattermost/.ssh/id_rsa.pub`` of nodes 2 and 3, and add it to ``/home/mattermost/.ssh/authorized_keys`` of node 1.

Repeat this step for each node of the cluster. As a result, each node should be able to establish an SSH connection to the other nodes of the cluster.

.. note:: 
  
  This service account can be separate from the service account already used for the Mattermost ``systemd`` service itself. It's important that this service account is allowed to create a SSH tunnel with port forwarding, but it doesn't require any additional permissions.

ufw configuration
-----------------

As a next step, allow SSH access from each of the other member nodes, e.g.:

- mattermost1 allows from mattermost2 and mattermost3
- mattermost2 allows from mattermost1 and mattermost3
- mattermost3 allows from mattermost1 and mattermost2

To do so, we add an exception in the firewall. The commands for ``mattermost1`` look as follows:

.. code-block:: none

  $ sudo ufw allow from 10.10.250.231/32 to any port ssh
  Rule added
  $ sudo ufw allow from 10.10.250.165/32 to any port ssh
  Rule added
  $ sudo ufw status
  Status: active

  To                         Action      From
  --                         ------      ----
  22/tcp                     ALLOW       10.10.250.10
  8065/tcp                   ALLOW       Anywhere
  22/tcp                     ALLOW       10.10.250.231
  22/tcp                     ALLOW       10.10.250.165


Repeat the same steps on the other nodes, replacing the IPs with the ones from the other member nodes. Do so for each member node, excluding the node itself.

Next, open ``/etc/ufw/after.rules`` and add the following block to the bottom of the file:

.. code-block:: none

  *nat
  :POSTROUTING ACCEPT [0:0]
  :PREROUTING ACCEPT [0:0]

  -A OUTPUT -p tcp -d 10.10.250.231 --dport 8075 -j DNAT --to-destination 127.0.0.1:18075
  -A OUTPUT -p tcp -d 10.10.250.231 --dport 8074 -j DNAT --to-destination 127.0.0.1:18074
  -A OUTPUT -p tcp -d 10.10.250.165 --dport 8075 -j DNAT --to-destination 127.0.0.1:28075
  -A OUTPUT -p tcp -d 10.10.250.165 --dport 8074 -j DNAT --to-destination 127.0.0.1:28074

  COMMIT


Two lines always belong to a single node, so in a deployment with four nodes:

.. code-block:: none

  -A OUTPUT -p tcp -d ip_node_2 --dport 8075 -j DNAT --to-destination 127.0.0.1:18075
  -A OUTPUT -p tcp -d ip_node_2 --dport 8074 -j DNAT --to-destination 127.0.0.1:18074
  -A OUTPUT -p tcp -d ip_node_3 --dport 8075 -j DNAT --to-destination 127.0.0.1:28075
  -A OUTPUT -p tcp -d ip_node_3 --dport 8074 -j DNAT --to-destination 127.0.0.1:28074
  -A OUTPUT -p tcp -d ip_node_4 --dport 8075 -j DNAT --to-destination 127.0.0.1:38075
  -A OUTPUT -p tcp -d ip_node_4 --dport 8074 -j DNAT --to-destination 127.0.0.1:38074

Please be aware that the ports on the right side must be unique, so if you have a cluster of six nodes, use 8075 and 8074 with 1 to 5 in front of it. If the cluster is of bigger size, additional ports must be used.

Ensure that your operating system has IP forwarding enabled using the following command:

.. code-block:: none

  $ sysctl -w net.ipv4.ip_forward=1

After that, reload the ufw rules and confirm that the iptable rules were successfully created:

.. code-block:: none

  $ iptables -t nat -L
  Chain PREROUTING (policy ACCEPT)
  target     prot opt source               destination

  Chain INPUT (policy ACCEPT)
  target     prot opt source               destination

  Chain OUTPUT (policy ACCEPT)
  target     prot opt source               destination
  DNAT       tcp  --  anywhere             10.10.250.231        tcp dpt:8075 to:127.0.0.1:18075
  DNAT       tcp  --  anywhere             10.10.250.231        tcp dpt:8074 to:127.0.0.1:18074
  DNAT       tcp  --  anywhere             10.10.250.165        tcp dpt:8075 to:127.0.0.1:28075
  DNAT       tcp  --  anywhere             10.10.250.165        tcp dpt:8074 to:127.0.0.1:28074

Repeat those steps for every node on the cluster. At the end of this section the following should be configured:

- SSH access enabled in firewall from each cluster node to another.
- Per node 2 iptables rules for port 8074 and 8075.
- IP forwarding enabled.

SSH configuration
-----------------

As a next step, ensure that the SSH tunnels are created as part of the Mattermost service start. To do so, create a file called ``pre_start.sh`` in ``/opt/mattermost/bin`` on ``mattermost1``:

.. code-block:: none

  #!/bin/bash
  ssh -N -f -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -L 18075:10.10.250.231:8075 10.10.250.231 || true
  ssh -N -f -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -L 18074:10.10.250.231:8074 10.10.250.231 || true
  ssh -N -f -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -L 28075:10.10.250.165:8075 10.10.250.165 || true
  ssh -N -f -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -L 28074:10.10.250.165:8074 10.10.250.165 || true

.. note:: 
  
  - We're ignoring the error from the SSH connection itself in case a tunnel is already active. Otherwise the Mattermost server would fail to start.
  - Please make sure to back up this script in case of a version upgrade.

Afterwards, set the executable bit on the shell script:

.. code-block:: none

  $ chmod +x /opt/mattermost/bin/pre_start.sh

Open the systemd unit file of Mattermost and search for ``Type=Notify``. After this, enter a ``ExecStartPre`` script that will be executed before Mattermost itself is started:

.. code-block:: none

  [Service]
  Type=notify
  ExecStartPre=/opt/mattermost/bin/pre_start.sh

Reload the systemd daemon afterwards:

.. code-block:: none

  $ systemctl daemon-reload

Repeat the same steps on each of the member nodes and adapt the node IPs and amount of entries for your environment.

Cluster start
-------------

Once each node is configured, restart the service on each cluster and confirm that it's running using the command below:

.. code-block:: none

  root@transport-encryption-mattermost1:/opt/mattermost/bin# systemctl start mattermost
  root@transport-encryption-mattermost1:/opt/mattermost/bin# systemctl status mattermost.service
  ● mattermost.service - Mattermost
     Loaded: loaded (/lib/systemd/system/mattermost.service; static; vendor preset: enabled)
     Active: active (running) since Fri 2019-10-04 19:44:20 UTC; 5min ago
    Process: 16734 ExecStartPre=/opt/mattermost/bin/pre_start.sh (code=exited, status=0/SUCCESS)

Next, open the Mattermost System Console and confirm that each node is reporting successfully in the High Availability section.

source/install/cloud-changelog.md METASEP
# Mattermost Cloud changelog

This changelog summarizes updates to [Mattermost Cloud](https://mattermost.com/get-started/), an enterprise-grade SaaS offering hosted by Mattermost.

Latest Mattermost Cloud releases:

- [Release 2022-09-08](#release-2022-09-08)
- [Release 2022-09-01](#release-2022-09-01)
- [Release 2022-08-25](#release-2022-08-25)
- [Release 2022-08-18](#release-2022-08-18)
- [Release 2022-08-10](#release-2022-08-10)
- [Release 2022-08-03](#release-2022-08-03)

## Release 2022-09-08

### Improvements

#### User Interface (UI)
 - Added a red destructive action color to the **Leave Channel** button in the channel header.
 - The "limits reached" modal is now shown to Admins who are doing a fresh login on Cloud instances that hit the message history limit.

### Bug Fixes
 - Fixed an issue where muted channels with an at-mention were displayed under the **Unreads** section of the channel switcher.
 - Fixed an issue where the Collapsed Reply Threads setting was displayed in the **System Console > Experimental Features** section.

### Known Issues
 - The Playbooks left-hand sidebar does not update when a user is added to a run or playbook without a refresh.
 - The runs and playbooks in the Playbooks left-hand sidebar don't have dot-menus that allow interaction with each item [MM-44752](https://mattermost.atlassian.net/browse/MM-44752).
 - On the new Boards RHS from the channel Apps Bar, channel members who are not board admins are incorrectly able to see the **Unlink** board button. However, selecting the button doesn't actually unlink the board unless the user is a board admin [issue-focalboard-3600](https://github.com/mattermost/focalboard/issues/3600).

## Release 2022-09-01

### Improvements

#### Boards
 - Added indexes to improve performance.
 - Fixed a bug where the **New** button in Kanban columns didn't always work [issue-focalboard-3600](https://github.com/mattermost/focalboard/issues/3600).
 - Fixed issues with 'single-user' mode.

#### User Interface (UI)
 - Added new Insights widgets: Most Active Direct Messages, Least Active Channels, and New Team Members.
 - Introduced a new ``/marketplace command`` that brings up the marketplace modal for the Admin, and changed the ``/help`` command so that it now keeps the user internal to Mattermost.
 - Team unreads are now calculated based on the channel membership and threads only. Team membership is no longer taken into account.
 - For introducing Boards and Playbooks to new users, an “explore other tools in platform” item was added to the end user onboarding checklist.
 
#### API Changes
 - Added new API endpoints:
 
	  - ``GET /api/v4/users/me/top/dms``
	  - ``GET /api/v4/users/me/top/threads``
	  - ``GET /api/v4/teams/:team_id/top/team_members``
	  - ``GET /api/v4/teams/:team_id:/top/threads``

### Bug Fixes
 - Fixed an issue in **System Console > Subscription** where the completed Company Information screen read "Provide your company name and address".
 - Fixed an issue where reading a thread on the mobile app caused a negative mention count to display on the web app.
 - Fixed an issue where the user profile image persisted after user account deletion.

### Known Issues
 - Known issues related to the new Insights widgets, such as that pagination displays for 10 items or less [MM-46595](https://mattermost.atlassian.net/browse/MM-46595).
 - ``/marketplace`` slash command opens the Marketplace with an error displayed [MM-46663](https://mattermost.atlassian.net/browse/MM-46663).
 - Alt+click does not mark a root post as unread on global threads inbox [MM-46683](https://mattermost.atlassian.net/browse/MM-46683).
 - The Playbooks left-hand sidebar does not update when a user is added to a run or playbook without a refresh.
 - The runs and playbooks in the Playbooks left-hand sidebar don't have dot-menus that allow interaction with each item [MM-44752](https://mattermost.atlassian.net/browse/MM-44752).
 - On the new Boards RHS from the channel Apps Bar, channel members who are not board admins are incorrectly able to see the **Unlink** board button. However, selecting the button doesn't actually unlink the board unless the user is a board admin [issue-focalboard-3600](https://github.com/mattermost/focalboard/issues/3600).

## Release 2022-08-25

### Improvements

#### User Interface (UI)
 - Added the **Save** option to the post menu.
 - Added a banner to communicate delinquency to Cloud Customers.
 - Cloud instances with a file limit (Starter and Professional subscriptions) now display icons notifying that the limit has been hit and that archived files are unavailable until upgrade.

#### Administration
 - Started tracking the join time of team members and added a new API endpoint to retrieve information about team members who have joined during a given time.
 - Introduced an optional ``shouldRender`` function parameter to ``registerchannelHeaderMenuAction`` plugin function. This allows menu items to conditionally render depending on the current state prior to rendering.

### Bug Fixes
 - Fixed an issue where exports generated via mmctl without attachments still included the file properties in the post, so they couldn't be imported.
 - Fixed an issue that caused a crash when unread posts were fetched.

### Known Issues
 - Mentions incorrectly show users as not in a channel [MM-44157](https://mattermost.atlassian.net/browse/MM-44157).
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.
 - The Playbooks left-hand sidebar does not update when a user is added to a run or playbook without a refresh.
 - The runs and playbooks in the Playbooks left-hand sidebar does not have dot-menus that allow interaction with each item [MM-44752](https://mattermost.atlassian.net/browse/MM-44752).
 - On the new Boards RHS from the channel Apps Bar, channel members who are not board admins are incorrectly able to see the **Unlink** board button. However, selecting the button doesn't actually unlink the board unless the user is a board admin [issue-focalboard-3600](https://github.com/mattermost/focalboard/issues/3600).
 - On Boards, selecting the **+ New** button below a column on the Kanban view doesn't always create a new card. As a workaround, set a new default card template by going to the dropdown menu from the blue **New** button on the header of the board, opening the **Options** menu on any card template, and selecting **Set as default** [issue-focalboard-3676](https://github.com/mattermost/focalboard/issues/3676).

## Release 2022-08-18

### Highlights

### Playbooks
 - Navigate between teams in Playbooks with the new team switcher.
 - Manage playbooks and runs in the new left-hand sidebar.
 - View the runs you're participating in or following in the **Runs** sidebar category, and view the playbooks you're a member of in the **Playbooks** sidebar category.
 - Favorite runs or playbooks to prioritize them in the **Favorites** category.
 - Participants now have access to every run feature on the new run details page.
 - In Cloud Professional and Enterprise plans, stakeholders can request status updates from runs.

### Boards
 - All the boards you’re currently a member of from your current team will appear on the sidebar without needing to switch workspaces.
 - Organize boards on the sidebar with custom categories.
 - Press CTRL+K/CMD+K to find additional boards.
 - Navigate between teams in Boards with the new team switcher.
 - Set board and template permissions in the new **Share** setting.
 - Link boards to channels to automatically grant board permissions to channel members.
 - See [the documentation](https://docs.mattermost.com/welcome/whats-new-in-v72.html) for more details.

### Improvements

#### User Interface (UI)
 - Only the most recent message is now marked as unread when marking a thread as unread from the Threads list.
 - Insights filters now persist instead of being reset to default when switching to channels and returning back to the Insights view.
 - Code blocks now have better support for language filetype extensions and are a smaller bundle size.

### Bug Fixes
 - Fixed an issue where updating a profile image and creating new emojis used multipart uploads when using S3 storage.
 - Fixed an issue where the input legend on the custom group modal was cut off in Chrome.
 - Fixed an issue where the **Disable post formatting** setting was hidden when the advanced text editor was enabled.
 - Fixed an issue where we didn’t fall back to the user's default picture if a profile picture failed to load.
 - Fixed an issue where disabling a WebApp plugin from its configuration page resulted in the radio button reverting to ``true``.

### Known Issues
 - Mentions incorrectly shows users as not in a channel [MM-44157](https://mattermost.atlassian.net/browse/MM-44157).
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.
 - The Playbooks left-hand sidebar does not update when a user is added to a run or playbook without a refresh.
 - The runs and playbooks in the Playbooks left-hand sidebar does not have dot-menus that allow interaction with each item [MM-44752](https://mattermost.atlassian.net/browse/MM-44752).
 - On the new Boards RHS from the channel Apps Bar, channel members who are not admins of the board are incorrectly able to see the "unlink" board button. However, clicking on the button will not actually unlink the board unless the user is a board admin [issue-focalboard-3600](https://github.com/mattermost/focalboard/issues/3600).
 - On Boards, clicking on `+ New` button below a column on the Kanban view does not always create a new card. As a workaround, set a new default card template by going to the dropdown menu from the blue `New` button on the header of the board, then open the Options Menu on any card template and select "Set as default" [issue-focalboard-3676](https://github.com/mattermost/focalboard/issues/3676).

## Release 2022-08-10

### Improvements

#### User Interface (UI)
 - A Desktop App prompt is now always shown on first visit to a Mattermost server from an email notification.

### Bug Fixes
 - Fixed an issue where the cursor sometimes jumped to the center channel textbox when the right-hand side was open.
 - Fixed an issue where closing the right-hand side also closed the edited post in the center channel.
 - Fixed an issue where clicking "Try free now" opened the top 3 enterprise features instead of the "Your trial has started" modal.
 - Fixed an issue where the Threads view displayed as unread even if there were no unread threads.

### Known Issues
 - Mentions incorrectly shows users as not in a channel [MM-44157](https://mattermost.atlassian.net/browse/MM-44157).
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.

## Release 2022-08-03

### Improvements

#### User Interface (UI)
 - Search dropdown options now allow focusing with tab.

#### Administration
 - Plugins can now hide plugin settings based on the server's hosting environment.
 - For Cloud instances, when messages limit is reached, a notification is shown in a channel if the limit is being hit in that channel.
 - Customers who are on a 30-day free trial are now notified 3 days before the trial ends.

### API Changes
 - Added ``first_inaccessible_post_time`` to post API responses.
 - Updated permissions of the ``api/v4/posts/{post_id:[A-Za-z0-9]+}/thread`` endpoint. If compliance is enabled, a user can on longer view threads in a public channel they are not a member of.
 - Adds query parameter 'include_deleted' to endpoint: {{[http://your-mattermost-url.com/api/v4/posts/{post_id}/files/info}}](http://your-mattermost-url.com/api/v4/posts/%7Bpost_id%7D/files/info%7D%7D).

### Bug Fixes
 - Fixed an issue where configuration changes could not be saved in the **System Console** in some cases.
 - Custom Brand Text is now centered and the Site Description configuration now doesn't show a placeholder.
 - Removed a bug where the group permissions had an extra level of nesting in the UI. The permissions checkboxes were also split out into their individual custom group permissions for a greater granularity of control.

### Known Issues
 - Mentions incorrectly shows users as not in a channel [MM-44157](https://mattermost.atlassian.net/browse/MM-44157).
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.

## Release 2022-07-28

### Improvements

#### User Interface (UI)
 - Added the ability to quickly and easily forward posts as permalinks with their respective permalink previews.
 - Added a red destructive action color to ``Archive Channel`` and ``Leave Channel`` menu actions.
 - Plugin activation errors now show in the plugin management page and marketplace.
 - Added accessibility to the emoji picker skin tone selector and reversed the order of the skin tone selections in the emoji selector.

#### Administration
 - A new schema and API for audit logs was defined. Contrary to the previous audit log implementation, all audit log records now have the same schema.
 - Added a new static system-level role called Custom Group Manager. This role has permissions to create, edit, and delete custom user groups via User Groups in the Products menu. It can be used to assign individual users this ability when Custom Groups permissions are removed for All Members via the **System Console** (**System Console > Permissions > Edit Scheme > Custom Groups**).
 - Export file names now contain the ID of the job they were generated by.

### Bug Fixes
 - Fixed an issue where a users were unable to remove themselves from a custom role.
 - Fixed an issue where some images in link previews overflowed.
 - Fixed an issue where accessing the **System Console** and then exiting changed the user's status to "Offline".
 - Fixed an issue where the **New Messages** line sometimes appeared when viewing a channel that was previously read.
 - Fixed an issue with incorrectly formatted text in the **System Console**.

### Known Issues
 - Mentions incorrectly shows users as not in a channel [MM-44157](https://mattermost.atlassian.net/browse/MM-44157).
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.

## Release 2022-07-20

### Improvements

#### User Interface (UI)
- Added **Save** and **Cancel** buttons for post inline editing.
- Enterprise trial details are now displayed for end users in the product switcher menu.
- Updated the Edit Header modal text description to be applicable to channels, direct messages, and group messages.

#### Administration
 - Admins are now able to search for channel IDs via **System Console > User Management > Channels** page.
 - In the **System Console** left-hand side, paid features icons are now displayed on the menu entries to indicate enterprise features.
 - Cloud usage rounding for posts and messages is now precise enough to know when a limit has been reached or exceeded.
 - Added ``webSocketClient`` to ``Pluggable`` and ``PostWillRenderEmbed`` plugin registered components.

### Performance
 - Removed ``getLastPostPerChannel`` selector for improved performance in channel sorting.

### Bug Fixes
 - Fixed an issue where users were able to attempt to edit the channel header of an archived channel on the right-hand side.
 - Decreased flakiness of requesting a Cloud trial.
 - Fixed an issue where the “Your Trial Ended” banner hid the product switcher menu.
 - Fixed an issue where the custom status date format was not set to ``yyyy-MM-dd``.

### Known Issues
 - Custom status does not appear until refresh [MM-45334](https://mattermost.atlassian.net/browse/MM-45334).
 - Mentions incorrectly shows users as not in a channel [MM-44157](https://mattermost.atlassian.net/browse/MM-44157).
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.

## Release 2022-07-13

### Highlights

#### Insights (Beta) (Enterprise and Professional subscriptions)
 - Added workplace insights consisting of usage and behavior data, which helps Enterprises further increase productivity of their employees through Mattermost functionality.

### Improvements

#### User Interface (UI)

 - Added the option to colorize usernames in compact display mode when **Account Settings > Display > Message Display > Compact** is selected.
 - Added a setting to always land users at the newest messages in a channel via **Account settings > Advanced > Scroll position when viewing an unread channel**.
 - Added email headers to notification emails so they can be threaded by email clients.

#### Administration
 - Added the ability to start a trial from the **Invite People** modal.
 - Added the ability for end users to notify Admins to upgrade their workspace.
 - Updated the Posts search and get APIs to filter out posts beyond the Cloud plan's limit.
 - The claim of 10 GB storage per user is no longer shown for grandfathered Cloud plan.

### API Changes
 - Added a new response-header ``Has-Inaccessible-Posts`` for ``getPost`` and ``getPostByIDs`` APIs.

### Bug Fixes
 - Fixed an issue with pasting a GitHub code snippet in the message box when text is selected.
 - Fixed an issue where fully typed emojis that contained a capital letter were not correctly displayed.
 - Fixed an issue where the archived icon did not display correctly in dark themes.
 - Fixed an issue where password requirements were not enforced when Development Mode was enabled.

### Known Issues
 - The Top Boards widget in Insights is slow to load.
 - Custom status does not appear until refresh [MM-45334](https://mattermost.atlassian.net/browse/MM-45334).
 - Mentions incorrectly shows users as not in a channel [MM-44157](https://mattermost.atlassian.net/browse/MM-44157).
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.

## Release 2022-06-29

### Improvements

#### User Interface (UI)
- Added support for syntax highlighting for 1C:Enterprise (BSL) language.

#### Administration
 - The System Console now also searches and returns channels based on the channel ID. A new parameter ``IncludeSearchById`` was added to the channel search endpoint, allowing requests to include searches that match IDs in response.
 - Admins now have the ability to downgrade from Professional to Starter subscription via **System Console > Subscription**.
 - The setting ``ServiceSettings.EnableInsecureOutgoingConnections`` is now applicable to S3 clients as well. If this setting is set, S3 clients will skip the TLS verification.
 - Changed the "Enable Authentication Transfer" to be configurable in Cloud by the System Admin.
 - Search results in PostgreSQL will now respect the ``default_text_search_config`` value instead of being hardcoded to English. System Admins are requested to check this value in case of any discrepancies with what is expected.

### API Changes
 - Added new API endpoints ``GET /api/v4/teams/:team_id/top/threads`` and ``GET /api/v4/users/me/top/threads`` to get top threads for a team and user.

### Bug Fixes
 - Fixed an issue where duplicated emojis sometimes displayed as recently used emojis.
 - Fixed an issue where autocomplete "@" search for names did not normalize UTF-8 characters.
 - Fixed an issue where **Group Messages** with long display names didn't have a tooltip in the left-hand sidebar.
 - Fixed an issue where the file icon was sometimes unresponsive.

### Known Issues
 - Custom status does not appear until refresh [MM-45334](https://mattermost.atlassian.net/browse/MM-45334).
 - Images in OpenGraph previews appear broken [MM-45164](https://mattermost.atlassian.net/browse/MM-45164).
 - Channels sometimes don't get marked as read [MM-44900](https://mattermost.atlassian.net/browse/MM-44900).
 - After server upgrade, usage limit warning may stay in the Main Menu until page refresh [MM-45056](https://mattermost.atlassian.net/browse/MM-45056).
 - Mentions incorrectly shows users as not in a channel [MM-44157](https://mattermost.atlassian.net/browse/MM-44157).
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.

## Release 2022-06-22

### Improvements

#### User Interface (UI)
 - Recent emojis are now sorted based on the number of times an emoji has been used.
 - Improved the link preview user interface.
 - Added new search shortcuts to the **Keyboard Shortcuts** modal. 
    - CMD+F (macOS) and CTRL+F (Windows) for Desktop App
    - CMD+SHIFT+F (macOS) and CTRL+SHIFT+F (Windows) for webapp
 - Added a Trial info panel and end date in the Trial section in **System Console > Subscriptions** page.

### Bug Fixes
 - Fixed an issue where links to internal help pages did not always open in a new browser tab.
 - Fixed an issue that caused the Channel Members right-hand side search input to not search all the members of a channel.
 - Fixed an issue where the feature discovery page still displayed a **Start Trial** button after a trial was completed.
 - Fixed an issue where channel recency sorting was not consistent between mobile and webapp.

### Known Issues
 - Images in OpenGraph previews appear broken [MM-45164](https://mattermost.atlassian.net/browse/MM-45164).
 - Channels sometimes don't get marked as read [MM-44900](https://mattermost.atlassian.net/browse/MM-44900).
 - After server upgrade, usage limit warning may stay in the Main Menu until page refresh [MM-45056](https://mattermost.atlassian.net/browse/MM-45056).
 - Post list doesn't always scroll down to show new messages [MM-44131](https://mattermost.atlassian.net/browse/MM-44131).
 - Mentions incorrectly shows users as not in a channel [MM-44157](https://mattermost.atlassian.net/browse/MM-44157).
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.

## Release 2022-06-15

### Bug Fixes
 - Fixed an issue where multiple backend errors displayed when file storage usage got fetched if no files had been uploaded.

## Release 2022-06-14

### Highlights

#### Free Forever Mattermost Cloud Plan
 - Mattermost Cloud now supports a free forever plan, Cloud Starter, for unlimited users for unlimited time.
 - Access unlimited channels, playbooks, and boards across the Mattermost platform, with unlimited voice calls and screen sharing in Direct Messages.
 - The free plan includes a few workspace limits. [Upgrade to Professional for unlimited access](https://mattermost.com/pricing/):
    - Ability to start a free 30-day Enterprise trial, with access to all features during the trial period.
    - Maximum 1 team. Additional teams can be created during a trial or on a paid plan, which are archived if downgraded back to Starter. History will be preserved, though that archived history can only be accessed if a free user upgrades to a paid subscription plan.
    - 10GB file storage across the platform, with 100MB upload limit. History will be preserved.
    - Unlimited installed apps or plugins, with maximum of 5 enabled at one time. History will be preserved.
    - Access to 10,000 most recent messages. History will be preserved.
    - Access to 500 most recently updated cards.
    - Maximum 5 saved views per board.

#### Calls (Beta)
 - [Native voice calling and screen sharing](https://docs.mattermost.com/channels/make-calls.html) is now available. This is a Channels-specific integration.

#### Collapsed Reply Threads (General Availability)
 - [Collapsed Reply Threads](https://docs.mattermost.com/channels/organize-conversations.html) is now generally available and enabled by default for all Cloud users. Administrators may disable it in **System Console > Posts**.

#### Apps Bar (Beta)
 - The channel header is now decluttered to make it more obvious how to access Calls, Playbooks, and Boards when viewing a channel. All channel header icons registered by plugins are moved to the new Apps Bar, while Calls remains in the channel header.

### Improvements

#### User Interface (UI)
 - Applied new designs for the Login screen.
 - Changed some tooltips to appear when focused instead of just on hover.
 - The legacy **Settings > Advanced Settings > Enable Post Formatting** and **Settings > Advanced Settings > Preview Pre-release Features** settings are now deprecated in favor of the the new formatting toolbar.
 - Romanian language support was downgraded to Beta.

#### Administration
 - For all Cloud Workspaces, the default value for Collapsed Reply Threads in **System Console > Posts** is now set to **Always On**. You may choose a different [configuration](https://docs.mattermost.com/configure/configuration-settings.html#collapsed-reply-threads) as desired.
 - Mattermost Cloud Professional plan now includes a 250GB file storage limit.
 - Default password requirements have been loosened to eight characters and no numeric, casing, or special characters required by default. These requirements can be configured by the System Admin as needed via **System Console > Password**.
 - The Collapsed Reply Threads configuration option was moved in the **System Console** from **Experimental** to **Site Configuration > Posts**.

#### API Changes
 - To allow Admins to retrieve contents of posts whether they are deleted or not, ``include_deleted`` query parameter was introduced to ``GetPost`` endpoint.

#### Performance
 - Reduced the number of calls made to ``viewChannel`` API during regular usage.
 - Added pagination to the ``getPostThread`` API calls.

### Bug Fixes
 - Fixed an issue with uploading SVG files.
 - Fixed an issue where thread posts were not left-aligned in compact message display mode.
 - Fixed an error about a missing column for the Shared Channels experimental feature.
 - Fixed an issue where the channel menu drop-down option "Move to..." was skipped when pressing the TAB keyboard key.
 - Fixed an issue where the bulk import failed due to reply ``CreateAt`` being greater than that of the parent post.
 - Fixed an undefined error when leaving a channel with the Unreads filter enabled.
 - Fixed an issue where clicking on a quick emoji reaction opened the right-hand pane.
 - Fixed an issue where the keyboard focus did not go back to the post textbox after hitting CTRL/CMD+SHIFT+P twice.
 - Fixed an issue where the upload files button was positioned incorrectly.

### Known Issues
 - Channels sometimes don't get marked as read [MM-44900](https://mattermost.atlassian.net/browse/MM-44900).
 - After server upgrade, usage limit warning may stay in the Main Menu until page refresh [MM-45056](https://mattermost.atlassian.net/browse/MM-45056).
 - Back bar is showing over the channel header in the Desktop App [MM-44644](https://mattermost.atlassian.net/browse/MM-44644).
 - Post list doesn't always scroll down to show new messages [MM-44131](https://mattermost.atlassian.net/browse/MM-44131).
 - Mentions incorrectly shows users as not in a channel [MM-44157](https://mattermost.atlassian.net/browse/MM-44157).
 - Channel switcher does not show cross team unreads on refresh [MM-44073](https://mattermost.atlassian.net/browse/MM-44073).
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.

## Release 2022-05-26

### Highlights

#### Advanced Text Editor
 - To make markdown features more accessible, an Advanced Text editor was added with new shortcuts to preview, open the emoji picker, strike out text, add headings, format numbered steps, add bullets, and hide the formatting options.

### Improvements

#### User Interface (UI)
 - To keep users in Mattermost when opening documentation links from the **System Console > Plugin** settings page, all the links now open in another tab.
 - Users are no longer hidden from search results in the "Add members" modal, even if they are already members of the channel.
 - Applied new designs for the Login screen:
     - Default login
     - OAuth options
     - Custom branding
     - MFA token
 - Changed **Actions** post menu hover text to **Message Actions**.
 - Enabled the new onboarding task list for end users.
 - Added pre-packaged Calls v0.5.3.

#### Administration
 - Added ``always-on`` and ``default-on`` settings to **System Console > Experimental Features** for Collapsed Reply Threads. When enabled (default-on), users see Collapsed Reply Threads by default and have the option to disable it in **Settings**. When always on, users are required to use Collapsed Reply Threads and can't disable it. The default state is still ``default-off``.

### Bug Fixes
 - Fixed an issue where the shortcut modal for channel info showed ``ALT`` instead of ``SHIFT`` for Mac.
 - Fixed an issue where the **Help > Report a Problem** link was not hidden when a URL was not set for **System Console > Customization > Report a Problem**.

### Known Issues
 - Known issues related to the Advanced Text editor, including text overlapping the preview button when formatting is collapsed [MM-44457](https://mattermost.atlassian.net/browse/MM-44457).
 - Mentions incorrectly show users as not in a channel [MM-44157](https://mattermost.atlassian.net/browse/MM-44157).
 - Channel switcher does not show cross team unreads on refresh [MM-44073](https://mattermost.atlassian.net/browse/MM-44073).
 - File upload might fail for SVG files [MM-38982](https://mattermost.atlassian.net/browse/MM-38982).
 - Known issues related to the new Collapsed Reply Threads (Beta) are [listed here](https://docs.mattermost.com/messaging/organizing-conversations.html#known-issues).
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.

## Release 2022-05-12

### Improvements

#### User Interface (UI)
 - For toggling the channel information in the right-hand pane, a shortcut CTRL/CMD+ALT+I was added.
 - Added an "Unread Channels" section to the channel switcher and included "Threads" in the results.
 - Added pre-packaged Calls v0.5.1.

#### Administration
 - An email is now sent to Cloud Admins after upgrading their workspace.

#### API Changes
 - Added new API endpoints ``GET /api/v4/teams/:team_id/top/channels`` and ``GET /api/v4/users/me/top/channels``.

#### Bug Fixes
 - Fixed an issue with ADA Accessibility where screen readers did not TAB to or read "This channel has guests" in the channel header bar.
 - Fixed an issue where the at-mention autosuggest of users was no longer grouped by channel membership status.
 - Fixed an issue where the New Messages toast was not fully tappable in the mobile web view.

### Known Issues
 - File upload might fail for SVG files [MM-38982](https://mattermost.atlassian.net/browse/MM-38982).
 - Known issues related to the new Collapsed Reply Threads (Beta) are [listed here](https://docs.mattermost.com/messaging/organizing-conversations.html#known-issues).
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.

## Release 2022-04-28

### Improvements

#### User Interface (UI)
 - Added the channel members list to the right-hand side Channel Info modal.
 - Added the ability to invite new users to a team from the **Add to channel** modal.
 - To be able to download images and copy public links for images quicker, a copy URL and download buttons were added to image thumbnails.
 - Added the ability to have one-character long channel names.

#### API Changes for Custom Integrations
 - Added a new API endpoint ``POST /api/v4/users/{user_id}/teams/{team_id}/threads/{thread_id}/set_unread/{post_id}`` to set a thread as unread by post id.
 - Added new API endpoints ``GET /api/v4/teams/:team_id/top/reactions`` and ``GET /api/v4/users/me/top/reactions`` to get top reactions for a team and user.
 - Fixed an issue where the ``UpdateUser`` API endpoint required a ``create_at`` field.

#### Performance
 - Improved the performance of ``GetTeamsUnreadForUser`` when Collapsed Reply Threads is enabled.

#### Bug Fixes
 - Fixed an issue where permalinks to direct and group message posts did not show a preview.
 - Fixed an issue when Collapsed Reply Threads are enabled where marking a root post with a mention as unread displayed both a mention badge and the thread item being bolded.
 - Fixed an issue where the public link to generate the API was getting called even if public links were disabled.
 - Fixed an issue with onboarding page view events.
 - Fixed an issue where the custom emoji **Next** button was out of view when a banner was present.
 - Fixed an issue where it would appear that a user had a negative number of unread threads.
 - Fixed an issue where marking the last post in a thread as unread didn't mark the thread as unread.

### Known Issues
 - The Cloud login screen is not centered [MM-43719](https://mattermost.atlassian.net/browse/MM-43719).
 - Shortcut keys for **Add Reaction** and **Save** are missing in mobile web view [MM-42715](https://mattermost.atlassian.net/browse/MM-42715).
 - Image link previews may show a blank space [MM-40448](https://mattermost.atlassian.net/browse/MM-40448).
 - File upload might fail for SVG files [MM-38982](https://mattermost.atlassian.net/browse/MM-38982).
 - Known issues related to the new Collapsed Reply Threads (Beta) are [listed here](https://docs.mattermost.com/messaging/organizing-conversations.html#known-issues).
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.

## Release 2022-04-13

### Improvements

#### User Interface (UI)
 - Added Files and Pinned Messages to the right-hand side Channel Info.
 - Improved the New Channel modal user interface.

#### Administration
 - To add the ability to toggle sending inactivity email notification to Admins, a configuration setting ``EmailSettings.EnableInactivityEmail`` was added.
 - To filter out inactive users in the System Console, an **Active** filter was added for users and Admins in **System Console > User Management > Users**.

#### Performance
 - Added an index to the ``UserGroups DisplayName`` for improved autosuggest query performance.
 - Improved the performance of permission selectors.

#### Bug Fixes
 - Restored the rendering of main menu items from plugins in non-mobile view.
 - Fixed the overflow of text in **Manage Channel Members** modal title.
 - Fixed an issue where pagination was broken in **System Console > Groups**.
 - Fixed an issue where thread updates did not show correctly after the computer woke up.
 - Fixed an issue where a negative unread count sometimes appeared with Collapsed Reply Threads enabled.
 - Fixed an issue where the modal to create a Custom Group got closed when pressing ENTER.

### Known Issues
 - Shortcut keys for **Add Reaction** and **Save** are missing in mobile web view [MM-42715](https://mattermost.atlassian.net/browse/MM-42715).
 - Image link previews may show a blank space [MM-40448](https://mattermost.atlassian.net/browse/MM-40448).
 - File upload might fail for SVG files [MM-38982](https://mattermost.atlassian.net/browse/MM-38982).
 - Known issues related to the new Collapsed Reply Threads (Beta) are [listed here](https://docs.mattermost.com/messaging/organizing-conversations.html#known-issues).
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.

## Release 2022-03-30

### Improvements

#### User Interface (UI)
 - The **More Actions** menu was restructured to reduce the clutter from Plugins and Apps.
 - Made it easier to copy code blocks by adding a copy button on hover.
 - Added a right-hand side panel to see and interact with channel information.
 - Changed the Mattermost indigo theme to match the dark theme in code blocks.
 - Updated in-product links from legacy domain about.mattermost.com to mattermost.com.
 - Made it easier to copy a message via a new **Copy Text** post menu item.
 - The default for ``ThreadAutoFollow`` has been changed to ``true`` with performance improvements to prepare for the enabling of Collapsed Reply Threads by default in a later release. This does not affect existing configurations where this value is already set to ``false``.

#### Performance
 - Improved performance when clearing notifications with Collapsed Reply Threads enabled.

#### Bug Fixes
 - Fixed an issue where ``ThreadStore.GetThreadsForUser`` did not count correctly when no team ID was specified.
 - Fixed an issue where ``zip`` file creation failed when adding attachments.
 - Fixed an issue where emoji short codes written in Markdown were not added to recently used emojis.
 - Fixed the positioning of SVGs in admin onboarding when the screen doesn't have a previous button.
 - Fixed an issue with the displayed channel name in the channel tutorial tip.
 - Fixed an issue with the clickable area for emojis in the emoji picker to match the interface.
 - Fixed an issue where usernames with periods in the channel switcher input showed Group Messages over matching Direct Messages.
 - Fixed an issue on Collapsed Reply Threads compact message view where clicking on the thread footer avatar did not open the profile modal.

### Known Issues
 - The archived channels search doesn't work as expected [MM-42889](https://mattermost.atlassian.net/browse/MM-42889).
 - Actions menu has inconsistent shading on hover on dark theme [MM-42869](https://mattermost.atlassian.net/browse/MM-42869).
 - Actions menu: "x" and the link inside the tooltip don't work [MM-42769](https://mattermost.atlassian.net/browse/MM-42769).
 - Shortcut keys for **Add Reaction** and **Save** are missing in mobile web view [MM-42715](https://mattermost.atlassian.net/browse/MM-42715).
 - Image link previews may show a blank space [MM-40448](https://mattermost.atlassian.net/browse/MM-40448).
 - File upload might fail for SVG files [MM-38982](https://mattermost.atlassian.net/browse/MM-38982).
 - Known issues related to the new Collapsed Reply Threads (Beta) are [listed here](https://docs.mattermost.com/messaging/organizing-conversations.html#known-issues).
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.

## Release 2022-03-16

### Compatibility
 - Updated Safari recommended minimum version to v14.1+.

### Improvements

#### User Interface (UI)
 - The support email field has moved from **Customization** to **Notifications** in the System Console. Also, a support email is now required when configuring email notifications.
 - The ping endpoint can now receive a device ID, which will report whether the device is able to receive push notifications.
 - Added a loading indicator to the **Threads** global list each time more posts are fetched on infinite scroll.
 - Added search guidance to the **Threads** global list when no more posts can be loaded. This is only shown if you’ve scrolled to load older posts and reach the end of the list.
 - Added support for inline editing of posts.
 - Added accessibility support for custom statuses.
 - Feature flags are now automatically refreshed when the server undergoes a restart.
 - Added nested previews for permalinks.
 - Added a sort order to the category API, and included category data in the websocket category update event.
 - Updated the plugin registry's ``registerCallButtonAction`` method to allow for displaying custom calls buttons in the channel header.
 - Added a debugging setting to turn off client-side plugins for the current user.
 - Tooltip is now only displayed when text is too long in the announcement banner.
 - When restricting direct messages to users on the same team, bots are now excluded from that restriction.

#### Performance
 - Improved performance of Collapsed Reply Threads when backend is enabled but frontend is disabled.
 - Fixed a potential memory leak in the sidebar when using accessibility hotkeys.
 - Virtualized the emoji picker and added other performance improvements to the emoji picker.
 - Improved the performance of storing users in webapp.
 - Fixed a small memory leak in the System Console.

#### Bug Fixes
 - Fixed a scan error on column name "LastRootPostAt": converting NULL to int64.
 - Fixed an issue where selecting a custom status from Recent statuses used the original expiration time.
 - Fixed an issue that caused a gap to appear on the left-hand side in products using the team sidebar.
 - Fixed an issue where moving up or down in the channel switcher didn’t work as expected when Global Threads was in the background.
 - Fixed an issue where pressing ENTER opened the onboarding tutorial tip.
 - Fixed an issue where some permission checkboxes had been moved to different categories in the System Console.
 - Fixed an issue where a blank screen occurred upon leaving a currently open unread channel with the channel unread grouping enabled.
 - Fixed an issue related to disabling and re-enabling Custom Terms of Service.
 - Fixed an issue where channel links on hover overlapped the channels menus.
 - Fixed the positioning of the post menu in mobile web view.
 - Fixed an issue where closing the keyboard shortcut modal by "CTRL/CMD + /" didn’t work.
 - Fixed an issue where the channel keyboard navigation was broken in the Threads view.

### Known Issues
 - In compact message view, the inline post edit help text and emoji picker are not aligned [MM-42402](https://mattermost.atlassian.net/browse/MM-42402).
 - Image link previews may show a blank space [MM-40448](https://mattermost.atlassian.net/browse/MM-40448).
 - File upload might fail for SVG files [MM-38982](https://mattermost.atlassian.net/browse/MM-38982).
 - Known issues related to the new Collapsed Reply Threads (Beta) are [listed here](https://docs.mattermost.com/messaging/organizing-conversations.html#known-issues).
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.

## Release 2022-03-08

### Bug Fixes
 - Fixed an issue where imports failed when the channel display name was empty.

## Release 2022-03-02

### Highlights

#### Custom User Groups
 - Added the APIs and app, store, and authorization methods to create and delete custom groups and to add and remove custom group members.

### Improvements

#### User Interface (UI)
 - Added a new onboarding experience for first System Admin user.
 - Added a dashboard that displays the health of the server.
 - Added new tutorial tours for Channels, Boards and Playbooks to help orient first time users.
 - Added a new plugin registry entry to append menu items to the user guide dropdown.
 - Removed extra telemetry events that were tracked during page loads.
 - Added a feature card slide for Playbooks.
 - Removed ``admin-advisor`` bot's ability to notify admins about missing support email.

#### Performance
 - Improved perceived typing performance by moving heavy code around and effective memoization related to the textbox component.
 - Fixed a memory leak caused by the post textbox.

#### Bug Fixes
 - Fixed an issue with clicking images in the message attachment.
 - Fixed an issue that caused Rudder to create their cookies on the top-level domain when Mattermost was installed on a subdomain.
 - Fixed an issue where **Total Posts** and **Active Users With Posts** graphs did not render in **System Console** > **Team Statistics**.
 - Fixed an issue where telemetry events attempted to get sent even when blocked by an ad blocker.
 - Fixed an issue where the channel switcher stopped showing search results when the first few characters were removed.
 - Fixed an issue where notification sounds didn't trigger on the Desktop App for new accounts.
 - Fixed an issue where users got multiple sounds for a single notification on the Linux Desktop App.
 - Fixed an issue where posting frequent messages to followed threads caused jittery typing.
 - Fixed an issue where the **Add to channel** permission was available in private channels for non-admin users.

### Known Issues
 - Pressing Enter opens the onboarding tutorial tip [MM-42188](https://mattermost.atlassian.net/browse/MM-42188).
 - Some Permission checkboxes have been moved to different categories in the System Console [MM-42020](https://mattermost.atlassian.net/browse/MM-42020).
 - Unread channels names and sidebar item render on top of channel options menu [MM-41952](https://mattermost.atlassian.net/browse/MM-41952).
 - Image link previews may show a blank space [MM-40448](https://mattermost.atlassian.net/browse/MM-40448).
 - File upload might fail for SVG files [MM-38982](https://mattermost.atlassian.net/browse/MM-38982).
 - ``CMD+/`` does not close the shortcuts modal [MM-38971](https://mattermost.atlassian.net/browse/MM-38971).
 - Known issues related to the new Collapsed Reply Threads (Beta) are [listed here](https://docs.mattermost.com/messaging/organizing-conversations.html#known-issues).
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.

## Release 2022-02-16

### Compatibility
 - Updated the recommended minimum supported Firefox version to v91+.

### Improvements

#### User Interface (UI)
 - Users are now able to use the channel switcher to search channels across teams if the users are part of more than one team.
 - Clarified in-product error string "Oops!" as "Unable to continue" for both translators and target audiences in cases where a user doesn't have sufficient permissions to add users or guests.
 - Removed incorrect in-product string text from the **Send full message contents** email notification option description displayed via **System Console > Site Configuration > Notifications**.
 - Added the ability to send an unsanitized user to the source user on ``user_updated`` event.
 - In the compact view, the sender's username is now always shown on posts.
 - Added a **Create board** button to the Channel intro header.
 - The post menu is now only rendered on the root post on hover over.
 - Updated a library used for storing drafts and other data in browser storage.
 - Updated Playbooks version to 1.24.1.
 - Update Boards version to 0.14.0.
 - Enabled performance telemetry tracking for production deployments not running in developer mode. This telemetry tracking is disabled when telemetry is toggled off.

#### Performance
 - Reduced the number of menu components listening for keyboard and mouse events.
 - Re-rendering of ``CustomStatusEmoji`` component is now avoided on post hovering.
 - Removed the collapsed sidebar menu from the DOM on sidebar collapse and expand.
 - Re-rendering of ``TextBox`` links component below the post box while typing is now avoided.

#### Plugins
 - Added an ``OnInstall()`` plugin hook.
 - Added an ``OnSendDailyTelemetry()`` plugin hook.

### Bug Fixes
 - Fixed an issue where the reply notification setting was still in effect even when Collapsed Reply Threads was enabled.
 - Fixed an issue where running ``mmctl config migrate`` reset the configuration settings to defaults if the settings were already in the database.
 - Fixed an issue where the custom status menu option was missing the "x" to clear status.
 - Fixed an issue where the password reset link was valid for 1 hour instead of 24 hours.
 - Fixed an issue where the Mattermost import failed if an export contained a soft-deleted team.
 - Fixed an issue where search results in the right-hand side did not clear when changing screens from file results to any other.

### Known Issues
 - Image link previews may show a blank space [MM-40448](https://mattermost.atlassian.net/browse/MM-40448).
 - Member type is missing from autocomplete [MM-38989](https://mattermost.atlassian.net/browse/MM-38989).
 - File upload might fail for SVG files [MM-38982](https://mattermost.atlassian.net/browse/MM-38982).
 - ``CMD+/`` does not close the shortcuts modal [MM-38971](https://mattermost.atlassian.net/browse/MM-38971).
 - ``CTRL/CMD + SHIFT + A`` shortcut does not open **Settings** [MM-38236](https://mattermost.atlassian.net/browse/MM-38236).
 - Known issues related to the new Collapsed Reply Threads (Beta) are [listed here](https://docs.mattermost.com/messaging/organizing-conversations.html#known-issues).
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.

## Release 2022-02-10

### Bug Fixes
 - Fixed an issue where an emoji import failed when the emoji name conflicted with a system emoji.

## Release 2022-02-03

### Improvements

#### User Interface (UI)
 - Updated prepackaged Boards version to 0.12.1.
 - Added Boards support for Global Retention Policy.
 - Added Collapsed Reply Threads (Beta) tour functionality.
 - Added the current product name information to invoices.
 - Added support for metered billing invoices.
 - Added a keyboard shortcut to open and expand the right-hand pane.

### Bug Fixes
 - Fixed an issue where the user menu header was visible when custom statuses were disabled.
 - Fixed an issue where the markdown **Preview** link was not hidden in read-only channels.
 - Fixed an issue where Cloud admins were unable to download an invoice via the Desktop App.
 - Fixed an issue that caused a gap to appear on the left-hand side in products using the team sidebar.
 - Fixed an issue with Collapsed Reply Threads (Beta) where clearing a deleted root post left the right-hand side blank.
 - Fixed an issue where the **Add** channel member button text was cut off in Safari.

### Known Issues
 - Announcement banner can cause the top team to be partially obstructed [MM-40887](https://mattermost.atlassian.net/browse/MM-40887).
 - Image link previews may show a blank space [MM-40448](https://mattermost.atlassian.net/browse/MM-40448).
 - "New Replies" banner is displayed in the right-hand side for a thread that is entirely visible [MM-40317](https://mattermost.atlassian.net/browse/MM-40317).
 - Member type is missing from autocomplete [MM-38989](https://mattermost.atlassian.net/browse/MM-38989).
 - File upload might fail for SVG files [MM-38982](https://mattermost.atlassian.net/browse/MM-38982).
 - ``CMD+/`` does not close the shortcuts modal [MM-38971](https://mattermost.atlassian.net/browse/MM-38971).
 - ``CTRL/CMD + SHIFT + A`` shortcut does not open **Settings** [MM-38236](https://mattermost.atlassian.net/browse/MM-38236).
 - Known issues related to the new Collapsed Reply Threads (Beta) are [listed here](https://docs.mattermost.com/messaging/organizing-conversations.html#known-issues).
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.

## Release 2022-01-27

### Bug Fixes
 - Fixed an issue where replying to posts, pinning posts, and editing posts did not work.

## Release 2022-01-25

### Improvements

#### User Interface (UI)
 - Invite to team modal now auto-focuses its email search input.
 - Updated "Terms of Service" terminology to "Terms of Use" product-wide.
 - Updated **Account Settings** terminology to **Settings**.
 - Added Accept-Language header to generate link previews in the default Server language.
 - The **Invite Members** button is now hidden when the Direct Message category is collapsed.

#### Administration
 - Improved plugins performance by re-initializing only upon plugin configuration changes.

### Bug Fixes
 - Fixed an issue where the user avatar wasn’t removed from the participants list after the user’s only post in a thread was deleted.
 - Fixed an issue with the exit animation on the invitation modal.
 - Fixed an issue where the file preview modal info bar showed the channel id instead of the channel name for Direct Messages.
 - Fixed an issue with post hover menu overlap.
 - Changed Client4 to properly set Content-Type as application/json on API calls.
 - Fixed an issue to add a loader when fetching data from the backend in the channel switcher if there are no results matching local data.
 - Fixed an issue where the **Get a Public Link** button in the file preview modal was hidden if the image was an external link.
 - Fixed an issue where the click effect on **Copy** invite link button was incorrect.
 - Reinstalling a previously-enabled plugin now correctly reports enabled status as false.
 - Fixed an issue where the Ctrl/Cmd+Shift+A hotkey to open **Settings** didn't work in desktop view.
 - Fixed an issue where the "Leave Channel" button didn't work from the channel sidebar 3-dot menu when clicking on it a second time.

### Known Issues
 - Announcement banner can cause the top team to be partially obstructed [MM-40887](https://mattermost.atlassian.net/browse/MM-40887).
 - Some plugin full screen modals are broken [MM-40625](https://mattermost.atlassian.net/browse/MM-40625).
 - Image link previews may show a blank space [MM-40448](https://mattermost.atlassian.net/browse/MM-40448).
 - "New Replies" banner is displayed in the right-hand side for a thread that is entirely visible [MM-40317](https://mattermost.atlassian.net/browse/MM-40317).
 - Member type is missing from autocomplete [MM-38989](https://mattermost.atlassian.net/browse/MM-38989).
 - File upload might fail for SVG files [MM-38982](https://mattermost.atlassian.net/browse/MM-38982).
 - ``CMD+/`` does not close the shortcuts modal [MM-38971](https://mattermost.atlassian.net/browse/MM-38971).
 - ``CTRL/CMD + SHIFT + A`` shortcut does not open **Settings** [MM-38236](https://mattermost.atlassian.net/browse/MM-38236).
 - Known issues related to the new Collapsed Reply Threads (Beta) are [listed here](https://docs.mattermost.com/messaging/organizing-conversations.html#known-issues).
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.

## Release 2022-01-11

### Bug Fixes
 - Fixed an issue where the license expired announcement banner was unexpectedly displaying for Cloud workspaces.

## Release 2021-12-08

### Improvements

#### User Interface (UI)
 - Added thread replies to search results when Collapsed Reply Threads is enabled.
 - Updated "Terms of Service" terminology to "Terms of Use" product-wide.

#### Performance
 - Added a general performance fix for loading the web application and typing.
 - Improved performance while typing by moving some autocomplete layout calculations.
 - Improved performance by reducing DOM usage during render.
 - Removed real-time updates of a couple of features to prevent overloading servers on user updates. The "This channel has guests" indicator and the number of timezones displayed when notifying members of a group will only be updated on channel change now.

### Bug Fixes
 - Fixed slow channel loading for instances with website link previews enabled.
 - Fixed an issue where the webapp crashed sometimes when selecting an image file from "Recent files".
 - Fixed an issue where the status menu unexpectedly closed when selecting the "Disable Notifications Until" header.

### Known Issues
 - Image link previews may show a blank space [MM-40448](https://mattermost.atlassian.net/browse/MM-40448).
 - Spacing of ``from:`` autocomplete items are off [MM-40447](https://mattermost.atlassian.net/browse/MM-40447).
 - "New Replies" banner is displayed in the right-hand side for a thread that is entirely visible [MM-40317](https://mattermost.atlassian.net/browse/MM-40317).
 - Member type is missing from autocomplete [MM-38989](https://mattermost.atlassian.net/browse/MM-38989).
 - File upload might fail for SVG files [MM-38982](https://mattermost.atlassian.net/browse/MM-38982).
 - ``CMD+/`` does not close the shortcuts modal [MM-38971](https://mattermost.atlassian.net/browse/MM-38971).
 - ``CTRL/CMD + SHIFT + A`` shortcut does not open **Settings** [MM-38236](https://mattermost.atlassian.net/browse/MM-38236).
 - Known issues related to the new Collapsed Reply Threads (Beta) are [listed here](https://docs.mattermost.com/messaging/organizing-conversations.html#known-issues).
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.

## Release 2021-12-01

### Improvements

#### User Interface (UI)
 - Clarified Latex Rendering config setting descriptions and fixed a broken product documentation link.
 - Updated the "One-click reactions on messages" user setting to "Quick reactions on messages".
 - Added tab focus support to the global header and user avatars.
 - Added a new **Replies** banner to the right-hand side Thread viewer.

### Bug Fixes
 - Fixed an issue where Mattermost Cloud installations were panicing after the November 23, 2021 release.
 - Fixed an issue where the default log rotation file size was mistakenly set to 10GB, and is now reverted back to 100MB.
 - Fixed an issue where OpenID redirects didn't work when hosting Mattermost on a subdirectory.
 - Fixed an issue where using CMD/CTRL + SHIFT + F in global threads did not add a search term automatically.
 - Fixed the alignment of the “X” button in the “message deleted” System message.
 - Fixed an issue where the long post "Show More/Less" background was broken in the Thread viewer.

### Known Issues
 - Member type is missing from autocomplete [MM-38989](https://mattermost.atlassian.net/browse/MM-38989).
 - File upload might fail for SVG files [MM-38982](https://mattermost.atlassian.net/browse/MM-38982).
 - ``CMD+/`` does not close the shortcuts modal [MM-38971](https://mattermost.atlassian.net/browse/MM-38971).
 - ``CTRL/CMD + SHIFT + A`` shortcut does not open **Settings** [MM-38236](https://mattermost.atlassian.net/browse/MM-38236).
 - Known issues related to the new Collapsed Reply Threads (Beta) are [listed here](https://docs.mattermost.com/messaging/organizing-conversations.html#known-issues).
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.

## Release 2021-11-23

### Improvements

#### User Interface (UI)
 - Updated **Account Settings** terminology to **Profile**.
 - Updated instances of **switch** to **navigate**.
 - Updated in-product text terminology to shift from **comments** to **conversations** and **replies**.
 - Do Not Disturb option for **Tomorrow** now displays the expiry time.
 - Recent emojis now get updated based on the default selected skin tone.
 - Updated **SingleImageView** to hide the image name for attached images until the image is collapsed.
 - Moved the expand arrow to the left of image name. 
 - The image expansion icon now appears on image hover.

### Bug Fixes
 - Fixed an issue where emoji reaction buttons on posts did not respect user permissions.
 - Fixed an issue where unchecking the automatic timezone changed the timezone in the selector.
 - Fixed an issue where emoji names were being truncated too soon in the emoji picker.
 - Fixed an issue where the thread footer did not allow the user to follow a Thread.
 - Fixed an issue where the app crashed when switching to Threads view after leaving a channel.
 - Fixed an issue where push notifications did not clear from the lock screen or the notification center with Collapsed Reply Threads enabled.
 - Fixed an issue where Direct Message notifications were missing the sender name with Collapsed Reply Threads enabled.
 - Fixed an issue where keyboard shortcuts were not working with Global Threads.

### Known Issues
 - Member type is missing from autocomplete [MM-38989](https://mattermost.atlassian.net/browse/MM-38989).
 - File upload might fail for SVG files [MM-38982](https://mattermost.atlassian.net/browse/MM-38982).
 - ``CMD+/`` does not close the shortcuts modal [MM-38971](https://mattermost.atlassian.net/browse/MM-38971).
 - ``Ctrl/Cmd+Shift+A`` shortcut does not open **Account Settings** [MM-38236](https://mattermost.atlassian.net/browse/MM-38236).
 - Known issues related to the new Collapsed Reply Threads (Beta) are [listed here](https://docs.mattermost.com/messaging/organizing-conversations.html#known-issues).
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.

## Release 2021-11-11

### Bug Fixes
 - Fixed an issue with panics in a ``patchChannel`` function [MM-40014](https://mattermost.atlassian.net/browse/MM-40014).

## Release 2021-11-10

### Improvements

#### User Interface (UI)
 - Added online status to profile images on user autocomplete.
 - App Commands now have an option to open them as modals.
 - Added support for navigating through Collapsed Reply Threads via arrow keys.
 - Added support for focusing the input box in Collapsed Reply Threads while typing.
 - Added support for blurring the input box in Collapsed Reply Threads on pressing Escape.
 - Adjusted the channel override desktop notification preference for Threads.
 - Added a **Click to open thread** setting for all users.
 - User interface is now improved when no text is set for a custom status.

### Bug Fixes
 - Fixed an issue where API allowed changing the name of the Town Square channel.
 - Fixed an issue where errors were logged if a user disabled notifications.
 - Fixed an issue where a channel was not immediately removed from the sidebar when the current user was removed from it.

### Known Issues
 - Member type is missing from autocomplete [MM-38989](https://mattermost.atlassian.net/browse/MM-38989).
 - File upload might fail for SVG files [MM-38982](https://mattermost.atlassian.net/browse/MM-38982).
 - ``CMD+/`` does not close the shortcuts modal [MM-38971](https://mattermost.atlassian.net/browse/MM-38971).
 - ``Ctrl/Cmd+Shift+A`` shortcut does not open **Account Settings** [MM-38236](https://mattermost.atlassian.net/browse/MM-38236).
 - Close button on the Invite People page is incorrectly themed [MM-37852](https://mattermost.atlassian.net/browse/MM-37852).
 - Known issues related to the new Collapsed Reply Threads (Beta) are [listed here](https://docs.mattermost.com/messaging/organizing-conversations.html#known-issues).
 - **Cloud > "Tips & Next Steps"** should not show an "Explore channels" section for guest users.
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.

## Release 2021-10-27

### Highlights

#### Timed Do Not Disturb
 - Added the ability to disable all notifications for a specified period of time to avoid distractions, without losing important messages when you're back.

### Improvements

#### User Interface (UI)
 - Recent mentions and saved posts now show across all teams.
 - Added ``@here`` mention to the ``EnableConfirmNotificationsToChannel`` config setting to show a warning modal when over 5 members might be alerted with ``@here``.
 - Added one-click reactions for posts. Also, the three most recently used emojis will display when the mouse is hovered on a post. 
 - Added support for selecting names and aliases in the emoji picker.
 - The updated "Tips & Next Steps" screen is now shown to all System Admins.
 - Updated in-product text for the invitation modal for clarity.
 - Updated the file attachment limits and sizes within in-product help documentation.

#### Performance
 - Reduced storage-related slow-downs on page load.

### Bug Fixes
 - Fixed a broken link to the **Custom Emoji** page on servers with a subpath configured.
 - Fixed an issue where a "No results found" error string was displayed in the **Direct Messages** modal.
 - Fixed an issue where the caret was placed in the middle of the emojis when picking two emojis from the emoji picker.
 - Fixed an issue where **System Console > Channels > Channel Management** displayed an option to toggle group management in Team Edition, Starter, and Professional.
 - Fixed an issue where the channel switcher was missing the "(You)" indicator on the user's own Direct Message channel.
 - Fixed an issue where the clock format set by the user was not respected on the edit indicator popover.
 - Replaced Metropolis font files with a new set to correct a kerning issue.
 - Fixed an issue where deep links opened on mobile displayed an incorrect text directing users to open the Desktop app.
 - Addressed various user interface style bugs from the Oct 13 release.
 - Fixed emails templates for clients that do not support the `<style>` tag.
 - Fixed an issue where the scrollbar was hardly visible with Denim & Sapphire Themes.
 - Fixed various bugs for the Collapsed Reply Threads (Beta) feature, including:
    - Fixed an issue where the recent sidebar sorting option didn't only consider parent posts.
    - Fixed an issue where a badge was displayed on a thread list when the thread was started by another user in a Direct Message.
    - Fixed an issue where the user avatar was displayed in the participants list after their post was deleted and if they had no other posts in the thread.
    - Fixed an issue where the ephemeral message was not displyaed as the centre post.
    - Fixed an issue with dragging and dropping files on a thread while on a Threads panel.
    - Fixed an issue where permalinks were not highlighting a post on a thread that was already open on the right-hand side.
    - Fixed an issue with missing threads in the Thread list.

### Known Issues
 - Member type is missing from autocomplete [MM-38989](https://mattermost.atlassian.net/browse/MM-38989).
 - File upload might fail for SVG files [MM-38982](https://mattermost.atlassian.net/browse/MM-38982).
 - ``CMD+/`` does not close the shortcuts modal [MM-38971](https://mattermost.atlassian.net/browse/MM-38971).
 - Deep link opened on mobile shows incorrect text directing the user to open the Desktop app [MM-38913](https://mattermost.atlassian.net/browse/MM-38913).
 - LDAP Sync job inserting invalid NULL unicode character into job's Data column [MM-38711](https://mattermost.atlassian.net/browse/MM-38711).
 - ``Ctrl/Cmd+Shift+A`` shortcut does not open **Account Settings** [MM-38236](https://mattermost.atlassian.net/browse/MM-38236).
 - Close button on the Invite People page is incorrectly themed [MM-37852](https://mattermost.atlassian.net/browse/MM-37852).
 - Indigo theme glitch may occur when returning from Playbooks [MM-38910](https://mattermost.atlassian.net/browse/MM-38910).
 - Known issues related to the new Collapsed Reply Threads (Beta) are [listed here](https://docs.mattermost.com/messaging/organizing-conversations.html#known-issues).
 - **Cloud > "Tips & Next Steps"** should not show an "Explore channels" section for guest users.
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.

## Release 2021-10-13

### Highlights

#### Multi-Product Platform
 - Mattermost now ships as one platform with three products - Channels, Playbooks, and Boards.

#### Global Product Launcher
 - Added a global header for product navigation for Channels, Playbooks, and Boards. This is disabled on the mobile web view and mobile apps.

#### Packaging Changes
 - Introducing [updated packaging](https://mattermost.com/pricing) with new Starter, Professional and Enterprise plans to better serve our customers.
 - Existing paying Cloud Professional customers will automatically be upgraded to Cloud Enterprise with no change to pricing or feature set for the next 12 months. More information will be shared to the workspace owner's email address shortly after the release.
 - Existing free Cloud customers will be asked to enter their credit card by January 15th, 2022 to continue using Mattermost Cloud. More information will be shared to the workspace owner's email address shortly after the release.

#### Beta features Promoted to General Availability
   - Archived channels
   - Compliance exports
   - Custom terms of service
   - Guest accounts
   - System roles
   - Plugins

### Improvements

#### User Interface (UI)
 - Added a query param to translate in-product help pages when opened from the Desktop App.
 - Added rendering for posts containing markdown in email notifications.
 - Added support for inline Latex rendering.
 - Added the **Move to...** option menu item to the channel header dropdown.
 - Added keyboard shortcuts to tooltips. Use shortcut key component for displaying keys.
 - Changed the user interface of the edit-indicator of posts and moved it inline.
 - Added support for Global threads infinite scroll.

#### Integrations
 - Added support for multi-select on Apps slash commands.
 - App commands now make a distinction between the central channel and the right-hand side channel.
 - App bindings now recognize the post menu options for each channel they live in.
 - Added new ``registerMessageWillBeUpdatedHook(newPost, oldPost)`` client-side plugin hook to intercept edited messages.

#### Performance
 - Added performance improvements for draft storage with multiple tabs open.
 - Improved performance of draft loading.
 - Slightly improved performance around rendering of system messages.

#### Administration
 - Bulk imports with attached files now log and continue when a file fails to upload instead of halting.
 - ``get flagged posts`` endpoint will now return only flagged posts for channels the user is member of.
 - Minimum supported browser versions changes:
   - Chrome updated from ``61+`` to ``89+``.
   - Firefox updated from ``60+`` to ``78+``.
   - MacOS updated from ``10.9+`` to ``10.14+``.

### Bug Fixes
 - Fixed an issue where creating a bot with an invalid username returned an "invalid email" error.
 - Fixed an issue where using ``/code`` did not render initial whitespace characters.
 - Fixed an issue where **Try Enterprise for Free** option was missing spacing in mobile webview.

### Known Issues
 - Clicking on "..." post menu on a System message crashes the webapp [MM-39116](https://mattermost.atlassian.net/browse/MM-39116).
 - Desktop notifications don't work intermittently [MM-39052](https://mattermost.atlassian.net/browse/MM-39052).
 - Member type is missing from autocomplete [MM-38989](https://mattermost.atlassian.net/browse/MM-38989).
 - File upload might fail for SVG files [MM-38982](https://mattermost.atlassian.net/browse/MM-38982).
 - ``CMD+/`` does not close shortcuts modal [MM-38971](https://mattermost.atlassian.net/browse/MM-38971).
 - Deep link opened on mobile shows incorrect text directing the opening to the Desktop app [MM-38913](https://mattermost.atlassian.net/browse/MM-38913).
 - Channel switcher is missing "(You)" indicator on your own Direct Message channel [MM-38798](https://mattermost.atlassian.net/browse/MM-38798).
 - LDAP Sync job inserting invalid NULL unicode character into job's Data column [MM-38711](https://mattermost.atlassian.net/browse/MM-38711).
 - ``Ctrl/Cmd+Shift+A`` shortcut does not open **Account Settings** [MM-38236](https://mattermost.atlassian.net/browse/MM-38236).
 - Close button on invite people page is incorrectly themed [MM-37852](https://mattermost.atlassian.net/browse/MM-37852).
 - Indigo theme glitch may occur when returning from Playbooks [MM-38910](https://mattermost.atlassian.net/browse/MM-38910).
 - Known issues related to the new Collapsed Reply Threads (Beta) are [listed here](https://docs.mattermost.com/messaging/organizing-conversations.html#known-issues).
 - **Cloud > "Tips & Next Steps"** should not show an "Explore channels" section for guest users.
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.

## Release 2021-09-29

### Highlights

#### Permalink Previews
 - Added support for permalink previews for posts in Mattermost. Previews are generated to minimize context switching when sharing message links in Channels.

#### Tutorial Updates
 - Added a tip to the **Getting Started** page for downloading Desktop Apps.
 - Updated tutorial icons and changed text content in tutorial tips.

#### Branding Changes
 - Added a new default brand theme named "Denim".
 - The existing theme names and colors, including "Mattermost", "Organization", "Mattermost Dark", and "Windows Dark" have been updated to the new "Denim", "Sapphire", "Indigo", & "Onyx" theme names and colours, respectively. Anyone using the existing themes will see slightly modified theme colors after their server or workspace is upgraded. The theme variables for the existing "Mattermost", "Organization", "Mattermost Dark", and "Windows Dark" themes will still be accessible in [our documentation](https://docs.mattermost.com/messaging/customizing-theme-colors.html#custom-theme-examples), so a custom theme can be created with these theme variables if desired. Custom themes are unaffected by this change.
 - Added a new light theme named "Quartz" to the default available list of themes.
 - Updated email templates to the new branding.

### Improvements

#### User Interface (UI)
 - Added “Invite People” to the main "+" button below the hamburger menu.
 - The whole category bounds are now highlighted while holding a channel above a category name on the left-hand side.
 - Updated **Account Settings > Display > Timezone** to be more user friendly.
 - New theme agnostic file preview modal takes up the full screen. The file preview now has information about the user, channel, and the file, and moves away from text-based buttons to icon-based buttons.
 - Increased the limit of uploaded file attachments per post from 5 to 10.
 - Added desktop notifications for followed Threads.
 - Hungarian and English-Australian are now official languages.
 - Added a query param to translate in-product help pages when opened from the Desktop App.
 - Added rendering for posts containing markdown in email notifications.

#### Performance
 - Improved typing performance when the emoji autocomplete is open.

#### Integrations
 - Dropped support for left-hand side-specific bot icons.
 - Added a "rest field" to the App command parser.
 - Added support for multiselect on Apps slash commands.
 - App commands now make a distinction between the central channel and the right-hand side channel.
 - Removed a deprecated "Backend" field from the plugin manifest.
 - Converted the "Executables" field in the plugin manifest to a map.
 - Added support for React components in channel header tooltips registered by plugins.

#### Administration
 - Upgraded Go to v1.16.7.
 - Removed the Slack importer from the user interface.
 - Migrated the extraction command to mmctl.
 - Dropped support for Elasticsearch versions earlier than v7.
 - Removed the convert channel endpoint to use ``/channels/{channel_id}/privacy`` instead.
 - Removed deprecated ``Posts.ParentId`` in favor of the semantically equivalent ``Posts.RootId``. Also removed ``CommandWebhook.ParentId`` and ``CompliancePost.ParentId`` for the same reason.
 - Bulk imports with attached files now log and continue when a file fails to upload instead of halting.
 - Updated Bleve to v2 to use the scorch index type.

### Bug Fixes
 - Fixed an issue where floating timestamps appeared incorrectly on the right-hand side with Collapsed Reply Threads (Beta) enabled.
 - Fixed an issue where pinned and saved posts were no longer highlighted.
 - Disabled admin support email status check job on server startup.
 - Fixed an issue on joining a missing channel as a System Admin.
 - Fixed an issue where creating a bot with invalid username returned an "invalid email" error.
 - Fixed an error with app locations and binding filtering.
 - Fixed an issue where /code was not rendering initial whitespace characters.
 - Fixed import process for imports with attachments.

### Known Issues
 - To exit Playbooks, uers can press the **Back** button or use a keyboard shortcut to go back.
 - Known issues related to the new Collapsed Reply Threads (Beta) are [listed here](https://docs.mattermost.com/messaging/organizing-conversations.html#known-issues).
 - Sometimes an "Unable to get role" error appears when changing a channel member role in **System Console > User Management > Channels**.
 - **Cloud > "Tips & Next Steps"** should not show an "Explore channels" section for guest users.
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.

## Release 2021-08-12

### Highlights

#### Beta features promoted from Beta to General Availability
   - Archived channels
   - Compliance exports
   - Custom terms of service
   - Guest Accounts
   - System Roles
   - Plugins

#### Focalboard
 - Added support for Focalboard for Mattermost Cloud.

### Improvements

#### User Interface (UI)
 - Changed H1-H3 heading font from Open Sans to Metropolis.

#### Administration
 - Added ``playbooks`` and ``boards`` to restricted team URLs list.
 - Mattermost is now built with Go v1.16.6.
 - Added the ability for Team Edition to edit role permissions.
 - Removed hard-coded override of ``TeamSettings.MaxNotificationsPerChannel`` on unlicensed servers (e.g. Team Edition).
 - Exported ``ChannelInviteModal`` and ``ChannelMembersModal`` components for plugins.

### Bug Fixes
 - Fixed an issue where GitLab ``ButtonText`` and ``ButtonColor`` settings were not reflected on the login screen.
 - Fixed an issue where Mattermost panicked on ``docx`` files uploaded with ``.doc`` extension.
 - Prevented users from having the unreads filter enabled when the button to toggle it is not shown.
 - Fixed an issue where the timestamp on deleted messages was not correctly positioned.
 - Fixed an issue where a space was missing between sentences in the banner to refresh app.
 - Fixed an issue where Mattermost's shortcut key CTRL+SHIFT+A to open **Account Settings** clashed with Chrome's CTRL+SHIFT+A that opens a "Search Tabs" pop-up.
 - Fixed an issue with Collapsed Reply Threads (Beta) where replying to a thread caused users to re-follow the previously unfollowed thread.

### Known Issues
 - Known issues related to the new Collapsed Reply Threads (Beta) are [listed here](https://docs.mattermost.com/messaging/organizing-conversations.html#known-issues).
 - Sometimes an "Unable to get role" error appears when changing a channel member role in **System Console > User Management > Channels**.
 - **Cloud > "Tips & Next Steps"** should not show an "Explore channels" section for guest users.
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.

## Release 2021-07-29

### Improvements

#### User Interface (UI)
 - Improved typing performance in affected environments by reducing the frequency in which drafts are saved.
 - Improved user and channel selector for app commands.
 - Enabled the **Set Status** button if the custom status hasn't changed from currently set status.
 - Added plugin API methods for user access tokens and OAuth apps.
 - Improved default rendering of images inserted via the GIF picker.
 - Small text changes were added to Direct and Group Message menus: 'Mute channel' and 'Edit Channel Header' now reads 'Mute Conversation' and 'Edit Conversation Header'.
 - Added support for ``react-intl`` and ``<Timestamp/>`` usage in plugins.

#### Administration
 - The “config watcher” (the mechanism that automatically reloads the config.json file) has been deprecated in favor of an mmctl command that will need to be run to apply configuration changes after they are made. This change improves configuration performance and robustness.
 - Fixed some of the incorrect mention counts and unreads around threads and channels since the introduction of Collapsed Reply Threads (Beta). This fix is done through a SQL migration, and it may take several minutes to complete for large databases.
 - Upgraded the builder image to use Go v1.16.
 - Added a new feature to archive and unarchive teams through **System Console** > **Teams**.

### Bug Fixes
 - Fixed an issue where the "Find channel" channel switcher text overflowed beyond the button for some languages.
 - Fixed an issue where inter-plugin requests without a body didn't work.
 - Fixed an issue with opening a dialog from an interactive message when returning an empty response.
 - Fixed an issue where the **Add Members** modal was incorrectly themed on the Mattermost Dark theme.
 - Fixed a panic in the ``getPrevTrialLicense`` API request when loading the System Console on Team Edition.
 - Fixed various bugs for the Collapsed Reply Threads (Beta) feature, including:
   - Fixed an issue where an error occurred while following a thread with no replies.
   - Fixed an issue where ``reply_count`` of 0 was always returned for GET single Post on ``/posts/<postid>`` API.
   - Fixed an issue where following a single message returned a status 500.
   - Fixed an issue where when replying in a thread after unfollowing it, the thread was not auto-followed again.
   - Fixed an issue where when enabling Collapsed Reply Threads, channels that had no new activity were showing as unread.
   - Fixed an issue with thread unreads when the feature was enabled by a user.
   - Fixed an issue where self replies were marking threads as unread.
   - Unread threads are now correctly displayed on app load for teams in the sidebar when Collapsed Reply Threads feature is enabled.
   - Fixed an issue where "Thread" in the thread viewer was displayed vertically in some languages.
   - Fixed an issue where opening global threads containing a root post markdown image crashed the app.
   - Fixed an issue where the app crashed when switching to the Threads view after leaving a channel.

### Known Issues
 - Known issues related to the new Collapsed Reply Threads (Beta) are [listed here](https://docs.mattermost.com/messaging/organizing-conversations.html#known-issues).
 - Sometimes an "Unable to get role" error appears when changing a channel member role in **System Console > User Management > Channels**.
 - **Cloud > "Tips & Next Steps"** should not show an "Explore channels" section for guest users.
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.

## Release 2021-07-15

### Highlights

#### Granular Data Retention Policies
 - A ``data_retention`` type job can now be run even if the global policy is disabled. The granular (i.e. team and channel-specific) policies will be executed when the data retention job is run. Please note there is a known issue where deleted posts get displayed in channels without new activity after the retention job is run.  This issue is tracked with [this ticket](https://mattermost.atlassian.net/browse/MM-36574).

### Improvements

#### User Interface (UI)
 - Markdown formatting is now stripped from push notifications.
 - Improved performance of components that show reactions on posts.
 - Improved performance of certain components when viewing non-Direct Message channels.
 - Added minor improvements to performance of messages posted in the right-hand side.
 - Added icons to apps in the Marketplace.
 - Apps can now add arbitrary markdown in between fields on forms.
 - Added support for markdown in apps forms, interactive dialogs field descriptions, errors, and slash commands.

### Known Issues
 - Known issues related to the new collapsed reply threads (Beta) are [listed here](https://docs.mattermost.com/messaging/organizing-conversations.html#known-issues).
 - Sometimes an "Unable to get role" error appears when changing a channel member role in **System Console > User Management > Channels**.
 - **Cloud > "Tips & Next Steps"** should not show an "Explore channels" section for guest users.
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.

## Release 2021-07-01

### Highlights

#### Collapsed Reply Threads (Early Beta Access)

 - We're excited to give you early access to Collapsed Reply Threads (Beta). It can be enabled in the **System Console > Experimental > Collapsed Reply Threads (Beta)**. Learn more about the features and known issues in [our documentation](https://docs.mattermost.com/help/messaging/organizing-conversations.html).

#### Emoji Enhancements with Skin Tone Selection
 - Added support for emoji standard v13.0. Users now have the ability to choose various skin tones using the Mattermost emoji picker. Mobile support is planned for v1.45 Mobile App release (July 16th), so some emojis selected on desktop won't be visible on mobile apps.

### Improvements

#### User Interface (UI)
 - Added English-Australian language variation.
 - Added the ability to upload ``.jpeg`` files on Linux. Uploading ``.jpg`` files was already supported.
 - Before anything is typed, a list of channels you are a member of is now shown and sorted by recency in the channel switcher. The number of channels shown in the channel switcher in the default state are capped to maximum of 20. If there is no recent channel activity (in the case of new users), an alphabetical list of channels is shown displaying **My Channels** first and other **Public Channels** next, capped at a maximum of 20 by default.
 - Polish, German, and Italian languages were downgraded to beta as they are [no longer actively maintained](https://handbook.mattermost.com/contributors/contributors/localization#translation-quality).
 - Added the ability in the custom status tooltips, status dropdown and profile popover to select an expiry time for custom statuses. Also added new components ``ExpiryMenu`` and ``DateTimeInput`` to the custom status modal.

#### Administration
 - Optimized the bulk import process by no longer requiring the server to write the incoming archive to the filesystem when unzipping it.
 - Added channel restore and channel privacy change endpoints to the local mode using the System bot.

### Bug Fixes
 - Fixed an issue where sidebar icons were not aligned with the navigator area icons.
 - Fixed an issue where using CTRL+F in a **Direct Message** channel added the user ID rather than the user's name into the search field.
 - Fixed an issue where user icons were displayed at full opacity in muted channels.
 - Fixed an issue where a redundant ``user_update`` websocket event was generated for bot users.

### Known Issues
 - Sometimes an "Unable to get role" error appears when changing a channel member role in **System Console > User Management > Channels**.
 - **Cloud > "Tips & Next Steps"** should not show an "Explore channels" section for guest users.
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.

## Release 2021-06-16

### Improvements

#### User Interface (UI)
 - In the at-mention autocomplete, the user’s nickname is no longer shown when (you) is present.
 - Updated the help text on the **Add Users** channel modal.

#### Administration
 - The platform binary file has been removed from the distribution files. It should be replaced by the Mattermost binary file if it's being used in scripts.
 - Improved memory performance for large image uploads, particularly PNGs with transparency.

### Bug Fixes
 - Fixed an issue where users were unable to set a custom status emoji via slash command by adding the logic for detecting unicode emoji and setting it as custom status emoji via slash commands.
 - Fixed an issue where messages with fallback text were repeated.
 - Fixed an issue where a persistent unread badge showed on the **Main Menu** when **Enable Marketplace** or **Enable Plugins** was disabled.

### Known Issues
 - Pinned posts are no longer highlighted.
 - Sometimes an "Unable to get role" error appears when changing a channel member role in **System Console > User Management > Channels**.
 - **Cloud > "Tips & Next Steps"** should not show an "Explore channels" section for guest users.
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.

## Release 2021-06-02

### Improvements

#### User Interface (UI)
 - Removed status icon from the profile image in the center channel and the right-hand side view.
 - Added a performance improvement to the emoji picker overlay to improve typing performance.
 - Added performance improvements when receiving new posts.

#### Administration
 - Team-restricted direct channel creation is now also applied to the backend. Previously, this was restricted to the frontend.
 - Refactored the config storing logic to improve its robustness and performance.
 - Added a visual grouping of related settings under AD/LDAP in the System Console.

### Bug Fixes
 - Fixed an issue where the job scheduler server could miss a "changed leader" cluster event.
 - Fixed an issue where using ``Ctrl+Cmd+F`` on the MacOS Desktop App opened the search instead of full-screened the app.
 - Fixed an issue where the message input box was shadowed when uploading a file in the center channel.
 - Fixed an error caused by a post created with a non-string attachment field.
 - Fixed the opacity of the read state in the channel sidebar, as well as enhanced the opacity of the channel icon when the channel was unread.
 - Fixed an issue where users were unable to log in with O365 authentication when the AuthData was formatted differently between Office365 OAuth and Office 365 OpenID.

### Known Issues
 - Pinned posts are no longer highlighted.
 - Sometimes an "Unable to get role" error appears when changing a channel member role in **System Console > User Management > Channels**.
 - **Cloud > "Tips & Next Steps"** should not show an "Explore channels" section for guest users.
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.

## Release 2021-05-21

### Improvements

#### User Interface (UI)
 - Added Hungarian (Beta) language.
 - A search tip is now shown when scrolling back in a channel.
 - Improved the error text in the **Edit Channel Header** modal.
 - Added the ability to clear a custom status when only an emoji and no text is set.
 - Redesigned message notification emails.

#### Administration
 - The default value of the [Support Email](https://docs.mattermost.com/administration/config-settings.html#support-email) (previously ``_feedback@mattermost.com_``) has been removed. Admin Advisor will now prompt System Admins about missing configuration for the [Support Email](https://docs.mattermost.com/administration/config-settings.html#support-email). This value is required, and it ensures Mattermost account requests are sent to the correct team for resolution.
 - The **Marketplace** button in the **Main Menu** is now displayed if the user has the ``sysconsole_write_plugins`` permission.
 - Added new feature discoveries in the System Console, including Data Retention Policy and OpenID Connect.
 - Added basic intra-cluster communication support for plugins.
 - Improved error messages for ``/header`` and ``/purpose`` commands.

### Bug Fixes
 - Fixed a race condition where enabling plugins would result in spurious errors in the logs.
 - Fixed a bug where team member permissions were not updated after associating a team with a permission scheme.
 - Fixed the responses of the role by ID and all roles of API endpoints when the role was associated to channel schemes.
 - Removed sticky sidebar headings in favor of fixing nesting errors.
 - Fixed an issue where the **Close** button in the **Create New Category** modal was only visible on mouse hover.
 - Fixed a bug where session expiration was extended with activity regardless of what the config setting ``ServiceSettings.ExtendSessionLengthWithActivity`` was set to.
 - Fixed an issue where the ``idmigrate`` command did not update values if they were not already present as LDAP attributes in the ``config.json``.

### Known Issues
 - Pinned posts are no longer highlighted.
 - Sometimes an "Unable to get role" error appears when changing a channel member role in **System Console > User Management > Channels**.
 - **Cloud > "Tips & Next Steps"** should not show an "Explore channels" section for guest users.
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.

## Release 2021-05-05

### Improvements

#### User Interface (UI)
 - If message autoresponder is set, only one message is now sent to a given user irrespective of how many Direct Message messages the user receives.
 - Added status icons on **Add members** to channel and **Add members** to team lists.
 - Added a keyboard shortcut to focus on the Search bar and search in the current channel.

#### Administration
 - Gossip clustering mode is now in General Availability and is no longer available as an option. All cluster traffic will always use the gossip protocol. The config setting ``UseExperimentalGossip`` has no effect and has only been kept for compatibility purposes. The setting to use gossip has been removed from the System Console. **Note:** For High Availability upgrades, all nodes in the cluster must use a single protocol. If an existing system is not currently using gossip, one node in a cluster can't be upgraded while other nodes in the cluster use an older version. Customers must either use gossip for their High Availability upgrade, or customers must shut down all nodes, perform the upgrade, and then bring all nodes back up.
 - ``TCP_NO_DELAY`` is disabled for Websocket connections to allow for higher throughput.
 - Compliance Monitoring CSV files are no longer limited to 30,000 rows.

### Bug Fixes
 - Fixed an issue where bulk export generated invalid Direct Message channels between deactivated users.
 - Fixed an issue where the custom status cleared slash commands on mobile.
 - Fixed an issue with an incorrect error message when trying to change handle via API to another one that already existed.
 - Fixed an issue where LDAP Group Sync didn't work when using SAML (ADFS) for authentication and AD/LDAP Group Sync unless ``EnableSyncWithLdapIncludeAuth`` was set to ``true``, which caused the ``AuthData`` to be stored in AD/LDAP format.
 - Fixed an issue where a user with 'No Access' permission could still access **Groups**, **Channels** and **Teams** configuration pages through a URL.
 - Fixed an issue where **Remove from channel** and **Remove Team Member** menu items were visible in a group-synced channel or team.
 - Fixed various bugs related to hardcoded theme colours.
 - Fixed UI issues related to hardcoded variables and misalignment of the channel header with the **Has guests** text.
 - Fixed an issue with SAML Sign-on where System Admins were unable to modify **Service Provider Login URL** unless ``VerifySignature`` was enabled.

### Known Issues
 - Pinned posts are no longer highlighted.
 - Sometimes an "Unable to get role" error appears when changing a channel member role in **System Console > User Management > Channels**.
 - **Cloud > "Tips & Next Steps"** should not show an "Explore channels" section for guest users.
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.

## Release 2021-04-22

### Highlights

#### Apps Framework (Developer Preview)
 - The Mattermost Apps Framework introduces a new way to integrate with external tools to allow developers to create interactive Apps in Mattermost using any development language they're comfortable with. These Apps work seamlessly across mobile and desktop clients. This is a developer preview that is not yet intended for production instances of Mattermost. The Apps Framework will be available for self-managed customers in Mattermost v5.35 once the Apps Framework Plugin is loaded on an instance. Until then, developers can use the `cloud` branch to get a local test environment running. The launch for the Developer Preview of the Apps Framework is scheduled for April 29th, 2021. Learn more: https://developers.mattermost.com/integrate/apps/.

#### Search Results Are Returned on File Search
 - Searching in Mattermost now finds both relevant messages and files in your team's conversation history. Search will return results for attachments that match the file name or contain matching text content within supported document types. Learn more. To be available for mobile apps in a later release.

#### Granular Access to System Console Pages
 - Migrated the following System Console sections to their respective sub-section permissions: Experimental, About, Reporting, Environment, Site Configuration, Authentication, Integrations, and Compliance.

#### Shared Channels (Experimental)
 - Experimental support was added for sharing channels between Mattermost clusters. This feature is disabled by default.

### Improvements

#### User Interface (UI)
 - Added support to collapse in-line images over 100px in height.
 - Implemented maximum length validation on the status modal for custom statuses.
 - Synchronized collapsed channel sidebar categories on the server.
 - Empty state is no longer off-centered in the **Channel Switcher**.
 - Ephemeral message created from call response ``markdown`` field is now posted by bot.
 - Added improvements and fixes for the custom status feature. For example, fixed an issue where recently selected statuses were missing from the **Set a Status** confirmation screen, and updated the **Mobile Push Notifications** text in **Account Settings** to refer to user **availability** instead of **online status**.
 - Moved the user status in the channel switcher to overlap with user avatars, and added URL 'Slug' information to channel names in the channel switcher.

#### Administration
 - Paused admin advisor notifications from triggering.
 - Added a command line document extraction command that allows indexing documents by content.

### Bug Fixes
 - Fixed link previews on a number of websites, including Reddit.
 - Fixed an issue where SAML assigned Mattermost ``UserID`` as username if the value was invalid and did not log this.
 - Fixed an issue where hover effects for category sorting and **Direct Messages** category limit submenus were too dark on a dark theme.
 - Fixed an issue where users were unable to drag the vertical scroll bar on a PDF preview.
 - Fixed an issue with animations on long posts when highlighted as a permalink.
 - Fixed an issue where the user's nickname was not shown on channel switch.
 - Fixed an issue where deactivated users were not marked as "Deactivated" in the channel switcher.
 - Fixed an issue where queries executed during the upgrade process would preemptively time out on the application side.

### Known Issues
 - Pinned posts are no longer highlighted.
 - Posts in the thread disappear when deleting a post from a permalink view.
 - Sometimes an "Unable to get role" error appears when changing a channel member role in **System Console > User Management > Channels**.
 - **Cloud > "Tips & Next Steps"** should not show an "Explore channels" section for guest users.
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.

## Release 2021-04-07

### Improvements

#### User Interface (UI)
 - Added a string field to configuration for restricted domains with the key ``RestrictLinkPreviews`` and added a UI field for restricted domains under **System Console > Site Configuration > Posts**. Also expanded the logic that determines whether a post has a preview or not.
 - Added an unread badge to the **Main Menu** icon and the **Plugin Marketplace** menu that displays until a System Admin visits the **Plugin Marketplace** for the first time.
 - Removed Beta tags from Swedish and Bulgarian languages.
 - Added profile pictures to the **Direct Messages** channel list.
 - Added channel icons for email notifications as part of email notification redesigns.
 - Direct Messages **More...** modal is now sorted by recent conversations when the modal is opened.
 - Removed legacy Open-Sans fonts and upgraded Open-Sans to v18.

#### Administration
 - Removed the utility function ``model.GeneratePassword()`` for security reasons. An improved version is now being used internally to generate passwords for bulk-imported users.
 - Only the System Admin is allowed to have the ability to assign system roles.
 - Two new gauge metrics were added: ``mattermost_db_replica_lag_abs`` and ``mattermost_db_replica_lag_time``, both containing a label of "node", signifying which database host is the metric from. 
     - These metrics signify the replica lag in absolute terms and in the time dimension capturing the whole picture of replica lag. To use these metrics, a separate config section ``ReplicaLagSettings`` was added under ``SqlSettings``. This is an array of maps which contain three keys: ``DataSource``, ``QueryAbsoluteLag``, and ``QueryTimeLag``. Each map entry is for a single replica instance. ``DataSource`` contains the database credentials to connect to the replica instance. ``QueryAbsoluteLag`` is a plain SQL query that must return a single row of which the first column must be the node value of the Prometheus metric, and the second column must be the value of the lag. ``QueryTimeLag`` is the same as above, but used to measure the time lag. 
     - As an example, for AWS Aurora instances, the ``QueryAbsoluteLag`` can be: ``select server_id highest_lsn_rcvd-durable_lsn as bindiff from aurora_global_db_instance_status()`` where ``server_id=<>`` and ``QueryTimeLag`` can be: ``select server_id, visibility_lag_in_msec aurora_global_db_instance_status()`` where ``server_id=<>``. For MySQL Group Replication, the absolute lag can be measured from the number of pending transactions in the applier queue: ``select member_id, count_transactions_remote_in_applier_queue FROM performance_schema.replication_group_member_stats`` where ``member_id=<>``. Overall, what query to choose is left to the administrator, and depending on the database and need, an appropriate query can be chosen.

### Bug Fixes
 - Fixed an issue where users were unable to deactivate MFA for their accounts even if MFA was disabled on the server.
 - Fixed an issue where user settings on API could be set if LDAP Sync was on. For LDAP and SAML users, the following fields cannot be changed via the API if the corresponding LDAP/SAML attributes have been set: first name, last name, position, nickname, email, profile picture. For OAUTH users (i.e., Gitlab, Google, Office365 and OpenID), the following fields cannot be changed via the API: first name, last name. All users who authenticate via a method other than email cannot change their username via the API.
 - Fixed a possible panic on post creation when the collapsed threads feature was enabled.
 - Fixed a database deadlock that could happen if a sidebar category was updated and deleted at the same time.
 - Fixed an issue where the sidebar **Text Hover BG Theme** color didn’t work on the left-hand side.
 - Fixed an issue where the Team Admin’s current role was presented inconsistently in the different areas of the System Console.
 - Fixed an issue where the **Show more** background color on long posts was broken for permalinks.

### Known Issues
 - Channel Members popover menu items have extra spacing.
 - Deactivated users are not marked as "Deactivated" in the channel switcher.
 - User nickname is not shown on channel switch.
 - Sometimes an "Unable to get role" error appears when changing a channel member role in **System Console > User Management > Channels**.
 - **Cloud > "Tips & Next Steps"** should not show an "Explore channels" section for guest users.
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.

## Release 2021-03-24

### Improvements

#### User Interface (UI)
 - Added support for automatic right-to-left (RTL) detection in browsers.
 - Updated the font size for the **Add People** channel modal.
 - Online status is now shown in the channel switcher.
 - Improved the design and layout of email notifications for password resets, member invites, member welcome, and verifications.

#### Administration
 - Added ``mmctl`` commands to create, list, download, and delete export files.
 - Profiling the Mattermost server with pprof is now available for Team Edition.
 - Added attributes to split.io feature flags.

### Bug Fixes
 - Fixed bugs related to replication lag for Enterprise Edition instances configured to use read replicas.
 - Fixed an issue where Compliance Report field headers were not correctly aligned.
 - Fixed an issue where the ``/join`` command was case-sensitive.
 - Fixed an issue where one-character sidebar category names were not displayed.
 - Fixed an issue with a theme discrepancy on close buttons on some modals in the System Console (when using a custom team theme).
 - Fixed an issue where long text input in the right-hand pane was jumpy when selected.
 - Fixed an issue where the Zoom level persisted across multi-attachment PDF previews.

### Known Issues
 - Deactivated users are not marked as "Deactivated" in the channel switcher.
 - User nickname is not shown on channel switch.
 - Sometimes an "Unable to get role" error appears when changing a channel member role in **System Console > User Management > Channels**.
 - **Cloud > "Tips & Next Steps"** should not show an "Explore channels" section for guest users.
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.

## Release 2021-03-12

### Highlights

#### Custom Statuses
 - Custom Statuses allow users to add a descriptive status message and emoji that’s visible to everyone. Users now gain the flexibility to express their current status in any way they prefer. Mobile support is coming in a future release.

### Improvements

#### User Interface (UI)
 - System Admins are now prompted when joining a private channel via a permalink.
 - Added support for adding in-product notices for external dependency deprecation details.
 - Improved the timezone selector component.
 - Introduced a new theme variable for the team sidebar.

#### Administration
 - Added schema migrations phase 0 (``Teams``, ``TeamMembers``).
 - Removed any references to ``SqlLite3`` from the code.
 - Bleve updates are now logged in the config only when there is an actual change in the ``BleveSettings`` instead of on every config update.

### Bug Fixes
 - Fixed unsafe access of properties of the plugin environment during ``ServePluginPublicRequest``.
 - Fixed an issue where the Admin Console > Server Logs did not focus to the sidebar filter upon reload.
 - Fixed an issue where the Gif picker appeared empty instead of showing a “No results” modal when no results were displayed.
 - Fixed an issue where the keyboard accessibility controller was not allowed to resume left-hand side scroll after drag and drop.
 - Fixed an issue where markdown links rendered incorrectly.
 - Fixed an issue where the slack theme import failed due to changes in formatting of Slack export color schemes.
 - Fixed an issue where tooltips were missing for channels with a long name.
 - Fixed a race condition which would crash the app server due to improper handling of websocket closing.
 - Fixed an issue where the PDF zoom failed to respond to zoom in/out/reset actions until the user scrolled.
 - Fixed an issue where in a reply thread with the right-hand side expanded, attachments in a post draft got hidden behind the center channel text box.

### Known Issues
 - Sometimes an "Unable to get role" error appears when changing a channel member role in **System Console > User Management > Channels**.
 - **Cloud > "Tips & Next Steps"** should not show an "Explore channels" section for guest users.
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.

## Release 2021-02-25

### Highlights

#### Support Packet Generation
 - Allows a System Admin to download a support packet which provides helpful information to our internal support team.

### Improvements

#### User Interface (UI)
 - Removed the 5-page limit on previewing PDFs.
 - Added "files" as a reserved team name.
 - Searching for a channel by URL now returns the channel.
 - Users are now provided with feedback when creating a custom category name that exceeds the character limit.

#### Administration
 - Added support for compressed export files with attachments.
 - Server crashes due to runtime panics are now captured as a log line.
 - Optimized Direct Message creation by fetching all users involved in a single database call.
 - During the user import process, a change in a user's ``NotifyProps`` will not send an email notification. This is done to make it consistent with other parts of the import process where a change in user's attributes would also not send any notifications.
 - Implemented a job to delete unused export files.
 - Improved the websocket implementation by using epoll to manually read from a websocket connection. As a result, the number of goroutines is expected to go down by half. This implementation is only available on Linux and FreeBSD-based distributions. If you are using NGINX as a proxy to Mattermost, please ensure to have ``proxy_http_version 1.1;`` in the block that handles the websocket path.

### Bug Fixes
 - Fixed an issue where demoting a user to a guest would not take effect in an environment with read replicas.
 - Fixed an issue where creation of a bot would fail due to replica lag.
 - Fixed an issue where ``mmctl channel move`` did not allow private channels to move.
 - Fixed an issue where markdown tables did not wrap correctly.
 - Fixed an issue where the search bar styling on dark themes was incorrect on mobile web view.
 - Fixed an issue where the **Main Menu** on webapp appeared more left-aligned than previous releases.
 - Fixed an issue where sticky sidebar headings appeared under **More Unreads**.
 - Fixed an issue where the group channel icon was misaligned in the channel switcher.
 - Fixed an issue where line breaks were ignored when used with inline images.
 - Fixed a panic when the OAuth discovery endpoint would not return a Cache-Control header.
 - Fixed an issue where the Cloud onboarding flow referenced OAuth, not OpenID Connect.

### Known Issues
 - PDF zoom fails to respond to zoom in/out/reset actions until the user scrolls.
 - In a reply thread with the right-hand side expanded, attachments in a post draft get hidden behind the center channel text box.
 - Sometimes an "Unable to get role" error appears when changing a channel member role in **System Console > User Management > Channels**.
 - **Cloud > "Tips & Next Steps"** should not show an "Explore channels" section for guest users.
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.

## Release 2021-02-10

### Highlights

#### OpenID Connect (Cloud Professional & Enterprise)
 - OpenID Connect enables authentication to Mattermost using any OAuth 2.0 provider that adheres to the OpenID Connect specification. **This feature will be available for Mobile Apps in an upcoming v1.40 release.**

### Improvements

#### User Interface (UI)
 - Improved the **Add Members** modal user interface.
 - Added formatting shortcut keys to the **Shortcut** modal.
 - Added localization to the date picker used when searching for posts around a given date.
 - The autocomplete popover is now positioned relative to the ``@``, ``~``, or ``/`` trigger in the post draft.

#### Notifications
 - Posts from OAuth 2.0 bots no longer trigger mentions for the user.

#### Administration
 - Added an ``ImportDelete`` job to periodically delete unused import files after a configurable retention period has passed.
 - Introduced new ``mattermost_system_server_start_time`` and ``mattermost_jobs_active`` metrics for improved debugging with Grafana dashboards.
 - Deleting a reaction is now a soft delete in the ``Reactions`` table. A schema update is required and may take up to 15 seconds on first run with large data sets.
 - Changed default ``MaxFileSize`` from 50MB to 100MB.
 - Updated Go dependencies to their latest minor version.

### Bug Fixes
 - Fixed an issue where ``mmctl config set PluginSettings.EnableUploads`` did not change the configuration value.
 - The ``DownloadComplianceReport`` function in the Golang driver has been fixed to be able to download a full report as a zip archive.
 - Fixed Cache-Control headers to instruct that responses may only be cached on browsers.
 - Fixed a bug with in-product notices where a date constraint sometimes failed to match, and would lead to the notice not being fetched.
 - Fixed an issue where the channel switcher did not focus on the first list result after a backspace.
 - Fixed an issue where the in-product instructions to search for users under **System Console > Reporting > Server Logs** were outdated.
 - Fixed an issue where no error message was displayed when adding an LDAP Group Synchronized Team in **System Console > User Management > Users**.

### Known Issues
 - The slash command autocomplete options cover the input box on some reply threads on the right-hand side.
 - Sometimes an "Unable to get role" error appears when changing a channel member role in **System Console > User Management > Channels**.
 - **Cloud > "Tips & Next Steps"** should not show an "Explore channels" section for guest users.
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.

## Release 2021-01-26

### Highlights

#### Channel Sidebar Improvements
 - New channel sidebar improvements include a configurable **Unreads** category as well as the ability to sort categories by recent activity or alphabetically in addition to manually.
 
### Improvements

#### User Interface (UI)
 - Added new languages, Bulgarian and Swedish.
 - Moved the header icons to the left of the header beside the channel description.
 - The Database search using PostgreSQL now supports searching for terms that contain underscores.

#### Plugins
 - Enabled experimental support for ARM64 plugins by allowing any matching ``GOOS-GOOARCH`` combination in the plugin manifest.

#### Administration
 - The ``UseExperimentalGossip`` field under ClusterSettings is now ``true`` by default. This means that new installations will use the Gossip protocol for cluster communication. There will be no changes to existing installations. The Gossip protocol is now considered to be in General Availability and is the recommended clustering mode.
 - ``AnalyticsPostCount`` now avoids unnecessary table scans during various background jobs.
 - Added a ``CollapsedThreads`` feature flag.
 - The Help text for the Rate Limiting setting was updated to explain the purpose of rate limiting.
 - Removed the word "experimental" from the Gossip setting in the System Console.
 - Deprecated the ``ExperimentalChannelSidebarOrganization`` setting and added a new ``EnableLegacySidebar`` setting. The new channel sidebar will be enabled system-wide by default.

#### Bug Fixes
 - Fixed an issue where the Admin Filter option was not disabled in the AD/LDAP page for Admin roles with a ``sysconsole_write_authentication`` permission.
 - Fixed an issue where channels would sometimes be removed from custom categories when a user left a team.
 - Fixed an issue where the error text was missing when the team name was left blank on the Team Create page.
 - Fixed an issue where the System Manager was able to download the Compliance Export files.
 - Fixed an issue where themed button colours in interactive message attachments in Mattermost’s default dark theme were mismatched.
 - Fixed an issue where bold and italics shortcuts triggered with CTRL+B on Mac.
 - Fixed an issue where a "Your license does not support cloud requests” log error appeared on self-hosted servers.

#### Known Issues
 - Setting changes do not get saved on **System Console > Site Configuration > Public Links**.
 - Alignment of team icons are off on **System Console > User Management >Teams Page**.
 - Alignment of channel header text "This channel has guests" is off.
 - Sometimes an "Unable to get role" error appears when changing a channel member role on **User Management > Channel**.
 - **Cloud > "Tips & Next Steps"** should not show an "Explore channels" section for guest users.
 - System Roles shows **License** and **Environment** as possible permissions, but they are always hidden in Cloud.

## Release 2021-01-12

### Highlights
 - Pre-packaged and pre-installed Mattermost Incident Management v1.2.0.

### Improvements

#### User Interface (UI)
 - Changed the number of file attachments allowed per post, from 5 to 10.
 - Added support to move multi-selected groups of channels to another category via the **More options** menu.
 
#### Administration
 - Updated the Go version to v1.15.5.
 - Added support for automatic installation and enablement of plugins using feature flags.
 - Added ``webhook create`` endpoints to local mode and the ability to create webhooks for other users.
 - Added a Mattermost CLI command to initialize the database.
 - Enabled ``ExperimentalDataPrefetch`` for all servers and removed the corresponding setting.
 - Added support for processing import files through the API.
 - Added support for protocol-relative URLs while using the Image Proxy.
 - Added shared channels and ``remote_cluster_service`` under a license check.
 - A Striped LRU cache is now used by default.

### Bug Fixes
 - Fixed an issue where the permissions of a System Admin role got deleted when changing the access level to any permission.
 - Fixed an issue where editing a ``/me`` post behaved differently within the Mattermost Web App and the Mobile App.
 - Fixed an issue where the hover state on category headers did not span the whole width of the left-hand navigation.
 - Fixed an issue where plugins on the left-hand side of the System Console were sorted differently than the ones in the Plugin Management page.
 - Fixed an issue where 15-character team names were truncated when the experimental channel sidebar was enabled.
 - Fixed an issue where the sidebar menus weren't styled correctly in mobile browser view.
 - Fixed an issue where jumping into an archive channel and clicking the link to jump to recent messages sent the user out of the archived channel.
 - Fixed an issue where the tooltip text for copying an incoming webhook URL was unclear.

### Known Issues
 - Cloud > "Tips & Next Steps" should not show an "Explore channels" section for guest users.
 - System Roles shows License and Environment as possible permissions but they are always hidden in Cloud.

## Release 2020-12-18

### Bug Fixes
 - Fixed a performance issue related to typing lag.
 - Fixed an issue where YouTube previews did not display sometimes.

## Release 2020-12-09

### Improvements

#### User Interface (UI)
 - Added the ability to mute categories with the experimental sidebar feature.
 - Added support for multi-selection of channels when dragging and dropping between channels in the experimental sidebar feature.
 - Group messages are now returned in the channel switcher when only first names are typed.
 - Issuing /dnd consecutively no longer unexpectedly toggles the user status between "Do Not Disturb" and "Online" and will only set the user's status to "Do Not Disturb".

#### Administration
 - Added a new `manage_remote_clusters` permission.
 - Enabled goSAML2 library as the only supported SAML library.

### Bug Fixes
 - Cleaned up the config store on server initialization errors.
 - Fixed an issue where permissions did not grant read and/or write access to the Global Relay configuration settings.
 - Fixed an issue where the site configuration ‘’Read only’’ permission did not make the "Notice" section as read-only for the System Manager.
 - Fixed an issue where importing Client4 in a node server caused an exception due to rudder modules.
 - Fixed an issue where LDAP ‘’FirstLoginSync’’ didn't close the LDAP session.

### Known Issues
 - System Managers do not have access to the Billing section and see a blank screen.
 - Cloud > "Tips & Next Steps" should not show an "Explore channels" section for guest users.
 - System Roles shows License and Environment as possible permissions but they are always hidden in Cloud.

## Release 2020-12-03

### Bug Fixes
  - Disabled the xmlsec1-based SAML library in favor of the re-enabled and improved SAML library.

## Release 2020-11-24

### Highlights

#### Modify new Admin roles permissions in the System Console (Beta)
 - Added a user interface for the existing new system roles functionality including new permissions to read and write system roles.

#### Pre-package and enable incident management v1.1.1

### Improvements

#### User Interface
 - @-autocomplete results are now prioritized based on recency and thread activity.
 - File attachments below the size of 10 (KB, MB, GB, TB, etc.) now allow showing fractions.
 - The formatting of the channel header change message was improved.
 - Team invite workflow now shows BOT tags when the search returns Bot users.
 - Added the ability to zoom in and out of PDF files.
 - Added support for 16x16 base64 encoded mini images to use with progressive rendering.

#### Notifications
 - Channel-wide mentions are now automatically disabled when a user mutes a channel.

#### Integrations
 - Updated icon_emoji field in incoming webhooks to allow emojis to be specified with surrounding colons.
 - Dynamic auto-completion is now supported for built-in slash commands.
 - Added plugin hooks for ReationHasBeenAdded and ReactionHasBeenRemoved.

#### Administration
 - Added the ability to load a set of custom configuration defaults from a MM_CUSTOM_DEFAULTS_PATH environment variable.
 - Added AWS metering service support.
 - Added the ability to retrieve compliance files from the System Console.

### Bug Fixes
 - Fixed an issue with broken link previews for Twitter links.
 - Fixed an issue where editing a post did not submit with CMD+ENTER.
 - Fixed an issue where users were able to create or edit slash commands to contain more than two slashes in the URL.
 - Fixed an issue where resized emojis were being overwritten with original data.
 - Fixed an issue where the sidebar category "More" menu was not shown when hovering over a long category name.
 - Fixed an issue where a received direct message did not show up on the sidebar if the direct message channel was newly created.
 - Fixed an issue where a search using ``from:`` failed to auto-load more results on the right-hand side when Elasticsearch was enabled.
 - Fixed an issue where an s3 file backend TestFileConnection failed due to permissions if S3PathPrefix was in use.
 - Fixed an issue where an id was missing for a Tooltip in PostInfo.

#### API Changes
 - Added new local API endpoints for getting, updating, and deleting incoming and outgoing webhooks.
 - Added new API endpoints to work with experimental collapsed threads.

### Known Issues
 - System Managers do not have access to the Billing section and see a blank screen.
 - Cloud > "Tips & Next Steps" should not show an "Explore channels" section for guest users.
 - System Roles shows License and Environment as possible permissions but they are always hidden in Cloud.

source/images/zoom_webhook.png METASEP

source/images/zoom_system_console.png METASEP

source/images/zoom_system-console_management.png METASEP

source/images/zoom_channel_header2.png METASEP

source/images/zoom_api_key.png METASEP

source/images/zapier-trailing-space-error.png METASEP

source/images/zapier-oauth.png METASEP

source/images/zapier-error4.png METASEP

source/images/zapier-error3.png METASEP

source/images/zapier-error2.png METASEP

source/images/zapier-error1.png METASEP

source/images/zapier-dynamic-fields.png METASEP

source/images/zapier-deauthorize.png METASEP

source/images/zapier-ch2.png METASEP

source/images/zapier-ch1.png METASEP

source/images/write-dm.png METASEP

source/images/workspace-optimization.png METASEP

source/images/windows_6_http_to_https_redirect.png METASEP

source/images/windows_5_iis_manager_url_rewrite.png METASEP

source/images/windows_4_IIS_manager.png METASEP

source/images/windows_3_confirm_mattermost_browser.png METASEP

source/images/windows_2_platform_exe_test.png METASEP

source/images/windows_1_expected_directory_structure.png METASEP

source/images/windows10emojiskintones.png METASEP

source/images/websocket.png METASEP

source/images/webrtc_full_settings.png METASEP

source/images/webrtc-popover.png METASEP

source/images/webrtc-header.png METASEP

source/images/webhooksTable.png METASEP

source/images/webhooks.png METASEP

source/images/web-service-table.png METASEP

source/images/weatherBot.png METASEP

source/images/valid2.png METASEP

source/images/valid1.png METASEP

source/images/upload-team-icon.png METASEP

source/images/unreads.gif METASEP

source/images/unpin-message-from-channel.png METASEP

source/images/unflag.png METASEP

source/images/unarchive-channel.png METASEP

source/images/ui_teams.png METASEP

source/images/ui_search.png METASEP

source/images/ui_notifications.png METASEP

source/images/ui_messages.png METASEP

source/images/ui_channels5.png METASEP

source/images/ui2.png METASEP

source/images/transport-encryption.png METASEP

source/images/translations_download.png METASEP

source/images/threaded_conversations.png METASEP

source/images/theme_colors.png METASEP

source/images/themeSolarizedDark.png METASEP

source/images/themeOneDark.png METASEP

source/images/themeGruvboxDark.png METASEP

source/images/theme4.png METASEP

source/images/theme3.png METASEP

source/images/theme2.png METASEP

source/images/theme1.png METASEP

source/images/teams.gif METASEP

source/images/team-sidebar.png METASEP

source/images/team-sidebar.gif METASEP

source/images/team-sidebar-notifications.png METASEP

source/images/team-settings.png METASEP

source/images/team-scheme.png METASEP

source/images/team-scheme-list.png METASEP

source/images/systemnotice2.png METASEP

source/images/systemnotice1.png METASEP

source/images/system-scheme.png METASEP

source/images/syntax-highlighting-sol-light.png METASEP

source/images/syntax-highlighting-sol-dark.png METASEP

source/images/syntax-highlighting-monokai.png METASEP

source/images/syntax-highlighting-github.png METASEP

source/images/switch-channels.png METASEP

source/images/strikethrough.png METASEP

source/images/sort-categories.gif METASEP

source/images/smile-icon.png METASEP

source/images/slash_commands_token.png METASEP

source/images/slash_commands.png METASEP

source/images/slashCommandsTable2.png METASEP

source/images/slashCommandsTable1.png METASEP

source/images/slashCommandsAutocomplete.png METASEP

source/images/slash-commands.gif METASEP

source/images/sign-in_with_saml.png METASEP

source/images/sign-in_with_office_365.png METASEP

source/images/sign-in_with_ldap.png METASEP

source/images/sign-in_with_google_apps.png METASEP

source/images/sign-in_with_gitlab.png METASEP

source/images/sign-in_with_email.png METASEP

source/images/sign-in-office365.png METASEP

source/images/sign-in-google-apps.png METASEP

source/images/sign-in-gitlab.png METASEP

source/images/sidebar_nav.gif METASEP

source/images/sidebar_ga.gif METASEP

source/images/sidebar-phase-2.gif METASEP

source/images/sidebar-phase-1.gif METASEP

source/images/settings-outline_F08BB.svg METASEP
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M19.43 12.98c.04-.32.07-.64.07-.98 0-.34-.03-.66-.07-.98l2.11-1.65c.19-.15.24-.42.12-.64l-2-3.46c-.09-.16-.26-.25-.44-.25-.06 0-.12.01-.17.03l-2.49 1c-.52-.4-1.08-.73-1.69-.98l-.38-2.65C14.46 2.18 14.25 2 14 2h-4c-.25 0-.46.18-.49.42l-.38 2.65c-.61.25-1.17.59-1.69.98l-2.49-1c-.06-.02-.12-.03-.18-.03-.17 0-.34.09-.43.25l-2 3.46c-.13.22-.07.49.12.64l2.11 1.65c-.04.32-.07.65-.07.98 0 .33.03.66.07.98l-2.11 1.65c-.19.15-.24.42-.12.64l2 3.46c.09.16.26.25.44.25.06 0 .12-.01.17-.03l2.49-1c.52.4 1.08.73 1.69.98l.38 2.65c.03.24.24.42.49.42h4c.25 0 .46-.18.49-.42l.38-2.65c.61-.25 1.17-.59 1.69-.98l2.49 1c.06.02.12.03.18.03.17 0 .34-.09.43-.25l2-3.46c.12-.22.07-.49-.12-.64l-2.11-1.65zm-1.98-1.71c.04.31.05.52.05.73 0 .21-.02.43-.05.73l-.14 1.13.89.7 1.08.84-.7 1.21-1.27-.51-1.04-.42-.9.68c-.43.32-.84.56-1.25.73l-1.06.43-.16 1.13-.2 1.35h-1.4l-.19-1.35-.16-1.13-1.06-.43c-.43-.18-.83-.41-1.23-.71l-.91-.7-1.06.43-1.27.51-.7-1.21 1.08-.84.89-.7-.14-1.13c-.03-.31-.05-.54-.05-.74s.02-.43.05-.73l.14-1.13-.89-.7-1.08-.84.7-1.21 1.27.51 1.04.42.9-.68c.43-.32.84-.56 1.25-.73l1.06-.43.16-1.13.2-1.35h1.39l.19 1.35.16 1.13 1.06.43c.43.18.83.41 1.23.71l.91.7 1.06-.43 1.27-.51.7 1.21-1.07.85-.89.7.14 1.13zM12 8c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 6c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z"/></svg>
source/images/set-your-availability.png METASEP

source/images/set-custom-status.png METASEP

source/images/server-menu.png METASEP

source/images/self-managed-badge.png METASEP

source/images/self-hosted-badge.png METASEP

source/images/selectemoji.png METASEP

source/images/select-google-sso-web-app.png METASEP

source/images/section_loop.gif METASEP

source/images/search-pop.png METASEP

source/images/search-modifiers.png METASEP

source/images/search-messages.png METASEP

source/images/search-files.png METASEP

source/images/scaling-3.png METASEP

source/images/scaling-2.png METASEP

source/images/scaling-1.png METASEP

source/images/saved-posts.png METASEP

source/images/save1.png METASEP

source/images/save-message.png METASEP

source/images/save-icon.png METASEP

source/images/review-all-search-results.png METASEP

source/images/restrict-role-access.png METASEP

source/images/replyIcon.png METASEP

source/images/reply-to-message.png METASEP

source/images/reply-outline_F0F20.svg METASEP
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M8.5,8.1L8.5,8.1v2l1.9,0.1c2.7,0.1,4.9,1.2,6.7,3.3c-2.1-0.7-4.3-0.8-6.7-0.8h-2v2v0.7l-3.7-3.7L8.5,8.1 M10.3,4
	C10.2,4,10,4,9.8,4.1l-7.7,7.2C2,11.4,2,11.5,2,11.7c0,0.1,0,0.2,0.1,0.3l7.7,7.4c0.1,0.1,0.3,0.1,0.4,0.1c0.1-0.1,0.2-0.2,0.2-0.5
	v-4.4c4.7,0,8.3,0.5,10.8,5.1c0.1,0.1,0.2,0.2,0.3,0.2h0.1c0.2-0.1,0.3-0.3,0.2-0.5c0.1-0.3-0.3-3-2.1-5.8c-2.2-3.5-5.4-5.4-9.3-5.6
	V4.3C10.5,4.1,10.4,4,10.3,4L10.3,4z"/></svg>
source/images/reply-icon.png METASEP

source/images/reply-arrow.png METASEP

source/images/remove-member-from-channel.png METASEP

source/images/remove-from-saved-posts.png METASEP

source/images/reduce3.png METASEP

source/images/reduce2.png METASEP

source/images/reduce1.png METASEP

source/images/recent-mentions.png METASEP

source/images/recent-emojis.png METASEP

source/images/recent-direct-group-messages.png METASEP

source/images/push_notification_chart.png METASEP

source/images/push_notification.png METASEP

source/images/public_channel.png METASEP

source/images/professional-badge.png METASEP

source/images/products_E82F.svg METASEP
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M16,20H20V16H16M16,14H20V10H16M10,8H14V4H10M16,8H20V4H16M10,14H14V10H10M4,14H8V10H4M4,20H8V16H4M10,20H14V16H10M4,8H8V4H4V8Z" /></svg>

source/images/private_team.png METASEP

source/images/private_channel.png METASEP

source/images/post_list_ada.gif METASEP

source/images/poll.png METASEP

source/images/poll.gif METASEP

source/images/plus_F0415.svg METASEP
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M19,13H13V19H11V13H5V11H11V5H13V11H19V13Z" /></svg>
source/images/plugin_framework.png METASEP

source/images/playbook-metrics.png METASEP

source/images/pinned-posts.png METASEP

source/images/pinned-icon.png METASEP

source/images/pinned-example-rhs.png METASEP

source/images/pinned-example-channel.png METASEP

source/images/pin-message-to-channel.png METASEP

source/images/pin-icon-black.png METASEP

source/images/permalink-previews.png METASEP

source/images/performance_monitoring.png METASEP

source/images/perf_monitoring_system_console.png METASEP

source/images/perf_monitoring_messaging_metrics.png METASEP

source/images/perf_monitoring_http_metrics.png METASEP

source/images/perf_monitoring_go_metrics.png METASEP

source/images/perf_monitoring_caching_metrics.png METASEP

source/images/perf-9-b.png METASEP

source/images/perf-8.png METASEP

source/images/perf-7.png METASEP

source/images/perf-6.png METASEP

source/images/perf-5.png METASEP

source/images/perf-4.png METASEP

source/images/perf-3.png METASEP

source/images/perf-2.png METASEP

source/images/perf-1.png METASEP

source/images/paperclip_F03E2.svg METASEP
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M16.5,7v9.5c0,2.209-1.791,4-4,4s-4-1.791-4-4V6c0-1.381,1.119-2.5,2.5-2.5s2.5,1.119,2.5,2.5v9.5c0,0.552-0.448,1-1,1
	s-1-0.448-1-1V7H10v8.5c0,1.381,1.119,2.5,2.5,2.5s2.5-1.119,2.5-2.5V6c0-2.209-1.791-4-4-4S7,3.791,7,6v10.5
	c0,3.038,2.462,5.5,5.5,5.5s5.5-2.462,5.5-5.5V7H16.5z"/></svg>
source/images/outgoing_webhooks_token.png METASEP

source/images/open_team.png METASEP

source/images/online-status.png METASEP

source/images/onelogin_9_sso.png METASEP

source/images/onelogin_8_parameters_add_4.png METASEP

source/images/onelogin_7_parameters_add_3.png METASEP

source/images/onelogin_6_parameters_add_2.png METASEP

source/images/onelogin_5_parameters_add.png METASEP

source/images/onelogin_4_configuration_2.png METASEP

source/images/onelogin_3_configuration_1.png METASEP

source/images/onelogin_2_basic_configuration.png METASEP

source/images/onelogin_1_new_app.png METASEP

source/images/onelogin_10_sso_certificate.png METASEP

source/images/okta_9_view_instructions.png METASEP

source/images/okta_8_view_instructions.png METASEP

source/images/okta_7_support_configuration.png METASEP

source/images/okta_6_attribute_statements.png METASEP

source/images/okta_5_advanced_saml_settings.png METASEP

source/images/okta_4_initial_saml_settings.png METASEP

source/images/okta_3_initial_saml_settings.png METASEP

source/images/okta_2_general_settings.png METASEP

source/images/okta_1_new_app.png METASEP

source/images/okta_14_mattermost_login_button.png METASEP

source/images/okta_13_mattermost_attributes.png METASEP

source/images/okta_12_mattermost_encryption.png METASEP

source/images/okta_11_mattermost_verification.png METASEP

source/images/okta_10_mattermost_basics.png METASEP

source/images/office_4_application_id.png METASEP

source/images/office_3_platform.png METASEP

source/images/office_2_generate_password.png METASEP

source/images/office_1_add_app.png METASEP

source/images/oauth2_regenerate_secret.png METASEP

source/images/oauth2_deauthorize_app.png METASEP

source/images/oauth2_confirmation_screen.png METASEP

source/images/oauth2_authorization_screen.png METASEP

source/images/oauth2_app_screen.png METASEP

source/images/nps-survey.png METASEP

source/images/nps-admin.png METASEP

source/images/notices_admin.png METASEP

source/images/notices.png METASEP

source/images/network_diagram.png METASEP

source/images/navigation.gif METASEP

source/images/myinsights_teaminsights.gif METASEP

source/images/mute-categories.gif METASEP

source/images/multi-team_support.png METASEP

source/images/multi-select-move.gif METASEP

source/images/multi-select-drag.gif METASEP

source/images/multi-language_support.png METASEP

source/images/multi-factor-authentication.png METASEP

source/images/more-actions.png METASEP

source/images/mobileiron_step9.png METASEP

source/images/mobileiron_step8.png METASEP

source/images/mobileiron_step7.png METASEP

source/images/mobileiron_step6.png METASEP

source/images/mobileiron_step4.png METASEP

source/images/mobileiron_step2.png METASEP

source/images/mobileiron_step10.png METASEP

source/images/mobile_push_send_when.png METASEP

source/images/mobile_push_send_for.png METASEP

source/images/mobile_push_prompt.png METASEP

source/images/mobile_push_contents.png METASEP

source/images/mobile_notification_settings.png METASEP

source/images/mobile_manual_mpns.png METASEP

source/images/mobile_hpns.png METASEP

source/images/mobile_apps.png METASEP

source/images/mobile_SDK_Tools.png METASEP

source/images/mobile_SDK_Platforms.png METASEP

source/images/mobile-pre-proxy-relay.png METASEP

source/images/mobile-post-proxy-relay.png METASEP

source/images/messaging.png METASEP

source/images/messagesTable1.png METASEP

source/images/message-navigation.gif METASEP

source/images/message-more.png METASEP

source/images/message-menus.png METASEP

source/images/message-formatting-toolbar.png METASEP

source/images/message-formatting-toolbar.gif METASEP

source/images/message-actions.png METASEP

source/images/mattermost_system_server_start_time.png METASEP

source/images/mattermost_dynamic_range_annotation.png METASEP

source/images/mattermost_datasource.png METASEP

source/images/mattermost_admin_advisor_bot.png METASEP

source/images/mattermost_admin_advisor_banner.png METASEP

source/images/mattermost_active_jobs_chart.png METASEP

source/images/markdownTable1.png METASEP

source/images/markdownMath.png METASEP

source/images/mark-message-as-unread.png METASEP

source/images/manage-user-groups.png METASEP

source/images/manage-sidebar-expand.gif METASEP

source/images/macosemojiskintones.png METASEP

source/images/mac-desktop-app-settings.png METASEP

source/images/lock-outline_F0341.svg METASEP
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M18,20v-9H6v9H18 M18,9c1.1,0,2,0.9,2,2v9c0,1.1-0.9,2-2,2H6c-1.1,0-2-0.9-2-2v-9c0-1.1,0.9-2,2-2h1V7c0-2.8,2.2-5,5-5
	s5,2.2,5,5v2H18 M12,4c-1.7,0-3,1.3-3,3v2h6V7C15,5.3,13.7,4,12,4z"/></svg>
source/images/lock-icon.png METASEP

source/images/link-variant_F0339.svg METASEP
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M10.59,13.41C11,13.8 11,14.44 10.59,14.83C10.2,15.22 9.56,15.22 9.17,14.83C7.22,12.88 7.22,9.71 9.17,7.76V7.76L12.71,4.22C14.66,2.27 17.83,2.27 19.78,4.22C21.73,6.17 21.73,9.34 19.78,11.29L18.29,12.78C18.3,11.96 18.17,11.14 17.89,10.36L18.36,9.88C19.54,8.71 19.54,6.81 18.36,5.64C17.19,4.46 15.29,4.46 14.12,5.64L10.59,9.17C9.41,10.34 9.41,12.24 10.59,13.41M13.41,9.17C13.8,8.78 14.44,8.78 14.83,9.17C16.78,11.12 16.78,14.29 14.83,16.24V16.24L11.29,19.78C9.34,21.73 6.17,21.73 4.22,19.78C2.27,17.83 2.27,14.66 4.22,12.71L5.71,11.22C5.7,12.04 5.83,12.86 6.11,13.65L5.64,14.12C4.46,15.29 4.46,17.19 5.64,18.36C6.81,19.54 8.71,19.54 9.88,18.36L13.41,14.83C14.59,13.66 14.59,11.76 13.41,10.59C13,10.2 13,9.56 13.41,9.17Z" /></svg>
source/images/legal_and_support_settings.png METASEP

source/images/leave-channels.png METASEP

source/images/ldap-sync-table.png METASEP

source/images/latex-inline.png METASEP

source/images/latex-codeblock.png METASEP

source/images/keycloak_9_export_metadata.png METASEP

source/images/keycloak_8_mattermost_attributes.png METASEP

source/images/keycloak_7_mattermost_request_signing.png METASEP

source/images/keycloak_6_mattermost_encryption.png METASEP

source/images/keycloak_5_mattermost_config.png METASEP

source/images/keycloak_4_create_username_attribute.png METASEP

source/images/keycloak_3_add_builtins.png METASEP

source/images/keycloak_2_saml_keys.png METASEP

source/images/keycloak_1_client_settings.png METASEP

source/images/keycloak_10_get_metadata.png METASEP

source/images/jump-to-message.png METASEP

source/images/join-team.png METASEP

source/images/join-channels.png METASEP

source/images/jira_webhook-configuration.png METASEP

source/images/jira_system_console.png METASEP

source/images/jira_sample.png METASEP

source/images/jira_administration_menu.png METASEP

source/images/interactive_message.gif METASEP

source/images/interactive-messages.png METASEP

source/images/interactive-dialog-text.png METASEP

source/images/interactive-dialog-select.png METASEP

source/images/interactive-dialog-select-menu.png METASEP

source/images/interactive-dialog-radio.png METASEP

source/images/interactive-dialog-example.png METASEP

source/images/interactive-dialog-error.png METASEP

source/images/interactive-dialog-complete-example.png METASEP

source/images/interactive-dialog-bool.png METASEP

source/images/install_nginx_welcome.png METASEP

source/images/inputField2.png METASEP

source/images/inputField1.png METASEP

source/images/inputBehaviour3.png METASEP

source/images/inputBehaviour2.png METASEP

source/images/inputBehaviour1.png METASEP

source/images/information-outline_F02FD.svg METASEP
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M11,9H13V7H11M12,20C7.59,20 4,16.41 4,12C4,7.59 7.59,4 12,4C16.41,4 20,7.59 20,12C20,16.41 16.41,20 12,20M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M11,17H13V11H11V17Z" /></svg>
source/images/incoming_webhooks_sample.png METASEP

source/images/incoming_webhooks_override_username.png METASEP

source/images/incoming_webhooks_markdown_formatting.png METASEP

source/images/incoming_webhooks_full_example.png METASEP

source/images/incoming_webhooks_create_simple.png METASEP

source/images/incident-response-app-transitions.png METASEP

source/images/incident-response-app-statistics.png METASEP

source/images/incident-response-app-post-action.png METASEP

source/images/incident-response-app-intro-image.png METASEP

source/images/incident-response-app-intro-image-fullpage.png METASEP

source/images/incident-response-app-fields.png METASEP

source/images/incident-overview.png METASEP

source/images/image-proxy.png METASEP

source/images/icon-76x76.png METASEP

source/images/icon-50x76.png METASEP

source/images/header2.png METASEP

source/images/header1.png METASEP

source/images/group.png METASEP

source/images/google_enable_api.png METASEP

source/images/google_authorised_domains.png METASEP

source/images/google_5_client_id_secret.png METASEP

source/images/google_4_web_app.png METASEP

source/images/google_3_oauth_consent_screen.png METASEP

source/images/google_3_oauth_client_id.png METASEP

source/images/google_2_oauth_consent_screen.png METASEP

source/images/google_1_credentials.png METASEP

source/images/google-sso-web-app-name.png METASEP

source/images/google-sso-redirect-uri.png METASEP

source/images/google-sso-credentials.png METASEP

source/images/globe_E805.svg METASEP
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M12,2C6.5,2,2,6.5,2,12s4.5,10,10,10s10-4.5,10-10S17.5,2,12,2z M20,12.5c-0.3,0.4-1.7,1.2-4,1.6c0-0.7,0-1.4,0-2.1
	c0-0.5,0-0.9,0-1.3c1.2-0.2,2.4-0.5,3.3-0.9c0.1-0.1,0.3-0.1,0.4-0.2c0.2,0.7,0.3,1.6,0.3,2.4C20,12.2,20,12.3,20,12.5L20,12.5z
	 M10.5,16.4c0.5,0,1,0.1,1.5,0.1s1,0,1.5-0.1c-0.5,2-1.1,3.2-1.5,3.5C11.6,19.6,10.9,18.4,10.5,16.4z M12,14.5c-0.7,0-1.3,0-1.9-0.1
	c0-0.7-0.1-1.5-0.1-2.4c0-0.4,0-0.7,0-1.1c0.7,0.1,1.3,0.1,2,0.1s1.3,0,2-0.1c0,0.4,0,0.7,0,1.1c0,0.9-0.1,1.7-0.1,2.4
	C13.3,14.5,12.7,14.5,12,14.5z M13.8,8.9C13.2,9,12.6,9,12,9s-1.2,0-1.8-0.1C10.6,6.1,11.5,4.4,12,4C12.5,4.4,13.4,6.1,13.8,8.9z
	 M18.8,7.8c-0.7,0.3-1.7,0.7-3,0.9c-0.2-1.6-0.6-3.1-1.1-4.2C16.4,5.1,17.8,6.2,18.8,7.8z M5.2,7.8c1-1.5,2.4-2.7,4.2-3.3
	C8.9,5.6,8.5,7,8.2,8.7C6.9,8.4,5.9,8.1,5.2,7.8L5.2,7.8z M4.4,9.6c0.1,0.1,0.2,0.1,0.4,0.2c0.9,0.4,2,0.7,3.3,0.9
	C8,11.1,8,11.5,8,12c0,0.7,0,1.4,0.1,2.1c-2.3-0.4-3.7-1.2-4-1.6l0,0c0-0.2,0-0.3,0-0.5C4,11.2,4.1,10.3,4.4,9.6z M4.7,15.2
	c1,0.4,2.3,0.8,3.7,1c0.2,1.3,0.6,2.4,1,3.3C7.3,18.8,5.6,17.2,4.7,15.2z M19.3,15.2c-0.9,2-2.6,3.6-4.7,4.3c0.4-0.9,0.8-2,1-3.3
	C17,16,18.3,15.7,19.3,15.2L19.3,15.2z"/></svg>
source/images/globe-icon.png METASEP

source/images/gitlabTable.png METASEP

source/images/github-mark-20px.png METASEP

source/images/gear-icon.png METASEP

source/images/fx-guidelines-visual-gaps.png METASEP

source/images/fx-guidelines-sufficient-whitespace.png METASEP

source/images/fx-guidelines-read-outloud.png METASEP

source/images/fx-guidelines-even-whitespace.png METASEP

source/images/format-strikethrough-variant_F0281.svg METASEP
<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24" viewBox="0 0 24 24" width="24"><g><rect fill="none" height="24" width="24"/></g><g><g><g><path d="M6.85,7.08C6.85,4.37,9.45,3,12.24,3c1.64,0,3,0.49,3.9,1.28c0.77,0.65,1.46,1.73,1.46,3.24h-3.01 c0-0.31-0.05-0.59-0.15-0.85c-0.29-0.86-1.2-1.28-2.25-1.28c-1.86,0-2.34,1.02-2.34,1.7c0,0.48,0.25,0.88,0.74,1.21 C10.97,8.55,11.36,8.78,12,9H7.39C7.18,8.66,6.85,8.11,6.85,7.08z M21,12v-2H3v2h9.62c1.15,0.45,1.96,0.75,1.96,1.97 c0,1-0.81,1.67-2.28,1.67c-1.54,0-2.93-0.54-2.93-2.51H6.4c0,0.55,0.08,1.13,0.24,1.58c0.81,2.29,3.29,3.3,5.67,3.3 c2.27,0,5.3-0.89,5.3-4.05c0-0.3-0.01-1.16-0.48-1.94H21V12z"/></g></g></g></svg>
source/images/format-quote-open_F0757.svg METASEP
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M10,7L8,11H11V17H5V11L7,7H10M18,7L16,11H19V17H13V11L15,7H18Z" /></svg>
source/images/format-list-numbered_F027B.svg METASEP
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M7,13V11H21V13H7M7,19V17H21V19H7M7,7V5H21V7H7M3,8V5H2V4H4V8H3M2,17V16H5V20H2V19H4V18.5H3V17.5H4V17H2M4.25,10A0.75,0.75 0 0,1 5,10.75C5,10.95 4.92,11.14 4.79,11.27L3.12,13H5V14H2V13.08L4,11H2V10H4.25Z" /></svg>
source/images/format-list-bulleted_F0279.svg METASEP
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M7,5H21V7H7V5M7,13V11H21V13H7M4,4.5A1.5,1.5 0 0,1 5.5,6A1.5,1.5 0 0,1 4,7.5A1.5,1.5 0 0,1 2.5,6A1.5,1.5 0 0,1 4,4.5M4,10.5A1.5,1.5 0 0,1 5.5,12A1.5,1.5 0 0,1 4,13.5A1.5,1.5 0 0,1 2.5,12A1.5,1.5 0 0,1 4,10.5M7,19V17H21V19H7M4,16.5A1.5,1.5 0 0,1 5.5,18A1.5,1.5 0 0,1 4,19.5A1.5,1.5 0 0,1 2.5,18A1.5,1.5 0 0,1 4,16.5Z" /></svg>
source/images/format-letter-case_F0B34.svg METASEP
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M20.06,18C20,17.83 19.91,17.54 19.86,17.11C19.19,17.81 18.38,18.16 17.45,18.16C16.62,18.16 15.93,17.92 15.4,17.45C14.87,17 14.6,16.39 14.6,15.66C14.6,14.78 14.93,14.1 15.6,13.61C16.27,13.12 17.21,12.88 18.43,12.88H19.83V12.24C19.83,11.75 19.68,11.36 19.38,11.07C19.08,10.78 18.63,10.64 18.05,10.64C17.53,10.64 17.1,10.76 16.75,11C16.4,11.25 16.23,11.54 16.23,11.89H14.77C14.77,11.46 14.92,11.05 15.22,10.65C15.5,10.25 15.93,9.94 16.44,9.71C16.95,9.5 17.5,9.36 18.13,9.36C19.11,9.36 19.87,9.6 20.42,10.09C20.97,10.58 21.26,11.25 21.28,12.11V16C21.28,16.8 21.38,17.42 21.58,17.88V18H20.06M17.66,16.88C18.11,16.88 18.54,16.77 18.95,16.56C19.35,16.35 19.65,16.07 19.83,15.73V14.16H18.7C16.93,14.16 16.04,14.63 16.04,15.57C16.04,16 16.19,16.3 16.5,16.53C16.8,16.76 17.18,16.88 17.66,16.88M5.46,13.71H9.53L7.5,8.29L5.46,13.71M6.64,6H8.36L13.07,18H11.14L10.17,15.43H4.82L3.86,18H1.93L6.64,6Z" /></svg>
source/images/format-italic_F0277.svg METASEP
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M10 4v3h2.21l-3.42 8H6v3h8v-3h-2.21l3.42-8H18V4z"/></svg>
source/images/format-header_E81D.svg METASEP
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M7,4h2v6h6V4h2v14h-2v-6H9v6H7V4"/></svg>

source/images/format-bold_F0264.svg METASEP
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M15.6 10.79c.97-.67 1.65-1.77 1.65-2.79 0-2.26-1.75-4-4-4H7v14h7.04c2.09 0 3.71-1.7 3.71-3.79 0-1.52-.86-2.82-2.15-3.42zM10 6.5h3c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5h-3v-3zm3.5 9H10v-3h3.5c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5z"/></svg>
source/images/focus.png METASEP

source/images/flaglist.png METASEP

source/images/flagicon.png METASEP

source/images/flag.png METASEP

source/images/file_sharing.png METASEP

source/images/file-search-filter.png METASEP

source/images/favorites-list-sidebar.png METASEP

source/images/favorite_channels_sidebar.png METASEP

source/images/favorite_channels_desktop.png METASEP

source/images/favorite-channel-desktop.png METASEP

source/images/eye-outline_F06D0.svg METASEP
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M12,9A3,3 0 0,1 15,12A3,3 0 0,1 12,15A3,3 0 0,1 9,12A3,3 0 0,1 12,9M12,4.5C17,4.5 21.27,7.61 23,12C21.27,16.39 17,19.5 12,19.5C7,19.5 2.73,16.39 1,12C2.73,7.61 7,4.5 12,4.5M3.18,12C4.83,15.36 8.24,17.5 12,17.5C15.76,17.5 19.17,15.36 20.82,12C19.17,8.64 15.76,6.5 12,6.5C8.24,6.5 4.83,8.64 3.18,12Z" /></svg>
source/images/expand-sidebar.png METASEP

source/images/esr.graphic.2.png METASEP

source/images/esr-graphic.png METASEP

source/images/error2.png METASEP

source/images/error1.png METASEP

source/images/enterprise_search.png METASEP

source/images/enterprise_edition_support.png METASEP

source/images/enterprise-badge.png METASEP

source/images/emoticon-outline_F01F2.svg METASEP
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M12,17.5C14.33,17.5 16.3,16.04 17.11,14H6.89C7.69,16.04 9.67,17.5 12,17.5M8.5,11A1.5,1.5 0 0,0 10,9.5A1.5,1.5 0 0,0 8.5,8A1.5,1.5 0 0,0 7,9.5A1.5,1.5 0 0,0 8.5,11M15.5,11A1.5,1.5 0 0,0 17,9.5A1.5,1.5 0 0,0 15.5,8A1.5,1.5 0 0,0 14,9.5A1.5,1.5 0 0,0 15.5,11M12,20A8,8 0 0,1 4,12A8,8 0 0,1 12,4A8,8 0 0,1 20,12A8,8 0 0,1 12,20M12,2C6.47,2 2,6.5 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z" /></svg>
source/images/emojiautocomplete.png METASEP

source/images/emoji-skin-tone.png METASEP

source/images/email_notification_chart.png METASEP

source/images/email_notification.png METASEP

source/images/edit-viewer-system-admin-role.png METASEP

source/images/edit-team-icon.png METASEP

source/images/edit-custom-group.png METASEP

source/images/download-outline_F0B8F.svg METASEP
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M19,18H5v2h14V18z M11,2h2v10.2l4.5-4.5l1.4,1.4L12,16L5.1,9.1l1.4-1.4l4.5,4.5V2z"/></svg>

source/images/dots-vertical_F01D9.svg METASEP
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M12,16A2,2 0 0,1 14,18A2,2 0 0,1 12,20A2,2 0 0,1 10,18A2,2 0 0,1 12,16M12,10A2,2 0 0,1 14,12A2,2 0 0,1 12,14A2,2 0 0,1 10,12A2,2 0 0,1 12,10M12,4A2,2 0 0,1 14,6A2,2 0 0,1 12,8A2,2 0 0,1 10,6A2,2 0 0,1 12,4Z" /></svg>
source/images/dots-horizontal_F01D8.svg METASEP
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M16,12A2,2 0 0,1 18,10A2,2 0 0,1 20,12A2,2 0 0,1 18,14A2,2 0 0,1 16,12M10,12A2,2 0 0,1 12,10A2,2 0 0,1 14,12A2,2 0 0,1 12,14A2,2 0 0,1 10,12M4,12A2,2 0 0,1 6,10A2,2 0 0,1 8,12A2,2 0 0,1 6,14A2,2 0 0,1 4,12Z" /></svg>
source/images/documentationTable.png METASEP

source/images/dm-display.gif METASEP

source/images/developer-toolkit-map.png METASEP

source/images/developer-toolkit-jira.png METASEP

source/images/developer-toolkit-appcenter.png METASEP

source/images/desktop_notification_chart.png METASEP

source/images/desktop_notification.png METASEP

source/images/desktop_apps.png METASEP

source/images/desktop.png METASEP

source/images/desktop-server-add2.png METASEP

source/images/desktop-server-add.png METASEP

source/images/desktop-remove-server.png METASEP

source/images/desktop-edit-server.png METASEP

source/images/desktop-app-settings.jpg METASEP

source/images/delete_custom_emoji.png METASEP

source/images/deep_linking.png METASEP

source/images/data_retention.png METASEP

source/images/custom_emojis.png METASEP

source/images/custom_branding.png METASEP

source/images/custom-status-expiry.png METASEP

source/images/custom-branding-tools.png METASEP

source/images/crt-thread-view.png METASEP

source/images/crt-thread-view.jpg METASEP

source/images/crt-new-unread-threads.png METASEP

source/images/crt-new-unread-threads.jpg METASEP

source/images/crt-new-unread-threads.gif METASEP

source/images/crt-more-actions.png METASEP

source/images/crt-following-thread.png METASEP

source/images/crt-following-thread.jpg METASEP

source/images/create-new-channel.png METASEP

source/images/create-google-sso-credentials.png METASEP

source/images/convert-public-channel-to-private.png METASEP

source/images/confirm2.jpg METASEP

source/images/confirm1.jpg METASEP

source/images/compliance_reports.png METASEP

source/images/collapsed-reply-threads.gif METASEP

source/images/collapse-sidebar.png METASEP

source/images/code-tags_F0174.svg METASEP
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M14.6,16.6L19.2,12L14.6,7.4L16,6L22,12L16,18L14.6,16.6M9.4,16.6L4.8,12L9.4,7.4L8,6L2,12L8,18L9.4,16.6Z" /></svg>
source/images/cloud-badge.png METASEP

source/images/clear-custom-status.png METASEP

source/images/choices2.png METASEP

source/images/choices1.png METASEP

source/images/checklist.png METASEP

source/images/channel_sidebar_updates.gif METASEP

source/images/channel-sidebar-navigation.gif METASEP

source/images/channel-purpose.png METASEP

source/images/channel-preferences.png METASEP

source/images/channel-info.png METASEP

source/images/channel-heading-categories.png METASEP

source/images/channel-header.png METASEP

source/images/channel-files-icon.png METASEP

source/images/calls-deployment-kubernetes.png METASEP

source/images/calls-deployment-image7.png METASEP

source/images/calls-deployment-image5.png METASEP

source/images/calls-deployment-image4.png METASEP

source/images/calls-deployment-image3.png METASEP

source/images/calls-deployment-image2.png METASEP

source/images/calls-deployment-image1.png METASEP

source/images/calendar2.png METASEP

source/images/buttonPlacement3.png METASEP

source/images/buttonPlacement2.png METASEP

source/images/buttonPlacement1.png METASEP

source/images/buttonDesign.png METASEP

source/images/browser_notification.png METASEP

source/images/browse-channels.png METASEP

source/images/bold_italics.png METASEP

source/images/boards-whats-new-10.png METASEP

source/images/boards-whats-new-09.png METASEP

source/images/boards-whats-new-08.png METASEP

source/images/boards-whats-new-07.png METASEP

source/images/boards-whats-new-06.png METASEP

source/images/boards-whats-new-05.png METASEP

source/images/boards-whats-new-04.png METASEP

source/images/boards-whats-new-03.png METASEP

source/images/boards-whats-new-02.png METASEP

source/images/boards-whats-new-01.png METASEP

source/images/blockQuotes.png METASEP

source/images/blackberry_step5b2.png METASEP

source/images/blackberry_step5b1.png METASEP

source/images/blackberry_step5a2.png METASEP

source/images/blackberry_step5a1.png METASEP

source/images/blackberry_step4.png METASEP

source/images/blackberry_step3.png METASEP

source/images/blackberry_step2.png METASEP

source/images/avatar-online-status-218x247.png METASEP

source/images/attachments-titles.png METASEP

source/images/attachments-thumb.png METASEP

source/images/attachments-text.png METASEP

source/images/attachments-pretext.png METASEP

source/images/attachments-image.png METASEP

source/images/attachments-footer.png METASEP

source/images/attachments-fields.png METASEP

source/images/attachments-example.png METASEP

source/images/attachments-color.png METASEP

source/images/attachments-author.png METASEP

source/images/attachment-icon.png METASEP

source/images/assign-people-to-system-role.png METASEP

source/images/asset-guidelines-wavy-lines.png METASEP

source/images/asset-guidelines-visible-gaps.png METASEP

source/images/asset-guidelines-no-logo.png METASEP

source/images/asset-guidelines-gitter-incorrect.png METASEP

source/images/asset-guidelines-gitter-correct.png METASEP

source/images/architecture_with_proxy.png METASEP

source/images/architecture_with_protocol.png METASEP

source/images/architecture_high_availability.png METASEP

source/images/architecture_basics.png METASEP

source/images/apps_F003B.svg METASEP
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M3 11H11V3H3M5 5H9V9H5M13 21H21V13H13M15 15H19V19H15M3 21H11V13H3M5 15H9V19H5M13 3V11H21V3M19 9H15V5H19Z" /></svg>

source/images/app-bar.png METASEP

source/images/announcement-banner.png METASEP

source/images/announcement-banner-1106x272.png METASEP

source/images/all-plans-badge.png METASEP

source/images/align5.jpg METASEP

source/images/align4.png METASEP

source/images/align3.jpg METASEP

source/images/align2.png METASEP

source/images/align1.jpg METASEP

source/images/advanced_permissions.png METASEP

source/images/adfs_9_configure_identifiers.png METASEP

source/images/adfs_8_configure_url.png METASEP

source/images/adfs_7_configure_certificate_encryption.png METASEP

source/images/adfs_6_configure_certificate_default.png METASEP

source/images/adfs_5_choose_profile.png METASEP

source/images/adfs_4_specify_display_name.png METASEP

source/images/adfs_3_select_data_source.png METASEP

source/images/adfs_2_start_wizard.png METASEP

source/images/adfs_26_mattermost_login_button.png METASEP

source/images/adfs_25_mattermost_attributes.png METASEP

source/images/adfs_24_mattermost_encryption.png METASEP

source/images/adfs_23_mattermost_verification.png METASEP

source/images/adfs_22_mattermost_basics.png METASEP

source/images/adfs_21_export_idp_cert_wizard.png METASEP

source/images/adfs_21-3_export_idp_cert_wizard.png METASEP

source/images/adfs_21-2_export_idp_cert_wizard.png METASEP

source/images/adfs_20_export_idp_cert_copy.png METASEP

source/images/adfs_1_add_new_relying_party_trust.png METASEP

source/images/adfs_19_export_idp_cert_start.png METASEP

source/images/adfs_18_configure_incoming_claim.png METASEP

source/images/adfs_17_transformation_of_incoming_claim.png METASEP

source/images/adfs_16_configure_claim_rule.png METASEP

source/images/adfs_15_choose_rule_type.png METASEP

source/images/adfs_14_claim_rules_editor.png METASEP

source/images/adfs_13_finish_trust.png METASEP

source/images/adfs_12_ready_to_add_trust.png METASEP

source/images/adfs_11_authorization.png METASEP

source/images/adfs_10_configure_mfa.png METASEP

source/images/add_members_pop.png METASEP

source/images/add_members.png METASEP

source/images/add_custom_emoji.png METASEP

source/images/add-mfa-to-account.png METASEP

source/images/add-member-to-channel.png METASEP

source/images/add-member-pop.png METASEP

source/images/access_tokens_additional_roles.png METASEP

source/images/access_token_settings.png METASEP

source/images/access_token_manage_roles.png METASEP

source/images/access_token_enable.png METASEP

source/images/access-user-groups.png METASEP

source/images/WindowsDark.png METASEP

source/images/Team_Channel_Membership_Sync.png METASEP

source/images/Steve-jobs-screenshot.png METASEP

source/images/SolarizedDark.png METASEP

source/images/Site_Statistics.png METASEP

source/images/Sapphire.png METASEP

source/images/SSO-SAML-ADFS_export-id-provider-cert_007.png METASEP

source/images/SSO-SAML-ADFS_export-id-provider-cert_006.png METASEP

source/images/SSO-SAML-ADFS_export-id-provider-cert_005.png METASEP

source/images/SSO-SAML-ADFS_export-id-provider-cert_004.png METASEP

source/images/SSO-SAML-ADFS_export-id-provider-cert_003.png METASEP

source/images/SSO-SAML-ADFS_export-id-provider-cert_002.png METASEP

source/images/SSO-SAML-ADFS_export-id-provider-cert_001.png METASEP

source/images/SSO-SAML-ADFS_create-claim-rules_006.png METASEP

source/images/SSO-SAML-ADFS_create-claim-rules_005.png METASEP

source/images/SSO-SAML-ADFS_create-claim-rules_004.png METASEP

source/images/SSO-SAML-ADFS_create-claim-rules_003.png METASEP

source/images/SSO-SAML-ADFS_create-claim-rules_002.png METASEP

source/images/SSO-SAML-ADFS_create-claim-rules_001.png METASEP

source/images/SSO-SAML-ADFS_configure-saml_004.png METASEP

source/images/SSO-SAML-ADFS_configure-saml_003.png METASEP

source/images/SSO-SAML-ADFS_configure-saml_002.png METASEP

source/images/SSO-SAML-ADFS_configure-saml_001.png METASEP

source/images/SSO-SAML-ADFS_add-new-relying-party-trust_011.png METASEP

source/images/SSO-SAML-ADFS_add-new-relying-party-trust_010.png METASEP

source/images/SSO-SAML-ADFS_add-new-relying-party-trust_009.png METASEP

source/images/SSO-SAML-ADFS_add-new-relying-party-trust_008.png METASEP

source/images/SSO-SAML-ADFS_add-new-relying-party-trust_007.png METASEP

source/images/SSO-SAML-ADFS_add-new-relying-party-trust_006.png METASEP

source/images/SSO-SAML-ADFS_add-new-relying-party-trust_005.png METASEP

source/images/SSO-SAML-ADFS_add-new-relying-party-trust_004.png METASEP

source/images/SSO-SAML-ADFS_add-new-relying-party-trust_003.png METASEP

source/images/SSO-SAML-ADFS_add-new-relying-party-trust_002.png METASEP

source/images/SSO-SAML-ADFS_add-new-relying-party-trust_001.png METASEP

source/images/SSO-SAML-ADFS_add-new-relying-party-trust_000.png METASEP

source/images/SAML_based_SSO.png METASEP

source/images/Retro.gif METASEP

source/images/Quartz.png METASEP

source/images/Playbooks_Hero.png METASEP

source/images/Playbook-keyword-monitoring.png METASEP

source/images/Playbook-dashboard.png METASEP

source/images/Organization.png METASEP

source/images/Onyx.png METASEP

source/images/OneDark.png METASEP

source/images/OAuth20Deprecated.png METASEP

source/images/NightOwlDark.png METASEP

source/images/Monokai.png METASEP

source/images/MattermostDeployment5kaws.png METASEP

source/images/MattermostDeployment5kUsers.png METASEP

source/images/MattermostDeployment50kaws.png METASEP

source/images/MattermostDeployment25kaws.png METASEP

source/images/MattermostDeployment25kUsers.png METASEP

source/images/MattermostDeployment10kaws.png METASEP

source/images/MattermostDeployment10kUsers.png METASEP

source/images/MattermostDark.png METASEP

source/images/Mattermost.png METASEP

source/images/MFA.png METASEP

source/images/LinkFailed.png METASEP

source/images/LDAP-assign-roles.png METASEP

source/images/Indigo.png METASEP

source/images/IC-ad-hoc-tasks.gif METASEP

source/images/IC-access-control.gif METASEP

source/images/Headings2.png METASEP

source/images/Headings1.png METASEP

source/images/Guest_Invite_Screen.png METASEP

source/images/Guest_Badges.png METASEP

source/images/GruvboxDark.png METASEP

source/images/Groups_listing.png METASEP

source/images/Group_filter.png METASEP

source/images/Group_Members.png METASEP

source/images/Group_Group_Member_Sync.png METASEP

source/images/Group_Configuration.png METASEP

source/images/GitHub.png METASEP

source/images/Emoji1.png METASEP

source/images/ESR20214.png METASEP

source/images/ESR20213.png METASEP

source/images/ESR20212.png METASEP

source/images/ESR2021.png METASEP

source/images/DiscordDarkTheme.png METASEP

source/images/Denim.png METASEP

source/images/DatabasewithVIPs.png METASEP

source/images/Customer_Portal_Subscriptions.png METASEP

source/images/Custom-Status-Marketing-Animation.gif METASEP

source/images/Create_private_channel.png METASEP

source/images/Convert-to-OpenID-Connect.png METASEP

source/images/Channels_Hero.png METASEP

source/images/Boards_Hero.png METASEP

source/images/AzureApp_SetupMenuv2.png METASEP

source/images/AzureApp_SetupMenu.png METASEP

source/images/AzureApp_New_Registration.png METASEP

source/images/AzureApp_Copy_Secret.png METASEP

source/images/AzureApp_Copy_Client_ID.png METASEP

source/images/AzureApp_Client_Secret_Expiry.png METASEP

source/images/AzureApp_App_Directory_IDsv2.png METASEP

source/images/AzureApp_App_Directory_IDs.png METASEP

source/images/Add_Team_Or_Channel.png METASEP

source/images/AD_LDAP_SSO.png METASEP

source/guides/welcome-to-mattermost.rst METASEP
Welcome to Mattermost
=====================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Whether it's your first day as a Mattermost user, or you're upgrading from an older Mattermost version, we recommend starting here to learn how to access and customize your workspace, familiarize yourself with the concept of teams and user roles, and learn how to get started with Channels, Boards, and Playbooks.

Access your Mattermost workspace
--------------------------------

.. toctree::
   :maxdepth: 1
   :hidden:

   Log in to Mattermost </welcome/log-in>
   Keyboard shortcuts </welcome/keyboard-shortcuts>
   Log out of Mattermost </welcome/log-out>

* :doc:`Log in to Mattermost </welcome/log-in>` - Log in to a Mattermost workspace to connect with your teammates. 
* :doc:`Keyboard shortcuts </welcome/keyboard-shortcuts>` - Learn keyboard shortcuts for Mattermost product navigation and accessibility.
* :doc:`Log out of Mattermost </welcome/log-out>` - Log out of all of your teams on the server.

Mattermost basics
-----------------

.. toctree::
   :maxdepth: 1
   :hidden:

   Get started with Mattermost Channels </welcome/get-started-mattermost-channels>
   Get started with Mattermost Playbooks </playbooks/get-started-with-playbooks>
   Get started with Mattermost Boards </boards/get-started-with-boards>
   Manage custom groups </welcome/manage-custom-groups>
   About teams </welcome/about-teams>
   Team settings </welcome/team-settings>
   Team keyboard shortcuts </welcome/team-keyboard-shortcuts>
   About user roles </welcome/about-user-roles>
   About insights </welcome/insights>

* :doc:`Get started with Mattermost Channels </welcome/get-started-mattermost-channels>` - Learn how to communicate and collaborate with your team using Mattermost Channels.
* :doc:`Get started with Mattermost Playbooks </playbooks/get-started-with-playbooks>` - Learn how to create and refine repeatable, measurable workflows for a range of scenarios using Mattermost Playbooks.
* :doc:`Get started with Mattermost Boards </boards/get-started-with-boards>` - Learn how to create and manage projects using customizable cards to increase your team's productivity using Mattermost Boards.
* :doc:`Manage custom groups </welcome/manage-custom-groups>` - Learn how to define custom groups of users, such as a team or department, you can @mention in Mattermost.  
* :doc:`About teams </welcome/about-teams>` - Learn about the digital workspaces where you and your teammates collaborate together in Mattermost.
* :doc:`Team settings </welcome/team-settings>` - Configure team names, descriptions, icons, and invitation settings.
* :doc:`Team keyboard shortcuts </welcome/team-keyboard-shortcuts>` Make more efficient use of your keyboard with keyboard shortcuts.
* :doc:`About user roles </welcome/about-user-roles>` - Learn more about the six types of user roles and their permissions in Mattermost.
* :doc:`Insights </welcome/insights>` - Get insights into the most important events happening on each team within your Mattermost workspace.

Customize your Mattermost experience
------------------------------------
   
.. toctree::
   :maxdepth: 1
   :hidden:

   Manage your Mattermost profile </welcome/manage-your-profile>
   Set your status and availability </welcome/set-your-status-availability>
   Customize your Mattermost theme </welcome/customize-your-theme>
   Customize your Desktop App experience </welcome/customize-desktop-app-experience>
   Manage Desktop App server connections </welcome/manage-desktop-app-server-connections>

* :doc:`Manage your Mattermost profile </welcome/manage-your-profile>` - Configure your Mattermost profile and security preferences.
* :doc:`Set your status and availability </welcome/set-your-status-availability>` - Let your team know whether you're available.
* :doc:`Customize your Mattermost theme </welcome/customize-your-theme>` - Customize your Mattermost user interface to suit your preferences. 
* :doc:`Customize your Desktop App experience </welcome/customize-desktop-app-experience>` - Learn about additional options in the Desktop App you can customize.
* :doc:`Manage Desktop App server connections </welcome/manage-desktop-app-server-connections>` - Learn how to connect to multiple Mattermost servers using the Mattermost Desktop App. 

Mattermost interface changes
----------------------------

Upgrading from an older version of Mattermost? Learn what's changed or moved in your new release.

.. toctree::
   :maxdepth: 1
   :hidden:

   What changed in Mattermost v7.0? </welcome/what-changed-in-v70>
   What changed in Mattermost v6.0? </welcome/what-changed-in-v60>
   What changed in Mattermost Boards </welcome/whats-new-in-v72> 

* :doc:`What changed in Mattermost v7.0? </welcome/what-changed-in-v70>` - Learn more about how we've improved your Mattermost user experience from v7.0.
* :doc:`What changed in Mattermost v6.0? </welcome/what-changed-in-v60>` - Learn more about the ways we've improved your Mattermost navigation experience from v6.0.
* :doc:`What changed in Mattermost Boards </welcome/whats-new-in-v72>` - Learn more about the ways we've improved your Mattermost Boards experience from v7.2.

source/guides/playbooks.rst METASEP
Mattermost Playbooks
====================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Mattermost Playbooks are pre-built, configurable checklists that define a repeatable process for teams to achieve specific and predictable outcomes. With Playbooks, development teams can orchestrate prescribed workflows and define, streamline, and document complex, recurring operations. Playbooks help you stay in command with integrated communication, collaboration, and status dashboards to manage your entire workflow lifecycle.
    
.. image:: ../images/Playbooks_Hero.png
   :alt: An example of the Mattermost Playbooks screen that includes active run details in the right-hand pane.
   
This Mattermost Playbooks User Guide is for anyone who needs help using Mattermost workflow capabilities.

.. toctree::
   :hidden:

   Overview </playbooks/overview>
   Customize a playbook </playbooks/customize-a-playbook>
   Customize a run <playbooks/customize-a-run>
   Notifications and updates </playbooks/notifications-and-updates>
   Metrics and goals </playbooks/metrics-and-goals>
   Permissions </playbooks/playbook-permissions>
   Reuse and share playbooks </playbooks/reusing-and-sharing-playbooks>
   Interact with playbooks </playbooks/interact-with-playbooks>
   
* :doc:`Playbooks overview </playbooks/overview>` - Learn about Mattermost Playbooks features.
* :doc:`Customize a playbook </playbooks/customize-a-playbook>` - Customize a playbook for successful runs.
* :doc:`Customize a run </playbooks/customize-a-run>` - Edit triggers and actions in an active run.
* :doc:`Notifications and updates </playbooks/notifications-and-updates>` - Keep track of all your active runs and tasks.
* :doc:`Metrics and goals </playbooks/metrics-and-goals>` - Use retrospectives to improve your workflows and provide detailed insight into your Playbooks.
* :doc:`Permissions </playbooks/playbook-permissions>` - Configure and granulate access controls for playbooks.
* :doc:`Reuse and share playbooks </playbooks/reusing-and-sharing-playbooks>` - Reuse and share playbooks with your organization.
* :doc:`Interact with playbooks </playbooks/interact-with-playbooks>` - Interact with playbooks using slash commands and the REST API. 

source/guides/get-help.rst METASEP
Get help with Mattermost
=========================

Get the help you need with Mattermost via robust documentation, extensive community support, and professional support services. If you’re struggling with something on your Mattermost journey, take a look at the following resources:

- Web search: We have a diverse community spread across the internet, and web searches via your favorite search engine are often the quickest way to get answers.
- `Documentation: <https://docs.mattermost.com/>`__ Our comprehensive documentation site features information about deploying, managing, and using Mattermost.
- `Support Knowledge Base: <http://support.mattermost.com>`__ Get answers to frequently asked questions and common problems.
- `Community chat server: <https://community.mattermost.com/login>`__ Chat directly with the Mattermost community in chat channels tailored to share knowledge and expertise.
- `Forums: <https://forum.mattermost.org/>`__ Search past discussions for helpful information, or start your own thread.
- `Report an issue: <https://handbook.mattermost.com/contributors/contributors/ways-to-contribute#report-a-bug>`__ Report bugs or other issues you encounter when using Mattermost to our development team.
- `Propose a feature: <https://mattermost.uservoice.com/forums/306457-general>`__ Vote for feature proposals or submit your ideas.

Mattermost also offers `support services <https://mattermost.com/support/>`__ to our Enterprise customers, and Mattermost customers can make a `support request <https://support.mattermost.com/hc/en-us/requests/new>`__ to get help from our team.

source/guides/deployment.rst METASEP
Deploy Mattermost
=================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Learn how to install, deploy, and scale Mattermost for teams and organizations of any size.

Deploy Mattermost for production use
------------------------------------

When you're ready to install Mattermost server for production use, you have four options: deploy using Kubernetes, deploy from a compressed tarball, deploy using a Ubuntu option called Omnibus, or deploy using Docker.

Learn how to install, deploy, and scale Mattermost for teams and organizations of any size using one of four options: deploy using Kubernetes, deploy from a compressed tarball, deploy using a Ubuntu option called Omnibus, or deploy using Docker.

.. tip::

  * See the `configuration settings <https://docs.mattermost.com/configure/configuration-settings.html>`__ documentation to learn more about customizing your production deployment.
  
  * Encountering issues with your deployment? See the `Deployment Troubleshooting <https://docs.mattermost.com/install/troubleshooting.html#deployment-troubleshooting>`__ documentation for details.

.. tabs::

    .. tab:: Ubuntu/Debian

      .. include:: ../install/common-prod-deploy-omnibus.rst
        :start-after: :nosearch:
        
    .. tab:: Generic Linux (Tarball)

      .. include:: ../install/common-prod-deploy-tar.rst
        :start-after: :nosearch: 
        
    .. tab:: Kubernetes

      .. include:: ../install/common-prod-deploy-kubernetes.rst
        :start-after: :nosearch:
    
    .. tab:: Docker

      .. include:: ../install/common-prod-deploy-docker.rst
        :start-after: :nosearch:
    
Prepare for your Mattermost deployment
--------------------------------------

.. toctree::
    :maxdepth: 1
    :hidden:

    Preview Mattermost via Docker </install/install-docker>
    Administrator tasks </getting-started/admin-onboarding-tasks>
    Architecture </getting-started/architecture-overview>
    Implement Mattermost </getting-started/implementation-plan>
    Enterprise roll out checklist </getting-started/enterprise-roll-out-checklist>
    Welcome email template </getting-started/welcome-email-to-end-users>

These guides will help you prepare for your Mattermost deployment.

* `Preview Mattermost via Docker <https://docs.mattermost.com/install/install-docker.html#preview-mattermost-using-docker>`__ - Preview Mattermost instantly or deploy via Docker for production use.
* :doc:`Administrator tasks </getting-started/admin-onboarding-tasks>` - Learn about the standard configurations and settings you’ll encounter.
* :doc:`Architecture </getting-started/architecture-overview>` - Learn the basics of user authentication, notifications, data management services, network connectivity, and high availability.
* :doc:`Implement Mattermost </getting-started/implementation-plan>` - Get a detailed breakdown of the technical requirements to deploy Mattermost for your team or organization.
* :doc:`Enterprise roll out checklist </getting-started/enterprise-roll-out-checklist>` - Learn how to roll Mattermost out to thousands of users.
* :doc:`Welcome email template </getting-started/welcome-email-to-end-users>` - Use our sample email template when you’re ready to invite users to your server.

Install guides
--------------

The Mattermost server and client apps can run on all of the most popular platforms. Here’s a list of the most popular installation methods.

Server installation
^^^^^^^^^^^^^^^^^^^
.. toctree::
    :maxdepth: 1
    :hidden:

    Software and hardware requirements </install/software-hardware-requirements>
    Install Mattermost via Docker </install/install-docker>
    Mattermost Omnibus </install/installing-mattermost-omnibus>
    Install Mattermost from Tar </install/install-tar>
    Ubuntu 20.04 LTS </install/installing-ubuntu-2004-LTS>
    Kubernetes </install/install-kubernetes>
    About the Mattermost Kubernetes Operator </install/mattermost-kubernetes-operator>
    Debian Buster </install/install-debian>
    RHEL 8 </install/install-rhel-8>
    CentOS, Oracle Linux, and Scientific Linux </install/install-centos-oracle-scientific>

* :doc:`Software and hardware requirements </install/software-hardware-requirements>`
* :doc:`Deploy Mattermost on Docker </install/install-docker>`
* :doc:`Mattermost Omnibus </install/installing-mattermost-omnibus>`
* :doc:`Install Mattermost from Tar </install/install-tar>`
* :doc:`Ubuntu 20.04 LTS </install/installing-ubuntu-2004-LTS>`
* :doc:`Kubernetes </install/install-kubernetes>`
* :doc:`About the Mattermost Kubernetes Operator </install/mattermost-kubernetes-operator>`
* :doc:`Debian Buster </install/install-debian>`
* :doc:`RHEL 8 </install/install-rhel-8>`
* :doc:`CentOS, Oracle Linux, and Scientific Linux </install/install-centos-oracle-scientific>`
* `More server install guides <https://docs.mattermost.com/guides/deployment.html#other-resources>`__

Desktop and Mobile App installation
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

These guides will get you up and running with Mattermost desktop and mobile apps in minutes.

.. toctree::
    :maxdepth: 1
    :hidden:

    Desktop App install guides </install/desktop-app-install>
    iOS setup </install/install-ios-app>
    Android setup </install/install-android-app>
    Testing push notifications </deploy/mobile-testing-notifications>

* :doc:`Desktop App install guides </install/desktop-app-install>`
* :doc:`iOS setup </install/install-ios-app>`
* :doc:`Android setup </install/install-android-app>`
* :doc:`Testing push notifications </deploy/mobile-testing-notifications>`

Deployment guide
----------------

The deployment guide is for administrators who are ready to integrate Mattermost with their organization’s IT infrastructure. 

Server deployment
^^^^^^^^^^^^^^^^^
.. toctree::
    :titlesonly:
    :hidden:

    Deployment overview </deploy/deployment-overview>
    Set up a socket-based Mattermost database </install/setting-up-socket-based-mattermost-database>
    Image proxy </deploy/image-proxy>
    Backup and disaster recovery </deploy/backup-disaster-recovery>
    Encryption options </deploy/encryption-options>
    Configure transport encryption </install/transport-encryption>
    Bleve search </deploy/bleve-search>

* :doc:`Deployment overview </deploy/deployment-overview>` - Learn the basics of the Mattermost user experience, communication protocols, network access, data storage, and deployment options.
* :doc:`Set up a socket-based Mattermost database </install/setting-up-socket-based-mattermost-database>` - Connect your Mattermost server to your database service.
* :doc:`Image proxy </deploy/image-proxy>` - Setup and configure an image proxy to make loading images faster and more reliable and prevent pixel tracking.
* :doc:`Backup and disaster recovery </deploy/backup-disaster-recovery>` - Implement data backups, disaster recovery, and high availability deployment.
* :doc:`Encryption options </deploy/encryption-options>` - Setup encryption for data in transit and at rest.
* :doc:`Configure transport encryption </install/transport-encryption>` - Use transport encryption between Mattermost clusters and your proxy and database.
* :doc:`Bleve search </deploy/bleve-search>` - Use the Bleve search engine to provide Lucene-style full-text search.

Desktop and Mobile App deployment
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. toctree::
    :maxdepth: 1
    :hidden:

    Desktop App deployment guide </deploy/desktop-app>
    Desktop MSI installer and group policy installation guides (beta) </install/desktop-msi-installer-and-group-policy-install>
    Desktop App custom dictionaries </install/desktop-custom-dictionaries>
    Desktop managed resources </install/desktop-app-managed-resources>
    Using Mattermost’s pre-built Mobile Apps </deploy/use-prebuilt-mobile-apps>
    Deploy Mattermost Mobile Apps </deploy/mobile-overview>
    Mobile push notifications </deploy/mobile-hpns>
    Building and distributing your own custom Mattermost mobile apps </deploy/build-custom-mobile-apps>
    Deploying mobile apps using an EMM provider </deploy/deploy-mobile-apps-using-emm-provider>
    AppConfig for EMM solutions with Mattermost Mobile Apps </deploy/mobile-appconfig> 
    Mobile VPN options </deploy/consider-mobile-vpn-options>
    Mobile Apps FAQ </deploy/mobile-faq>
    Client-side data storage FAQ </deploy/client-side-data>

Customize the Mattermost desktop and mobile apps to meet any deployment needs.

**Desktop Apps**

* :doc:`Desktop App deployment guide </deploy/desktop-app>` - Customize and distribute the Mattermost desktop app with pre-configured settings.
* :doc:`Desktop MSI installer and group policy installation guides (beta) </install/desktop-msi-installer-and-group-policy-install>` - Use the Mattermost MSI installer and Group Policy definitions for Windows deployment.
* :doc:`Desktop App custom dictionaries </install/desktop-custom-dictionaries>` - Create custom dictionaries for Mattermost spellcheck.
* :doc:`Desktop managed resources </install/desktop-app-managed-resources>` - Configure resource management for services running on the same domain as your Mattermost instance.

**Mobile Apps**

* :doc:`Using Mattermost’s pre-built mobile apps </deploy/use-prebuilt-mobile-apps>` - Connect users to your Mattermost server with our prebuilt apps for Android and iOS.
* :doc:`Deploy Mattermost mobile apps </deploy/mobile-overview>` - Learn the basics of how to customize and deploy Mattermost to the Enterprise.
* :doc:`Mobile push notifications </deploy/mobile-hpns>` - Set up mobile push notifications. 
* :doc:`Building and distributing your own custom Mattermost mobile apps </deploy/build-custom-mobile-apps>` - Build custom mobile Mattermost apps.
* :doc:`Deploying mobile apps using an EMM provider </deploy/deploy-mobile-apps-using-emm-provider>` - Deploy with Enterprise Mobile Management software to enforce security policies and enforce specific versions of the Mattermost mobile apps.
* :doc:`AppConfig for EMM solutions with Mattermost mobile apps </deploy/mobile-appconfig>` - Learn how AppConfig provides an easy way to configure enterprise mobile applications.
* :doc:`Mobile VPN options </deploy/consider-mobile-vpn-options>` - Learn how to use the Mattermost mobile apps with Mobile VPNs.
* :doc:`Mobile apps frequently asked questions </deploy/mobile-faq>`
* :doc:`Client-side data storage frequently asked questions </deploy/client-side-data>`

Upgrade Mattermost
------------------
.. toctree::
    :maxdepth: 1
    :hidden:

    Prepare to upgrade Mattermost </upgrade/prepare-to-upgrade-mattermost>
    Upgrade Mattermost Server </upgrade/upgrading-mattermost-server>
    Enterprise install and upgrade </install/enterprise-install-upgrade>
    Install a license key </upgrade/installing-license-key>
    Release definitions </upgrade/release-definitions>
    Important upgrade notes </upgrade/important-upgrade-notes>
    Release lifecycle </upgrade/release-lifecycle>
    Extended Support Release </upgrade/extended-support-release>
    Downgrade Mattermost Server </upgrade/downgrading-mattermost-server>
    Version archive </upgrade/version-archive>

Stay up to date with the latest features and improvements.

* :doc:`Prepare to upgrade Mattermost </upgrade/prepare-to-upgrade-mattermost>` - Learn how to prepare for a Mattermost upgrade.
* :doc:`Upgrade Mattermost Server </upgrade/upgrading-mattermost-server>` - Learn the basics of upgrading your Mattermost server to the latest version.
* :doc:`Enterprise install and upgrade </install/enterprise-install-upgrade>` - Learn how to upgrade your Mattermost server to premium versions.
* :doc:`Install a license key </upgrade/installing-license-key>` - Learn how to add or change a Mattermost license key.
* :doc:`Release definitions </upgrade/release-definitions>` - Get details on the Mattermost release schedule and the types of releases.
* :doc:`Important upgrade notes </upgrade/important-upgrade-notes>` - Find version-specific upgrade considerations.
* :doc:`Release lifecycle </upgrade/release-lifecycle>` - See critical release lifecycle dates.
* :doc:`Extended Support Release </upgrade/extended-support-release>` - Get information about releases that have extended release support.
* :doc:`Downgrade Mattermost Server </upgrade/downgrading-mattermost-server>` - Find out how to roll back to older versions of Mattermost.
* :doc:`Version archive </upgrade/version-archive>` - Download binaries for every release.

Scale Mattermost
----------------
.. toctree::
    :maxdepth: 1
    :hidden:

    Scale for Enterprise </scale/scaling-for-enterprise>
    High Availability cluster </scale/high-availability-cluster>
    Elasticsearch </scale/elasticsearch>
    Performance monitoring </scale/performance-monitoring>
    Mattermost performance alerting guide </scale/performance-alerting>

Scale and monitor your Mattermost deployment.

* :doc:`Scale for Enterprise </scale/scaling-for-enterprise>` - Scale Mattermost to tens of thousands of users and beyond.
* :doc:`High Availability cluster </scale/high-availability-cluster>` - Maintain Mattermost service during outages and hardware failures with redundant infrastructure.
* :doc:`Elasticsearch </scale/elasticsearch>` - Enhance search performance with Elasticsearch.
* :doc:`Performance monitoring </scale/performance-monitoring>` - Use Prometheus and Grafana to monitor the health and performance of your Mattermost cluster.
* :doc:`Mattermost performance alerting guide </scale/performance-alerting>` - Learn strategies and best practices for monitoring your Mattermost cluster. 

Troubleshooting guides
----------------------
.. toctree::
    :maxdepth: 1
    :hidden:

    General troubleshooting </install/troubleshooting>
    Troubleshooting mobile applications </deploy/mobile-troubleshoot>
    MySQL installation troubleshooting </install/trouble_mysql>

* :doc:`General troubleshooting </install/troubleshooting>`
* :doc:`Troubleshooting mobile applications </deploy/mobile-troubleshoot>`
* :doc:`MySQL installation troubleshooting </install/trouble_mysql>`

Changelogs
----------
.. toctree::
    :maxdepth: 1
    :hidden:

    Mattermost self-hosted </install/self-managed-changelog>
    Mattermost legacy self-hosted </install/legacy-self-hosted-changelog>
    Mattermost Cloud </install/cloud-changelog>
    Mobile Apps </deploy/mobile-app-changelog>
    Desktop Apps </install/desktop-app-changelog>
    Deprecated features </install/deprecated-features>

* :doc:`Mattermost self-hosted </install/self-managed-changelog>`
* :doc:`Mattermost legacy self-hosted </install/legacy-self-hosted-changelog>`
* :doc:`Mattermost Cloud </install/cloud-changelog>`
* :doc:`Mobile Apps </deploy/mobile-app-changelog>`
* :doc:`Desktop Apps </install/desktop-app-changelog>`
* :doc:`Deprecated features </install/deprecated-features>`

Additional server install guides
--------------------------------
.. toctree::
    :maxdepth: 1
    :hidden:

    Install on Ubuntu 18.04 LTS </install/installing-ubuntu-1804-LTS>
    Install on RHEL 7 </install/install-rhel-7>
    Deploy Mattermost on Bitnami </install/deploying-team-edition-on-bitnami>
    AWS Elastic Beanstalk Docker setup </install/setting-up-aws-elastic-beanstalk-docker>
    Install Mattermost Team Edition in GitLab Helm Chart </install/installing-team-edition-helm-chart>
    Open source components </upgrade/open-source-components>

* :doc:`Install on Ubuntu 18.04 LTS </install/installing-ubuntu-1804-LTS>`
* :doc:`Install on RHEL 7 </install/install-rhel-7>`
* :doc:`Deploy Mattermost on Bitnami </install/deploying-team-edition-on-bitnami>`
* :doc:`AWS Elastic Beanstalk Docker setup </install/setting-up-aws-elastic-beanstalk-docker>`
* :doc:`Install on GitLab Helm Chart </install/installing-team-edition-helm-chart>`
* :doc:`Open source components </upgrade/open-source-components>`

source/guides/community-chat.rst METASEP
Mattermost community collaboration server
=========================================

Mattermost hosts a collaboration and chat server at `community.mattermost.com <https://community.mattermost.com/login>`__ to connect our team with our larger contributor and user community. This server is open to everyone, and we welcome anyone who wants to participate in our community to sign up.

We have many channels on our community server you can join. Here are some of the more popular channels.

**General purpose channels**

- `Peer-to-peer Help: <https://community.mattermost.com/core/channels/peer-to-peer-help>`__ Get help from other community members on using, deploying, or contributing to Mattermost.
- `Ask Anything: <https://community.mattermost.com/core/channels/ask-anything>`__ Ask general questions about Mattermost.

**Contributor discussions**

- `Developers: <https://community.mattermost.com/core/channels/developers>`__ Get help with development issues from our team and other developers in our community.
- `Developers Meeting: <https://community.mattermost.com/core/channels/developers-meeting>`__ Join the weekly developers meeting to find out what Mattermost developers are working on.
- `Contributors: <https://community.mattermost.com/core/channels/tickets>`__ Connect with other people who are working to make Mattermost better.
- `Contributor Guilds: <https://developers.mattermost.com/contribute/getting-started/guilds/>`__ Find focused groups within our community that work on specific portions of the Mattermost ecosystem.
- `Documentation Working Group: <https://community.mattermost.com/core/channels/dwg-documentation-working-group>`__ Provide feedback about Mattermost documentation and ask questions to the Mattermost Technical Writing team.
- `Content: <https://community.mattermost.com/core/channels/mattermost-blog>`__ Discuss blog, video, podcast, and other content publication with the Mattermost Content team.

**Social channels**

- `Off-Topic: <https://community.mattermost.com/core/channels/off-topic-pub>`__ Talk about anything that’s not directly related to Mattermost
- `Open Source Fridays: <https://community.mattermost.com/core/channels/open-source-fridays>`__ Share what you’re working on during your own Open Source Fridays.
- `Social: <https://community.mattermost.com/core/channels/social>`__ Join the conversation on our channel for casual chats. 

source/guides/channels.rst METASEP
Mattermost Channels
===================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Mattermost Channels provide 1:1 and group messaging that features integrated voice/video conferencing, file, image, and link sharing, rich markdown formatting, and a fully searchable message history. 

With Mattermost Channels, you can keep all of your team's communications in one place and remove information and organizational silos. This Mattermost Channels User Guide is designed for anyone who needs help using Mattermost messaging capabilities.

.. image:: ../images/Channels_Hero.png
   :alt: An example of the Mattermost Channels screen that includes teams, the channel sidebar, an active conversation in the center pane, reply threads in the right-hand pane.

Channels, messages, and conversations
-------------------------------------

Channels are used to organize conversations across different topics. Find available channels in the left-hand panel. There are four types of channels: public channels, private channels, direct messages, and group messages. See the `Channel Types </channels/channel-types.html>`__ documentation for more information.

Sending messages, replying to messages, and participating in conversation threads are important ways to keep conversations active with your team. See the following topics to learn more about working with channels.

Work with channels
------------------

.. toctree::
   :maxdepth: 1
   :hidden:

   Channel types </channels/channel-types> 
   Create channels </channels/create-channels>
   Channel naming conventions </channels/channel-naming-conventions> 
   Rename a channel </channels/rename-channels>
   Convert public channels to private </channels/convert-public-channels>
   Join and leave channels </channels/join-leave-channels>
   Start a call </channels/make-calls>
   Manage channel members </channels/manage-channel-members>
   Find channels </channels/find-channels> 
   Navigate between channels </channels/navigate-between-channels>
   Mark channels as favorites </channels/favorite-channels>
   Customize your channel sidebar </channels/customize-your-channel-sidebar>
   Archive and unarchive channels </channels/archive-unarchive-channels>
   Set channel preferences </channels/set-channel-preferences>
   Channels settings </channels/channels-settings>

* :doc:`Channel types </channels/channel-types>` - Learn more about the types of channels available in Mattermost.
* :doc:`Create channels </channels/create-channels>`  - Create channels to organize discussion by topic, project, or focus.
* :doc:`Channel naming conventions </channels/channel-naming-conventions>` - Learn why channel names are important.
* :doc:`Rename a channel </channels/rename-channels>` - Rename channels to make them more discoverable.
* :doc:`Convert public channels to private </channels/convert-public-channels>` - Learn how to convert channel access and visibility.
* :doc:`Join and leave channels </channels/join-leave-channels>` - Learn how to start or stop being a channel member.
* :doc:`Start a call </channels/make-calls>` - Start a call that channel participants can join.
* :doc:`Manage channel members </channels/manage-channel-members>` - Add and remove users from channels.
* :doc:`Find channels </channels/find-channels>` - Find all available public channels you can join, and all channels you're a member of.
* :doc:`Navigate between channels </channels/navigate-between-channels>` - Learn how to navigate between channels.
* :doc:`Mark channels as favorites </channels/favorite-channels>` - Mark commonly visited channels as favorites.
* :doc:`Customize your channel sidebar </channels/customize-your-channel-sidebar>` - Organize conversations in the sidebar to keep your workspace efficient.
* :doc:`Archive and unarchive channels </channels/archive-unarchive-channels>` - Keep the number of available channels manageable. 
* :doc:`Set Channel preferences </channels/set-channel-preferences>` - Customize notifications, headers, names, and channel descriptions.
* :doc:`Customize Your Mattermost Channels experience </channels/channels-settings>` - Learn how to customize Mattermost Channels based on your preferences.

Work with messages
------------------
.. toctree::
   :maxdepth: 1
   :hidden:

   Send messages </channels/send-messages>
   Reply to messages </channels/reply-to-messages>
   Organize conversations </channels/organize-conversations>
   React to messages using emojis </channels/react-to-messages>
   Mention people </channels/mention-people>
   Mark messages as unread </channels/mark-messages-unread>
   Format messages </channels/format-messages>
   Share files in messages </channels/share-files-in-messages>
   Forward messages </channels/forward-messages>
   Share links to messages </channels/share-links>
   Save and pin messages </channels/save-pin-messages>
   Search for messages </channels/search-for-messages>

* :doc:`Send messages </channels/send-messages>` - Send messages to other Mattermost users.
* :doc:`Reply to messages </channels/reply-to-messages>` - Communicate with your team in Mattermost.
* :doc:`Organize conversations with Collapsed Reply Threads </channels/organize-conversations>` - An enhanced communication thread experience is available in Mattermost.
* :doc:`React to messages using emojis </channels/react-to-messages>` - Use emojis to express concepts, emotions, and physical gestures in your messages.
* :doc:`Mention people </channels/mention-people>` - Get the attention of specific people.
* :doc:`Mark Messages as unread </channels/mark-messages-unread>` - Change messages to an unread state for easy follow-up.
* :doc:`Format messages </channels/format-messages>` - Use markdown to format message content.
* :doc:`Share files in messages </channels/share-files-in-messages>` - Share videos, voice recordings, and images in your Mattermost messages.
* :doc:`Forward messages </channels/forward-messages>` - Quickly and easily forward messages with previews.
* :doc:`Share links to messages </channels/share-links>` - Share links to messages across channels.
* :doc:`Save and pin messages </channels/save-pin-messages>` - Mark useful messages for easy retrieval in the future.
* :doc:`Search for messages </channels/search-for-messages>` - Use search to find messages, replies, and contents of files across Mattermost Channels.

Keyboard accessibility
----------------------

.. toctree::
   :maxdepth: 1
   :hidden:

   Keyboard accessibility in Channels </channels/keyboard-accessibility>
   Keyboard shortcuts for Channels </channels/keyboard-shortcuts-for-channels>
   Run slash commands </channels/run-slash-commands>

* :doc:`Keyboard accessibility in Channels </channels/keyboard-accessibility>` - Access regions of your Mattermost workspace.
* :doc:`Keyboard shortcuts for Channels </channels/keyboard-shortcuts-for-channels>` - Make a more efficient use of your keyboard with keyboard shortcuts.
* :doc:`Run slash commands </channels/run-slash-commands>` - Perform actions in Mattermost by typing into the text input box.

Extend Channels functionality
-----------------------------

.. toctree::
   :maxdepth: 1
   :hidden:

   Extend functionality with integrations </channels/extend-channels-functionality>
   

* :doc:`Extend Channels with integrations </channels/extend-channels-functionality>` - Find open source integrations to common tools in the Mattermost Marketplace.

source/guides/boards.rst METASEP
Mattermost Boards
=================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Mattermost Boards enable your team to manage projects and tasks via a familiar Kanban board structure. Keep everyone in your team and organization in the loop to stay on schedule with clearly defined tasks, owners, checklists, and deadlines. Keep everything your team needs in one place, including documents, images, and important hyperlinks.

.. image:: ../images/Boards_Hero.png
   :alt: An example of the Mattermost Boards screen that includes a project status board and cards organized by status. 

This Mattermost Boards User Guide is for anyone who needs help using Mattermost project and task management capabilities.

The basics
----------

.. toctree::
   :hidden:

   Overview </boards/overview>
   Enable Boards </boards/getting-started>
   Access Boards </boards/accessing-boards>
   Work with boards </boards/working-with-boards>
   Work with cards </boards/work-with-cards>
   Share boards </boards/sharing-boards>
   Migrate to Boards </boards/data-and-archives>
   Templates </boards/templates>

* :doc:`Overview </boards/overview>` - Learn about Mattermost Boards features.
* :doc:`Enable Boards </boards/getting-started>` - Enable Boards for your Mattermost instance.
* :doc:`Access Boards </boards/accessing-boards>` - Use Mattermost Channels to access your Boards.
* :doc:`Work with boards </boards/working-with-boards>` - Create new Boards and manage their properties.
* :doc:`Work with cards </boards/work-with-cards>` - Learn about the different property types in cards.
* :doc:`Share boards </boards/sharing-boards>` - Share Boards with your team and manage sharing settings. 
* :doc:`Migrate to Boards </boards/data-and-archives>` - Migrate your data from other tools into Mattermost Boards.
* :doc:`Templates </boards/templates>` - Customize your Boards and Cards with Templates.

source/guides/administration.rst METASEP
Mattermost administration guide
===============================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

This guide is for people who administer an existing Mattermost server. It’s divided into four parts:

* `Get started <https://docs.mattermost.com/guides/administration.html#get-started>`__ - An overview of standard configurations and features for both self-hosted and Cloud workspaces.
* `Cloud workspace management <https://docs.mattermost.com/guides/administration.html#workspace-management>`__ - Detailed information about admin capabilities of Mattermost Cloud workspaces.
* `Self-hosted administration <https://docs.mattermost.com/guides/administration.html#self-hosted-admin>`__ - Detailed information about admin capabilities of self-hosted Mattermost servers.
* `Other resources <https://docs.mattermost.com/guides/administration.html#other-resources>`__ - Additional migration, conversion, and troubleshooting resources.

If you’re looking for resources to help you install, deploy, and scale your self-hosted Mattermost server, see the :doc:`Mattermost Deployment Guide </guides/deployment>`.

Get started
------------
.. toctree::
    :maxdepth: 1
    :hidden:

    Optimize your workspace </configure/optimize-your-workspace>
    Mattermost configuration settings </configure/configuration-settings>
    About </configure/self-hosted-account-settings>
    Billing & account </configure/cloud-billing-account-settings>
    Reporting configuration settings </configure/reporting-configuration-settings>
    User management configuration settings </configure/user-management-configuration-settings>
    Environment configuration settings </configure/environment-configuration-settings>
    Deprecated configuration settings </configure/deprecated-configuration-settings>
    Environment variables </configure/environment-variables>
    Provisioning workflows </onboard/user-provisioning-workflows>
    Multi-factor authentication </onboard/multi-factor-authentication>
    Active Directory/LDAP </onboard/ad-ldap>
    GitLab SSO </onboard/sso-gitlab>
    OpenID SSO </onboard/sso-openidconnect>
    Google SSO </onboard/sso-google>
    Office 365 SSO </onboard/sso-office>
    Advanced permissions </onboard/advanced-permissions>
    System Admin roles </onboard/system-admin-roles>
    Manage team and channel members </manage/team-channel-members>
    Custom branding tools </configure/custom-branding-tools>
    eDiscovery </comply/electronic-discovery>
    Compliance monitoring </comply/compliance-monitoring>
    Compliance export </comply/compliance-export>
    Data retention tools </comply/data-retention-policy>
    Custom terms of service </comply/custom-terms-of-service>

These resources will help you get started with your Mattermost self-hosted or Cloud workspace.

* **Optimize your workspace** - Review health and growth scores for your Mattermost workspace, and take necessary action using the :doc:`workspace optimization </configure/optimize-your-workspace>` page in the System Console.
* **Configure your workspace** - Mattermost offers extensive configuration options for both `self-hosted Mattermost servers and Mattermost Cloud workspaces <https://docs.mattermost.com/configure/configuration-settings.html>`__, and provides a list of :doc:`deprecated configuration settings </configure/deprecated-configuration-settings>` no longer supported.
* **Environment variables** - Learn how to use :doc:`environment variables </configure/environment-variables>` to manage configuration for a self-hosted deployment.
* **Provisioning workflows** - Learn how to :doc:`provision </onboard/user-provisioning-workflows>` and de-provision user accounts.
* **User authentication** - All versions of Mattermost provide basic authentication and offer :doc:`multi-factor authentication </onboard/multi-factor-authentication>` out of the box. Professional and Enterprise versions of Mattermost also include :doc:`Active Directory/LDAP </onboard/ad-ldap>` and SSO for :doc:`GitLab SSO </onboard/sso-gitlab>`, :doc:`OpenID </onboard/sso-openidconnect>`, :doc:`Google </onboard/sso-google>`, and :doc:`Office365 </onboard/sso-office>`.
* **User permissions** - All versions of Mattermost offer standard user permissions control. Professional and Enterprise versions also include :doc:`advanced permissions control </onboard/advanced-permissions>` to customize which users can perform specific actions, and :doc:`System Admin roles </onboard/system-admin-roles>` to grant admins from your organization access to specific areas of the Mattermost System Console.
* **Manage team and channel members** - :doc:`Manage team and channel members </manage/team-channel-members>` synchronization, moderation, and membership settings.
* **Customize branding** - Change Mattermost branding, site name, and description with :doc:`custom branding tools </configure/custom-branding-tools>`.
* **Compliance tools** - Extract data from Mattermost for :doc:`eDiscovery </comply/electronic-discovery>` use in legal cases, create :doc:`Compliance monitoring </comply/compliance-monitoring>` reports for query and download actions, or :doc:`Compliance export </comply/compliance-export>` reports for channel history actions, set custom :doc:`data retention policies </comply/data-retention-policy>`, and set :doc:`custom terms of service </comply/custom-terms-of-service>` for team members.

Advanced user management
~~~~~~~~~~~~~~~~~~~~~~~~

.. toctree::
    :maxdepth: 1
    :hidden:

    AD/LDAP groups </onboard/ad-ldap-groups-synchronization>
    Use AD/LDAP synchronized groups to manage team or private channel membership </onboard/managing-team-channel-membership-using-ad-ldap-sync-groups>
    Guest accounts </onboard/guest-accounts>
    SAML Single Sign-On </onboard/sso-saml>
    SAML Single-Sign-On: technical documentation </onboard/sso-saml-technical>

* :doc:`AD/LDAP groups </onboard/ad-ldap-groups-synchronization>` - Sync AD/LDAP groups with Mattermost roles and teams.
* :doc:`Use AD/LDAP synchronized groups to manage team or private channel membership </onboard/managing-team-channel-membership-using-ad-ldap-sync-groups>` - Synchronize your AD/LDAP group with private Mattermost channels and teams.
* :doc:`Guest accounts </onboard/guest-accounts>` - Create guest accounts to collaborate with individuals outside your organization.
* :doc:`SAML Single Sign-On </onboard/sso-saml>` - Configure Mattermost to be a SAML 2.0 service provider.
* :doc:`SAML Single-Sign-On: technical documentation </onboard/sso-saml-technical>` - SAML 2.0 reference documentation for Mattermost.

Advanced workspace management
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. toctree::
    :maxdepth: 1
    :hidden:

    Shared channels </onboard/shared-channels>
    Statistics </manage/statistics>
    In-product notices </manage/in-product-notices>
    User satisfaction surveys </manage/user-satisfaction-surveys>
    Health check </manage/health-checks>
    Announcement banner </manage/announcement-banner>
    Bulk export tool </manage/bulk-export-tool>

* :doc:`Shared channels </onboard/shared-channels>` - Connect channels from multiple Mattermost servers in a federated architecture.
* :doc:`Statistics </manage/statistics>` - Get statistics about your Mattermost server usage.
* :doc:`In-product notices </manage/in-product-notices>` - Get notified about Mattermost updates via in-app notices.
* :doc:`User satisfaction surveys </manage/user-satisfaction-surveys>` - Learn about Mattermost user satisfaction surveys and how to configure their operation.
* :doc:`Health check </manage/health-checks>` - Configure health probes for your Mattermost server.
* :doc:`Announcement banner </manage/announcement-banner>` - Display notices to your users via an announcement banner.
* :doc:`Bulk export tool </manage/bulk-export-tool>` - Export user, team, channel, and post data from Mattermost.

Cloud workspace management
--------------------------

.. toctree::
    :maxdepth: 1
    :hidden:

    Mattermost Cloud billing </manage/cloud-billing>
    Workspace limits </onboard/mattermost-limits>
    Workspace usage </manage/workspace-usage>
    Workspace migration </manage/cloud-data-export>
    Cloud data residency </manage/cloud-data-residency>

* :doc:`Mattermost Cloud billing </manage/cloud-billing>` - Set up and manage billing for your Mattermost Cloud workspace.
* :doc:`Workspace limits </onboard/mattermost-limits>` - Understand the data limits on your plan.
* :doc:`Workspace usage </manage/workspace-usage>` - Keep your workspace active.
* :doc:`Workspace migration </manage/cloud-data-export>` - Migrate your workspace using the mmctl tool.
* :doc:`Cloud data residency </manage/cloud-data-residency>` - Find information about your data in the Cloud.

Self-hosted administration
--------------------------

This section of the guide is for system admins of self-hosted Mattermost servers. If you're the admin for a Mattermost Cloud workspace, please refer to the `Cloud workspace management <https://docs.mattermost.com/guides/administration.html#cloud-workspace-management>`__ section on this page.

.. toctree::
    :maxdepth: 1
    :hidden:

    Store configuration in the database </configure/configuation-in-mattermost-database>
    Bulk loading data </onboard/bulk-loading-data>
    SMTP email setup </configure/smtp-email>
    Email templates </configure/email-templates>
    Calls deployment </configure/calls-deployment>
    Configure CloudFront to host static assets </configure/configuring-cloudfront-to-host-mattermost-static-assets>
    Use an outbound proxy </configure/using-outbound-proxy>
    Migration guide </onboard/migrating-to-mattermost>
    Chinese, Japanese, and Korean search </configure/enabling-chinese-japanese-korean-search>
    Customize Mattermost </configure/customizing-mattermost>
    Audit log v2 </comply/audit-log>
    SSL client certificate setup </onboard/ssl-client-certificate>
    Certificate-based authentication </onboard/certificate-based-authentication>

* :doc:`Include configuration in the Mattermost database </configure/configuation-in-mattermost-database>` - Store Mattermost configuration information in your database rather than as a JSON file. We recommend this for High Availability environments.
* :doc:`Bulk loading data </onboard/bulk-loading-data>` - Import bulk data into Mattermost for teams, channels, users, post content, and more.
* :doc:`SMTP email setup </configure/smtp-email>` - Connect to an email server to send emails for password resets and system notifications.
* :doc:`Email templates </configure/email-templates>` - Alter the transactional emails Mattermost sends to your users.
* :doc:`Calls deployment </configure/calls-deployment>` - Learn about the different calls deployment types.
* :doc:`Configure CloudFront to host Mattermost static assets </configure/configuring-cloudfront-to-host-mattermost-static-assets>` - Improve caching performance to reduce content load times.
* :doc:`Use an outbound proxy </configure/using-outbound-proxy>` - Monitor outbound traffic and control the websites that can appear in embedded content.
* :doc:`Migration guide </onboard/migrating-to-mattermost>` - Learn how to migrate from other chat services to Mattermost.
* :doc:`Chinese, Japanese, and Korean search </configure/enabling-chinese-japanese-korean-search>` - Set up search capabilities for teams communicating via Chinese, Japanese, or Korean.
* :doc:`Whitelabel Mattermost </configure/customizing-mattermost>` - Whitelabel the Mattermost server and apps.
* :doc:`Audit log v2 </comply/audit-log>` - Review a comprehensive list of events that occur on your Mattermost server.
* :doc:`SSL client certificate setup </onboard/ssl-client-certificate>` - Configure SSL client certificates for Mattermost Desktop and Web Apps.
* :doc:`Certificate-Based Authentication </onboard/certificate-based-authentication>` - Set up certificate-based authentication for Mattermost.

Other resources
---------------
.. toctree::
    :maxdepth: 1
    :hidden:

    Convert OAuth 2.0 providers to OpenID Connect </onboard/convert-oauth20-service-providers-to-openidconnect>
    Generate a support packet </manage/generating-support-packet>
    mmctl command line tool </manage/mmctl-command-line-tool>
    Migration announcement email template </onboard/migration-announcement-email>
    Advanced permissions infrastructure </onboard/advanced-permissions-backend-infrastructure>
    Command line tools </manage/command-line-tools>

If the information above doesn’t solve your problem, look at these other resources to find something that meets your needs. Alternatively, you can also :doc:`get help </guides/get-help>` from our community or via premium support services.

* :doc:`Convert OAuth 2.0 service providers to OpenID Connect </onboard/convert-oauth20-service-providers-to-openidconnect>` - Migrate from OAuth 2.0 to OpenID Connect.
* :doc:`Generate a support packet </manage/generating-support-packet>` - Generate configuration information, logs, plugin details, and data dependencies to provide when contacting Mattermost support.
* :doc:`mmctl command line tool </manage/mmctl-command-line-tool>` - Use mmctl to manage self-hosted Mattermost servers from the command line.
* :doc:`Migration announcement email template </onboard/migration-announcement-email>` - Use this email template to notify your users about migrating to Mattermost.
* :doc:`Advanced permissions: backend infrastructure </onboard/advanced-permissions-backend-infrastructure>` - Read our technical guide on modifying self-hosted Mattermost installations to create custom permissions schemes.
* :doc:`Command line tools </manage/command-line-tools>` - Learn how to use the command line to manage self-hosted Mattermost servers.

source/guides/about-mattermost.rst METASEP
:orphan:
:nosearch:

About Mattermost
================

.. This page is intentionally not accessible via the LHS navigation pane.

Mattermost is an open source platform for secure communication, collaboration, and orchestration of work across tools and teams. 

Mattermost’s mission is to make the world safer and more productive by developing and delivering secure, open source collaboration software that is trusted, flexible, and offers fast time-to-value. Find an overview below of our products, features, security, integrations, licensing and subscriptions, authentication, and compliance support.

.. toctree::
   :maxdepth: 2
   :hidden:

   /about/product.rst
   /about/security.rst
   /about/integrations.rst
   /about/editions-and-offerings.rst
   /about/subscription.rst
   /about/self-hosted-subscriptions.rst
   /about/cloud-subscriptions.rst
   /about/corporate-directory-integration.rst
   /about/certifications-and-compliance.rst
   /about/frequently-asked-questions.rst

Mattermost contains three key tools:

* :doc:`Channels </guides/channels>` - Stay connected with your team via 1:1 and group messaging.
* :doc:`Playbooks </guides/playbooks>` - Build and configure repeatable processes to achieve specific and predictable outcomes.
* :doc:`Boards </guides/boards>` - Manage projects and tasks in a Kanban board structure to help your team hit key milestones.

This section provides an overview of Mattermost products, features, security, integrations, licensing, subscriptions, authentication, and compliance support.

* :doc:`Product overview </about/product>` - Learn about the Mattermost open source project, self-hosted vs. cloud, and premium Mattermost features.
* :doc:`Security </about/security>` - Mattermost can meet the strictest security requirements and provides the highest level of control over user data.
* :doc:`Integrations </about/integrations>` - Mattermost is extensible by design and supports a rich ecosystem of third-party apps and integrations.
* :doc:`Mattermost editions and offerings </about/editions-and-offerings>` - Learn more about Mattermost deployment options.
* :doc:`Subscription overview </about/subscription>` - Learn about Mattermost subscriptions.
* :doc:`Self-Hosted subscriptions </about/self-hosted-subscriptions>` - Learn about Mattermost self-hosted subscriptions.
* :doc:`Cloud subscriptions </about/cloud-subscriptions>` - Learn about Mattermost Cloud subscriptions.
* :doc:`Corporate directory integrations </about/corporate-directory-integration>` - Mattermost integrates with all major account providers via Active Directory, SAML, and OAuth.
* :doc:`Certifications and compliance </about/certifications-and-compliance>` - Mattermost can meet all major security and compliance requirements.
* :doc:`Frequently Asked Questions </about/frequently-asked-questions>` - Get answers to common questions about Mattermost.

source/getting-started/welcome-email-to-end-users.rst METASEP
Welcome email to end users
===========================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

To make it easy for your end users to start using Mattermost right away, we created a sample email template that you can use.

Remember to replace all the items below in bold with your information.

Email template
---------------

From: **[company name]** IT Team

To: End users

Subject: New Collaboration Platform - Mattermost


Hi all,
 
As some of you already know, we are moving to Mattermost as our collaboration platform. Mattermost is collaboration software you can use to talk, share files, and collaborate on projects or initiatives. Mattermost also integrates with many of the apps that you use every day, like **[add apps]**.  

We are moving to Mattermost because it will host all our collaboration in one place, is instantly searchable and available from all your devices.

Some of the major benefits of using Mattermost are:

- Direct 1:1 and group messaging

- Channels for topic-based, group-based, or meeting-based chat

- Streamlined collaboration on projects

- Reduced email clutter

- Searching across messages and channels

- Sharing files

To get started:

1. Open a browser on your computer, go to **[Mattermost URL]** and log in with your **[LDAP/AD, SAML, Google, etc]** credentials. Remember to bookmark the URL so you can use it to log in next time.

2. `Download <https://mattermost.com/apps>`__ the Mattermost apps for desktop and mobile. See the `Channels <https://docs.mattermost.com/messaging/welcome-to-mattermost-messaging.html>`__ documentation for details on how to get up and running quickly.

3. Start messaging! 


Questions?
If you have any questions, feel free to post in the **[~Mattermost channel]** or email us at **[IT email]**.

Happy collaborating!

**[company name]** IT Team

source/getting-started/light-install.rst METASEP
Light install guide
===================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Mattermost is a collaboration platform. With Mattermost, you can integrate the tools you use every day into one place and never miss a notification or task. 

Before you get started you'll need:

* A clean Ubuntu server (18.04 or 20.04) with root level access
* (Recommended) A domain name pointing to your server (e.g. ``mymattermostserver.com``)
* (Recommended) Email addresses of your team members so you can invite them to the server

Installation
-------------

Install Mattermost using `Mattermost Omnibus <https://docs.mattermost.com/install/installing-mattermost-omnibus.html>`_.

Open a terminal window and enter:

.. code-block:: sh

  curl -o- https://deb.packages.mattermost.com/repo-setup.sh | sudo bash

Then, to install the Omnibus package, run:

.. code-block:: sh

  sudo apt install mattermost-omnibus

.. note::
  
  Although the recommended way to install and configure Omnibus is with SSL enabled, if you want to use or test without it (or without a domain name), you can run: 

  .. code-block:: sh
  
    sudo MMO_HTTPS=false apt install mattermost-omnibus

When your server is up and running, navigate to it via the domain name (e.g. ``mymattermostserver.com``) that points to your server (or the server’s IP address if you’re not using a domain name). Next, create a team and invite people to join your Mattermost server.

If you have any problems installing Mattermost Omnibus, see the `troubleshooting guide <https://docs.mattermost.com/install/troubleshooting.html>`__ for common error messages, or `join the Mattermost user community for troubleshooting help <https://mattermost.com/pl/default-ask-mattermost-community/>`_.

Add users
---------

Next, add people to your team by sending them an invitation:

1. Select your team name at the top left corner of Mattermost.
2. Select **Invite People** and enter the email addresses of the people you want to add.
3. Select **Invite Members**.

When the invitee receives the email with the link, it’s a single click to join your server, chat to you in the channel you’ve created, or create their own channels. More information about adding users is available `here <https://docs.mattermost.com/messaging/managing-members.html#managing-members>`_.

Create a notifications hub
--------------------------

Create a `“heartbeat” channel <https://community.mattermost.com/core/channels/community-heartbeat>`_ and integrate your most-used apps and plugins with Mattermost to send status updates and critical notifications in one place.

You can find and install integrations and plugins via **Product menu > Marketplace**.

Get started with GitHub, Jira, and Jenkins:

* Connect your GitHub organization to Mattermost using a slash command, to manage your reviews, pull requests, comments, and merges. GitHub is pre-packaged in Mattermost. Follow the `configuration steps <https://github.com/mattermost/mattermost-plugin-github#configuration>`_, and then let your team know to run /github connect so they can receive notifications.
* Connect your Jira account to Mattermost and set up a channel for the bot to post issues so your team is always up to date. Visit the `configuration guide <https://mattermost.gitbook.io/plugin-jira/setting-up/configuration>`_ to get started. Once configured, share the `end user documentation <https://mattermost.gitbook.io/plugin-jira/end-user-guide/getting-started>`_ with your team so they can start receiving notifications.
* Connect your Jenkins server to Mattermost to centralize your workflows and manage builds. Visit the `installation guide <https://github.com/mattermost/mattermost-plugin-jenkins#installation>`_ to get started. Share the `features list <https://github.com/mattermost/mattermost-plugin-jenkins#features>`_ with your team so they can ramp up quickly.

**Next:** `Learn more about organizing conversations <https://docs.mattermost.com/messaging/organizing-conversations.html>`_ and setting up `Mattermost on your mobile device <https://docs.mattermost.com/deploy/mobile-overview.html>`_.

source/getting-started/implementation-plan.rst METASEP
Implementation plan
===================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

1 Introduction
--------------

1.1 Purpose
~~~~~~~~~~~

Mattermost is an open source, private cloud alternative to proprietary SaaS collaboration solutions designed to offer organizations superior control, data sovereignty, configurability, freedom from lock-in, and enhanced security by keeping vital communications behind your firewall. You've chosen to implement Mattermost in our supported `editions and offerings:`_

.. _`editions and offerings:`: https://docs.mattermost.com/about/editions-and-offerings.html

The purpose of this Implementation Plan is to:

- Describe the solution to be deployed;
- Outline the process for implementing the solution (key personnel, tasks, schedule, etc.);
- Identify support required during the implementation process.

2 System overview
-----------------

This section provides a brief overview of the system to be implemented, including a description of the system and its organization.

2.1 System description
~~~~~~~~~~~~~~~~~~~~~~

Mattermost is a collaboration solution designed to remove organizational friction. You're implementing Mattermost in order to:

1. **[STATE REASON]**
2. **[STATE REASON]**
3. **[STATE REASON]**

In this implementation, you are planning to deploy Mattermost to **[NUMBER OF USERS]** users on the following teams:

1. **[TEAM 1]**
2. **[TEAM 2]**
3. **[TEAM 3]**

2.2  System organization
~~~~~~~~~~~~~~~~~~~~~~~~

A Mattermost Enterprise implementation consists of the following system components:

- **Mattermost Server**
  - The Mattermost Server is a single binary that includes the RESTful JSON web service, authentication client, authentication provider, notification service, and data management service. The Mattermost Server can be deployed in stand-alone or high availability mode where two or more servers are clustered together using gossip protocol and a proxy server that routes traffic from client applications to healthy servers in the cluster.
- **Mattermost Database**
  - A MySQL or PostgreSQL database in stand-alone or high-availability configurations (master with read replicas). When choosing the database, consider the `inherent search limitations of the database type <https://docs.mattermost.com/install/requirements.html#database-software>`__ and whether `Elasticsearch <https://docs.mattermost.com/scale/elasticsearch.html>`__ is most appropriate for your deployment.
- **Mattermost Push Notification Service**
  - Hosted or on-premise service that pushes notifications to Mattermost Android and Mattermost iOS mobile applications.
- **Mattermost Client Applications**
  - Client applications are available for Mattermost for the following platforms: Android, iOS, Windows, OSX, and Linux (Beta).
- **Mattermost Web Client**
  - Mattermost users can use their favorite Web browser to connect to their Mattermost server in place of the Mattermost mobile and desktop applications.
- **Proxy Server**
  - The use of a proxy server (NGINX, Apache, HAProxy, ELB, etc.) is recommended with Mattermost to obtain the benefits of: SSL termination, HTTP to HTTPS redirection, port mapping :80 to :8065, and the creation of standard request logs.

The following diagram is a high-level illustration of the Mattermost platform and how its various components interact with each other within a network:

.. image:: ../images/network_diagram.png
   :alt: Mattermost network diagram shows how the various system components of the Mattermost platform interact with each other within a network deployment.

**Reference**: https://docs.mattermost.com/deploy/deployment-overview.html

A recommended installation of Mattermost Enterprise E20 configured with a redundant, highly available, highly scalable mode, with application (Mattermost Server) and database High Availability features enabled, will require the following physical, or virtual, servers:

+-------------------+---------+---------------+--------+----------+
| Task              | Qty     | CPU           | Memory | Storage  |
+===================+=========+===============+========+==========+
| Mattermost Server | 2       | 2 vCPUs/cores | 4 GB   | 45-90 GB |
+-------------------+---------+---------------+--------+----------+
| Database Server   | 2       | 2 vCPUs/cores | 8 GB   | 100 GB   |
+-------------------+---------+---------------+--------+----------+
| Proxy             | 2       | 1 vCPUs/cores | 4 GB   | 10 GB    |
+-------------------+---------+---------------+--------+----------+

.. note::
  See the `Mattermost hardware sizing guidance <https://docs.mattermost.com/install/software-hardware-requirements.html#hardware-requirements>`__ documentation for details. 

2.3 Project references
~~~~~~~~~~~~~~~~~~~~~~

This section provides a bibliography of key project references and deliverables that have been produced before this point in the project development.

- Mattermost Overview: https://docs.mattermost.com/about/product.html
- Mattermost Software/Hardware Requirements: https://docs.mattermost.com/install/software-hardware-requirements.html 
- Mattermost Security Features: https://docs.mattermost.com/about/security.html 
- Mattermost Channels: https://docs.mattermost.com/guides/channels.html
- Mattermost Playbooks: https://docs.mattermost.com/guides/playbooks.html
- Mattermost Boards: https://docs.mattermost.com/guides/boards.html

2.4 Glossary
~~~~~~~~~~~~

Provide a glossary of all terms and abbreviations used in the manual.  If it is several pages in length, it may be placed in an appendix.

3 Management overview
---------------------

The subsequent sections provide a brief description of the implementation and major tasks involved in this section.

3.1 Description of implementation
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

3.2 Team
~~~~~~~~

In this section, identify the System Proponent, the name of the responsible organization(s), and titles and telephone numbers of the staff who serve as points of contact for the system implementation.  These points of contact could include the Project Manager. Program Manager, Security Manager.  Database Administrator, Configuration Management Manager, or other managers with responsibilities relating to the system implementation.  The site implementation representative for each field installation or implementation site should also be included, if appropriate.  List all managers and staff with whom the implementation must be coordinated.

3.2.1 Team members
^^^^^^^^^^^^^^^^^^

+----------+-----------------+----------------------+--------------+
| Name     | Title           | Email                | Phone        |
+==========+=================+======================+==============+
| Jane Doe | Project Manager | jane.doe@company.com | 111.111.1111 |
+----------+-----------------+----------------------+--------------+
|          |                 |                      |              |
+----------+-----------------+----------------------+--------------+
|          |                 |                      |              |
+----------+-----------------+----------------------+--------------+

3.3 Major tasks
~~~~~~~~~~~~~~~~

This section provides a brief description of each major task required for the implementation of the system. Add as many subsections as necessary to this section to describe all the major tasks adequately. The tasks described in this section are not site-specific, but generic or overall project tasks that are required to install hardware and software, prepare data, and verify the system. 

3.3.1 Create system architecture document
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The system architecture document is used to document the environments that Mattermost will be deployed to including:

- The environment (development, staging, production, etc.)
- Server, or virtual machine, specifications
- IP addresses and DNS
- Network diagram

**Reference**: https://docs.mattermost.com/deploy/deployment-overview.html

3.3.2 Gather required software and documentation
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Gather all of the software and documentation required for a successful implementation of the Mattermost platform and place it within the organization’s configuration management system.

3.3.3 Prepare deployment environments
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Build out the required deployment environments (development, staging, production, etc.) and implement configuration management (using a tool like Chef, Puppet, Salt, etc.)

**Reference**: https://docs.mattermost.com/install/software-hardware-requirements.html

3.3.4 Install software
^^^^^^^^^^^^^^^^^^^^^^

Install and configure Mattermost and its component software (MySQL or PostgreSQL, Nginx or another proxy, etc.)

**Reference**: https://docs.mattermost.com/guides/deployment.html#install-guides

Install in High Availability (Available in Mattermost Enterprise): https://docs.mattermost.com/scale/high-availability-cluster.html 

3.3.5 Test deployment
^^^^^^^^^^^^^^^^^^^^^

Verify that the software has been deployed successfully in each environment. Create, or update, automated tests to verify deployments.

**Reference**: https://docs.mattermost.com/manage/health-checks.html

3.3.6 Bulk load data
^^^^^^^^^^^^^^^^^^^^

Large quantities of data can be imported from a JSON file into Mattermost at the command line using the bulk loading feature. This feature is most suitable for migrating data from an existing system, or for pre-populating a new installation with data.

You can import the following data types:

- Teams
- Channels (public and private)
- Users
- Users’ team memberships
- Users’ channel memberships
- Users’ notification preferences
- Posts (regular, non-reply posts)
- Direct message and group message channels
- Direct messages and group messages

**Reference**: https://docs.mattermost.com/onboard/bulk-loading-data.html 

3.3.7 Implement backup
^^^^^^^^^^^^^^^^^^^^^^

Implement backup procedures to protect data stored within the Mattermost database, files uploaded by users, and the Mattermost ``config.json`` file.

**Reference**: https://docs.mattermost.com/deploy/backup-disaster-recovery.html

3.3.8 Implement monitoring
^^^^^^^^^^^^^^^^^^^^^^^^^^

Mattermost Enterprise supports integrated health and performance monitoring with Prometheus and Grafana. A guide to the statistics collected and reported on is available in the reference below:

**Reference**: https://docs.mattermost.com/scale/performance-monitoring.html

3.3.9 AD/LDAP setup
^^^^^^^^^^^^^^^^^^^^

Available in Mattermost Professional and Enterprise subscription plans.

Mattermost supports AD/LDAP integration for user authentication and user attribute syncing. 

**Reference**: https://docs.mattermost.com/onboard/ad-ldap.html 

3.3.10 Multi-factor authentication
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Available in Mattermost Professional and Enterprise subscription plans.

Configure multi-factor authentication (“MFA”) if required as part of your IT security policy. Compatible with Google Authenticator.

**Reference**: https://docs.mattermost.com/onboard/multi-factor-authentication.html

3.3.11 SAML Single-Sign-On
^^^^^^^^^^^^^^^^^^^^^^^^^^^

Available in Mattermost Professional and Enterprise subscription plans.

Mattermost can be configured to act as a SAML 2.0 Service Provider. Mattermost officially supports Okta, OneLogin, and Microsoft ADFS as the identity providers (IDPs).

**Reference**: https://docs.mattermost.com/onboard/sso-saml.html

3.3.12 Train administrators
^^^^^^^^^^^^^^^^^^^^^^^^^^^

Train administrators on the tasks required to manage Mattermost.

**Reference**: https://docs.mattermost.com/guides/administration.html

3.3.13 Update legal and support settings
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Mattermost has configuration settings for the terms of service, privacy policy, and support URLs and emails. It is highly recommended that you modify these in your configuration so that your users have the correct legal information and can contact administrators to resolve account issues. You can find these under **System Console > Legal and Support** in prior versions or **System Console** > **Site Configuration** > **Customization** in versions after 5.12.

.. image:: ../images/legal_and_support_settings.png
	:alt: Legal and Support settings 

3.3.14 Onboard users
^^^^^^^^^^^^^^^^^^^^

Send all users a welcome email with instructions on how to get started using Mattermost including links to the mobile applications and the User Guide.

**References**: 
- Links to download Mattermost apps:  https://mattermost.com/apps 
- Channels Guide: https://docs.mattermost.com/guides/channels.html 

3.4 Implementation schedule
~~~~~~~~~~~~~~~~~~~~~~~~~~~

In this section, provide a schedule of activities to be accomplished during implementation.  Show the required tasks (described in Section 3.3, Major Tasks) in chronological order, with the beginning and end dates of each task.

+----+--------------------------------------------+------------+------------+
|    | Task                                       | Start Date | End Date   |
+====+============================================+============+============+
| 1  | Create System Architecture Document        | xx/xx/xxxx | xx/xx/xxxx |
+----+--------------------------------------------+------------+------------+
| 2  | Gather Required Software and Documentation |            |            |
+----+--------------------------------------------+------------+------------+
| 3  | Prepare Deployment Environments            |            |            |
+----+--------------------------------------------+------------+------------+
| 4  | Install Software                           |            |            |
+----+--------------------------------------------+------------+------------+
| 5  | Test Deployment                            |            |            |
+----+--------------------------------------------+------------+------------+
| 6  | Bulk Load Data                             |            |            |
+----+--------------------------------------------+------------+------------+
| 7  | Implement Backup                           |            |            |
+----+--------------------------------------------+------------+------------+
| 8  | Implement Monitoring                       |            |            |
+----+--------------------------------------------+------------+------------+
| 9  | Train Administrators                       |            |            |
+----+--------------------------------------------+------------+------------+
| 10 | Onboard Users                              |            |            |
+----+--------------------------------------------+------------+------------+

3.5 Security
~~~~~~~~~~~~

If appropriate for the system to be implemented, include an overview of the system security features and requirements during the implementation.

3.5.1 System security features
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The Mattermost platform will be secured in the following ways:

- Mattermost will be hosted entirely on-premises behind your company firewall with access restricted to VPN connections;
- Mobile access to Mattermost will be further restricted by the use of multi-factor authorization;
- Transmissions to and from Mattermost will be encrypted using TLS;
- Encryption-at-rest will be applied using your company's standards;
- Mattermost’s integrity and audit controls store a complete history of messages, including edits and deletes, along with all files uploaded. User interface actions for “deleting” messages and channels remove the data only from the user interface; the data is retained within your database. If your compliance guidelines require it, you can turn off users’ ability to edit and delete their messages after they are posted.
- Mattermost will be protected against brute force attacks by its rate limiting API;
- Authentication to Mattermost will be controlled using your company's Active Directory/LDAP/SAML directory server. 

**Reference**: https://docs.mattermost.com/about/security.html

3.5.2 Security during implementation
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

This section addresses security issues specifically related to the implementation effort, if any. For example, if LAN servers or workstations will be installed at a site with sensitive data preloaded on non-removable hard disk drives, address how security would be provided for the data on these devices during shipping, transport, and installation because theft of the devices could compromise the sensitive data.

4 Implementation support
------------------------

This section describes the support software, materials, equipment, and facilities required for the implementation, as well as the personnel requirements and training necessary for the implementation.  The information provided in this section is not site-specific.  If there are additional support requirements not covered by the subsequent sections, others may be added as needed.

4.1 Hardware, software, facilities, and materials
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

In this section, list support software, materials, equipment, and facilities required for the implementation, if any.

4.1.1 Hardware
^^^^^^^^^^^^^^

This section provides a list of support equipment and includes all hardware used for testing time implementation.  For example, if a client/server database is implemented on a LAN, a network monitor or “sniffer” might be used, along with test programs. to determine the performance of the database and LAN at high-utilization rates.  If the equipment is site-specific, list it in Section 5, Implementation Requirements by Site.

4.1.2 Software
^^^^^^^^^^^^^^

This section provides a list of software and databases required to support the implementation. Identify the software by name, code, or acronym.  Identify which software is commercial off-the-shelf and which is State-specific.  Identify any software used to facilitate the implementation process.  If the software is site-specific, list it in Section 4.

4.1.3 Facilities
^^^^^^^^^^^^^^^^

In this section, identify the physical facilities and accommodations required during implementation.  Examples include physical workspace for assembling and testing hardware components, desk space for software installers, and classroom space for training the implementation stall.  Specify the hours per day needed, number of days, and anticipated dates. If the facilities needed are site-specific, provide this information in Section 4, Implementation Requirements by Site.

4.1.4 Material
^^^^^^^^^^^^^^

This section provides a list of required support materials, such as magnetic tapes and disk packs.

4.2 Personnel
~~~~~~~~~~~~~

This section describes personnel requirements and any known or proposed staffing requirements, if appropriate.  Also describe the training, if any, to be provided for the implementation staff.

4.2.1 Personnel requirements and staffing
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

In this section, describe the number of personnel, length of time needed, types of skills, and skill levels for the staff required during the implementation period.  If particular staff members have been selected or proposed for the implementation, identify them and their roles in the implementation.

4.2.2 Training of implementation staff
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

This section addresses the training, if any, necessary to prepare staff for implementing and maintaining the system; it does not address user training, which is the subject of the Training Plan. Describe the type and amount of training required for each of the following areas, if appropriate, for the system:
 
- System hardware/software installation
- System support
- System maintenance and modification

Present a training curriculum listing the courses that will be provided, a course sequence. and a proposed schedule. If appropriate, identify which courses particular types of staff should attend by job position description.
 
If training will be provided by one or more commercial vendors, identify them, the course name(s), and a brief description of the course content.
 
If the training will be provided by State staff, provide the course name(s) and an outline of the content of each course.  Identify the resources, support materials, and proposed instructors required to teach the course(s).

4.3 Performance monitoring 
~~~~~~~~~~~~~~~~~~~~~~~~~~~

Available in Mattermost Enterprise.

This section describes the performance monitoring tool and techniques and how it will be used to help decide if the implementation is successful: https://docs.mattermost.com/scale/performance-monitoring.html

4.4 Configuration management interface
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This section describes the interactions required with the Configuration Management (CM) representative on CM-related issues, such as when software listings will be distributed, and how to confirm that libraries have been moved from the development to the production environment.

source/getting-started/enterprise-roll-out-checklist.rst METASEP
Enterprise roll out checklist
==============================

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

This checklist is intended to serve as a guide to Enterprises who are rolling out Mattermost to thousands of users. 

Checklist overview
-------------------

  - `Prepare for the roll out`_ 

   - `1. Define the roll out project`_ 
   - `2. Validate essential security and compliance requirements`_ 
   - `3. Create development, staging, and production environments`_ 
   - `4. Configure and customize your Mattermost site`_  
   - `5. Test production performance and redundancy`_ 

  - `Roll out Mattermost`_ 

   - `1. Define your team and channel strategy`_ 
   - `2. Enable key integrations`_ 
   - `3. Prepare for user onboarding`_ 
   - `4. Deploy client apps`_  
   - `5. Roll out to groups of users`_ 
   - `6. Drive adoption`_ 

  - `Review the roll out`_ 

   - `1. Review project charter success metrics`_ 
   - `2. Review and analyze usage`_ 
   - `3. Analyze system performance`_ 
   - `4. Harden security`_  
   - `5. Perform maintenance tasks`_ 
   
Checklist details
-------------------

Prepare for the roll out
~~~~~~~~~~~~~~~~~~~~~~~~

Much of the preparation work is focused on ensuring the environment is deployed and secured prior to onboarding users. 

1. Define the roll out project
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

- Define key stakeholders and project team members

 - Example project team members: Project Manager, Network Administrator, Database Administrator, Corporate Directory Administrator, Security & Compliance Administrator(s), User Support, User Champions, User Trainers
  
- Define use cases and requirements for teams, their workflows and their integrations

 - Resource: https://mattermost.com/blog/27-things-enterprises-can-learn-startups-increase-productivity/
 
- Define success criteria, goals and metrics to measure success

 - Resource: https://docs.mattermost.com/getting-started/implementation-plan.html
  
- Create a Project Charter to document goals, tasks, deliverables, and decisions 

 - Get buy-in from project team members and key stakeholders on the project charter 

2. Validate essential security and compliance requirements
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

- Review Mattermost security features

 - Resource: https://docs.mattermost.com/about/security.html
 
- Determine monitoring requirements

 - Database, network, storage, log integrity
 - Identify fields for log management tools (e.g. Splunk Enterprise event data)

- Determine environment access policies

 - Network access, physical access, group controlled access

- Determine encryption policies

 - Resource: https://docs.mattermost.com/deploy/encryption-options.html
 - Resource: https://docs.mattermost.com/install/transport-encryption.html

- Determine System Administration access policies

 - Identify the list of users or groups who need administrative access for Mattermost System Console, Command Line Tools, and API privileges

- Define and configure authentication policies

 - Resource: https://docs.mattermost.com/about/corporate-directory-integration.html

- Determine requirements for multi-factor authentication

 - Resource: https://docs.mattermost.com/onboard/multi-factor-authentication.html

- Configure and test SSO or Corporate Directory integration (SAML or AD/LDAP)

 - Resource: https://docs.mattermost.com/onboard/sso-saml.html
 - Resource: https://docs.mattermost.com/onboard/ad-ldap.html

- Define your mobile usage policy

 - Resource: https://docs.mattermost.com/deploy/mobile-overview.html

- Evaluate external network access requirements
 
 - The `Mattermost Marketplace <https://mattermost.com/marketplace>`__ is a service hosted by Mattermost that functions as a central place to store the current versions of available Mattermost integrations.  See `Enable Remote Marketplace <https://docs.mattermost.com/configure/configuration-settings.html?#enable-remote-marketplace>`__ documentation for details about required external network access.
 - Mattermost supports external GIF providers. See `GIF Commands <https://docs.mattermost.com/configure/configuration-settings.html?#gif-commands>`__ configuration documentation for details about required external network access.

3. Create development, staging, and production environments
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

- Finalize production environment design basing hardware on expected usage and requirements for high availability

 - Resource: https://docs.mattermost.com/getting-started/architecture-overview.html
 - Resource: https://docs.mattermost.com/deploy/deployment-overview.html 
 - Resource: https://docs.mattermost.com/scale/scaling-for-enterprise.html 
 - Resource: https://docs.mattermost.com/scale/high-availability-cluster.html

- Create development and staging environments

 - Recommend using to test early configurations for database, authentication, file storage, Elasticsearch, prior to setting up high availability and load balancing 
 - Recommend configuring staging to be an identical replication of your production environment

- Create a production environment

 - Install Mattermost

  - Install the number of nodes based on your high availability requirements outlined in your production environment design
  - Recommendation: Use Kubernetes and the Mattermost Operator, with external supported external database and file storage solutions. This will also provide blue/green deployment, rolling upgrades, and canary builds

   - Resource: https://docs.mattermost.com/install/install-kubernetes.html

 - Install and configure database

  - Install the number of read and search replicas based on your high availability requirements outlined in your production environment design

   - Resource: https://docs.mattermost.com/getting-started/architecture-overview.html#database-with-vips

  - (Optional) Set up configuration management via the database instead of a config file for high available environments

   - Resource: https://docs.mattermost.com/configure/configuation-in-mattermost-database.html

 - Install and configure File Storage

  - Resource: https://docs.mattermost.com/deploy/deployment-overview.html#file-store

 - Install and configure proxy or load balancers

  - Note: If running Kubernetes and the Mattermost Operator, proxies will be created automatically. 
  - Add SSL Cert

   - Resource: https://docs.mattermost.com/onboard/ssl-client-certificate.html
   - Resource: https://docs.mattermost.com/scale/high-availability-cluster.html#proxy-server-configuration

  - (Optional) Set up certificate-based authentication (CBA) for user or device-based authentication with a digital certificate

   - Resource: https://docs.mattermost.com/onboard/certificate-based-authentication.html

 - Configure SMTP for email notifications

  - Resource: https://docs.mattermost.com/install/smtp-email-setup.html

 - Set up Elasticsearch (highly recommended if your organization anticipates over two million posts)

  - Resource: https://docs.mattermost.com/scale/elasticsearch.html

- Document network configuration

 - Example: https://docs.mattermost.com/getting-started/architecture-overview.html#reference-architectures 

4. Configure and customize your Mattermost site
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

- Login to Mattermost and access the System Console to connect your environment to Mattermost

 - Resource: https://docs.mattermost.com/configure/configuration-settings.html#environment-variables
 - Upload your valid Enterprise License under Edition and License
 - Ensure site URL is set appropriately for your production, dev and staging environments
 - Add your database configuration to **System Console > Environment > Database**
 - Add your Elasticsearch configuration to **System Console > Environment > Elasticsearch**
 - Add your file storage system configuration to **System Console > Environment > File Storage** 
 - Add your proxy configuration to **System Console > Environment > Image Proxy** 
 - Add your SMTP configuration to **System Console > Environment > SMTP**
 - Enable Push Notifications by adding your server to **System Console > Environment > Push Notification Server**
 - Add your cluster configuration to **System Console > Environment > High Availability**

- Configure your site within the System Console

 - Resource: https://docs.mattermost.com/configure/configuration-settings.html#site-configuration

- Set site access policies including permissions for roles and guest access

 - Permissions Resource: https://docs.mattermost.com/onboard/advanced-permissions.html
 - Guest Access Resource: https://docs.mattermost.com/onboard/guest-accounts.html

5. Test production performance and redundancy
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

- Define and test disaster recovery policy and processes

 - Resource: https://docs.mattermost.com/install/install-kubernetes.html#using-mattermost-operator-functionality
 - Resource: https://docs.mattermost.com/scale/high-availability-cluster.html#upgrade-guide 

- Performance test production environment

 - Load test production environment to verify that it will handle anticipated user load

  - Resource: https://github.com/mattermost/mattermost-load-test

 - Set up Prometheus and Grafana to monitor performance

  - Resource: https://docs.mattermost.com/scale/performance-monitoring.html 

 - Set up alerts in Grafana

  - Resource: https://docs.mattermost.com/scale/performance-monitoring.html 

Roll out Mattermost
~~~~~~~~~~~~~~~~~~~
Now that you have an environment in place, we recommend working through the following items in an iterative process. You may need to cycle through each of these topics multiple times to make adjustments to suit your organization as you onboard groups of users. 

1. Define your team and channel strategy
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

- Determine and create a team structure for your environment

 - Recommendation: Start with fewer teams in your early roll out
 - Resource: https://docs.mattermost.com/messaging/organizing-channels.html 

- Determine and create key channels to support your users. Town Square and Off-Topic are built in channels in every team

 - Recommendation: Add a “Support” channel for your users to escalate questions 

- (Optional) Migrate messages and channels from legacy systems

 - Resource: https://docs.mattermost.com/onboard/migrating-to-mattermost.html

2. Enable key integrations
^^^^^^^^^^^^^^^^^^^^^^^^^^

- Build the list of key integrations and tools used by your teams

 - Resource: https://developers.mattermost.com/integrate/getting-started/

- Define use cases and requirements for plugins, bots, webhooks, slash commands 

 - Resource: https://developers.mattermost.com/integrate/other-integrations/

- Set up key integrations (or migrate from POC environments)

 - Resource: https://mattermost.com/marketplace/

- Understand Mattermost API capabilities

 - Resource: https://api.mattermost.com/

3. Prepare for user onboarding
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

- Onboard champion users 

- Onboard trainers and support team
- Create a training plan

 - Resource: https://academy.mattermost.com/

- Define user escalation and support processes

 - Ensure you have set the site’s support URL to your own support team under **System Console > Site Configuration > Customization**

- Notify users in advance of roll out

 - Sample email: https://docs.mattermost.com/getting-started/welcome-email-to-end-users.html

4. Deploy client apps
^^^^^^^^^^^^^^^^^^^^^

- Roll out desktop app 

 - Resource: https://docs.mattermost.com/install/desktop-app-install.html
 - Resource: https://docs.mattermost.com/deploy/desktop-app.html
 - (Optional) Use the MSI installer to install on Windows machines

  - Resource: https://docs.mattermost.com/install/desktop-msi-installer-and-group-policy-install.html

- Roll out mobile app

 - Resource: https://docs.mattermost.com/deploy/mobile-overview.html
 - (Optional) Use an EMM provider

  - Resource: https://docs.mattermost.com/deploy/deploy-mobile-apps-using-emm-provider.html 

5. Roll out to groups of users
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

- Provision user accounts

 - Resource: https://docs.mattermost.com/onboard/user-provisioning-workflows.html 

- (Optional) Bulk Load users

 - Resource: https://docs.mattermost.com/onboard/bulk-loading-data.html 

- Onboard users to teams and channels

 - Recommendation: Use LDAP Group Sync to automate this process

  - Resource: https://docs.mattermost.com/onboard/ad-ldap-groups-synchronization.html

- Implement your training plan to end users on how to use Mattermost

 - Train on using Mattermost
 - Train on how to use integrations

6. Drive adoption
^^^^^^^^^^^^^^^^^

- Incrementally roll out to additional user groups

 - See “Roll Out to Groups of Users”

- Manage support requests and product requests from your end users

 - Resource: https://mattermost.com/support/ 
 - See the process below for escalating to Mattermost

- Enable additional integrations and plugins to support user workflows

 - Resource: https://integrations.mattermost.com/

- Understand management tools available to support users

 - mmctl Command Line Tool Resource: https://docs.mattermost.com/manage/mmctl-command-line-tool.html
 - Command Line Tools Resource: https://docs.mattermost.com/manage/command-line-tools.html
 - Database Scripts Resource: https://forum.mattermost.com/t/scripts-for-performing-discreet-tasks/13527 

Review the roll out 
~~~~~~~~~~~~~~~~~~~

We recommend that you review your rollout on a cadence that matches your iterative approach to rolling out to users. Below are some areas to consider.  

1. Review project charter success metrics
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

- Perform end-user surveys and measure satisfaction

 - Optional resource within Mattermost: https://mattermost.com/marketplace/matterpoll/

- Verify use case fulfillment from original requirements gathering

- Measure your response time and resolution rate for user support issues

- Identify usage gaps and address or create a plan for addressing

2. Review and analyze usage
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

- Review Project Charter success metrics - identify usage gaps and address or create a plan for addressing

- Monitor site and team statistics

 - Resource: https://docs.mattermost.com/manage/statistics.html 
 - Review: Total posts, total teams, total channels, total group chats, total direct chats, top channels, top teams

- Analyze usage by lines of business and peak usage times

 - Resources: https://forum.mattermost.com/t/scripts-for-performing-discreet-tasks/13527

3. Analyze system performance
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

- Monitor trends in CPU/memory usage

- Review trends in database connections

- Review trends in Go routines 

- Review trends in concurrent sessions 

4. Harden security
^^^^^^^^^^^^^^^^^^

- Harden security controls around the web, desktop, and mobile security

- Harden configuration management 

- Harden network security

 - Identify additional tests and scans
 - (Optional) Enable Compliance Reporting

  - Resource: https://docs.mattermost.com/comply/compliance-export.html

5. Perform maintenance tasks
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- Monitor for security updates (or sign up for email updates)

 - Resource: https://mattermost.com/security-updates/

- Perform the first upgrade

 - Resource: https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html

- Determine upgrade schedule based on Mattermost release schedules and lifecycle

 - Resource: https://docs.mattermost.com/upgrade/release-lifecycle.html

- Run System checks and either address or set address-by date	

source/getting-started/architecture-overview.rst METASEP
Architecture overview
=====================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This page provides an overview of the Mattermost architecture with reference architecture. For a more detailed deployment overview, `check out our deployment wiki <https://docs.mattermost.com/deploy/deployment-overview.html>`__.

.. toctree::
    :maxdepth: 2

Basics
------

At its core, Mattermost is a single-compiled Go binary that is exposed as a Restful JSON web server with Javascript and Go clients. See the Restful API docs `here <https://api.mattermost.com>`__.

It is configured using `config/config.json <https://docs.mattermost.com/configure/configuration-settings.html>`__ and provides the following:

- **Authentication client:** The functionality for users to log into Mattermost via email address and password in Team Edition. Mattermost Professional adds the ability for users to authenticate using Active Directory or LDAP, and Mattermost Enterprise adds the ability to authenticate using SAML SSO providers like ADFS, OneLogin, and Okta.
- **Authentication provider:** Enables the Mattermost server to authenticate to other services like GitLab and Zapier using OAuth 2.0.
- **Notification service:** Sends notifications via SMTP or a Push Notification Service for mobile applications.
- **Data management service:** Connects to supported databases and file storage solutions (local, network-attached storage, Amazon S3, etc), and manages the reading and writing of data between them.

The binary talks to a database, typically MySQL or PostgreSQL, and a filestore.

.. image:: ../images/architecture_basics.png

Push notification service
~~~~~~~~~~~~~~~~~~~~~~~~~

The Mattermost `hosted push notification service <https://docs.mattermost.com/deploy/mobile-hpns.html>`__ can be used to send push notifications to mobile clients. Team Edition users can deploy the service using the Mattermost `test push notification service <https://docs.mattermost.com/deploy/mobile-hpns.html#test-push-notifications-service-tpns>`__ or `host their own push notification service <https://docs.mattermost.com/deploy/mobile-hpns.html#host-your-own-push-proxy-service>`__ and `compile their mobile applications <https://docs.mattermost.com/deploy/build-custom-mobile-apps.html>`__ to use that service.

Proxy
~~~~~

A proxy server is a server (a computer system or an application) that acts as an intermediary for requests from clients seeking resources from other servers. Mattermost recommends using a proxy in front of Mattermost to increase security, performance and the ability to monitor and shape traffic connecting to Mattermost:

- **Security:** A proxy server can manage Secure Socket Layer (TLS/SSL) encryption and set policy on how network traffic will be routed to the Mattermost server.
- **Performance:** In a High Availability configuration, the proxy server balances the network load across multiple Mattermost servers for optimized performance. A hardware proxy with dedicated devices for processing SSL encryption and decryption can also be used to increase performance.
- **Monitoring**: A proxy server can monitor connection traffic and record traffic in standard audit logs that common monitoring tools like Kibana and Splunk can consume and report on. Some of the events that can be captured include file uploads and downloads, which are not tracked by the Mattermost server logging process.

Mattermost provides documentation and support for the `NGINX proxy <https://www.nginx.com/>`__. For information on how to install and configure NGINX for your environment, see `our guide <https://docs.mattermost.com/guides/administrator.html#installing-mattermost>`__. Mattermost also unofficially supports other proxies including `Apache 2 <https://forum.mattermost.com/t/configuring-apache2-as-a-proxy-for-mattermost-server/11938/3>`__.

.. image:: ../images/architecture_with_proxy.png

Communication protocols
~~~~~~~~~~~~~~~~~~~~~~~

There are also communication protocols (HTTPS and WS) that define the type of connection the user makes with the Mattermost server.

**HTTPS Connection** (Secure Hypertext Transfer Protocol)

- HTTPS connections to the Mattermost server render pages and provide access to core platform functionality, but do not include real-time interactivity (which is enabled by WSS connections).
- HTTPS is a secure, encrypted protocol and is highly recommended for production. Unencrypted HTTP connections may be used in initial testing and configuration, but should never be used in a production environment.

**WSS Connection** (Secure WebSocket Protocol)

Secure WebSocket (WSS) connections to the Mattermost Server enable real-time updates and notifications between clients and the server.

If a WSS connection is not available and HTTPS is substituted, the system will appear to work but real-time updates and notifications will not. In this mode of operation, updates will only appear on a page refresh. WSS has a persistent connection to the Mattermost server when a client is connected, while HTTPS has an intermittent connection and only connects to the server when a page or file is requested.

.. image:: ../images/architecture_with_protocol.png

Mattermost services ports
^^^^^^^^^^^^^^^^^^^^^^^^^

The following table lists the Mattermost services ports for Mattermost Server, push proxy, and mobile app clients. System Admins with clients that need to speak to the Mattermost server without a proxy can open specific firewall ports as needed.

**Mattermost Server**

+-------------------------------------------------------------+---------------------------------------+-----------------------------------+-----------+------------+---------------------------------------------------------------+
| Service Name                                                | Config Setting                        | Port (default)                    | Protocol  | Direction  | Info                                                          |
+=============================================================+=======================================+===================================+===========+============+===============================================================+
| HTTP/Websocket                                              | ServiceSettings.ListenAddress         | 8065/80/443 (TLS)                 | TCP       | Inbound    | External (no proxy) / Internal (with proxy)                   |
+-------------------------------------------------------------+---------------------------------------+-----------------------------------+-----------+------------+ Usually this requires port 80 and 443 when running HTTPS.     |
|                                                             |                                       |                                   |           |            |                                                               |
+-------------------------------------------------------------+---------------------------------------+-----------------------------------+-----------+------------+---------------------------------------------------------------+
| Cluster (Gossip)                                            | ClusterSettings.GossipPort            | 8074                              | TCP/UDP   | Inbound    | Internal                                                      |
+-------------------------------------------------------------+---------------------------------------+-----------------------------------+-----------+------------+---------------------------------------------------------------+
| Cluster (Streaming)                                         | ClusterSettings.StreamingPort         | 8075                              | TCP/UDP   | Inbound    | Internal                                                      |
+-------------------------------------------------------------+---------------------------------------+-----------------------------------+-----------+------------+---------------------------------------------------------------+
| Metrics                                                     | MetricsSettings.ListenAddress         | 8067                              | TCP       | Inbound    | External (no proxy) / Internal (with proxy)                   |
+-------------------------------------------------------------+---------------------------------------+-----------------------------------+-----------+------------+---------------------------------------------------------------+
| Database                                                    | SqlSettings.DataSource                | 3306 (MySQL) / 5432 (PostgreSQL)  | TCP       | Outbound   | Usually internal (recommended)                                |
+-------------------------------------------------------------+---------------------------------------+-----------------------------------+-----------+------------+---------------------------------------------------------------+
| LDAP                                                        | LdapSettings.LdapPort                 | 389                               | TCP/UDP   | Outbound   |                                                               |
+-------------------------------------------------------------+---------------------------------------+-----------------------------------+-----------+------------+---------------------------------------------------------------+
| S3 Storage                                                  | FileSettings.AmazonS3Endpoint         | 443 (TLS)                         | TCP       | Outbound   |                                                               |
+-------------------------------------------------------------+---------------------------------------+-----------------------------------+-----------+------------+---------------------------------------------------------------+
| SMTP                                                        | EmailSettings.SMTPPort                | 10025                             | TCP/UDP   | Outbound   |                                                               |
+-------------------------------------------------------------+---------------------------------------+-----------------------------------+-----------+------------+---------------------------------------------------------------+
| Push Notifications                                          | EmailSettings.PushNotificationServer  | 443 (TLS)                         | TCP       | Outbound   |                                                               |
+-------------------------------------------------------------+---------------------------------------+-----------------------------------+-----------+------------+---------------------------------------------------------------+

**Push Proxy**

+---------------+-----------------+-----------------+-----------+------------+----------------------------------------------+
| Service Name  | Config Setting  | Port (default)  | Protocol  | Direction  | Info                                         |
+===============+=================+=================+===========+============+==============================================+
| Push Proxy    | ListenAddress   | 8066            | TCP       | Inbound    | External (no proxy) / Internal (with proxy)  |
+---------------+-----------------+-----------------+-----------+------------+----------------------------------------------+

**Mobile Clients**

In order to receive push notifications, your network must allow traffic on `port 5223 for iOS devices <https://support.apple.com/en-us/HT203609>`__ and `ports 5228-5230 for Android <https://firebase.google.com/docs/cloud-messaging/concept-options#messaging-ports-and-your-firewall>`__.

High Availability and scalability
---------------------------------

Mattermost Enterprise supports:

1. Clustered Mattermost servers, which minimize latency by:

- Storing static assets over a global CDN.
- Deploying multiple Mattermost servers to host API communication closer to the location of end users.

They can also be used to handle scale and failure handoffs in disaster recovery scenarios.

2. Database read replicas, where replicas can be:

- Configured as a redundant backup to the active database server.
- Used to scale up the number of concurrent users.
- Deployed closer to the location of end users, reducing latency.

Moreover, search replicas are also supported to handle search queries.

.. image:: ../images/architecture_high_availability.png

Reference architectures
-----------------------

The following diagrams show the suggested architecture configurations enterprise deployments of Mattermost at different scales. These diagrams are meant as guidelines for typical Mattermost deployments. Hardware and infrastructure requirements can vary significantly based on usage and policies.

There are two versions of each diagram. One is generalized while the other focuses on AWS.

Each generalized diagram represents a full High Availability deployment across all critical components. The proxy, database, file storage, and Elasticsearch layers can be replaced by cloud services. Push proxy can be replaced by the Mattermost `HPNS <https://docs.mattermost.com/mobile/mobile-hpns.html>`__.

Each AWS diagram represents a full High Availability deployment on Amazon Web Services making full use of the available services. Push proxy can optionally be deployed manually in place of HPNS.

5,000 users on Enterprise - General
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. image:: ../images/MattermostDeployment5kUsers.png

5,000 users on Enterprise - AWS
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. image:: ../images/MattermostDeployment5kaws.png

10,000 users on Enterprise - General
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. image:: ../images/MattermostDeployment10kUsers.png

10,000 users on Enterprise - AWS
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. image:: ../images/MattermostDeployment10kaws.png

25,000 users on Enterprise - General
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. image:: ../images/MattermostDeployment25kUsers.png

25,000 users on Enterprise - AWS
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. image:: ../images/MattermostDeployment25kaws.png

50,000 users on Enterprise - AWS
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. image:: ../images/MattermostDeployment50kaws.png

Database with VIPs
~~~~~~~~~~~~~~~~~~

The following diagram is a suggested configuration for Highly-Available databases through virtual IPs.

.. image:: ../images/DatabasewithVIPs.png

Load testing
~~~~~~~~~~~~

Mattermost Enterprise Edition was `load tested <https://github.com/mattermost/mattermost-load-test>`__ with 60,000 concurrent active users with:

- Six Mattermost servers: m4.2xlarge (8 vCPU, 32 GB RAM)
- One MySQL database server with five read replicas: db.r4.2xlarge (8 vCPU, 61 GB RAM)
- Three load test runners (for running the loadtest)
- Three NGINX proxies

source/getting-started/admin-onboarding-tasks.rst METASEP
Administrator onboarding tasks
==============================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This document provides instructions for common administrator tasks, including some recommendations on tasks to prepare your Mattermost deployment to onboard users.

Getting started tasks
---------------------

1. Once you've installed and deployed Mattermost, ensure all configuration settings are appropriately set under **System Console > Environment** including:

 - Web server
 - Database
 - File storage
 - SMTP
 - Push Notification server
  
These settings can also be set in the ``config.json`` file. Please see our `configuration settings documentation <https://docs.mattermost.com/configure/configuration-settings.html>`__ for a full listing of all configuration settings.

2. Adjust settings under **System Console > Site Configuration** to brand and customize how users will interact with the site. Be sure to update the Support Email and Help Link in Mattermost under **System Console > Site Configuration > Customization** to provide your users a resource for password resets or questions on their Mattermost account.

 - The Support email is used on email notifications and during tutorial for users to ask support questions.
 - The Help Link is on the Mattermost login page, sign-up pages, and Main Menu and can be used to to link to your help desk ticketing system.
 
These settings can also be set in the ``config.json`` file.  Please see our `configuration settings documentation <https://docs.mattermost.com/configure/configuration-settings.html>`__ for a full listing of all configuration settings.

3. Begin to onboard users by enabling account creation or by connecting an authentication service to assist with user provisioning.

- Users can be pre-provisioned with migration and bulk loading data processes based on prior collaboration systems. Please see our `migration guide <https://docs.mattermost.com/onboard/migrating-to-mattermost.html#migration-guide>`_ and `bulk loading documentation <https://docs.mattermost.com/onboard/bulk-loading-data.html>`_ for additional details.
- `AD/LDAP authentication <https://docs.mattermost.com/onboard/ad-ldap.html#active-directory-ldap-setup>`_ and `SAML authentication <https://docs.mattermost.com/onboard/sso-saml.html>`_ are available for some subscription plans, providing identity management, single sign-on, and automatic account provisioning.

If your organization requires more structure and project management artifacts for the implementation of Mattermost, please see our `Enterprise roll out checklist <https://docs.mattermost.com/getting-started/enterprise-roll-out-checklist.html>`__.

Important administration notes 
------------------------------

**DO NOT manipulate the Mattermost database**

- In particular, DO NOT manually delete data from the database directly. Mattermost is designed as a continuous archive and cannot be supported after manual manipulation.
- If you need to permanently delete a team or user, use the `mattermost user delete <https://docs.mattermost.com/manage/command-line-tools.html#mattermost-user-delete>`__ CLI command, or use the `mmctl user delete <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-user-delete>`__ command.

Common tasks
------------

**Creating System Admin account from the command line**

- If the System Admin leaves the organization or is otherwise unavailable, you can use the command line interface to assign the *system_admin* role to an existing user. In the ``/opt/mattermost`` directory, type ``sudo -u mattermost bin/mattermost roles system_admin {user-name}``, where *{user-name}* is the username of the person with the new role. For more information about using the command line interface, see `Command Line Tools <https://docs.mattermost.com/manage/command-line-tools.html>`__.
- The user needs to log out and log back in before the *system_admin* role is applied.
  
**Migrating to AD/LDAP or SAML from email-based authentication**

- If you have Professional or Enterprise plans, you can migrate from email authentication to Active Directory/LDAP or to SAML Single Sign-on. To set up Active Directory/LDAP, see `Active Directory/LDAP Setup <https://docs.mattermost.com/onboard/ad-ldap.html#active-directory-ldap-setup-e10-e20>`_. To set up SAML Single Sign-on, see `SAML Single-Sign-On <https://docs.mattermost.com/onboard/sso-saml.html>`_.
- After the new authentication method is enabled, existing users cannot use the new method until they go to **Settings > Security > Sign-in method** and select **Switch to using AD/LDAP** or **Switch to using SAML Single Sign-on**. After they have switched, they can no longer use their email and password to log in.  
  
**Deactivating a user**

- System Admins can go to **System Console > Users** for a list of all users on the server. The list can be searched and filtered to make finding the user easier. Click the user's role and in the menu that opens, click **Deactivate**.
- To preserve audit history, users are typically never deleted from the system. If permanently deleting a user is necessary (e.g. for the purposes of `GDPR <https://gdpr-info.eu/>`__), an `mmctl command <https://docs.mattermost.com/manage/mmctl-command-line-tool.html>`__ or a `CLI command <https://docs.mattermost.com/manage/command-line-tools.html>`_ can be used to do so.
- Note that AD/LDAP user accounts cannot be deactivated from Mattermost; they must be deactivated from your Active Directory.

**Checking for a valid license in Enterprise Edition without logging in**

- Open the log file ``mattermost.log``. It's usually in the ``mattermost/logs/`` directory but might be elsewhere on your system. Find the last occurrence of a log entry that starts with the text ``[INFO] License key``. If the license key is valid, the complete line should be similar to the following example:

.. code-block:: text

  [2017/05/19 16:51:40 UTC] [INFO] License key valid unlocking enterprise features.
      
User experience optimizations
-----------------------------

We highly recommend the following best practices, configuration options, and features for an optimal Mattermost user experience.

**1. Upgrade your Mattermost server**

When you upgrade your Mattermost server frequently, your users can access new features, improved user experiences, bug fixes, security fixes, and mobile app compatibility.

Mattermost releases regular updates to `Mattermost Team Edition <https://mattermost.com/>`_ and `Mattermost Enterprise Edition <https://mattermost.com/pricing-self-managed/>`_. The `Mattermost Changelog <https://docs.mattermost.com/install/self-managed-changelog.html>`_ provides all information about changes in each version.

Upgrading your Mattermost server only takes a few minutes. See the `Upgrade Guide <https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html>`__ for step-by-step instructions.

**2. Install plugins**

You can enable plugins and integrations to connect your team's workflows and toolsets into Mattermost. Plugins and integrations customize and extend the Mattermost platform.

**Install and manage plugins**

To enable and manage plugins, go to **System Console > Plugins**. Next, install plugins from **Product menu > Marketplace**. See the `Marketplace  <https://developers.mattermost.com/integrate/admin-guide/admin-plugins-beta/#marketplace>`__ documentation for details.

Consider installing and enabling the following productivity plugins for your users:   
  - Enable audio/video calling and screen sharing with `Jitsi <https://mattermost.com/blog/mattermost-and-jitsi/>`__ or `Zoom <https://mattermost.com/marketplace/zoom-plugin/>`__.
  - Create polls with `Matterpoll <https://mattermost.com/marketplace/matterpoll/>`__.
  - Share GIFs with `GIF Commands <https://mattermost.com/marketplace/giphy-plugin/>`__.
  - Create and share memes with `Memes <https://mattermost.com/marketplace/memes-plugin/>`__.
  - Set personal reminders with `Remind <https://mattermost.com/marketplace/remind-plugin/>`__.
  - Create and share to do items with `Todo <https://github.com/mattermost/mattermost-plugin-todo>`__.
  - Customize welcome messages for new users with `WelcomeBot <https://mattermost.com/marketplace/welcomebot-plugin/>`__.

Explore all plugins and integrations available in the `Mattermost Marketplace <https://mattermost.com/marketplace/>`__.

**Enable and manage integrations**

To enable integrations such as webhooks, slash commands, OAuth2.0, and bots, to go **System Console > Integrations**. More information on these integrations can be found `here <https://developers.mattermost.com/integrate/other-integrations/>`_. 

**3. Enable automatically extended sessions**

Keep your desktop and mobile users logged in and `extend user sessions automatically <https://mattermost.com/blog/session-expiry-experience/>`__ by setting **System Console > Sessions > Extend session length with activity** to **true**. See the `Extend session length with activity <https://docs.mattermost.com/configure/configuration-settings.html#extend-session-length-with-activity>`__ configuration settings documentation for details.

**4. Enable full content push notifications**

Enable push notifications on mobile devices to deliver messages in real time by setting **System Console > Push Notification Server > Enable Push Notifications** to **Use TPNS**. See the `Push notification server <https://docs.mattermost.com/configure/configuration-settings.html#push-notification-server>`__ configuration settings documentation for details.

Enable full content push notifications, including the sender’s name, the channel name, and the message text, by setting **System Console > Notifications > Push Notification Contents** to **Full message contents**. See the `Push notification contents <https://docs.mattermost.com/configure/configuration-settings.html#push-notification-contents>`__ configuration settings documentation for details.

.. note::

  - Mattermost subscription plans allow you to `enable HPNS <https://docs.mattermost.com/deploy/mobile-hpns.html#hosted-push-notifications-service-hpns>`__ that includes production-level uptime SLAs.

  - Mattermost Enterprise customers can `enable ID-Only push notifications <https://docs.mattermost.com/configure/configuration-settings.html#push-notification-contents>`__ so push notification content is not passed through Apple Push Notification Service (APNS) or Google Firebase Cloud Messaging (FCM) before reaching the device. The ID-only push notification setting `offers a high level of privacy <https://mattermost.com/blog/id-only-push-notifications/>`__ while allowing team members to benefit from mobile push notifications.

**5. Enable custom emoji**

`Emojis <https://docs.mattermost.com/messaging/using-emoji.html>`__ enable users to express concepts such as emotions and physical gestures in messages. Enable the emoji picker by setting **System Console > Emoji > Enable Emoji Picker** to **true**. See the `Enable emoji picker <https://docs.mattermost.com/configure/configuration-settings.html#enable-emoji-picker>`__ configuration settings documentation for details.

Empower users to create and share their own custom emojis by setting **System Console > Emoji > Enable Custom Emoji** to **true**. See the `Enable custom emoji <https://docs.mattermost.com/configure/configuration-settings.html#enable-custom-emoji>`__ configuration settings documentation for details.

**6. Enable GIF picker**

GIFs are animated images that can make messaging more fun and engaging. Enable users to access the Mattermost GIF picker from the message draft area by setting **System Console > GIF (Beta) > Enable GIF Picker** to **true**. See the `Enable GIF picker <https://docs.mattermost.com/configure/configuration-settings.html#enable-gif-picker>`__ configuration settings documentation for details.

**7. Enable link previews**

Link previews provide a visual glimpse of relevant content for links shared in messages. Enable link previews by setting **System Console > Posts > Enable Link Previews** to **true**. See the `Enable link previews <https://docs.mattermost.com/configure/configuration-settings.html#enable-link-previews>`__ configuration settings documentation for details.
 
**8. Enable batched email notifications**

Email notifications can be batched together so users don’t get overwhelmed with too many emails.

Enable email notifications first by setting **System Console > Notifications > Enable Email Notifications** to **true**. See the `Enable email notifications <https://docs.mattermost.com/configure/configuration-settings.html#enable-email-notifications>`__ configuration settings documentation for details. Note that email notifications require an `SMTP email server <https://docs.mattermost.com/configure/configuration-settings.html#smtp-email-server>`__ to be configured.

Then, enable batched email notifications by setting **System Console > Notifications > Enable Email Batching** to **true**. See the `Enable email batching <https://docs.mattermost.com/configure/configuration-settings.html#enable-email-batching>`__ configuration settings documentation for details. Note that email batching is not available if you are running your deployment in `High Availability <https://docs.mattermost.com/scale/high-availability-cluster.html>`__.

**9. Enable Elasticsearch**

Mattermost Enterprise customers can enable `Elasticsearch <https://docs.mattermost.com/scale/elasticsearch.html>`__ for optimized search performance at enterprise-scale. Elasticsearch solves many known issues with full text database search, such as dots, dashes, and email addresses returning unexpected results.

Enable Elasticsearch by setting **System Console > Elasticsearch > Enable Indexing** to **true**. See the `Elasticsearch <https://docs.mattermost.com/configure/configuration-settings.html#elasticsearch>`__ configuration settings documentation for details. Enabling Elasticsearch requires `setting up an Elasticsearch server <https://docs.mattermost.com/scale/elasticsearch.html#setting-up-an-elasticsearch-server>`__.

source/deploy/use-prebuilt-mobile-apps.rst METASEP
Using Mattermost's pre-built mobile apps
========================================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

We strongly recommend using Mattermost’s pre-built mobile app. This approach is recommended for all Mattermost customers.

Deployment options
------------------

When you decide to use the pre-built Mattermost mobile apps, you have two ways to distribute them: ask your users to download them, or distribute them through an Enterprise Mobile Management (EMM) provider.
  
Using public app stores
~~~~~~~~~~~~~~~~~~~~~~~

Your users can download the Mattermost mobile app as an `iOS app <https://apps.apple.com/us/app/mattermost/id1257222717>`__ or an `Android app <https://play.google.com/store/apps/details?id=com.mattermost.rn>`__ from a public app store. When users launch the Mattermost Mobile App, they must enter the address of your Mattermost server to connect their mobile app to the server.

Using an EMM provider
~~~~~~~~~~~~~~~~~~~~~

See our `Deploying Using an EMM Provider <https://docs.mattermost.com/deploy/deploy-mobile-apps-using-emm-provider.html>`__ documentation to learn more about deploying Mattermost mobile apps through an EMM provider.

Setting up push notifications
-----------------------------

See our `Mobile Push Notifications <https://docs.mattermost.com/deploy/mobile-hpns.html>`__ documentation to learn about setting up push notifications for Mattermost pre-built mobile apps.

Success! Your public app store deployment is complete
-----------------------------------------------------

If you don't need the additional security provided via an EMM provider, your deployment is complete! Feel free to point your users to our `Mattermost Channels <https://docs.mattermost.com/guides/channels.html>`__ product documentation to learn more about using Mattermost Channels.

source/deploy/mobile-troubleshoot.rst METASEP
Troubleshooting mobile apps
===========================

.. contents::
  :backlinks: top
  :local:

I keep getting a message "Cannot connect to the server. Please check your server URL and internet connection."
--------------------------------------------------------------------------------------------------------------

First, confirm that your server URL has no typos and that it includes ``http://`` or ``https://`` according to the server deployment configuration.

If the server URL is correct, there could be an issue with the SSL certificate configuration.

To check your SSL certificate set up, test it by visiting a site such as `SSL Labs <https://www.ssllabs.com/ssltest/index.html>`__. If there’s an error about the missing chain or certificate path, there is likely an intermediate certificate missing that needs to be included.

Please note that the apps cannot connect to servers with self-signed certificates, consider using `Let's Encrypt <https://docs.mattermost.com/install/config-ssl-http2-nginx.html>`__ instead.

Login with ADFS/Office365 is not working
----------------------------------------

In line with Microsoft guidance we recommend `configuring intranet forms-based authentication for devices that do not support WIA <https://docs.microsoft.com/en-us/windows-server/identity/ad-fs/operations/configure-intranet-forms-based-authentication-for-devices-that-do-not-support-wia>`_. 

I see a “Connecting…” bar that does not go away
-----------------------------------------------

If your app is working properly, you should see a grey “Connecting…” bar that clears or says “Connected” after the app reconnects.

If you are seeing this message all the time, and your internet connection seems fine, ask your server administrator if the server uses NGINX or another webserver as a reverse proxy. If so, they should check that it is configured correctly for `supporting the websocket connection for APIv4 endpoints <https://docs.mattermost.com/install/install-ubuntu-1604.html#configuring-nginx-as-a-proxy-for-mattermost-server>`__.

I’m not receiving push notifications on my device
-------------------------------------------------

Please see our documentation on :doc:`troubleshooting push notifications <mobile-troubleshoot-notifications>`.

All my outbound connections need to go through a proxy. How can I connect to the Mattermost Hosted Push Notification Service?
-----------------------------------------------------------------------------------------------------------------------------

You can set up an internal server to proxy the connection out of their network to the Mattermost Hosted Push Notification Service (HPNS) by following the steps below:

1. Make sure your proxy server is properly configured to support SSL. Confirm it works by checking the URL at https://www.digicert.com/help/.
2. Setup a proxy to forward requests to ``https://push.mattermost.com``.
3. In Mattermost set **System Console** > **Notification Settings** > **Mobile Push** > **Enable Push Notifications** in prior versions or **System Console > Environment > Push Notification Server > Enable Push Notifications** in versions after 5.12 to "Manually enter Push Notification Service location"
4. Enter the URL of your proxy in the **Push Notification Server** field.

.. Note:: Depending on how your proxy is configured you may need to add a port number and create a URL like ``https://push.internalproxy.com:8000`` mapped to ``https://push.mattermost.com``

Build gets stuck at ``bundleReleaseJsAndAssets``
------------------------------------------------

As a workaround, you can bundle the ``js`` manually first with

.. code-block:: none

  react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res/

and then ignore the gradle task with

.. code-block:: none

  ./gradlew assembleRelease -x bundleReleaseJsAndAssets

No image previews available in the mobile app
---------------------------------------------

This can happen if the server running Mattermost has its mime types not set up correctly.
A server running Linux has this file located in ``/etc/mime.types``. This might vary depending on your specific OS and distribution.

Some distributions also ship without ``mailcap`` which can result in missing or incorrectly configured mime types.

Messages with emojis aren't being sent from the Mobile App
----------------------------------------------------------

This can occur if the server running Mattermost is configured with an incorrect character set. To resolve this issue, in the ``config.json`` file under ``SqlSettings``, ensure that the ``DataSource`` key is configured correctly, then restart the Mattermost server. 

For example:

.. code-block:: none

  "SqlSettings": {
      "DataSource": "<user:pass>@<servername>/mattermost?charset=utf8mb4,utf8",
      [...]
    }

See our `Configuration Settings <https://docs.mattermost.com/configure/configuration-settings.html#data-source>`__ documentation for details on configuring the connection string to the master database.

None of these solve my problem!
-------------------------------

For more troubleshooting help, `open a new topic in our forums <https://forum.mattermost.com/c/trouble-shoot>`__ with steps to reproduce your issue. If you're an Enterprise Edition subscriber, you may open a support ticket in the `Enterprise Edition Support portal <https://mattermost.zendesk.com/hc/en-us/requests/new>`_.

To help us narrow down whether it’s a server configuration issue, device specific issue, or an issue with the app, please try the following things and include the results in your support request:

**Connect to another server**

1. Create an account at https://demo.mattermost.com
2. Erase your mobile application and reinstall it
3. In your mobile app, enter the server URL https://demo.mattermost.com and then your login credentials to see if the connection is working

**Connect with another device**

If you have another mobile device available, try connecting with that to see if your issue still reproduces.

If you don’t have another device available, check with other teammates to see if they are having the same issue.

source/deploy/mobile-troubleshoot-notifications.rst METASEP
:orphan:

Troubleshooting push notifications
==================================

If you did not receive a push notification when :doc:`testing push notifications <mobile-testing-notifications>`, use the following procedure to troubleshoot:

1. In **System Console > Environment > Logging > File Log Level**, select **DEBUG** in order to watch for push notifications in the server log.

2. Delete your mobile application, and reinstall it.

3. Log in with "Account A" and **confirm you want to receive push notifications** when prompted by the mobile app.

4. Go to **Profile** > **Security** > **View and Logout of Active Sessions** to confirm that there is a session for the native mobile app matching your login time.

5. Repeat the procedure for :doc:`testing push notifications <mobile-testing-notifications>`.

6. If no push notification displays, go to **System Console** > **Server Logs**, then select **Reload**. Look at the bottom of the logs for a message similar to:

``[2016/04/21 03:16:44 UTC] [DEBG] Sending push notification to 608xyz0... wi msg of '@accountb: Hello'``

  - If the log message displays, it means a message was sent to the HPNS server and was not received by your mobile app. Please contact support@mattermost.com with the subject "HPNS issue" for help from Mattermost's Support team.
  - If the log message does not display, it means no mobile push notification was sent to “Account A”. Please repeat the process starting at step 2 and double-check each step.

.. important::

  To conserve disk space, once your push notification issue is resolved, go to  **System Console > Environment > Logging > File Log Level**, then select **ERROR** to switch your logging detail level from **DEBUG** to **Errors Only**.

If push notifications are not being delivered on the mobile device, confirm that you're logged in to the **Native** mobile app session through **Profile > Security > View and Log Out of Active Sessions**. Otherwise, the `DeviceId` won't get registered in the `Sessions` table and notifications won't be delivered.
source/deploy/mobile-testing-notifications.rst METASEP
Testing push notifications
==========================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Make sure to configure push notifications for your `pre-built mobile apps <https://docs.mattermost.com/deploy/use-prebuilt-mobile-apps.html>`__, or for `your custom built mobile apps <https://docs.mattermost.com/deploy/build-custom-mobile-apps.html>`__. 

Then use the following instructions to confirm push notifications are working properly.

1. Log in to your mobile app with an account on your Mattermost Server, which we’ll refer to as “Account A”.

2. (iOS) When the app asks whether you wish to receive notifications, **confirm you want to receive notifications**.

  .. image:: ../images/mobile_push_prompt.png
    :alt: Mattermost prompts you to confirm whether you want to allow mobile push notifications. To test mobile push notifications, you must select Allow.
    :width: 300 px

3. Confirm push notifications are enabled for “Account A”.

  A. Go to the notification settings menu in the mobile app.

  .. image:: ../images/mobile_notification_settings.png
    :alt: Ensure push notifications are enabled by selecting the Settings icon located in the top-right corner of the screen.

  B. Check that the mobile push notifications are set to send.

  .. image:: ../images/mobile_push_send_for.png
    :alt: Select the type of activity you want push notifications for by going to Settings > Notifications > Mobile Push Notifications.
    :width: 300 px

  .. image:: ../images/mobile_push_send_when.png
    :alt: Select when you want push notifications by going to Settings > Notifications > Mobile Push Notifications for all Mattermost activity or mentions and direct messages only.
    :width: 300 px

4. Have “Account A” put the app to background or close the app.

5. Using a browser, log in to “Account B” on the same Mattermost Server.

6. Open a direct message with “Account A”, and send a message.

7. A push notification with the message should appear on the mobile device of “Account A”. If the push notification does not appear, follow :doc:`troubleshooting steps <mobile-troubleshoot-notifications>` to look for issues.

source/deploy/mobile-overview.rst METASEP
Deploy Mattermost mobile apps
=============================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

This documentation provides foundational information you need when developing a plan for an enterprise mobile application deployment. It’s intended for business leaders, system administrators, and mobile app developers responsible for deploying Mattermost in their organization.

This documentation provides information to help you: 

- Determine the ideal mobile deployment model for your organization.
- Understand what’s required to build your own Mattermost Mobile Apps.
- Deploy Mattermost mobile apps.

.. note::

  - Mattermost Cloud customers must use Mattermost pre-built public apps for mobile deployment. 
  - Some features described in this guide are available only in Mattermost Enterprise Edition.

Decision summary
----------------

When planning for a mobile app deployment, you have two important decisions to make: 

- What app will you deploy - a pre-built app or your own custom build?
- How will you deploy it?

Mattermost provides official mobile apps through public app stores including the `Apple App Store <https://www.apple.com/ca/app-store>`__ and the `Google Play Store <https://play.google.com/store>`__. These apps are referred to throughout this documentation as Mattermost's pre-built mobile apps. Using Mattermost's pre-built apps is the easiest and fastest approach since your users can download the apps from public app stores, or you can use an EMM provider to maintain full control over the distribution process or enforce or restrict specific security policies. See `Using Mattermost’s Pre-Built Apps <https://docs.mattermost.com/deploy/use-prebuilt-mobile-apps.html>`__ to learn more about using Mattermost pre-built apps.

If you want to control the app's look and feel, or host your own push proxy server, you can build your own mobile apps and manage your own app distribution. See `Building and Distributing Your Own Custom Mattermost Mobile Apps <https://docs.mattermost.com/deploy/build-custom-mobile-apps.html>`__ to learn more about working with custom built apps.

The following table summarizes the key differences between these two approaches:

+----------------------------------------------------------------+---------------------------------------------------------------------+
| **Use Pre-Built Apps (Highly Recommended)**                    | **Build Custom Apps (Not Easy)**                                    |
+================================================================+=====================================================================+
| **Recommended for:**                                           | **Recommended for:**                                                |
|                                                                |                                                                     |
| Self-supporting teams who need standard features.              | Teams that need to customize the app, or prefer to host their own   |
|                                                                | push proxy server.                                                  |
+----------------------------------------------------------------+---------------------------------------------------------------------+
| **Benefits:**                                                  | **Benefits:**                                                       |
|                                                                |                                                                     |  
| - Easiest way to deploy Mattermost Apps.                       | You maintain full control over the look and feel of your mobile     |
| - Test push notifications using Mattermost mobile push proxy   | app.                                                                |
|   options.                                                     |                                                                     |
| - Apps update automatically with the latest features           | **Limitations:**                                                    |
|   enhancements, and security updates.                          |                                                                     |
|                                                                | - Requires development knowledge and resources to maintain mobile   |
| **Limitations:**                                               |   app code as Mattermost releases new product updates.              |
|                                                                | - Must deploy your own push proxy server.                           |
| - Can’t white-label Mattermost Mobile Apps.                    |                                                                     |
| - Can’t deploy your own push proxy server.                     |                                                                     |  
+----------------------------------------------------------------+---------------------------------------------------------------------+

Technical and Security Requirements
-----------------------------------

See our `Supported Devices/Mobile Device Requirements <https://docs.mattermost.com/install/software-hardware-requirements.html#mobile-apps>`__ documentation for basic mobile device requirements, and our `Supported Mattermost Server Versions <https://docs.mattermost.com/deploy/mobile-app-changelog.html>`__ documentation for details on Mattermost Server minimum requirements. 

We recommend running the latest version of the Mattermost Server and the Mattermost Push Notification Service (MPNS) as they contain the most recent features and applicable security updates. 

If this isn't possible, we encourage you to be on the most recent Extended Support Release version of Mattermost Server. This release has critical feature updates that will ensure compatibility in a number of areas, including the Mattermost Push Notification Service (MPNS).

.. important::
  Not all provided updates are compatible with all previous versions of Mattermost. Updating only Mattermost Mobile Apps or updating the Mobile apps before updating Mattermost Server can result in compatibility issues.

You should also start thinking about technical and security requirements in parallel with an implementation plan. Feel free to use our `implementation plan template <https://docs.mattermost.com/getting-started/implementation_plan.html>`__ available in the Mattermost documentation. 

Also, start engaging your technical and security teams with the following questions:

- Are there any known security or access requirements?
- Is an `Enterprise Mobile Management (EMM) Provider <https://docs.mattermost.com/deploy/deploy-mobile-apps-using-emm-provider.html>`__ needed?
- Is a `VPN connection required <https://docs.mattermost.com/deploy/consider-mobile-vpn-options.html>`__?

Asking questions like these requires you to pause before jumping into your Mattermost mobile project. However, it will help ensure you see a return on your investment.

Getting Help
------------

If you need assistance, please reach out using one or more of the following methods.

- **Community:** Join our Mattermost community and post your specific questions in the `Developers: Mobile <https://community-daily.mattermost.com/core/channels/native-mobile-apps>`__ channel.
- **Documentation:** We link to a lot of mobile-specific documentation within this guide, but we encourage you to visit all of our `product documentation <https://docs.mattermost.com/>`__.
- **Forums:** For more troubleshooting help, `open a new topic in our forum <https://forum.mattermost.com/c/trouble-shoot>`__ and include the steps to reproduce your issue so we can test on our side.
- **GitHub:** `Visit us on GitHub <https://github.com/mattermost/>`__ to create issues in any of our repositories.
- **Enterprise Support:** If you're a Mattermost Enterprise Edition subscriber, open a support ticket in the `Enterprise Edition Support portal <https://support.mattermost.com/>`__.

source/deploy/mobile-hpns.rst METASEP
Mobile push notifications
=========================

A push proxy is a key technology behind notification transmission that enables notifications between the server and a Mobile app. See our `Mobile Apps FAQ documentation <https://docs.mattermost.com/deploy/mobile-faq.html#how-do-push-notifications-work>`__ to learn more about how push notifications work.

Mattermost offers a `Mattermost Push Notification Service (MPNS) <https://docs.mattermost.com/deploy/deployment-overview.html>`__ for Team Edition, Cloud, and Enterprise deployments.

Test Push Notifications Service (TPNS)
--------------------------------------

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Self-hosted customers can use Mattermost's free, basic Test Push Notifications Service (TPNS).

.. note::
  - The TPNS isn’t recommended for use in production environments, and doesn’t offer production-level update service level agreements (SLAs). 
  - The TPNS isn't available for Mattermost Cloud deployments.

Enable TPNS
~~~~~~~~~~~

To use the Mattermost TPNS, go to **System Console > Environment > Push Notification Server > Enable Push Notifications**, then select **Use TPNS connection to send notifications to iOS and Android apps**.

See our `Testing Push Notifications <https://docs.mattermost.com/deploy/mobile-testing-notifications.html>`__ documentation to learn more about testing mobile push notifications.

.. note::
  - The TPNS only works with the pre-built mobile apps that Mattermost deploys through the Apple App Store and Google Play Store. If you have built your own mobile apps, you must also `host your own Mattermost push proxy service <#host-your-own-push-proxy-service>`_.  
  - You must ensure that the push proxy can be reached on the correct port. For TPNS, it's port 80 from the Mattermost server.

Hosted Push Notifications Service (HPNS)
----------------------------------------

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

Mattermost Enterprise, Professional, and Cloud customers can use Mattermost's Hosted Push Notification Service (HPNS). The HPNS offers:

- Access to a publicly-hosted Mattermost Push Notification Service (MPNS) `available on GitHub. <https://github.com/mattermost/mattermost-push-proxy>`__
- An explicit `privacy policy <https://mattermost.com/data-processing-addendum/>`__ for the contents of unencrypted messages.
- Encrypted TLS connections:

  - Between HPNS and Apple Push Notification Services 
  - Between HPNS and Google’s Firebase Cloud Messaging Service 
  - HPNS and your Mattermost Server
- Production-level uptime expectations.
- Out-of-box configuration for new servers means nothing is required to enable HPNS for new deployments. HPNS can be `enabled for existing deployments <#enable-hpns-for-existing-deployments>`_.

.. note:: 
  - The HPNS only works with pre-built apps Mattermost deploys through the Apple App Store and Google Play Store. If you build your own mobile apps, you must also `host your own Mattermost push proxy server <#id4>`_.
  - You must ensure that the push proxy can be reached on the correct port. For HPNS, it's port 443 from the Mattermost server.
  - Mattermost doesn't store any notification data. Any data being stored is at the server level only, such as the ``device_id``, since the HPNS needs to know which device the notification must be sent to.

Enable HPNS for existing deployments
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Configuring your existing Mattermost instance to use the Mattermost HPNS is a single, one-time step. 

1. Follow the instructions to `install or upgrade to Enterprise Edition <https://docs.mattermost.com/install/ee-install.html>`__.

2. Go to **System Console > Environment > Push Notification Server**.

3. Set **Enable Push Notifications** to **Use HPNS connection with uptime SLA to send notifications to iOS and Android apps**. Note that this option is only available in Mattermost Enterprise Edition.

4. Specify the URL of the **Push Notification Server** based on your Mattermost edition.

- Mattermost Team Edition: ``https://push-test.mattermost.com``
- Mattermost Enterprise Edition: ``https://push.mattermost.com``

.. image:: ../images/mobile_hpns.png
   :alt: Configure a licensed self-hosted Mattermost deployment to use the Mattermost Hosted Push Notification Server (HPNS) in the System Console by going to Environment > Push Notification Server. Select the HPNS option, then specify the server URL.
   
5. Review the Mattermost Terms of Service and the Mattermost Privacy Policy, then select the box "I understand and accept the Mattermost Hosted Push Notification Service Terms of Service and Privacy Policy" to acknowledge that you understand the terms of use.

.. note:: 

  The default **Push Notification Server** address is ``https://push.mattermost.com``. The server is hosted inside the United States. Mattermost also offers a push notification server hosted in Germany. If you wish to use the server in Germany, update the **Push Notification Server** address to ``https://hpns-de.mattermost.com/``.

6. Select **Save**

After setup, test push notifications to confirm they are working.

ID-only push notifications
~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-cloud-selfhosted.rst
  :start-after: :nosearch:

Mattermost Enterprise and Cloud customers can limit the data sent to Apple and Google through a configuration setting. 

When enabled, a message containing only an ID is transmitted. Once the mobile client receives this ID, the message contents are loaded from the server, and are never transmitted through the Apple Push Notification Service (APNS) or Firebase Cloud Messaging (FCM). The contents of the message also won't reach the `Mattermost Push Notification Service (MPNS) <https://docs.mattermost.com/deploy/deployment-overview.html#push-notification-service>`__.

See our `Configuration Settings <https://docs.mattermost.com/configure/configuration-settings.html#push-notification-contents>`__ documentation to learn more about the ID-only push notifications configuration setting. See our `Mobile Apps FAQ documentation <https://docs.mattermost.com/deploy/mobile-faq.html#how-can-i-use-id-only-push-notifications-to-protect-notification-content-from-being-exposed-to-third-party-services>`__ for details on using ID-only push notifications for data privacy.

Host your own push proxy service
--------------------------------

Customers building their own custom mobile apps must host their own push proxy service using one of the following methods:

- Compile your own MPNS from the `open source repository <https://github.com/mattermost/mattermost-push-proxy>`__.
- Use the `pre-compiled version of MPNS available on GitHub <https://github.com/mattermost/mattermost-push-proxy/releases>`__. 

See our `developer documentation <https://developers.mattermost.com/contribute/mobile/push-notifications/service/>`__ on working with the Mattermost Push Notification Service.

Enable MPNS
~~~~~~~~~~~

1. Go to **System Console > Environment > Push Notification Server**.
2. Under **Enable Push Notifications**, select **Manually enter Push Notification Service location**.
3. Enter the location of your MPNS in the **Push Notification Server** field, then select **Save**.
4. (Optional) Customize mobile push notification contents. Most deployments choose to include the full message content sent in the notification payload.

  a. Go to **System Console > Site Configuration > Notifications**.
  b. Under **Push Notification Contents**, select the type of information to include in push notifications, then select **Save**.

.. note::

   - We recommend that your instance of the MPNS be behind your firewall inside your private network, or in your DMZ, in a way that the Mattermost server can access it.
   - The MPNS does not connect with Mattermost mobile apps directly; the MPNS parses and forwards push notifications from the Mattermost server to the Apple Push Notification Service (APNS) or the Firebase Cloud Messaging (FCM).
   - The MPNS must be able to communicate with the Apple Push Notification Service over HTTP/2. If an outbound proxy appliance is deployed between the MPNS and APNS, ensure it supports HTTP/2.
     - Ensure you use encrypted TLS connections between your MPNS and Apple Push Notification Service, between your MPNS and Google FCM, and between your MPNS and your Mattermost server.
   - You must ensure that the push proxy can be reached on the correct port. The default port is 8086.
   - As part of the process of building the applications, you'll need to sign the applications. You must also obtain the appropriate certificate for both Android and iOS. If this isn't done, the applications won't be able to interact with your instance of the MPNS. Once this is complete, you can proceed with the deployment of your MPNS instance.
   - We strongly recommend that you subscribe to `Mattermost Security Bulletins <https://mattermost.com/security-updates/#sign-up>`__. When you're notified of security updates for the MPNS, apply them promptly.

source/deploy/mobile-faq.rst METASEP
Mobile apps FAQ
===============

.. contents::
  :backlinks: top
  :local:

Can I connect to multiple Mattermost servers using the mobile apps?
-------------------------------------------------------------------

At the moment, we only support connecting to one server at a time; however, we are aware that this is one of the `top feature requests <https://mattermost.uservoice.com/forums/306457-general/suggestions/10975938-ios-and-android-apps-should-allow-multiple-server>`__ for the mobile app. We are currently investigating some technical challenges, such as how to handle push notifications coming from multiple servers. To follow our progress on this feature, you can join the `RN: Multi-Server <https://community.mattermost.com/core/channels/rn-multi-server-suppot>`_ channel on our community server.

As a workaround, you can install the released Mattermost mobile app and sign up to be a `tester <https://github.com/mattermost/mattermost-mobile/blob/master/README.md#testing>`__ for the Mattermost Beta mobile app. This allows you to connect and log in to a different server from each app.

Is there a tablet version of the mobile apps?
---------------------------------------------

Mattermost Classic mobile apps support tablets. Our second generation Mattermost mobile apps include beta support for tablets.

Can the permanent sidebar on tablet devices be disabled?
--------------------------------------------------------

The permanent sidebar is on by default for tablet-sized devices, but can be disabled from **Settings > Display > Sidebar > Permanent Sidebar**. When disabled, the sidebar behaves similarly to mobile devices where the user must open it using the button in the top-left corner of the screen.

How is data handled on mobile devices after a user account is deactivated?
--------------------------------------------------------------------------

App data is wiped from the device when a user logs out of the app. If the user is logged in when the account is deactivated, then within one minute of deactivation the system logs the user out. Thereafter all app data is wiped from the device.

Do I need to compile the mobile apps to host my own push notification server?
------------------------------------------------------------------------------

Yes. To host your own push notification server, you'll need to compile the mobile apps. See `documentation <https://docs.mattermost.com/mobile/mobile-compile-yourself.html>`__ to learn how to compile your own mobile apps.

.. _push-faq:

How do push notifications work?
-------------------------------

Your Mattermost server sends push notifications to a hosted push proxy server, which relays them via mobile push notification services provided by Apple and Google.

To ensure push notifications are coming from a trusted source, Apple and Google only allow push notifications sent from a service using a key or signature corresponding to a secret compiled into the mobile app itself.

The full process is outlined below:

1. An action triggering a push notification is detected in the Mattermost server running in your private network.

2. Your Mattermost server sends a push notification message to a Mattermost Push Notification Service (MPNS), either self-hosted in your private network, or publicly hosted by Mattermost, Inc.

3. MPNS sends a push notification message to either Apple Push Notification Service (APNS) or to Google’s Firebase Cloud Messaging (FCM) service over a TLS connection.

  - If sent to Apple, the message has a signature corresponding to a secret compiled in the iOS app.
  - If sent to Google, the message uses a key corresponding to a secret compiled in the Android app.

Regardless of whether you're using iOS or Android, the MPNS needs to have access to the appropriate secret compiled into the mobile app.

This means if you use the Mattermost apps from the Apple App Store or Google Play, you need to use the hosted push notification service from Mattermost, Inc. If you compile the apps yourself, you must also compile and use your own MPNS with the corresponding secret.

4. Either APNS or FCM receives the push notification message from MPNS over TLS, and then relays the message to the user's iOS or Android device to be displayed.

.. note:: 
  
  The use of push notifications with iOS and Android applications will require a moment where the contents of push notifications are visible and unencrypted by a server controlled by either Apple or Google. This is standard for any iOS or Android app. For this reason, there is an option available in Mattermost Enterprise to omit the contents of Mattermost messages from push notifications, or to configure message contents to be fetched from the server when notifications reach the device. See our `Configuration Settings <https://docs.mattermost.com/configure/configuration-settings.html#push-notification-contents>`__ documentation for details.

Is TLS v1.3 supported?
----------------------

No. TLS v1.3 doesn't work with the Mattermost Mobile app websocket. This limitation will be addressed in a future release. We recommend that you continue using TLS v1.2.

What post metadata is sent in mobile push notifications?
--------------------------------------------------------

The following post metadata is sent in all push notifications:

- ``Team ID``
- ``Channel ID``
- ``Post ID``
- ``User ID`` (post author)
- ``Username`` (post author or webhook override username)
- ``Root ID`` (only if the post is in a thread)
- ``Type`` (create or clear push notification)
- ``Category`` (iOS only, determines if the notifications can be replied to)
- ``Badge number`` (what the notification badge on the app icon should be set to when the notification is received)

Additional metadata may be sent depending on the System Console setting for `Push Notification Contents <https://docs.mattermost.com/configure/configuration-settings.html#push-notification-contents>`__:

- **Generic description with sender and channel names**: ``Channel name`` metadata will be included.
- **Full message content sent in the notification payload**: ``Post content`` and ``Channel name`` metadata will be included.
- **Full message content fetched from the server on receipt** (available in Mattermost Enterprise): ``Post content`` and ``Channel name`` are not included in the notification payload, instead the ``Post ID`` is used to fetch ``Post content`` and ``Channel name`` from the server after the push notification is received on the device.

How can I use ID-Only Push Notifications to protect notification content from being exposed to third-party services?
---------------------------------------------------------------------------------------------------------------------

When it comes to mobile data privacy, many organizations prioritize secure handling of messaging data, particularly when it may contain mission-critical or proprietary information. These organizations may have concerns about using mobile notifications because data must pass through third-party entities like Apple Push Notification Service (APNS) or Google Firebase Cloud Messaging (FCM) before it reaches a device. 

This poses a potential risk for organizations that operate under strict compliance requirements and cannot expose message data to external entities. To solve this, in Mattermost v5.18 and later, we offer an option for greater protection for Mattermost push notification message data by only sending a unique message ID in the notification payload rather than the full message data (available in Mattermost Enterprise). Once the device receives the ID, it then fetches the message content directly from the server and displays the notification per usual. 

External entities, such as APNS and FCM, handle only the ID and are unable to read any part of the message itself. If your organization has strict privacy or compliance needs, the `ID-Only Push Notification <https://docs.mattermost.com/configure/configuration-settings.html#push-notification-contents>`_ setting offers a high level of privacy while still allowing your team members to benefit from mobile push notifications.  

The following payload shows an example of the json that is transmitted to the push notification service when using the ID-Only setting:

  .. code-block:: json
  
    {
        "ack_id": "nnfbqk5bnffe5karxuzs8o5rec",
        "platform": "apple_rn",
        "server_id": "aoej8izzfffr9e67d6uz3g387h",
        "device_id": "32f198dbdd7427be7e6f03ba721ffdceba58c3f0bfa9c4655a6e7cc8271ba539",
        "post_id": "77d9cs9aq3b1fpoepbdbmqfs4c",
        "category": "CAN_REPLY",
        "message": "You've received a new message.",
        "badge": 3,
        "channel_id": "et3ghiycm7g7bb41ihg85pqgah",
        "type": "message",
        "sender_id": "g774dzud4tgaxgphso4wm8xrxe",
        "version": "v2",
        "is_id_loaded": true
    }

where the following definitions are applied:

- ``ack_id``: An ephemeral identifier generated per notification that determines whether the notification sent was received by the device (using same method that generates identifiers to the rest of the models in the server). This information is available in the ``notifications.log`` file on the Mattermost server. The ``ack_id`` is only used for receipt delivery from the mobile app to the Mattermost server to confirm whether the notification sent was received. 
- ``server_id``: A server identifier created on the server, called ``DiagnosticId``. In the future, this value will be used in the mobile app (for multi-server support) to identify which server the notification belongs to.
- ``device_id``: The token that APNs and FCM return when you allow the device to receive notifications. So when the user logs into Mattermost, Mattermost sends this ``device_id`` to attach it to the session. If the session is terminated, the ``device_id`` is no longer present in the server database because the session record is removed. When the user logs back in, the ``device_id`` is registered again with the same value because the identifier is specific to the device. This value won't be the same across apps or devices owned by the same person, but will be the same for each session the user creates from the same app on the same device.
- ``version``: Tells the mobile app how data is structured so it can parse it properly. Current value is ``v2``.
- ``is_id_loaded``: (Mattermost Enterprise only) When true, the mobile app look for the contents of the notification on the server because those details are not part of the payload. 

What are my options for securing the mobile apps?
-------------------------------------------------

The following options for secure mobile app deployments are available:

1. Securing network connection to mobile apps

  - Use HTTPS and WSS network connections to encrypt transport.
  - Use of a mobile VPN client on mobile devices to establish secure connection to Mattermost server within private network.

2. Use multifactor authentication options

  - If a VPN client with multifactor authentication is not in use, it's highly recommended that MFA is required on authenticating into Mattermost, either within Mattermost itself or via your SSO provider.

What are my options for securing push notifications?
----------------------------------------------------

The following options are available for securing your push notification service:

1.  Protecting notification contents

  - You can `choose what type of information to include in push notifications <https://docs.mattermost.com/configure/configuration-settings.html#push-notification-contents>`__, such as excluding the message contents if your compliance policies require it. Default server settings have message contents turned off.

2. Disabling push notifications

  - Push notifications can also be disabled entirely depending on security requirements. Default server settings have push notifications disabled.

3. Encrypting connections for apps you compile yourself:

  - When using a privately-hosted Mattermost Push Notification Service (MPNS), use encrypted TLS connections between:

    - MNPS and Apple Push Notification Service (APNS)
    - MPNS and Google’s Firebase Cloud Messaging (FCM)
    - MPNS and your Mattermost server

4. Securing the Mattermost Apple App Store and Google Play apps:

  - When using Mattermost mobile apps from the App Store and Google Play, purchase an annual subscription to Mattermost Professional or Enterprise to use Mattermost's `Hosted Push Notification Service (HPNS) <https://docs.mattermost.com/deploy/mobile-hpns.html#hosted-push-notifications-service-hpns>`__.

.. note:: 

  For configuration details, see guides for `deploying the Mattermost App Store and Google Play apps <https://docs.mattermost.com/deploy/use-prebuilt-mobile-apps.html>`__ and `deploying your own version of the apps <https://docs.mattermost.com/deploy/build-custom-mobile-apps.html>`__. 

Why do I sometimes see a delay in receiving a push notification?
----------------------------------------------------------------

`Apple Push Notification Service (APNS) <https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/APNSOverview.html#//apple_ref/doc/uid/TP40008194-CH8-SW1>`_ and `Google Fire Cloud Messaging (FCM) <https://firebase.google.com/docs/cloud-messaging>`_ determine when your device receives a push notification from Mattermost. Thus, a delay is usually as a result of those services.

The technical flow for the device to receive a push notification is as follows:

1. User posts a message in Mattermost.
2. Mattermost server identifies if notifications need to be sent.
3. If yes, Mattermost server sends a payload containing the push notification to the push proxy.
4. The push proxy parses the notification and relays it to APNS and FCM.
5. APNS and FCM informs the relevant devices that there is a push notification for Mattermost. This usually happens almost immediately, but may be delayed by a couple of minutes.
6. Mattermost processes the notification and displays it on the user's device.

How do I deploy Mattermost with Enterprise Mobility Management (EMM) providers?
--------------------------------------------------------------------------------

Mattermost enables customers with high privacy and custom security requirements to deploy mobile app and push notification services using keys that they alone control.

:doc:`Learn more about using AppConfig for EMM providers <mobile-appconfig>`.

How do I host the Mattermost push notification service?
-------------------------------------------------------

First, you can use the :doc:`Mattermost Hosted Push Notification Service (HPNS) <mobile-hpns>`. Organizations can also `host their own push proxy server instead <https://developers.mattermost.com/contribute/mobile/push-notifications/service/>`_. This is applicable when you want to:

1. Customize the `Mattermost mobile apps <https://developers.mattermost.com/contribute/mobile/build-your-own/>`_;
2. Deploy your own push notification service, or
3. Repackage the mobile apps with BlueCedar or AppDome (both of which are not officially supported but have been successfully deployed by some organizations).

How do I white label the app and customize build settings?
----------------------------------------------------------

All files in the ``/assets/base`` folder can be overridden as needed without conflicting with changes made to the upstream version of the app. To do this:

1. Create the folder ``/assets/override``.
2. Copy any files or folders that you wish to replace from ``/assets/base`` into ``/assets/override``.
3. Make your changes to the files in ``/assets/override``.

When you compile the app or run ``make dist/assets``, the contents of those two folders will be merged with files in ``/assets/override``, taking precedence in the case of any conflicts. For binary files such as images, an overridden file will completely replace the base version, while ``JSON`` files will be merged so that fields not set in the overridden copy use the base version.

For a more specific example of how to use this feature, see the following section.

How do I preconfigure the server URL for my users?
--------------------------------------------------

You can preconfigure the server URL and other settings by overriding default ``config.json`` settings and building the mobile apps yourself.

1. Fork the `mattermost-mobile repository <https://github.com/mattermost/mattermost-mobile>`__. 
2. Create the file ``/assets/override/config.json`` in your forked mattermost-mobile repository.
3. Copy and paste all the settings from ``assets/base/config.json`` to the newly-created ``/assets/override/config.json`` file that you want to override.
4. To override the server URL, set ``DefaultServerURL`` to the server URL of your Mattermost server in ``/assets/override/config.json``.
5. (Optional) If you want to prevent users from changing the server URL, set ``AutoSelectServerUrl`` to ``true``.
6. (Optional) Override any other settings you like.

After the above, your ``/assets/override/config.json`` file would look something like this:

  .. code-block:: json
  
    {
        "DefaultServerURL": "my-mattermost-instance.example.com",
        "AutoSelectServerUrl": true,
        "ExperimentalUsernamePressIsMention": true
    }

7. Finally, `compile your own version <https://developers.mattermost.com/contribute/mobile/build-your-own/>`__ of the Mattermost mobile app and Mattermost push proxy server.

How can I get Google SSO to work with the Mattermost mobile app?
-----------------------------------------------------------------

The apps on the Apple App Store and Google Play Store cannot support Google SSO out of the box. This is because Google requires a unique Google API key that's specific to each organization.

If you need Google SSO support, you can create a custom version of the app for your own organization. Fork the `mattermost-mobile <https://github.com/mattermost/mattermost-mobile>`__  repository and add support for Google SSO before compiling the app yourself. If this is something you’re interested in, please `file an issue in GitHub <https://github.com/mattermost/mattermost-mobile/issues>`__ to start the discussion.

How do I configure deep linking?
---------------------------------

The app checks for platform-specific configuration on app install. If no configuration is found, then the deep linking code sits silently and permalinks act as regular links.

**Set up for iOS**

1. Create an ``apple-app-site-association`` file in the ``.well-known`` directory at the root of your server. It should be accessible by navigating to ``https://<your-site-name>/.well-known/apple-app-site-association``. There should not be a file extension.
2. In order to handle deep links, paste the following ``JSON`` into the ``apple-app-site-association`` file. Make sure to place your app ID in the ``appID`` property:

::

    {
        "applinks": {
            "apps": [],
            "details": [
                {
                    "appID": "<your-app-id-here>",
                    "paths": ["**/pl/*", "**/channels/*"]
                }
            ]
        }
    }

3. Add the associated domains entitlement to your app via the Apple developer portal.
4. Add an entitlement that specifies the domains your app supports via the Xcode entitlements manager.
5. Before installing the app with the new entitlement, make sure that you can view the contents of the ``apple-app-site-association`` file via a browser by navigating to ``https://<your-site-name>/.well-known/apple-app-site-association``. The app will check for this file on install and, if found, will allow outside permalinks to open the app.

Official documentation for configuring deep linking on iOS can be found `here <https://developer.apple.com/library/archive/documentation/General/Conceptual/AppSearch/UniversalLinks.html>`__.

**Set up for Android**

Please refer to the the App Links Assistant in Android Studio for configuring `deep linking on Android <https://developer.android.com/studio/write/app-link-indexing>`__.

How do I connect users across internal and external networks?
-------------------------------------------------------------

By setting up global network traffic management, you can send a user to an internal or external network when connecting with a mobile app. Moreover, you can have two separate layers of restrictions on internal and external traffic, such as:

 - In the internal network, deploy on a private network via per device VPN.
 - In the external network, deploy with `TLS mutual auth <https://docs.mattermost.com/onboard/ssl-client-certificate.html>`__ with an NGINX proxy, and `client-side certificates <https://docs.mattermost.com/onboard/certificate-based-authentication.html>`__ for desktop and iOS.
 
Many services such as Microsoft Azure provide options for `managing network traffic <https://docs.microsoft.com/en-us/azure/traffic-manager/traffic-manager-overview>`__, or you can engage a services partner to assist.

How do I receive mobile push notifications if my IT policy requires the use of a corporate proxy server?
--------------------------------------------------------------------------------------------------------

When your IT policy requires a corporate proxy to scan and audit all outbound traffic the following options are available:

Deploy Mattermost in a proxy-aware configuration with a pre-proxy relay
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The Mattermost push notification service is designed to send traffic directly to the `Apple Push Notification Service (APNS) <https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/APNSOverview.html#//apple_ref/doc/uid/TP40008194-CH8-SW1>`_ and `Google Fire Cloud Messaging (FCM) <https://firebase.google.com/docs/cloud-messaging>`_ services. 

In a proxy-aware configuration, a `pre-proxy relay <https://docs.mattermost.com/overview/faq.html#what-are-pre-proxy-and-post-proxy-relays>`_ accepts messages from the `Mattermost Push Proxy <https://developers.mattermost.com/contribute/mobile/push-notifications/service/>`_ and forwards them to a corporate proxy enforcing your internal IT requirements, before transmitting to their final destination.

See a sample architectural overview below: 

.. image:: ../images/mobile-pre-proxy-relay.png
   :alt: The Mattermost push notification service is designed to send traffic directly to the Apple Push Notification Service (APNS) and Google Fire Cloud Messaging (FCM) services. However, if your organization requires a corporate proxy to scan and audit all outbound traffic, you can deploy Mattermost in a proxy-aware configuration with a pre-proxy relay. The relay accepts messages from the Mattermost Push Proxy, and forwards them to a corporate proxy that enforces your internal IT requirements before delivering the notification to a mobile device. This configuration requires a trusted root certificate.

This enables the **pre-proxy relay** to act as the `APNS <https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/APNSOverview.html#//apple_ref/doc/uid/TP40008194-CH8-SW1>`_ and to forward the request to its final destination via your corporate proxy, not requiring the APNS traffic to be proxy-aware. The APNS traffic is redirected to the pre-proxy relay via ``/etc/hosts`` entry. The entry uses a trusted CA that signs a certificate for the Mattermost Push Proxy to trust the pre-proxy relay.

Google's `FCM traffic <https://firebase.google.com/docs/cloud-messaging>`_ is proxy-aware via environment variables, so no actions are required for it. 

Moreover, APNS traffic requires HTTP/2, so your corporate proxy server must support HTTP/2 requests in order to send the push notifications to Apple devices. HTTP/2 support for the pre-proxy relay is also required.

Deploy Mattermost with connection restricted post-proxy relay in DMZ or a trusted cloud environment
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Some legacy corporate proxy configurations may be incompatible with the requirements of modern mobile architectures, such as the requirement of HTTP/2 requests from Apple to send push notifications to iOS devices.

In this case, a `post-proxy relay <https://docs.mattermost.com/overview/faq.html#what-are-pre-proxy-and-post-proxy-relays>`_ can be deployed to take messages from the Mattermost server passing through your corporate IT proxy in the incompatible format, e.g. HTTP/1.1, transform it to HTTP/2 and relay it to its final destination, either to the `Apple Push Notification Service (APNS) <https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/APNSOverview.html#//apple_ref/doc/uid/TP40008194-CH8-SW1>`_ and `Google Fire Cloud Messaging (FCM) <https://firebase.google.com/docs/cloud-messaging>`_ services. 

Ths **post-proxy relay** `can be configured using the Mattermost Push Proxy installation guide <https://developers.mattermost.com/contribute/mobile/push-notifications/service/>`_ with connection restrictions to meet your custom security and compliance requirements.

In place of a DMZ, you can also host in a trusted cloud environment such as AWS or Azure depending on your internal approvals and policies. 

.. image:: ../images/mobile-post-proxy-relay.png
   :alt: The Mattermost push notification service is designed to send traffic directly to the Apple Push Notification Service (APNS) and Google Fire Cloud Messaging (FCM) services. However, if your organization doesn't support HTTP/2 requests to send push notifications to mobile devices, you can deploy a post-proxy relay to take messages form the Mattermost server, transform it from the incompatible format, and relay it to its final destination. The post-proxy relay can be configured using connection restrictions to meet your custom security and compliance requirements.

Whitelist Mattermost push notification proxy to bypass your corporate proxy server
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Depending on your internal IT policy and approved waivers/exceptions, you may choose to deploy the `Mattermost Push Proxy <https://developers.mattermost.com/contribute/mobile/push-notifications/service/>`_ to connect directly to `Apple Push Notification Service (APNS) <https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/APNSOverview.html#//apple_ref/doc/uid/TP40008194-CH8-SW1>`_ without your corporate proxy.

You will need to `whitelist one subdomain and one port from Apple <https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingwithAPNs.html#//apple_ref/doc/uid/TP40008194-CH11-SW1>`_ for this option:

- Development server: ``api.development.push.apple.com:443``
- Production server: ``api.push.apple.com:443``

Run App Store versions of the Mattermost mobile apps
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

You can use the mobile applications hosted by Mattermost in the `Apple App Store <https://apps.apple.com/ca/app/mattermost/id1257222717>`_ or `Google Play Store <https://play.google.com/store/apps/details?id=com.mattermost.rn>`_ and connect with the `Mattermost Hosted Push Notification Service (HPNS) <https://docs.mattermost.com/deploy/mobile-hpns.html>`__ through your corporate proxy.

.. note::
  
 The use of hosted applications by Mattermost `can be deployed with Enterprise Mobility Management solutions via AppConfig <https://docs.mattermost.com/deploy/mobile-appconfig.html>`__ but wrapping is not supported. See the `product documentation <https://docs.mattermost.com/deploy/deploy-mobile-apps-using-emm-provider.html#manage-app-configuration-using-appconfig>`__ for details.

source/deploy/mobile-apps-faq.rst METASEP
:orphan:
:nosearch:

Mobile apps FAQ
================

.. This page is intentionally not accessible via the LHS navigation pane.

Can I connect to multiple Mattermost servers using the mobile apps?
-------------------------------------------------------------------

At the moment, we only support connecting to one server at a time; however, we are aware that this is one of the `top feature requests <https://mattermost.uservoice.com/forums/306457-general/suggestions/10975938-ios-and-android-apps-should-allow-multiple-server>`__ for the mobile app. We are currently investigating some technical challenges, such as how to handle push notifications coming from multiple servers. To follow our progress on this feature, you can join the `RN: Multi-Server <https://community.mattermost.com/core/channels/rn-multi-server-suppot>`_ channel on our community server.

As a workaround, you can install the released Mattermost mobile app and sign up to be a `tester <https://github.com/mattermost/mattermost-mobile/blob/master/README.md#testing>`__ for the Mattermost Beta mobile app. This allows you to connect and log in to a different server from each app.

Is there a tablet version of the mobile apps?
---------------------------------------------

Mattermost Classic mobile apps support tablets. Our second generation mobile apps (Mattermost) have beta support for tablets.

Can the permanent sidebar on tablet devices be disabled?
--------------------------------------------------------

The permanent sidebar is on by default for tablet-sized devices, but can be disabled from **Settings > Display > Sidebar > Permanent Sidebar**. When disabled, the sidebar behaves similarly to mobile devices where the user must open it using the button in the top-left corner of the screen.

How is data handled on mobile devices after a user account is deactivated?
--------------------------------------------------------------------------

App data is wiped from the device when a user logs out of the app. If the user is logged in when the account is deactivated, then within one minute of deactivation the system logs the user out. Thereafter all app data is wiped from the device.

Do I need to compile the mobile apps to host my own push notification server?
-----------------------------------------------------------------------------

Yes. To host your own push notification server, you'll need to compile the mobile apps. See `documentation <https://docs.mattermost.com/deploy/build-custom-mobile-apps.html>`__ to learn how to compile your own mobile apps.

.. _push-faq:

How do push notifications work?
---------------------------------

Your Mattermost server sends push notifications to a hosted push proxy server, which relays them via mobile push notification services provided by Apple and Google.

To ensure push notifications are coming from a trusted source, Apple and Google only allow push notifications sent from a service using a key or signature corresponding to a secret compiled into the mobile app itself.

The full process is outlined below:

1. An action triggering a push notification is detected in the Mattermost server running in your private network.

2. Your Mattermost server sends a push notification message to a Mattermost Push Notification Service (MPNS), either self-hosted in your private network, or publicly hosted by Mattermost, Inc.

3. MPNS sends a push notification message to either Apple Push Notification Service (APNS) or to Google’s Firebase Cloud Messaging (FCM) service over a TLS connection.

  - If sent to Apple, the message has a signature corresponding to a secret compiled in the iOS app.
  - If sent to Google, the message uses a key corresponding to a secret compiled in the Android app.

Regardless of whether you're using iOS or Android, the MPNS needs to have access to the appropriate secret compiled into the mobile app.

This means if you use the Mattermost apps from the Apple App Store or Google Play, you need to use the hosted push notification service from Mattermost, Inc. If you compile the apps yourself, you must also compile and use your own MPNS with the corresponding secret.

4. Either APNS or FCM receives the push notification message from MPNS over TLS, and then relays the message to the user's iOS or Android device to be displayed.

.. note:: 

  The use of push notifications with iOS and Android applications will require a moment where the contents of push notifications are visible and unencrypted by a server controlled by either Apple or Google. This is standard for any iOS or Android app. For this reason, there is an option to omit the contents of Mattermost messages from push notifications, or to configure message content to be fetched from the server when the notification reaches the device (*available in Mattermost Enterprise*) in order to meet certain compliance requirements. See the `configuration settings <https://docs.mattermost.com/configure/configuration-settings.html#push-notification-contents>`__ documentation for details.

What post metadata is sent in mobile push notifications?
--------------------------------------------------------

The following post metadata is sent in all push notifications:

- ``Team ID``
- ``Channel ID``
- ``Post ID``
- ``User ID`` (post author)
- ``Username`` (post author or webhook override username)
- ``Root ID`` (only if the post is in a thread)
- ``Type`` (create or clear push notification)
- ``Category`` (iOS only, determines if the notifications can be replied to)
- ``Badge number`` (what the notification badge on the app icon should be set to when the notification is received)

Additional metadata may be sent depending on the System Console setting for `Push Notification Contents <https://docs.mattermost.com/configure/configuration-settings.html#push-notification-contents>`__:

- **Generic description with sender and channel names**: ``Channel name`` metadata will be included.
- **Full message content sent in the notification payload**: ``Post content`` and ``Channel name`` metadata will be included.
- **Full message content fetched from the server on receipt** (*available in Mattermost Enterprise*): ``Post content`` and ``Channel name`` are not included in the notification payload, instead the ``Post ID`` is used to fetch ``Post content`` and ``Channel name`` from the server after the push notification is received on the device.

How can I use ID-Only Push Notifications to protect notification content from being exposed to third-party services?
---------------------------------------------------------------------------------------------------------------------

When it comes to mobile data privacy, many organizations prioritize secure handling of messaging data, particularly when it may contain mission-critical or proprietary information. These organizations may have concerns about using mobile notifications because data must pass through third-party entities like Apple Push Notification Service (APNS) or Google Firebase Cloud Messaging (FCM) before it reaches a device. This poses a potential risk for organizations that operate under strict compliance requirements and cannot expose message data to external entities. To solve this, in Mattermost v5.18 and later, we offer an option for greater protection for Mattermost push notification message data by only sending a unique message ID in the notification payload rather than the full message data (*available in Mattermost Enterprise*). Once the device receives the ID, it then fetches the message content directly from the server and displays the notification per usual. External entities, such as APNS and FCM, handle only the ID and are unable to read any part of the message itself. If your organization has strict privacy or compliance needs, the `ID-Only Push Notification <https://docs.mattermost.com/configure/configuration-settings.html#push-notification-contents>`_ setting offers a high level of privacy while still allowing your team members to benefit from mobile push notifications.

What are my options for securing the mobile apps?
-------------------------------------------------

The following options for secure mobile app deployments are available:

1. Securing network connection to mobile apps

  - Use HTTPS and WSS network connections to encrypt transport.
  - Use of a mobile VPN client on mobile devices to establish secure connection to Mattermost server within private network.

2. Use multifactor authentication options

  - If a VPN client with multifactor authentication is not in use, it's highly recommended that MFA is required on authenticating into Mattermost, either within Mattermost itself or via your SSO provider.

What are my options for securing push notifications?
----------------------------------------------------

The following options are available for securing your push notification service:

1.  Protecting notification contents

  - You can `choose what type of information to include in push notifications <https://docs.mattermost.com/configure/configuration-settings.html#push-notification-contents>`__, such as excluding the message contents if your compliance policies require it. Default server settings have message contents turned off.

2. Disabling push notifications

  - Push notifications can also be disabled entirely depending on security requirements. Default server settings have push notifications disabled.

3. Encrypting connections for apps you compile yourself:

  - When using a privately-hosted Mattermost Push Notification Service (MPNS), use encrypted TLS connections between:

    - MNPS and Apple Push Notification Service (APNS)
    - MPNS and Google’s Firebase Cloud Messaging (FCM)
    - MPNS and your Mattermost server

4. Securing the Mattermost Apple App Store and Google Play apps:

  - When using Mattermost mobile apps from the App Store and Google Play, purchase an annual subscription to Mattermost Enterprise or Professional, which offers a `Hosted Push Notification Service (HPNS) <https://docs.mattermost.com/deploy/mobile-hpns.html#hosted-push-notifications-service-hpns>`__.

.. Note:: 

  For configuration details, see guides for :doc:`deploying the Mattermost App Store and Google Play apps <use-prebuilt-mobile-apps>` and :doc:`deploying your own version of the apps <build-custom-mobile-apps>`. 

Why do I sometimes see a delay in receiving a push notification?
--------------------------------------------------------------------------

`Apple Push Notification Service (APNS) <https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/APNSOverview.html#//apple_ref/doc/uid/TP40008194-CH8-SW1>`__ and `Google Fire Cloud Messaging (FCM) <https://firebase.google.com/docs/cloud-messaging>`__ determine when your device receives a push notification from Mattermost. Thus, a delay is usually as a result of those services.

The technical flow for the device to receive a push notification is as follows:

1. User posts a message in Mattermost.
2. Mattermost server identifies if notifications needs to be sent.
3. If yes, Mattermost server sends a payload containing the push notification to the push proxy.
4. The push proxy parses the notification and relays it to APNS and FCM.
5. APNS and FCM informs the relevant devices that there is a push notification for Mattermost. This usually happens almost immediately, but may be delayed by a couple of minutes.
6. Mattermost processes the notification and displays it on the user's device.

How do I deploy Mattermost with Enterprise Mobility Management (EMM) providers?
--------------------------------------------------------------------------------

Mattermost enables customers with high privacy and custom security requirements to deploy mobile app and push notification services using keys that they alone control.

:doc:`Learn more about using AppConfig for EMM providers <mobile-appconfig>`.

How do I host the Mattermost push notification service?
----------------------------------------------------------

First, you can use the `Mattermost Hosted Push Notification Service (HPNS) <https://docs.mattermost.com/deploy/mobile-hpns.html#hosted-push-notifications-service-hpns>`__. Organizations can also `host their own push proxy server instead <https://developers.mattermost.com/contribute/mobile/push-notifications/service/>`_. This is applicable when you want to:

1. Customize the `Mattermost mobile apps <https://developers.mattermost.com/contribute/mobile/build-your-own/>`_;
2. Deploy your own push notification service, or
3. Repackage the mobile apps with BlueCedar or AppDome (both of which are not officially supported but have been successfully deployed by some organizations).

How do I receive mobile push notifications if my IT policy requires the use of a corporate proxy server?
---------------------------------------------------------------------------------------------------------

See our `developer documentation about the Mattermost Push Notification Service with Corporate Proxy <https://developers.mattermost.com/contribute/mobile/push-notifications/corporate-proxy>`_.

How do I white label the app and customize build settings?
----------------------------------------------------------

All files in the ``/assets/base`` folder can be overridden as needed without conflicting with changes made to the upstream version of the app. To do this:

1. Create the folder ``/assets/override``.
2. Copy any files or folders that you wish to replace from ``/assets/base`` into ``/assets/override``.
3. Make your changes to the files in ``/assets/override``.

When you compile the app or run ``make dist/assets``, the contents of those two folders will be merged with files in ``/assets/override``, taking precedence in the case of any conflicts. For binary files such as images, an overridden file will completely replace the base version, while ``JSON`` files will be merged so that fields not set in the overridden copy use the base version.

For a more specific example of how to use this feature, see the following section.

How do I preconfigure the server URL for my users?
----------------------------------------------------

You can preconfigure the server URL and other settings by overriding default ``config.json`` settings and building the mobile apps yourself.

1. Fork the `mattermost-mobile repository <https://github.com/mattermost/mattermost-mobile>`__. 
2. Create the file ``/assets/override/config.json`` in your forked mattermost-mobile repository.
3. Copy and paste all the settings from ``assets/base/config.json`` to the newly-created ``/assets/override/config.json`` file that you want to override.
4. To override the server URL, set ``DefaultServerURL`` to the server URL of your Mattermost server in ``/assets/override/config.json``.
5. (Optional) If you want to prevent users from changing the server URL, set ``AutoSelectServerUrl`` to ``true``.
6. (Optional) Override any other settings you like.

After the above, your ``/assets/override/config.json`` file would look something like this:

  .. code-block:: json
  
    {
        "DefaultServerURL": "my-mattermost-instance.example.com",
        "AutoSelectServerUrl": true,
        "ExperimentalUsernamePressIsMention": true
    }

7. Finally, `compile your own version <https://docs.mattermost.com/deploy/build-custom-mobile-apps.html>`__ of the Mattermost mobile app and Mattermost push proxy server.

How can I get Google SSO to work with the Mattermost mobile app?
-----------------------------------------------------------------

The apps on the Apple App Store and Google Play Store cannot support Google SSO out of the box. This is because Google requires a unique Google API key that's specific to each organization.

If you need Google SSO support, you can create a custom version of the app for your own organization. Fork the `mattermost-mobile <https://github.com/mattermost/mattermost-mobile>`__  repository and add support for Google SSO before compiling the app yourself. If this is something you’re interested in, please `file an issue in GitHub <https://github.com/mattermost/mattermost-mobile/issues>`__ to start the discussion.

How do I configure deep linking?
--------------------------------------

The app checks for platform-specific configuration on app install. If no configuration is found, then the deep linking code sits silently and permalinks act as regular links.

**Set up for iOS**

1. Create an ``apple-app-site-association`` file in the ``.well-known`` directory at the root of your server. It should be accessible by navigating to ``https://<your-site-name>/.well-known/apple-app-site-association``. There should not be a file extension.
2. In order to handle deep links, paste the following ``JSON`` into the ``apple-app-site-association`` file. Make sure to place your app ID in the ``appID`` property:

::

    {
        "applinks": {
            "apps": [],
            "details": [
                {
                    "appID": "<your-app-id-here>",
                    "paths": ["**/pl/*", "**/channels/*"]
                }
            ]
        }
    }

1. Add the associated domains entitlement to your app via the Apple developer portal.
2. Add an entitlement that specifies the domains your app supports via the Xcode entitlements manager.
3. Before installing the app with the new entitlement, make sure that you can view the contents of the ``apple-app-site-association`` file via a browser by navigating to ``https://<your-site-name>/.well-known/apple-app-site-association``. The app will check for this file on install and, if found, will allow outside permalinks to open the app.

Official documentation for configuring deep linking on iOS can be found `here <https://developer.apple.com/library/archive/documentation/General/Conceptual/AppSearch/UniversalLinks.html>`__.

**Set up for Android**

Please refer to the the App Links Assistant in Android Studio for configuring `deep linking on Android <https://developer.android.com/studio/write/app-link-indexing>`__.

How do I connect users across internal and external networks?
-----------------------------------------------------------------

By setting up global network traffic management, you can send a user to an internal or external network when connecting with a mobile app. Moreover, you can have two separate layers of restrictions on internal and external traffic, such as:

 - In the internal network, deploy on a private network via per device VPN.
 - In the external network, deploy with `TLS mutual auth <https://docs.mattermost.com/onboard/ssl-client-certificate.html>`__ with an NGINX proxy, and `client-side certificates <https://docs.mattermost.com/onboard/certificate-based-authentication.html>`__ for desktop and iOS.
 
Many services such as Microsoft Azure provide options for `managing network traffic <https://docs.microsoft.com/en-us/azure/traffic-manager/traffic-manager-overview>`__, or you can engage a services partner to assist.

source/deploy/mobile-appconfig.rst METASEP
AppConfig for EMM solutions with Mattermost mobile apps
=======================================================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

What is AppConfig?
------------------

AppConfig is a standard approach for app configuration and management introduced by the AppConfig Community, a group of leading EMM providers and app developers who have come together to make it easier for developers and customers to drive mobility in business. The community's mission is to streamline the adoption and deployment of mobile enterprise applications by providing a standard approach to app configuration and management, building upon the extensive app security and configuration frameworks available in the OS. 

AppConfig provides an easy way to configure enterprise mobile applications with any of the EMM providers listed on the `AppConfig website <https://www.appconfig.org/members/>`__.

Mattermost mobile apps can be configured in your EMM solution using AppConfig with the apps on the public app stores (Google Play and Apple App Store), or as an "in-house app" you compile yourself.

.. _appconfig-table:

Mattermost AppConfig values
---------------------------

The following table shows all the configuration options that can be sent from the EMM provider of your choice to the Mattermost mobile apps. You can also :download:`download an XML template <mattermost-specfile.xml>` of the configuration file for use with your EMM provider. 

+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+---------------+------------------+-------------+--------------------------+
| Key                    | Description                                                                                                                                                                                                     | Type   | Default Value | Valid Values     | iOS Support | Android for Work Support |
+========================+=================================================================================================================================================================================================================+========+===============+==================+=============+==========================+
| inAppPinCode           | Require users to authenticate as the device owner before using the app. Prompts for fingerprint or passcode when the app first opens and when the app has been in the background for more than five minutes.    | String | ``false``     | ``true | false`` | Yes         | Yes                      |
+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+---------------+------------------+-------------+--------------------------+
| blurApplicationScreen  | Blur the app when it's set to background to protect any confidential on-screen information. On Android, it also prevents taking screenshots of the app.                                                         | String | ``false``     | ``true | false`` | Yes         | Yes                      |
+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+---------------+------------------+-------------+--------------------------+
| jailbreakDetection     | Disable app launch on jailbroken or rooted devices.                                                                                                                                                             | String | ``false``     | ``true | false`` | Yes         | Yes                      |
+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+---------------+------------------+-------------+--------------------------+
| copyAndPasteProtection | Disable the ability to copy from or paste into any text inputs in the app.                                                                                                                                      | String | ``false``     | ``true | false`` | Yes         | Yes (since v1.24.0)      |
+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+---------------+------------------+-------------+--------------------------+
| serverUrl              | Set a default Mattermost server URL.                                                                                                                                                                            | String |               | URL              | Yes         | Yes                      |
+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+---------------+------------------+-------------+--------------------------+
| allowOtherServers      | Allow the user to change the above server URL. If set to true users will automatically connect when launching the app                                                                                           | String | ``true``      | ``true | false`` | Yes         | Yes                      |
+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+---------------+------------------+-------------+--------------------------+
| username               | Set the username or email address to use to authenticate against the Mattermost Server.                                                                                                                         | String |               |                  | Yes         | Yes                      |
+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+---------------+------------------+-------------+--------------------------+
| useVPN                 | Enable connection to the Mattermost Server to use a per-app VPN or VPN on-demand.                                                                                                                               | String | ``false``     | ``true | false`` | Yes         | No                       |
+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+---------------+------------------+-------------+--------------------------+
| timeoutVPN             | Set how long the request waits (in seconds) for an initial VPN connection to establish before timeout.                                                                                                          | String | 30            |                  | Yes         | No                       |
+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+---------------+------------------+-------------+--------------------------+
| vendor                 | Name of the EMM vendor or company deploying the app. Used in help text when prompting for passcodes so users are aware why the app is being protected.                                                          | String | Mattermost    |                  | Yes         | Yes                      |
+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+---------------+------------------+-------------+--------------------------+
| inAppSessionAuth       | Use the app's internal browser for SSO instead of an external browser.                                                                                                                                          | String | ``false``     | ``true | false`` | Yes         | Yes                      |
+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+---------------+------------------+-------------+--------------------------+

Other AppConfig settings
------------------------

As part of AppConfig, EMM administrators can set the following additional configuration options for the Mattermost mobile apps:

1. **App Tunnel:** Leverage the "Per-app VPN" capabilities in most commercial VPN solutions.
2. **Prevent App Backup:** Prevent users from backing up app data.
3. **Enforce App Encryption:** Set security policies such as requiring encryption.
4. **Remotely Wipe App:** Use the EMM tool to distribute the app to devices as a managed application so it can be remotely wiped. If the app was previously installed, mark it so the EMM converts the app to a managed app.

Other configurations may be available depending on your EMM provider.

source/deploy/mobile-app-changelog.md METASEP
# Mattermost mobile apps changelog

Latest Mattermost Mobile Apps releases:

- [1.55.0 Release](#release)
- [1.54.0 Release](#id1)
- [1.53.0 Release](#id6)
- [1.52.0 Release](#id10)
- [1.51.2 Release](#id14)
- [1.51.1 Release](#id17)

## 1.55.0 Release
- Release Date: August 16, 2022
- Server Versions Supported: Server v6.3.0+ is required. Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device.

### Compatibility
 - **Upgrade to server version v6.3.0 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.37 has ended and upgrading to server ESR v6.3.0 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).	
 - iPhone 5s devices and later with iOS 12.1+ is required.

### Improvements
 - Calls: Implemented WebSocket reconnection support.

### Bug Fixes
 - Calls: Fixed a crash on "cannot replaceTrack after peer is destroyed" error.
 - Fixed an issue with sharing of text alongside an image on Android.
 - Fixed an issue on Android where clicking on a hashtag from the Saved Posts modal returned the user to the channel instead of taking the user to the search results.
 - Fixed an issue where the select modal value was not getting populated.

### Known Issues
 - Channel sidebar disappears sometimes when the channel categories are not fetched from the server.
 - Posts sometimes get stuck behind the post textbox on iPad.

## 1.54.0 Release
- Release Date: July 15, 2022
- Server Versions Supported: Server v6.3.0+ is required. Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device.

### Compatibility
 - **Upgrade to server version v6.3.0 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.37 has ended and upgrading to server ESR v6.3.0 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).	
 - iPhone 5s devices and later with iOS 12.1+ is required.

### Improvements
 - Calls: Added support for accepting advanced ICE server configurations through the config.
 - Calls: Added support for using Calls when the Mattermost installation is served under a subpath.
 - Calls: Added support for generating short-lived TURN credentials.

### Bug Fixes
 - Fixed an issue where Latex in root posts crashed the global Threads screen.

### Known Issues
 - The app crashes when the session length for mobile is changed via webapp.
 - Channel sidebar disappears sometimes when the channel categories are not fetched from the server.
 - Posts sometimes get stuck behind the post textbox on iPad.

## 1.53.0 Release
- Release Date: June 15, 2022
- Server Versions Supported: Server v6.3.0+ is required. Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device.

### Compatibility
 - **Upgrade to server version v6.3.0 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.37 has ended and upgrading to server ESR v6.3.0 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).	
 - iPhone 5s devices and later with iOS 12.1+ is required.

### Improvements
 - Added Calls Cloud Freemium limits.
 - Added a handler for a new ``call_end`` event.
 - Added support for a new ``MaxCallParticipants`` config setting.

### Known Issues
 - Channel sidebar disappears sometimes when the channel categories are not fetched from the server.
 - Posts sometimes get stuck behind the post textbox on iPad.

## 1.52.0 Release
- Release Date: May 16, 2022
- Server Versions Supported: Server v6.3.0+ is required. Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device.

### Compatibility
 - **Upgrade to server version v6.3.0 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.37 has ended and upgrading to server ESR v6.3.0 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).	
 - iPhone 5s devices and later with iOS 12.1+ is required.

### Improvements
 - Added .m4a audio file preview support via the video player.
 - Added the ability to render latex code blocks.

### Known Issues
 - Channel sidebar disappears sometimes when the channel categories are not fetched from the server.
 - Posts sometimes get stuck behind the post textbox on iPad.

## 1.51.2 Release
- Release Date: May 5, 2022
- Server Versions Supported: Server v6.3.0+ is required. Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device.

### Compatibility
 - **Upgrade to server version v6.3.0 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.37 has ended and upgrading to server ESR v6.3.0 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).	
 - iPhone 5s devices and later with iOS 12.1+ is required.

### Bug Fixes

#### All apps
 - Fixed an issue with Calls where multiple "Access to route for non-existent plugin" errors got logged in the server logs.

## 1.51.1 Release
- Release Date: April 22, 2022
- Server Versions Supported: Server v6.3.0+ is required. Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device.

### Compatibility
 - **Upgrade to server version v6.3.0 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.37 has ended and upgrading to server ESR v6.3.0 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).	
 - iPhone 5s devices and later with iOS 12.1+ is required.

### Bug Fixes

#### All apps
 - Fixed an issue with logging in when multiple SSO methods are enabled while email/password is disabled.

## 1.51.0 Release
- Release Date: April 16, 2022
- Server Versions Supported: Server v6.3.0+ is required. Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device.

### Compatibility
 - **Upgrade to server version v6.3.0 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.37 has ended and upgrading to server ESR v6.3.0 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).	
 - iPhone 5s devices and later with iOS 12.1+ is required.

### Breaking Changes
 - The [Apps Framework protocol](https://developers.mattermost.com/integrate/apps/) for binding/form submissions has changed, by separating the single `call` into separate `submit`, `form`, `refresh` and `lookup` calls. If any users have created their own Apps, they have to be updated to the new system.

### Improvements
 - Users are now taken directly to the SSO login if only one SSO login method is enabled.
 - Calls are now enabled on mobile if the server has Calls enabled.
 - For Calls, added "raise hand" functionality and a screensharing icon.
 - "Default Enabled Calls" and "Allow Enable Calls" server settings are now respected by Calls on mobile.
 - Added a speakerphone button to the Calls interface.
 - Added support for link highlighting for capitalized link schemes, such as ``Https://`` instead of ``https://``.
 - Changed the search bar in manual timezone selection view to be consistent with the rest of the app.
 - The mobile app no longer attempts to fetch thread bindings when the ``AppsEnabled`` feature flag is ``false``.
 - The mobile app will now only fetch App bindings if the Apps plugin is enabled.
 - Added support for allowing 1-character channel names.

### Bug Fixes

#### All apps
 - Fixed an issue with Calls banner locations for earlier iPhone models.
 - Fixed an issue where users were not able to scroll down to view custom themes.
 - Fixed a bug that resulted in dropping the Call state when switching to another app and returning.
 - Fixed an issue where some messages could have been cut off if the markdown used had two or more links with an ``=`` sign.

### Known Issues
 - Channel sidebar disappears sometimes when the channel categories are not fetched from the server.
 - Posts sometimes get stuck behind the post textbox on iPad.

## 1.50.1 Release
- Release Date: March 21, 2022
- Server Versions Supported: Server v5.37.0+ is required. Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device.

### Compatibility
 - **Upgrading to server version v5.37.0 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) v5.31 has ended and upgrading to server ESR v5.37.0 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).	
 - iPhone 5s devices and later with iOS 12.1+ is required.

### Bug Fixes

#### All apps
 - Fixed an issue where Latex-formatted text caused the mobile app to crash.

## 1.50.0 Release
- Release Date: March 16, 2022
- Server Versions Supported: Server v5.37.0+ is required. Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device.

### Compatibility
 - **Upgrade to server version v5.37.0 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.31 has ended and upgrading to server ESR v5.37.0 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).	
 - iPhone 5s devices and later with iOS 12.1+ is required.

### Improvements
 - Added support for markdown inline image custom sizes.

### Bug Fixes

#### All apps
 - Fixed an issue where setting a custom status failed silently.

### Known Issues
 - Channel sidebar disappears sometimes when the channel categories are not fetched from the server.
 - Posts sometimes get stuck behind the post textbox on iPad.
 - Various known issues with Collapsed Reply Threads (Beta) feature:
   - New messages banner should only count root posts.
   - Threads item unread state (bolding) does not persist when deleting documents and data.

## 1.49.1 Release
- Release Date: February 23, 2022.
- Server Versions Supported: Server v5.37.0+ is required. Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device.

### Compatibility
 - **Upgrade to server version v5.37.0 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/administration/extended-support-release.html) (ESR) 5.31 has ended and upgrading to server ESR v5.37.0 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).	
 - iPhone 5s devices and later with iOS 12.1+ is required.

### Bug Fixes

#### Android specific
 - Fixed an issue on Android where document files did not open.

## 1.49.0 Release
- Release Date: February 16, 2022
- Server Versions Supported: Server v5.37.0+ is required. Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device.

### Compatibility
 - **Upgrade to server version v5.37.0 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/administration/extended-support-release.html) (ESR) 5.31 has ended and upgrading to server ESR v5.37.0 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).	
 - iPhone 5s devices and later with iOS 12.1+ is required.

### Improvements
 - Added SVG support for markdown inline images.

### Bug Fixes

#### All apps
 - Fixed an issue where the date picker jumped back to the current month after the past date selection.
 - Fixed a crash issue on markdown table images.
 - Fixed an issue with Collapsed Reply Threads where clicking on a permalink added the thread replies in the channel view.
 - Fixed an issue with Collapsed Reply Threads where link previews disappeared when a thread was created.

### Known Issues
 - Some files (such as PDFs) fail to open/download on v1.49.0 [MM-41968](https://mattermost.atlassian.net/browse/MM-41968).
 - Channel sidebar disappears sometimes when the channel categories are not fetched from the server.
 - Posts sometimes get stuck behind the post textbox on iPad.
 - Various known issues with Collapsed Reply Threads (Beta) feature:
   - New messages banner should only count root posts.
   - Threads item unread state (bolding) does not persist when deleting documents and data.

## 1.48.2 Release
- Release Date: January 6, 2022
- Server Versions Supported: Server v5.37.0+ is required. Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device.

### Compatibility
 - **Upgrade to server version v5.37.0 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.31 has ended and upgrading to server ESR v5.37.0 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).	
 - iPhone 5s devices and later with iOS 12.1+ is required.

### Bug Fixes

#### All apps
 - Fixed an issue with custom status updates with no expiry.

### Known Issues
 - Channel sidebar disappears sometimes when the channel categories are not fetched from the server.
 - Posts sometimes get stuck behind the post textbox on iPad.
 - Various known issues with Collapsed Reply Threads (Beta) feature:
   - New messages banner should only count root posts.
   - Clicking on a permalink adds the thread replies in the channel view.
   - Threads item unread state (bolding) does not persist when deleting documents and data.

## 1.48.1 Release
- Release Date: December 15, 2021
- Server Versions Supported: Server v5.37.0+ is required. Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device.

### Compatibility
 - **Upgrade to server version v5.37.0 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.31 has ended and upgrading to server ESR v5.37.0 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).	
 - iPhone 5s devices and later with iOS 12.1+ is required.

### Bug Fixes

#### All apps
 - Fixed a crash on collapsed reply threads when opening the Gallery view from within a Thread.
 - Fixed an issue with clearing and grouping of push notifications when Collapsed Reply Threads is enabled.
 - Fixed an issue with opening the YouTube app from within Mattermost.

### Known Issues
 - Channel sidebar disappears sometimes when the channel categories are not fetched from the server.
 - Posts sometimes get stuck behind the post textbox on iPad.
 - Various known issues with Collapsed Reply Threads (Beta) feature:
   - New messages banner should only count root posts.
   - Clicking on a permalink adds the thread replies in the channel view.
   - Threads item unread state (bolding) does not persist when deleting documents and data.

## 1.48.0 Release
- Release Date: November 16, 2021
- Server Versions Supported: Server v5.37.0+ is required. Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device.

### Compatibility
 - **Upgrade to server version v5.37.0 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.31 has ended and upgrading to server ESR v5.37.0 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).	
 - iPhone 5s devices and later with iOS 12.1+ is required.

### Highlights

#### Cross-team Recent Mentions
 - Recent mentions and saved posts now show across all teams.

### Improvements
 - Adjusted channel override mobile notification preferences for Threads.
 - Added long-press options to the Global Threads screen.
 - Added a new messages line to the Threads screen.
 - Added "pull to refresh" to load threads in the Global Threads screen.
 - Added OAuth support for plugins and apps.
 - Added multiselect support for apps forms.
 - Added a "Rest" field app command to filter empty options on static and dynamic selects and to prohibit executing non-leaf commands.
 - App bindings now recognize the post menu options for each channel they live in.
 - Added ``@here`` mention to the ``EnableConfirmNotificationsToChannel`` config setting to show a warning modal when over 5 members might be alerted with ``@here``.
 - Updated "Jump to..." to match webapp equivalent user interface string.

### Bug Fixes

#### All apps
 - Fixed an issue where image previews could only be viewed once while on the Thread view.

### Known Issues
 - Channel sidebar disappears sometimes when the channel categories are not fetched from the server.
 - Posts sometimes get stuck behind the post textbox on iPad.
 - Various known issues with Collapsed Reply Threads (Beta) feature:
   - New messages banner should only count root posts.
   - Clicking on a permalink adds the thread replies in the channel view.
   - Threads item unread state (bolding) does not persist when deleting documents and data.

## 1.47.2 Release
- Release Date: October 25, 2021
- Server Versions Supported: Server v5.37.0+ is required. Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device.

### Compatibility
 - **Upgrade to server version v5.37.0 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.31 has ended and upgrading to server ESR v5.37.0 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).	
 - iPhone 5s devices and later with iOS 12.1+ is required.

### Bug Fixes

#### iOS specific
 - Fixed an issue copying and pasting files on iOS.

#### Android specific
 - Fixed a crash when switching channels or focusing the text input area on Android.
 - Fixed a crash while opening notifications on Android.

## 1.47.1 Release
- Release Date: October 19, 2021
- Server Versions Supported: Server v5.37.0+ is required. Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device.

### Compatibility
 - **Upgrade to server version v5.37.0 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.31 has ended and upgrading to server ESR v5.37.0 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).	
 - iPhone 5s devices and later with iOS 12.1+ is required.

### Bug Fixes

#### All apps
 - Fixed an issue where navigating to Global Threads crashed the app.
 - Fixed Text input font scaling to follow the OS setting to fix an issue where iOS Dynamic Type size was not correct in the message box.

#### iOS specific
 - Updated the iOS app icon to a flattened version.
 - Fixed a gesture conflict between the drawers and the post input on iOS.

## 1.47.0 Release
- Release Date: October 13, 2021
- Server Versions Supported: Server v5.37.0+ is required. Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device.

### Compatibility
 - **Upgrade to server version v5.37.0 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.31 has ended and upgrading to server ESR v5.37.0 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).	
 - iPhone 5s devices and later with iOS 12.1+ is required.

### Highlights

#### Branding Changes
 - Updated the Splash Screen, app icons, and Threads illustration to align with new branding.
 - Added a new default brand theme named "Denim".
 - The existing theme names and colors, including "Mattermost", "Organization", "Mattermost Dark", and "Windows Dark" have been updated to the new "Denim", "Sapphire", "Indigo", and "Onyx" theme names and colors, respectively. Anyone using the existing themes will see slightly modified theme colors after their server or workspace is upgraded. The theme variables for the existing "Mattermost", "Organization", "Mattermost Dark", and "Windows Dark" themes will still be accessible in [our documentation](https://docs.mattermost.com/messaging/customizing-theme-colors.html#custom-theme-examples), so a custom theme can be created with these theme variables if desired. Custom themes are unaffected by this change.
 - Added a new light theme named "Quartz" to the default available list of themes.

#### Deprecations
 - Stopped evaluating deprecated config settings starting with server version 6.0.

#### Custom, Collapsible Channel Categories
 - App now displays custom categories in the sidebar.

### Improvements
 - Added mobile push notifications for followed Threads.
 - Increased the limit of uploaded file attachments per post from 5 to 10.
 - Removed deprecated ``Posts.ParentId`` in favor of the semantically equivalent ``Posts.RootId``.
 - Added better support for channel and user selection from within Apps commands.
 - Added better binding filtering for Apps.

### Bug Fixes

#### All apps
 - Added an option to download a video in the gallery view if it failed to playback.
 - Fixed an issue where the emojis were cutoff when editing a message with jumbo emojis.
 - Fixed an issue where some mentions were highlighted when the mention key partially matched the mention in the message.
 - Fixed an issue with in-app notifications that caused the keyboard to blur when the notifications were automatically dismissed.
 - Fixed an issue where the autocomplete options were still visible when the keyboard was dismissed.
 - Fixed an issue where the “Loading messages…” text was upside down.
 - Fixed an issue where tapping on the push notification for a new reply did not open the thread with the post.
 - Fixed an issue where opening a push notification while in the Thread screen did not take the user to the channel screen.
 - Fixed an issue where a System message was missing when a guest user was added to a channel or when a guest joined a channel.
 - Fixed an error where the submit button on interactive dialogs was not shown when the dialog did not specify ``submit_label``.
 - Fixed an issue where pressing **Jump to** on mobile showed a different highlighted channels list than the sidebar highlighted channels list.
 - Removed Date and Time label from recently used custom statuses.
 - Fixed an error with locations and binding filtering.

#### iOS specific
 - Fixed a crash when attempting to share content into Mattermost on iOS when Biometric authentication was required.

#### Android specific
 - Fixed the ability to snooze push notifications on Android.
 - Fixed an issue with uploading of animated gif files on Android.

### Known Issues
 - An error may occur when archiving a channel or when attempting to post to an archived channel.
 - The "+" to add a reaction is still visible in archived channels.
 - Close Preview X and Close Settings X are themed incorrectly in Quartz theme.
 - Channel sidebar disappears sometimes in Airplane mode.
 - Posts sometimes get stuck behind the post textbox on iPad.
 - Various known issues with Collapsed Reply Threads (Beta) feature:
   - New messages banner should only count root posts.
   - Turning the feature on and off does not push an update to the Mobile client.
   - Clicking on a permalink adds the thread replies in the channel view.
   - Threads item unread state (bolding) does not persist when deleting documents and data.

## 1.46.0 Release
- Release Date: August 16, 2021
- Server Versions Supported: Server v5.31.3+ is required. Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device.

### Compatibility
 - **Upgrade to server version v5.31.3 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.25 has ended and upgrading to server ESR v5.31.3 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).	
 - iPhone 5s devices and later with iOS 11+ is required.

### Highlights

#### Collapsed Reply Threads (Beta)
 - Added support for [Collapsed Reply Threads](https://mattermost.com/blog/collapsed-reply-threads-beta/) for the mobile apps.

#### Custom Status Expiry
 - Added a feature to choose expiry time when setting a custom status. Requires server version 5.37 or later. Also added new screens such as **Clear** and new components such as ``DateTime`` picker.

#### Granular Data Retention Policies 
 - Added support for Granular Data Retention Policies for the mobile apps. Requires server version 5.37 or later.

### Improvements
 - Added the custom statuses to the mention autocomplete.
 - Changed the default behavior of autocomplete user interface for cases of long display names. Long display names will be truncated to show the username.
 - Added support for showing plugin slash command icons.
 - Added support for apps to add arbitrary markdown in between fields on forms.
 - Implemented a new style for app submit buttons.
 - Added markdown support for app fields descriptions and errors.

### Bug Fixes

#### All apps
 - Fixed an issue where boolean fields did not get disabled on dialogs when they should have.
 - Fixed an issue with displaying the current user when multiple users were part of the System join / leave messages.
 - Fixed a race condition when bringing the app to the foreground by tapping in a notification that belongs to a channel other than the current channel that caused the current channel to miss any mentions if it had any.
 - Fixed an issue with attaching files to the correct post.

#### Android specific
 - Fixed a silent crash that could happen for some users when receiving a push notification on Android.

### Known Issues
 - Posts sometimes get stuck behind the post textbox on iPad.
 - User may need to log out and back in from the app to see data retention results on the app.
 - Various known issues with Collapsed Reply Threads (Beta) feature:
   - Mobile app top bar disappears after resuming app from screen lock.
   - New messages banner should only count root posts.
   - Clicking Jump to on mobile shows a different highlighted channel list than the sidebar highlighted channel list.
   - Only the last six threads are visible in the Threads view.
   - Some unread channels with leave/join system messages are doubled in search results.
   - Tapping on the push notification for new reply should open the thread with the post.
   - Turning the feature on and off does not push an update to the Mobile client.
   - Clicking on a permalink adds the thread replies in the channel view.
   - Threads item is lost when clearing search in the channel sideabar.
   - Previously viewed Thread is auto-followed after new replies come in.
   - Threads item unread state (bolding) does not persist when deleting documents and data.
   - Clicking Jump to on mobile shows different highlighted channels list than the sidebar unread channels list.

### Contributors
 - [anurag6713](https://github.com/anurag6713), [ashishbhate](https://github.com/ashishbhate), [enahum](https://github.com/enahum), [larkox](https://github.com/larkox), [manojmalik20](https://github.com/manojmalik20)

## 1.45.1 Release
- Release Date: July 20, 2021
- Server Versions Supported: Server v5.31.3+ is required. Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device.

### Compatibility
 - **Upgrade to server version v5.31.3 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.25 has ended and upgrading to server ESR v5.31.3 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).	
 - iPhone 5s devices and later with iOS 11+ is required.

### Bug Fixes

#### All apps
 - Fixed an issue where the app crashed when a message with only emojis included a hard break.

#### Android specific
 - Fixed Android push notifications so that they are now grouped by channel.

## 1.45.0 Release
- Release Date: July 16, 2021
- Server Versions Supported: Server v5.31.3+ is required. Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device.

### Compatibility
 - **Upgrade to server version v5.31.3 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.25 has ended and upgrading to server ESR v5.31.3 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).	
 - iPhone 5s devices and later with iOS 11+ is required.

### Highlights

#### Emoji Enhancements with Skin Tone Selection
 - Added support for emoji standard v13.0 with Mattermost server v5.37. **Note: Due to the upgrade to Emoji 13.0, some emojis may be missing on Android older than 11 and iOS older than 14.2.**

#### English-Australian Language Support
 - Mattermost is now available in English-Australian.

### Improvements
 - Added the ability to reply to individual messages from push notifications on Android.
 - Included message sender's user icon in push notifications.
 - Removed the nickname from the user autocomplete when the item is the current user.
 - The "swipe up to refresh" functionality was added back.

### Bug Fixes

#### All apps
 - Fixed an issue where the progress indicator did not display for all attachments in the post draft when adding multiple images at once.
 - Fixed an issue where tapping a channel link from a reply thread did not open the channel.
 - Fixed an issue that caused the reply from a push notification to fail when the message belonged to a thread.
 - Fixed an issue where the at-sign ``@`` was not ignored when searching for users.
 - Fixed the post draft to correctly detect if the channel being viewed is read only, including when the thread view is from a different channel than the current channel.
 - Fixed the render of auto-responder posts.
 - Fixed an issue where the option to join another team was not present after deleting cache & data.

#### Android specific
 - Fixed Android not being hidden when going back in the thread screen when the keyboard was opened.

#### iOS specific
 - Fixed an animation transition when displaying the options menu on iOS.

### Known Issues
 - Android app doesn't group notifications properly [MM-37134](https://mattermost.atlassian.net/browse/MM-37134).

## 1.44.1 Release
- Release Date: June 28, 2021
- Server Versions Supported: Server v5.31.3+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - **Upgrade to server version v5.31.3 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.25 has ended and upgrading to server ESR v5.31.3 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).	
 - iPhone 5s devices and later with iOS 11+ is required.

### Bug Fixes

#### All apps
 - Added a fix to prevent a crash when message attachments or app bindings were ``null``.
 - Fixed an issue where the app crashed when bringing the app from the background after tapping on a deep link.
 - Added back the permalink view from search, recent mentions, pinned and saved posts.
 - Fixed an issue where the custom status did not get reflected on the Mobile App until closing and reopening the app when changing the custom status from the webapp while the Mobile App was in the background.

#### iOS specific
 - Fixed an issue where the keyboard covered the messages on the channel screen.
 - Fixed an issue where a YouTube playback error could appear when clicking the thumbnail of a linked YouTube video.
 - Fixed an issue where the badge count on the app icon for iOS was incorrect.

## 1.44.0 Release
- Release Date: June 16, 2021
- Server Versions Supported: Server v5.31.3+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - **Upgrade to server version v5.31.3 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.25 has ended and upgrading to server ESR v5.31.3 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).	
 - iPhone 5s devices and later with iOS 11+ is required.

**Note:** Mattermost Mobile App v1.44.0 contains low to high level security fixes. Upgrading is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).

### Highlights

#### Custom Statuses
 - Added the custom status feature support for mobile apps. Mattermost server v5.36+ is required to access custom statuses on mobile.
 
#### Shared Channels
 - Added support for Shared Channels feature (Experimental, Enterprise Edition E20) by displaying information and icons for the shared channels and remote users. Also added shared channel filter for browser channels. This feature is available in Mattermost server versions v5.35.0+.

#### Hungarian Language (Beta)
 - Added a new language, Hungarian (beta).

### Improvements
 - Added support for localization with country variants.
 - The "swipe up to refresh" functionality was removed to fix an issue where the app performed slowly on Android devices.

### Bug Fixes

#### Android specific
 - Fixed an issue where the app performed slowly on Android devices that ran at 120fps instead of the normal 60fps.

### Known Issues
 - When changing the custom status from the webapp while the Mobile App is in the background, the custom status does not get reflected on the Mobile App until you close and re-open the Mobile App.
 - Users will need to be on v5.31.3 for the "Unsupported server version" in-app notice to go away as [5.31.3 fixes an issue](https://docs.mattermost.com/install/self-managed-changelog.html#release-v5-31-esr) where the server version was reported as v5.30.0.
 - On iOS, a YouTube playback error may appear when clicking the thumbnail of a linked YouTube video. A workaround is to tap on the link to open the video in YouTube.

## 1.43.0 Release
- Release Date: May 16, 2021
- Server Versions Supported: Server v5.31.3+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - **Upgrade to server version v5.31.3 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.25 has ended and upgrading to server ESR v5.31.3 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).	
 - iPhone 5s devices and later with iOS 11+ is required.

### Highlights

#### Support for Apps Framework (Developer Preview)
 - Apps Framework is now supported on the mobile client and allows developers to create Apps which have interactivity and buttons on mobile. You can learn more at https://developers.mattermost.com/integrate/apps/.

### Improvements
 - Added avatars to the sidebar Direct Messages and channel info.
 - On Websocket reconnect, instead of getting all the groups, only the updated groups are now fetched.
 - Team channels including archived channels are now fetched since the last known timestamp.

### Bug Fixes

#### All apps
 - Fixed an issue where appended skin tone emoji didn't render on the app.
 - Fixed an issue where users were unable to get to the last line when editing a very long post.
 - Fixed the user autocomplete by adding the current user to the list.

#### Android specific
 - Fixed an issue where archived teams were accessible and functional.
 - Fixed an issue where uploading files failed when uploading multiple files.

#### iOS specific
 - Fixed an issue on iPad where the last message rendered behind the input box.
 - Fixed an issue that caused the draft to be saved for a different channel when running the app on tablet devices.
 - Fixed an issue where the **Automatic replies** setting's **Done** button on the keyboard added a new line.

### Known Issues
 - Users will need to be on v5.31.3 for the "Unsupported server version" in-app notice to go away as [5.31.3 fixes an issue](https://docs.mattermost.com/install/self-managed-changelog.html#release-v5-31-esr) where the server version was reported as v5.30.0.
 - On iOS, a YouTube playback error may appear when clicking the thumbnail of a linked YouTube video. A workaround is to tap on the link to open the video in YouTube.
 - The app has been reported to perform slowly on Android devices that run at 120fps instead of the normal 60fps.

## 1.42.1 Release
- Release Date: April 19, 2021
- Server Versions Supported: Server v5.31.3+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - **Upgrade to server version v5.31.3 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.25 has ended and upgrading to server ESR v5.31.3 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).	
 - iPhone 5s devices and later with iOS 11+ is required.

### Bug Fixes

#### All apps
 - Set the minimum server version to 5.31.3 instead of 5.31.0 for the "Unsupported server version" in-app notice. Servers will need to be on v5.31.3 for the in-app notice to go away as [5.31.3 fixes an issue](https://docs.mattermost.com/install/self-managed-changelog.html#release-v5-31-esr) where the server version was reported as v5.30.0.

#### iOS specific
 - Fixed an issue where the app crashed on launch.

## 1.42.0 Release
- Release Date: April 16, 2021
- Server Versions Supported: Server v5.31.3+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - **Upgrade to server version v5.31.3 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.25 has ended and upgrading to server ESR v5.31.3 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).	
 - iPhone 5s devices and later with iOS 11+ is required.

### Highlights

#### Support for Apps Framework (Developer Preview)
 - This feature is available on Mobile Apps when Apps Framework becomes available on Mattermost v5.35.0 and the proxy plugin is loaded on an instance. The launch for the Developer Preview of the Apps Framework is scheduled for April 29th.

### Bug Fixes

#### All apps
 - Fixed an issue where the parser of images did not accept URL escaped string, contrary to what happens in the webapp.
 - Fixed an issue where images with a transparent background showed as black in the gallery.
 - Fixed an issue where the Mention Highlight Link Color was not being used properly.
 - Fixed an issue where sliding did not work when five images were uploaded.
 - Fixed a minor typo in the search **in:** modifier label.
 - Fixed an issue where OpenGraph without images did not show the image placeholder.

#### Android specific
 - Fixed an issue with frequent logouts on the latest Android OS.
 - Fixed an issue where the app crashed when pressing the back button while sharing an image.
 - Fixed an issue where uploading and sharing PDFs crashed the app.
 - Fixed an issue where the image gallery view had a weird behaviour and did not close smoothly.

### Known Issues
 - Users will need to be on v5.31.3 for the "Unsupported server version" in-app notice to go away as [5.31.3 fixes an issue](https://docs.mattermost.com/install/self-managed-changelog.html#release-v5-31-esr) where the server version was reported as v5.30.0.
 - The app has been reported to perform slowly on Android devices that run at 120fps instead of the normal 60fps.
 - The last message in a channel is sometimes rendered behind the message box on iPad devices.

## 1.41.1 Release
- Release Date: April 7, 2021
- Server Versions Supported: Server v5.25+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - **Upgrade to server version v5.25 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.19 has ended and upgrading to server ESR v5.25 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.

### Bug Fixes
 - Fixed an issue where authenticating with any SAML provider opened the default browser, breaking the app VPN tunnel.

## 1.41.0 Release
- Release Date: March 16, 2021
- Server Versions Supported: Server v5.25+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - **Upgrade to server version v5.25 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.19 has ended and upgrading to server ESR v5.25 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).	
 - iPhone 5s devices and later with iOS 11+ is required.

**Note:** Mattermost Mobile App v1.41.0 contains a high level security fix. Upgrading is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).

### Improvements
 - Refined animations for the new image gallery.
 - System Admins are now prompted before joining a private channel via a permalink.
 - The ``filteredEmojis`` is now calculated on first change.

### Bug Fixes

#### All apps
 - Fixed an issue where the status and reminder time did not get updated in "Update Status" screen in the Incident Collaboration plugin on the mobile apps.
 - Fixed an issue where a handler was missing for permalinks with ``_redirect``.

### Known Issues
 - Frequent logouts from the app have been experienced on the latest Android OS. Some ways to recover include logging out from the app and then uninstalling and installing the app, as well as restarting the device.
 - On Pixel 4a, uploading PDFs crashes the app and sharing files does not work.
 - The app has been reported to perform slowly on Android devices that run at 120fps instead of the normal 60fps.
 - The last message in a channel is sometimes rendered behind the message box on iPad devices.

## 1.40.0 Release
- Release Date: February 25, 2021
- Server Versions Supported: Server v5.25+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - **Upgrade to server version v5.25 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.19 has ended and upgrading to server ESR v5.25 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).	
 - iPhone 5s devices and later with iOS 11+ is required.
 
**Note:** Mattermost Mobile App v1.40.0 contains a low level security fix. Upgrading is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).

### Improvements
 - Added support for OpenID Connect (E20 Edition) - **This feature is available in Mattermost Cloud and will be available in upcoming server v5.33.0 (March 16th) release.**
 - Changed the OAuth / SAML login flow to utilize an external browser instead of the WebView in the Mobile App.
 - Added new languages, Bulgarian and Swedish.

### Bug Fixes

#### All apps
 - Fixed an issue where deeply nested asterisks caused the app to crash.
 - Fixed an issue where the app crashed when attempting to render a post whose attachment value was null.
 - Fixed an issue where in-app notification banner locked user interaction until the notification banner was dismissed.
 - Fixed an issue where posts with at-mentions were double posting if the user hit the **Send** button quickly multiple times in a thread.
 - Fixed an issue where users were unable to add more than 40 emoji reactions on a post.
 - Fixed an issue where unexpected emoji picker sometimes appeared in search results.
 - Fixed an issue where "(you)" did not appear after the current username when using ``@yourself`` autocomplete in a channel.

#### iOS specific
 - Fixed an issue where users were unable to scroll horizontally to view multiple file attachments.

### Known Issues
 - Frequent logouts from the app have been experienced on the latest Android OS. Some ways to recover include logging out from the app and then uninstalling and installing the app, as well as restarting the device.
 - On Pixel 4a, uploading PDFs crashes the app and sharing files does not work.
 - The app has been reported to perform slowly on Android devices that run at 120fps instead of the normal 60fps.
 - The last message in a channel is sometimes rendered behind the message box on iPad devices.

## 1.39.0 Release
- Release Date: January 16, 2021
- Server Versions Supported: Server v5.25+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - **Upgrade to server version v5.25 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.19 has ended and upgrading to server ESR v5.25 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.

### Improvements
 - Teams in the sidebar are now ordered by user preference.
 - Typing an emoji in a post now adds the emoji to the list of recently used emojis.

### Bug Fixes
 
#### All apps
 - Fixed an issue where users were unable to open files with file names that contained multiple dots.
 - Fixed an issue where ``/mscalendar settings`` did not redirect a user to the bot Direct Message channel.
 - Fixed an issue where tapping on an archived channel link from the app did not redirect the user to the archived channel.

#### Android specific
 - Fixed an issue where in some cases the deviceID used to receive push notifications wasn't being attached to the session as the registration completed.

#### iOS specific
 - Fixed an issue where custom URL schemes didn't work.

### Known Issues
 - Frequent logouts from the app have been experienced on the latest Android OS. Some ways to recover include logging out from the app and then uninstalling and installing the app, as well as restarting the device.
 - The app has been reported to perform slowly on Android devices that run at 120fps instead of the normal 60fps.
 - In-app notification banner locks user interaction until the notification banner is dismissed.
 - The last message in a channel is sometimes rendered behind the message box on iPad devices.

## 1.38.1 Release
- Release Date: December 18, 2020
- Server Versions Supported: Server v5.25+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - **Upgrade to server version v5.25 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.19 has ended and upgrading to server ESR v5.25 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.

### Bug Fixes
 - Fixed an issue where the v1.38.0 app crashed on iPadOS 14 when reopened from the app switcher.
 - Fixed an issue where the at-mention and slash command suggestion autocomplete modals blocked the post draft.

## 1.38.0 Release
- Release Date: December 16, 2020
- Server Versions Supported: Server v5.25+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - **Upgrade to server version v5.25 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.19 has ended and upgrading to server ESR v5.25 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.
 
**Note:** Support for landscape orientation was removed for non-tablet devices.

### Improvements
 - Added gallery user interface improvements.
 - Images now load progressively as the image comes into view-port instead of loading all the images on mount.
 - Mattermost is now resizeable on Android Desktops such as Samsung DeX.
 - "Something went wrong" message block is now vertically centered.

### Bug Fixes

#### All apps
 - Fixed an issue where the apps frequently failed to load channels for initial team.
 - Fixed an issue where all channel push notifications were cleared when opening one channel's push notification.
 - Fixed an issue where post edits and deletes propagated inconsistently.
 
#### Android specific
 - Fixed an issue where the list of Group Mentions was not updated when Groups were added or removed in an LDAP Group Synced Team.
 - Fixed an issue where a group mention was highlighted by default before it was posted.

#### iOS specific
 - Fixed an issue where the header area overlapped notch on launch on iPhone 12.
 
### Known Issues
 - At-mention and slash command suggestion autocomplete modals block post draft.

## 1.37.0 Release
- Release Date: November 16, 2020
- Server Versions Supported: Server v5.25+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - **Upgrade to server version v5.25 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.19 has ended and upgrading to server ESR v5.25 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.

### Improvements
 - Icons have been updated across the app to be more consistent and adhere to new design standards.
 - The user autocomplete now allows matching on terms with spaces (For example: @firstname lastName) the same way as in the WebApp.

### Bug Fixes

#### All apps
 - Fixed an issue where the app crashed when a user received a notification while dismissing a modal.
 - Fixed an issue where users were still able to paste files in the message box even when mobile file uploads were disabled in the System Console.
 - Fixed an issue where tapping on an invalid permalink showed an error.
 - Fixed an issue where Global Default notification channel setting displayed incorrect notification defaults.
 - Fixed an issue where the channel info count for Group Messages did not match the total number of users when both active and deactivated users were present.
 - Fixed an issue where the hamburger icon width had changed and notification badges were misaligned.
 - Fixed an issue where the redux-persist serializer did not return a value based on the type of the argument.
 
#### Android specific
 - Fixed an issue where the Android app added autofill data in the chat box.
 - Fixed an issue where the Android app defaulted to Town Square after sharing a file outside of the app.

## 1.36.0 Release
- Release Date: October 16, 2020
- Server Versions Supported: Server v5.25+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - **Upgrade to server version v5.25 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.19 has ended and upgrading to server ESR v5.25 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.

### Improvements
 - Added **Channel Info > Notification Preferences** to add the ability to edit mobile push notification settings at the channel level.
 - Server URL now autofills when opening the app from a mobile browser landing page.
 - Added support for accessibility to the channel header buttons.
 - Refactored the post draft component, including writing and posting messages, attaching images, using the autocomplete functionality, showing alerts from group mentions and channel wide mentions, and executing slash commands.
 - Improved the empty state screen for Recent Mentions.
 - Improved ``in:@user`` search to return Direct and Group Message search results.
 - Improved styling of Read Only channels.
 - Removed the filename from an error message when an image/video was too large.
 - Improved unread badge styling of the hamburger menu and team icons.
 - Improved styling of autocomplete modals.
 - Improved the validation error message of the Enter Server URL screen when entering an invalid server URL.

### Bug Fixes

#### All apps
 - Fixed an issue where a hashtag (#) character added to an announcement banner caused the app to display a blank screen.
 - Fixed an issue where users were still able to upload files via the share extension when ``EnableMobileFileUpload`` was disabled on the server.
 - Fixed an issue where a draft message on the reply thread was not retained if the user navigated away from the thread.
 - Fixed an issue where a thumbnail of a file attachment posted in a reply thread displayed in the center channel.
 - Fixed an issue where users were unable to join public channels via channel links.

#### iOS specific
 - Fixed an issue where user received an error when opening links on iOS 14 when Safari was not set as the default browser.

## 1.35.1 Release
- Release Date: September 21, 2020
- Server Versions Supported: Server v5.19+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - **Upgrade to server version v5.19 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.9 has ended and upgrading to server ESR v5.19 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app. See [this blog post](https://mattermost.com/blog/support-for-esr-5-9-has-ended/) for more details.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.

### Bug Fixes
 - Fixed an issue where the app crashed when tapping on "Show More" on a long post and then tapping on the post to go to the thread.

## 1.35.0 Release
- Release Date: September 16, 2020
- Server Versions Supported: Server v5.19+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - **Upgrade to server version v5.19 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.9 has ended and upgrading to server ESR v5.19 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app. See [this blog post](https://mattermost.com/blog/support-for-esr-5-9-has-ended/) for more details.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.

### Highlights

#### Upgrade to React Native 0.63.2
 - React Native 0.63.2 introduces performance and stability improvements to the core app platform.

### Improvements
 - Addded a default empty search state for the emoji picker screen.
 - Added an alert box to let users know what happened when removed from a channel they were viewing.

### Bug Fixes

#### All apps
 - Fixed an issue where the app crashed on a channel that had lot of images and attachments.
 - Fixed an issue where YouTube videos rendered as OpenGraph objects but also displayed play buttons when posted using bit.ly links.
 - Fixed an issue where at-mention notifications followed by a period were not highlighted.
 - Fixed an issue where the permission to delete other users' posts did not function independently of deleting own posts.
 - Fixed an issue where archiving a channel while in the permalink view cleared the permalink view content.
 - Fixed an issue where edits to “Full Name” in Mattermost profile got overwritten by the setting from the GitLab / Google / Office365 Single Sign-On providers.
 - Fixed an issue where an AD/LDAP group mention of an outsider group was highlighted on a Group Synced channel.

#### Android specific
 - Fixed an issue where users were unable to upload files with spaces in the file name.

#### iOS specific
 - Fixed an issue where using keyboard dictation sent a blank message.
 - Fixed an issue where users were unable to swipe to close the left-hand side after closing the keyboard.
 - Fixed an issue where the channel info screen ``This channel has guests`` text was out of safe area.
 
### Known Issues
 - Some Android devices running Android 11 may notice some choppiness in certain animations.

## 1.34.1 Release
- Release Date: August 27, 2020
- Server Versions Supported: Server v5.19+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - **Upgrade to server version v5.19 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.9 has ended and upgrading to server ESR v5.19 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app. See [this blog post](https://mattermost.com/blog/support-for-esr-5-9-has-ended/) for more details.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.

### Bug Fixes
 - Fixed an issue where GitLab SSO was appending a # sign causing the app to fail on further requests.
 - Fixed an issue where an "Hair on fire" emoji caused the app to crash.
 - Fixed an issue where the app crashed when receiving a push notification when having special characters in the Nickname field.

## 1.34.0 Release
- Release Date: August 16, 2020
- Server Versions Supported: Server v5.19+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - **Upgrade to server version v5.19 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.9 has ended and upgrading to server ESR v5.19 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app. See [this blog post](https://mattermost.com/blog/support-for-esr-5-9-has-ended/) for more details.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.
 
### Highlights
 - End users will now receive an in-app notification to contact their System Admin to upgrade the server version if they are running versions v5.18 and below.
 - Added support for [LDAP group mentions (E20 feature)](https://docs.mattermost.com/onboard/ad-ldap-groups-synchronization.html) for mobile apps.
 - Added support for non-cached slash command autocomplete for mobile apps.

### Improvements
 - Removed auto-scrolling to the new message line on channel load and added a "More Messages" button when there are unread posts.
 - Improved screen styling for iOS Settings, Profile, Channel Info, "+" button for DMs and channels, Create Channel, and other user profile pages.
 - Added the ability to view users' first and last name in the profile view.
 - Added support on Android for showing a toast to exit when pressing the back button on channel screen.
 - Added the ability for editing others' posts to function independently of Edit Own Posts.
 
### Bug Fixes

#### All apps
 - Fixed an issue where an endless spinner instead of an error message was displayed when SSO login action failed.
 - Fixed an issue where users were unable to create channels when first joining a team.
 - Fixed an issue where an extra separator line appeared above the message box in landscape view after using mentions autocomplete.
 - Fixed an issue where the at-symbol was shown twice when clicking on the at-icon.

#### Android specific
 - Fixed an issue with keyboard glitches after using an invalid slash command.
 - Fixed an issue where the keyboard did not disappear when closing the channel sidebar **More** screen.
 - Fixed an issue where typing right after clicking the send button didn't clear the old message.

#### iOS specific
 - Fixed an issue where users were unable to edit a message that contained a bullet list.
 - Fixed an issue where user was unable to scroll or tap on emoji autocomplete in post **Edit** screen.
 - Fixed an issue where the channel list was not scrolled to the bottom when a new message was received while the keyboard was open.

## 1.33.1 Release
- Release Date: July 15, 2020
- Server Versions Supported: Server v5.19+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - **Upgrade to server version v5.19 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.9 has ended and upgrading to server ESR v5.19 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app. See [this blog post](https://mattermost.com/blog/support-for-esr-5-9-has-ended/) for more details.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.
 
### Bug Fixes
 - Fixed an issue where the apps crashed when a malformed YouTube link was posted in a channel.

## 1.33.0 Release
- Release Date: July 16, 2020
- Server Versions Supported: Server v5.19+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - **Upgrade to server version v5.19 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.9 has ended and upgrading to server ESR v5.19 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app. See [this blog post](https://mattermost.com/blog/support-for-esr-5-9-has-ended/) for more details.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.
 
### Breaking Changes
 - Starting with mobile app v1.33.0, users on server versions below v5.19 may experience issues with how attachments, link previews, reactions and embed data are displayed. Updating your server to v5.19 or later is required.
 
**Note:** Mattermost Mobile App v1.33.0 contains a low level security fix. Upgrading is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).
 
### Highlights
 -  System admins will now receive an in-app notification to upgrade their server version if they are running versions v5.18 and below.

### Improvements
 - Removed **Select Team** title in cases where teams aren't loading.
 - The at-mention and search autocompletes now render even if there is a server request or a network outage.
 
### Bug Fixes

#### All apps
 - Fixed an issue where push notifications did not redirect to the correct channel when the app was not running in the background.
 - Fixed an issue where Enterprise mobility management (EMM) filled username field was not accepted as a valid username.
 - Fixed an issue where the app did not open on server url screen with previous server url filled in after logging out.
 - Fixed an issue where leaving a team in a browser while the mobile app was open caused the app to be stuck in the team.
 - Fixed an issue where, when hitting the **Delete Documents & Data** button, the button to join the team disappeared.
 - Fixed an issue where the channel header transition to landscape mode was slow.
 - Fixed an issue where teams were not listed alphabetically on the **Select Team** screen.
 - Fixed an issue where a currently active unread channel was not bolded.
 - Fixed an issue where a team icon was not visible on the left-hand side.
 - Fixed an issue where user was unable to create channels directly after joining a team.
 - Fixed an issue where the **:** search date picker on edit replaced the date and left old date info.
 - Fixed an issue where a confusing **Invalid Message** banner was present on Edit Message modal when typing a message that was over the character limit.
 - Fixed an issue with an unhandled error when logging out from the **Select Team** screen.
 - Fixed an issue where an error message on Server URL screen moved strangely when the keyboard slid on.
 - Fixed an issue with an uneven horizontal margins around **Jump to** box.
 - Fixed an issue where the OneLogin button had a blue outline, but a green fill.

#### Android specific
 - Fixed an issue where hitting edit multiple times opened the edit window without a save button.

#### iOS specific
 - Fixed an issue where ``switchKeyboardForCodeBlocks`` crashed the app on iOS 11.
 - Fixed an issue where the Enter key did not work in search when using an iPad with an external keyboard.
 - Fixed an issue where OAuth and SAML single sign-on (SSO) no longer required re-entering credentials after logging out and logging back in.

## 1.32.2 Release
- Release Date: June 26, 2020
- Server Versions Supported: Server v5.19+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - **Upgrade to server version v5.19 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.9 has ended and upgrading to server ESR v5.19 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app. See [this blog post](https://mattermost.com/blog/support-for-esr-5-9-has-ended/) for more details.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.

### Bug Fixes
 - Fixed an issue where some users on the v1.32.0 or v1.32.1 mobile apps authenticating with GitLab or Office365 Single Sign-On (SSO) to a Mattermost server using a subpath were unable to login to the app. Some users authenticating to Mattermost using SAML SSO with two-factor authentication or authenticating to Mattermost with an SSO provider that utilizes query strings as part of the authentication URLs were also impacted.
 - Fixed an issue where opening the app was causing an "Unexpected Error" due to a failed migration.

## 1.32.1 Release
- Release Date: June 25, 2020
- Server Versions Supported: Server v5.19+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - **Upgrade to server version v5.19 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.9 has ended and upgrading to server ESR v5.19 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app. See [this blog post](https://mattermost.com/blog/support-for-esr-5-9-has-ended/) for more details.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.

### Bug Fixes
 - Fixed an issue where Android app cold start and channel switching were slow.

## 1.32.0 Release
- Release Date: June 16, 2020
- Server Versions Supported: Server v5.19+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - **Upgrade to server version v5.19 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.9 has ended and upgrading to server ESR v5.19 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app. See [this blog post](https://mattermost.com/blog/support-for-esr-5-9-has-ended/) for more details.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.

### Breaking Changes
 - On mobile apps, users will not be able to see group mentions (E20 feature) in the autocomplete dropdown. Users will still receive notifications if they are part of an LDAP group. However, the group mention keyword will not be highlighted.
 - **Upcoming breaking change** Starting with mobile app v1.33.0 (to be released on July 16th), users on server versions below v5.19 may experience issues with how attachments, link previews, reactions and embed data are displayed. Updating your server to v5.19 or later is required.
 
### Highlights

#### Quick access to emoji reactions 
 - Long press on a post and add recently used reactions in a single tap.
 
#### Upgrade to React Native 0.62
 - React Native 0.62 introduces performance and stability improvements to the core app platform.

### Improvements
 - Automatic retry when id-loaded push notification fails to fetch on receipt.
 - An appropriate error message is now shown when connecting to the server on the mobile app with an invalid SSL certificate.
 - Added the ability to find users by nickname when searching using ``@``.
 - Added the ability to view first and last name in profile view.
 - Improved the search bar to have smoother animations.
 
### Bug Fixes

#### All apps
 - Fixed an issue with an infinite skeleton channel screen on app relaunch when ``ExperimentalPrimaryTeam setting`` was enabled.
 - Fixed an issue where users were scrolled to old messages when switching to a channel with unread messages.
 - Fixed an issue where a logout message for session expiration was missing.
 - Fixed an issue where the app did not properly handle server URL and SSO redirects.
 - Fixed an issue where Direct and Group Messages disappeared from the left-hand side after opening them on webapp.
 - Fixed an issue where a crash occurred instead of showing proper error on entering invalid MFA token.
 - Fixed an issue where a user could not interact with the app until in-app notifications were dismissed.
 - Fixed an issue where using emoji on an instance with the custom emoji feature disabled triggered a "Custom emoji have been disabled by the system admin" error in the server logs.
 - Fixed an issue where the replay icon was cut off on full screen video preview.

#### Android specific
 - Fixed an issue where dropdowns in the channel modal were hard to read.
 
#### Known issues
 - Signing in with supported SSO methods (OKTA, OneLogin, GitLab and Office365) may fail to redirect on iOS 12. It is recommended to use iOS 13 if any issues are encountered.

## 1.31.2 Release
- Release Date: May 27, 2020
- Server Versions Supported: Server v5.19+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - **Upgrade to server version v5.19 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.9 has ended and upgrading to server ESR v5.19 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app. See [this blog post](https://mattermost.com/blog/support-for-esr-5-9-has-ended/) for more details.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.
 
Mattermost Mobile App v1.31.2 contains a high level security fix. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).
 
### Bug Fixes
 - Fixed an issue where file uploads failed due to a time out when the [Antivirus plugin](https://github.com/mattermost/mattermost-plugin-antivirus) was enabled.

## 1.31.1 Release
- Release Date: May 22, 2020
- Server Versions Supported: Server v5.19+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - **Upgrade to server version v5.19 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.9 has ended and upgrading to server ESR v5.19 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app. See [this blog post](https://mattermost.com/blog/support-for-esr-5-9-has-ended/) for more details.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.
 
### Bug Fixes
 - Fixed a crash issue on Android when preloading images.

## 1.31.0 Release
- Release Date: May 16, 2020
- Server Versions Supported: Server v5.19+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - **Upgrade to server version v5.19 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) 5.9 has ended and upgrading to server ESR v5.19 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app. See [this blog post](https://mattermost.com/blog/support-for-esr-5-9-has-ended/) for more details.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.

### Improvements
 - Improved network reliability and channel switching time for unread channels by fetching new posts as soon as the app reconnects.
 
### Bug Fixes

#### All apps
 - Fixed an issue where slash commands with long descriptions had their description text truncated in the slash command autocomplete.
 - Fixed an issue where users could not swipe up to dismiss in-app push notifications.
 - Fixed an issue where the username that created the webhook was shown on webhook posts instead of the name of the bot.
 - Fixed an issue where posts on the same thread appeared to be from different threads since the "...commented on [Thread Title]" was shown on all posts in the thread.
 - Fixed an issue where the system message for "Edit Channel Purpose" rendered markdown.

#### iOS specific
 - Fixed an issue where code block numbering was obstructed by the iPhone's notch.
 - Fixed an issue where the search text box was partially obstructed in landscape mode.
 - Fixed an issue where using `Share...` option to post highlighted text to the app threw an error.
 - Fixed an issue where the "back" button color was incorrect when transitioning from Thread screen to Channel screen.
 - Fixed an issue where the keyboard flashed a darker color when opening Keywords from **Settings > Notifications > Mentions and replies**.

#### Android specific
 - Fixed an issue where the keyboard did not close after editing a message.

## 1.30.1 Release
- Release Date: April 24, 2020
- Server Versions Supported: Server v5.19+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.
 
### Bug Fixes

#### All apps
 - Fixed an issue with repeated forced logouts.
 - Fixed an issue where channels appeared as read-only when opening the app.
 - Fixed an issue where users were unable to log in if ``ExperimentalStrictCSRFEnforcement`` setting was enabled.
    - A clean install may be required for the fix to take effect by uninstalling v1.30.0 (Build 285) and then installing v1.30.1 (Build 287).
 - Fixed an issue where a "No internet connection" error occurred when deleting documents and data.

#### iOS specific
 - Fixed an issue where Mattermost app crashed when Enterprise mobility management (EMM) was enabled.

#### Android specific
 - Fixed an issue where using backspace out of a conversation thread or a channel caused a forced logout.
 - Fixed an issue where a video upload attempt failed with an error.

## 1.30.0 Release
- Release Date: April 16, 2020
- Server Versions Supported: Server v5.19+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.
 
Mattermost Mobile App v1.30.0 contains a high level security fix. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).
 
**Note:** v5.9.0 as our Extended Support Release (ESR) is coming to the end of its lifecycle and upgrading to 5.19.0 ESR or a later version is highly recommended. v5.19.0 will continue to be our current ESR until October 15, 2020. [Learn more in our forum post](https://forum.mattermost.com/t/upcoming-extended-support-release-updates/8526>).

**Note:** [The Channel Moderation Settings feature](https://docs.mattermost.com/manage/team-channel-members.html#channel-moderation-e20) released in v5.22.0 is supported on mobile app versions v1.30 and later. In earlier versions of the mobile app, users who attempt to post or react to posts without proper permissions will see an error.
 
### Improvements
 - Significantly improved Android performance, including how quickly posts in the center screen are displayed.
 - Added support for different interactive message button styles on mobile.
 - Enter key on hardware Android keyboard now posts a message.
 - The statuses of those users that are in the Direct Message list are now fetched when opening the app and on login.
 - Added "Unarchive Channel" option to the channel info screen.
 
### Bug Fixes

#### All apps
 - Fixed an issue where the modal popped down when attempting to scroll down to see if there are more emoji.
 - Fixed a few crash issues.
 - Fixed an issue where the navigation bar tucked under status bar when using photo or camera post icons in landscape.
 - Removed mark as unread option from post menus for archived channels.
 - Fixed an issue where the "Refreshing message failed" error was shown when starting a Direct Message with a new user without a verified email.
 - Fixed an issue where Markdown tables was rendering in full in the center channel on larger screen sizes.
 - Made the name displayed consistent with teammate display name setting.
 - Fixed some selected emojis in autocomplete from rendering properly when posted.

#### iOS specific
 - Fixed an issue on iOS where the navigation bar tucked under status bar when using photo or camera post icons in landscape.
 - Fixed an issue on iOS where Automatic Replies custom message text box was obstructed by the iPhone's notch.
 - Fixed an issue on iOS where double dashes in mobile inside a code block got converted to emdash.

#### Android specific
 - Fixed an issue on Android where downloading a file or video was not reporting progress.
 - Fixed an issue on Android that was preventing to share content through the share extension.

## 1.29.0 Release
- Release Date: March 16, 2020
- Server Versions Supported: Server v5.9+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.

**Note:** The persisted sidebar on Android tablets was removed in order to significantly improve the mobile app performance.

**Note:** An issue was fixed where a user's status was set as online when replying to a message from a push notification. This fix only works in combination with server v5.20.0+.
 
### Improvements
 - Significantly improved how quickly channels load when you open the app and when you switch between them.
 - Set all requests timeouts to a maximum of five seconds to improve reliability on bad networks.
 - Changed "Copy Permalink" to "Copy Link" for readability.
 
### Bug Fixes
 - Fixed an issue where downloaded files on Android had the words `download successful` appended to their filenames, preventing the file from being opened until it was renamed in the file manager.
 - Fixed a silent crash on Android when receiving a push notification.
 - Fixed an issue on Android where users could not swipe to close sidebar unless the gesture was initiated outside of the sidebar.
 - Fixed an issue where channels drawers were partially shown with orientation change on iOS RN61.
 - Fixed an issue on iOS where the message box obstructed the bottom part of the message when opened from the notification banner.
 - Fixed an issue where switching teams showed the center channel from the old team until the new team's channel data got loaded.
 - Fixed an issue where users could not post messages after returning from an archived channel.
 - Fixed an issue where user experienced infinite scrolling when viewing all public joinable/archived channels.
 - Fixed an issue where archived channels membership was lost on the client.
 - Fixed an issue on iOS where the channel intro scrolled past the top of the channel.
 - Fixed an issue on Android where inline custom emojis did not display in portrait mode.
 - Fixed an issue where markdown tables did not display all rows in a post when it had multiple heights.
 - Fixed an issue where deleting documents and data caused a flash of the background when the app reloaded.
 - Fixed an issue where tall and thin image attachments got pushed to the left instead of appearing centered.
 
### Known Issues
 - Some gender neutral emojis don't render as jumbo emojis.

## 1.28.0 Release
- Release Date: February 16, 2020
- Server Versions Supported: Server v5.9+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.
 
### Highlights

#### UI/UX Improvements to the Post Draft Area
 - Links added to facilitate easier access to common functions:
   - finding channel members for @mentioning;
   - finding and referencing slash commands;
   - attaching photos and videos;
   - accessing the camera

#### Deep Linking
 - Links to posts in email notifications now launch to a browser landing page with option to open in the Mobile app.

### Improvements
 - Removed markdown rendering from Channel Purpose in channel info screen.
 - Improved channel info transition so that it opens up as a modal rather than as a drawer from the right.
 - Clicking on the time in the iOS status bar now scrolls up the center channel.
 - Improved the sliding behaviour of the left-hand sidebar on iOS.
 - Added more responsiveness to markdown tables.
 - User's own username with a suffix 'you' is now shown in the username autocomplete.
 - Improved sorting of emojis in the emoji picker so that thumbsup is sorted first, then thumbsdown, and then custom emoji.

### Bug Fixes
 - Fixed an issue on Android where the app displayed an incorrect timestamp when the experimental Timezone setting was disabled.
 - Fixed an issue where combined system messages with many users listed hid posts above them.
 - Fixed an issue on iOS where the app crashed when pasting a GIF via the keyboard.
 - Fixed an issue where explicit links to teams and channels on the same server currently logged in to didn't switch to that team and channel.
 - Fixed an issue where the keyboard glitched when returning to the main channel view after viewing a code block in the right-hand side.
 - Fixed an issue with default boolean values in interactive dialogs.
 
### Known Issues
 - Markdown tables are missing a header colour.

## 1.27.1 Release
- Release Date: January 21, 2020
- Server Versions Supported: Server v5.9+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.

### Bug Fixes
 - Fixed an issue where all previously auto-closed Direct Message channels were listed in the channel sidebar.
 - Fixed a regression affecting webapp and mobile apps where some users were experiencing client-side performance issues. This was mainly affecting users with more than 100 channels listed in the channel sidebar and with channels sorted alphabetically.

## 1.27.0 Release
- Release Date: January 16, 2020
- Server Versions Supported: Server v5.9+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.

### Bug Fixes
 - Fixed an issue where flaky networks caused users to miss messages when at the top of the channel.
 - Fixed an issue where uploading image attachments in the mobile app was not working in some cases.
 - Fixed an issue where joining a user's first team from the mobile apps failed.
 - Fixed an issue where an unexpected `More New Messages Above` line appeared when marking a first post as unread in a Direct Message or Group Message channel.
 - Fixed an issue where disagreeing with custom Terms of Service gives users a glimpse of the app.
 - Fixed an issue on Android where the Back button did not dismiss the modal before dismissing the sidebar.
 - Fixed an issue where a message draft was lost after attempting to post an invalid slash command.
 - Fixed an issue where timestamps on 12-hour format had a leading zero.
 - Fixed an issue where the display name of a post was truncated even when there was enough space to render it on landscape.
 - Fixed an issue where the post input field icon was mis-aligned.
 - Fixed an issue where system message mentions were not at 100% opacity compared to non-system messages.
 
### Known Issues
 - Text box obstructs bottom part of messages in Direct Message channels when opened from a notification banner. [MM-21276](https://mattermost.atlassian.net/browse/MM-21276)

## 1.26.2 Release
- Release Date: January 7, 2020
- Server Versions Supported: Server v5.9+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.

### Bug Fixes
 - Fixed an issue on iOS where the mobile app was not usable if ``inAppPincode`` was enabled.

## 1.26.1 Release
- Release Date: December 20, 2019
- Server Versions Supported: Server v5.9+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.

### Bug Fixes
 - Fixed a crash issue on Android and iOS on server versions prior to the v5.9.0 Extended Support Release (ESR).
 - Fixed a crash when connecting the WebSocket to a server with Cert Based Auth (CBA) enabled.

## 1.26.0 Release
- Release Date: December 16, 2019
- Server Versions Supported: Server v5.9+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.
 
Mattermost Mobile App v1.26.0 contains low to medium level security fixes. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/).

### Highlights

#### Improved Styling for File, Image and Video Attachments, Including In-line Image Thumbnails

#### Mark as Unread
 - With server v5.18 and above, users can stay on top of important messages with a new feature that allows marking posts as unread. After doing so, users will automatically land on the unread post the next time they click on the relevant channel.

#### Push Notification Message Contents Fetched from the Server on Receipt (E20)
 - Allows push notifications to be delivered showing the full message contents that are fetched from the server once the notification is delivered to the device. This means that Apple Push Notification Service (APNS) or Google Firebase Cloud Messaging (FCM) cannot read the message contents since only a unique message ID is sent in the notification payload. 

#### Upgraded RN to v0.61

### Improvements
- Added support for pasting other file types such as videos, PDFs and documents.
- Added the option to convert public channels to private in the channel info screen.
- Added support for reading the channel drawer button with voice-over.
- Made usernames in system messages tappable.
- Added an autocomplete to edit post screen.
- Added a count for pinned posts icon.
- Updated the channel name length character limit to 64 to match server.
- Added an expand button to truncated markdown tables to improve discoverability of opening them in full screen.
- Added an error message when trying to share too long text from share extension.
- Improved behaviour where posts from different authors in the same thread appeared to be from different threads if separated by new message line.
- Added support for native emojis in the emoji picker and autocomplete.
- Removed reactions and file attachments from the long post view.
- Large number of emoji reactions now wrap instead of introducing horizontal scroll.
- Added support for a generic error message in interactive dialog responses.
- Added the ability to disable attachment buttons and fields.

### Bug Fixes
- Fixed an issue on Android where the app slowed down when opening a channel with large number of animated emoji.
- Fixed an issue where the app crashed when pasting a large file to the text box from the clipboard.
- Fixed an issue where the app crashed when previewing large GIF files.
- Fixed an issue where the app crashed when using the emoji category selector.
- Fixed an issue where the app was not able to play YouTube videos.
- Fixed an issue where images/videos could not be saved.
- Fixed an issue where channels archived via the command line interface were still visible on the left-hand side and accessible on mobile apps.
- Fixed an issue where the thread header in landscape view was wider than the main channel view header.
- Fixed an issue where sidebar separator line was misaligned between Teams and Channel view.
- Fixed an issue on iOS where the channel spinner appeared black on a dark theme.
- Fixed an issue where an asterisk appeared on the "Nickname" and "Position" fields in Edit Profile screen even though nickname is not handled through the login provider.
- Fixed an issue where the filtered list for emojis opened above the edit box and behind the channel header when adding an emoji to channel header using ``:emoji:``.

## 1.25.1 Release
- Release Date: November 22, 2019
- Server Versions Supported: Server v5.9+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.

### Bug Fixes
 - Fixed a crash issue on iOS when SSO cookies did not contain an expiration date during login.
 - Fixed a crash issue on Android caused by notification channels being unavailable in Android 7.
 - Fixed an issue on Android where Enterprise Mobility Management (EMM) blur app screen did not work.
 - Fixed an issue where changing team/channel when sharing several files closed the share dialog.

## 1.25.0 Release
- Release Date: November 16, 2019
- Server Versions Supported: Server v5.9+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.

### Bug Fixes
 - Fixed an issue where Mattermost monokai theme no longer worked properly on mobile apps.
 - Fixed an issue on Android where the notification badge count didn't update when using multiple channels.
 - Fixed an issue on Android where test notifications did not work properly.
 - Fixed an issue where "In-app" notifications caused the app badge count to get out of sync.
 - Fixed an issue on Android where email notification setting displayed was not updated when the setting was changed.
 - Fixed an issue where Favorite channels list didn't update if the app was running in the background.
 - Fixed an issue where the timezone setting did not update when changing it back to set automatically.
 - Fixed an issue on iOS where clicking on a hashtag from "recent mentions" (or flagged posts) returned the user to the channel instead of displaying hashtag search results.
 - Fixed an issue where tapping on a hashtag engaged a keyboard for a moment before displaying search results.
 - Fixed an issue where posts of the same thread appeared to be from different threads if separated by a new message line.
 - Fixed styling issues on iOS for Name, Purpose and Header information on the channel info screen.
 - Fixed styling issues with bot posts timestamps in search results and pinned posts.
 - Fixed styling issues on single sign-on screen in landscape view on iOS iPhone X and later.
 - Fixed styling issues on iOS for the Helper text on Settings screens.
 - Fixed an issue where the thread view header theme was inconsistent during transition back to main channel view.
 - Fixed an issue on iOS where the navigation bar tucked under the phone's status bar when switching orientation.
 - Fixed an issue on iOS where the keyboard flashed darker when Automatic Replies had been previously enabled.
 - Fixed an issue on Android where uploading pictures from storage or camera required unwanted permissions.
 - Fixed an issue where ``mobile.message_length.message`` did not match webapp's ``create_post.error_message``.
 
### Known Issues
 - App slows down when opening a channel with large number of animated emoji. [MM-15792](https://mattermost.atlassian.net/browse/MM-15792)

## 1.24.0 Release
- Release Date: October 16, 2019
- Server Versions Supported: Server v5.9+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.

### Highlights

#### Sidebar UI/UX improvements
 - Improved usability and styling of the channel drawer.

### Improvements
 - Added the ability to paste images on input text box.
 - Added copy and paste protection managed configuration support for Android.
 - Added a confirmation dialog when posting a message with `@channel` and `@all`.
 - Added support for safe area in landscape view on iOS.
 - Changed recent date separators to read Today/Yesterday.
 - Added an autocomplete to the edit channel screen.
 - Emoji picker search now ignores the leading colon.
 - Added support for emoji not requiring a whitespace to render.
 - Added support for footer and footer_icon in message attachments.
 - Added a password type for interactive dialogs.
 - Added support for introductory markdown paragraph in interactive dialogs.
 - Added support for boolean elements in interactive dialogs.
 - Improved the permissions prompt if Mattermost doesn't have permission to the photo library.

### Bug Fixes
 - Fixed an issue where the notification badge could get out of sync when reading messages in another client.
 - Fixed an issue where the notification badge number did not reset when opening a push notification.
 - Fixed an issue where SafeArea insets were not working properly on new iPhone 11 models.
 - Fixed an issue where long press on a system message in an archived channel locked up the app.
 - Fixed an issue where tapping on a hashtag while replying to search results didn't open search correctly.
 - Fixed an issue where the channel list panel was missing for a user when they were added to a new team by another user.
 - Fixed an issue where once in a thread, pressing a channel link appeared to do nothing.
 - Fixed an issue where file previews could scroll to the left until all files were out of view.
 - Fixed an issue on iOS where user was unable to select an emoji from two rows on the bottom of the emoji picker.
 - Fixed an issue where duplicate pinned posts displayed after editing pinned post from Pinned Posts screen.
 - Fixed an issue where the reply arrow overlapped a posts's timestamp in some cases.
 - Fixed an issue where post textbox did not clear after using a slash command.
 - Fixed an issue where users were are not immediately removed from the mention auto-complete when those users were deactivated.
 - Fixed an issue where returning to a channel from a thread view could trigger a long-press menu that couldn't be dismissed.
 - Fixed an issue with a missing "(you)" suffix in the channel header of a self Direct Message.
 - Fixed an issue where the Connected banner got stuck open after the WebSocket was connected.
 - Fixed an issue where the text input area in Android Share extension did not use available space.
 - Fixed an issue where Windows dark theme was not consistent when viewing an archived channel.
 - Fixed an issue where interactive dialogs rendered out of safe area view on landscape orientation.
 - Fixed an issue where a themed "Delete Documents & Data" action flashed a white screen.

### Known Issues
 - App slows down when opening a channel with large number of animated emoji. [MM-15792](https://mattermost.atlassian.net/browse/MM-15792)

## 1.23.1 Release
- Release Date: September 27, 2019
- Server Versions Supported: Server v5.9+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.

### Bug Fixes
 - Fixed issues causing the app to crash on some devices.

## 1.23.0 Release
- Release Date: September 16, 2019
- Server Versions Supported: Server v5.9+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.

### Bug Fixes
 - Fixed an issue where some Giphy actions were not working in ephemeral posts on mobile.
 - Fixed an issue where users were unable to create new channels when "Combine all channel types" was selected.
 - Fixed an issue on Android EMM where a crash occurred when tapping **Go to Settings**.
 - Fixed an issue on iOS where the in-app "Date" localization persisted after server and user changed.
 - Fixed an issue where the download step was showing when previewing a video right after posting it. 
 - Fixed an issue on Android where cancelling a video download twice in a row showed an error.
 - Fixed an issue where file attachment thumbnail/preview could fail to load and not be able to be reloaded.
 - Fixed an issue on Android where **Channel > Add Members > ADD** text changed to black.
 - Fixed an issue on iOS where the **Cancel** label text didn't fit in one line in German language.
 - Fixed an issue where longer than allowed reply posts kept showing a warning with every backspace.
 - Fixed an issue where there was a delay in search box and emoji content width change when switching to/from portrait/landscape view.
 - Fixed an issue where deactivated users did not appear in the "Jump to..." screen.
 - Fixed an issue where "@undefined has joined the channel" was shown instead of "Someone has joined the channel" when a user joined a channel that another user was viewing.
 - Fixed an issue on Android where the reply arrow was cut off in search results.
 - Fixed an issue where changing display theme from webapp didn't work properly on mobile.
 - Fixed an issue on iOS where a bot account icon style was broken.
 - Fixed an issue with an incorrect UI text for location of touch ID setting.
 
### Known Issues
  - App slows down when opening a channel with large number of animated emoji. [MM-15792](https://mattermost.atlassian.net/browse/MM-15792)
  - When users are deactivated, they are not immediately removed from the mention auto-complete. [MM-17953](https://mattermost.atlassian.net/browse/MM-17953)

## 1.22.1 Release
- Release Date: August 23, 2019
- Server Versions Supported: Server v5.9+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.

### Bug Fixes
 - Fixed an issue where the apps crashed when setting the language to Chinese Traditional.
 - Fixed an issue on Android where push notification receipt delivery failed due to invalid server URL.
 - Fixed an issue where the apps crashed when launched via a notification.
 - Fixed an issue where posts made while the app was closed did not appear until refresh.

## 1.22.0 Release
- Release Date: August 16, 2019
- Server Versions Supported: Server v5.9+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.

### Highlights

#### Support for iOS13 and Android Q
 - Added support for iOS13 and Android Q which are to be released later this year.

### Improvements
 - Added support for Interactive Dialog with no elements.
 - Added a setting for tablets to enable or disable fixed sidebar.
 - Changed "about" section references to use the site name when it is configured in **System Console > Custom Branding > Site Name**.
 - Added support for plus-sign and period/dot in custom URL schemes.
 - Added "Edit profile" button to right-hand side menu and to users' own profile pop-over.
 - Message draft is now saved when closing the app.
 - Removing a link preview on webapp now also removes it on the mobile app.
 - Added ability to select and copy channel header text and purpose.

### Bug Fixes
 - Fixed a few mobile app crash / fatal error issues.
 - Fixed an issue where timestamps were off on Android.
 - Fixed an issue where contents of ephemeral posts from /giphy were not being displayed on mobile.
 - Fixed an issue where team/channel page dots at the bottom of left-hand side overlapped with the last Direct Message channel.
 - Fixed an issue where network reconnection incorrectly showed refreshing messages failed.
 - Fixed an issue with the channel sidebar theme colors not being respected on iPhone X.
 - Fixed an issue where "Message failed to send" had incorrect app badge behaviour.
 - Fixed an issue where a white screen was briefly shown after pressing "Send Message" when viewing a user's profile.
 - Fixed an issue on Android where using "Https" instead of "https" in the url of an image didn't show the preview.
 - Fixed an issue where the client ``setCSRFFromCookie`` did not look for subpaths when accessing cookies.
 - Fixed an issue where archived teams reappeared in selector.
 - Fixed an issue where users' profile picture and name did not get updated after websocket disconnect.
 
### Known Issues
  - App slows down when opening a channel with large number of animated emoji. [MM-15792](https://mattermost.atlassian.net/browse/MM-15792)
  - Some Giphy actions do not work in ephemeral posts. [MM-17842](https://mattermost.atlassian.net/browse/MM-17842)

## 1.21.2 Release
- Release Date: August 1, 2019
- Server Versions Supported: Server v5.9+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.

### Bug Fixes
 - Fixed an issue where the mobile apps logged out without a session expiry notification.

## 1.21.1 Release
- Release Date: July 22, 2019
- Server Versions Supported: Server v5.9+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.

### Bug Fixes
 - Fixed an issue on Android where logging in using SSO failed when the Mattermost server was running on a subpath.

## 1.21.0 Release
- Release Date: July 16, 2019
- Server Versions Supported: Server v5.9+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.

### Bug Fixes
 - Fixed a few mobile app crash / fatal error issues.
 - Fixed an issue where having the sidebar open at all times on tablets did not work for split view.
 - Fixed an issue where new messages were often hidden behind a keyboard or text field.
 - Fixed an issue on Android where channel sorting didn't match the web app.
 - Fixed an issue where sharing a GIF via keyboard resulted in an error screen.
 - Fixed an issue where long-press menu could not be dragged up when rotating the device to landscape view while the menu was open.
 - Fixed an issue on Android where push notification settings were only saved after closing the settings page.
 - Fixed an issue where users on View Members list had an icon that appeared to be selectable but was not.
 - Fixed an issue where "Jump To" showed archived channels the user did not belong to instead of the ones the user was a member of.
 - Fixed an issue where changing the timezone setting manually to "Set automatically" did not work on the mobile app.
 - Fixed an issue where setting a position field for AD/LDAP sync or SAML in the System Console did not block the user from changing it in account settings.
 - Fixed an issue where **Channel Info > Manage/View Members** screen didn't load channel users.
 - Fixed an issue where enabling large fonts on iOS caused the left-hand side text to be cut off.
 - Fixed an issue on Android where users could not reply to a push notification if the mention was in a thread message.

### Known Issues
  - (Android) On subpath server, logging in using GitLab or OneLogin fails to display Mattermost. [MM-16829](https://mattermost.atlassian.net/browse/MM-16829)
  - Buttons inside ephemeral posts are not clickable / functional on the mobile app. [MM-15084](https://mattermost.atlassian.net/browse/MM-15084)
  - Android apps slow down when opening a channel with large number of animated emoji. [MM-15792](https://mattermost.atlassian.net/browse/MM-15792)

## 1.20.2 Release
- Release Date: July 10, 2019
- Server Versions Supported: Server v4.10+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - Mobile App v1.13+ is required for Mattermost Server v5.4+.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.
 
### Bug Fixes
 - Fixed an issue where Moto G7 devices were detected as tablets and showed a fixed width sidebar.
 - Fixed an issue where having the sidebar open at all times on tablets did not work on split view.

## 1.20.1 Release
- Release Date: June 21, 2019
- Server Versions Supported: Server v4.10+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - Mobile App v1.13+ is required for Mattermost Server v5.4+.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.

### Bug Fixes
 - Fixed an issue where some Android devices were crashing.
 - Fixed an issue where messages were missing after reconnecting the network.

## 1.20.0 Release
- Release Date: June 16, 2019
- Server Versions Supported: Server v4.10+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - Mobile App v1.13+ is required for Mattermost Server v5.4+.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.

### Highlights

#### Tablet Improvements
 - Channel sidebar now remains open at a fixed width on tablet devices.
 
#### iOS Keyboard Dismissal
 - If the keyboard is open, swiping down past it now closes it.
 
#### Profile Telemetry for Android Beta Builds
 - To improve Android app performance, we are collecting trace events and device information, collectively known as metrics, to identify slow performing key areas. Those metrics will be sent only from users using Android app beta build starting in version v1.20, who are logged in to servers that allow sending [diagnostic information](https://docs.mattermost.com/configure/configuration-settings.html#enable-diagnostics-and-error-reporting).

### Improvements
 - Increased the double tap delay for post action buttons.
 - Implemented assets for Adaptive icons.
 - Users are now brought to the bottom of the channel when posting a message.
 - Users can now execute actions while the keyboard is open.
 - Added support on iOS for IPv6 on LTE networks.
 - Added support for LDAP Group constrained feature with v5.12 servers.

### Bug Fixes
 - Fixed an issue where a post wasn't immediately removed when deleting another user's post.
 - Fixed an issue where the cursor jumped back when typing after auto-completing a slash command.
 - Fixed an issue where the iOS app didn’t properly restore its connection after disconnect.
 - Fixed an issue where the long press menu persisted after returning from a thread.
 - Fixed an issue on Android where the "Write to [channel name]" was cut off for group messages with several users.
 - Fixed an issue where users were not able to flag or unflag posts in a read-only channel.
 - Fixed an issue where the progress indicator was negative while downloading a video.
 - Fixed an issue where the edit post modal didn’t have an autocorrect.
 - Fixed an issue where the 'I forgot my password' option was available on the mobile client even with Email Authentication disabled on the server.
 - Fixed an issue with large separation between placeholders on iPad when a channel was loading.
 - Fixed an issue where "Show More" was not removed after the post was edited to a single line.
 
### Known Issues
  - Buttons inside ephemeral posts are not clickable / functional on the mobile app. [MM-15084](https://mattermost.atlassian.net/browse/MM-15084)
  - App slows down when opening a channel with large number of animated emoji. [MM-15792](https://mattermost.atlassian.net/browse/MM-15792)
 
## 1.19.0 Release
- Release Date: May 16, 2019
- Server Versions Supported: Server v4.10+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - Mobile App v1.13+ is required for Mattermost Server v5.4+.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.
 
### Bug Fixes
 - Fixed an issue where Android managed config was lost on the thread view.
 - Fixed an issue where contents of ephemeral posts did not display on the mobile app.
 - Fixed a few mobile app crash / fatal error issues.
 - Fixed an issue with an expanding animation when tapping on Jump to Channel in the channel list.
 - Fixed an issue on iOS where animated custom emoji weren't animated.
 - Fixed an issue on iOS where users were unable to create channel name of two characters.
 - Fixed an issue on iOS where emoji appeared too close, with uneven spacing, and too small in the info modal.
 - Added an error handler when sharing text that was over server's maximum post size with the iOS Share Extension.
 - Fixed an issue where users could upload a GIF as a profile image.
 
### Known Issues
 - Buttons inside ephemeral posts are not clickable / functional on the mobile app.

## 1.18.1 Release
- Release Date: April 18, 2019
- Server Versions Supported: Server v4.10+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - Mobile App v1.13+ is required for Mattermost Server v5.4+.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.

### Bug Fixes 
 - Fixed a crash issue caused by a malformed post textbox localize string.
 - Fixed an issue where iOS crashed when trying to log in using SSO and the SSO provider set a cookie without an expiration date.

## 1.18.0 Release
- Release Date: April 16, 2019
- Server Versions Supported: Server v4.10+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - Mobile App v1.13+ is required for Mattermost Server v5.4+.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.
 - ``Bot`` tags were added for bot accounts feature in server v5.10 and mobile v1.18, meaning that mobile v1.17 and earlier don't support the tags.
 
### Highlights
 - Added support for Office365 single sign-on (SSO).
 - Added support for Integrated Windows Authentication (IWA).

### Improvements
 - Added the ability for channel links to open inside the app.
 - Added ability for emojis and hyperlinks to render in the message attachment title.
 - Added Chinese support for words that trigger mentions.
 - Added a setting to the system console to change the minimum length of hashtags.
 - Added a reply option to long press context menu.

### Bug Fixes
 - Fixed an issue where blank spaces broke markdown tables.
 - Fixed an issue where deactivated users appeared on "Add Members" modal but not on the search results.
 - Fixed an issue on Android where extra text in the search box appeared after using the autocomplete drop-down.
 - Fixed an issue with multiple text entries when typing with Shift+Letter on Android.
 - Fixed an issue where push notifications badges did not always clear when read on another device.
 - Fixed an issue where opening a single or group notification did not take the user into the channel where the notification came from.
 - Fixed an issue where timezone did not automatically update on Android when travelling to another timezone.
 - Fixed an issue where the user mention autocomplete drop-down was case sensitive.
 - Fixed an issue where system admininistrators were able to see the full long press menu when long pressing a system message.
 - Fixed an issue where users were not able to unflag posts from "Flagged Posts" when opened from a read-only channel.
 - Fixed an issue where users were unable to create channel names of two byte characters.
 
### Known Issues
 - Content for ephemeral messages is not displayed on Mattermost Mobile Apps.

## 1.17.0 Release
- Release Date: March 20, 2019
- Server Versions Supported: Server v4.10+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - If **DisableLegacyMfa** setting in ``config.json`` is set to ``true`` and [multi-factor authentication](https://docs.mattermost.com/onboard/multi-factor-authentication.html) is enabled, ensure your users have upgraded to mobile app version 1.17 or later. See [Important Upgrade Notes](https://docs.mattermost.com/upgrade/important-upgrade-notes.html) for more details.
 - If you are using an EMM provider via AppConfig, make sure to add two new settings, `useVPN` and `timeoutVPN`, to your AppConfig file. The settings were added for EMM connections using VPN on-demand - one to indicate if every request should wait for the VPN connection to be established, and another to set the timeout in seconds. See docs for more details on [setting AppConfig values](https://docs.mattermost.com/deploy/mobile-appconfig.html#mattermost-appconfig-values) for VPN support.
 - Mobile App v1.13+ is required for Mattermost Server v5.4+.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 - iPhone 5s devices and later with iOS 11+ is required.
 
### Highlights
 - iOS Share Extension now supports large file sizes and improved performance

### Bug Fixes
 - Fixed support for EMM connections using VPN on-demand. See docs for more details on [setting AppConfig values](https://docs.mattermost.com/deploy/mobile-appconfig.html#mattermost-appconfig-values) for VPN support.
 - Fixed several Android app crash / fatal error issues.
 - Fixed an issue on Android where the app crashed intermittently when selecting a link.
 - Fixed an issue where email notifications setting was out of sync with the webapp until the setting was edited.
 - Fixed an issue where notification badges were not cleared from other clients when clicking on a push notification after opening the mobile app.
 - Fixed an issue where the app did not show local notification when session expired.
 - Fixed an issue where the profile picture for webhooks was showing the hook owner picture.
 - Fixed an issue where some emoji were not rendered as jumbo.
 - Fixed an issue where jumbo emoji posted as a reply sometimes appeared with large space beneath.
 - Fixed an issue where the "No Internet Connection" banner did not always display when internet connectivity was lost.
 - Fixed an issue where the "No Internet Connection" banner did not always disappear when connection was re-estabilished.
 - Fixed an issue where opening channels with unreads had loading indicator placed above unread messages line.

## 1.16.1 Release
- Release Date: February 21, 2019
- Server Versions Supported: Server v4.10+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility
 - Mobile App v1.13+ is required for Mattermost Server v5.4+.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).

### Bug Fixes
 - Fixed an issue where link previews and reactions weren't displayed when post metadata was disabled.
 - Fixed an issue on Android where the app crashed when sharing multiple files.
 
## 1.16.0 Release
- Release Date: February 16, 2019
- Server Versions Supported: Server v4.10+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility

 - Mobile App v1.13+ is required for Mattermost Server v5.4+.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).

### Improvements
 - Added the ability to remove own profile picture.
 - Changed "X" to "Cancel" on Edit Profile page.
 - Added support for relative permalinks.

### Bug Fixes
 - Fixed an issue where the iOS app did not wait until the on-demand VPN connection was established. (EMM Providers)
 - Fixed an issue with a white screen caused by missing Russian translations.
 - Fixed an issue where the iOS badge notification did not always clear.
 - Fixed an issue where the thread view displayed a new message indicator.
 - Fixed an issue where quick multiple taps on the file icon opened multiple file previews.
 - Fixed an issue where the settings page did not show an option to join other teams.
 - Fixed an issue where image previews didn't work after using Delete File Cache.
 - Fixed an issue on Android where the notification trigger word modal title was "Send email notifications" instead of "Keywords".
 - Fixed an issue where the Webhook icon was misaligned and bottom edges were cut off.
 - Fixed an issue on Android where the user was not asked to authenticate to the app first when trying to share a photo, resulting in a white "Share modal" screen with a never-ending loading indicator.
 - Fixed an issue on iOS where push notifications were not preserved when opening the app via the Mattermost icon.

## 1.15.2 Release
- Release Date: January 16, 2019
- Server Versions Supported: Server v4.10+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility

 - Mobile App v1.13+ is required for Mattermost Server v5.4+.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).

### Bug Fixes

 - Fixed an issue where the status changes for other users did not always stay current in the mobile app.
 - Fixed an issue where a post did not fail properly when the user attempted to send the post while there was no network access.
 - Fixed an issue where date separators did not update when changing timezones.
 - Fixed an issue where the Favorites section did not clear from a users's channel drawer.
 - Removed an extra divider below "Edit Channel" of Direct Message Channel Info.
 - Fixed an issue where a user was not returned to previously viewed channel after viewing and then closing an archived channel.
 - Fixed an issue where a quick double tap on switch of Channel Info created and extra on/off state.
 - Fixed an issue where iOS long press menu didn't have rounded corners.

## 1.15.1 Release
- Release Date: December 28, 2018
- Server Versions Supported: Server v4.10+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility

 - Mobile App v1.13+ is required for Mattermost Server v5.4+.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).
 
### Bug Fixes
 - Fixed an issue preventing some users from logging in using OKTA.

## 1.15.0 Release
- Release Date: December 16, 2018
- Server Versions Supported: Server v4.10+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

### Compatibility

 - Mobile App v1.13+ is required for Mattermost Server v5.4+.
 - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).

### Highlights
 - Added mention and reply mention highlighting.
 - Added a sliding animation for the reaction list.
 - Added support for pinned posts.
 - Added support for jumbo emojis.
 - Added support for interactive dialogs.
 - Improved UI for the long press menu and emoji reaction viewer.

### Improvements
 - Added the ability to include custom headers with requests for custom builds.
 - Push Notifications that are grouped by channels are cleared once the channel is read.
- Improved auto-reconnect when unable to reach the server.
 - Added support for changing the mobile client status to offline when the app loses connection.
 - Added 'View Members' button to archived channels.
 - Added support on iOS for keeping the postlist in place without scrolling when new content is available.

### Bug Fixes
 - Fixed an issue where clicking on a file did not show downloading progress.
 - Fixed an issue on Android where on fresh install the share extension would not properly show available channels.
 - Fixed an issue where recently archived channels remained in in: autocomplete when they had been archived.
 - Fixed an issue where text should render when no actual custom emoji matched the named emoji pattern.
 - Fixed an issue on iOS where text got cut-off after replying to a message.
 - Fixed an issue where search modifier for channels was showing Direct Messages without usernames.
 - Fixed an issue where "Close Channel" did not work properly when viewing two archived channels in a row.
 - Fixed an issue with "Critical Error" screen when trying to upload certain file types from "+" to the left of message input box.

## 1.14.0 Release
- Release Date: November 16, 2018
- Server Versions Supported: Server v4.10+ is required, Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device

**Compatibility Note: Mobile App v1.13+ is required for Mattermost Server v5.4+**

### Bug Fixes
- Fixed an issue where the Android app did not allow establishing a network connection with any server that used a self-signed certificate that had the CA certificate user installed on the device.
- Removed "Copy Post" option on long-press message menu for posts without text.
- Fixed an issue where the "Search Results" header was not fully scrolled to top on search "from:username".
- Fixed an issue where channel names truncated at fewer characters than necessary.
- Fixed an issue where the same uploaded photo generated a different file size.
- Fixed an issue where the "(you)" was not displayed to the right of a user's name in the channel drawer when a user opened a Direct Message channel with themself.
- Fixed an issue where a dark theme set from webapp broke mobile display.
- Fixed an issue where channel drawer transition sometimes lagged.
- Fixed an issue where sending photos to Mattermost created large files.
- Fixed an issue where the apps showed "Select a Team" screen when opened.
- Fixed an issue where at-mention, emoji, and slash command autocompletes had a double top border.
- Fixed an issue where the drawer was unable to close when showing the team list.
- Fixed an issue where team sidebar showed + sign even without more teams to join.


## 1.13.1 Release
- Release Date: October 18, 2018
- Server Versions Supported: Server v4.10+ is required, Self-Signed SSL Certificates are not supported

**Compatibility Note: Mobile App v1.13+ is required for Mattermost Server v5.4+**

### Bug Fixes
- Fixed an issue preventing some users from authenticating using OKTA

## v1.13.0 Release
- Release Date: October 16, 2018
- Server Versions Supported: Server v4.10+ is required, Self-Signed SSL Certificates are not supported

**Compatibility Note: Mobile App v1.13+ is required for Mattermost Server v5.4+**

### Highlights

#### View Emoji Reactions
- Hold down on any emoji reaction to see who reacted to the post.

#### Hashtags
- Added support for searching for hashtags in posts.

#### Dropdown menus
- Added support for dropdown menus in message attachments.

### Improvements
- Added support for iPhone XR, XS and XS Max.
- Added support for nicknames on user profile.
- On servers 5.4+, added support for searching in direct and group message channels using the "in:" modifier.
- Channel autocomplete now gets closed if multiple tildes are typed.
- Added a draft icon in sidebar and channel switcher for channels with unsent messages.
- Users are now redirected to the archived channel view (rather than to Town Square) when a channel is archived.
- When closing an archived channel, users are now returned to the previously viewed channel.

### Bug Fixes
- Refactored postlist to include Android Pie fixes and smoother scrolling.
- Fixed an issue where deactivated users were not marked as such in "Jump To" search.
- Fixed an issue where users got a permission error when trying to open a file from within the image preview screen.
- Fixed an issue where session expiry notifications were not being sent on Android.
- Fixed an issue where post attachments failed to upload.
- Fixed an issue where the "DM More..." list cut off user info.
- Fixed an issue where the user would briefly see a system message when loading a reply thread.
- Fixed an issue where the error message was incorrectly formatted if the login method was set to email/password and the user tried to log in with SAML.
- Fixed an issue on Android where the keyboard sometimes overlapped the bottom of the post textbox.
- Fixed an issue where there was no option to take video via "+" > "Take Photo or Video" on iOS.

## v1.12.0 Release
- Release Date: September 16, 2018
- Server Versions Supported: Server v4.10+ is required, Self-Signed SSL Certificates are not supported

### Highlights

#### Search Date Filters
- Search for messages before, on, or after a specified date.

### Improvements
- Added notification support for Android O and P.

### Bug Fixes
- Fixed an issue where Okta was not able to login in some deployments.
- Fixed an issue where messages in Direct Message channels did not show when clicking "Jump To".
- Fixed an issue where `Show More` on a post with a message attachment displayed a blank where content should have been.
- Prevent downloading of files when disallowed in the System Console.
- Fixed an issue where users could not click on attachment filenames to open them.
- Fixed an issue where email notification settings did not save from mobile.
- Fixed an issue where the share extension allowed users to select and attempt to share content to channels that had been archived.
- Fixed an issue where reacting to an existing emoji in an archived channel was allowed.
- Fixed an issue where archived channels sometimes remained in the drawer.
- Fixed an issue where deactivated users were not marked as such in Direct Message search.


## v1.11.0 Release
- Release Date: August 16, 2018
- Server Versions Supported: Server v4.10+ is required, Self-Signed SSL Certificates are not supported

### Highlights

#### Searching Archived Channels
- Added ability to search for archived channels. Requires Mattermost server v5.2 or later.

#### Deep Linking
- Added the ability for custom builds to open Mattermost links directly in the app rather than the default mobile browser. Learn more in our [documentation](https://docs.mattermost.com/deploy/mobile-faq.html#how-do-i-configure-deep-linking)

### Improvements
- Added profile pop-up to combined system messages.
- Force re-entering SSO auth credentials after logout.
- Added consecutive posts by the same user.
- Added a loading indicator when user info is still loading in the left-hand side.

### Bug Fixes
- Fixed an issue where Android devices showed an incorrect timestamp.
- Fixed an issue on Android where the app did not get sent to the background when pressing the hardware back button in the channel screen.
- Fixed an issue with video playback when the filename had spaces.
- Fixed an issue where the app crashed when playing YouTube videos.
- Fixed an issue with session expiration notification.
- Fixed an issue with sharing files from Google Drive in Android Share Extension.
- Fixed an issue on Android where replying to a push notification sometimes went to the wrong channel.
- Fixed an issue where the previous server URL was present on the input textbox before changing the screen to Login.
- Fixed an issue where user menu was not translated correctly.
- Fixed an issue where some field lengths in Account Settings didn't match the desktop app.
- Fixed an issue where long URLs for embedded images in message attachments got cut off and didn't render.
- Fixed an issue where link preview images were not cropped properly.
- Fixed an issue where long usernames didn't wrap properly in the Account Settings menu.
- Fixed an issue where DMs would not open if users were using "Jump To".
- Fixed an issue where no message was displayed after removing a user from a channel with join/leave messages disabled.

## v1.10.0 Release
- Release Date: July 16, 2018
- Server Versions Supported: Server v4.0+ is required, Self-Signed SSL Certificates are not supported

### Highlights

#### Channel drawer performance
- Android devices will notice significant performance improvements when opening and closing the channel drawer.

#### Channel loading performance
- Improved channel loading performance as post are retrieved with every push notification

#### Announcement banner improvements
- Markdown now renders when announcement banners are expanded
- When enabled by the System Admin, users can now dismiss announcement banners until their next session

### Improvements

 - Combined consecutive messages from the same user.
 - Added experimental support for certificate-based authentication (CBA) for iOS to identify a user or a device before granting access to Mattermost. See [documentation](https://docs.mattermost.com/onboard/certificate-based-authentication.html) to learn more.
 - Added support for the experimental automatic direct message replies feature.
 - Added support for the experimental timezone feature.
 - Changed post textbox to not be a connected component.
 - Allow connecting to mattermost instances hosted at subpaths.
 - Added support for starting YouTube videos at a given time.
 - Added support for keeping messages if slash command fails.

### Bug Fixes

 - Fixed an issue where the unread badge background was always white.
 - Fixed an issue where a username repeated in system message if user was added to a channel more than once.
 - Fixed an issue where Android Sharing from Microsoft apps failed.
 - Fixed an issue where YouTube crashed the app if link did not have a time set.
 - Fixed an issue where System Admins did not see all teams available to join on mobile.
 - Fixed an issue where users were unable to share from Files app.
 - Fixed an issue where viewing a non-existent permalink didn't show an error message.
 - Fixed an issue where jumping to a channel search did not bold unread channels.
 - Fixed an issue with being able to add own user to a Group Message channel.
 - Fixed an issue with not being able to reply from a push notification on iOS.
 - Fixed an issue where the app did not display Brazilian language.
 
## 1.9.3 Release
- Release Date: July 04, 2018
- Server Versions Supported: Server v4.0+ is required, Self-Signed SSL Certificates are not supported

### Bug Fixes

- Fixed multiple issues causing app crashes
- Fixed an issue on iOS devices with typing non-english characters in the post input box

## 1.9.2 Release
- Release Date: June 27, 2018
- Server Versions Supported: Server v4.0+ is required, Self-Signed SSL Certificates are not supported

### Bug Fixes

- Fixed an issue where attached videos did not play for the poster
- Fixed an issue where "Jump to recent messages" from the permalink view did not direct the user to the bottom of the channel
- Fixed an issue where post comments did not identify which parent post they belonged to
- Fixed multiple issues with typing non-english characters in the post input box
- Fixed multiple issues causing random app crashes
- Fixed an issue where files from the Android Files app failed to upload
- Fixed an issue where the iOS share extension crashed when switching the team or channel
- Fixed an issue where files from the Microsoft app failed to upload
- Fixed an issue on Android devices where sharing files changed the file extension of the attachment

## 1.9.1 Release
- Release Date: June 23, 2018
- Server Versions Supported: Server v4.0+ is required, Self-Signed SSL Certificates are not supported

### Bug Fixes
- Fixed an issue with typing lag on Android devices
- Fixed an issue causing users to be logged out after upgrading to v1.9.0
- Fixed an issue where the ``in:`` and ``from:`` modifiers were not being added to the search field

## v1.9.0 Release
- Release Date: June 16, 2018
- Server Versions Supported: Server v4.0+ is required, Self-Signed SSL Certificates are not supported

### Highlights

#### Improved first load time on Android
 - Significantly decreased first load time on Android devices from cold start.
 
#### iOS Files app support
- Added support for attaching files from the iOS Files app from within Mattermost.

#### Improved styling of push notification
- Improved the layout of message content, channel name and sender name in push notifications.

### Improvements

 - Combined join/leave system messages.
 - Added splash screen and channel loader improvements.
 - Removed the desktop notification duration setting.
 - Added cache team icon and set background to always be white if using a PNG file.
 - Added whitelabel for icons and splash screen.

### Bug Fixes

 - Fixed an issue where other user's display name did not render in combined system messages after joining the channel.
 - Fixed an issue where posts incorrectly had "Commented on Someone's message" above them.
 - Fixed an issue where deleting a post or its parent in permalink view left permalink view blank.
 - Fixed an issue where "User is typing" message cut was off.
 - Fixed an issue where `More New Messages Above` appeared at the top of new channel on joining.
 - Fixed an issue where a user was not directed to Town Square when leaving a channel.
 - Fixed an issue where long post were not collapsed on Android.
 - Fixed an issue where a user's name was initially shown as "someone" when opening a direct message with the user.
 - Fixed an issue where an error was received when trying to change the team or channel from the share extension.
 - Fixed an issue where switching to a newly created channel from a push notification redirected a user to Town Square.
 - Fixed an issue where a public channel made private did not disappear automatically from clients not part of the channel.

## v1.8.0 Release
- Release Date: April 27, 2018
- Server Versions Supported: Server v4.0+ is required, Self-Signed SSL Certificates are not supported

### Highlights

#### Image performance
- Images are now downloaded and stored locally for better performance

#### Flagged Posts and Recent Mentions
- Access all your flagged posts and recent mentions from the buttons in the sidebar

#### Muted Channels
- Added support for Muted Channels released with Mattermost server v4.9 

### Improvements
- Date separators now appear between each posts in the search view
- Deactivated users are now filtered out of the channel members lists
- Direct Messages user list is now sorted by username first
- Added the option to Direct Message yourself from your user profile screen
- Improved performance on the post list
- Improved matching and display when searching for users in the Direct Message user list

### Bug Fixes
- Fixed an issue where emoji reactions could be added from the search view but did not appear
- Fixed an issue causing the app to crash when trying to share content from a custom keyboard
- Fixed an issue where team names were being sorted based on letter case
- Fixed an issue where username would not be inserted to the post draft when using experimental configuration settings
- Fixed an issue with nested bullet lists being cut off in the user interface
- Fixed an issue where private channels were listed in the public channels section of the channel autocomplete list
- Fixed an issue where a profile images could not be updated from the app

## v1.7.1 Release
- Release Date: April 3, 2018
- Server Versions Supported: Server v4.0+ is required, Self-Signed SSL Certificates are not supported

### Bug Fixes
- Fixed an issue where the iOS share extension sometimes crashed the Mattermost app
- Fixed an issue preventing Markdown tables from rendering with some international characters 

## v1.7.0 Release
- Release Date: March 26, 2018
- Server Versions Supported: Server v4.0+ is required, Self-Signed SSL Certificates are not supported

### Highlights

#### iOS File Sharing
- Share files and images from other applications as attached files in Mattermost

#### Markdown Tables
- Tables created using markdown formatting can now be viewed in the app

#### Permalinks
- Permalinks now open in the app instead of launching a browser window 

### Improvements
- Increased the tappable area of various icons for improved usability
- Announcement banners now display in the app
- Added "+" button to add emoji reactions to a post
- Minor performance improvements for app launch time
- Text files can now be viewed in the app
- Support for email autolinking into the app

### Bugs
- Fixed an issue causing some devices to hang at the splash screen on app launch
- Fixed an issue causing some letters to be hidden in the Android search input box
- Fixed an issue causing some Direct Message channels to show date stamps below the most recent message
- Fixed an issue where users weren't able to join open teams they've never been a member of
- Fixed an issue so double tapping buttons can no longer cause UI issues
- Fixed an issue where changing the channel display name wasn't being updated in the UI appropriately
- Fixed an issue where searhing for public channels sometimes showed no results
- Fixed an issue where the post menu could remain open while scrolling in the post list
- Fixed an issue where the system message to add users to a channel was missing the execution link
- Fixed an issue where bulleted lists cut off text if nested deeper than two levels
- Fixed an issue where logging into an account that is not on any team freezes the app
- Fixed an issue on iOS causing the app to crash when taking a photo then attaching it to a post

## v1.6.1 Release
- Release Date: February 13, 2018
- Server Versions Supported: Server v4.0+ is required, Self-Signed SSL Certificates are not supported

### Bug Fixes
- Fixed an issue preventing the app from going to the correct channel when opened from a push notification
- Fixed an issue on Android devices where the app could sometimes freeze on the launch screen
- Fixed an issue on Samsung devices causing extra letters to be insterted when typing to filter user lists

## v1.6.0 Release
- Release Date: February 6, 2018
- Server Versions Supported: Server v4.0+ is required, Self-Signed SSL Certificates are not supported

### Highlights

#### Android File Sharing
- Share files and images from other applications as attached files in Mattermost 

### Improvements
- Added a right drawer to access settings, edit profile information, change online status and logout
- Added support for opening a Direct Message channel with yourself

### Bugs
- Fixed a number of issues causing crashes on Android devices
- Fixed an issue with auto capitalization on Android keyboards
- Fixed an issue where the GitLab SSO login button sometimes didn't appear
- Fixed an issue with link previews not appearing on some accounts
- Fixed an issue where logging out of the app didn't clear the notification badge on the homescreen icon
- Fixed an issue where interactive message buttons would not wrap to a new line
- Fixed an issue where the keyboard would sometimes overlap the text input box
- Fixed an issue where the Direct Message channel wouldn't open from the profile page
- Fixed an issue where posts would sometimes overlap
- Fixed an issue where the app sometimes hangs on logout

## v1.5.3 Release
- Release Date: February 1, 2018
- Server Versions Supported: Server v4.0+ is required, Self-Signed SSL Certificates are not supported
- Fixed a login issue when connecting to servers running a Data Retention policy 

## v1.5.2 Release
- Release Date: January 12, 2018
- Server Versions Supported: Server v4.0+ is required, Self-Signed SSL Certificates are not supported

### Bug Fixes
- Fixed an issue causing some Android devices to crash on launch
- Fixed an issue with the app occasionally crashing when receiving push notifications in a new channel 
- Channel footer area is now refreshed when switching between Group and Direct Message channels
- Fixed an issue on some Android devices so Mattermost verifies it has permissions to access ringtones
- Fixed an issue where the text box overlapped the keyboard on some iOS devices using multiple keyboard layouts
- Fixed an issue with video uploads on Android devices
- Fixed an issue with GIF uploads on iOS devices
- Fixed an issue with the mention badge flickering on the channel drawer icon when there were over 10 unread mentions
- Fixed an issue with the app occasionally freezing when requesting the RefreshToken

## v1.5.1 Release

- Release Date: December 7, 2017
- Server Versions Supported: Server v4.0+ is required, Self-Signed SSL Certificates are not supported

### Bug Fixes
- Fixed an issue with the upgrade app screen showing with a transparent background
- Fixed an issue with clearing or replying to notifications sometimes crashing the app on Android
- Fixed an issue with the app sometimes crashing due to a missing function in the swiping control

## v1.5 Release 

- Release Date: December 6, 2017
- Server Versions Supported: Server v4.0+ is required, Self-Signed SSL Certificates are not supported

### Highlights 

#### File Viewer
- Preview videos, RTF,  PDFs, Word, Excel, and Powerpoint files 

#### iPhone X Compatibility
- Added support for iPhone X

#### Slash Commands
- Added support for using custom slash commands
- Added support for built-in slash commands /away, /online, /offline, /dnd, /header, /purpose, /kick, /me, /shrug

### Improvements
- In iOS, 3D touch can now be used to peek into a channel to view the contents, and quickly mark it as read
- Markdown images in posts now render 
- Copy posts, URLs, and code blocks
- Opening a channel with Unread messages takes you to the "New Messages" indicator 
- Support for data retention, interactive message buttons, and viewing Do Not Disturb statuses depending on the server version
- (Edited) indicator now shows up beside edited posts 
- Added a "Recently Used" section for emoji reactions

### Bug Fixes 
- Android notifications now follow the default system setting for vibration 
- Fixed app crashing when opening notification settings on Android 
- Fixed an issue where the "Proceed" button on log in screen stopped working after pressing logout multiple times
- HEIC images posted from iPhones now get converted to JPEG before uploading

## v1.4.1 Release

Release Date: Nov 15, 2017
Server Versions Supported: Server v4.0+ is required, Self-Signed SSL Certificates are not supported

### Bug Fixes

- Fixed network detection issue causing some people to be unable to access the app
- Fixed issue with lag when pressing send button 
- Fixed app crash when opening notification settings
- Fixed various other bugs to reduce app crashes

## v1.4 Release 

- Release Date: November 6, 2017
- Server Versions Supported: Server v4.0+ is required, Self-Signed SSL Certificates are not supported

### Highlights 

#### Performance improvements
- Various performance improvements to decrease channel load times 

### Bug Fixes
- Fixed issue with Android app sometimes showing a white screen when re-opening the app
- Fixed an issue with orientation lock not working on Android 

## v1.3 Release 

- Release Date: October 5, 2017
- Server Versions Supported: Server v4.0+ is required, Self-Signed SSL Certificates are not supported

### Highlights 

#### Tablet Support (Beta) 
- Added support for landscape view, so the app may be used on tablets
- Note: Tablet support is in beta, and further improvements are planned for a later date

#### Link Previews 
- Added support for image, GIF, and youtube link previews

#### Notifications
- Android: Added the ability to set light, vibrate, and sound settings
- Android: Improved notification stacking so most recent notification shows first 
- Updated the design for Notification settings to improve usability 
- Added the ability to reply from a push notification without opening the app (requires Android v7.0+, iOS 10+) 
- Increased speed when opening app from a push notification

#### Download Files 
- Added the ability to download all files on Android and images on iOS

### Improvements
- Using `+` shortcut for emoji reactions is now supported 
- Improved emoji formatting (alignment and rendering of non-square aspect ratios)
- Added support for error tracking with Sentry
- Only show the "Connecting..." bar after two connection attempts 

### Bug Fixes
- Fixed link rendering not working in certain cases
- Fixed theme color issue with status bar on Android

## v1.2 Release

- Release Date: September 5, 2017 
- Server Versions Supported: Server v4.0+ is required, Self-Signed SSL Certificates are not supported

### Highlights 

#### AppConfig Support for EMM solutions
- Added [AppConfig](https://www.appconfig.org/) support, to make it easier to integrate with a variety of EMM solutions

#### Code block viewer
- Tap on a code block to open a viewer for easier reading 

### Improvements
- Updated formatting for markdown lists and code blocks
- Updated formatting for `in:` and `from:` search autocomplete 

### Emoji Picker for Emoji Reactions
- Added an emoji picker for selecting a reaction 

### Bug Fixes
- Fixed issue where if only LDAP and GitLab login were enabled, LDAP did not show up on the login page
- Fixed issue with three digit mention count UI in channel drawer

### Known Issues
- Using `+:emoji:` to react to a message is not yet supported 

## v1.1 Release

- Release Date: August 2017 
- Server Versions Supported: Server v3.10+ is required, Self-Signed SSL Certificates are not supported

### Highlights 

#### Search
- Search posts and tap to preview the result
- Click "Jump" to open the channel the search result is from 

#### Emoji Reactions
- View Emoji Reactions on a post

#### Group Messages
- Start Direct and Group Messages from the same screen

#### Improved Performance on Poor Connections
- Added auto-retry to automatically reattempt to get posts if the network connection is intermittent
- Added manual loading option if auto-retry fails to retrieve new posts

### Improvements
- Android: Added Big Text support for Android notifications, so they expand to show more details
- Added a Reset Cache option
- Improved "Jump to conversation" filter so it matches on nickname, full name, or username 
- Tapping on an @username mention opens the user's profile
- Disabled the send button while attachments upload
- Adjusted margins on icons and elsewhere to make spacing more consistent
- iOS URL scheme: mattermost:// links now open the new app
- About Mattermost page now includes a link to NOTICES.txt for platform and the mobile app
- Various UI improvements

### Bug Fixes
- Fixed an issue where sometimes an unmounted badge caused app to crash on start up 
- Group Direct Messages now show the correct member count 
- Hamburger icon does not break after swiping to close sidebar
- Fixed an issue with some image thumbnails appearing out of focus
- Uploading a file and then leaving the channel no longer shows the file in a perpetual loading state
- For private channels, the last member can no longer delete the channel if the EE server permissions do not allow it
- Error messages are now shown when SSO login fails
- Android: Leaving a channel now redirects to Town Square instead of the Town Square info page
- Fixed create new public channel screen shown twice when trying to create a channel
- Tapping on a post will no longer close the keyboard

## v1.0.1 Release 

- Release Date: July 20, 2017 
- Server Versions Supported: Server v3.8+ is required, Self-Signed SSL Certificates are not yet supported

### Bug Fixes
- Huawei devices can now load messages
- GitLab SSO now works if there is a trailing `/` in the server URL
- Unsupported server versions now show a prompt clarifying that a server upgrade is necessary

## v1.0 Release 

- Release Date: July 10, 2017 
- Server Versions Supported: Server v3.8+ is required, Self-Signed SSL Certificates are not supported

### Highlights 

#### Authentication (Requires v3.10+ [Mattermost server](https://github.com/mattermost/platform))
- GitLab login 

#### Offline Support
- Added offline support, so already loaded portions of the app are accessible without a connection
- Retry mechanism for posts sent while offline 
- See [FAQ](https://github.com/mattermost/mattermost-mobile#frequently-asked-questions) for information on how data is handled for deactivated users

#### Notifications (Requires v3.10+ [push proxy server](https://github.com/mattermost/mattermost-push-proxy)) 
- Notifications are cleared when read on another device
- Notification sent just before session expires to let people know login is required to continue receiving notifications

#### Channel and Team Sidebar
- Unreads section to easily access channels with new messages
- Search filter to jump to conversations quickly 
- Improved team switching design for better cross-team notifications 
- Added ability to join open teams on the server 

#### Posts
- Emojis now render
- Integration attachments now render 
- ~channel links now render 

#### Navigation
- Updated navigation to have smoother transitions 

### Known Issues
- [Android: Swipe to close in-app notifications does not work](https://mattermost.atlassian.net/browse/RN-45)
- Apps are not yet at feature parity for desktop, so features not mentioned in the changelog are not yet supported

### Contributors

Many thanks to all our contributors. In alphabetical order:
- asaadmahmood, cpanato, csduarte, enahum, hmhealey, jarredwitt, JeffSchering, jasonblais, lfbrock, omar-dev, rthill

## Beta Release

- Release Date: March 29, 2017
- Server Versions Supported: Server v3.7+ is required, Self-Signed SSL Certificates are not yet supported

Note: If you need an SSL certificate, consider using [Let's Encrypt](https://docs.mattermost.com/install/config-ssl-http2-nginx.html) instead of a self-signed one.

### Highlights

The Beta apps are a work in progress, supported features are listed below. You can become a beta tester by [downloading the Android app](https://play.google.com/store/apps/details?id=com.mattermost.react.native&hl=en) or [signing up to test iOS](https://mattermost-fastlane.herokuapp.com/). 

#### Authentication
- Email login
- LDAP/AD login
- Multi-factor authentication 
- Logout

#### Messaging
- View and send posts in the center channel
- Automatically load more posts in the center channel when scrolling
- View and send replies in thread view
- "New messages" line in center channel (app does not yet scroll to the line)
- Date separators 
- @mention autocomplete
- ~channel autocomplete
- "User is typing" message
- Edit and delete posts
- Flag/Unflag posts
- Basic markdown (lists, headers, bold, italics, links)

#### Notifications
- Push notifications
- In-app notifications when you receive a message in another channel while the app is open
- Clicking on a push notification takes you to the channel

#### User profiles
- Status indicators
- View profile information by clicking on someone's username or profile picture

#### Files
- File thumbnails for posts with attachments
- Upload up to five images
- Image previewer to view images when clicked on

#### Channels
- Channel drawer for selecting channels
- Bolded channel names for Unreads, and mention jewel for Mentions
- (iOS only) Unread posts above/below indicator
- Favorite channels (Section in sidebar, and ability to favorite/unfavorite from channel menu)
- Create new public or private channels
- Create new Direct Messages (Group Direct Messages are not yet supported) 
- View channel info (name, header, purpose) 
- Join public channels
- Leave channel
- Delete channel
- View people in a channel
- Add/remove people from a channel
- Loading screen when opening channels 

#### Settings
- Account Settings > Notifications page
- About Mattermost info dialog
- Report a problem link that opens an email for bug reports

#### Teams
- Switch between teams using "Team Selection" in the main menu (viewing which teams have notifications is not yet supported) 

### Contributors

Many thanks to all our contributors. In alphabetical order:
- csduarte, dmeza, enahum, hmhealey, it33, jarredwitt, jasonblais, lfbrock, mfpiccolo, saturninoabril, thomchop

source/deploy/mattermost-specfile.xml METASEP
<managedAppConfiguration>
	<version>1.0.0.1</version>
	<bundleId>com.mattermost.rn</bundleId>
	<dict>
		<string keyName="inAppPinCode">
			<defaultValue>
				<value>true</value> 
			</defaultValue>
		</string>
		<string keyName="inAppSessionAuth">
			<defaultValue>
				<value>false</value> 
			</defaultValue>
		</string>
        <string keyName="blurApplicationScreen">
			<defaultValue>
				<value>true</value> 
			</defaultValue>
		</string>
		<string keyName="jailBreakDetection">
			<defaultValue>
				<value>true</value> 
			</defaultValue>
		</string>
		<string keyName="copyAndPasteProtection">
			<defaultValue>
				<value>false</value> 
			</defaultValue>
		</string>
		<string keyName="serverUrl">
		</string>
		<string keyName="allowOtherServers">
			<defaultValue>
				<value>true</value> 
			</defaultValue>
		</string>
		<string keyName="username">
			<defaultValue>
				<userVariable value="emailAddress" />
			</defaultValue>
		</string>
		<string keyName="vendor">
			<defaultValue>
				<value>Mattermost</value> 
			</defaultValue>
		</string>
        <string keyName="useVPN">
			<defaultValue>
				<value>false</value> 
			</defaultValue>
		</string>
        <string keyName="timeoutVPN">
			<defaultValue>
				<value>30</value> 
			</defaultValue>
		</string>
	</dict>
    <presentation defaultLocale="en-US">
        <fieldGroup>
            <name>
                <!-- Language will be the next thing the Spec Creator Tool will support. Only English supported at the moment -->
                <language value="en-US">Mobile Privacy</language>
            </name>
            <field keyName="inAppPinCode" type="input">
                <label>
                    <language value="en-US">in-App Pincode</language>
                </label>
                <description>
                    <language value="en-US">Locks the app so the user needs to validate as the owner of the phone, it will prompt for fingerprint or passcode when the app first opens and when the app has been in the background for more than 5 minutes.</language>
                </description>
            </field>
            <field keyName="inAppSessionAuth" type="input">
                <label>
                    <language value="en-US">in-App Session Authentication</language>
                </label>
                <description>
                    <language value="en-US">Use the app’s internal browser for SSO instead of an external browser.</language>
                </description>
            </field>
            <field keyName="blurApplicationScreen" type="input">
                <label>
                    <language value="en-US">Blur Application Screen</language>
                </label>
                <description>
                    <language value="en-US">Protects app on screen information while the app is in the background.</language>
                </description>
            </field>
        </fieldGroup>
        <fieldGroup>
            <name>
                <!-- Language will be the next thing the Spec Creator Tool will support. Only English supported at the moment -->
                <language value="en-US">OS Integrity</language>
            </name>
            <field keyName="jailBreakDetection" type="input">
                <label>
                    <language value="en-US">Jailbreak &#x2F; Root Detection</language>
                </label>
                <description>
                    <language value="en-US">Disable app launch on Jailbroken or rooted devices.</language>
                </description>
            </field>
        </fieldGroup>
        <fieldGroup>
            <name>
                <!-- Language will be the next thing the Spec Creator Tool will support. Only English supported at the moment -->
                <language value="en-US">Mobile Data Loss Prevention</language>
            </name>
            <field keyName="copyAndPasteProtection" type="input">
                <label>
                    <language value="en-US">Copy&amp;Paste Protection</language>
                </label>
                <description>
                    <language value="en-US">Disables the ability to copy or paste from any input in the app.</language>
                </description>
            </field>
        </fieldGroup>
        <fieldGroup>
            <name>
                <!-- Language will be the next thing the Spec Creator Tool will support. Only English supported at the moment -->
                <language value="en-US">Networking</language>
            </name>
            <field keyName="useVPN" type="input">
                <label>
                    <language value="en-US">Use VPN</language>
                </label>
                <description>
                    <language value="en-US">Enable connection to the Mattermost Server to use a per-app VPN or VPN on-demand.</language>
                </description>
            </field>
            <field keyName="timeoutVPN" type="input">
                <label>
                    <language value="en-US">VPN Timeout</language>
                </label>
                <description>
                    <language value="en-US">Set how long the request waits (in seconds) for an initial VPN connection to establish before timeout.</language>
                </description>
            </field>
        </fieldGroup>
        <fieldGroup>
            <name>
                <!-- Language will be the next thing the Spec Creator Tool will support. Only English supported at the moment -->
                <language value="en-US">Mattermost settings</language>
            </name>
            <field keyName="serverUrl" type="input">
                <label>
                    <language value="en-US">Mattermost Server URL</language>
                </label>
                <description>
                    <language value="en-US">Set the Mattermost server URL users will be using as default.</language>
                </description>
            </field>
            <field keyName="allowOtherServers" type="input">
                <label>
                    <language value="en-US">Allow Other Servers</language>
                </label>
                <description>
                    <language value="en-US">Allow the user to change the above server URL.</language>
                </description>
            </field>
            <field keyName="username" type="input">
                <label>
                    <language value="en-US">Default Username</language>
                </label>
                <description>
                    <language value="en-US">Set the username or email address to use to authenticate against the Mattermost Server.</language>
                </description>
            </field>
            <field keyName="vendor" type="input">
                <label>
                    <language value="en-US">EMM Vendor or Company Name</language>
                </label>
                <description>
                    <language value="en-US">Name of the EMM vendor or company deploying the app so the users are aware the app is being protected.</language>
                </description>
            </field>
        </fieldGroup>
	</presentation>
</managedAppConfiguration>

source/deploy/image-proxy.rst METASEP
.. _image-proxy:

Image proxy
===========

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Using an image proxy means that all requests for images made by Mattermost clients will go through the proxy instead of contacting third-party servers directly. This helps protect user privacy by preventing third-party servers from tracking who views an image. This also prevents the use of tracking pixels (invisible images that do the same thing without the user even seeing an image).

Certain proxy servers also provide a layer of caching which can make loading images faster and more reliable. This caching also helps preserve posts by protecting them from dead images.

When enabled, the image proxy needs to be publicly accessible to both the Mattermost client and server.

Mattermost clients will use the image proxy to load all external images. The Mattermost server will use the image proxy when possible, but will not use it when requesting content that may not be an image, such as for `image previews of plaintext URLs <https://github.com/mattermost/mattermost-server/issues/11857>`_.

Configure an image proxy by going to **System Console > Environment > Image Proxy**.

Local image proxy
-----------------

The local image proxy is available as part of the Mattermost server deployment. When using the local image proxy, images are served to clients through the server which helps anonymize users. If SSL is enabled on the server, it provides a secure connection. This method does not offer any caching behavior.

.. note:: 
  
  With the local image proxy enabled, requests for images hosted on the local network are now affected by the ``AllowUntrustedInternalConnections`` setting. See `documentation <https://docs.mattermost.com/configure/configuration-settings.html#allow-untrusted-internal-connections-to>`_ for more information or if you are seeing unintentionally blocked images.

.. _atmos-camo:

atmos/camo image proxy
----------------------

The `atmos/camo <https://github.com/atmos/camo>`_ image proxy is a standalone image proxy that can be deployed separately from the Mattermost server. It provides additional configuration options over the built-in image proxy, and it can also be used if isolation between the Mattermost server and image proxy is desired.

Once you've deployed an ``atmos/camo`` (https://github.com/atmos/camo) instance, you must specify the **Remote Image Proxy URL** and **Remote Image Proxy Options** settings. The **Remote Image Proxy Options** should be set to the image proxy's shared key which is specified with the ``CAMO_KEY`` environment variable used when setting up the image proxy.

For example, if the image proxy is located at ``https://image-proxy.mattermost.com``, it would be configured as follows:

 - **Image Proxy Type**: ``atmos/camo``
 - **Remote Image Proxy URL**: ``https://image-proxy.mattermost.com``
 - **Remote Image Proxy Options**: ``CAMO_KEY``, which is the secret string used for the sample ``atmos/camo`` deployment.

.. image:: ../images/image-proxy.png
   :alt: Enable and configure an atmos/camo image proxy in the System Console by going to Environment > Image Proxy, specifying atmos/camo as the proxy type, providing the URL of the remote image proxy server, and by specifying the CAMO_KEY secret string.
  

source/deploy/encryption-options.rst METASEP
Encryption options
==================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Mattermost provides encryption-in-transit and encryption-at-rest capabilities. This page guides you through setting up appropriate encryption security.

Encryption is not required for GDPR, although it can be used as an additional safeguard against data breach.

.. contents::
  :backlinks: top
  :local:

Encryption-in-transit
---------------------

Mattermost supports TLS encryption including AES-256 with 2048-bit RSA on all data transmissions between Mattermost client applications and the Mattermost server. You may either set up TLS on the Mattermost Server or install a proxy such as NGINX and set up TLS on the proxy. Refer to our `configuration guide for more details <https://docs.mattermost.com/install/config-tls-mattermost.html>`__.

Connections to Active Directory/LDAP can `optionally be secured with TLS or stunnel <https://docs.mattermost.com/configure/configuration-settings.html#ad-ldap-port>`__.

Gossip encryption (experimental)
--------------------------------

In a High Availability mode, Mattermost supports encryption of cluster data in-transit when using the gossip protocol.  

The encryption uses AES-256 by default, and it is not configurable. However, it is possible to manually set the value in the ``Systems`` table for the ``ClusterEncryptionKey`` row. A key is a byte array converted to base64. It can be set to a length of 16, 24, or 32 bytes to select AES-128, AES-192, or AES-256 respectively.

Encryption-at-rest
------------------

Database
~~~~~~~~

Encryption-at-rest is available for messages via hardware and software disk encryption solutions applied to the Mattermost database, which resides on its own server within your infrastructure. Encryption options at the disk level are documented both for `MySQL <https://www.percona.com/blog/2016/04/08/mysql-data-at-rest-encryption/>`__ and `PostgreSQL <https://www.postgresql.org/docs/10/encryption-options.html>`__.

File storage
~~~~~~~~~~~~~

For local storage or storage via Minio, encryption-at-rest is available for files stored via hardware and software disk encryption solutions applied to the server.

For Amazon’s proprietary S3 system, encryption-at-rest is available via `server-side encryption with Amazon S3-managed keys <https://docs.mattermost.com/configure/configuration-settings.html#enable-server-side-encryption-for-amazon-s3>`__ in Mattermost enterprise-badge.

source/deploy/desktop-app.rst METASEP
Desktop App deployment guide
=============================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Mattermost desktop applications are available for Windows, macOS, and Linux operating systems.

You can `download the apps directly from our download page <https://mattermost.com/apps>`__ and visit our `installation guides <https://docs.mattermost.com/install/desktop-app-install.html>`__ for help during setup and for troubleshooting tips.

This page provides a guide on how to customize and distribute your own Mattermost desktop app, and how to distribute the official Windows desktop app silently to end users, pre-configured with the server URL and other app settings.

.. contents::
  :depth: 1
  :local:
  :backlinks: entry

Custom build configuration
--------------------------

You can customize and distribute your own Mattermost desktop application by configuring `src/common/config/buildConfig.js <https://github.com/mattermost/desktop/blob/master/src/common/config/buildConfig.js>`__.

1. Configure the desktop app's ``buildConfig.js`` file. There are multiple parameters you can configure to customize the user experience:

``defaultTeams``
~~~~~~~~~~~~~~~~

  Description
    List of server URLs and their display names added to the desktop app by default, which the user cannot modify. Users can still add servers `through the Server Management page <https://docs.mattermost.com/deploy/desktop-app.html#enableservermanagement>`__ unless ``enableServerManagement`` is set to ``false``. 
    
    Expects an array of key-value pairs.

  Example
  
.. code-block:: none

      defaultTeams: [
        {
          name: 'example',
          url: 'https://example.com'
        },
        {
          name: 'mattermost',
          url: 'https://www.mattermost.com'
        }
      ]

``helpLink``
~~~~~~~~~~~~

  Description
    The URL of the help documentation in **Help > Learn More** menu bar item. If none is specified, the menu option is hidden.
    
    Expects a string.

  Examples

.. code-block:: none

      helpLink: 'https://docs.mattermost.com/messaging/managing-desktop-app-servers.html'
      helpLink: ''

``enableServerManagement``
~~~~~~~~~~~~~~~~~~~~~~~~~~

  Description
    Controls whether users can add, edit, or remove servers on the app settings page. If set to false, at least one server must be specified for ``defaultTeams`` or else users cannot interact with any servers.
    
    Expects a boolean, true or false.

  Examples

.. code-block:: none

      enableServerManagement: true

2. To build the application, follow the `Mattermost Desktop Development Guide <https://github.com/mattermost/desktop/blob/master/docs/development.md>`__.

Windows App: Pre-configuration and silent deployment
-----------------------------------------------------

You can distribute the official Windows desktop app silently to end users, pre-configured with the server URL. You can also set all the `app settings <https://docs.mattermost.com/messaging/managing-desktop-app-options.html>`__ except for the **Start app on login** option.

1. Download the latest Windows installer from the `Mattermost download page <https://mattermost.com/apps>`__.

2. Move the executable file into a shared place such as a file server.

3. To create a batch file in Windows:

  - Open a text editor of your choice, such as Notepad or Notepad++.
  - Copy and paste the following commands in the text file:

.. code-block:: none

      rem "Step 1: Install Mattermost desktop app silently into user's local disk"
      start \\SERVER\shared_folder\mattermost-setup-4.6.2-win.exe --silent

      if not exist "%APPDATA%\Mattermost" mkdir %APPDATA%\Mattermost

      rem "Step 2: Generate initial config.json into user's config directory"
      (
        echo {
        echo   "version": 2,
        echo   "teams": [
        echo     {
        echo       "name": "core",
        echo       "url": "https://community.mattermost.com",
        echo       "order": 0
        echo     }
        echo   ],
        echo   "showTrayIcon": true,
        echo   "trayIconTheme": "light",
        echo   "minimizeToTray": true,
        echo   "notifications": {
        echo     "flashWindow": 2,
        echo     "bounceIcon": true,
        echo     "bounceIconType": "informational"
        echo   },
        echo   "showUnreadBadge": true,
        echo   "useSpellChecker": true,
        echo   "enableHardwareAcceleration": true,
        echo   "autostart": true,
        echo   "spellCheckerLocale": "en-US",
        echo   "darkMode": false
        echo }
      ) > %APPDATA%\Mattermost\config.json

.. note::

  Instead of using this command to install the desktop app into a shared folder, you can also copy the executable to the folder before running it. This allows the shared folder to only require read-only permissions.

4. Save the text file with the extension ``.bat``. For instance, ``mattermost-app-install.bat``.
5. Use standard software asset management tools to distribute and deploy the batch file to each user.

Once run, the desktop app is added to the user’s local directory, along with the pre-configured ``config.json`` file. The installer creates a shortcut for the desktop app in the user's start menu; if a zip version is used, you need to create the shortcut manually.

Windows App: Silently removing the app
---------------------------------------

To remove the app silently from a user's computer, you can run the following command:

.. code-block:: none
  
  %userprofile%\AppData\local\Programs\mattermost-desktop\Uninstall Mattermost.exe /currentuser /S
    
.. note::
   The .exe needs to be closed when this command is run
 

source/deploy/deployment-overview.rst METASEP
Deployment overview
===================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

The following Mattermost network diagram illustrates a private cloud deployment of Mattermost with optional configurations for scaling to performance from teams to large organizations.

.. image:: ../images/network_diagram.png
   :alt: Mattermost network diagram shows how the components of a private cloud deployment could be deployed. Includes optional configurations for scaling for larger enterprise organizations.

.. note::

  GitLab Mattermost deployment is `documented separately <https://docs.gitlab.com/omnibus/gitlab-mattermost/>`__ and not included below.

Requirements and installation guides
-------------------------------------

Mattermost supports workplace messaging for teams using one to three servers with instructions available in the Install Guides section of this documentation. See the `Software and Hardware Requirements <https://docs.mattermost.com/install/software-hardware-requirements.html>`__ documentation for server sizing estimates.

User experience
----------------

PC web experience
^^^^^^^^^^^^^^^^^

End users can securely share messages and files using a web-based Mattermost experience in Chrome, Firefox, Safari, and Edge. Please see `Software and Hardware Requirements <https://docs.mattermost.com/install/software-hardware-requirements.html>`__ documentation for full details.

Mobile App experience
^^^^^^^^^^^^^^^^^^^^^^

Native applications for iOS and Android are available for interacting with the Mattermost server and receiving encrypted push notifications from your private cloud. Organizations can use `a Hosted Push Notification Service <https://docs.mattermost.com/deploy/mobile-hpns.html#hosted-push-notifications-service-hpns>`__ with encrypted communications to mobile apps on the App Store and Google Play, or deploy to an `Enterprise App Store <https://docs.mattermost.com/deploy/mobile-hpns.html#mobile-push-notifications>`__ on your organization's private network. A `Test Push Notification Service <hhttps://docs.mattermost.com/deploy/mobile-hpns.html#test-push-notifications-service-tpns>`__ is available for use while evaluating options.

Mobile web experience
^^^^^^^^^^^^^^^^^^^^^

End users can securely share messages and files using a mobile web-based Mattermost experience on iOS and Android devices. Please see `Software and Hardware Requirements <https://docs.mattermost.com/install/software-hardware-requirements.html>`__ documentation for full details.

Email client
^^^^^^^^^^^^

Receive emails on desktop and mobile from the Mattermost server.

Communication protocols
-----------------------

HTTPS connection (secure hypertext transfer protocol)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The HTTPS connection to the Mattermost server renders pages and provides core functionality. It doesn't include real-time interactivity, which is enabled by the WSS connection.

If the HTTPS connection isn't available, the Mattermost service won't work. HTTPS is a secure, encrypted protocol and is highly recommended for production. An unencrypted HTTP connection may be used in initial testing and configuration but it is not recommended for production.

WSS connection (secure WebSocket protocol)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

WSS is a secure, encrypted connection and is highly recommended. An unencrypted WSS connection may be used in initial testing and configuration but it is not recommended for production.

The WSS connection to the Mattermost server enables real-time updates and notifications. If the WSS connection is not available, but HTTPS is available, the system will appear to work, but real-time updates and notifications will not work. Updates will only appear on a page refresh. WSS will be a persistent connection to the Mattermost server while you are connected, while HTTPS will be intermittent depending on when you load a page or a file.

Typically a "Mattermost unreachable" error message will be displayed warning users that the Mattermost server is either unreachable or the WebSocket connection is not properly configured.

Network access and multi-Factor authentication
----------------------------------------------

Behind a VPN
^^^^^^^^^^^^

Mattermost is intended to be installed within a private network which can offer multiple factors of authentication, including secure access to computing devices and physical locations.

If outside access is required, a virtual private network client (VPN), such as `OpenVPN <https://openvpn.net/>`__, with additional authentication used to connect to Mattermost for web, desktop, and mobile experiences, is recommended.

Non-VPN setup
^^^^^^^^^^^^^^^

If Mattermost is accessible from the open internet, the following is recommended:

1. An IT admin should be assigned to set up appropriate network security, subscribe to `the Mattermost security bulletin <https://mattermost.com/security-updates/#sign-up>`__, and `apply new security updates <https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html>`__.
2. The organization enables `SAML Single Sign-on <https://docs.mattermost.com/onboard/sso-saml.html>`__ or enable `MFA <https://docs.mattermost.com/onboard/multi-factor-authentication.html>`__ using Google Authenticator.

If Mattermost is accessible from the open internet with no VPN or MFA set up, we recommended using it only for non-confidential, unimportant conversations where impact of a compromised system is not essential.

Data center infrastructure
---------------------------

Push notification service
^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-only.rst
  :start-after: :nosearch:

The `Mattermost Push Notification Service (MPNS) <https://docs.mattermost.com/deploy/mobile-hpns.html#enable-mpns>`__ routes push notifications to:

1. Apple Push Notification Service to send notifications to the Mattermost iOS app.
2. Google Push Notification Service to send notifications to the Mattermost Android app.

If you're deploying mobile applications to an Enterprise App Store, your MPNS should be behind your firewall on your private network. If you're using mobile apps in the App Store and Google Play, you can relay notifications to mobile apps using the `Hosted Push Notification Service (HPNS) <https://docs.mattermost.com/deploy/mobile-hpns.html#hosted-push-notifications-service-hpns>`__.

HPNS does not connect to your mobile apps directly. It sends messages over an encrypted channel to Apple or Google which are relayed to the app users downloaded from the App Store or Google Play.

Proxy
^^^^^^

The proxy manages Secure Socket Layer (SSL) encryption and sets the policy on how network traffic will be routed to the Mattermost server.

Mattermost install guides include setup instructions for the NGNIX software proxy by default. For large scale deployments, a hardware proxy with dedicated devices for processing SSL encryption and decryption could potentially increase efficiencies.

In a High Availability configuration (Enterprise subscription plans only) the proxy would also balance network load across multiple Mattermost servers.

Microsoft Active Directory Single Sign-On 
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-only.rst
  :start-after: :nosearch:

Mattermost Enterprise and Professional supports Microsoft Active Directory and LDAP Single Sign-on with secure transport over TLS or stunnel.

Private Cloud integrations
^^^^^^^^^^^^^^^^^^^^^^^^^^^

Mattermost offers complete access to its Web Service APIs, along with incoming and outgoing webhooks, and slash command options for integrating with your self-managed systems.

`Visit our app directory <https://mattermost.com/marketplace/#privateApps>`__ for dozens of open source integrations to common tools like Jira, Jenkins, GitLab, Trac, Redmine, and SVN, along with interactive bot applications (Hubot, mattermost-bot), and other communication tools (Email, IRC, XMPP, Threema) that are freely available for use and customization.

Email service
^^^^^^^^^^^^^

For notifications and account verification, Mattermost connects to your existing email service over SMTP, including Microsoft Exchange, Amazon SES, SendGrid, and self-hosted email solutions.

Mattermost Server
-----------------

Mattermost Server installs as a single compiled binary file. All server settings are stored in a configuration file, ``config/config.json``, which can be updated directly or via the web-based System Console user interface.

RESTful JSON web service
^^^^^^^^^^^^^^^^^^^^^^^^

The entirety of the Mattermost server is accessible through a RESTful web service API. The API can be completely accessed by developers creating custom applications for Mattermost either directly or via Javascript and Golang drivers.

Authentication client
^^^^^^^^^^^^^^^^^^^^^

Authenticates users by email or username plus password.

Authentication provider
^^^^^^^^^^^^^^^^^^^^^^^^

Enables authentication of Mattermost server to other services with authentication client interface using OAuth2.

Notification service
^^^^^^^^^^^^^^^^^^^^

Sends notifications via SMTP email and mobile push notifications via Mattermost Push Notification Service.

Data management service
^^^^^^^^^^^^^^^^^^^^^^^

Connects to and manages supported databases.

High Availability
^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-only.rst
  :start-after: :nosearch:

*Available in legacy Mattermost Enterprise Edition E20*

Large organizations needing sophisticated, large scale, High Availability configurations can set up a `highly available, horizontally scalable <https://docs.mattermost.com/scale/high-availability-cluster.html>`__ deployment. `Contact us  <https://mattermost.com/contact-us/>`__ for guidance on configuring and sizing Mattermost to support your specific needs.

Data stores
------------

Databases
^^^^^^^^^^

Mattermost uses a MySQL or Postgres database to store and retrieve system data and to execute full text search. Solid State Drives (SSDs) can be used for faster read times to increase performance.

See `Database requirements <https://docs.mattermost.com/install/software-hardware-requirements.html#database-software>`__ for full details.

Multiple read replicas 
~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-only.rst
  :start-after: :nosearch:

*Available in legacy Mattermost Enterprise Edition E20*

For enterprise deployments, the Mattermost database can be configured with a master and multiple read replicas. The read replicas can be configured as a redundant backup to the active server, so that during hardware failures operation can be diverted to the read replica server without interrupting service. 

The safest configuration is to size the disk space on the read replica used for failover two to three times larger than storage available on master, so that if the master fails because it runs out of disk space it will fail over to a read replica with enough extra space to run smoothly until the master is corrected.

Search replicas
~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-only.rst
  :start-after: :nosearch:

*Available in legacy Mattermost Enterprise Edition E20*

You can configure one or more search replicas to isolate search queries. A search replica is similar to a read replica, but is used only for handling search queries.

Global deployments 
~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-only.rst
  :start-after: :nosearch:

*Available in legacy Mattermost Enterprise Edition E20*

Enterprise customers with deployments spanning many time zones can `contact us <https://mattermost.com/contact-us/>`__ for advanced configurations to minimize latency by:

1. Storing static assets over a global CDN.
2. Deploying multiple Mattermost servers to host API communication closer to the location of end users.
3. Deploying multiple database read replicas closer to the location of end users.

File store
^^^^^^^^^^^

Images and files shared by users are stored and retrieved in one of three options.

1. For teams sharing only modest amounts of file data, local storage on the same physical machine as the Mattermost server may be sufficient.
2. For enterprises sharing very large amounts of data, a Network Attached Storage (NAS) server may be used, which can scale to petabytes if necessary.
3. Alternatively, for both ease-of-use and scale, a third option is to use Amazon's S3 file storage service.

Deployment options
-------------------

Mattermost Enterprise Edition customers can contact Mattermost, Inc. for advice on deployment options for their specific environments. The following section describes common deployment configurations.

Mobile devices with VPN clients (recommended)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Mattermost can be deployed behind your company firewall on a private network with access from the outside via a Virtual Private Network (VPN). This means running a VPN client on the mobile devices and desktop computers that need to access Mattermost.

The `Mattermost Push Notification Service <https://docs.mattermost.com/deploy/deployment-overview.html#push-notification-service>`__ (MPNS) should be behind your firewall on your private network. MPNS does not connect with mobile apps directly, it forwards push notifications from the Mattermost server to a relay service for the App Store or Google Play, or to mobile apps within an Enterprise App Store.

Mobile devices without VPN clients
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

If Mattermost is available on the internet, we recommend using `SAML Single Sign-on <https://docs.mattermost.com/onboard/sso-saml.html>`__ or enable `MFA <https://docs.mattermost.com/onboard/multi-factor-authentication.html>`__ using Google Authenticator. 

The `Mattermost Push Notification Service <https://docs.mattermost.com/deploy/deployment-overview.html#push-notification-service>`__ (MPNS) should be behind your firewall inside your private network. MPNS does not connect with mobile apps directly, it forwards push notifications from the Mattermost server to a relay service for App Store or Google Play, or directly to mobile apps within an Enterprise App Store behind your firewall.

For support for certificate-based authentication for mobile devices, `contact us <https://mattermost.com/contact-us/>`__ for more information.

Mobile devices with an EMM provider
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Mattermost mobile applications can also be deployed via `EMM providers who support AppConfig <https://docs.mattermost.com/deploy/mobile-appconfig.html>`__. EMM solutions typically offer per-app VPN capabilities that can be used to connect to mobile apps behind a VPN.
source/deploy/deploy-mobile-apps-using-emm-provider.rst METASEP
Deploying mobile apps using an EMM provider
===========================================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

`Enterprise Mobile Management software <https://en.wikipedia.org/wiki/Enterprise_mobility_management>`__ helps enterprise teams manage secure mobile endpoints with managed app configuration.

You can use an EMM to:

- Enforce users to download the Mattermost pre-built or custom apps managed by your organization.
- Set default server url address.
- Restrict users from changing servers.
- Enforce security policies.

An EMM provider pushes Mattermost Mobile apps to EMM-enrolled devices. This approach is recommended for organizations that typically use EMM solutions to deploy Mobile apps to meet security and compliance policies.

Manage app configuration using AppConfig
----------------------------------------

AppConfig is our recommended approach for app configuration and management. It was introduced by the `AppConfig Community <https://www.appconfig.org/about/>`__, a group of leading EMM providers and app developers who have come together to make it easier for developers and customers to drive mobility in business.

AppConfig provides an easy way to configure enterprise mobile apps with any EMM providers listed on the `AppConfig website <https://www.appconfig.org/members/>`__. Using AppConfig, you can manage default settings and security controls on public app stores and custom-built mobile clients. For example, you can pre-configure your Mattermost server URL and username.

See our `Mattermost AppConfig Values <https://docs.mattermost.com/deploy/mobile-appconfig.html#mattermost-appconfig-values>`__ documentation for details on the configuration options that can be sent from the EMM provider to Mattermost Mobile apps.

.. important::
    Mattermost only supports the AppConfig standard for securing Mattermost mobile apps via an EMM provider due to incompatibilities with app wrapping and React Native applications. Different EMM vendors refer to “wrapping” in different ways, but it ultimately comes down to unpacking the mobile client bundle, injecting additional SDKs, and re-packaging/re-signing. React Native is the technology used to develop the Mattermost mobile apps.

    Mattermost doesn’t support app wrapping, and Mattermost mobile apps won't function properly when using app wrapping (e.g., Websockets for real-time messaging will break). Use app wrapping/containerization technology at your own risk.
    
    A Mattermost Enterprise subscription plan (or a legacy Enterprise Edition license) is required to request assistance or troubleshooting help from `Mattermost Customer Support <https://mattermost.com/support/>`__ when building and deploying custom mobile apps. Customers on other Mattermost subscription plans can develop and deploy custom mobile apps, but can't request technical support assistance through Mattermost Customer Support.

Enroll devices
--------------

When building your own custom versions or deploying the pre-built Mattermost Mobile apps, consider your organization’s mobile policy:

- Can users bring their own device (BYOD) If so, what devices will be used?
- Are devices company-owned and company-issued?
- Are both options supported?
- What operating systems do you want to start testing?

Once you know what possible device configurations you’ll be supporting, consider creating a sample configuration, then running validation tests against each configuration item.

Generate and assign device profiles
-----------------------------------

Generate and assign a device profile for device-wide configurations through the EMM provider.

source/deploy/consider-mobile-vpn-options.rst METASEP
Consider mobile VPN options
===========================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:


Connect to your private network Mattermost instance
---------------------------------------------------

You need to set up a way to connect to your private network Mattermost instance, using an external proxy with encrypted transport through HTTPS and WSS network connections.

Depending on your security policies, we recommend deploying Mattermost behind a VPN and using a `per-app VPN <#id3>`_ with your EMM provider, or a mobile VPN client.

Also consider deploying a mobile VPN client with multi-factor authentication (MFA) to your preferred login method, such as GitLab SSO with MFA, or run Mattermost Enterprise Edition with `multi-factor authentication (MFA) <https://docs.mattermost.com/onboard/multi-factor-authentication.html>`__ enabled.

Mobile VPN options
------------------

A Virtual Private Network (VPN) allows a device outside a firewall to access content inside the firewall as if it were on the same network.

.. note::
  Some mobile VPN options depend on the requirements of your organization and the demands and/or the needs of your users.

We recommend one of two options: `per-app VPN <#id3>`_ or a `device VPN <#id4>`_ to secure your deployment. Both options are compatible with most EMM providers.

We also recommend you review the following commonly-asked questions about data security on mobile devices:

- `How data is handled on a device after an account is deleted? <https://docs.mattermost.com/deploy/mobile-faq.html#how-is-data-handled-on-mobile-devices-after-a-user-account-is-deactivated>`__
- `What post metadata is sent in mobile push notifications? <https://docs.mattermost.com/deploy/mobile-faq.html#what-post-metadata-is-sent-in-mobile-push-notifications>`__
- `What are my options for securing the Mobile apps? <https://docs.mattermost.com/deploy/mobile-faq.html#what-are-my-options-for-securing-the-mobile-apps>`__
- `What are my options for securing push notifications? <https://docs.mattermost.com/deploy/mobile-faq.html#what-are-my-options-for-securing-push-notifications>`__

Per-app VPN
~~~~~~~~~~~

A common approach is to use a per-app VPN. This provides a connection to the VPN when needed (on-demand). If using a per-app VPN with Mattermost, you can configure the following options:

- **useVPN:** Mattermost waits until the connection to the VPN server is established before making any requests (otherwise they will fail). This is only supported on iOS as Android OS cannot support waiting. It still works but the first connection attempt may fail.
- **timeoutVPN (iOS only):** How long to wait for the connection to the VPN server before trying.

Device VPN
~~~~~~~~~~

With this option, all internet traffic routes through the VPN specified in the profile. This could cause issues for personal applications.

Connect via corporate proxy server
----------------------------------

Review the following commonly-asked questions about connecting through a corporate proxy server:

- `How do I receive mobile push notifications if my IT policy requires the use of a corporate proxy server? <https://docs.mattermost.com/deploy/mobile-faq.html#how-do-i-receive-mobile-push-notification-if-my-it-policy-requires-the-use-of-a-corporate-proxy-server>`__
- `Deploy Mattermost with connection restricted post-proxy relay in DMZ or a trusted cloud environment <https://docs.mattermost.com/deploy/mobile-faq.html#deploy-mattermost-with-connection-restricted-post-proxy-relay-in-dmz-or-a-trusted-cloud-environment>`__
- `Whitelist Mattermost push notification proxy to bypass your corporate proxy server <https://docs.mattermost.com/deploy/mobile-faq.html#whitelist-mattermost-push-notification-proxy-to-bypass-your-corporate-proxy-server>`__
- `Run App Store versions of the Mattermost Mobile apps <https://docs.mattermost.com/deploy/mobile-faq.html#run-app-store-versions-of-the-mattermost-mobile-apps>`__

source/deploy/client-side-data.rst METASEP
Client-side data storage FAQ
============================

Mobile web experience
---------------------

**1. What data is stored?**
  Similar to a desktop web browser, data may be stored in the mobile web browser cache which resides on the storage system of the device operating system which is protected by security measures in the physical device and its operating system.
**2. How is the data protected?**
  Security for mobile web experience is similar to the security for a desktop web experience.
**3. When is the data deleted?**
  If you log out or your account is deactivated, the data in the browser cache may reside until the cache expires or the temporary file system store on the operating system is cleared, depending on your operating system.


Mobile app experience
---------------------

To speed up initial loading time, Mattermost mobile apps cache data locally on the device for v1.1 and later. Below are common questions on cached data:

**1. What data is stored locally with the new mobile apps on a mobile device?**
  The data that can be found on the device depends solely on whether or not the user is logged in to the Mattermost server, and is independent of the state of the device's connection or the state of the app. While logged in, anything that the user is normally allowed to see is eligible for storage on the device, which includes the following content:

  - Messages
  - Files and images that are attached to messages
  - Avatars, usernames, and email addresses of people in the currently open channel

  In addition, metadata that the app uses for keeping track of its operations is also cached. The metadata includes user IDs, channel IDs, team IDs, and message IDs.
  
  Currently, cache cannot be reset remotely on connected mobile devices.

**2. What about push notifications?**
  Push notification storage is managed by the operating system on the device. Mattermost can be configured to send limited amounts of information that does not include the message text or channel name, and it can also be configured to not send push notifications at all.

**3. Where is the data stored and how is that data protected?**
  The data is stored in the app's local storage. It's protected by the security measures that a device normally provides to the apps that are installed on it.

**4. How long is the data stored?**
  Data is stored until the user logs out, or until it is purged during normal cache management. Deactivating a user account forces a logout and subsequent purging of data from the device.

**5. Are messages pre-loaded?**
  No. Messages are sent to the device on demand. They are not pre-loaded in anticipation of users scrolling up or switching channels.

**6. What happens to messages that are deleted on the server after a user has seen them?**
  The messages are deleted from the client.

**7. What data is stored on a mobile device after an account is deactivated in the following cases:**
  a. *The mobile device is connected with app running.*

    All the data listed in questions 1 and 2, but within 60 seconds after an account is deactivated on the server, all app data is deleted from the cache.

  b. *The mobile device is disconnected with app running.*

    All the data listed in questions 1 and 2, but within 60 seconds after the device reconnects, all app data is deleted from the cache.

  c. *The mobile device is connected with the app not running.*

    All the data listed in Questions 1 and 2, but within 60 seconds after the app is started, all app data is deleted from the cache.

  d. *The mobile device is disconnected and app is not running.*

    All the data listed in Questions 1 and 2, but within 60 seconds after the device reconnects and the app is started, all app data is deleted from the cache.

**8. What data might be on the device after a user account is deactivated and all data is deleted from the cache?**
  If file attachments are enabled on the server, users can download files that are attached to messages and store them on their local file system. After they are downloaded, the files are outside the control of the app and can remain on the device indefinitely.

source/deploy/build-custom-mobile-apps.rst METASEP
Building and distributing your own custom Mattermost mobile apps
================================================================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

You can build and distribute custom versions of the Mattermost mobile app. Choosing this approach means `you've decided not to use the mobile app Mattermost has made available <https://docs.mattermost.com/deploy/use-prebuilt-mobile-apps.html>`__ through public app stores. This also means that you've decided to `host your own push proxy service <https://docs.mattermost.com/deploy/mobile-hpns.html#host-your-own-push-proxy-service>`__.

This approach is recommended for:

- Organizations that want to customize their Mattermost mobile Apps.
- Customers using self-hosted Mattermost Team Edition, Professional or Enterprise Edition that prefer to host their own push proxy server instead of using one of Mattermost’s hosted versions.

.. note::
   A Mattermost Enterprise subscription plan (or a legacy Enterprise Edition license) is required to request assistance or troubleshooting help from `Mattermost Customer Support <https://mattermost.com/support/>`__ when building and deploying custom mobile apps. Customers on other Mattermost subscription plans can develop and deploy custom mobile apps, but can't request technical support assistance through Mattermost Customer Support.
  
Deployment options
------------------

When you decide to build your own Mattermost mobile apps, you have multiple ways to deploy:

- Submitting your app to `an Enterprise App Store <#using-an-enterprise-app-store>`_.
- Using `an Enterprise Mobile Management (EMM) provider <#using-an-emm-provider>`_.
- Submitting your app to `public app stores <#using-public-app-stores>`_.
- Using `another distribution method <#using-another-distribution-method>`_.

Setting up push notifications
-----------------------------

See our `Mobile Push Notifications <https://docs.mattermost.com/deploy/mobile-hpns.html>`__ documentation to learn about setting up push notifications for custom-built mobile apps.

Developing and maintaining your custom app
------------------------------------------

The Mattermost Mobile App is an open source project. Customizing Mattermost mobile apps requires a fork of the source code. Your team will be responsible for maintaining that fork, as well as keeping that fork updated with any changes made by Mattermost.

This means that you manage the maintenance of your custom Mattermost mobile apps, such as rebuilding and incorporating feature and/or security updates. If this isn't done regularly, your applications won't match the functionality of our publicly-available applications, and could be incompatible with future versions of Mattermost Server.

This process can be complicated and can greatly increase deployment time, not only initially, but whenever the mobile apps need to be updated. We recommend having your development team `review the Mattermost Mobile Apps developer documentation <https://developers.mattermost.com/contribute/mobile/>`__ to ensure they understand the scale and requirements of taking this path. This documentation provides guidance on building, compiling, signing, and white-labeling Mattermost Mobile apps.

In general, building your own mobile apps will present some challenges, including:

- Installing the necessary developer tools (such as Nodejs, XCode Developer Tools, Android SDKs, as well as others).
- Obtaining and providing certificates for your custom Mattermost mobile apps*.
- Signing your custom Mattermost mobile apps*.
- Distributing your Mobile app to your users.

***** Mattermost mobile apps are signed, and they have certificates and keys associated with Mattermost and public app stores. This means Mattermost’s Mobile App won’t work if you choose to privately host the Mattermost Push Proxy Service (MPNS). You'll need to build your own custom mobile app.

Custom mobile app branding
~~~~~~~~~~~~~~~~~~~~~~~~~~

Ensure you select a unique app name that helps users distinguish your version from others, such as "<Your Company Name> Collaboration". See our `Brand and Visual Design Guidelines <https://handbook.mattermost.com/operations/operations/company-processes/publishing/publishing-guidelines/brand-and-visual-design-guidelines#name-usage-guidelines.html>`__ in our company Handbook for details.

Deploying your custom app
-------------------------

You have a number of ways to deploy your custom app for your users to download to their mobile devices.

Using an enterprise app store
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This is the most common way for customers to distribute their apps, and it’s our recommended approach. Once your custom app is added to your own enterprise App Store, your users can download it from the store directly or from an EMM catalog.

Using an EMM provider
~~~~~~~~~~~~~~~~~~~~~

Alternatively, you can use an EMM provider to push the application to the user’s device, then use the AppConfig standard to enforce a selection of app-specific controls.

For additional details, see the following documentation:

- `Deployment Using an EMM provider <https://docs.mattermost.com/deploy/deploy-mobile-apps-using-emm-provider.html>`__ to learn more about deploying your custom Mattermost Mobile apps through an EMM provider.
- `Manage app configuration using AppConfig <https://docs.mattermost.com/deploy/mobile-appconfig.html>`__  to learn more about managing your app configuration using App Config, and the configuration options that can be sent from the EMM provider to Mattermost mobile apps.

Using public app stores
~~~~~~~~~~~~~~~~~~~~~~~

This is the same process Mattermost uses to make Mattermost mobile apps available for everyone. Before your app can be listed on the public app stores, you need to submit it to the public app stores for review and approval.

As part of the submission process, you need to identify an update strategy that accounts for the release of new versions of Mattermost mobile apps.

This update strategy should include:

- Reviewing compatibility requirements.
- Validating mobile app versions connecting to the server.
- Updating Mattermost Server.
- Updating Mattermost mobile apps.

We highly recommend you update your custom Mattermost mobile apps to incorporate any security or service releases. Prior to distribution, check any compatibility requirements for the mobile apps and the Mattermost server. Consult the `Mattermost mobile app changelog <https://docs.mattermost.com/deploy/mobile-app-changelog.html>`__ and the `Mattermost server changelog <https://docs.mattermost.com/install/self-managed-changelog.html>`__ for details.

.. important::

   Not all provided updates are compatible with all previous versions of Mattermost Server. Updating only Mattermost mobile apps or updating the mobile apps before Mattermost Server can result in incompatibility issues.

Using another distribution method
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

You can set up an alternate distribution method to deploy your custom app, such as a file sharing platform.

source/deploy/bleve-search.rst METASEP
Bleve search (experimental)
===========================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Bleve is a search engine that uses Lucene-style full-text search and indexing. This style of search and indexing helps overcome limitations of the default database search such as challenges with characters and advanced search capabilities.

The Bleve search engine works as a library integrated into the Mattermost codebase. As it generates indexes in the filesystem of the server that it is running on, it doesn’t require an external server to function. Because of this, Bleve should not be enabled in High Availability deployments.

.. note::

  From Mattermost v6.1, Bleve search uses the scorch index type on newly-created indexes. This new index type features efficiency improvements and indexes that use significantly less disk space.
  
  To use this new type of index on your existing indexes, first upgrade Mattermost Server to version to v6.1 or later. Then go to **System Console > Experimental > Bleve** and select **Purge Index** to run a purge operation. When that's complete, select **Index Now** to reindex. Bleve remains compatible with existing indexes, so currently indexed data will continue to work if a purge and reindex isn't run.

Configuring Bleve in Mattermost
-------------------------------

Follow these steps to configure the Mattermost server to use Bleve and generate required indexes. Once the configuration is saved, new posts made to the database will be automatically indexed with Bleve.

**Note:** During indexing, search results may be incomplete until the indexing job is complete.

1. Open **System Console > Experimental > Bleve**.
2. Set **Enable Bleve Indexing** to **true** to enable the other settings on the page.
3. Set the directory path to use for storing Bleve indexes (e.g.: ``/var/opt/mattermost/bleveindexes``). The user running Mattermost should have permissions to access the directory. See our `Configuration Settings <https://docs.mattermost.com/configure/configuration-settings.html#bleve-settings>`__  documentation for details.
4. Save the configuration.
5. Select **Index Now**. All users, channels, and posts in the database will be indexed oldest to newest.
6. Set **Enable Bleve for search queries** to **true**.
7. Set **Enable Bleve for autocomplete queries** to **true**.

.. note::

  Search results for files shared before upgrading to Mattermost Server v5.35 may be incomplete until an extraction command is run using the `CLI <https://docs.mattermost.com/manage/command-line-tools.html#mattermost-extract-documents-content>`__, or using the `mmctl <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-extract>`__. After running this command, the search index must be rebuilt. Go to **System Console > Experimental > Bleve > Bulk Indexing**, then select **Index Now** to rebuild the search index to include older file contents.

Using Bleve search
------------------

The following conditions are applied when using Bleve search:

* **Unquoted terms:** Search terms that contain non-alphanumeric characters/special characters outside of quotation marks are removed. For example, using ``abcd "**" && abc`` as a search term will return results for a search for ``abcd "**" abc`` as the ``&&`` characters weren't within the quotation marks.
* **Wildcard search:** Wildcard search (e.g., ``abc*``) is supported.

How does search work with Bleve disabled?
-------------------------------------------

Mattermost performs full text searches against the database unless you have an `Enterprise license <https://docs.mattermost.com/about/deployments-and-editions.html#mattermost-enterprise>`__ and `Elasticsearch <https://docs.mattermost.com/scale/elasticsearch.html>`__ configured.
source/deploy/backup-disaster-recovery.rst METASEP
Backup and disaster recovery 
=============================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Options to protect your Mattermost server from different types of failures range from simple backup to sophisticated disaster recovery deployments and automation.

Backup
------

The state of your Mattermost server is contained in multiple data stores that need to be separately backed up and restored to fully recover your system from failure. 

To back up your Mattermost server:

1. Back up your Mattermost database using standard MySQL or PostgreSQL procedures depending on your database version.

      - `MySQL backup documentation <https://dev.mysql.com/doc/refman/5.6/en/backup-types.html>`__ is available online. Use the selector on the page to choose your MySQL version.
      - `PostgreSQL SQL Dump backup documentation <https://www.postgresql.org/docs/10/backup-dump.html>`__ is available online. Use the navigation at the top of the page to select your PostgreSQL version.
     
2. Back up your server settings stored in ``config/config.json``.

      - If you are using SAML configuration for Mattermost, your SAML certificate files will be saved in the ``config`` directory. Therefore, it is recommended to back up the entire directory.
   
3. Back up files stored by your users with one of the following options: 

     - If you use local storage using the default ``./data`` directory back up this directory.
     - If you use local storage using a non-default directory specified in the ``Directory`` setting in ``config.json``, back up files in that location.
     - If you store your files in S3, you can typically keep the files where they are located without backup.
     
Please note that to make a 'clean' backup you need to stop Mattermost during the duration of the backup otherwise the database and files may become out of sync.

To restore a Mattermost instance from backup, restore your database, ``config.json`` file, and optionally locally stored user files into the locations from which they were backed up.

Disaster recovery 
-----------------

An appropriate disaster recovery plan weighs the benefits of mitigating specific risks against the cost and complexity of setting up disaster recovery infrastructure and automation.

There are two common approaches: 

Automated backup
~~~~~~~~~~~~~~~~

Automating backups for a Mattermost server provides a copy of the server's state at a particular point in time, which can be restored if a failure in the future leads to loss of data. Options include:

- Automation to periodically back up the Mattermost server, which may include all the components listed above or a subset depending on what you choose to protect.
- Automation to restore a server from backup, or deploy a new server, to reduce recovery time.
- Automation to verify a backup has been successfully produced to protect against backup automation failures.
- Storing backups off-site, to protect against physical loss of onsite systems.

Recovering from a failure using a backup is typically a manual process and will incur downtime. The alternative is to automate recovery using a high availability deployment.

High Availability deployment 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Deploying Mattermost in `High Availability mode <https://docs.mattermost.com/scale/high-availability-cluster.html>`__ allows for fast, automated recovery from component failure, such as a specific server running out of disk space or having a hardware issue, by running on redundant servers. Options include:

- Deploying redundant Mattermost servers, to protect against failures in the Mattermost server.
- Deploying redundant databases, to protect against failures in the database.
- Deploying redundant web proxies, to protect against failures in the web proxies.
- Deploying redundant infrastructure in a separate physical data center, to protect against failures in the primary data center.

A properly deployed High Availability deployment automatically switches over to a redundant system should a single server fail. High Availability does not protect against failures such as data corruption, since errors would propagate to redundant systems.

A "complete" disaster recovery solution would protect against both real-time hardware failures using High Availability, data corruption failures using automation, and failures of the primary data center by offering both offsite backup and offsite redundant infrastructure. Because the complexity of a full disaster recovery solution is high, it is common for customers to consider trade-offs in cost and complexity relative to the anticipated risks and target recovery times.

Failover from Single Sign-On outage 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

When using Single Sign-on with Mattermost Enterprise Edition an outage to your SSO provider can cause a partial outage on your Mattermost instance.

**What happens during an SSO outage?**

- **Most people can still log in.** By default, when a user logs in to Mattermost they receive a session token lasting 30 days (the duration can be configured in the System Console). During an SSO outage, users with valid session tokens can continue to using Mattermost uninterrupted.
- **Some people can't log in.** During an SSO outage, there are two situations under which a user cannot log in:
  
  * Users whose session token expires during the outage.
  * Users trying to log in to new devices.

In each case, the user cannot reach the SSO provider, and cannot log in. In this case, there are several potential mitigations:

Configure your SSO provider for High Availability 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

If you're using a self-hosted Single Sign-on provider, several options are available for `High Availability configurations that protect your system from unplanned outages <https://docs.microsoft.com/en-us/microsoft-identity-manager/pam/high-availability-disaster-recovery-considerations-bastion-environment>`__.

For SaaS-based authentication providers, while you still have a dependency on service uptime, you can set up redundancy in source systems from which data is being pulled. For example, with the OneLogin SaaS-based authentication service, you can set up `High Availability LDAP connectivity <https://support.onelogin.com/hc/en-us/articles/204262680-High-Availability-for-LDAP>`__ to further reduce the chances of an outage.

Set up your own IDP to provide an automated or manual SSO failover option 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Create a custom Identity Provider for SAML authentication that connects to both an active and a standby authentication option, that can be manually or automatically switched in case of an outage.

In this configuration, security should be carefully reviewed to prevent the standby SSO option from weakening your authentication protocols.

Set up a manual failover plan for SSO outages 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

When users are unable to reach your organization's SSO provider during an outage, an error message directing them to contact your support link (defined in your System Console settings) is displayed.

Once IT is contacted about an SSO outage issue, they can temporarily change a user's account from SSO to email-password using the System Console, and the end user can use password to claim the account, until the SSO outage is over and the account can be converted back to SSO.

If the System Admin is unable to log into the System Console because of the SSO outage, they can switch their authentication method to email-password to gain access using the `command line tool <https://docs.mattermost.com/manage/command-line-tools.html>`__.

When the outage is over, it's critical to switch everyone back to SSO from email-password to maintain consistency and security.

source/configure/web-server-configuration-settings.rst METASEP
:orphan:
:nosearch:

Configure the network environment in which Mattermost is deployed by going to **System Console > Environment > Web Server**, or by updating the ``config.json`` file as described in the following tables. Changes to configuration settings in this section require a server restart before taking effect.

Site URL
~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+---------------------------------------------------------------+
| The URL that users use to access Mattermost.                  | - System Config path: **Environment > Web Server**            |
| The port number is required if it’s not a standard port,      | - ``config.json`` setting: ``.ServiceSettings.SiteURL",``     |
| such as 80 or 443. This field is required.                    | - Environment variable: ``MM_SERVICESETTINGS_SITEURL``        |
|                                                               |                                                               |
| Select the **Test Live URL** button in the System Console     |                                                               |
| to validate the Site URL.                                     |                                                               |
+---------------------------------------------------------------+---------------------------------------------------------------+
| **Notes**:                                                                                                                    |   
|                                                                                                                               |
| - The URL may contain a subpath, such as "https://example.com/company/mattermost".                                            |
| - If you change the Site URL value, log out of the Desktop App, and sign back in using the new domain.                        |
| - If Site URL is not set:                                                                                                     |
|                                                                                                                               |
|   - Email notifications will contain broken links, and email batching will not work.                                          |
|   - Authentication via OAuth 2.0, including GitLab, Google, and Office 365, will fail.                                        |
|   - Plugins may not work as expected.                                                                                         |
+-------------------------------------------------------------------------------------------------------------------------------+

Web server listen address
~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+------------------------------------------------------------------+
| The address and port to which to bind and listen.             | - System Config path: **Environment > Web Server**               |
| Specifying ``:8065`` will bind to all network interfaces.     | - ``config.json`` setting: ``".ServiceSettings.ListenAddress",`` |
| Specifying ``127.0.0.1:8065`` will only bind to the network   | - Environment variable: ``MM_SERVICESETTINGS.LISTENADDRESS``     |
| interface having that IP address.                             |                                                                  |
|                                                               |                                                                  |
| If you choose a port of a lower level (called “system ports”  |                                                                  |
| or “well-known ports”, in the range of 0-1023), you must have |                                                                  |
| permissions to bind to that port.                             |                                                                  |
+---------------------------------------------------------------+------------------------------------------------------------------+

Forward port 80 to 443
~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+--------------------------------------------------------------------------+
| Forward insecure traffic from port 80 to port 442.            | - System Config path: **Environment > Web Server**                       |
|                                                               | - ``config.json`` setting: ``".ServiceSettings.Forward80To443: false",`` |
| - **true**: Forwards all insecure traffic from port 80 to     | - Environment variable: ``MM_SERVICESETTINGS_FORWARD80TO443``            |
|   secure port 443.                                            |                                                                          |
| - **false**: **(Default)** When using a proxy such as NGINX   |                                                                          |
|   in front of Mattermost this setting is unnecessary          |                                                                          |
|   and should be set to false.                                 |                                                                          |
+---------------------------------------------------------------+--------------------------------------------------------------------------+

Web server connection security
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+-----------------------------------------------------------------------+-----------------------------------------------------------------------+
| Connection security between Mattermost clients and the server.        | - System Config path: **Environment > Web Server**                    |
|                                                                       | - ``config.json`` setting: ``".ServiceSettings.ConnectionSecurity",`` |
| - **Not specified**: Mattermost will connect over an unsecure         | - Environment variable: ``MM_SERVICESETTINGS_CONNECTIONSECURITY``     |
|   connection.                                                         |                                                                       |
| - **TLS**: Encrypts the communication between Mattermost              |                                                                       |
|   clients and your server. See the `configuring TLS on Mattermost     |                                                                       |
|   <https://docs.mattermost.com/install/config-tls-mattermost.html>`__ |                                                                       |
|   for more details                                                    |                                                                       |
+-----------------------------------------------------------------------+-----------------------------------------------------------------------+

TLS certificate file
~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+--------------------------------------------------------+------------------------------------------------------------------+
| The path to the certificate file to use for TLS        | - System Config path: **Environment > Web Server**               |
| connection security.                                   | - ``config.json`` setting: ``".ServiceSettings.TLSCertFile",``   |
|                                                        | - Environment variable: ``MM_SERVICESETTINGS_TLSCERTFILE``       |
| String input.                                          |                                                                  |
+--------------------------------------------------------+------------------------------------------------------------------+

TLS key file
~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+--------------------------------------------------------+---------------------------------------------------------------+
| The path to the TLS key file to use for TLS            | - System Config path: **REnvironment > Web Server**           |
| connection security.                                   | - ``config.json`` setting: ``".ServiceSettings.TLSKeyFile",`` |
|                                                        | - Environment variable: ``MM_SERVICESETTINGS_TLSKEYFILE``     |
| String input.                                          |                                                               |
+--------------------------------------------------------+---------------------------------------------------------------+

Use Let's Encrypt
~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------------+--------------------------------------------------------------------------+
| Enable the automatic retrieval of certificates from Let’s Encrypt.  | - System Config path: **Environment > Web Server**                       |
| See the `configuring TLS on Mattermost documentation                | - ``config.json`` setting: ``".ServiceSettings.UseLetsEncrypt: false",`` |
| <https://docs.mattermost.com/install/config-tls-mattermost.html>`__ | - Environment variable: ``MM_SERVICESETTINGS_USELETSENCRYPT``            |
| for more details on setting up Let’s Encrypt.                       |                                                                          |
|                                                                     |                                                                          |
| - **true**: The certificate will be retrieved when a client         |                                                                          |
|   attempts to connect from a new domain. This will work with        |                                                                          |
|   multiple domains.                                                 |                                                                          |
| - **false**: **(Default)** Manual certificate specification         |                                                                          |
|   based on the TLS Certificate File and TLS Key File specified      |                                                                          |
|   above.                                                            |                                                                          |
+---------------------------------------------------------------------+--------------------------------------------------------------------------+

Let's Encrypt certificate cache file
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+--------------------------------------------------------+------------------------------------------------------------------------------------+
| The path to the file where certificates and other data | - System Config path: **Reporting > Team Statistics**                              |
| about the Let’s Encrypt service will be stored.        | - ``config.json`` setting: ``".ServiceSettings.LetsEncryptCertificateCacheFile",`` |
|                                                        | - Environment variable: ``MM_SERVICESETTINGS_LETSENCRYPTCERTIFICATECACHEFILE``     |
| File path input.                                       |                                                                                    |
+--------------------------------------------------------+------------------------------------------------------------------------------------+

Read timeout
~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------+---------------------------------------------------------------------+
| Maximum time allowed from when the connection is        | - System Config path: **Environment > Web Server**                  |
| accepted to when the request body is fully read.        | - ``config.json`` setting: ``".ServiceSettings.ReadTimeout: 300",`` |
|                                                         | - Environment variable: ``MM_SERVICESETTINGS_READTIMEOUT``          |
| Numerical input in seconds. Default is **300** seconds. |                                                                     |
+---------------------------------------------------------+---------------------------------------------------------------------+

Write timeout
~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+----------------------------------------------------------+-----------------------------------------------------------------------------+
| - If using HTTP (insecure), this is the maximum time     | - System Config path: **Environment > Web Server**                          |
|   allowed from the end of reading the request headers    | - ``config.json`` setting: ``".ServiceSettings.WriteTimeout: 300",``        |
|   until the response is written.                         | - Environment variable: ``MM_SERVICESETTINGS_WRITETIMEOUT``                 |
| - If using HTTPS, it's the total time from when the      |                                                                             |
|   connection is accepted until the response is written.  |                                                                             |
|   accepted to when the request body is fully read.       |                                                                             |
|                                                          |                                                                             |
| Numerical input in seconds. Default is **300** seconds.  |                                                                             |
+----------------------------------------------------------+-----------------------------------------------------------------------------+

Idle timeout
~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------+---------------------------------------------------------------------+
| Set an explicit idle timeout in the HTTP server.        | - System Config path: **Environment > Web Server**                  |
| This is the maximum time allowed before an idle         | - ``config.json`` setting: ``".ServiceSettings.IdleTimeout: 300",`` |
| connection is disconnected.                             | - Environment variable: ``MM_SERVICESETTINGS_IDLETIMEOUT``          | 
|                                                         |                                                                     |
| Numerical input in seconds. Default is **300** seconds. |                                                                     |
+---------------------------------------------------------+---------------------------------------------------------------------+

Webserver mode
~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------------+------------------------------------------------------------------------+
| We recommend gzip to improve performance unless your                | - System Config path: **Environment > Web Server**                     |
| environment has specific restrictions, such as a web proxy that     | - ``config.json`` setting: ``".ServiceSettings.WebserverMode: gzip",`` |
| distributes gzip files poorly.                                      | - Environment variable: ``MM_SERVICESETTINGS_WEBSERVERMODE``           |
|                                                                     |                                                                        |
| - **gzip**: **(Default)** The Mattermost server will serve static   |                                                                        |
|   files compressed with gzip to improve performance.                |                                                                        |
|   gzip compression applies to the HTML, CSS, Javascript, and other  |                                                                        |
|   static content files that make up the Mattermost web client.      |                                                                        |
| - **Uncompressed**: The Mattermost server will serve static         |                                                                        |
|   files uncompressed.                                               |                                                                        |
| - **Disabled**: The Mattermost server will not serve static files.  |                                                                        |
|   based on the TLS Certificate File and TLS Key File specified      |                                                                        |
|   above.                                                            |                                                                        |
+---------------------------------------------------------------------+------------------------------------------------------------------------+

Enable insecure outgoing connections
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+---------------------------------------------------------------------------------------------+
| Configure Mattermost to allow insecure outgoing connections.  | - System Config path: **Environment > Web Server**                                          |
|                                                               | - ``config.json`` setting: ``".ServiceSettings.EnableInsecureOutgoingConnections: false",`` |
| - **true**: Outgoing HTTPS requests, including S3 clients,    | - Environment variable: ``MM_SERVICESETTINGS_ENABLEINSECUREOUTGOINGCONNECTIONS``            |
|   can accept unverified, self-signed certificates.            |                                                                                             |     
|   For example, outgoing webhooks to a server with a           |                                                                                             |
|   self-signed TLS certificate, using any domain, will be      |                                                                                             |
|   allowed, and will skip TLS verification.                    |                                                                                             |
| - **false**: **(Default)** Only secure HTTPS requests are     |                                                                                             |
|   allowed.                                                    |                                                                                             |
+---------------------------------------------------------------+---------------------------------------------------------------------------------------------+
| **Security note**: Enabling this feature makes these connections susceptible to man-in-the-middle attacks.                                                  |
+---------------------------------------------------------------+---------------------------------------------------------------------------------------------+

Managed resource paths
~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+--------------------------------------------------------+-------------------------------------------------------------------------+
| A comma-separated list of paths within the Mattermost  | - System Config path: **Environment > Web Server**                      |
| domain that are managed by a third party service       | - ``config.json`` setting: ``".ServiceSettings.ManagedResourcePaths",`` |
| instead of Mattermost itself.                          | - Environment variable: ``MM_SERVICESETTINGS_ManagedResourcePaths``     |
|                                                        |                                                                         |
| Links to these paths will be opened in a new           |                                                                         |
| tab/window by Mattermost apps.                         |                                                                         |
|                                                        |                                                                         |
| For example, if Mattermost is running on               |                                                                         |
| ``https://mymattermost.com``, setting this to          |                                                                         |
| conference will cause links such as                    |                                                                         |
| ``https://mymattermost.com/conference`` to open in a   |                                                                         |
| new window.                                            |                                                                         |
+--------------------------------------------------------+-------------------------------------------------------------------------+
| **Note:**                                                                                                                        |
| When using the Mattermost Desktop App, additional configuration is required to open the link within the Desktop App instead of   |
| in a browser. See the `desktop managed resources <https://docs.mattermost.com/install/desktop-app-managed-resources.html>`__     |
| documentation for details.                                                                                                       |
+--------------------------------------------------------+-------------------------------------------------------------------------+

Reload configuration from disk
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+----------------------------------------------------------+---------------------------------------------------------------+
| You must change the database line in the ``config.json`` | - System Config path: **Environment > Web Server**            |
| file, and then reload configuration to fail over         | - ``config.json`` setting: N/A                                |
| without taking the server down.                          | - Environment variable: N/A                                   |
|                                                          |                                                               |
| Select the **Reload configuration from disk** button     |                                                               |
| in the System Console after changing your database       |                                                               | 
| configuration. Then, go to **Environment > Database**    |                                                               |
| and select **Recycle Database Connections** to           |                                                               |
| complete the reload.                                     |                                                               |
+----------------------------------------------------------+---------------------------------------------------------------+

Purge all caches
~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+----------------------------------------------------------+---------------------------------------------------------------+
| Purge all in-memory caches for sessions, accounts,       | - System Config path: **Environment > Web Server**            |
| and channels.                                            | - ``config.json`` setting: N/A                                |
|                                                          | - Environment variable: N/A                                   |
| Select the **Purge All Caches** button in the System     |                                                               |
| Console to purge all caches.                             |                                                               |
+----------------------------------------------------------+---------------------------------------------------------------+
| **Note**: Purging the caches may adversely impact performance. Deployments using `high availability clusters             |
| <https://docs.mattermost.com/scale/high-availability-cluster.html>`__ will attempt to purge all the servers in the       |
| cluster.                                                                                                                 |
+----------------------------------------------------------+---------------------------------------------------------------+

Websocket URL
~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+--------------------------------------------------------+---------------------------------------------------------------------+
| You can configure the server to instruct clients       | - System Config path: N/A                                           |
| on where they should try to connect websockets to.     | - ``config.json`` setting: ``".ServiceSettings.WebsocketURL: "",``  |
|                                                        | - Environment variable: ``MM_SERVICESETTINGS_WEBSOCKETURL``         |
| String input.                                          |                                                                     |
+--------------------------------------------------------+---------------------------------------------------------------------+

License file location
~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-pro-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+--------------------------------------------------------+----------------------------------------------------------------------------+
| The path and filename of the license file on disk.     | - System Config path: N/A                                                  |
| On startup, if Mattermost can't find a valid license   | - ``config.json`` setting: ``".ServiceSettings.LicenseFileLocation: "",``  | 
| in the database from a previous upload, it looks in    | - Environment variable: ``MM_SERVICESETTINGS_LICENSEFILELOCATION``         |
| this path for the license file.                        |                                                                            |
|                                                        |                                                                            |
| String input. Can be an absolute path or a path        |                                                                            |
| relative to the ``mattermost`` directory.              |                                                                            |      
+--------------------------------------------------------+----------------------------------------------------------------------------+

TLS minimum version
~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+--------------------------------------------------------+---------------------------------------------------------------------+
| The minimum TLS version used by the Mattermost server. | - System Config path: N/A                                           |
| on where they should try to connect websockets to.     | - ``config.json`` setting: ``".ServiceSettings.TLSMinVer: 1.2",``   |
|                                                        | - Environment variable: ``MM_SERVICESETTINGS_TLSMINVER``            |
| String input. Default is **1.2**.                      |                                                                     |
+--------------------------------------------------------+---------------------------------------------------------------------+
| **Note**: This setting only takes effect if you are using the built-in server binary directly, and not using a reverse proxy |
| layer, such as NGINX.                                                                                                        |
+--------------------------------------------------------+---------------------------------------------------------------------+

Trusted proxy IP header
~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+--------------------------------------------------------+------------------------------------------------------------------------------+
| Specified headers that will be checked, one by one,    | - System Config path: N/A                                                    |
| for IP addresses (order is important).                 | - ``config.json`` setting: ``".ServiceSettings.TrustedProxyIPHeader: []",``  | 
| All other headers are ignored.                         | - Environment variable: ``MM_SERVICESETTINGS_TRUSTEDPROXYIPHEADER``          | 
|                                                        |                                                                              | 
| String array input consisting of header names,         |                                                                              |
| such as ``["X-Forwarded-For", "X-Real-Ip"]``.          |                                                                              |
+--------------------------------------------------------+------------------------------------------------------------------------------+
| **Notes**:                                                                                                                            |
|                                                                                                                                       |
| - From Mattermost v5.12, new deployments set this value to ``[]``, meaning that no header will be trusted. Prior to v5.12, the        |
|   absence of this configuration setting entry will have it set to ``["X-Forwarded-For", "X-Real-Ip"]`` on upgrade to maintain         |
|   backwards compatibility.                                                                                                            |
| - We recommend keeping the default setting when Mattermost is running without a proxy to avoid the client sending the headers and     |
|   bypassing rate limiting and/or the audit log.                                                                                       |
| - For environments that use a reverse proxy, this issue does not exist, provided that the headers are set by the reverse proxy.       |
|   In those environments, only explicitly whitelist the header set by the reverse proxy and no additional values.                      |
+--------------------------------------------------------+------------------------------------------------------------------------------+

Enable Strict Transport Security (HSTS)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+--------------------------------------------------------+-------------------------------------------------------------------------------+
| - **true**: Adds the Strict Transport Security (HSTS)  | - System Config path: N/A                                                     |
|   header to all responses, forcing the browser to      | - ``config.json`` setting: ``".ServiceSettings.TLSStrictTransport: false",``  | 
|   request all resources via HTTPS.                     | - Environment variable: ``MM_SERVICESETTINGS_TLSSTRICTTRANSPORT``             |
| - **false**: **(Default)** No restrictions on TLS      |                                                                               |
|   transport. Strict Transport Security (HSTS) header   |                                                                               |
|   isn't added to responses.                            |                                                                               |
+--------------------------------------------------------+-------------------------------------------------------------------------------+
| See the `Strict-Transport-Security <https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security>`__            |
| documentation for details.                                                                                                             |
+--------------------------------------------------------+-------------------------------------------------------------------------------+

Secure TLS transport expiry
~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+--------------------------------------------------------+----------------------------------------------------------------------------------------+
| The time, in seconds, that the browser remembers a     | - System Config path: N/A                                                              |
| site is only to be accessed using HTTPS. After this    | - ``config.json`` setting: ``".ServiceSettings.TLSStrictTransportMaxAge: 63072000",``  | 
| period, a site can't be accessed using HTTP unless     | - Environment variable: ``MM_SERVICESETTINGS_TLSSTRICTTRANSPORTMAXAGE``                |
| ``TLSStrictTransport`` is set to ``true``.             |                                                                                        |
|                                                        |                                                                                        |
| Numerical input. Default is **63072000** (2 years).    |                                                                                        |
+--------------------------------------------------------+----------------------------------------------------------------------------------------+
| See the `Strict-Transport-Security <https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security>`__                     |
| documentation for details.                                                                                                                      |
+--------------------------------------------------------+----------------------------------------------------------------------------------------+

TLS cipher overwrites
~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+--------------------------------------------------------+-----------------------------------------------------------------------------+
| Set TLS ciphers overwrites to meet requirements from   | - System Config path: N/A                                                   |
| legacy clients which don't support modern ciphers,     | - ``config.json`` setting: ``".ServiceSettings.TLSOverwriteCiphers: []",``  | 
| or to limit the types of accepted ciphers.             | - Environment variable: ``MM_SERVICESETTINGS_TLSOVERWRITECIPHERS``          |
|                                                        |                                                                             |
| If none specified, the Mattermost server assumes a     |                                                                             |
| set of currently considered secure ciphers, and allows |                                                                             |
| overwrites in the edge case.                           |                                                                             |
|                                                        |                                                                             |
| String array input.                                    |                                                                             |
+--------------------------------------------------------+-----------------------------------------------------------------------------+
| **Notes**:                                                                                                                           |
|                                                                                                                                      |  
| - This setting only takes effect if you are using the built-in server binary directly, and not using a reverse proxy layer, such     |
|   as NGINX.                                                                                                                          |
| - See the ``ServerTLSSupportedCiphers`` variable in `/model/config.go                                                                |
|   <https://github.com/mattermost/mattermost-server/blob/master/model/config.go>`__ for a list of ciphers considered secure.          |
+--------------------------------------------------------+-----------------------------------------------------------------------------+

Goroutine health threshold
~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+--------------------------------------------------------+----------------------------------------------------------------------------------+
| Set a threshold on the number of goroutines when the   | - System Config path: N/A                                                        |
| Mattermost system is considered to be in a healthy     | - ``config.json`` setting: ``".ServiceSettings.GoroutineHealthThreshold: -1",``  | 
| state.                                                 | - Environment variable: ``MM_SERVICESETTINGS_GOROUTINEHEALTHTHREADHSOLD``        |
|                                                        |                                                                                  |
| When goroutines exceed this limit, a warning is        |                                                                                  |
| returned in the server logs.                           |                                                                                  |
|                                                        |                                                                                  |
| Numeric input. Default is **-1** which turns off       |                                                                                  |
| checking for the threshold.                            |                                                                                  |
+--------------------------------------------------------+----------------------------------------------------------------------------------+

Allow cookies for subdomains
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+--------------------------------------------------------+-------------------------------------------------------------------------------------+
| - **true**: **(Default)** Allows cookies for           | - System Config path: N/A                                                           |
|   subdomains by setting the domain parameter on        | - ``config.json`` setting: ``".ServiceSettings.AllowCookiesForSubdomains: true",``  | 
|   Mattermost cookies.                                  | - Environment variable: ``MM_SERVICESETTINGS_ALLOWCOOKIESFORSUBDOMAINS``            | 
| - **false**: Cookies not allowed for subdomains.       |                                                                                     | 
+--------------------------------------------------------+-------------------------------------------------------------------------------------+

Cluster log timeout
~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

+--------------------------------------------------------+-----------------------------------------------------------------------------------------+
| Define the frequency, in milliseconds, of cluster      | - System Config path: N/A                                                               |
| request time logging for performance monitoring.       | - ``config.json`` setting: ``".ServiceSettings.ClusterLogTimeoutMilliseconds: 2000",``  | 
| for performance monitoring                             | - Environment variable: ``MM_SERVICESETTINGS_CLUSTERLOGTIMEOUTMILLISECONDS``            |
|                                                        |                                                                                         |
| Numerical input. Default is **2000** milliseconds      |                                                                                         |
| (2 seconds).                                           |                                                                                         |        
+--------------------------------------------------------+-----------------------------------------------------------------------------------------+
| See the `performance monitoring <https://docs.mattermost.com/scale/performance-monitoring.html>`__ documentation for details.                    |
+--------------------------------------------------------+-----------------------------------------------------------------------------------------+

source/configure/using-outbound-proxy.rst METASEP
..  _outbound_proxy:

Using an outbound proxy
=======================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

In some scenarios, you may wish to use Mattermost behind a proxy. This can be used to do things such as monitoring outbound traffic from Mattermost or controlling which websites can appear in link previews and other embedded content. If you only want to use a proxy for images, the `image proxy <https://docs.mattermost.com/deploy/image-proxy.html>`__ is also an option.

Configuration
-------------

Mattermost's use of a proxy is configured using the ``HTTP_PROXY``, ``HTTPS_PROXY`` and ``NO_PROXY`` environment variables.

``HTTP_PROXY`` and ``HTTPS_PROXY``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The ``HTTP_PROXY`` and ``HTTPS_PROXY`` environment variables store the address of the proxy server for HTTP and HTTPS requests, respectively. This value should include the protocol and port of the proxy, such as ``http://192.168.4.5:3128``.

If you wish to have Mattermost authenticate with your proxy, it supports HTTP basic authentication by specifying the address of the proxy such as ``http://mattermost:password@192.168.4.5:3128``.

Note that when proxying through a proxy that uses the ``HTTPS`` protocol, you'll need to configure your Mattermost server with the root certificate of the proxy. Otherwise, Mattermost will refuse any response from the proxy as it will detect that its connection has been intercepted.

``NO_PROXY``
~~~~~~~~~~~~

The ``NO_PROXY`` environment variable can be set to prevent certain requests from going through the proxy, such as to an SSO provider (e.g. GitLab or SAML) or intranet sites that should be accessible in link previews. It can be configured as a set of comma-separated IP addresses (e.g. ``1.2.3.4``), IP address ranges specified in CIDR notation (e.g. ``1.2.3.4/8``), or domain names. An IP address or domain name can also include a port number.

When a domain name is specified, the domain and all of its subdomains are matched, however a domain name with a leading ``.`` only matches the subdomains. For example, ``example.com`` matches both ``example.com`` and ``sub.example.com`` while ``.example.com`` only matches the latter.

Sample configuration
--------------------

To set these environment variables while running the Mattermost server via ``systemd``, modify the ``mattermost.service`` like this:

  .. note::
    Be sure to replace ``127.0.0.1:3128`` with the correct values for your proxy servers.

  .. code-block:: none

    [Unit]
    Description=Mattermost
    After=network.target
    After=postgresql.service
    BindsTo=postgresql.service

    [Service]
    Type=notify
    ExecStart=/opt/mattermost/bin/mattermost
    TimeoutStartSec=3600
    KillMode=mixed
    Restart=always
    RestartSec=10
    WorkingDirectory=/opt/mattermost
    User=mattermost
    Group=mattermost
    LimitNOFILE=49152
    Environment=HTTP_PROXY=http://mattermost:password@127.0.0.1:3128
    Environment=HTTPS_PROXY=https://mattermost:password@127.0.0.1:3128
    Environment=NO_PROXY=1.2.3.4:567,.internal.example.com,login.example.com

    [Install]
    WantedBy=postgresql.service
    
For GitLab Mattermost follow the details at https://docs.gitlab.com/ee/integration/mattermost/ instead.

source/configure/user-management-configuration-settings.rst METASEP
User management configuration settings
======================================

Manage your Mattermost users including their access permissions, groups, teams, channels, as well as their access to the System Console. Configure this feature by going to **System Console > User Management**.

The following user management configuration settings are available:

- `Users <#users>`__
- `Groups <#groups>`__
- `Teams <#teams>`__
- `Channels <#channels>`__
- `Permissions <#permissions>`__
- `System roles <#system-roles>`__

Users
-----

*Available in legacy Enterprise Edition E10/E20*

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

+---------------------------------------------------------------+-------------------------------------------------------------+
| View statistics on active users, teams, channels,             | - System Config path: **User Management > Users**           |
| sessions, webhooks, and connections.                          | - ``config.json setting``: N/A                              |
|                                                               | - Environment variable: N/A                                 |
+---------------------------------------------------------------+-------------------------------------------------------------+

Groups
------

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

+---------------------------------------------------------------+-------------------------------------------------------------+
| View statistics on active users, teams, channels,             | - System Config path: **User Management > Groups**          |
| sessions, webhooks, and connections.                          | - ``config.json setting``: N/A                              |
|                                                               | - Environment variable: N/A                                 |
+---------------------------------------------------------------+-------------------------------------------------------------+

Teams
-----

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

+---------------------------------------------------------------+-------------------------------------------------------------+
| View statistics on active users, teams, channels,             | - System Config path: **User Management > Teams**           |
| sessions, webhooks, and connections.                          | - ``config.json setting``: N/A                              |
|                                                               | - Environment variable: N/A                                 |
+---------------------------------------------------------------+-------------------------------------------------------------+

Channels
--------

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

+-------------------------------------------------------------------------+-------------------------------------------------------------+
| Manage active and inactive users, revoke all user sessions,             | - System Config path: **User Management > Channels**        |
| access individual users to view their User ID, add users to other       | - ``config.json setting``: N/A                              |
| teams, and view the teams they are on and what their role is on a team. | - Environment variable: N/A                                 |
+-------------------------------------------------------------------------+-------------------------------------------------------------+
| **Note**: You can search for channels by channel name or by channel ID.                                                               |
+-------------------------------------------------------------------------+-------------------------------------------------------------+

Permissions
-----------

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------------+-------------------------------------------------------------+
| Manage default teams and channels by linking AD/LDAP groups         | - System Config path: **User Management > Permissions**     |
| to Mattermost groups.                                               | - ``config.json setting``: N/A                              |
|                                                                     | - Environment variable: N/A                                 |
+---------------------------------------------------------------------+-------------------------------------------------------------+
| See `AD/LDAP groups documentation <https://docs.mattermost.com/onboard/ad-ldap-groups-synchronization.html>`__ documentation      |
| for more details.                                                                                                                 |
+---------------------------------------------------------------------+-------------------------------------------------------------+

System roles
------------

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+----------------------------------------------------------------------+------------------------------------------------------------+
| Manage team settings, including group synchronization for teams.     | - System Config path: **User Management > System Roles**   |
|                                                                      | - ``config.json setting``: N/A                             |
|                                                                      | - Environment variable: N/A                                |
+----------------------------------------------------------------------+------------------------------------------------------------+
| See `AD/LDAP groups documentation <https://docs.mattermost.com/onboard/ad-ldap-groups-synchronization.html>`__ documentation      |
| for more details.                                                                                                                 |
+----------------------------------------------------------------------+------------------------------------------------------------+
source/configure/smtp-email.rst METASEP
..  _smtp-email-setup:

SMTP email setup
================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

To run in production, Mattermost requires SMTP email to be enabled for email notifications and password reset for systems using email-based authentication.

How to enable email
-------------------

To enable email, configure an SMTP email service as follows:

1. **Set up an SMTP email sending service** (if you don't yet have an SMTP service with credentials)

    * Any SMTP email service can be used, you just need the following
      information: ``Server Name``, ``Port``, ``SMTP Username``, and
      ``SMTP Password``.

    * If you don't have an SMTP service you can set one up with:

        - `Amazon Simple Email Service (SES) <https://aws.amazon.com/ses/>`_:

            1. Go to `Amazon SES console <https://console.aws.amazon.com/ses>`__ then
                ``SMTP Settings > Create My SMTP Credentials``
            2. Copy the ``Server Name``, ``Port``, ``SMTP Username``, and
                ``SMTP Password`` for Step 2 below.
            3. From the ``Domains`` menu set up and verify a new domain,
                then enable ``Generate DKIM Settings`` for the domain.

                1. We recommend you set up `Sender Policy
                Framework <https://en.wikipedia.org/wiki/Sender_Policy_Framework>`__
                (SPF) and/or `Domain Keys Identified
                Mail <https://en.wikipedia.org/wiki/DomainKeys_Identified_Mail>`__
                (DKIM) for your email domain.

            4. Choose a sender address like ``mattermost@example.com`` and
                select ``Send a Test Email`` to verify setup is working
                correctly.
	    
        - By local ``sendmail`` can be used by using **Server Name** ``127.0.0.1`` with **Port** ``25``
	- Or by using one of the services listed below in the **Sample SMTP Settings**

2. **Configure SMTP settings**

   1. Go to **Product menu > System Console**.

      * Alternatively, if a team doesn't yet exist navigate to your ``serverURL`` and select **Go To System Console**.

   2. Go to the **Authentication > Email** tab and configure the following:

      1. **Allow Sign Up With Email:** ``true``
      
   3. Go to the **Notifications > Email** tab and configure the following:
   
      1.  **Send Email Notifications:** ``true``
      2.  **Notification Display Name:** Display name on email account
          sending notifications
      3.  **Notification Email Address:** Email address displayed on
          email account used to send notifications
      4.  **SMTP Username**: ``SMTP Username`` from Step 1
      5.  **SMTP Password**: ``SMTP Password`` from Step 1
      6.  **SMTP Server**: ``SMTP Server`` from Step 1
      7.  **SMTP Port**: ``SMTP Port`` from Step 1
      8. **Connection Security**: ``TLS (Recommended)``
      9. Then select **Save**
      10. Then select **Test Connection**
      11. If the test failed please look in **OTHER > Logs** for any errors that look like ``[ERROR] /api/v4/email/test ...``

   4. (Optional) Go to the **Security > Sign Up** tab and configure the following:

      1.  **Enable Email Invitations:** ``true``

Sample SMTP settings
--------------------

Amazon SES
~~~~~~~~~~

-  Set **SMTP Username** to **[YOUR_SMTP_USERNAME]**
-  Set **SMTP Password** to **[YOUR_SMTP_PASSWORD]**
-  Set **SMTP Server** to **email-smtp.us-east-1.amazonaws.com**
-  Set **SMTP Port** to **465**
-  Set **Connection Security** to **TLS**

Postfix
~~~~~~~

-  Make sure Postfix is installed on the machine where Mattermost is
   installed
-  Set **SMTP Username** to **(empty)**
-  Set **SMTP Password** to **(empty)**
-  Set **SMTP Server** to **localhost**
-  Set **SMTP Port** to **25**
-  Set **Connection Security** to **(empty)**

Gmail
~~~~~

-  Set **SMTP Username** to **your\_email@gmail.com**
-  Set **SMTP Password** to **your\_password**
-  Set **SMTP Server** to **smtp.gmail.com**
-  Set **SMTP Port** to **587**
-  Set **Connection Security** to **STARTTLS**

.. warning::

  Additional configuration is required in Google to allow SMTP email to relay through their servers. See `SMTP relay: Route outgoing non-Gmail messages through Google <https://support.google.com/a/answer/2956491?hl=en>`_ for the required steps.

Hotmail
~~~~~~~

-  Set **SMTP Username** to **your\_email@hotmail.com**
-  Set **SMTP Password** to **your\_password**
-  Set **SMTP Server** to **smtp-mail.outlook.com**
-  Set **SMTP Port** to **587**
-  Set **Connection Security** to **STARTTLS**

Office365/Outlook	
~~~~~~~~~~~~~~~~~~~
	
- Set **SMTP Username** to **your\_email@hotmail.com**	
- Set **SMTP Password** to **your\_password**	
- Set **SMTP Server Name** to **smtp.office365.com**	
- Set **SMTP Port** to **587**	
- Set **Connection Security** to **STARTTLS**

Troubleshooting SMTP
--------------------

TLS/STARTTLS requirements 
~~~~~~~~~~~~~~~~~~~~~~~~~

If you fill in **SMTP Username** and **SMTP Password** then you must set **Connection Security** to **TLS** or to **STARTTLS**

Troubleshooting using Logs
~~~~~~~~~~~~~~~~~~~~~~~~~~

If you have issues with your SMTP install, from your Mattermost team site go to **System Console > Logs** to look for error messages related to your setup. You can do a search for the error code to narrow down the issue. Sometimes ISPs require nuanced setups for SMTP and error codes can hint at how to make the proper adjustments.

For example, if **System Console > Logs** has an error code reading:

::

    Connection unsuccessful: Failed to add to email address - 554 5.7.1 <unknown[IP-ADDRESS]>: Client host rejected: Access denied

Search for ``554 5.7.1 error`` and ``Client host rejected: Access denied``.

Checking your SMTP server is reachable 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

-  Attempt to Telnet to the email service to make sure the server is reachable. For additional information, visit https://docs.microsoft.com/en-us/exchange/mail-flow/test-smtp-with-telnet?view=exchserver-2019. If you're using an earlier version than Exchange Server 2019, select your version from the left-hand navigation menu.
-  You must run the following commands from the same machine or virtual instance where ``mattermost/bin/mattermost`` is located.
-  Telnet to the email server with ``telnet mail.example.com 25``. If the command works you should see something like:

   ::

       Trying 24.121.12.143...
       Connected to mail.example.com.
       220 mail.example.com NO UCE ESMTP

-  Then type something like ``HELO <your mail server domain>``. If the command works you should see something like:

   ::

       250-mail.example.com NO UCE
       250-STARTTLS
       250-PIPELINING
       250 8BITMIME
       
.. note:: 
   
   - As we're not installing telnet by default on the official docker images, you either need to use ``ping`` on those or install telnet yourself either directly or by modifying the Dockerfile.
   - For further assistance, review the `Troubleshooting forum <https://forum.mattermost.com/c/trouble-shoot>`__ for previously reported errors, or `join the Mattermost user community for troubleshooting help <https://mattermost.com/ask-mattermost-community>`__. To submit an improvement or correction to this page, select **Edit** in the top-right corner of the page.

source/configure/smtp-configuration-settings.rst METASEP
:orphan:
:nosearch:

Configure SMTP email server settings by going to **System Console > Environment > SMTP**, or by editing the ``config.json`` file as described in the following tables. 

SMTP server
~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+-----------------------------------------------------------------+---------------------------------------------------------------+
| The location of the SMTP email server used for email            | - System Config path: **Environment > SMTP**                  |
| notifications.                                                  | - ``config.json setting``: ``".EmailSettings.SMTPServer",``   |
|                                                                 | - Environment variable: ``MM_EMAILSETTINGS_SMTPSERVER``       |
+-----------------------------------------------------------------+---------------------------------------------------------------+

SMTP server port
~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+-----------------------------------------------------------------+---------------------------------------------------------------+
| The port of SMTP email server.                                  | - System Config path: **Environment > SMTP**                  |
|                                                                 | - ``config.json setting``: ``".EmailSettings.SMTPPort",``     |
| Numerical input.                                                | - Environment variable: ``MM_EMAILSETTINGS_SMTPPORT``         |
+-----------------------------------------------------------------+---------------------------------------------------------------+

Enable SMTP authentication
~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+-----------------------------------------------------------------+---------------------------------------------------------------------------+
| Enable or disable SMTP authentication.                          | - System Config path: **Environment > SMTP**                              |
|                                                                 | - ``config.json setting``: ``".EmailSettings.EnableSMTPAuth": false",``   |
| - **true**: SMTP username and password are used for             | - Environment variable: ``MM_EMAILSETTINGS_ENABLESMTPAUTH``               |
|   authenticating to the SMTP server.                            |                                                                           |
| - **false**: **(Default)** Mattermost doesn’t attempt to        |                                                                           |
|   authenticate to the SMTP server.                              |                                                                           |
+-----------------------------------------------------------------+---------------------------------------------------------------------------+

SMTP server username
~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+-----------------------------------------------------------------+---------------------------------------------------------------+
| The username for authenticating to the SMTP server.             | - System Config path: **Environment > SMTP**                  |
|                                                                 | - ``config.json setting``: ``".EmailSettings.SMTPUsername",`` |
| String input.                                                   | - Environment variable: ``MM_EMAILSETTINGS_SMTPUSERNAME``     |
+-----------------------------------------------------------------+---------------------------------------------------------------+

SMTP server password
~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+-----------------------------------------------------------------+---------------------------------------------------------------+
| The password associated with the SMTP username.                 | - System Config path: **Environment > SMTP**                  |
|                                                                 | - ``config.json setting``: ``".EmailSettings.SMTPPassword",`` |
| String input.                                                   | - Environment variable: ``MM_EMAILSETTINGS_SMTPPASSWORD``     |
+-----------------------------------------------------------------+---------------------------------------------------------------+

SMTP connection security
~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+-----------------------------------------------------------------+-----------------------------------------------------------------------+
| Specify connection security for emails sent using SMTP.         | - System Config path: **Environment > SMTP**                          |
|                                                                 | - ``config.json setting``: ``".EmailSettings.ConnectionSecurity",``   |
| - **Not specified**: **(Default)** Send email over an           | - Environment variable: ``MM_EMAILSETTINGS_CONNECTIONSECURITY``       |
|   unsecure connection.                                          |                                                                       |
| - **TLS**: Communication between Mattermost and your email      |                                                                       |
|   server is encrypted.                                          |                                                                       |
| - **STARTTLS**: Attempts to upgrade an existing insecure        |                                                                       |
|   connection to a secure connection using TLS.                  |                                                                       | 
+-----------------------------------------------------------------+-----------------------------------------------------------------------+

Skip server certificate verification
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+-----------------------------------------------------------------------+----------------------------------------------------------------------------------------------+
| Configure Mattermost to skip the verification of the email server     | - System Config path: **Environment > SMTP**                                                 |
| certificate.                                                          | - ``config.json setting``: ``".EmailSettings.SkipServerCertificateVerification": false",``   | 
|                                                                       | - Environment variable: ``MM_EMAILSETTINGS_SKIPSERVERCERTIFICATEVERIFICATION``               |
| - **true**: Mattermost won't verify the email server certificate.     |                                                                                              |
| - **false**: **(Default)** Mattermost verifies the email              |                                                                                              |
|   server certificate.                                                 |                                                                                              |
+-----------------------------------------------------------------------+----------------------------------------------------------------------------------------------+

Enable security alerts
~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+-----------------------------------------------------------------+----------------------------------------------------------------------------------+
| Enable or disable security alerts.                              | - System Config path: **Environment > SMTP**                                     |
|                                                                 | - ``config.json setting``: ``".EmailSettings.EnableSecurityFixAlert": true",``   |
| - **true**: **(Default)** System Admins are notified by email   | - Environment variable: ``MM_EMAILSETTINGS_ENABLESECURITYFIXALERT``              |
|   if a relevant security fix alert is announced. Requires email |                                                                                  |
|   to be enabled.                                                |                                                                                  |
| - **false**: Security alerts are disabled.                      |                                                                                  |
+-----------------------------------------------------------------+----------------------------------------------------------------------------------+
| See the `Telemetry <https://docs.mattermost.com/manage/telemetry.html#security-update-check-feature>`__ documentation to learn more.               |
+-----------------------------------------------------------------+----------------------------------------------------------------------------------+

SMTP server timeout
~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+-----------------------------------------------------------------+----------------------------------------------------------------------+
| The maximum amount of time, in seconds, allowed for             | - System Config path: **Environment > SMTP**                         |
| establishing a TCP connection between Mattermost and the SMTP   | - ``config.json setting``: ``".EmailSettings.SMTPServerTimeout",``   |
| server to be idle before being terminated.                      | - Environment variable: ``MM_EMAILSETTINGS_SMTPSERVERTIMEOUT``       |
|                                                                 |                                                                      |
| Numerical value in seconds.                                     |                                                                      |
+-----------------------------------------------------------------+----------------------------------------------------------------------+
source/configure/session-lengths-configuration-settings.rst METASEP
:orphan:
:nosearch:

User sessions are cleared when a user tries to log in, and sessions are cleared every 24 hours from the sessions database table. Configure session lengths by going to **System Console > Environment > Session Lengths**, or by editing the ``config.json`` file as described in the following tables. Changes to configuration settings in this section require a server restart before taking effect.

Extend session length with activity
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+----------------------------------------------------------------+-----------------------------------------------------------------------------------------+
| Improves the user experience by extending sessions and keeping | - System Config path: **Environment > Session Lengths**                                 |
| users logged in if they are active in their Mattermost apps.   | - ``config.json`` setting: ``".ServiceSettings.ExtendSessionLengthWithActivity: true,`` | 
|                                                                | - Environment variable: ``MM_SERVICESETTINGS_EXTENDSESSONLENGTHWITHACTIVITY``           |
| - **true**: **(Default)** Sessions are automatically           |                                                                                         |
|   extended when users are active in their Mattermost           |                                                                                         |
|   client. User sessions only expire when users aren’t active   |                                                                                         |
|   in their Mattermost client for the entire duration of the    |                                                                                         |
|   session lengths defined.                                     |                                                                                         |
| - **false**: Sessions won't extend with activity in            |                                                                                         |
|   Mattermost. User sessions immediately expire at the          |                                                                                         |
|   end of the session length or based on the                    |                                                                                         |
|   `session idle timeout <#session-idle-timeout>`__ configured. |                                                                                         |
+----------------------------------------------------------------+-----------------------------------------------------------------------------------------+

Session length for AD/LDAP and email
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+----------------------------------------------------------------+--------------------------------------------------------------------------------+
| Set the number of hours counted from the last time a user      | - System Config path: **Environment > Session Lengths**                        |
| entered their credentials into the web app or the desktop      | - ``config.json`` setting: ``".ServiceSettings.SessionLengthWebInHours: 720,`` |
| app to the expiry of the user’s session on email and AD/LDAP   | - Environment variable: ``MM_SERVICESETTINGS_SESSONLENGTHWEBINHOURS``          |
| authentication.                                                |                                                                                |
|                                                                |                                                                                |
| Numerical input in hours. Default is **720** hours.            |                                                                                |
+----------------------------------------------------------------+--------------------------------------------------------------------------------+
| **Note**: After changing this setting, the new session length takes effect after the next time the user enters their credentials.               |
+----------------------------------------------------------------+--------------------------------------------------------------------------------+

Session length for mobile
~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+----------------------------------------------------------------+-----------------------------------------------------------------------------------+
| Set the number of hours counted from the last time a user      | - System Config path: **Environment > Session Lengths**                           |
| entered their credential into the mobile app to the expiry     | - ``config.json`` setting: ``".ServiceSettings.SessionLengthMobileInHours: 720,`` |
| of the user’s session.                                         | - Environment variable: ``MM_SERVICESETTINGS_SESSONLENGTHMOBILEINHOURS``          |
|                                                                |                                                                                   |
| Numerical input in hours. Default is **720** hours.            |                                                                                   |
+----------------------------------------------------------------+-----------------------------------------------------------------------------------+
| **Note**: After changing this setting, the new session length takes effect after the next time the user enters their credentials.                  |
+----------------------------------------------------------------+-----------------------------------------------------------------------------------+

Session length for SSO
~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+----------------------------------------------------------------+----------------------------------------------------------------------------------+
| Set the number of hours from the last time a user entered      | - System Config path: **Environment > Session Lengths**                          |
| their SSO credentials to the expiry of the user’s session.     | - ``config.json`` setting: ``".ServiceSettings.SessionLengthSSOInHours: 720,``   |
| This setting defines the session length for SSO                | - Environment variable: ``MM_SERVICESETTINGS_SESSONLENGTHSSOINHOURS``            |
| authentication, such as SAML, GitLab, and OAuth 2.0.           |                                                                                  |
|                                                                |                                                                                  |
| Numerical input in hours. Default is **720** hours.            |                                                                                  |
| Numbers as decimals are also valid values for this             |                                                                                  |
| configuration setting.                                         |                                                                                  |
+----------------------------------------------------------------+----------------------------------------------------------------------------------+
| **Notes**:                                                                                                                                        |
|                                                                                                                                                   |
| - After changing this setting, the new session length takes effect after the next time the user enters their credentials.                         |
| - If the authentication method is SAML, GitLab, or OAuth 2.0, users may automatically be logged back in to Mattermost if they are already logged  |
|   in to SAML, GitLab, or with OAuth 2.0.                                                                                                          |
+----------------------------------------------------------------+----------------------------------------------------------------------------------+

Session cache
~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+----------------------------------------------------------------+-----------------------------------------------------------------------------+
| Set the number of minutes to cache a session in memory.        | - System Config path: **Environment > Session Lengths**                     |
|                                                                | - ``config.json`` setting: ``".ServiceSettings.SessionCacheInMinutes: 10,`` |
| Numerical input in minutes. Default is **10** minutes.         | - Environment variable: ``MM_SERVICESETTINGS_SESSONCACHEINMINUTES``         |
+----------------------------------------------------------------+-----------------------------------------------------------------------------+

Session idle timeout
~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+----------------------------------------------------------------+--------------------------------------------------------------------------------------+
| The number of minutes from the last time a user was active     | - System Config path: N/A                                                            |
| on the system to the expiry of the user’s session.             | - ``config.json`` setting: ``".ServiceSettings.SessionIdleTimeoutInMinutes: 43200,`` |
| Once expired, the user will need to log in to continue.        | - Environment variable: ``MM_SERVICESETTINGS_SESSONIDLETIMEOUTINMINUTES``            |
|                                                                |                                                                                      |
| Numerical input in minutes. Default is **43200** (30 days).    |                                                                                      |
| Minimum value is **5** minutes, and a value of **0** sets      |                                                                                      |
| the time as unlimited.                                         |                                                                                      |
+----------------------------------------------------------------+--------------------------------------------------------------------------------------+
| **Notes**:                                                                                                                                            |
|                                                                                                                                                       |
| - This setting has no effect when `extend session length with activity <#extend-session-length-with-activity>`__ is set to **true**.                  |
| - This setting applies to the webapp and the desktop app. For mobile apps, use an                                                                     |
|   `EMM provider <https://docs.mattermost.com/deploy/deploy-mobile-apps-using-emm-provider.html>`__ to lock the app when not in use.                   |
| - In `high availability mode <https://docs.mattermost.com/scale/high-availability-cluster.html>`__, enable IP hash load balancing for reliable        |
|   timeout measurement.                                                                                                                                |
+----------------------------------------------------------------+--------------------------------------------------------------------------------------+
source/configure/self-hosted-account-settings.rst METASEP
Self-hosted account settings
============================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Go to **System Console > About** to manage the following aspects of your self-hosted workspace:

- View the `edition <https://docs.mattermost.com/about/editions-and-offerings.html>`__ of your Mattermost self-hosted deployment.
- Manage your `product subscription <https://docs.mattermost.com/about/self-hosted-subscriptions.html>`__.
- `Upload a new license <https://docs.mattermost.com/upgrade/installing-license-key.html>`__.
- Remove a license to `downgrade the server <https://docs.mattermost.com/upgrade/downgrading-mattermost-server.html>`__.
- Contact the Mattermost Sales team for assistance.
source/configure/reporting-configuration-settings.rst METASEP
Reporting configuration settings
================================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

View statistics for your overall deployment and specific teams as well as access server logs by going to **System Console > Reporting**. 

The following reporting configuration settings are available:

- `Site statistics <#site-statistics>`__
- `Team statistics <#team-statistics>`__
- `Server logs <#server-logs>`__

Site statistics
---------------

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+-------------------------------------------------------------+
| View statistics on active users, teams, channels,             | - System Config path: **Reporting > Site Statistics**       |
| sessions, webhooks, and connections.                          | - ``config.json setting``: N/A                              |
|                                                               | - Environment variable: N/A                                 |
+---------------------------------------------------------------+-------------------------------------------------------------+

Team statistics
---------------

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+---------------------------------------------------------------+
| View statistics per team on number of active users,           | - System Config path: **Reporting > Team Statistics**         |
| as well as Public and Private channels.                       | - ``config.json`` setting: N/A                                |
|                                                               | - Environment variable: N/A                                   |
+---------------------------------------------------------------+---------------------------------------------------------------+

Server logs
-----------

.. include:: ../_static/badges/selfhosted-only.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+---------------------------------------------------------------+
| View logging of server-side events.                           | - System Config path: **Reporting > Server Logs**             |
|                                                               | - ``config.json`` setting: N/A                                |
|                                                               | - Environment variable: N/A                                   |
+---------------------------------------------------------------+---------------------------------------------------------------+
source/configure/rate-limiting-configuration-settings.rst METASEP
:orphan:
:nosearch:

Rate limiting prevents your Mattermost server from being overloaded with too many requests, and decreases the risk and impact of third-party applications or malicious attacks on your server. Configure rate limiting settings by going to **System Console > Environment > Rate Limiting**, or by editing the ``config.json`` file as described in the following tables. Changes to configuration settings in this section require a server restart before taking effect.

Enable rate limiting
~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+----------------------------------------------------------------+--------------------------------------------------------------------------+
| Enable or disable rate limiting to throttle APIs to a          | - System Config path: **Environment > Rate Limiting**                    |
| specified number of requests per second.                       | - ``config.json`` setting: ``".RateLimitSettings.Eanble: false”,``       |
|                                                                | - Environment variable: ``MM_RATELIMITSETTINGS_ENABLE``                  |
| - **true**: APIs are throttled at the rate specified by the    |                                                                          |
|   `Maximum queries per second <#maximum-queries-per-second>`__ |                                                                          |
|   configuration setting.                                       |                                                                          |
| - **false**: **(Default)** API access isn’t throttled.         |                                                                          |
+----------------------------------------------------------------+--------------------------------------------------------------------------+

Maximum queries per second
~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+--------------------------------------------------------------------------+
| Throttle the API at this number of requests per second when   | - System Config path: **Environment > Rate Limiting**                    |
| `rate limiting <#enable-rate-limiting>`__ is enabled.         | - ``config.json`` setting: ``".RateLimitSettings.PerSec: 10,``           |
|                                                               | - Environment variable: ``MM_RATELIMITSETTINGS_PERSEC``                  |
| Numerical input. Default is **10**.                           |                                                                          |
+---------------------------------------------------------------+--------------------------------------------------------------------------+

Maximum burst size
~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+-----------------------------------------------------------------+--------------------------------------------------------------------------+
| The maximum number of requests allowed beyond the per second    | - System Config path: **Environment > Rate Limiting**                    |
| query limit when `rate limiting <#enable-rate-limiting>`__      | - ``config.json`` setting: ``".RateLimitSettings.MaxBurst: 100,``        |
| is enabled.                                                     | - Environment variable: ``MM_RATELIMITSETTINGS_MAXBURST``                | 
|                                                                 |                                                                          |
| Numerical input. Default is **100**.                            |                                                                          |
+-----------------------------------------------------------------+--------------------------------------------------------------------------+

Memory store size
~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+-----------------------------------------------------------------+----------------------------------------------------------------------------+
| The maximum number of user sessions connected to the system as  | - System Config path: **Environment > Rate Limiting**                      |
| determined by vary rate limit settings when                     | - ``config.json`` setting: ``".RateLimitSettings.MemoryStoreSize: 10000,`` |
| `rate limiting <#enable-rate-limiting>`__ is enabled.           | - Environment variable: ``MM_RATELIMITSETTINGS_MEMORYSTORESIZE``           |
|                                                                 |                                                                            |
| Numerical input. Default is **10000**. Typically set to the     |                                                                            |
| number of users in the system.                                  |                                                                            |
+-----------------------------------------------------------------+----------------------------------------------------------------------------+

Vary rate limit by remote address
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+-----------------------------------------------------------------+----------------------------------------------------------------------------+
| Configure Mattermost to rate limit API access by IP address     | - System Config path: **Environment > Rate Limiting**                      |
| when `rate limiting <#enable-rate-limiting>`__ is enabled.      | - ``config.json`` setting: ``".RateLimitSettings.VaryByRemoteAddr: true,`` |
|                                                                 | - Environment variable: ``MM_RATELIMITSETTINGS_VARYBYREMOTEADDR``          |
| - **true**: **(Default)** Rate limit API access by IP address.  |                                                                            |
|   Recommended when using a proxy.                               |                                                                            |
| - **false**: Rate limiting does not vary by IP address.         |                                                                            |
+-----------------------------------------------------------------+----------------------------------------------------------------------------+

Vary rate limit by user
~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+-----------------------------------------------------------------+----------------------------------------------------------------------------+
| Configure Mattermost to rate limit API access by authentication | - System Config path: **Environment > Rate Limiting**                      |
| token or not when `rate limiting <#enable-rate-limiting>`__     | - ``config.json`` setting: ``".RateLimitSettings.VaryByUser: false,``      |
| is enabled.                                                     | - Environment variable: ``MM_RATELIMITSETTINGS_VARYBYUSER``                |   
|                                                                 |                                                                            |
| - **true**: Rate limit API access by user authentication token. |                                                                            |
|   Recommended when using a proxy.                               |                                                                            |
| - **false**: **(Default)** Rate limiting does not vary by user  |                                                                            |
|   authentication token.                                         |                                                                            |
+-----------------------------------------------------------------+----------------------------------------------------------------------------+

Vary rate limit by HTTP header
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+-----------------------------------------------------------------+----------------------------------------------------------------------------+
| Configure Mattermost to vary rate limiting API access           | - System Config path: **Environment > Rate Limiting**                      |
| by the HTTP header field specified. Recommended when you’re     | - ``config.json`` setting: ``".RateLimitSettings.VaryByHeader: "",``       |
| using a proxy.                                                  | - Environment variable: ``MM_RATELIMITSETTINGS_VARYBYHEADER``              |  
|                                                                 |                                                                            |
| - When configuring NGINX, set this to **X-Real-IP**.            |                                                                            | 
| - When configuring AmazonELB, set this to **X-Forwarded-For**.  |                                                                            |
+-----------------------------------------------------------------+----------------------------------------------------------------------------+
source/configure/push-notification-server-configuration-settings.rst METASEP
:orphan:
:nosearch:

Configure Mattermost to enable push notifications to Mattermost clients by going to **System Console > Environment > Push Notification Server**, or by editing the ``config.json`` file as described in the following tables. Changes to configuration settings in this section require a server restart before taking effect.

Enable push notifications
~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+-----------------------------------------------------------------+--------------------------------------------------------------------------------+
| Enable or disable Mattermost push notifications.                | - System Config path: **Environment > Push Notification Server**               |
|                                                                 | - ``config.json setting``: ``".EmailSettings.SendPushNotifications": true",``  |
| - **true**: **(Default)** Your Mattermost server sends mobile   | - Environment variable: ``MM_EMAILSETTINGS_SENDPUSHNOTIFICATIONS``             |
|   push notifications to the server specified.                   |                                                                                |
| - **false**: Mobile push notifications are disabled.            |                                                                                |
+-----------------------------------------------------------------+--------------------------------------------------------------------------------+

Push notification server location
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+-----------------------------------------------------------------+--------------------------------------------------------------------------------+
| The location of Mattermost Push Notification Service (MPNS),    | - System Config path: **Environment > Push Notification Server**               |
| which re-sends push notifications from Mattermost to services   | - ``config.json setting``: ``".EmailSettings.PushNotificationServer",``        |
| like Apple Push Notification Service (APNS) and Google Cloud    | - Environment variable: ``MM_EMAILSETTINGS_PUSHNOTIFICATIONSERVER``            |
| Messaging (GCM).                                                |                                                                                |
|                                                                 |                                                                                |
| - Customers running a Professional or Enterprise Edition        |                                                                                |
|   workspace should enter ``https://push.mattermost.com`` for    |                                                                                |
|   the push notification server hosted in the United States.     |                                                                                |
| - If you prefer to use a push notification server hosted in     |                                                                                |
|   Germany, enter ``https://hpns-de.mattermost.com/``.           |                                                                                |
| - Team Edition customers should enter                           |                                                                                |
|   ``https://push-test.mattermost.com``.                         |                                                                                |
+-----------------------------------------------------------------+--------------------------------------------------------------------------------+
| **Notes**:                                                                                                                                       |
|                                                                                                                                                  |
| - The TPNS is provided for testing push notifications prior to compiling your own service. Ensure you’re familiar with its `limitations          |
|   <https://docs.mattermost.com/deploy/mobile-hpns.html#test-push-notifications-service-tpns>`__. Review the                                      |
|   `mobile push notifications <https://docs.mattermost.com/deploy/mobile-hpns.html>`__                                                            |
|   and `mobile apps <https://docs.mattermost.com/deploy/build-custom-mobile-apps.html>`__ documentation, including guidance on compiling your own |
|   mobile apps and MPNS, before deploying to production.                                                                                          |
| - To confirm push notifications are working, connect to the `Mattermost iOS App <https://apps.apple.com/us/app/mattermost/id1257222717>`__       |
|   available on the App Store, or the `Mattermost Android App <https://play.google.com/store/apps/details?id=com.mattermost.rn>`__ available on   |
|   Google Play.                                                                                                                                   |          
+-----------------------------------------------------------------+--------------------------------------------------------------------------------+

Maximum notifications per channel
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+-----------------------------------------------------------------+--------------------------------------------------------------------------------------+
| The maximum total number of users in a channel before @all,     | - System Config path: **Environment > Push Notification Server**                     |
| @here, and @channel no longer send notifications to maximize    | - ``config.json setting``: ``".TeamSettings.MaxNotificationsPerChannel: 1000",``     |
| performance.                                                    | - Environment variable: ``MM_EMAILSETTINGS_MAXNOTIFICATIONSPERCHANNEL``              |
|                                                                 |                                                                                      |
| Numerical input. Default is **1000**.                           |                                                                                      |
+-----------------------------------------------------------------+--------------------------------------------------------------------------------------+
| **Note**: We recommend increasing this value a little at a time, monitoring system health by tracking `performance monitoring metrics                  |
| <https://docs.mattermost.com/scale/performance-monitoring.html>`__, and only increasing this value if large channels have restricted permissions       |
| controlling who can post to the channel, such as a read-only Town Square channel.                                                                      |
+-----------------------------------------------------------------+--------------------------------------------------------------------------------------+
source/configure/performance-monitoring-configuration-settings.rst METASEP
:orphan:
:nosearch:

Configure performance monitoring by going to **System Console > Environment > Performance Monitoring**, or by editing the ``config.json`` file as described in the following tables. Changes to configuration settings in this section require a server restart before taking effect.

Enable performance monitoring
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

+-----------------------------------------------+---------------------------------------------------------------------+
| Enable or disable performance monitoring.     | - System Config path: **Environment > Performance Monitoring**      |
|                                               | - ``config.json setting``: ``".MetricsSettings.Enable": false",``   |
| - **true**: Performance monitoring data       | - Environment variable: ``MM_METRICSSETTINGS_ENABLE``               |
|   collection and profiling is enabled.        |                                                                     |
| - **false**: **(Default)** Mattermost         |                                                                     |
|   performance monitoring is disabled.         |                                                                     |
+-----------------------------------------------+---------------------------------------------------------------------+
| See the `performance monitoring <https://docs.mattermost.com/scale/performance-monitoring.html>`__ documentation    |
| to learn more.                                                                                                      |
+---------------------------------------------------------------+-----------------------------------------------------+

Listen address for performance
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

+---------------------------------------------------------------+-------------------------------------------------------------------------+
| The port the Mattermost server will listen on to expose       | - System Config path: **Environment > Performance Monitoring**          |
| performance metrics, when enabled.                            | - ``config.json setting``: ``".MetricsSettings.ListenAddress": 8067",`` |
|                                                               | - Environment variable: ``MM_METRICSSETTINGS_LISTENADDRESS``            |
| Numerical input. Default is **8067**.                         |                                                                         |
+---------------------------------------------------------------+-------------------------------------------------------------------------+
source/configure/optimize-your-workspace.rst METASEP
Optimize your Mattermost workspace
==================================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

With workspace optimizations, System Admins can review their workspace health and growth scores, then take advantage of recommended actions for ensuring their workspace is running smoothly and teams are maximizing productivity. 

System Admins can access their workspace optimization page in the System Console by going to **Reporting > Workspace Optimization**.

.. image:: ../images/workspace-optimization.png
  :alt: Review your workspace health and growth scores, then take advantage of recommended optimizations.

How is the overall score calculated?
------------------------------------

The highest score possible is 100. Your score is calculated based on the type of issue reported and the level of potential security risk introduced to your Mattermost deployment if ignored. 

Each item on the dashboard is calculated based on its individual impact score. These differ depending on whether they're problems, warnings, or suggestions. For example, if SSL encryption isn't configured in your workspace, Mattermost reports that as a problem, which reduces your score until it's addressed. 

Warnings impact your score less than problems, and suggestions have the least impact on your score.

Want to improve your overall workspace optimization score? Take action towards the problems, warnings, and suggestions reported on this dashboard. We recommend the following workspace optimizations.

Recommendations
---------------

The following optimization areas can alert you to workspace suggestions, warnings, or problems that may require your attention:

+-----------------------+----------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Optimization category | Suggestions, Warnings, or Problems Detected                                                              | Additional Information                                                                                                                                               |
+=======================+==========================================================================================================+======================================================================================================================================================================+
| Mattermost release    | Are you on the latest Mattermost release?                                                                | You're notified when updates are available.                                                                                                                          |
|                       |                                                                                                          | See the `Upgrade Mattermost <https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html>`__ product documentation for details on upgrading your workspace. |
+-----------------------+----------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Configuration issues  | - **SSL**: Should your workspace be more secure with SSL?                                                | See the product documentation to learn more:                                                                                                                         |
|                       |                                                                                                          |                                                                                                                                                                      |
|                       | - **Session Length**: The default value may not provide an optimal user experience.                      | - `Set up SSL <https://docs.mattermost.com/onboard/ssl-client-certificate.html>`__                                                                                   |
|                       |                                                                                                          | - `Configure session length <https://docs.mattermost.com/configure/configuration-settings.html#session-lengths>`__                                                   |
+-----------------------+----------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Workspace access      | Is the Mattermost workspace may not be accessible to users?                                              | If your web server settings don't pass a live URL test, your workspace may not be accessible to others.                                                              |
|                       |                                                                                                          | See the `Environment Configuration Settings <https://docs.mattermost.com/configure/configuration-settings.html#environment>`__ product documentation to learn more:  |
+-----------------------+----------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Search performance    | As your user base grows, is search getting slower?                                                       | See the `Elasticsearch <https://docs.mattermost.com/scale/elasticsearch.html>`__ product documentation to learn more.                                                |
+-----------------------+----------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Data privacy          | Do you need more control and insights into your data?                                                    | See the product documentation to learn more:                                                                                                                         |
|                       |                                                                                                          |                                                                                                                                                                      |
|                       |                                                                                                          | - `Data Retention <https://docs.mattermost.com/comply/data-retention-policy.html>`__                                                                                 |
|                       |                                                                                                          | - `Compliance Export <https://docs.mattermost.com/comply/compliance-export.html>`__                                                                                  |
+-----------------------+----------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| User authentication   | - **AD/LDAP**: As your user base grows, would you benefit from easier onboarding,                        | See the product documentation to learn more:                                                                                                                         |
|                       |   automated deactivations, and role assignments?                                                         |                                                                                                                                                                      |
|                       |                                                                                                          | - `AD/LDAP <https://docs.mattermost.com/configure/configuration-settings.html#ad-ldap>`__                                                                            |
|                       | - **Guest accounts**: Do you want to control user access to channels and teams with guest accounts?      | - `Guest accounts <https://docs.mattermost.com/onboard/guest-accounts.html>`__                                                                                       |
+-----------------------+----------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

source/configure/logging-configuration-settings.rst METASEP
:orphan:
:nosearch:

Configure logging by going to **System Console > Environment > Logging**, or by editing the ``config.json`` file as described in the following tables. Changes to configuration settings in this section require a server restart before taking effect.

Output logs to console
~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+-----------------------------------------------+---------------------------------------------------------------------+
| Configure Mattermost to output logs to the    | - System Config path: **Environment > Logging**                     |
| console.                                      | - ``config.json setting``: ``".LogSettings.EnableConsole": true",`` |
|                                               | - Environment variable: ``MM_LOGSETTINGS_ENABLECONSOLE``            |
| - **true**: **(Default)** Output log messages |                                                                     |
|   are written to the console based on the     |                                                                     |
|   `console log level <#console-log-level>`__  |                                                                     |
|   configuration. The server writes messages   |                                                                     |
|   to the standard output stream (stdout).     |                                                                     | 
| - **false**: Output log messages aren’t       |                                                                     |
|   written to the console.                     |                                                                     |
+-----------------------------------------------+---------------------------------------------------------------------+

Console log level
~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+-----------------------------------------------+---------------------------------------------------------------------+
| The level of detail in log events written     | - System Config path: **Environment > Logging**                     |
| when Mattermost outputs log messages to the   | - ``config.json setting``: ``".LogSettings.ConsoleLevel": DEBUG",`` |
| console.                                      | - Environment variable: ``MM_LOGSETTINGS_CONSOLELEVEL``             |
|                                               |                                                                     |
| - **DEBUG**: **(Default)** Outputs verbose    |                                                                     |
|   detail for developers debugging issues.     |                                                                     |
| - **ERROR**: Outputs only error messages.     |                                                                     |
| - **INFO**: Outputs error messages and        |                                                                     |
|   information around startup and              |                                                                     |
|   initialization.                             |                                                                     |
+-----------------------------------------------+---------------------------------------------------------------------+

Output console logs as JSON
~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+-----------------------------------------------+---------------------------------------------------------------------+
| Configure Mattermost to output console logs   | - System Config path: **Environment > Logging**                     |
| as JSON.                                      | - ``config.json setting``: ``".LogSettings.ConsoleJson": true",``   |
|                                               | - Environment variable: ``MM_LOGSETTINGS_CONSOLEJSON``              |
| - **true**: **(Default)** Logged events are   |                                                                     |
|   written in a machine-readable JSON format.  |                                                                     |
|   Typically set to **true** in production.    |                                                                     |
| - **false**: Logged events are written in     |                                                                     |
|   plain text.                                 |                                                                     |
+-----------------------------------------------+---------------------------------------------------------------------+

Output logs to file
~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+-----------------------------------------------+---------------------------------------------------------------------+
| Configure Mattermost to output console logs   | - System Config path: **Environment > Logging**                     |
| to a file.                                    | - ``config.json setting``: ``".LogSettings.EnableFile": true",``    |
|                                               | - Environment variable: ``MM_LOGSETTINGS_ENABLEFILE``               |
| - **true**: **(Default)** Logged events are   |                                                                     |
|   written based on the                        |                                                                     |
|   `file log level <#file-log-level>`__        |                                                                     |
|   configuration to a ``mattermost.log`` file  |                                                                     |
|   located in the directory configured via     |                                                                     |
|   file location. Typically set to **true**    |                                                                     |
|   in production.                              |                                                                     | 
| - **false**: Logged events aren’t written to  |                                                                     |
|   a file.                                     |                                                                     |
+-----------------------------------------------+---------------------------------------------------------------------+

File log level
~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+-----------------------------------------------+---------------------------------------------------------------------+
| The level of detail in log events when        | - System Config path: **Environment > Logging**                     |
| Mattermost outputs log messages to a file.    | - ``config.json setting``: ``".LogSettings.FileLevel": INFO",``     |
|                                               | - Environment variable: ``MM_LOGSETTINGS_FILELEVEL``                |
| - **DEBUG**: Outputs verbose detail for       |                                                                     |
|   developers debugging issues.                |                                                                     |
| - **ERROR**: Outputs only error messages.     |                                                                     |
| - **INFO**: **(Default)** Outputs error       |                                                                     |
|   messages and information around startup     |                                                                     |
|   and initialization.                         |                                                                     |
+-----------------------------------------------+---------------------------------------------------------------------+

Output file logs as JSON
~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+-----------------------------------------------+---------------------------------------------------------------------+
| Configure Mattermost to output file logs as   | - System Config path: **Environment > Logging**                     |
| JSON.                                         | - ``config.json setting``: ``".LogSettings.FileJson": true",``      |
|                                               | - Environment variable: ``MM_LOGSETTINGS_FILEJSON``                 |
| - **true**: **(Default)** Logged events are   |                                                                     |
|   written in a machine-readable JSON format.  |                                                                     |
|   Typically set to **true** in production.    |                                                                     |  
| - **false**: Logged events are written in     |                                                                     |
|   plain text.                                 |                                                                     |
+-----------------------------------------------+---------------------------------------------------------------------+

File log directory
~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+-----------------------------------------------+---------------------------------------------------------------------+
| The location of the log files.                | - System Config path: **Environment > Logging**                     |
|                                               | - ``config.json setting``: ``".LogSettings.FileLocation": "",``     |
| String input. If left blank, log files are    | - Environment variable: ``MM_LOGSETTINGS_FILELOCATION``             |
| stored in the ``./logs`` directory.           |                                                                     |
+-----------------------------------------------+---------------------------------------------------------------------+
| **Note**: The path you configure must exist, and Mattermost must have write permissions for this directory.         |
+-----------------------------------------------+---------------------------------------------------------------------+

Enable webhook debugging
~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+-----------------------------------------------+------------------------------------------------------------------------------+
| Configure Mattermost to capture the contents  | - System Config path: **Environment > Logging**                              |
| of incoming webhooks to log files for         | - ``config.json setting``: ``".LogSettings.EnableWebhookDebugging": true",`` |
| debugging.                                    | - Environment variable: ``MM_LOGSETTINGS_ENABLEWEBHOOKDEBUGGING``            |
|                                               |                                                                              |
| - **true**: **(Default)** The contents of     |                                                                              |
|   incoming webhooks are printed to log files  |                                                                              |
|   for debugging.                              |                                                                              |     
| - **false**: The contents of incoming         |                                                                              |
|   webhooks aren’t printed to log files.       |                                                                              |
+-----------------------------------------------+------------------------------------------------------------------------------+

Enable diagnostics and error reporting
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+-----------------------------------------------+---------------------------------------------------------------------------+
| Configure Mattermost to allow any combination | - System Config path: **Environment > Logging**                           |
| of console, local file, syslog, and TCP       | - ``config.json setting``: ``".LogSettings.AdvancedLoggingConfig": "",``  |
| socket targets, and send log records to       | - Environment variable: ``MM_LOGSETTINGS_ADVANCEDLOGGINGCONFIG``          |
| multiple targets.                             |                                                                           |
|                                               |                                                                           |
+-----------------------------------------------+---------------------------------------------------------------------------+

Output logs to multiple targets
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+-----------------------------------------------+---------------------------------------------------------------------------+
| Configure Mattermost to allow any combination | - System Config path: **Environment > Logging**                           |
| of console, local file, syslog, and TCP       | - ``config.json setting``: ``".LogSettings.AdvancedLoggingConfig": "",``  |
| socket targets, and send log records to       | - Environment variable: ``MM_LOGSETTINGS_ADVANCEDLOGGINGCONFIG``          |
| multiple targets.                             |                                                                           |
|                                               |                                                                           |
| String input can contain a filespec to        |                                                                           |
| another configuration file, a database DSN,   |                                                                           |
| or JSON.                                      |                                                                           |
+-----------------------------------------------+---------------------------------------------------------------------------+
| **Notes**:                                                                                                                |
|                                                                                                                           |
| - These targets have been chosen as they support the vast majority of log aggregators, and other log analysis tools,      |
|   without needing additional software installed.                                                                          |
| - Logs are recorded asynchronously to reduce latency to the caller.                                                       |
| - Advanced logging supports hot-reloading of logger configuration.                                                        |
+-----------------------------------------------+---------------------------------------------------------------------------+   
| See the `audit log v2 <https://docs.mattermost.com/comply/audit-log.html>`__ documentation for additional information.    |
+-----------------------------------------------+---------------------------------------------------------------------------+
source/configure/image-proxy-configuration-settings.rst METASEP
:orphan:
:nosearch:

An image proxy is used by Mattermost apps to prevent them from connecting directly to remote self-hosted servers. Configure an image proxy by going to **System Console > Environment > Image Proxy**, or by editing the ``config.json`` file as described in the following tables.

Enable image proxy
~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+---------------------------------------------------------------------+
| An image proxy anonymizes Mattermost app connections and      | - System Config path: **Environment > Image Proxy**                 |
| prevents them from accessing insecure content.                | - ``config.json setting``: ``".ImageProxySettings.Enable": true",`` |
|                                                               | - Environment variable: ``MM_IMAGEPROXYSETTINGS_ENABLE``            |
| - **true**: **(Default)** Enables an image proxy for loading  |                                                                     |
|   external images.                                            |                                                                     |
| - **false**: Disables the image proxy.                        |                                                                     |
+---------------------------------------------------------------+---------------------------------------------------------------------+
| See the `image proxy <https://docs.mattermost.com/deploy/image-proxy.html>`__ documentation to learn more.                          |
+---------------------------------------------------------------+---------------------------------------------------------------------+

Image proxy type
~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+-------------------------------------------------------------------------------+
| The type of image proxy used by Mattermost.                   | - System Config path: **Environment > Image Proxy**                           |
|                                                               | - ``config.json setting``: ``".ImageProxySettings.ImageProxyType": "local",`` |
| - **local**: **(Default)** The Mattermost server itself acts  | - Environment variable: ``MM_IMAGEPROXYSETTINGS_IMAGEPROXYTYPE``              |
|   as the image proxy.                                         |                                                                               |
| - **atmos/camo**: An external atmos/camo image proxy is used. |                                                                               |
+---------------------------------------------------------------+-------------------------------------------------------------------------------+
| See the `image proxy <https://docs.mattermost.com/deploy/image-proxy.html>`__ documentation to learn more.                                    |
+---------------------------------------------------------------+-------------------------------------------------------------------------------+

Remote image proxy URL
~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+---------------------------------------------------------------------------+
| The URL of the atmos/camo proxy. This setting isn't needed    | - System Config path: **Environment > Image Proxy**                       |
| when using the **local** image proxy.                         | - ``config.json setting``: ``".ImageProxySettings.RemoteImageProxyURL",`` |
|                                                               | - Environment variable: ``MM_IMAGEPROXYSETTINGS_REMOTEIMAGEPROXYURL``     |
+---------------------------------------------------------------+---------------------------------------------------------------------------+

Remote image proxy options
~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+-------------------------------------------------------------------------------+
| The URL signing key passed to an atmos/camo image proxy.      | - System Config path: **Environment > Image Proxy**                           |
| This setting isn't needed when using the **local** image      | - ``config.json setting``: ``".ImageProxySettings.RemoteImageProxyOptions",`` |
| proxy type.                                                   | - Environment variable: ``MM_IMAGEPROXYSETTINGS_REMOTEIMAGEPROXYOPTIONS``     |
+---------------------------------------------------------------+-------------------------------------------------------------------------------+
| See the `image proxy <https://docs.mattermost.com/deploy/image-proxy.html>`__ documentation to learn more.                                    |
+---------------------------------------------------------------+-------------------------------------------------------------------------------+
source/configure/high-availability-configuration-settings.rst METASEP
.. _high-availability:
:orphan:
:nosearch:

You can configure Mattermost as a `high availability environment <https://docs.mattermost.com/scale/high-availability-cluster.html>`__ by going to **System Console > Environment > High Availability**, or by editing the ``config.json`` file as described in the following tables. Changes to configuration settings in this section require a server restart before taking effect.

In a Mattermost high availability cluster deployment, the System Console is set to read-only, and settings can only be changed by editing the ``config.json`` file directly. However, to test a high availability environment, you can disable ``ClusterSettings.ReadOnlyConfig`` in the ``config.json`` file by setting it to ``false``. This allows changes applied using the System Console to be saved back to the configuration file.

Enable high availability mode 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

+-----------------------------------------------------------------+------------------------------------------------------------+
| You can enable high availability mode.                          | - System Config path: **Environment > High Availability**  |
|                                                                 | - ``config.json`` setting: ``".ClusterSettings.Enable",``  |
| - **true**: The Mattermost server will attempt inter-node       | - Environment variable: ``MM_CLUSTERSETTINGS_ENABLE``      |
|   communication with the other servers in the cluster that      |                                                            |
|   have the same cluster name. This sets the System Console to   |                                                            |
|   read-only mode to keep the servers' ``config.json`` files     |                                                            |
|   in sync.                                                      |                                                            |
| - **false**: **(Default)** Mattermost high availability mode    |                                                            |
|   is disabled.                                                  |                                                            |
+-----------------------------------------------------------------+------------------------------------------------------------+

Cluster name
~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

+-----------------------------------------------------------------+-----------------------------------------------------------------+
| The cluster to join by name in a high availability environment. | - System Config path: **Environment > High Availability**       |
|                                                                 | - ``config.json`` setting: ``".ClusterSettings.ClusterName",``  |
| Only nodes with the same cluster name will join together.       | - Environment variable: ``MM_CLUSTERSETTINGS_CLUSTERNAME``      |
| This is to support blue-green deployments or staging pointing   |                                                                 |
| to the same database.                                           |                                                                 |
+-----------------------------------------------------------------+-----------------------------------------------------------------+

Override hostname
~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

+-----------------------------------------------------------------+----------------------------------------------------------------------+
| You can override the hostname of this server.                   | - System Config path: **Environment > High Availability**            |
|                                                                 | - ``config.json`` setting: ``".ClusterSettings.OverrideHostname",``  |
| - This property can be set to a specific IP address if needed;  | - Environment variable: ``MM_CLUSTERSETTINGS_OVERRIDEHOSTNAME``      |
|   however, we don’t recommend overriding the hostname unless    |                                                                      |
|   it's necessary.                                               |                                                                      |
| - If left blank, Mattermost attempts to get the hostname from   |                                                                      |
|   the operating system or uses the IP address.                  |                                                                      |
+-----------------------------------------------------------------+----------------------------------------------------------------------+
| See the `high availability cluster <https://docs.mattermost.com/scale/high-availability-cluster.html>`__ documentation for details.    |
+-----------------------------------------------------------------+----------------------------------------------------------------------+

Use IP address
~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

+-----------------------------------------------------------------+------------------------------------------------------------------------+
| You can configure your high availability environment to         | - System Config path: **Environment > High Availability**              |
| communicate using the hostname instead of the IP address.       | - ``config.json`` setting: ``".ClusterSettings.UseIPAddress: true",``  |
|                                                                 | - Environment variable: ``MM_CLUSTERSETTINGS_USEIPADDRESS``            |
| - **true**: **(Default)** The cluster attempts to communicate   |                                                                        |
|   using the IP address specified.                               |                                                                        |
| - **false**: The cluster attempts to communicate using the      |                                                                        |
|   hostname.                                                     |                                                                        |
+-----------------------------------------------------------------+------------------------------------------------------------------------+

Use gossip
~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

+-----------------------------------------------------------------+--------------------------------------------------------------------------------+
| All cluster traffic uses the gossip protocol.                   | - System Config path: **Environment > High Availability**                      |
|                                                                 | - ``config.json`` setting: ``".ClusterSettings.UseExperimentalGossip: true",`` |
| - **true**: **(Default)** The server attempts to communicate    | - Environment variable: ``MM_CLUSTERSETTINGS_USEEXPERIMENTALGOSSIP``           |
|   via the gossip protocol over the gossip port specified.       |                                                                                |
| - **false**: The server attempts to communicate over the        |                                                                                |
|   streaming port.                                               |                                                                                |
+-----------------------------------------------------------------+--------------------------------------------------------------------------------+
| **Notes**:                                                                                                                                       |
|                                                                                                                                                  |
| - From Mattermost Server v5.36, gossip clustering can no longer be disabled.                                                                     |
| - The gossip port and gossip protocol are used to determine cluster health even when this setting is set to **false**.                           |
+-----------------------------------------------------------------+--------------------------------------------------------------------------------+

Enable experimental gossip encryption
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

+-----------------------------------------------------------------+----------------------------------------------------------------------------------------------+
| Gossip encryption uses AES-256 by default, and this value isn’t | - System Config path: **Environment > High Availability**                                    |
| configurable by design.                                         | - ``config.json`` setting: ``".ClusterSettings.EnableExperimentalGossipEncryption: false”,`` |
|                                                                 | - Environment variable: ``MM_CLUSTERSETTINGS_ENABLEEXPERIMENTALGOSSIPENCRYPTION``            |
| - **true**: All communication through the cluster using the     |                                                                                              |
|   gossip protocol will be encrypted.                            |                                                                                              |
| - **false**: **(Default)** All communication using gossip       |                                                                                              |
|   protocol remains unencrypted.                                 |                                                                                              |
+-----------------------------------------------------------------+----------------------------------------------------------------------------------------------+
| **Note**: Alternatively, you can manually set the ``ClusterEncryptionKey`` row value in the **Systems** table. A key is a byte array converted to base64.      |
| Set this value to either 16, 24, or 32 bytes to select AES-128, AES-192, or AES-256 respectively.                                                              |
+-----------------------------------------------------------------+----------------------------------------------------------------------------------------------+

Enable gossip compression
~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

+-----------------------------------------------------------------+----------------------------------------------------------------------------------+
| Once all servers in a cluster are upgraded to Mattermost v5.33  | - System Config path: **Environment > High Availability**                        |
| or later, we recommend that you disable this configuration      | - ``config.json`` setting: ``".ClusterSettings.EnableGossipCompression: true”,`` |
| setting for better performance.                                 | - Environment variable: ``MM_CLUSTERSETTINGS_ENABLE GOSSIPCOMPRESSION``          |
|                                                                 |                                                                                  |
| - **true**: **(Default)** All communication through the         |                                                                                  |
|   cluster uses gossip compression. This setting is enabled by   |                                                                                  |
|   default to maintain compatibility with older servers.         |                                                                                  |
| - **false**: All communication using the gossip protocol        |                                                                                  |
|   remains uncompressed.                                         |                                                                                  |
+-----------------------------------------------------------------+----------------------------------------------------------------------------------+

Gossip port
~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

+-----------------------------------------------------------------+---------------------------------------------------------------------+
| The port used for the gossip protocol. Both UDP and TCP         | - System Config path: **Environment > High Availability**           |
| should be allowed on this port.                                 | - ``config.json`` setting: ``".ClusterSettings.GossipPort: 8074”,`` |
|                                                                 | - Environment variable: ``MM_CLUSTERSETTINGS_GOSSIPPORT``           |
| Numerical input. Default is **8074**.                           |                                                                     |
+-----------------------------------------------------------------+---------------------------------------------------------------------+

Streaming port
~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

+-----------------------------------------------------------------+------------------------------------------------------------------------+
| The port used for streaming data between servers.               | - System Config path: **Environment > High Availability**              |
|                                                                 | - ``config.json`` setting: ``".ClusterSettings.StreamingPort: 8075",`` |
| Numerical input. Default is **8075**.                           | - Environment variable: ``MM_CLUSTERSETTINGS_STREAMINGPORT``           |
+-----------------------------------------------------------------+------------------------------------------------------------------------+

Read only config
~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

+-----------------------------------------------------------------+------------------------------------------------------------------------+
| - **true**: **(Default)** Changes made to settings in the       | - System Config path: N/A                                              |
|   System Console are ignored.                                   | - ``config.json`` setting: ``".ClusterSettings.ReadOnlyConfig: true,`` |
| - **false**: Changes made to settings in the System Console     | - Environment variable: ``MM_CLUSTERSETTINGS_READONLYCONFIG``          |
|   are written to ``config.json``.                               |                                                                        | 
+-----------------------------------------------------------------+------------------------------------------------------------------------+

Network interface
~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

+-----------------------------------------------------------------+------------------------------------------------------------------------+
| An IP address used to identify the device that does automatic   | - System Config path: N/A                                              |
| IP detection in high availability clusters.                     | - ``config.json`` setting: ``".ClusterSettings.NetworkInterface: "",`` |
|                                                                 | - Environment variable: ``MM_CLUSTERSETTINGS_NETWORKINTERFACE``        |
| String input.                                                   |                                                                        |
+-----------------------------------------------------------------+------------------------------------------------------------------------+

Bind address
~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

+-----------------------------------------------------------------+--------------------------------------------------------------------+
| An IP address used to bind cluster traffic to a specific        | - System Config path: N/A                                          |
| network device.                                                 | - ``config.json`` setting: ``".ClusterSettings.BindAddress: "",``  |
|                                                                 | - Environment variable: ``MM_CLUSTERSETTINGS_BINDADDRESS``         |
| This setting is used primarily for servers with multiple        |                                                                    |
| network devices or different Bind Address and Advertise Address |                                                                    |
| like in deployments that involve NAT (Network Address           |                                                                    |
| Translation).                                                   |                                                                    |
|                                                                 |                                                                    |
| String input.                                                   |                                                                    |
+-----------------------------------------------------------------+--------------------------------------------------------------------+

Advertise address
~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

+-----------------------------------------------------------------+------------------------------------------------------------------------+
| The IP address used to access the server from other nodes.      | - System Config path: N/A                                              |
| This settings is used primary when cluster nodes are not in     | - ``config.json`` setting: ``".ClusterSettings.AdvertiseAddress: "",`` |
| the same network and involve NAT (Network Address Translation). | - Environment variable: ``MM_CLUSTERSETTINGS_ADVERTISEADDRESS``        |
|                                                                 |                                                                        |
| String input.                                                   |                                                                        |
+-----------------------------------------------------------------+------------------------------------------------------------------------+

Maximum idle connections for high availability
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

+-----------------------------------------------------------------+------------------------------------------------------------------------+
| The maximum number of idle connections held open from one       | - System Config path: N/A                                              |
| server to all others in the cluster.                            | - ``config.json`` setting: ``".ClusterSettings.MaxIdleConns: 100,``    |
|                                                                 | - Environment variable: ``MM_CLUSTERSETTINGS_MAXIDLECONNS``            |
| Numerical input. Default is **100**.                            |                                                                        |
+-----------------------------------------------------------------+------------------------------------------------------------------------+

Maximum idle connections per host
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

+-----------------------------------------------------------------+------------------------------------------------------------------------------+
| The maximum number of idle connections held open from one       | - System Config path: N/A                                                    |
| server to another server in the cluster.                        | - ``config.json`` setting: ``".ClusterSettings.MaxIdleConnsPerHost: 128",``  |
|                                                                 | - Environment variable: ``MM_CLUSTERSETTINGS_MAXIDLECONNSPERHOST``           |
| Numerical input. Default is **128**.                            |                                                                              |
+-----------------------------------------------------------------+------------------------------------------------------------------------------+

Idle connection timeout
~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

+-----------------------------------------------------------------+---------------------------------------------------------------------------------------+
| The amount of time, in milliseconds, to leave an idle           | - System Config path: N/A                                                             |
| connection open between servers in the cluster.                 | - ``config.json`` setting: ``".ClusterSettings.IdleConnTimeoutMilliseconds: 90000",`` |
|                                                                 | - Environment variable: ``MM_CLUSTERSETTINGS_IDLECONNTIMEOUTMILLISECONDS``            |
| Numerical input. Default is **90000**.                          |                                                                                       | 
+-----------------------------------------------------------------+---------------------------------------------------------------------------------------+

source/configure/file-storage-configuration-settings.rst METASEP
:orphan:
:nosearch:

Configure file storage settings by going to **System Console > Environment > File Storage**, or by editing the ``config.json`` file as described in the following tables. 

Mattermost currently supports storing files on the local filesystem and Amazon S3 or S3-compatible containers. We have tested Mattermost with `MinIO <https://min.io/>`__ and `Digital Ocean Spaces <https://docs.digitalocean.com/products/spaces/>`__ products, but not all S3-compatible containers on the market. If you are looking to use other S3-compatible containers, we recommend completing your own testing.

File storage system
~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+--------------------------------------------------------------------------+
| The type of file storage system used.                         | - System Config path: **Environment > File Storage**                     |
| Can be either Local File System or Amazon S3.                 | - ``config.json`` setting: ``".FileSettings.DriverName:  local”,``       |
|                                                               | - Environment variable: ``MM_FILESETTINGS_DRIVERNAME``                   |
| - **local**: **(Default)** Files and images are stored in     |                                                                          |
|   the specified local file directory.                         |                                                                          |
| - **amazons3**: Files and images are stored on Amazon S3      |                                                                          |
|   based on the access key, bucket, and region fields          |                                                                          |
|   provided. The driver is compatible with MinIO (beta)        |                                                                          |
|   and Digital Ocean Spaces.                                   |                                                                          |
+---------------------------------------------------------------+--------------------------------------------------------------------------+

Local storage directory
~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+--------------------------------------------------------------------------+
| The local directory to which files are written when the       | - System Config path: **Environment > File Storage**                     |
| **File storage system** is set to **local**.                  | - ``config.json`` setting: ``".FileSettings.Directory”,``                |
| Can be any directory writable by the user Mattermost is       | - Environment variable: ``MM_FILESETTINGS_DIRECTORY``                    |
| running as, and is relative to the directory where            |                                                                          |
| Mattermost is installed.                                      |                                                                          |
|                                                               |                                                                          |
| Defaults to **./data/**.                                      |                                                                          |
+---------------------------------------------------------------+--------------------------------------------------------------------------+
| **Note**: When **File storage system** is set to **amazons3**, this setting has no effect.                                               |                      
+---------------------------------------------------------------+--------------------------------------------------------------------------+

Maximum file size
~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+--------------------------------------------------------------------------+
| The maximum file size for message attachments.                | - System Config path: **Environment > File Storage**                     |
| This value must be specified in megabytes in the              | - ``config.json`` setting: ``".FileSettings.MaxFileSize: 104857600",``   |
| System Console, and in bytes in the ``config.json`` file.     | - Environment variable: ``MM_FILESETTINGS_MAXFILESIZE``                  |
|                                                               |                                                                          |
| The default is ``1048576`` bytes (**1** megabyte).            |                                                                          |
+---------------------------------------------------------------+--------------------------------------------------------------------------+
| **Warning**: Verify server memory can support your setting choice. Large file sizes increase the risk of server crashes and failed       |
| uploads due to network disruptions.                                                                                                      |
+---------------------------------------------------------------+--------------------------------------------------------------------------+
| **Note**: If you use a proxy or load balancer in front of Mattermost, the following proxy settings must be adjusted accordingly:         |
|                                                                                                                                          |
| - For NGINX, use ``client_max_body_size``.                                                                                               |
| - For Apache use ``LimitRequestBody``.                                                                                                   |
+---------------------------------------------------------------+--------------------------------------------------------------------------+

Enable document search by content
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+-------------------------------------------------------------------------------------+
| Enable users to search the contents of documents attached     | - System Config path: **Environment > File Storage**                                |
| to messages.                                                  | - ``config.json`` setting: ``".FileSettings.ExtractContent: true",``                |
|                                                               | - Environment variable: ``MM_FILESETTINGS_EXTRACTCONTENT``                          |
| - **true**: **(Default)** Documents are searchable by         |                                                                                     |
|   their content.                                              |                                                                                     |
| - **false**: Documents aren’t searchable by their content.    |                                                                                     |
|   When document content search is disabled, users can search  |                                                                                     |
|   for files by file name only.                                |                                                                                     |
+---------------------------------------------------------------+-------------------------------------------------------------------------------------+
| **Note**: Document content search results for files shared before upgrading to Mattermost Server v5.35 may be incomplete until an                   |
| extraction command is executed using the `CLI <https://docs.mattermost.com/manage/command-line-tools.html#mattermost-extract-documents-content>`__  | 
| or the `mmctl <https://docs.mattermost.com/manage/mmctl-command-line-tool.html?highlight=mmctl#mmctl-extract>`__. If this command is not run,       |
| users can search older files based on file name only.                                                                                               |
|                                                                                                                                                     |
| You can optionally install the following `dependencies <https://github.com/sajari/docconv#dependencies>`__ to extend content searching support in   |
| Mattermost to include file formats beyond PDF, DOCX, and ODT, such as DOC, RTF, XML, HTML, and PAGES:                                               |
|                                                                                                                                                     |
| - **tidy**: Used to search the contents of HTML and PAGES documents.                                                                                |
| - **wv**: Used to search the contents of DOC documents.                                                                                             |
| - **popplerutils**: Used to significantly improve server performance when extracting the contents of PDF documents.                                 |
| - **unrtf**: Used to search the contents of RTF documents.                                                                                          |
| - **Justtext**: Used to search HTML documents.                                                                                                      |
|                                                                                                                                                     |
| If you choose not to install these dependencies, you’ll see log entries for documents that couldn’t be extracted.                                   |
| Any documents that can’t be extracted are skipped and logged so that content extraction can proceed.                                                |
+---------------------------------------------------------------+-------------------------------------------------------------------------------------+

Enable searching content of documents within ZIP files
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+----------------------------------------------------------------------------------------+
| Enables users to search the contents of compressed ZIP files  | - System Config path: **Environment > File Storage**                                   |
| attached to messages.                                         | - ``config.json`` setting: ``".FileSettings.ArchiveRecursion: false",``                |
|                                                               | - Environment variable: ``MM_FILESETTINGS_ARCHIVERECURSION``                           |
| - **true**: Contents of documents within ZIP files are        |                                                                                        |
|   returned in search results. This may have an impact on      |                                                                                        |
|   server performance for large files.                         |                                                                                        |
|   the specified local file directory.                         |                                                                                        |
| - **false**: **(Default)** The contents of documents within   |                                                                                        | 
|   ZIP files aren’t returned in search results.                |                                                                                        |
+---------------------------------------------------------------+----------------------------------------------------------------------------------------+
| **Note**: Document content search within ZIP files is available in Mattermost Server from v5.35, with mobile support coming soon.                      |
| Searching document contents adds load to your server. For large deployments, or teams that share many large, text-heavy documents,                     |
| we recommend you review our `hardware requirements <https://docs.mattermost.com/install/software-hardware-requirements.html#hardware-requirements>`__, |
| and test enabling this feature in a staging environment before enabling it in a production environment.                                                |
+---------------------------------------------------------------+----------------------------------------------------------------------------------------+

Amazon S3 bucket
~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+--------------------------------------------------------------------------+
| The name of the bucket for your S3-compatible object          | - System Config path: **Environment > File Storage**                     |
| storage instance.                                             | - ``config.json`` setting: ``".FileSettings.AmazonS3Bucket",``           |
|                                                               | - Environment variable: ``MM_FILESETTINGS_AMAZONS3BUCKET``               |
| A string with the S3-compatible bucket name.                  |                                                                          |
+---------------------------------------------------------------+--------------------------------------------------------------------------+

Amazon S3 path prefix
~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+--------------------------------------------------------------------------+
| The prefix you selected for your **Amazon S3 bucket** in AWS. | - System Config path: N/A                                                |
|                                                               | - ``config.json`` setting: ``".FileSettings.AmazonS3PathPrefix",``       |
| A string containing the path prefix.                          | - Environment variable: ``MM_FILESETTINGS_AMAZONS3PATHPREFIX``           |
+---------------------------------------------------------------+--------------------------------------------------------------------------+

Amazon S3 region
~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+--------------------------------------------------------------------------+
| The AWS region you selected when creating your                | - System Config path: **Environment > File Storage**                     |
| **Amazon S3 bucket** in AWS.                                  | - ``config.json`` setting: ```".FileSettings.AmazonS3Region",``          |
|                                                               | - Environment variable: ``MM_FILESETTINGS_AMAZONS3REGION``               |
| A string with the AWS region containing the bucket.           |                                                                          |
| If no region is set, Mattermost attempts to get the           |                                                                          |
| appropriate region from AWS, and sets it to **us-east-1**     |                                                                          |
| if none found.                                                |                                                                          |
+---------------------------------------------------------------+--------------------------------------------------------------------------+
| **Note**: For MinIO or Digital Ocean Spaces, leave this setting empty.                                                                   |
+---------------------------------------------------------------+--------------------------------------------------------------------------+

Amazon S3 access key ID
~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+--------------------------------------------------------------------------+
| A string with the access key for the S3-compatible storage    | - System Config path: **Environment > File Storage**                     |
| instance. Your EC2 administrator can supply you with the      | - ``config.json`` setting: ``".FileSettings.AmazonS3AccessKeyId",``      |
| Access Key ID.                                                | - Environment variable: ``MM_FILESETTINGS_AMAZONS3ACCESSKEYID``          | 
+---------------------------------------------------------------+--------------------------------------------------------------------------+
| **Note**: This is required for access unless you are using an                                                                            |
| `Amazon S3 IAM Role <https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html>`__ with       |
| Amazon S3.                                                                                                                               |
+---------------------------------------------------------------+--------------------------------------------------------------------------+

Amazon S3 endpoint
~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+------------------------------------------------------------------------------------+
| The hostname of your S3-compatible instance.                  | - System Config path: **Environment > File Storage**                               |
|                                                               | - ``config.json`` setting: ``".FileSettings.AmazonS3Endpoint: s3.amazonaws.com",`` |
| A string with the hostname of the S3-compatible storage       | - Environment variable: ``MM_FILESETTINGS_AMAZONS3ENDPOINT``                       |
| instance. Defaults to **s3.amazonaws.com**.                   |                                                                                    |
+---------------------------------------------------------------+------------------------------------------------------------------------------------+
| **Note**: For Digital Ocean Spaces, the hostname should be set to **<region>.digitaloceanspaces.com**, where **<region>** is the abbreviation      |
| for the region you selected when setting up the Space. It can be **nyc3**, **ams3**, or **sgp1**.                                                  |
+---------------------------------------------------------------+------------------------------------------------------------------------------------+

Amazon S3 secret access key
~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+--------------------------------------------------------------------------+
| The secret access key associated with your Amazon S3          | - System Config path: **Environment > File Storage**                     |
| Access Key ID.                                                | - ``config.json`` setting: ``".FileSettings.AmazonS3SecretAccessKey",``  |
|                                                               | - Environment variable: ``MM_FILESETTINGS_AMAZONS3SECRETACCESSKEY``      |
| A string with the secret access key for the S3-compatible     |                                                                          | 
| storage instance.                                             |                                                                          |
+---------------------------------------------------------------+--------------------------------------------------------------------------+

Enable secure Amazon S3 connections
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+--------------------------------------------------------------------------+
| Enable or disable secure Amazon S3 connections.               | - System Config path: **Environment > File Storage**                     |
|                                                               | - ``config.json`` setting: ``".FileSettings.AmazonS3SSL: true",``        |
| - **true**: **(Default)** Enables only secure Amazon          | - Environment variable: ``MM_FILESETTINGS_AMAZONS3SSL``                  |
|   S3 connections.                                             |                                                                          |
| - **false**: Allows insecure connections to Amazon S3.        |                                                                          |
+---------------------------------------------------------------+--------------------------------------------------------------------------+

Amazon S3 signature v2
~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Not available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+--------------------------------------------------------------------------+
| By default, Mattermost uses Signature v4 to sign API calls    | - System Config path: N/A                                                |              
| to AWS, but under some circumstances, v2 is required.         | - ``config.json`` setting: ``".FileSettings.AmazonS3SignV2: false",``    |
|                                                               | - Environment variable: ``MM_FILESETTINGS_AMAZONS3SIGNV2``               |
| - **true**: Use Signature v2 signing process.                 |                                                                          |
| - **false**: **(Default)** Use Signature v4 signing process.  |                                                                          |
+---------------------------------------------------------------+--------------------------------------------------------------------------+
| See the `AWS <https://docs.aws.amazon.com/general/latest/gr/signature-version-2.html>`__ documentation for information about when to     |
| use the Signature v2 signing process.                                                                                                    |
+---------------------------------------------------------------+--------------------------------------------------------------------------+

Enable server-side encryption for Amazon S3
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

+---------------------------------------------------------------+--------------------------------------------------------------------------+
| Enable server-side encryption for Amazon S3.                  | - System Config path: **Environment > File Storage**                     |
|                                                               | - ``config.json`` setting: ``".FileSettings.AmazonS3SSE: false",``       |
| - **true**: Encrypts files in Amazon S3 using server-side     | - Environment variable: ``MM_FILESETTINGS_AMAZONS3SSE``                  |
|   encryption with Amazon S3-managed keys.                     |                                                                          |
| - **false**: **(Default)** Doesn’t encrypt files in           |                                                                          |
|   Amazon S3.                                                  |                                                                          |
+---------------------------------------------------------------+--------------------------------------------------------------------------+

Enable Amazon S3 debugging
~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+--------------------------------------------------------------------------+
| Enable or disable Amazon S3 debugging to capture additional   | - System Config path: **Environment > File Storage**                     |
| debugging information in system logs                          | - ``config.json`` setting: ``".FileSettings.AmazonS3Trace: false",``     |
|                                                               | - Environment variable: ``MM_FILESETTINGS_AMAZONS3TRACE``                |
| - **true**:Log additional debugging information is logged     |                                                                          |
|   to the system logs.                                         |                                                                          |
| - **false**: **(Default)** No Amazon S3 debugging information |                                                                          |
|   is included in the system logs.Typically set to **false**   |                                                                          |
|   in production.                                              |                                                                          |
+---------------------------------------------------------------+--------------------------------------------------------------------------+
| Select the **Test Connection** button in the System Console to validate the settings and ensure the user can access the server.          |
+---------------------------------------------------------------+--------------------------------------------------------------------------+

Initial Font
~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+--------------------------------------------------------------------------------+
| The font used in auto-generated profile pictures with colored | - System Config path: N/A                                                      |
| backgrounds and username initials.                            | - ``config.json`` setting: ``".FileSettings.InitialFont: nunito-bold.ttf",``   |
|                                                               | - Environment variable: ``MM_FILESETTINGS_INITIALFONT``                        |
| A string with the font file name. Default is                  |                                                                                |
| **nunito-bold.ttf**.                                          |                                                                                | 
+---------------------------------------------------------------+--------------------------------------------------------------------------------+
source/configure/environment-variables.rst METASEP
Environment variables
=====================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

You can use environment variables to manage the configuration. Environment variables override settings in ``config.json``. If a change to a setting in ``config.json`` requires a restart for it to take effect, then changes to the corresponding environment variable also require a server restart.

The name of the environment variable for any setting can be derived from the name of that setting in ``config.json``. For example, to derive the name of the Site URL setting:

1. Find the setting in ``config.json``. In this case, *ServiceSettings.SiteURL*.
2. Add ``MM_`` to the beginning and convert all characters to uppercase and replace the ``.`` with ``_``. For example, *MM_SERVICESETTINGS_SITEURL*.
3. The setting becomes ``export MM_SERVICESETTINGS_SITEURL="http://example.com"``.

.. note::

  - If Mattermost is run from an initialization file, environment variables can be set via ``Environment=<>``, or ``EnvironmentFile=<path/to/file>``. In the second case, the file specified contains the list of environment variables to set.
  - When settings are configured through an environment variable, System Admins can't modify them in the System Console. If a setting is configured through an environment variable, and any other changes are made in the System Console, the value stored of the environment variable will be written back to the ``config.json`` as that setting's value.
  - For any setting that's not set in ``config.json`` or in environment variables, the Mattermost server uses the setting's default value as documented in the sections below on this page.

.. warning::
   
   - Environment variables for Mattermost settings that are set within the active shell will take effect when migrating configuration. For more information, see `Configuration In Database <https://docs.mattermost.com/configure/configuation-in-mattermost-database.html>`__.
   - Database connection strings for the database read and search replicas need to be formatted using `URL encoding <https://www.w3schools.com/tags/ref_urlencode.asp>`__. Incorrectly formatted strings may cause some characters to terminate the string early, resulting in issues when the connection string is parsed.
   
Override Mattermost license file
--------------------------------

Starting from Mattermost v5.26, you can use an environment variable to override any license in the database or file configuration without replacing those licenses.

When starting the server, specify the license key as ``MM_LICENSE`` with the contents of a license file.

.. note::
   If ``MM_LICENSE`` is set to a non-empty string, but the license specified is not valid, the Mattermost server will be started without a license.
   
   In a High Availability deployment, using an environment variable to override a server license only affects the individual app server and doesn't propagate to other servers in the cluster.

Load custom configuration defaults
----------------------------------

Starting from Mattermost v5.30, you can load a set of custom configuration defaults using an environment variable. This custom configuration applies only if the values are not already present in the current server configuration.

1. Create a JSON file that contains the custom configuration defaults. For example, ``custom.json``.
2. When starting the server, point the custom defaults environment variable to the defaults file: ``MM_CUSTOM_DEFAULTS_PATH=custom.json``.
source/configure/environment-configuration-settings.rst METASEP
Environment configuration settings
==================================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

.. include:: common-config-settings-notation.rst
    :start-after: :nosearch:

The following environment configuration settings are available:

- `Web server <#web-server>`__
- `Database <#database>`__
- `Elasticsearch <#elasticsearch>`__
- `File Storage <#file-storage>`__
- `Image Proxy <#image-proxy>`__
- `SMTP <#smtp>`__
- `Push Notification Server <#push-notification-server>`__
- `High Availability <#high-availability>`__
- `Rate Limiting <#rate-limiting>`__
- `Logging <#logging>`__
- `Session Lengths <#session-lengths>`__
- `Performance Monitoring <#performance-monitoring>`__
- `Developer <#developer>`__

Web server
----------

.. include:: web-server-configuration-settings.rst
    :start-after: :nosearch:

Database
--------

.. include:: database-configuration-settings.rst
    :start-after: :nosearch:

Elasticsearch
-------------

.. include:: elasticsearch-configuration-settings.rst
    :start-after: :nosearch:

File storage
------------

.. include:: file-storage-configuration-settings.rst
    :start-after: :nosearch:

Image proxy
-----------

.. include:: image-proxy-configuration-settings.rst
    :start-after: :nosearch:

SMTP
----

.. include:: smtp-configuration-settings.rst
    :start-after: :nosearch:

Push notification server
------------------------

.. include:: push-notification-server-configuration-settings.rst
    :start-after: :nosearch:

High availability
-----------------

.. include:: high-availability-configuration-settings.rst
    :start-after: :nosearch:

Rate limiting
-------------

.. include:: rate-limiting-configuration-settings.rst
    :start-after: :nosearch:

Logging
--------

.. include:: logging-configuration-settings.rst
    :start-after: :nosearch:

Session lengths
---------------

.. include:: session-lengths-configuration-settings.rst
    :start-after: :nosearch:

Performance monitoring
----------------------

.. include:: performance-monitoring-configuration-settings.rst
    :start-after: :nosearch:

Developer
---------

.. include:: developer-mode-configuration-settings.rst
    :start-after: :nosearch:
source/configure/enabling-chinese-japanese-korean-search.rst METASEP
..  _i18n:

Chinese, Japanese, and Korean search
======================================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Enabling search for Chinese, Japanese and Korean (CJK) requires special configuration, since these languages do not contain spaces.

- See `database requirements documentation <https://docs.mattermost.com/install/software-hardware-requirements.html>`__ for how to set up search for these languages.

.. contents::
    :backlinks: top

Below is additional information on how to configure the database for different languages.

中文 / Chinese
--------------

数据库版本请参考： `配置要求 <https://docs.mattermost.com/install/software-hardware-requirements.html#database-software>`__ 。
其中MySQL的ngram配置可以参考 `Cannot search CJK contents <https://github.com/mattermost/mattermost-server/issues/2033#issuecomment-182336690>`__ 。

更多中文相关问题讨论请访问 `中文讨论组 <https://forum.mattermost.com/c/international/chinese>`__ 。

以Ubuntu 14.04 PostgreSQL 9.3 数据库 mattermost 为例。

编译scws
~~~~~~~~

.. code:: bash

    wget -q -O - http://www.xunsearch.com/scws/down/scws-1.2.2.tar.bz2 | tar xjf -
    cd scws-1.2.2
    ./configure
    make install

编译zhparser
~~~~~~~~~~~~

.. code:: bash

    sudo apt-get install --yes postgresql-server-dev-9.3 libpq-dev
    git clone https://github.com/amutu/zhparser.git
    SCWS_HOME=/usr/local make && make install

.. note::
  通过 Docker 镜像（mattermost/mattermost-prod-db）应用数据库的用户，请按照下述方法安装依赖项。

  .. code:: bash

    # Alpine 通过 apk add 命令安装依赖项
    apk add wget tar gcc git postgresql-dev 

创建extension以及增加解析配置
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code:: bash

   sudo -i -u postgres
   psql mattermost -c 'CREATE EXTENSION zhparser'
   psql mattermost -c 'CREATE TEXT SEARCH CONFIGURATION simple_zh_cfg (PARSER = zhparser);'
   psql mattermost -c 'ALTER TEXT SEARCH CONFIGURATION simple_zh_cfg ADD MAPPING FOR n,v,a,i,e,l WITH simple;'

设置postgresql
~~~~~~~~~~~~~~

将 /etc/postgresql/9.3/main/postgresql.conf 中 default_text_search_config 的值更改为 simple_zh_cfg，然后重启postgresql: sudo service postgresql restart

调试
~~~~

可以打开 mattermost 的配置 config/config.json 中 SqlSettings 的设置 Trace: true，然后可以在mattermost的标准输出看到执行的SQL语句。

.. code:: sql

    SELECT to_tsvector('simple_zh_cfg', '开始全面整修道路');
    SELECT to_tsvector('simple_zh_cfg', '开始全面整修道路') @@ to_tsquery('simple_zh_cfg', '全面');
    SELECT * FROM Posts WHERE Message @@ to_tsquery('simple_zh_cfg', '全面');

日本語 / Japanese
-----------------

日本語翻訳の改善は大歓迎です。自由に変更していただいて結構です。

検索設定
~~~~~~~~~

Mattermost で日本語検索をするためにはデータベースの設定変更が必要です

- `MySQL <https://docs.mattermost.com/install/requirements.html#database-software>`__

- `Postgres <https://github.com/mattermost/mattermost-server/issues/2159#issuecomment-206444074>`__

日本語(CJK)検索設定のドキュメントの改善にご協力ください

ガイド
~~~~~~

Qiita上で Mattermost のインストールおよび構成のガイドを提供しています。詳細については、`こちら <http://qiita.com/tags/Mattermost>`_ をご覧ください。

한국어 / Korean
---------------

이 문제에 대한 논의는 이 `이슈 <https://github.com/mattermost/mattermost-server/issues/2033>`_ 에서 시작되었습니다.

한국어 버전 이용 시 문제점을 발견하면 `Localization 채널 <https://community.mattermost.com/core/channels/localization>`__ 또는 `한국어 채널 <https://community.mattermost.com/core/channels/i18n-korean>`__ 에서 의견을 제시할 수 있습니다.

검색을 위한 데이터베이스 설정
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

PostgreSQL: PostgreSQL 데이터베이스에서는 따로 설정이 필요하지 않습니다.

MySQL: MySQL에서는 전문 검색(Full-text search) 기능에 제한이 있기 때문에 추가적인 작업이 필요합니다.

MySQL 해결 방법
~~~~~~~~~~~~~~~~~

1. `n-gram parser <https://mysqlserverteam.com/innodb-%EC%A0%84%EB%AC%B8-%EA%B2%80%EC%83%89-n-gram-parser/>`__ 를 이용하기 위해서는 MySQL의 버전이 5.7.6 이상이어야 합니다.

2. MySQL의 구성 파일에서 n-gram의 최소 토큰 크기를 다음과 같이 설정합니다.

.. code:: sql

    [mysqld]
    ft_min_word_len = 2
    innodb_ft_min_word_len = 2

3. 데이터베이스를 재시작합니다. (이 과정은 반드시 필요합니다.)

4. 일부 테이블의 전문 검색 색인을 다음과 같이 재구성합니다.

- 게시물 검색을 위한 설정 ( `참조 <https://github.com/mattermost/mattermost-server/issues/2033#issuecomment-182336690>`__ )

.. code:: sql

    DROP INDEX idx_posts_message_txt ON Posts;
    CREATE FULLTEXT INDEX idx_posts_message_txt ON Posts (Message) WITH PARSER ngram;

- 해시 태그 검색을 위한 설정 ( `참조 <https://github.com/mattermost/mattermost-server/pull/4555>`__ )

.. code:: sql

    DROP INDEX idx_posts_hashtags_txt ON Posts;
    CREATE FULLTEXT INDEX idx_posts_hashtags_txt ON Posts (Hashtags) WITH PARSER ngram;

- 사용자 검색을 위한 설정

  ``Users.idx_users_txt_all`` 과 ``Users.idx_users_names_all`` 을 n-gram 없이 재구성합니다.

source/configure/email-templates.rst METASEP
Email templates
===============

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Mattermost has a few email templates that are sent out when a specific event occurs.
Most of the time these templates do not need to be modified.
In case additional modifications are necessary, all available props in each email are listed below.
The 'Content'-Field is just to give a quick description of the prop. Please check the i18n strings for the exact wording.

The email templates are located in the Mattermost server directory in the ``templates`` folder.
The corresponding strings for each prop can be found in the ``i18n`` folder. 

.. note::
  The props between different email templates are not interchangeable without additional server code changes.  

.. warning::
  Changes made inside of the ``templates`` or ``i18n`` folder might get overwritten during a server update. 
  Please make sure to backup them accordingly.


Available templates
-------------------

Email footer
~~~~~~~~~~~~

**Purpose**:
This is appended to all outgoing emails sent by Mattermost.

**Props**:

+--------------+------------------------------+-----------------------------------+
| Prop         | Content                      | i18n String                       |
+==============+==============================+===================================+
| Footer       | Message intro                | api.templates.email_footer        |
+--------------+------------------------------+-----------------------------------+
| Organization | Name of Organization         | api.templates.email_organization  |
+--------------+------------------------------+-----------------------------------+
| EmailInfo1   | First line of footer         | api.templates.email_info1         |
+--------------+------------------------------+-----------------------------------+
| EmailInfo2   | Second line of footer        | api.templates.email_info2         |
+--------------+------------------------------+-----------------------------------+
| EmailInfo3   | Third line of footer         | api.templates.email_info3         |
+--------------+------------------------------+-----------------------------------+
| SupportEmail | Email for Mattermost support | --                                |
+--------------+------------------------------+-----------------------------------+


SendChangeUsernameEmail
~~~~~~~~~~~~~~~~~~~~~~~

**Purpose**:
Sent to the user when username has been changed.

**Body Props**:

+---------+------------------------------+--------------------------------------------+
| Prop    | Content                      | i18n String                                |
+=========+==============================+============================================+
| SiteURL | URL of the Mattermost server | --                                         |
+---------+------------------------------+--------------------------------------------+
| Title   | Message heading              | api.templates.username_change_body.title   |
+---------+------------------------------+--------------------------------------------+
| Info    | Message body                 | api.templates.username_change_body.info    |
+---------+------------------------------+--------------------------------------------+
| Warning | Warning text                 | api.templates.email_warning                |
+---------+------------------------------+--------------------------------------------+


SendEmailChangeVerifyEmail
~~~~~~~~~~~~~~~~~~~~~~~~~~

**Purpose**:
Sent to the user when an email change has been requested. Contains verification link and button.

**Body Props**:

+--------------+-------------------------------+--------------------------------------------------+
| Prop         | Content                       | i18n String                                      |
+==============+===============================+==================================================+
| SiteURL      | URL of the Mattermost server  | --                                               |
+--------------+-------------------------------+--------------------------------------------------+
| Title        | Message heading               | api.templates.email_change_verify_body.title     |
+--------------+-------------------------------+--------------------------------------------------+
| Info         | Message body                  | api.templates.email_change_verify_body.info      |
+--------------+-------------------------------+--------------------------------------------------+
| VerifyUrl    | URL for email verification    | --                                               |
+--------------+-------------------------------+--------------------------------------------------+
| VerifyButton | Button for email verification | api.templates.email_change_verify_body.button    |
+--------------+-------------------------------+--------------------------------------------------+


SendEmailChangeEmail
~~~~~~~~~~~~~~~~~~~~

**Purpose**:
Sent to the user when the email has been changed successfully.

**Body Props**:

+---------+------------------------------+-----------------------------------------+
| Prop    | Content                      | i18n String                             |
+=========+==============================+=========================================+
| SiteURL | URL of the Mattermost server | --                                      |
+---------+------------------------------+-----------------------------------------+
| Title   | Message heading              | api.templates.email_change_body.title   |
+---------+------------------------------+-----------------------------------------+
| Info    | Message body                 | api.templates.email_change_body.info    |
+---------+------------------------------+-----------------------------------------+
| Warning | Warning text                 | api.templates.email_warning             |
+---------+------------------------------+-----------------------------------------+


SendVerifyEmail
~~~~~~~~~~~~~~~

**Purpose**:
Sent to the user upon account creation to verify email address.

**Body Props**:

+-----------+------------------------------+-----------------------------------+
| Prop      | Content                      | i18n String                       |
+===========+==============================+===================================+
| SiteURL   | URL of the Mattermost server | --                                |
+-----------+------------------------------+-----------------------------------+
| Title     | Message heading              | api.templates.verify_body.title   |
+-----------+------------------------------+-----------------------------------+
| Info      | Message body                 | api.templates.verify_body.info    |
+-----------+------------------------------+-----------------------------------+
| VerifyUrl | URL for email verification   | --                                |
+-----------+------------------------------+-----------------------------------+
| Button    | Button for email verification | api.templates.verify_body.button |
+-----------+------------------------------+-----------------------------------+


SendSignInChangeEmail
~~~~~~~~~~~~~~~~~~~~~

**Purpose**:
Sent to the user when the login method has been changed (i.e. from email to LDAP, etc.)

**Body Props**:

+---------+------------------------------+------------------------------------------------+
| Prop    | Content                      | i18n String                                    |
+=========+==============================+================================================+
| SiteURL | URL of the Mattermost server | --                                             |
+---------+------------------------------+------------------------------------------------+
| Title   | Message heading              | api.templates.signin_change_email.body.title   |
+---------+------------------------------+------------------------------------------------+
| Info    | Message body                 | api.templates.signin_change_email.body.info    |
+---------+------------------------------+------------------------------------------------+
| Warning | Warning text                 | api.templates.email_warning                    |
+---------+------------------------------+------------------------------------------------+


SendWelcomeEmail
~~~~~~~~~~~~~~~~

**Purpose**:
Sent to the user when the account has been created. May also contain download links to Apps as well as email verification links.

**Body Props**:

+-----------------+------------------------------+-------------------------------------------------+
| Prop            | Content                      | i18n String                                     |
+=================+==============================+=================================================+
| SiteURL         | URL of the Mattermost server | --                                              |
+-----------------+------------------------------+-------------------------------------------------+
| Title           | Message heading              | api.templates.welcome_body.title                |
+-----------------+------------------------------+-------------------------------------------------+
| Info            | Message body                 | api.templates.welcome_body.info                 |
+-----------------+------------------------------+-------------------------------------------------+
| Button          | Button for confirmation      | api.templates.welcome_body.button               |
+-----------------+------------------------------+-------------------------------------------------+
| Info2           | Continuation of message body | api.templates.welcome_body.info2                |
+-----------------+------------------------------+-------------------------------------------------+
| Info3           | Continuation of message body | api.templates.welcome_body.info3                |
+-----------------+------------------------------+-------------------------------------------------+


**Optional Props**:

+-----------------+------------------------------+-------------------------------------------------+
| Prop            | Content                      | i18n String                                     |
+=================+==============================+=================================================+
| AppDownloadInfo | Info for App Downloads       | api.templates.welcome_body.app_download_info    |
+-----------------+------------------------------+-------------------------------------------------+
| AppDownloadLink | Download link for Apps       | --                                              |
+-----------------+------------------------------+-------------------------------------------------+
| VerifyUrl       | Link for verification        | --                                              |
+-----------------+------------------------------+-------------------------------------------------+


SendPasswordChangeEmail
~~~~~~~~~~~~~~~~~~~~~~~

**Purpose**:
Sent to the user when password has been changed.

**Body Props**:

+---------+------------------------------+--------------------------------------------+
| Prop    | Content                      | i18n String                                |
+=========+==============================+============================================+
| SiteURL | URL of the Mattermost server | --                                         |
+---------+------------------------------+--------------------------------------------+
| Title   | Message heading              | api.templates.password_change_body.title   |
+---------+------------------------------+--------------------------------------------+
| Info    | Message body                 | api.templates.password_change_body.info    |
+---------+------------------------------+--------------------------------------------+
| Warning | Warning text                 | api.templates.email_warning                |
+---------+------------------------------+--------------------------------------------+


SendAccessTokenEmail
~~~~~~~~~~~~~~~~~~~~

**Purpose**:
Sent to the user when an access token has been added to the account.

**Body Props**:

+---------+------------------------------+-----------------------------------------------+
| Prop    | Content                      | i18n String                                   |
+=========+==============================+===============================================+
| SiteURL | URL of the Mattermost server | --                                            |
+---------+------------------------------+-----------------------------------------------+
| Title   | Message heading              | api.templates.user_access_token_body.title    |
+---------+------------------------------+-----------------------------------------------+
| Info    | Message body                 | api.templates.user_access_token_body.info     |
+---------+------------------------------+-----------------------------------------------+
| Warning | Warning text                 | api.templates.email_warning                   |
+---------+------------------------------+-----------------------------------------------+


SendPasswordResetEmail
~~~~~~~~~~~~~~~~~~~~~~

**Purpose**:
Sent to the user when password request has been initiated.

**Body Props**:

+----------+------------------------------+----------------------------------+
| Prop     | Content                      | i18n String                      |
+==========+==============================+==================================+
| SiteURL  | URL of the Mattermost server | --                               |
+----------+------------------------------+----------------------------------+
| Title    | Message heading              | api.templates.reset_body.title   |
+----------+------------------------------+----------------------------------+
| Info1    | Message body                 | api.templates.reset_body.info1   |
+----------+------------------------------+----------------------------------+
| Info2    | Continuation of message body | api.templates.reset_body.info2   |
+----------+------------------------------+----------------------------------+
| ResetUrl | URL to reset password        | --                               |
+----------+------------------------------+----------------------------------+
| Button   | Button for confirmation      | api.templates.reset_body.button  |
+----------+------------------------------+----------------------------------+


SendMfaChangeEmail
~~~~~~~~~~~~~~~~~~

**Purpose**:
Sent to the user when multi-factor authentication method has been changed.

**Body Props when MFA is activated**:

+---------+------------------------------+------------------------------------------+
| Prop    | Content                      | i18n String                              |
+=========+==============================+==========================================+
| SiteURL | URL of the Mattermost server | --                                       |
+---------+------------------------------+------------------------------------------+
| Title   | Message heading              | api.templates.mfa_activated_body.title   |
+---------+------------------------------+------------------------------------------+
| Info    | Message body                 | api.templates.mfa_activated_body.info    |
+---------+------------------------------+------------------------------------------+
| Warning | Warning text                 | api.templates.email_warning              |
+---------+------------------------------+------------------------------------------+


**Body Props when MFA is deactivated**:

+---------+------------------------------+--------------------------------------------+
| Prop    | Content                      | i18n String                                |
+=========+==============================+============================================+
| SiteURL | URL of the Mattermost server | --                                         |
+---------+------------------------------+--------------------------------------------+
| Title   | Message heading              | api.templates.mfa_deactivated_body.title   |
+---------+------------------------------+--------------------------------------------+
| Info    | Message body                 | api.templates.mfa_deactivated_body.info    |
+---------+------------------------------+--------------------------------------------+
| Warning | Warning text                 | api.templates.email_warning                |
+---------+------------------------------+--------------------------------------------+


SendDeactivateAccountEmail
~~~~~~~~~~~~~~~~~~~~~~~~~~

**Purpose**:
Sent to the user when account has been deactivated.

**Body Props**:

+---------+------------------------------+----------------------------------------+
| Prop    | Content                      | i18n String                            |
+=========+==============================+========================================+
| SiteURL | URL of the Mattermost server | --                                     |
+---------+------------------------------+----------------------------------------+
| Title   | Message heading              | api.templates.deactivate_body.title    |
+---------+------------------------------+----------------------------------------+
| Info    | Message body                 | api.templates.deactivate_body.info     |
+---------+------------------------------+----------------------------------------+
| Warning | Warning text                 | api.templates.deactivate_body.warning  |
+---------+------------------------------+----------------------------------------+


SendInviteEmails
~~~~~~~~~~~~~~~~

**Purpose**:
Sent to the user when team invite via email has been used.

**Body Props**:

+-----------+--------------------------------------------------------------------+----------------------------------------+
| Prop      | Content                                                            | i18n String                            |
+===========+====================================================================+========================================+
| SiteURL   | URL of the Mattermost server                                       | --                                     |
+-----------+--------------------------------------------------------------------+----------------------------------------+
| Title     | Message heading                                                    | api.templates.invite_body.title        |
+-----------+--------------------------------------------------------------------+----------------------------------------+
| Info1     | Message body                                                       | api.templates.invite_body.info         |
+-----------+--------------------------------------------------------------------+----------------------------------------+
| Button    | Button for confirmation                                            | api.templates.invite_body.button       |
+-----------+--------------------------------------------------------------------+----------------------------------------+
| ExtraInfo | Additional info about Mattermost                                   | api.templates.invite_body.extra_info   |
+-----------+--------------------------------------------------------------------+----------------------------------------+
| TeamURL   | URL to the team the user has been invited to                       | --                                     |
+-----------+--------------------------------------------------------------------+----------------------------------------+
| Link      | URL for team invite confirmation (not to be confused with TeamURL) | --                                     |
+-----------+--------------------------------------------------------------------+----------------------------------------+


NotificationEmailBody
~~~~~~~~~~~~~~~~~~~~~

**Purpose**:
Sent to the user as a notification for new messages or mentions.

**Body Props**:

+----------+------------------------------+---------------------------------+
| Prop     | Content                      | i18n String                     |
+==========+==============================+=================================+
| SiteURL  | URL of the Mattermost server | --                              |
+----------+------------------------------+---------------------------------+
| Button   | Button to post               | api.templates.post_body.button  |
+----------+------------------------------+---------------------------------+
| TeamLink | URL to Team                  | --                              |
+----------+------------------------------+---------------------------------+


This email can change depending on the settings and type of channel the notification is sent for.

**For group channels**:

**With full notification contents enabled**: 

+------------+------------------+-------------------------------------------------+
| Prop       | Content          | i18n String                                     |
+============+==================+=================================================+
| BodyText   | Message intro    | app.notification.body.intro.group_message.full  |
+------------+------------------+-------------------------------------------------+
| Info1      | Channel name     | app.notification.body.text.group_message.full   |
+------------+------------------+-------------------------------------------------+
| Info2      | Message contents | app.notification.body.text.group_message.full2  |
+------------+------------------+-------------------------------------------------+
| SenderName | Name of sender   | --                                              |
+------------+------------------+-------------------------------------------------+


**Without**:

+----------+---------------+----------------------------------------------------+
| Prop     | Content       | i18n String                                        |
+==========+===============+====================================================+
| BodyText | Message intro | app.notification.body.intro.group_message.generic  |
+----------+---------------+----------------------------------------------------+
| Info     | Timestamp     | app.notification.body.text.group_message.generic   |
+----------+---------------+----------------------------------------------------+


**For direct messages**:

**With full notification contents enabled**: 

+------------+---------------------------+-----------------------------------------+
| Prop       | Content                   | i18n String                             |
+============+===========================+=========================================+
| BodyText   | Message intro             | app.notification.body.intro.direct.full |
+------------+---------------------------+-----------------------------------------+
| Info1      | Empty for direct messages | --                                      |
+------------+---------------------------+-----------------------------------------+
| Info2      | Message contents          | app.notification.body.text.direct.full  |
+------------+---------------------------+-----------------------------------------+
| SenderName | Name of sender            | --                                      |
+------------+---------------------------+-----------------------------------------+


**Without**:

+----------+---------------+--------------------------------------------+
| Prop     | Content       | i18n String                                |
+==========+===============+============================================+
| BodyText | Message intro | app.notification.body.intro.direct.generic |
+----------+---------------+--------------------------------------------+
| Info     | Timestamp     | app.notification.body.text.direct.generic  |
+----------+---------------+--------------------------------------------+


**Notifications**:

**With full notification contents enabled**: 

+------------+------------------+-----------------------------------------------+
| Prop       | Content          | i18n String                                   |
+============+==================+===============================================+
| BodyText   | Message intro    | app.notification.body.intro.notification.full |
+------------+------------------+-----------------------------------------------+
| Info1      | Channel name     | app.notification.body.text.notification.full  |
+------------+------------------+-----------------------------------------------+
| Info2      | Message contents | app.notification.body.text.notification.full2 |
+------------+------------------+-----------------------------------------------+
| SenderName | Name of sender   | --                                            |
+------------+------------------+-----------------------------------------------+


**Without**:

+----------+------------------------------+--------------------------------------------------+
| Prop     | Content                      | i18n String                                      |
+==========+==============================+==================================================+
| BodyText | URL of the Mattermost server | app.notification.body.intro.notification.generic |
+----------+------------------------------+--------------------------------------------------+
| Info     | Message heading              | app.notification.body.text.notification.generic  |
+----------+------------------------------+--------------------------------------------------+

source/configure/elasticsearch-configuration-settings.rst METASEP
:orphan:
:nosearch:

Elasticsearch provides enterprise-scale deployments with optimized search performance and prevents performance degradation and timeouts. Learn more about `Elasticsearch <https://docs.mattermost.com/scale/elasticsearch.html>`__ in our product documentation. 

Configure the Elasticsearch environment in which Mattermost is deployed by going to **System Console > Environment > Elasticsearch**, or by editing the ``config.json`` file as described in the following tables. Changes to configuration settings in this section require a server restart before taking effect.

Enable Elasticsearch indexing
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+--------------------------------------------------------------------------------+
| Configure Mattermost to index new posts automatically.        | - System Config path: **Environment > Elasticsearch**                          |
|                                                               | - ``config.json`` setting: ``".Elasticsearchsettings.EnableIndexing: false",`` |
| - **true**: Indexing of new posts occurs automatically.       | - Environment variable: ``MM_ELASTICSEARCHSETTINGS_ENABLEINDEXING``            |
| - **false**: **(Default)** Elasticsearch indexing is disabled |                                                                                |
|   and new posts are not indexed.                              |                                                                                |
+---------------------------------------------------------------+--------------------------------------------------------------------------------+
| **Notes**:                                                                                                                                     |
|                                                                                                                                                |
| - If indexing is disabled and re-enabled after an index is created, we recommend you purge and rebuild the index to ensure complete            |
|   search results.                                                                                                                              |
| - Search queries will use database search until Elasticsearch for search queries is enabled.                                                   |
+----------------------------------------------------------------------+-------------------------------------------------------------------------+

Server connection address
~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+--------------------------------------------------------------------------+
| The address of the Elasticsearch server.                      | - System Config path: **Environment > Elasticsearch**                    |
|                                                               | - ``config.json`` setting: ``".Elasticsearchsettings.ConnectionUrl",``   |
|                                                               | - Environment variable: ``MM_ELASTICSEARCHSETTINGS_CONNECTIONURL``       |
+---------------------------------------------------------------+--------------------------------------------------------------------------+

Skip TLS verification
~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+-------------------------------------------------------------------------------------+
| The certificate step for TLS connections can be skipped.      | - System Config path: **Environment > Elasticsearch**                               |
|                                                               | - ``config.json`` setting: ``".Elasticsearchsettings.SkipTLSVerification: false",`` |
| - **true**: Skips the certificate verification step for       | - Environment variable: ``MM_ELASTICSEARCHSETTINGS_SKIPTLSVERIFICATION``            |
|   TLS connections.                                            |                                                                                     |
| - **false**: **(Default)** Mattermost does not skip           |                                                                                     |
|   certificate verification.                                   |                                                                                     |
+---------------------------------------------------------------+-------------------------------------------------------------------------------------+

Server username
~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+--------------------------------------------------------------------------+
| (Optional) The username to authenticate to the                | - System Config path: **Environment > Elasticsearch**                    |
| Elasticsearch server.                                         | - ``config.json`` setting: ``".Elasticsearchsettings.UserName",``        |
|                                                               | - Environment variable: ``MM_ELASTICSEARCHSETTINGS_USERNAME``            |
| String input.                                                 |                                                                          |
+---------------------------------------------------------------+--------------------------------------------------------------------------+

Server password
~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+--------------------------------------------------------------------------+
| (Optional) The password to authenticate to the                | - System Config path: **Environment > Elasticsearch**                    |
| Elasticsearch server.                                         | - ``config.json`` setting: ``".Elasticsearchsettings.Password",``        |
|                                                               | - Environment variable: ``MM_ELASTICSEARCHSETTINGS_PASSWORD``            |
| String input.                                                 |                                                                          |
+---------------------------------------------------------------+--------------------------------------------------------------------------+

Enable cluster sniffing
~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+----------------------------------------------------------------+--------------------------------------------------------------------------+
| Configure Mattermost to automatically find and connect to      | - System Config path: **Environment > Elasticsearch**                    |
| all data nodes in a cluster.                                   | - ``config.json`` setting: ``".Elasticsearchsettings.Sniff: false",``    |
|                                                                | - Environment variable: ``MM_ELASTICSEARCHSETTINGS_SNIFF``               |
| - **true**: Sniffing finds and connects to all data nodes      |                                                                          |
|   in your cluster automatically.                               |                                                                          |
| - **false**: **(Default)** Cluster sniffing is disabled .      |                                                                          |
+----------------------------------------------------------------+--------------------------------------------------------------------------+
| Select the **Test Connection** button in the System Console to validate the connection between Mattermost and the Elasticsearch server.   |
+----------------------------------------------------------------+--------------------------------------------------------------------------+

Bulk indexing
~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+--------------------------------------------------------------------------+
| Configure Mattermost to start a bulk index of all existing    | - System Config path: **Environment > Elasticsearch**                    |
| posts in the database.                                        | - ``config.json`` setting: N/A                                           |
|                                                               | - Environment variable: N/A                                              |
+---------------------------------------------------------------+--------------------------------------------------------------------------+
| Select the **Index Now** button in the System Console to start a bulk index of all posts. If the indexing process is canceled, the       |
| index and search results will be incomplete.                                                                                             |
+---------------------------------------------------------------+--------------------------------------------------------------------------+

Purge indexes
~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+-------------------------------------------------------------+
| Configure Mattermost to purge the entire Elasticsearch index. | - System Config path: **Environment > Elasticsearch**       |        
| Typically only used if the index has corrupted and search     | - ``config.json`` setting: N/A                              |
| isn't behaving as expected.                                   | - Environment variable: N/A                                 |          
+---------------------------------------------------------------+-------------------------------------------------------------+
| Select the **Purge Indexes** button in the System Console to purge the index.                                               |
| After purging the index, create a new index by selecting the **Index Now** button.                                          |
+---------------------------------------------------------------+-------------------------------------------------------------+

Enable Elasticsearch for search queries
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+---------------------------------------------------------------------------------+
| Configure Mattermost to use Elasticsearch for all search      | - System Config path: **Environment > Elasticsearch**                           |
| queries using the latest index                                | - ``config.json`` setting: ``".Elasticsearchsettings.EnableSearching: false",`` |  
|                                                               | - Environment variable: ``MM_ELASTICSEARCHSETTINGS_ENABLESEARCHING``            | 
| - **true**: Elasticsearch will be used for all search         |                                                                                 |
|   queries using the latest index. Search results may be       |                                                                                 |
|   incomplete until a bulk index of the existing post database |                                                                                 |
|   is finished.                                                |                                                                                 |
| - **false**: **(Default)** Database search is used for        |                                                                                 |
|   search queries.                                             |                                                                                 |
+---------------------------------------------------------------+---------------------------------------------------------------------------------+

Enable Elasticsearch for autocomplete queries
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+------------------------------------------------------------------------------------+
| Configure Mattermost to use Elasticsearch for all             | - System Config path: **Environment > Elasticsearch**                              |
| autocompletion queries on users and channels using the        | - ``config.json`` setting: ``".Elasticsearchsettings.EnableAutocomplete: false",`` |
| latest index.                                                 | - Environment variable: ``MM_ELASTICSEARCHSETTINGS_ENABLEAUTOCOMPLETE``            |
|                                                               |                                                                                    |
| - **true**: Elasticsearch will be used for all autocompletion |                                                                                    |
|   queries on users and channels using the latest index.       |                                                                                    |
| - **false**: **(Default)** Database autocomplete is used.     |                                                                                    |
+---------------------------------------------------------------+------------------------------------------------------------------------------------+
| **Note**: Autocompletion results may be incomplete until a bulk index of the existing users and channels database is finished.                     |
+---------------------------------------------------------------+------------------------------------------------------------------------------------+

Post index replicas
~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+-------------------------------------------------------------------------------+
| The number of replicas to use for each post index.            | - System Config path: N/A                                                     |
|                                                               | - ``config.json`` setting: ``".Elasticsearchsettings.PostIndexReplicas: 1",`` |
| Numerical input. Default is 1.                                | - Environment variable: ``MM_ELASTICSEARCHSETTINGS_POSTINDEXREPLICAS``        |
+---------------------------------------------------------------+-------------------------------------------------------------------------------+
| **Important note**: If this setting is changed, the changed configuration only applies to newly-created indexes. To apply the change to       | 
| existing indexes, purge and rebuild the index after changing this setting.                                                                    |
+---------------------------------------------------------------+-------------------------------------------------------------------------------+

Post index shards
~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+-------------------------------------------------------------------------------+
| The number of shards to use for each post index.              | - System Config path: N/A                                                     |
|                                                               | - ``config.json`` setting: ``".Elasticsearchsettings.PostIndexShards: 1",``   |
| Numerical input. Default is **1**.                            | - Environment variable: ``MM_ELASTICSEARCHSETTINGS_POSTINDEXSHARDS``          |
+---------------------------------------------------------------+-------------------------------------------------------------------------------+
| **Important note**: If this setting is changed, the changed configuration only applies to newly-created indexes. To apply the change to       | 
| existing indexes, purge and rebuild the index after changing this setting.                                                                    |
+---------------------------------------------------------------+-------------------------------------------------------------------------------+

Channel index replicas
~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+----------------------------------------------------------------------------------+
| The number of replicas to use for each channel index.         | - System Config path: N/A                                                        |
|                                                               | - ``config.json`` setting: ``".Elasticsearchsettings.ChannelIndexReplicas: 1",`` |
| Numerical input. Default is **1**.                            | - Environment variable: ``MM_ELASTICSEARCHSETTINGS_CHANNELINDEXREPLICAS``        |
+---------------------------------------------------------------+----------------------------------------------------------------------------------+

Channel index shards
~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+----------------------------------------------------------------------------------+
| The number of shards to use for each channel index.           | - System Config path: N/A                                                        |
|                                                               | - ``config.json`` setting: ``".Elasticsearchsettings.ChannelIndexShards: 1",``   |
| Numerical input. Default is **1**.                            | - Environment variable: ``MM_ELASTICSEARCHSETTINGS_CHANNELINDEXSHARDS``          |
+---------------------------------------------------------------+----------------------------------------------------------------------------------+

User index replicas
~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+-------------------------------------------------------------------------------+
| The number of replicas to use for each user index.            | - System Config path: N/A                                                     |
|                                                               | - ``config.json`` setting: ``".Elasticsearchsettings.UserIndexReplicas: 1",`` |
| Numerical input. Default is **1**.                            | - Environment variable: ``MM_ELASTICSEARCHSETTINGS_USERINDEXREPLICAS``        |
+---------------------------------------------------------------+-------------------------------------------------------------------------------+

User index shards
~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+----------------------------------------------------------------------------------+
| The number of shards to use for each user index.              | - System Config path: N/A                                                        |
|                                                               | - ``config.json`` setting: ``".Elasticsearchsettings.UserIndexShards: 1",``      |
| Numerical input. Default is **1**.                            | - Environment variable: ``MM_ELASTICSEARCHSETTINGS_USERINDEXSHARDS``             |
+---------------------------------------------------------------+----------------------------------------------------------------------------------+

Aggregate search indexes
~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+----------------------------------------------------------------------------------------+
| Elasticsearch indexes older than the age specified by this    | - System Config path: N/A                                                              |
| setting, in days, will be aggregated during the daily         | - ``config.json`` setting: ``".Elasticsearchsettings.AggregatePostsAfterDays: 365",``  |
| scheduled job.                                                | - Environment variable: ``MM_ELASTICSEARCHSETTINGS_AGGREGATEPOSTSAFTERDAYS``           |
|                                                               |                                                                                        |
| Numerical input. Default is **365** days.                     |                                                                                        |
+---------------------------------------------------------------+----------------------------------------------------------------------------------------+
| **Note**: If you’re using `data retention <https://docs.mattermost.com/comply/data-retention-policy.html>`__ and                                       |
| `Elasticsearch <https://docs.mattermost.com/scale/elasticsearch.html>`__, configure this with a value greater than your data retention policy.         |
+---------------------------------------------------------------+----------------------------------------------------------------------------------------+

Post aggregator start time
~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+---------------------------------------------------------------------------------------------+
| The start time of the daily scheduled aggregator job.         | - System Config path: N/A                                                                   |
|                                                               | - ``config.json`` setting: ``".Elasticsearchsettings.PostsAggregatorJobStartTime: 03:00",`` | 
| Must be a 24-hour time stamp in the form ``HH:MM`` based on   | - Environment variable: ``MM_ELASTICSEARCHSETTINGS_POSTSAGGREGATORJOBSTARTTIME``            |
| the local time of the server.                                 |                                                                                             |
|                                                               |                                                                                             |
| Default is **03:00** (3 AM)                                   |                                                                                             |
+---------------------------------------------------------------+---------------------------------------------------------------------------------------------+

Index prefix
~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+--------------------------------------------------------------------------+
| The prefix added to the Elasticsearch index name.             | - System Config path: N/A                                                |
|                                                               | - ``config.json`` setting: ``".Elasticsearchsettings.IndexPrefix",``     |
|                                                               | - Environment variable: ``MM_ELASTICSEARCHSETTINGS_INDEXPREFIX``         |
+---------------------------------------------------------------+--------------------------------------------------------------------------+
| **Note**: When this setting is used, all Elasticsearch indexes created by Mattermost are given this prefix. You can set different        |
| prefixes so that multiple Mattermost deployments can share an Elasticsearch cluster without the index names colliding.                   |
+---------------------------------------------------------------+--------------------------------------------------------------------------+

Live indexing batch size
~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+-----------------------------------------------------------------------------------+
| The number of new posts batched together before they're       | - System Config path: N/A                                                         |
| added to the Elasticsearch index.                             | - ``config.json`` setting: ``".Elasticsearchsettings.LiveIndexingBatchSize: 1",`` |
|                                                               | - Environment variable: ``MM_ELASTICSEARCHSETTINGS_LIVEINDEXINGBATCHSIZE``        |
| Numerical input. Default is **1**.                            |                                                                                   |
+---------------------------------------------------------------+-----------------------------------------------------------------------------------+
| **Note**: It may be necessary to increase this value to avoid hitting the rate limit of your Elasticsearch cluster on installs handling           | 
| multiple messages per second.                                                                                                                     |    
+---------------------------------------------------------------+-----------------------------------------------------------------------------------+

Bulk indexing time window
~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+----------------------------------------------------------------------------------------------+
| The maximum time window, in seconds, for a batch of posts     | - System Config path: **Environment > Elasticsearch**                                        |
| being indexed by the Bulk Indexer. This setting serves as a   | - ``config.json`` setting: ``".Elasticsearchsettings.BulkIndexingTimeWindowSeconds: 3600",`` |
| performance optimization for installs with over               | - Environment variable: ``MM_ELASTICSEARCHSETTINGS_BULKINDEXINGTIMEWINDOWSECONDS``           |
|  ~10 million posts in the database.                           |                                                                                              |
|                                                               |                                                                                              |
| Numerical input in seconds. Default is **3600** seconds       |                                                                                              |
| (1 hour). Approximate this value based on the average number  |                                                                                              |
| of seconds for 2,000 posts to be added to the database on a   |                                                                                              |
| typical day in production.                                    |                                                                                              |
+---------------------------------------------------------------+----------------------------------------------------------------------------------------------+
| **Note**: Setting this value too low will cause bulk indexing jobs to run slowly.                                                                            |
+---------------------------------------------------------------+----------------------------------------------------------------------------------------------+

Request timeout
~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+------------------------------------------------------------------------------------+
| The timeout, in seconds, for Elasticsearch calls.             | - System Config path: N/A                                                          |
|                                                               | - ``config.json`` setting: ``".Elasticsearchsettings.RequestTimeoutSeconds :30",`` |
| Numerical input in seconds. Default is **30** seconds.        | - Environment variable: ``MM_ELASTICSEARCHSETTINGS_REQUESTTIMEOUTSECONDS``         |
+---------------------------------------------------------------+------------------------------------------------------------------------------------+

Trace
~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+--------------------------------------------------------------------------+
| Options for printing Elasticsearch trace errors.              | - System Config path: N/A                                                |
|                                                               | - ``config.json`` setting: ``".Elasticsearchsettings.Trace",``           |
| - **error**: Creates the error trace when initializing        | - Environment variable: ``MM_ELASTICSEARCHSETTINGS_TRACE``               |
|   the Elasticsearch client and prints any template creation   |                                                                          |
|   or search query that returns an error as part of the        |                                                                          |
|   error message.                                              |                                                                          |
| - **all**: Creates the three traces (error, trace and info)   |                                                                          |
|   for the driver and doesn’t print the queries because they   |                                                                          |
|   will be part of the trace log level of the driver.          |                                                                          |
| - **not specified**: **(Default)** No error trace is created. |                                                                          |
+---------------------------------------------------------------+--------------------------------------------------------------------------+
source/configure/developer-mode-configuration-settings.rst METASEP
:orphan:
:nosearch:

Configure developer mode by going to **System Console > Environment > Developer**, or by editing the ``config.json`` file as described in the following tables. Changes to configuration settings in this section require a server restart before taking effect.

Enable testing commands
~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------+--------------------------------------------------------------------------+
| Enable or disable the ``/test`` slash command.    | - System Config path: **Environment > DeveloperFlags**                   |
|                                                   | - ``config.json setting``: ``".ServiceSettings.EnableTesting": true",``  |
| - **true**: **(Default)** The ``/test`` slash     | - Environment variable: ``MM_SERVICESETTINGS_ENABLETESTING``             |
|   command is enabled to load test accounts        |                                                                          |
|   and test data.                                  |                                                                          |
| - **false**:  The ``/test`` slash command is      |                                                                          |
|   disabled.                                       |                                                                          |
+---------------------------------------------------+--------------------------------------------------------------------------+

Enable developer mode
~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+-----------------------------------------------+---------------------------------------------------------------------------+
| Enable or disable developer mode.             | - System Config path: **Environment > DeveloperFlags**                    |
|                                               | - ``config.json setting``: ``".ServiceSettings.EnableDeveloper": true",`` |
| - **true**: **(Default)** Javascript errors   | - Environment variable: ``MM_SERVICESETTINGS_ENABLEDEVELOPER``            |
|   are shown in a banner at the top of         |                                                                           |
|   Mattermost the user interface.              |                                                                           |
|   Not recommended for use in production.      |                                                                           |
| - **false**: Users are not alerted to         |                                                                           |
|   Javascript errors.                          |                                                                           |
+-----------------------------------------------+---------------------------------------------------------------------------+

Enable client performance debugging
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------+------------------------------------------------------------------------------+
| Enable or disable the ``/test`` slash command.    | - System Config path: **Environment > DeveloperFlags**                       |
|                                                   | - ``config.json setting``: ``".ServiceSettings.EnableDeveloper": false",``   |
| - **true**: **(Default)** The ``/test`` slash     | - Environment variable: ``MM_SERVICESETTINGS_ENABLEDEVELOPER``               |
|   command is enabled to load test accounts        |                                                                              |
|   and test data.                                  |                                                                              |
| - **false**:  The ``/test`` slash command is      |                                                                              |
|   disabled.                                       |                                                                              |
+---------------------------------------------------+------------------------------------------------------------------------------+
| See the `performance debugging <https://docs.mattermost.com/channels/channels-settings.html#performance-debugging>`__            |
| documentation to learn more.                                                                                                     |
+---------------------------------------------------+------------------------------------------------------------------------------+

Allow untrusted internal connections
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+-----------------------------------------------+-----------------------------------------------------------------------------------------------+
| Limit the ability for the Mattermost server   | - System Config path: **Environment > DeveloperFlags**                                        |
| to make untrusted requests within its local   | - ``config.json setting``: ``".ServiceSettings.AllowedUntrustedInternalConnections": "",``    |
| network. A request is considered “untrusted”  | - Environment variable: ``MM_SERVICESETTINGS_ALLOWUNTRUSTEDINTERNALCONNECTIONS``              |
| when it’s made on behalf of a client.         |                                                                                               |
+-----------------------------------------------+-----------------------------------------------------------------------------------------------+
| This setting is a whitelist of local network addresses that can be requested by the Mattermost server. It’s configured as a                   |
| whitespace-separated list of hostnames, IP addresses, and CIDR ranges that can be accessed.                                                   |
|                                                                                                                                               |
| Requests that can only be configured by System Admins are considered trusted and won't be affected by this setting. Trusted URLs include      |
| ones used for OAuth login or for sending push notifications.                                                                                  |
|                                                                                                                                               |
| The following features make untrusted requests and are affected by this setting:                                                              |
|                                                                                                                                               |
| - Integrations using webhooks, slash commands, or message actions. This prevents them from requesting endpoints within the local network.     |
| - Link previews. When a link to a local network address is posted in a chat message, this prevents a link preview from being displayed.       |
| - The local `image proxy <https://docs.mattermost.com/deploy/image-proxy.html>`__. If the local image proxy is enabled, images located on     |
|   the local network cannot be used by integrations or posted in chat messages.                                                                |
+-----------------------------------------------+-----------------------------------------------------------------------------------------------+
|                                                                                                                                               |
| Some examples of when you may want to modify this setting include:                                                                            |
|                                                                                                                                               |
| - When installing a plugin that includes its own images, such as `Matterpoll <https://github.com/matterpoll/matterpoll>`__, you'll need to    |
|   add the Mattermost server’s domain name to                                                                                                  |
|   this list.                                                                                                                                  |
| - When running a bot or webhook-based integration on your local network, you’ll need to add the hostname of the bot/integration to this list. |
| - If your network is configured in such a way that publicly-accessible web pages or images are accessed by the Mattermost server using        |
|   their internal IP address, the hostnames for those servers must be added to this list.                                                      |
+-----------------------------------------------+-----------------------------------------------------------------------------------------------+
| **Warning**: This setting is intended to prevent users located outside your local network from using the Mattermost server to request         |    
| confidential data from inside your network. Care should be used when configuring this setting to prevent unintended access to your local      |
| network.                                                                                                                                      |
+-----------------------------------------------+-----------------------------------------------------------------------------------------------+
| **Notes**:                                                                                                                                    |
|                                                                                                                                               |
| - The public IP of the Mattermost application server itself is also considered a reserved IP.                                                 |
| - Use whitespaces instead of commas to list the hostnames, IP addresses, or CIDR ranges.                                                      |
|   For example: ``webhooks.internal.example.com``, ``127.0.0.1``, or ``10.0.16.0/28``.                                                         |
| - IP address and domain name rules are applied before host resolution.                                                                        |
| - CIDR rules are applied after host resolution, and only CIDR rules require DNS resolution.                                                   |
| - Mattermost attempts to match IP addresses and hostnames without even resolving. If that fails, Mattermost resolve using the local resolver  |
|   (by reading the ``/etc/hosts`` file first), then checking for matching CIDR rules.                                                          |
|   For example, if the domain “webhooks.internal.example.com” resolves to the IP address ``10.0.16.20``, a webhook with the URL                |
|   ``https://webhooks.internal.example.com/webhook`` can be whitelisted using ``webhooks.internal.example.com``, or ``10.0.16.16/28``,         |
|   but not ``10.0.16.20``.                                                                                                                     |
+-----------------------------------------------+-----------------------------------------------------------------------------------------------+
source/configure/deprecated-configuration-settings.rst METASEP
Deprecated configuration settings
=================================

Bleve settings
--------------

Bulk Indexing Time Window Seconds
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*Removed in May 16, 2022 release*

This setting isn't available in the System Console and can only be set in ``config.json``.

Determines the maximum time window for a batch of posts being indexed by the Bulk Indexer. This setting serves as a performance optimization for installs with over ~10 million posts in the database. You can approximate this value based on the average number of seconds for 2,000 posts to be added to the database on a typical day in production. Setting this value too low will cause bulk indexing jobs to run slowly.

+-------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"BulkIndexingTimeWindowSeconds": 3600`` with numerical input.   |
+-------------------------------------------------------------------------------------------------------------+

Elasticsearch settings
----------------------

Bulk Indexing Time Window
~~~~~~~~~~~~~~~~~~~~~~~~~~

*Removed in May 16, 2022 release*

This setting isn't available in the System Console and can only be set in ``config.json``.

Determines the maximum time window for a batch of posts being indexed by the Bulk Indexer. This setting serves as a performance optimization for installs with over ~10 million posts in the database. You can approximate this value based on the average number of seconds for 2,000 posts to be added to the database on a typical day in production. Setting this value too low will cause bulk indexing jobs to run slowly.

+-----------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"BulkIndexingTimeWindowSeconds": 3600`` with numerical input.       |
+-----------------------------------------------------------------------------------------------------------------+

Service settings
----------------

Enable reliable websockets
~~~~~~~~~~~~~~~~~~~~~~~~~~

*This configuration setting has been deprecated, and the ability to buffer messages during a connection loss has been promoted to general availability from Mattermost v6.3. This setting is enabled for older clients to maintain backwards compatibility.*

This setting isn't available in the System Console and can only be set in ``config.json``.

Enable this setting to make websocket messages more reliable by buffering messages during a connection loss and then re-transmitting all unsent messages when the connection is revived. 

+---------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableReliableWebsockets": true`` with options ``true`` and ``false``. |
+---------------------------------------------------------------------------------------------------------------------+

Data prefetch
~~~~~~~~~~~~~

*Removed in February 16, 2021 release*

**True**: Messages in all unread channels are pre-loaded from the server whenever the client reconnects to the network to eliminate loading time when users switch to unread channels.

**False**: Messages are fetched on-demand from the server when users switch channels.

+---------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ExperimentalDataPrefetch": true`` with options ``true`` and ``false``. |
+---------------------------------------------------------------------------------------------------------------------+

Segment write key
~~~~~~~~~~~~~~~~~

*Removed in March 16, 2017 release*

For deployments seeking additional tracking of system behavior using Segment.com, you can enter a Segment ``WRITE_KEY`` using this field. This value works like a tracking code and is used in client-side JavaScript and will send events to Segment.com attributed to the account you used to generate the ``WRITE_KEY``.

+--------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"SegmentDeveloperKey": ""`` with string input. |
+--------------------------------------------------------------------------------------------+

Limit access to config settings prior to login
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*Removed in December 16, 2018 release*

Enable this setting to limit the number of config settings sent to users prior to login.

Supported for Mattermost server v5.1.0 and later, and Mattermost Mobile apps v1.10.0 and later.

+-----------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ExperimentalLimitClientConfig": "false"`` with options ``true`` and ``false``. |
+-----------------------------------------------------------------------------------------------------------------------------+

Disable legacy MFA API endpoint
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. tabs::

   .. tab:: Mattermost v6.0 onwards
      
      Deprecated. Not used in Mattermost v6.0 and later.

   .. tab:: Mattermost v5.39 and earlier
      
      This setting isn't available in the System Console and can only be set in ``config.json``.

      **True**: Disables the legacy ``checkMfa`` endpoint, which is only required for Mattermost mobile apps v1.16 or earlier when using multi-factor authentication (MFA). Recommended to set to ``true`` for additional security hardening.

      **False**: Keeps the legacy ``checkMfa`` endpoint enabled to support mobile versions 1.16 and earlier. Keeping the endpoint enabled creates an information disclosure about whether a user has set up MFA.

      +--------------------------------------------------------------------------------------------------------------+
      | This feature's ``config.json`` setting is ``"DisableLegacyMFA": true,`` with options ``true`` and ``false``. |
      +--------------------------------------------------------------------------------------------------------------+

Database Settings
------------------

At Rest Encrypt Key
~~~~~~~~~~~~~~~~~~~

*Removed in August 23, 2018 release*

This setting isn't available in the System Console and can only be set in ``config.json``. It's a legacy setting used to encrypt data stored at rest in the database, and no fields are encrypted using ``AtRestEncryptKey``. 

A 32-character key for encrypting and decrypting sensitive fields in the database. When using high availability, this value must be identical in each instance of Mattermost.

+------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AtRestEncryptKey": ""`` with string input.  |
+------------------------------------------------------------------------------------------+

Amazon S3 bucket endpoint
~~~~~~~~~~~~~~~~~~~~~~~~~

*Removed in November 16th, 2016 release*

Set an endpoint URL for Amazon S3 buckets.

+-----------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AmazonS3BucketEndpoint": ""`` with string input. |
+-----------------------------------------------------------------------------------------------+

Amazon S3 Location Constraint
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*Removed in November 16th, 2016 release*

**True**: S3 region is location constrained.

**False**: S3 region is not location constrained.

+------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AmazonS3LocationConstraint": false`` with options ``true`` and ``false``. |
+------------------------------------------------------------------------------------------------------------------------+

Amazon S3 lowercase bucket
~~~~~~~~~~~~~~~~~~~~~~~~~~~

*Removed in November 16th, 2016 release*

**True**: S3 bucket names are fully lowercase.

**False**: S3 bucket names may contain uppercase and lowercase letters.

+---------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AmazonS3LowercaseBucket": false`` with options ``true`` and ``false``. |
+---------------------------------------------------------------------------------------------------------------------+

Users and teams
---------------

Enable team directory
~~~~~~~~~~~~~~~~~~~~~

*Removed in May 16th, 2016 release*

**True**: Teams that are configured to appear in the team directory will appear on the system main page. Teams can configure this setting from **Team Settings > Include this team in the Team Directory**.

**False**: Team directory on the system main page is disabled.

+---------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableTeamListing": false`` with options ``true`` and ``false``. |
+---------------------------------------------------------------------------------------------------------------+

Allow Team Admins to edit others' posts
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. tabs::

   .. tab:: Mattermost v6.0 onwards
      
      Deprecated. Not used in Mattermost v6.0 and later.

   .. tab:: Mattermost v5.39 and earlier
      
      This permission is stored in the database and can be modified using the System Console user interface.

      **True**: Team Admins and System Admins can edit other users' posts.

      **False**: Only System Admins can edit other users' posts.

      .. note::

         System Admins and Team Admins can always delete other users' posts. This setting is only available for Team Edition servers. Enterprise Edition servers can use `Advanced Permissions <https://docs.mattermost.com/onboard/advanced-permissions.html>`__ to configure this permission.

Enable team creation
~~~~~~~~~~~~~~~~~~~~~

.. tabs::

   .. tab:: Mattermost v6.0 onwards
      
      Deprecated. Not used in Mattermost v6.0 and later.

   .. tab:: Mattermost v5.39 and earlier
      
      After upgrading to v4.9 (released April 16, 2018), changing this ``config.json`` value no longer takes effect because this permission has been migrated to the database. This permission can be modified using the System Console user interface.

      **True**: Ability to create a new team is enabled for all users.

      **False**: Only System Admins can create teams from the team selection page. The **Create A New Team** button is hidden.

      +---------------------------------------------------------------------------------------------------------------+
      | This feature's ``config.json`` setting is ``"EnableTeamCreation": true`` with options ``true`` and ``false``. |
      +---------------------------------------------------------------------------------------------------------------+

SAML 2.0
--------

Use new SAML library
~~~~~~~~~~~~~~~~~~~~

*Removed in December 16, 2020 release*

**True**: Enable an updated SAML Library, which does not require the XML Security Library (xmlsec1) to be installed.

**False**: Continue using the existing implementation which uses the XML Security Library (xmlsec1).

+---------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"UseNewSAMLLibrary": false`` with options ``true`` and ``false``. |
+---------------------------------------------------------------------------------------------------------------+

Legacy sidebar
--------------

Enable legacy sidebar
~~~~~~~~~~~~~~~~~~~~~

.. tabs::

   .. tab:: Mattermost v6.0 onwards
      
      Deprecated. Not used in Mattermost v6.0 and later.

   .. tab:: Mattermost v5.39 and earlier
      
      *Not available in Mattermost Cloud*

      This setting re-enables the legacy sidebar functionality for all users on this server. We strongly recommend System Admins disable this setting so users can access `enhanced sidebar features <https://mattermost.com/blog/custom-collapsible-channel-categories/>`__, including custom, collapsible channel categories, drag and drop, unread filtering, channel sorting options, and more.

      **False**: Users can access all new channel sidebar features, including custom, collapsible channel categories, drag and drop, unread filtering, channel sorting options, and more. See `the documentation <https://docs.mattermost.com/messaging/organizing-your-sidebar.html>`_ for more information about these features.

      **True**: When enabled, the legacy sidebar is enabled for all users on this server and users cannot access any new channel sidebar features. The legacy channel sidebar is scheduled to be deprecated, and is only recommended if your deployment is experiencing bugs or other issues with the new channel sidebar.

      +----------------------------------------------------------------------------------------------------------------+
      | This feature's ``config.json`` setting is ``"EnableLegacySidebar": false`` with options ``true`` or ``false``. |
      +----------------------------------------------------------------------------------------------------------------+

Experimental sidebar features
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*Deprecated. Not used in Mattermost v5.32 and later*

.. note::
   This experimental configuration setting has been deprecated, and the ability to organize channels in the sidebar has been promoted to general availability from Mattermost v5.32. See the `Organizing Your Sidebar documentation <https://docs.mattermost.com/messaging/organizing-your-sidebar.html#customizing-your-sidebar>`__ for details on customizing the sidebar. 

**Disabled**: Users cannot access the experimental channel sidebar feature set.

**Enabled (Default On)**: Enables the experimental sidebar features for all users on this server. Users can disable the features in **Settings > Sidebar > Experimental Sidebar Features**. Features include custom collapsible channel categories, drag and drop to reorganize channels, and unread filtering.

**Enabled (Default Off)**: Users must enable the experimental sidebar features in **Settings**.

+-------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ExperimentalChannelSidebarOrganization": off`` with options ``off``, ``default_on`` and ``default_off``. |
+-------------------------------------------------------------------------------------------------------------------------------------------------------+

Sidebar organization
~~~~~~~~~~~~~~~~~~~~

.. tabs::

   .. tab:: Mattermost v6.0 onwards
      
      Deprecated. Not used in Mattermost v6.0 and later.

   .. tab:: Mattermost v5.39 and earlier
      
      *Not available in Mattermost Cloud*

      This setting applies to the legacy sidebar only. You must enable the `Enable Legacy Sidebar <https://docs.mattermost.com/configure/configuration-settings.html#enable-legacy-sidebar>`__ configuration setting to see and enable this functionality in the System Console.

      .. note::

         This experimental setting is not recommended for production environments. The new channel sidebar matches and exceeds the feature set offered by this configuration setting.

      We strongly recommend that you leave the **Enable Legacy Sidebar** configuration setting disabled so users can access new channel sidebar features, including custom, collapsible channel categories, drag and drop, unread filtering, channel sorting options, and more. See `the channel sidebar documentation <https://docs.mattermost.com/messaging/organizing-your-sidebar.html#organizing-your-sidebar>`__ for more information about these features.

      **True**: Enables channel sidebar organization options in **Settings > Sidebar > Channel grouping and sorting**. Includes options for grouping unread channels, sorting channels by most recent post, and combining all channel types into a single list.

      **False**: Hides the channel sidebar organization options in **Settings > Sidebar > Channel grouping and sorting**.

      +-----------------------------------------------------------------------------------------------------------------------------+
      | This feature's ``config.json`` setting is ``"ExperimentalChannelOrganization": false`` with options ``true`` and ``false``. |
      +-----------------------------------------------------------------------------------------------------------------------------+

Enable X to leave channels from left hand sidebar
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. tabs::

   .. tab:: Mattermost v6.0 onwards
      
      Deprecated. Not used in Mattermost v6.0 and later.

   .. tab:: Mattermost v5.39 and earlier
      
      *Not available in Mattermost Cloud*

      This setting applies to the legacy sidebar only. You must first enable the `Enable Legacy Sidebar <https://docs.mattermost.com/configure/configuration-settings.html#enable-legacy-sidebar>`__ configuration setting if you want to see and enable this functionality in the System Console.

      .. note::

         This experimental setting is not recommended for production environments. The new channel sidebar matches and exceeds the feature set offered by this configuration setting.

      We strongly recommend that you leave the **Enable Legacy Sidebar** configuration setting disabled so users can access new channel sidebar features, including custom, collapsible channel categories, drag and drop, unread filtering, channel sorting options, and more. See `the channel sidebar documentation <https://docs.mattermost.com/messaging/organizing-your-sidebar.html>`_ for more information about these features.

      **True**: Users can leave public and private channels by clicking the "x" beside the channel name.

      **False**: Users must use the **Leave Channel** option from the channel menu to leave channels.

      +---------------------------------------------------------------------------------------------------------------------------+
      | This feature's ``config.json`` setting is ``"EnableXToLeaveChannelsFromLHS": false`` with options ``true`` and ``false``. |
      +---------------------------------------------------------------------------------------------------------------------------+

Autoclose direct messages in sidebar
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. tabs::

   .. tab:: Mattermost v6.0 onwards
      
      Deprecated. Not used in Mattermost v6.0 and later.

   .. tab:: Mattermost v5.39 and earlier
      
      *Not available in Mattermost Cloud*

      This setting applies to the legacy sidebar only. You must enable the `Enable Legacy Sidebar <https://docs.mattermost.com/configure/configuration-settings.html#enable-legacy-sidebar>`__ configuration setting to see and enable this functionality in the System Console.

      .. note::

         This experimental setting is not recommended for production environments. The new channel sidebar matches and exceeds the feature set offered by this configuration setting.

      We strongly recommend that you leave the **Enable Legacy Sidebar** configuration setting disabled so users can access new channel sidebar features, including custom, collapsible channel categories, drag and drop, unread filtering, channel sorting options, and more. See `the channel sidebar documentation <https://docs.mattermost.com/messaging/organizing-your-sidebar.html>`_ for more information about these features.

      **True**: By default, direct message conversations with no activity for 7 days will be hidden from the sidebar. Users can disable this in **Settings > Sidebar**.

      **False**: Conversations remain in the sidebar until they are manually closed.

      +-----------------------------------------------------------------------------------------------------------------------+
      | This feature's ``config.json`` setting is ``"CloseUnusedDirectMessages": false`` with options ``true`` and ``false``. |
      +-----------------------------------------------------------------------------------------------------------------------+

Town Square
-----------

Town Square is hidden in left hand sidebar
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. tabs::

   .. tab:: Mattermost v6.0 onwards
      
      Deprecated. Not used in Mattermost v6.0 and later.

   .. tab:: Mattermost v5.39 and earlier
      
      Available in legacy Enterprise Edition E10 and higher.

      This setting applies to the legacy sidebar only. You must enable the `Enable Legacy Sidebar <https://docs.mattermost.com/configure/configuration-settings.html#enable-legacy-sidebar>`__ configuration setting to see and enable this functionality in the System Console.

      .. note::

         This experimental setting is not recommended for production environments. The new channel sidebar matches and exceeds the feature set offered by this configuration setting.

      We strongly recommend that you leave the **Enable Legacy Sidebar** configuration setting disabled so users can access new channel sidebar features, including custom, collapsible channel categories, drag and drop, unread filtering, channel sorting options, and more. See `the channel sidebar documentation <https://docs.mattermost.com/messaging/organizing-your-sidebar.html>`_ for more information about these features.

      **True**: Hides Town Square in the left-hand sidebar if there are no unread messages in the channel.

      **False**: Town Square is always visible in the left-hand sidebar even if all messages have been read.

      +-----------------------------------------------------------------------------------------------------------------------------+
      | This feature's ``config.json`` setting is ``"ExperimentalHideTownSquareinLHS": false`` with options ``true`` and ``false``. |
      +-----------------------------------------------------------------------------------------------------------------------------+

Town Square is read-only
~~~~~~~~~~~~~~~~~~~~~~~~

.. tabs::

   .. tab:: Mattermost v6.0 onwards
      
      In Mattermost v.6.0, this feature has been deprecated in favor of `channel moderation <https://docs.mattermost.com/manage/team-channel-members.html#channel-moderation>`__ which allows you to set any channel as read-only, including Town Square.

   .. tab:: Mattermost v5.39 and earlier
      
      Available in legacy Enterprise Edition E10 and higher.

      **True**: Only System Admins can post in Town Square. Other members are not able to post, reply, upload files, react using emojis,  pin messages to Town Square, nor are they able to change the channel name, header, or purpose.

      **False**: Anyone can post in Town Square.
  
      +------------------------------------------------------------------------------------------------------------------------------+
      | This feature's ``config.json`` setting is ``"ExperimentalTownSquareIsReadOnly": false`` with options ``true`` and ``false``. |
      +------------------------------------------------------------------------------------------------------------------------------+

Custom emoji
------------

Restrict custom emoji creation
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. tabs::

   .. tab:: Mattermost v6.0 onwards
      
      Deprecated. Not used in Mattermost v6.0 and later.

   .. tab:: Mattermost v5.39 and earlier
      
      After upgrading to v4.9 (released April 16th, 2018) or later, changing the ``config.json`` value no longer has an effect because this setting has been migrated to the database. This setting can be modified using the System Console user interface.

      Available in legacy Enterprise Edition E10 and E20.

      **Allow everyone to create custom emoji**: Allows everyone to add custom emojis from the emoji picker.

      **Allow System and Team Admins to create custom emoji**: The **Custom Emoji** option is hidden from the emoji picker for users who are not System or Team Admins.

      **Only allow System Admins to create custom emoji**: The **Custom Emoji** option is hidden from the emoji picker for users who are not System Admins.

      +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
      | This feature's ``config.json`` setting is ``"RestrictCustomEmojiCreation": "all"`` with options ``"all"``, ``"admin"``, and ``"system_admin"`` for the above settings, respectively. |
      +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Timezone
--------

Timezone
~~~~~~~~

*This configuration setting has been promoted to General Availability and is no longer configurable in Mattermost v6.0 and later.*

Select the timezone used for timestamps in the user interface and email notifications.

**True**: The **Timezone** setting is visible in the Settings and a timezone is automatically assigned in the next active session.

**False**: The **Timezone** setting is hidden in the Settings.

+------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ExperimentalTimezone": true`` with options ``true`` and ``false``.  |
+------------------------------------------------------------------------------------------------------------------+

High Availability
-----------------

Inter-node listen address
~~~~~~~~~~~~~~~~~~~~~~~~~

*Deprecated. Not used in Mattermost v4.0 and later*

The address the Mattermost Server will listen on for inter-node communication. When setting up your network you should secure the listen address so that only machines in the cluster have access to that port. This can be done in different ways, for example, using IPsec, security groups, or routing tables.

+-----------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"InterNodeListenAddress": ":8075"`` with string input.  |
+-----------------------------------------------------------------------------------------------------+

Inter-Node URLs
~~~~~~~~~~~~~~~

*Deprecated. Not used in Mattermost v4.0 and later*

A list of all the machines in the cluster, such as ``["http://10.10.10.2", "http://10.10.10.4"]``. It is recommended to use the internal IP addresses so all the traffic can be secured.

+--------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"InterNodeUrls": []`` with string array input consisting of the machines in the cluster. |
+--------------------------------------------------------------------------------------------------------------------------------------+

REST API V3
-----------

Allow use of API v3 endpoints
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*Removed in June 16, 2018 release*

Set to ``false`` to disable all version 3 endpoints of the REST API. Integrations that rely on API v3 will fail and can then be identified for migration to API v4. API v3 is deprecated and will be removed in the near future. See https://api.mattermost.com for details.

+---------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableAPIv3": false`` with options ``true`` and ``false``. |
+---------------------------------------------------------------------------------------------------------+

Integrations
------------

Restrict managing integrations to Admins
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. tabs::

   .. tab:: Mattermost v6.0 onwards
      
      Deprecated. Not used in Mattermost v6.0 and later.

   .. tab:: Mattermost v5.39 and earlier
      
      After upgrading to v4.9 (released April 16th, 2018) or later, changing the ``config.json`` value no longer has an effect because this setting has been migrated to the database. This setting can be modified using the System Console user interface.

      Available in legacy Enterprise Edition E10 and E20.

**True**: Webhooks and slash commands can only be created, edited, and viewed by Team and System Admins, and OAuth 2.0 applications by System Admins. Integrations are available to all users after they have been created by the Admin.

**False**: Any team members can create webhooks, slash commands` and OAuth 2.0 applications from **Product menu > Integrations**.

.. note::
  OAuth 2.0 applications can be authorized by all users if they have the **Client ID** and **Client Secret** for an app setup on the server.

+------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableOnlyAdminIntegrations": true`` with options ``true`` and ``false``. |
+------------------------------------------------------------------------------------------------------------------------+

Policy
------

*Removed in June 16, 2018 release*

.. note:: 
  
   Permission policy settings are available in Enterprise Edition E10 and E20. From v5.0, these settings are found in the `Advanced Permissions <https://docs.mattermost.com/onboard/advanced-permissions.html>`__ page instead of configuration settings.

Enable sending team invites from
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*Removed in June 16, 2018 release*

.. note:: 

   From v5.0 this has been replaced by advanced permissions which offers Admins a way to restrict actions in Mattermost to authorized users only. See the `Advanced Permissions documentation <https://docs.mattermost.com/onboard/advanced-permissions.html>`_ for more details.

Set policy on who can invite others to a team using the **Send Email Invite**, **Get Team Invite Link**, and **Add Members to Team** options on the product menu. If **Get Team Invite Link** is used to share a link, you can expire the invite code from **Team Settings > Invite Code** after the desired users have joined the team. Options include:

**All team members**: Allows any team member to invite others using an email invitation, team invite link, or by adding members to the team directly.

**Team and System Admins**: Hides the email invitation, team invite link, and the add members to team buttons in the product menu from users who are not Team Admins or System Admins.

**System Admins**: Hides the email invitation, team invite link, and add members to team buttons in the product menu from users who are not System Admins.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"RestrictTeamInvite": "all"`` with options ``"all"``, ``"team_admin"``, and ``"system_admin"`` for the above settings, respectively. |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable public channel creation for
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*Removed in June 16, 2018 release*

.. note:: 

   From v5.0 this has been replaced by advanced permissions which offers Admins a way to restrict actions in Mattermost to authorized users only. See the `Advanced Permissions documentation <https://docs.mattermost.com/onboard/advanced-permissions.html>`_ for more details.

Restrict the permission level required to create public channels.

**All team members**: Allow all team members to create public channels.

**Team Admins and System Admins**: Restrict creating public channels to Team Admins and System Admins.

**System Admins**: Restrict creating public channels to System Admins.

+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"RestrictPublicChannelCreation": "all"`` with options ``"all"``, ``"team_admin"``, and ``"system_admin"`` for the above settings, respectively. |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable public channel renaming for
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*Removed in June 16, 2018 release*

.. note:: 

   From v5.0 this has been replaced by advanced permissions which offers Admins a way to restrict actions in Mattermost to authorized users only. See the `Advanced Permissions documentation <https://docs.mattermost.com/onboard/advanced-permissions.html>`_ for more details.

Restrict the permission level required to rename and set the header or purpose for Public channels.

**All channel members**: Allow all channel members to rename Public channels.

**Channel Admins, Team Admins, and System Admins**: Restrict renaming public channels to Channel Admins, Team Admins, and System Admins who are members of the channel.

**Team Admins and System Admins**: Restrict renaming public channels to Team Admins and System Admins who are members of the channel.

**System Admins**: Restrict renaming public channels to System Admins who are members of the channel.

+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"RestrictPublicChannelManagement": "all"`` with options ``"all"``, ``"channel_admin"``, ``"team_admin"``, and ``"system_admin"`` for the above settings, respectively. |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable public channel deletion for
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*Removed in June 16, 2018 release*

.. note:: 

   From v5.0 this has been replaced by advanced permissions which offers Admins a way to restrict actions in Mattermost to authorized users only. See the `Advanced Permissions documentation <https://docs.mattermost.com/onboard/advanced-permissions.html>`_ for more details.

Restrict the permission level required to delete Public channels. Deleted channels can be recovered from the database using a `command line tool <https://docs.mattermost.com/manage/command-line-tools.html>`__.

**All channel members**: Allow all channel members to delete public channels.

**Channel Admins, Team Admins, and System Admins**: Restrict deleting public channels to Channel Admins, Team Admins, and System Admins who are members of the channel.

**Team Admins and System Admins**: Restrict deleting public channels to Team Admins and System Admins who are members of the channel.

**System Admins**: Restrict deleting public channels to System Admins who are members of the channel.

+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"RestrictPublicChannelDeletion": "all"`` with options ``"all"``, ``"channel_admin"``, ``"team_admin"``, and ``"system_admin"`` for the above settings, respectively. |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable private channel creation for
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*Removed in June 16, 2018 release*

.. note:: 

   From v5.0 this has been replaced by advanced permissions which offers Admins a way to restrict actions in Mattermost to authorized users only. See the `Advanced Permissions documentation <https://docs.mattermost.com/onboard/advanced-permissions.html>`_ for more details.

Restrict the permission level required to create private channels.

**All team members**: Allow all team members to create private channels.

**Team Admins and System Admins**: Restrict creating private channels to Team Admins and System Admins.

**System Admins**: Restrict creating private channels to System Admins.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"RestrictPrivateChannelCreation": "all"`` with options ``"all"``, ``"team_admin"``, and ``"system_admin"`` for the above settings, respectively. |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable private channel renaming for
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*Removed in June 16, 2018 release*

.. note:: 

   From v5.0 this has been replaced by advanced permissions which offers Admins a way to restrict actions in Mattermost to authorized users only. See the `Advanced Permissions documentation <https://docs.mattermost.com/onboard/advanced-permissions.html>`_ for more details.

Restrict the permission level required to rename and set the header or purpose for Private channels.

**All channel members**: Allow all channel members to rename private channels.

**Channel Admins, Team Admins, and System Admins**: Restrict renaming private channels to Channel Admins, Team Admins, and System Admins who are members of the private channel.

**Team Admins and System Admins**: Restrict renaming private channels to Team Admins and System Admins who are members of the private channel.

**System Admins**: Restrict renaming private channels to System Admins who are members of the private channel.

+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"RestrictPrivateChannelManagement": "all"`` with options ``"all"``, ``"channel_admin"``, ``"team_admin"``, and ``"system_admin"`` for the above settings, respectively. |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable managing of private channel members for
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*Removed in June 16, 2018 release*

.. note:: 

   From v5.0 this has been replaced by advanced permissions which offers Admins a way to restrict actions in Mattermost to authorized users only. See the `Advanced Permissions documentation <https://docs.mattermost.com/onboard/advanced-permissions.html>`_ for more details.

Set policy on who can add and remove members from Private channels.

**All team members**: Allow all team members to add and remove members.

**Team Admins, Channel Admins, and System Admins**: Allow only Team Admins, Channel Admins, and System Admins to add and remove members.

**Team Admins, and System Admins**: Allow only Team Admins and System Admins to add and remove members.

**System Admins**: Allow only System Admins to add and remove members.

+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"RestrictPrivateChannelManageMembers": "all"`` with options ``"all"``, ``"channel_admin"``, ``"team_admin"``, and ``"system_admin"`` for the above settings, respectively. |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable private channel deletion for
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*Removed in June 16, 2018 release*

.. note:: 

   From v5.0 this has been replaced by advanced permissions which offers Admins a way to restrict actions in Mattermost to authorized users only. See the `Advanced Permissions documentation <https://docs.mattermost.com/onboard/advanced-permissions.html>`_ for more details.

Restrict the permission level required to delete Private channels. Deleted channels can be recovered from the database using a `command line tool <https://docs.mattermost.com/manage/command-line-tools.html>`__.

**All channel members**: Allow all channel members to delete private channels.

**Channel Admins, Team Admins, and System Admins**: Restrict deleting private channels to Channel Admins, Team Admins, and System Admins who are members of the Private channel.

**Team Admins and System Admins**: Restrict deleting private channels to Team Admins and System Admins who are members of the Private channel.

**System Admins**: Restrict deleting private channels to System Admins who are members of the private channel.

+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"RestrictPrivateChannelDeletion": "all"`` with options ``"all"``, ``"channel_admin"``, ``"team_admin"``, and ``"system_admin"`` for the above settings, respectively. |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Allow which users to delete messages
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*Removed in June 16, 2018 release*

.. note:: 

   From v5.0 this has been replaced by advanced permissions which offers Admins a way to restrict actions in Mattermost to authorized users only. See the `Advanced Permissions documentation <https://docs.mattermost.com/onboard/advanced-permissions.html>`_ for more details.

Restrict the permission level required to delete messages. Team Admins, Channel Admins, and System Admins can delete messages only in channels where they are members. Messages can be deleted any time.

**Message authors can delete their own messages, and Administrators can delete any message**: Allow authors to delete their own messages, and allow Team Admins, Channel Admins, and System Admins to delete any message.

**Team Admins and System Admins**: Allow only Team Admins and System Admins to delete messages.

**System Admins**: Allow only System Admins to delete messages.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"RestrictPostDelete": "all"`` with options ``"all"``, ``"team_admin"``, and ``"system_admin"`` for the above settings, respectively. |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Allow users to edit their messages
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*Removed in June 16, 2018 release*

.. note:: 

   From v5.0 this has been replaced by advanced permissions which offers Admins a way to restrict actions in Mattermost to authorized users only. See the `Advanced Permissions documentation <https://docs.mattermost.com/onboard/advanced-permissions.html>`_ for more details.

Set the time limit that users have to edit their messages after posting.

**Any time**: Allow users to edit their messages at any time after posting.

**Never**: Do not allow users to edit their messages.

**{n} seconds after posting**: Users can edit their messages within the specified time limit after posting. The time limit is applied using the ``config.json`` setting ``PostEditTimeLimit`` described below.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AllowEditPost": "always"`` with options ``"always"``, ``"never"``, and ``"time_limit"`` for the above settings, respectively. |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Post edit time limit
~~~~~~~~~~~~~~~~~~~~

When post editing is permitted, setting this to ``-1`` allows editing any time, and setting this to a positive integer restricts editing time in seconds. If post editing is disabled, this setting does not apply.

+--------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"PostEditTimeLimit": -1`` with numerical input.      |
+--------------------------------------------------------------------------------------------------+

Images
------

Attachment thumbnail width
~~~~~~~~~~~~~~~~~~~~~~~~~~~

*Removed in July 16th, 2017 release*

Width of thumbnails generated from uploaded images. Updating this value changes how thumbnail images render in future, but does not change images created in the past.

+-------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ThumbnailWidth": 120`` with numerical input. |
+-------------------------------------------------------------------------------------------+

Attachment thumbnail height
~~~~~~~~~~~~~~~~~~~~~~~~~~~

*Removed in July 16th, 2017 release*

Height of thumbnails generated from uploaded images. Updating this value changes how thumbnail images render in future, but does not change images created in the past.

+--------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ThumbnailHeight": 100`` with numerical input. |
+--------------------------------------------------------------------------------------------+

Image preview width
~~~~~~~~~~~~~~~~~~~

*Removed in July 16th, 2017 release*

Maximum width of preview image. Updating this value changes how preview images render in future, but does not change images created in the past.

+------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"PreviewWidth": 1024`` with numerical input. |
+------------------------------------------------------------------------------------------+

Image preview height
~~~~~~~~~~~~~~~~~~~~

*Removed in July 16th, 2017 release*

Maximum height of preview image. Setting this value to ``0`` instructs Mattermost to auto-size the preview image height based on the source image aspect ratio and the preview image width. Updating this value changes how preview images render in future, but does not change images created in the past.

+----------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"PreviewHeight": 0`` with numerical input. |
+----------------------------------------------------------------------------------------+

Profile picture width
~~~~~~~~~~~~~~~~~~~~~

*Removed in July 16th, 2017 release*

The width to which profile pictures are resized after being uploaded via **Account Settings > Profile**.

+-----------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ProfileWidth": 128`` with numerical input. |
+-----------------------------------------------------------------------------------------+

Profile picture height
~~~~~~~~~~~~~~~~~~~~~~

*Removed in July 16th, 2017 release*

The height to which profile pictures are resized after being uploaded via **Account Settings > Profile**.

+------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ProfileHeight": 128`` with numerical input. |
+------------------------------------------------------------------------------------------+

Experimental display settings
-----------------------------

Supported timezones path
~~~~~~~~~~~~~~~~~~~~~~~~~

*Removed in April 16, 2019 release*

Set the path of the JSON file that lists supported timezones when ``ExperimentalTimezone`` is set to ``true``.

The file must be in the same directory as your ``config.json`` file if you set a relative path. Defaults to ``timezones.json``.

+-----------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"SupportedTimezonesPath": "timezones.json"`` with string input.     |
+-----------------------------------------------------------------------------------------------------------------+

source/configure/database-configuration-settings.rst METASEP
:orphan:
:nosearch:

Configure the database environment in which Mattermost is deployed by going to **System Console > Environment > Database**, or by editing the ``config.json`` file as described in the following tables. Changes to configuration settings in this section require a server restart before taking effect.

Driver name
~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+--------------------------------------------------------------------------+
| The type of database. Can be either:                          | - System Config path: N/A                                                |
|                                                               | - ``config.json`` setting: ``".SqlSettings.DriverName",``                |
| - **mysql**: **(Default)** Enables driver to MySQL database.  | - Environment variable: ``MM_SQLSETTINGS_DRIVERNAME``                    |
| - **postgres**: Enables driver to PostgreSQL database.        |                                                                          |
+---------------------------------------------------------------+--------------------------------------------------------------------------+

Data source
~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+--------------------------------------------------------------------------+
| The connection string to the master database.                 | - System Config path: N/A                                                |
|                                                               | - ``config.json`` setting: ``".SqlSettings.DataSource",``                |
| String input.                                                 | - Environment variable: ``MM_SQLSETTINGS_DATASOURCE``                    |
|                                                               |                                                                          |
+---------------------------------------------------------------+--------------------------------------------------------------------------+
| To enable SSL:                                                                                                                           |
|                                                                                                                                          |
| - Add ``&tls=true`` to your database connection string if your SQL driver supports it.                                                   |   
| - Add ``&tls=skip-verify`` if you use self-signed certificates.                                                                          |
+---------------------------------------------------------------+--------------------------------------------------------------------------+
| **MySQL databases**                                                                                                                      |
|                                                                                                                                          |
| When **Driver Name** is set to ``mysql``, using ``collation`` is recommended over using ``charset``.                                     |
|                                                                                                                                          |
| To specify collation:                                                                                                                    |
|                                                                                                                                          |
| .. code-block:: none                                                                                                                     |
|                                                                                                                                          |
|   "SqlSettings": {                                                                                                                       |
|       "DataSource":                                                                                                                      |
|   "<user:pass>@<servername>/mattermost?charset=utf8mb4,utf8&collation=utf8mb4_general_ci",                                               |
|       [...]                                                                                                                              |
|    }                                                                                                                                     |
|                                                                                                                                          |
| If collation is omitted, the default collation, ``utf8mb4_general_ci`` is used:                                                          |
|                                                                                                                                          |
| .. code-block:: none                                                                                                                     |
|                                                                                                                                          |
|   "SqlSettings": {                                                                                                                       |
|       "DataSource": "<user:pass>@<servername>/mattermost?charset=utf8mb4,utf8",                                                          |
|       [...]                                                                                                                              |
|    }                                                                                                                                     |
|                                                                                                                                          |
| **Note**: If you’re using MySQL 8.0 or later, the default collation has changed to ``utf8mb4_0900_ai_ci``. See our `Database Software    |
| Requirements <https://docs.mattermost.com/install/software-hardware-requirements.html>`__ documentation for details on                   |
| MySQL 8.0 support.                                                                                                                       |
+---------------------------------------------------------------+--------------------------------------------------------------------------+
| **PostgreSQL databases**                                                                                                                 |
|                                                                                                                                          |
| When **Driver Name** is set to ``postgres``, use a connection string in the form of:                                                     |
| ``postgres://mmuser:password@localhost:5432/mattermost_test?sslmode=disable&connect_timeout=10.``                                        |
+---------------------------------------------------------------+--------------------------------------------------------------------------+

Maximum idle database connections
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+--------------------------------------------------------+------------------------------------------------------------------+
| The maximum number of idle connections held open       | - System Config path: **Environment > Database**                 |
| to the database.                                       | - ``config.json`` setting: ``".SqlSettings.MaxIdleConns": 10,``  |
|                                                        | - Environment variable: ``MM_SQLSETTINGS_MAXIDLECONNS``          |
| Numerical input. Default is **10**.                    |                                                                  |
+--------------------------------------------------------+------------------------------------------------------------------+

Maximum open connections
~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+--------------------------------------------------------+------------------------------------------------------------------+
| The maximum number of idle connections held open       | - System Config path: **Environment > Database**                 |
| to the database.                                       | - ``config.json`` setting: ``".SqlSettings.MaxOpenConns": 300,`` |
|                                                        | - Environment variable: ``MM_SQLSETTINGS_MAXOPENCONNS``          |
| Numerical input. Default is **300**.                   |                                                                  |
+--------------------------------------------------------+------------------------------------------------------------------+

Query timeout
~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+--------------------------------------------------------+------------------------------------------------------------------+
| The amount of time to wait, in seconds, for a response | - System Config path: **Environment > Database**                 |
| from the database after opening a connection and       | - ``config.json`` setting: ``".SqlSettings.QueryTimeout: 30",``  |
| sending the query.                                     | - Environment variable: ``MM_SQLSETTINGS_QUERYTIMEOUT``          |
|                                                        |                                                                  |
| Numerical input in seconds. Default is **30** seconds. |                                                                  |
+--------------------------------------------------------+------------------------------------------------------------------+

Maximum connection lifetime
~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+--------------------------------------------------------+-------------------------------------------------------------------------------------+
| Maximum lifetime for a connection to the database,     | - System Config path: **Environment > Database**                                    |
| in milliseconds. Use this setting to configure the     | - ``config.json`` setting: ``".SqlSettings.ConnMaxLifetimeMilliseconds: 3600000",`` |
| maximum amount of time a connection to the database    | - Environment variable: ``MM_SQLSETTINGS_CONNMAXLIFETIMEMILLISECONDS``              |
| may be reused                                          |                                                                                     |
|                                                        |                                                                                     |
| Numerical input in milliseconds. Default is            |                                                                                     |
| **3,600,000** milliseconds (1 hour).                   |                                                                                     |
+--------------------------------------------------------+-------------------------------------------------------------------------------------+

Maximum connection idle timeout
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+--------------------------------------------------------+-------------------------------------------------------------------------------------+
| Maximum time a database connection can remain idle,    | - System Config path: **Environment > Database**                                    |
| in milliseconds.                                       | - ``config.json`` setting: ``".SqlSettings.ConnMaxIdleTimeMilliseconds: 300000",``  |             
|                                                        | - Environment variable: ``MM_SQLSETTINGS_CONNMAXIDLETIMEMILLISECONDS``              |
| Numerical input in milliseconds. Default is **300000** |                                                                                     | 
| (5 minutes).                                           |                                                                                     |
+--------------------------------------------------------+-------------------------------------------------------------------------------------+

Minimum hashtag length
~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+----------------------------------------------------------------------+-------------------------------------------------------------------------+
| Minimum number of characters in a hashtag.                           | - System Config path: **Environment > Database**                        |
| This value must be greater than or equal to **2**.                   | - ``config.json`` setting: ``".SqlSettings.MinimumHashtagLength: 3",``  |
|                                                                      | - Environment variable: ``MM_SQLSETTINGS_MINIMUMHASHTAGLENGTH``         |
+----------------------------------------------------------------------+-------------------------------------------------------------------------+
| **Note**: MySQL databases must be configured to support searching strings shorter than three characters. See the                               |
| `MySQL documentation <https://dev.mysql.com/doc/refman/8.0/en/fulltext-fine-tuning.html>`__ for details.                                       |
+----------------------------------------------------------------------+-------------------------------------------------------------------------+

SQL statement logging
~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+--------------------------------------------------------------------------+
| Executed SQL statements can be written to the log for         | - System Config path: **Environment > Database**                         |
| development.                                                  | - ``config.json`` setting: ``".SqlSettings.Trace: false",``              |
|                                                               | - Environment variable: ``MM_SQLSETTINGS_TRACE``                         |
| - **true**: Executing SQL statements are written to the log.  |                                                                          |
| - **false**: **(Default)** SQL statements aren't written      |                                                                          |
|   to the log.                                                 |                                                                          |
+---------------------------------------------------------------+--------------------------------------------------------------------------+

Recycle database connections
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

+--------------------------------------------------------+------------------------------------------------------------------+
| Select the **Recycle Database Connections** button to  | - System Config path: **Environment > Database**                 |
| reconnect to the configured database.                  | - ``config.json`` setting: N/A                                   |
| All old connections are closed after 20 seconds.       | - Environment variable: N/A                                      |
|                                                        |                                                                  |
| To fail over without downing the server, change the    |                                                                  |
| database line in the ``config.json`` file, select      |                                                                  |
| **Reload Configuration from Disk** via **Environment   |                                                                  |
| > Web Server**, then select **Recycle Database         |                                                                  |
| Connections**.                                         |                                                                  |
+--------------------------------------------------------+------------------------------------------------------------------+

Disable database search
~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

+---------------------------------------------------------------+------------------------------------------------------------------------------+
| When other search engines are configured, such as             | - System Config path: **Environment > Database**                             |
| `Elasticsearch                                                | - ``config.json`` setting: ``".SqlSettings.DisableDatabaseSearch: false",``  |
| <https://docs.mattermost.com/scale/elasticsearch.html>`__,    | - Environment variable: ``MM_SQLSETTINGS_DISABLEDATABASESEARCH``             |
| the database can be disabled to perform searches.             |                                                                              |
|                                                               |                                                                              |
| - **true**: Disables the use of the database to perform       |                                                                              |
|   searches. If another search engine isn't configured,        |                                                                              |
|   setting this value to ``true`` will result in empty search  |                                                                              |
|   results.                                                    |                                                                              |
| - **false**: **(Default)** Database search isn't disabled.    |                                                                              |
+---------------------------------------------------------------+------------------------------------------------------------------------------+

Applied schema migrations
~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10/E20*

A list of all migrations that have been applied to the data store based on the version information available in the ``db_migrations`` table. Select **About Mattermost** from the product menu to review the current database schema version applied to your deployment.

Read replicas
~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-pro-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10 and E20*

+--------------------------------------------------------+-----------------------------------------------------------------------+
| Specifies the connection strings for the read replica  | - System Config path: N/A                                             |
| databases.                                             | - ``config.json`` setting: ``".SqlSettings.DataSourceReplicas": []``  |
|                                                        | - Environment variable: ``MM_SQLSETTINGS_DATASOURCEREPLICAS``         |
+--------------------------------------------------------+-----------------------------------------------------------------------+
| **Note**: Each database connection string in the array must be in the same form used for the                                   |
| `Data source <#data-source>`__ setting.                                                                                        |
+--------------------------------------------------------+-----------------------------------------------------------------------+

Search replicas
~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-pro-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10 and E20*

+--------------------------------------------------------+-----------------------------------------------------------------------------+
| Specifies the connection strings for the search        | - System Config path: N/A                                                   |
| replica databases. A search replica is similar to a    | - ``config.json`` setting: ``".SqlSettings.DataSourceSearchReplicas": []``  |
| read replica, but is used only for handling search     | - Environment variable: ``MM_SQLSETTINGS_DATASOURCESEARCHREPLICAS``         |
| queries.                                               |                                                                             |
+--------------------------------------------------------+-----------------------------------------------------------------------------+
| **Note**: Each database connection string in the array must be in the same form used for the `Data source <#data-source>`__          |
| setting.                                                                                                                             |
+--------------------------------------------------------+-----------------------------------------------------------------------------+

Replica lag settings
~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

+--------------------------------------------------------+----------------------------------------------------------------------------------+
| String array input specifies a connection string and   | - System Config path: N/A                                                        |
| user-defined SQL queries on the database to measure    | - ``config.json`` setting: ``".SqlSettings.ReplicaLagSettings": []``             |
| replica lag for a single replica instance.             | - Environment variable: ``MM_SQLSETTINGS_REPLICALAGSETTINGS``                    |
|                                                        |                                                                                  |   
| These settings monitor absolute lag based on binlog    |                                                                                  |
| distance/transaction queue length, and the time taken  |                                                                                  |
| for the replica to catch up.                           |                                                                                  |
|                                                        |                                                                                  |
| String array input consists of:                        |                                                                                  |
|                                                        |                                                                                  |
| - ``DataSource``: The database credentials to connect  |                                                                                  |
|   to the replica instance.                             |                                                                                  |
| - ``QueryAbsoluteLag``: A plain SQL query that must    |                                                                                  |
|   return a single row. The first column must be the    |                                                                                  |
|   node value of the Prometheus metric, and the second  |                                                                                  |
|   column must be the value of the lag used to          |                                                                                  |
|   measure absolute lag.                                |                                                                                  |
| - ``QueryTimeLag``: A plain SQL query that must        |                                                                                  |
|   return a single row. The first column must be the    |                                                                                  |
|   node value of the Prometheus metric, and the second  |                                                                                  |
|   column must be the value of the lag used to measure  |                                                                                  |
|   the time lag.                                        |                                                                                  |
+--------------------------------------------------------+----------------------------------------------------------------------------------+
| Examples:                                                                                                                                 |
|                                                                                                                                           |
| For AWS Aurora instances, ``QueryAbsoluteLag`` can be:                                                                                    |
|                                                                                                                                           |
| .. code-block:: sh                                                                                                                        |
|                                                                                                                                           |
|   select server_id, highest_lsn_rcvd-durable_lsn as bindiff from aurora_global_db_instance_status() where server_id=<>                    |
|                                                                                                                                           |
| And for AWS Aurora instances, ``QueryTimeLag`` can be:                                                                                    |
|                                                                                                                                           |
| .. code-block:: sh                                                                                                                        |
|                                                                                                                                           |
|   select server_id, visibility_lag_in_msec from aurora_global_db_instance_status() where server_id=<>                                     |
|                                                                                                                                           |
| For MySQL Group Replication, the absolute lag can be measured from the number of pending transactions in the applier queue:               |
|                                                                                                                                           |
| .. code-block:: sh                                                                                                                        |                       
|                                                                                                                                           |
|   select member_id, count_transactions_remote_in_applier_queue FROM performance_schema.replication_group_member_stats where member_id=<>  |
+--------------------------------------------------------+----------------------------------------------------------------------------------+
source/configure/customizing-mattermost.rst METASEP
Customizing Mattermost
======================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

There are several ways to customize your Mattermost server. 

If customizing Mattermost, please avoid branding that could be confused with the Mattermost brand. For example, it's okay to brand as "Healthcare Central" because it's a completely different brand. "Mattermost Healthcare Central" is not okay, because it can potentially be confused with the Mattermost brand. Please see the `Mattermost trademark guidelines <https://mattermost.com/trademark-standards-of-use/>`__ for details.

While you're welcome to add your own copyright notice in the user interface if you feel it is warranted by your changes, we ask that you do not remove the Mattermost, Inc. copyright notice from the login footer or from the About dialog.

Mattermost Web App
------------------

The Mattermost webapp is licensed under the Apache 2.0 license. To modify and use with the Mattermost server, you can:

1. Install the Mattermost server by following one of our installation guides
2. Fork the `mattermost-webapp <https://github.com/mattermost/mattermost-webapp>`__ repository
3. Make your changes 
4. Run ``make package`` to create ``mattermost-webapp.tar.gz``
5. Copy ``mattermost-webapp-tar.gz`` to the location Mattermost was installed in Step 1
6. Remove the existing ``client`` folder
7. Run ``tar -xvf mattermost-webapp.tar.gz`` to extract your new customized ``client`` folder
8. Restart your Mattermost server

It is possible to customize certain parts of the webapp without forking by using our :doc:`Custom Branding <../configure/custom-branding-tools>` settings. 

To replace the logo in email notifications, change the file located in the ``/images`` directory. To change the app icon, modify the ``/app/components/app_icon.js`` file.

Mattermost Server
-----------------

There are a few things you can customize in the Mattermost server without forking:

1. Modify text in the Mattermost interface by modifying the ``en.json`` file.
2. Customize or hide help and support links by modifying your `configuration settings <https://docs.mattermost.com/configure/configuration-settings.html#customization>`__.
3. Customize the email notifications by editing the HTML files in ``/templates``.

Mattermost mobile apps
----------------------

The Mattermost mobile apps can be customized if you choose to build the apps yourself. 

To brand the mobile apps: 

1. Fork the `mattermost-mobile <https://github.com/mattermost/mattermost-mobile>`__ repository
2. Replace the name, images, and any key text strings
3. :doc:`Compile the apps <../deploy/build-custom-mobile-apps>`
4. Deploy the apps to an app store

While most organizations deploy to internal enterprise app stores, you are welcome to deploy to iTunes and Google Play as long as the branding is not confusable with official Mattermost products.

Mattermost desktop apps
-----------------------

The Mattermost desktop apps can be customized if you choose to build the apps yourself. 

To brand the desktop apps: 

1. Fork the `mattermost/desktop <https://github.com/mattermost/desktop>`__ repository
2. Replace the name, images, and any key text strings
3. Refer to `this documentation <https://github.com/mattermost/desktop/blob/master/docs/development.md>`__ for help with compiling the apps
4. Share the desktop application with your users 

source/configure/custom-branding-tools.rst METASEP
Custom branding tools
=====================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Use custom branding tools to present a Mattermost experience that's tailored to the branding of your organization.

.. figure:: ../images/custom-branding-tools.png
   :alt: Text and imagery on the Mattermost log in page can be customized to present a branded Mattermost experience for your organization.

Enable custom branding
----------------------

1. Go to **System Console > Site Configuration > Customization > Enable Custom Branding** and set the value to **true**.
2. Choose a **Site Name**, upload a **Custom Brand Image**, then enter **Custom Brand Text**.
3. Choose **Save**.

Users should see your new custom branding on the login page of your Mattermost server the next time they log in.

From version 5.16, you can remove the custom brand image by selecting the **X** in the top right corner of the image. To apply the change, choose **Save**. Note that the value must be set to **true** in order to perform this step.

More about settings available in **Customization**:

Site name
~~~~~~~~~

Choose the name of your Mattermost site to be shown in the UI. The site name appears in the header and footer of the site login page, team selection page, team creation page, account creation page, email invitations, and replaces "Mattermost" on the **About** page. Note that the site name applies to the entire site and not just a specific team on the site. The site name is limited to 30 characters or less.

Custom branding image
~~~~~~~~~~~~~~~~~~~~~

Upload a company logo or custom image representative of your site that is displayed on the left side of the site login page. Supported image formats are JPG, PNG, TIFF, and BMP. The recommended image size is 200-500px in width and height, and less than 2 MB since it's loaded for every user who logs in on desktop.

Custom brand text
~~~~~~~~~~~~~~~~~

Write custom text to display your company tagline or a welcome prompt. Custom text will be shown below the custom brand image on the left side of site login page on desktop. You can format this text to a maximum of 500 characters using the same `Markdown formatting syntax <https://docs.mattermost.com/messaging/formatting-text.html>`__ as used in Mattermost messages.

Site description
~~~~~~~~~~~~~~~~

Use this field to describe the purpose of your site. The site description is shown below the site name on the login page.  This text defaults to **All team communication in one place, searchable and accessible anywhere**. This text can be a maximum of 1024 characters and is not formatted with Markdown.


source/configure/configuring-cloudfront-to-host-mattermost-static-assets.rst METASEP
.. _config-cloudfront:

Configuring CloudFront to host Mattermost static assets
=======================================================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Configuring CloudFront to host Mattermost's static assets allows for improved caching performance and shorter load times for those members of your team geographically distributed throughout the world. 

1. Create an S3 bucket using your desired domain. In our example it will be ``mattermost.example.com``.
2. Enable static hosting for your S3 bucket.
3. If your SiteURL is configured with a subpath (such as https://example.com/company/mattermost), your static assets must be rewritten before uploading. You can use the command below to rewrite the assets for the given subpath:

    ``mattermost config subpath --path /company/mattermost``

4. From the Mattermost distribution, upload the ``client`` directory to S3 and rename it to ``static``. You can use the AWS CLI command below from within the ``client`` directory to upload all the files to S3. The files must be publicly readable with the permission ``public-read``.

    ``aws s3 cp --acl public-read --recursive . s3://static.spinmint.com/static/``

5. Set up your Mattermost app server and create a record from a subdomain of your desired domain to point directly to your app server. This is to bypass CloudFront to connect WebSockets. For our example, we will use the domain ``ws.mattermost.example.com``. If you have multiple app servers, this domain should point to the load balancer/proxy such as ALB or NGINX.
6. Create a Web CloudFront distribution with the following configuration.

   a. Set Origin Domain Name to the S3 bucket you created above.
   b. (Recommended) Set Redirect HTTP to ``HTTPS`` for Viewer Protocol Policy.
   c. Set allowed HTTP Methods to ``GET, HEAD, OPTIONS, POST, PATCH, DELETE``.
   d. Set Forward Cookies to ``All``.
   e. Set Query string forwarding and Caching to ``Forward all, cache based on all``.
   f. Set your Alternate Domain Names to the domain you want Mattermost to be accessible from, e.g. ``mattermost.example.com``.
   g. Select ``Custom SSL Certificate`` and set the certificate for your domain.
   h. Set Default Root Object to ``/static/root.html``.

7. After creating your distribution, you need to add an additional origin. Select the origins tab and create an origin. Set the origin domain name to your Mattermost load balancer.
8. Next, create a behavior. 

   a. Set the Path Pattern to ``/api/*``.
   b. Set the origin to your Mattermost app server or load balancer.
   c. Set allowed HTTP Methods to ``GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE``.
   d. Set Forward Cookies to `All`.
   e. Set Query string forwarding and Caching to ``Forward all, cache based on all``.

9. Next, set up some custom error responses under the Error Pages tab.

   a. Set HTTP Error Code to ``403``.
   b. Set Customize Error Response to ``Yes``.
   c. Set response page path to ``/static/root.html``.
   d. Set HTTP Response Code to ``200``.
   e. Repeat the above steps for HTTP Error Code 404.

10. Now, you can set up the domain you want Mattermost to be served from to point to your CloudFront distribution. Setting up this domain is beyond the scope of this guide.
11. Finally, set these Mattermost ``config.json`` settings:

    a. SiteURL: ``https://mattermost.example.com``
    b. WebsocketURL: ``wss://ws.mattermost.example.com``
    c. AllowCorsFrom: ``https://mattermost.example.com``
    d. AllowCookiesForSubdomains: ``true``

Upgrade Notes
~~~~~~~~~~~~~~~

When you upgrade your Mattermost app servers, you will need to re-upload the new client to your S3 bucket (see steps 3 and 4 above).

You should also run a CloudFront invalidation for ``/static/root.html``. You can do this in the console under the invalidations tab. 

source/configure/configuration-settings.rst METASEP
Configuration settings
======================

Mattermost configuration settings are maintained in the ``config.json`` configuration file, located in the ``mattermost/config`` directory. System Admins can manage Mattermost configuration using the System Console, or by modifying the ``config.json`` file directly using a text editor. 

.. note::

   Mattermost must have write permissions to ``config.json``, otherwise configuration changes made within the System Console will have no effect.

Configuration in database
--------------------------

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

From Mattermost v5.10, self-hosted system configuration can be stored in the database. This changes the Mattermost binary from reading the default ``config.json`` file to reading the configuration settings stored within a configuration table in the database. See the `Mattermost database configuration <https://docs.mattermost.com/configure/configuation-in-mattermost-database.html>`__ documentation for migration details.

Environment variables
---------------------

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

From Mattermost v3.8, you can use `environment variables <https://docs.mattermost.com/configure/environment-variables.html>`__ to manage Mattermost configuration. Environment variables override settings in ``config.json``. If a change to a setting in ``config.json`` requires a restart to take effect, then changes to the corresponding environment variable also require a server restart. 

Configuration reload
--------------------

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

From Mattermost v5.38, the “config watcher”, the mechanism that automatically reloads the ``config.json`` file, has been deprecated in favor of the `mmctl config reload <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-config-reload>`__ command that must be run to apply configuration changes after they’re made. This change will improve configuration performance and robustness.

Deprecated configuration settings
---------------------------------

See the `deprecated configuration settings documentation <https://docs.mattermost.com/configure/deprecated-configuration-settings.html>`__ for details on all deprecated Mattermost configuration settings that are no longer supported.

Site Configuration
-------------------

Settings for customizing your Mattermost deployment.

Customization
~~~~~~~~~~~~~

Access the following configuration settings in the System Console by going to **Site Configuration > Customization**.

Site Name
^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Name of service shown in login screens and UI. Maximum 30 characters.

+-------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"SiteName": "Mattermost"`` with string input. |
+-------------------------------------------------------------------------------------------+

Site Description
^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Description of service shown in login screens and UI. When not specified, "All team communication in one place, searchable and accessible anywhere" is displayed.

+----------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"CustomDescriptionText": ""`` with string input. |
+----------------------------------------------------------------------------------------------+

Enable Custom Branding
^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

*This feature was moved to Team Edition in Mattermost v5.0, released June 16th, 2018. Prior to v5.0, this feature is available in legacy Enterprise Edition E10 and E20.*

**True**: Enables custom branding to show a JPG image some custom text on the server login page.

**False**: Custom branding is disabled.

+---------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableCustomBrand": false`` with options ``true`` and ``false``. |
+---------------------------------------------------------------------------------------------------------------+

Custom Brand Image
^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Custom JPG image is displayed on left side of server login page. Recommended maximum image size is less than 2 MB because image will be loaded for every user who logs in.

+----------------------------------------------------------------------------------------------------+
| This features has no ``config.json`` setting and must be set in the System Console user interface. |
+----------------------------------------------------------------------------------------------------+

Custom Brand Text
^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Custom text will be shown below custom brand image on left side of server login page. Maximum 500 characters allowed. You can format this text using the same `Markdown formatting codes <https://docs.mattermost.com/help/messaging/formatting-text.html>`__ as using in Mattermost messages.

+----------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"CustomBrandText": ""`` with string input. |
+----------------------------------------------------------------------------------------+

Enable Ask Community Link
^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: **Ask the community** link is visible in the Mattermost channel header, under the **Help** menu. When selected, users are redirected to https://mattermost.com/pl/default-ask-mattermost-community/, where they can join the Mattermost Community to ask questions and help others troubleshoot issues. This option is not available on the mobile apps.

**False**: The link is not visible to users.

+--------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"enable_ask_community_link": ""`` with options ``true`` and ``false``. Defaults to true. |
+--------------------------------------------------------------------------------------------------------------------------------------+

Help link
^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Configurable link to a Help page your organization may provide to end users. By default, links to Mattermost help documentation are hosted on `docs.mattermost.com <https://docs.mattermost.com/>`__.

+---------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"HelpLink": "https://docs.mattermost.com/"`` with string input.               |
+---------------------------------------------------------------------------------------------------------------------------+

Terms of Use link
^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Configurable link to Terms of Use your organization may provide to end users on the footer of Mattermost sign-up and login pages. By default, links to a `Terms of Use <https://mattermost.com/terms-of-use/>`__ page hosted on ``mattermost.com``. If changing the link to a different Terms of Use, make sure to include the "Mattermost Acceptable Use Policy" notice to end users that must also be shown to users from the "Terms of Use" link.

From Mattermost v5.17, this setting doesn't change the terms of use link displayed in the **About Mattermost** dialog, which refers to the Mattermost Terms of Use.

+--------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"TermsOfServiceLink": "https://mattermost.com/terms-of-use/"`` with string input.        |
+--------------------------------------------------------------------------------------------------------------------------------------+

Privacy Policy link
^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Configurable link to Privacy Policy your organization may provide to end users on the footer of the sign-up and login pages. By default, links to a Privacy Policy page hosted on mattermost.com.

In version 5.17 and later, this setting does not change the privacy policy link in **Main Menu > About Mattermost**, which refers to the Mattermost Privacy Policy.

+----------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"PrivacyPolicyLink": "https://mattermost.com/privacy-policy/"`` with string input.               |
+----------------------------------------------------------------------------------------------------------------------------------------------+

About Link
^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Configurable link to an About page describing your organization may provide to end users. By default, links to an About page hosted on mattermost.com.

+-----------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AboutLink": "https://mattermost.com/platform-overview/"`` with string input.   |
+-----------------------------------------------------------------------------------------------------------------------------+

Report a Problem link
^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Set the link for the support website.

+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ReportAProblemLink": "https://handbook.mattermost.com/contributors/contributors/ways-to-contribute#report-a-bug"`` with string input.    |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Mattermost Apps Download Page Link
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Configurable link to a download page for Mattermost Apps. When a link is present, an option to **Download Apps** will be added in the Main Menu so users can find the download page. Leave this field blank to hide the option from the Main Menu. Defaults to a page on mattermost.com where users can download the iOS, Android, and Desktop clients. If you're using an Enterprise App Store for your mobile apps, change this link to point to a customized download page where users can find the correct apps.

+------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AppDownloadLink": "https://mattermost.com/apps/"`` with string input.     |
+------------------------------------------------------------------------------------------------------------------------+

Android App Download Link
^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Configurable link to download the Android app. When a link is present, users who access the site on a mobile web browser will be prompted with a page giving them the option to download the app. Leave this field blank to prevent the page from appearing. If you are using an Enterprise App Store for your mobile apps, change this link to point to the correct app.

+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AndroidAppDownloadLink": "https://play.google.com/store/apps/details?id=com.mattermost.rn"`` with string input. |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------+

iOS App Download Link
^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Configurable link to download the iOS app. When a link is present, users who access the site on a mobile web browser will be prompted with a page giving them the option to download the app. Leave this field blank to prevent the page from appearing. If you are using an Enterprise App Store for your mobile apps, change this link to point to the correct app.

+------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"IosAppDownloadLink": "https://apps.apple.com/us/app/mattermost/id1257222717"`` with string input. |
+------------------------------------------------------------------------------------------------------------------------------------------------+

Localization
~~~~~~~~~~~~~

Access the following configuration settings in the System Console by going to **Site Configuration > Localization**.

Default Server Language
^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Default language for system messages and logs.

Changes to this setting require a server restart before taking effect.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"DefaultServerLocale": "en"`` with options ``"bg"``, ``"de"``, ``"en"``, ``en-AU``, ``"es"``, ``"fa"``, ``"fr"``, ``"hu"``, ``"it"``, ``"ja"``, ``"ko"``, ``"nl"``, ``"pl"``, ``"pt-br"``, ``"ro"``, ``"ru"``, ``"sv"``, ``"tr"``, ``uk``, ``"zh_CN"``, and ``"zh_TW"``. |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Default Client Language
^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Default language for newly-created users and pages where the user hasn't logged in.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"DefaultClientLocale": "en"`` with options ``"bg"``, ``"de"``, ``"en"``, ``en-AU``, ``"es"``, ``"fa"``, ``"fr"``, ``"hu"``, ``"it"``, ``"ja"``, ``"ko"``, ``"nl"``, ``"pl"``, ``"pt-br"``, ``"ro"``, ``"ru"``, ``"sv"``, ``"tr"``, ``uk``, ``"zh_CN"``, and ``"zh_TW"``. |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Available Languages
^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Sets which languages are available for users in **Settings > Display > Language**. Leave the field blank to add new languages automatically by default, or add new languages using the dropdown menu manually as they become available. If you're manually adding new languages, the **Default Client Language** must be added before saving the setting.

+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AvailableLocales": ""`` with options ``""``, ``"bg"``, ``"de"``, ``"en"``, ``en-AU``, ``"es"``, ``"fa"``, ``"fr"``, ``"hu"``, ``"it"``, ``"ja"``, ``"ko"``, ``"nl"``, ``"pl"``, ``"pt-br"``, ``"ro"``, ``"ru"``, ``"sv"``, ``"tr"``, ``uk``, ``"zh_CN"``, and ``"zh_TW"``.  |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Users and Teams
~~~~~~~~~~~~~~~

Access the following configuration settings in the System Console by going to **Site Configuration > Users and Teams**.

Max Users Per Team
^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Maximum number of users per team, excluding inactive users.

The **Max Users Per Team** refers to the size of the "team site" which is workspace a "team of people" inhabits. A team of people is considered a small organization where people work closely together towards a specific shared goal and share the same etiquette. In the physical world, a team of people could typically be seated around a single table to have a meal and discuss their project.

The default maximum of 50 people, is at the extreme high end of a single team of people. At this point organizations are more often "multiple teams of people" and investments in explicitly defining etiquette, such as `channel organization <https://docs.mattermost.com/messaging/organizing-mattermost.html>`__ in Enterprise Edition, are often used to scale the high levels of productivity found in a team of people using Mattermost to multiple teams of people.

In terms of technical performance, `with appropriate hardware, Mattermost can easily scale to hundreds and even thousands of users <https://docs.mattermost.com/install/software-hardware-requirements.html>`__, and provided the administrator believes the appropriate etiquette is in place, they should feel free to increase the default value.

+-------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"MaxUsersPerTeam": 50`` with numerical input. |
+-------------------------------------------------------------------------------------------+

Max Channels Per Team
^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Maximum number of channels per team, including both active and deleted channels.

+---------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"MaxChannelsPerTeam": 2000`` with numerical input.    |
+---------------------------------------------------------------------------------------------------+

Enable users to open Direct Message channels with
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**Any user on the Mattermost server**: The Direct Messages **More** menu has the option to open a Direct Message channel with any user on the server.

**Any member of the team**: The Direct Messages **More** menu only has the option to open a Direct Message channel with users on the current team, and pressing :kbd:`Ctrl` :kbd:`K` on Windows or Linux, or :kbd:`⌘` :kbd:`K` on Mac only lists users on the current team. If a user belongs to multiple teams, direct messages will still be received regardless of what team they are currently on.

This setting only affects the UI, not permissions on the server. For instance, a direct message channel can be created with anyone on the server regardless of this setting.

+----------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"RestrictDirectMessage": "any"`` with options ``"any"`` and ``"team"`` for the above settings, respectively. |
+----------------------------------------------------------------------------------------------------------------------------------------------------------+

Teammate Name Display
^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Specifies how names are displayed in the user interface by default. Please note that users can override this setting in **Settings > Display > Teammate Name Display**.

**Show username**: Displays the user's username.

**Show nickname if one exists**: Displays the user's nickname. If the user does not have a nickname, their full name is displayed. If the user does not have a full name, their username is displayed.

**Show first and last name**: Displays the user's full name. If the user does not have a full name, their username is displayed. Recommended when using SAML or LDAP if first name and last name attributes are configured.

+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"TeammateNameDisplay": "username"`` with options ``"username"``, ``"nickname_full_name"``, and ``"full_name"`` for the above settings, respectively. |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Lock Teammate Name Display for all users
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Disables users' ability to change settings under **Settings > Display > Teammate Name Display**.

**False**: Users can change how their teammate name displays.

Allow Users to View Archived Channels
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Allows users to view, share, and search for content of channels that have been archived. Users can only view the content in channels of which they were a member before the channel was archived.

**False**: Users are unable to view, share, or search for content of channels that have been archived.

+-------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ExperimentalViewArchivedChannels": true`` with options ``true`` and ``false``.         |
+-------------------------------------------------------------------------------------------------------------------------------------+

Show Email Address
^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Show email address of all users.

**False**: Hide email address of users from other users in the user interface, including Team Admins. This is designed for managing teams where users choose to keep their contact information private. System Admins will still be able to see email addresses in the UI.

+-------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ShowEmailAddress": true`` with options ``true`` and ``false``. |
+-------------------------------------------------------------------------------------------------------------+

Show Full Name
^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Show full name of all users.

**False**: Hide full name of users from other users including Team Admins. This is designed for managing teams where users choose to keep their contact information private. System Admins will still be able to see full names in the UI.

+---------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ShowFullName": true`` with options ``true`` and ``false``. |
+---------------------------------------------------------------------------------------------------------+

Enable Custom User Statuses
^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Users can set descriptive status messages and optional status emojis that are visible to all users.

**False**: Users are unable to set custom user statuses.

+---------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableCustomUserStatuses": true`` with options ``true`` and ``false``. |
+---------------------------------------------------------------------------------------------------------------------+

Notifications
~~~~~~~~~~~~~~

Access the following configuration settings in the System Console by going to **Site Configuration > Notifications**.

Show @channel, @all, or @here confirmation dialog
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Users will be prompted to confirm when posting @channel, @all, or @here in channels with over five members.

**False**: No confirmation is required.

+--------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableConfirmNotificationsToChannel": true`` with options ``true`` and ``false``. |
+--------------------------------------------------------------------------------------------------------------------------------+

Enable Email Notifications
^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Enables sending of email notifications.

**False**: Disables email notifications for posts. This is useful for developers who may want to skip email setup for faster development. In order to remove the **Preview Mode: Email notifications have not been configured** banner, you should also set **Enable Preview Mode Banner** to ``false``.

If this setting is set to ``false`` and the SMTP server is set up, account related emails (such as password, email, username, user token, MFA, and other authentication related changes) will be sent regardless of this setting. 

Email invitations and account deactivation emails are not affected by this setting.

+--------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"SendEmailNotifications": false`` with options ``true`` and ``false``. |
+--------------------------------------------------------------------------------------------------------------------+

.. _email-preview-mode-banner-config:

Enable Preview Mode Banner
^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Preview Mode banner is displayed to all users when ``"SendEmailNotifications": false`` so users are aware that email notifications are disabled.

**False**: Preview Mode banner is not displayed to users.

+--------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnablePreviewModeBanner": true`` with options ``true`` and ``false``. |
+--------------------------------------------------------------------------------------------------------------------+

Enable Email Batching
^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Users can select how often to receive email notifications, and multiple notifications within that timeframe will be combined into a single email. Batching will occur at a default interval of 15 minutes, configurable in **Settings > Notifications**.

.. note::
  - Email batching cannot be enabled unless the `SiteURL <https://docs.mattermost.com/configure/configuration-settings.html#site-url>`__ is configured and the `SMTP Email Server <https://docs.mattermost.com/configure/configuration-settings.html#smtp-email-server>`__ is configured. 
  - Email batching in `High Availability mode <https://docs.mattermost.com/configure/configuration-settings.html#enable-high-availability-mode>`__ is planned but not yet supported.

**False**: If email notifications are enabled in **Settings**, emails will be sent individually for every mention or direct message received.

+-----------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableEmailBatching": false`` with options ``true`` and ``false``. |
+-----------------------------------------------------------------------------------------------------------------+

Email Notification Contents
^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

**Send full message contents**: Sender name and channel are included in email notifications.

**Send generic description with only sender name**: The team name and name of the person who sent the message, with no information about channel name or message contents, is included in email notifications. Typically used for compliance reasons if Mattermost contains confidential information and policy dictates it cannot be stored in email.

+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EmailNotificationContentsType": "full"`` with options ``"full"`` and ``"generic"`` for the above settings, respectively.             |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Support Email Address
^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Set an email address for feedback or support requests. This field is required, and if a value isn't set, email notifications don't include a way for users to request assistance.

To ensure that users can contact you for assistance, set this value to an email address your System Admin receives, such as ``"support@yourcompany.com"``. This address is displayed on email notifications and during the Getting Started tutorial.

+-------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"SupportEmail": ""`` with string input. |
+-------------------------------------------------------------------------------------+

Notification Display Name
^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Name displayed on email account used when sending notification emails from Mattermost system. This field is required, and if a value isn't set, email notifications don't include a way for users to request assistance.

+-------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"FeedbackName": ""`` with string input. |
+-------------------------------------------------------------------------------------+

Notification From Address
^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Address displayed on email account used when sending notification emails from within Mattermost. This field is required, and if a value isn't set, email notifications don't include a way for users to request assistance.

So you don't miss messages, please make sure to change this value to an email your system administrator receives, such as ``"admin@yourcompany.com"``.

+--------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"FeedbackEmail": ""`` with string input. |
+--------------------------------------------------------------------------------------+

Notification Reply-To Address
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Email address used in the Reply-To header when sending notification emails from Mattermost.

+---------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ReplyToAddress": ""`` with string input. |
+---------------------------------------------------------------------------------------+

Notification Footer Mailing Address
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Organization name and mailing address displayed in the footer of email notifications from Mattermost, such as "© ABC Corporation, 565 Knight Way, Palo Alto, California, 94305, USA". If the field is left empty, the organization name and mailing address will not be displayed.

+---------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"FeedbackOrganization": ""`` with string input. |
+---------------------------------------------------------------------------------------------+

Push Notification Contents
^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**Generic description with only sender name**: Push notifications include only the name of the person who sent the message but no information about channel name or message text.

**Generic description with sender and channel names**: Push notifications include names of users and channels but no specific details from the message text.

**Full message content sent in the notification payload**: Selecting **Send full message snippet** sends excerpts from messages triggering notifications with specifics and may include confidential information sent in messages. If your Push Notification Service is outside your firewall, it is HIGHLY RECOMMENDED this option only be used with an "https" protocol to encrypt the connection.

**Full message content fetched from the server on receipt** (*Available in Mattermost Enterprise*): The notification payload relayed through the `Apple Push Notification service <https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/APNSOverview.html#//apple_ref/doc/uid/TP40008194-CH8-SW1>`__ or `Firebase Cloud Messaging <https://firebase.google.com/docs/cloud-messaging>`__ service contains no message content. Instead it contains a unique message ID used to fetch message content from the server when a push notification is received by a device via a `notification service app extension <https://developer.apple.com/documentation/usernotifications/modifying_content_in_newly_delivered_notifications>`__ on iOS or `an expandable notification pattern <https://developer.android.com/training/notify-user/expanded>`__ on Android. If the server cannot be reached, a generic push notification message is displayed without message content or sender name. 

For customers who choose to wrap the Mattermost mobile application in a secure container, such as BlackBerry Dynamics, MobileIron, AirWatch or other solutions, the container needs to execute the fetching of message contents from the unique message ID when push notification are received. If the container is unable to execute the fetch, the push notification contents cannot be received by the customer's mobile application without passing the message contents through either the `Apple Push Notification service <https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/APNSOverview.html#//apple_ref/doc/uid/TP40008194-CH8-SW1>`__ or `Firebase Cloud Messaging <https://firebase.google.com/docs/cloud-messaging>`__ service. 

+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"PushNotificationContents": "full"`` with options ``"generic_no_channel"``, ``"generic"``, ``"full"``, and ``"id_loaded"`` for the above settings, respectively.    |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Announcement Banner
~~~~~~~~~~~~~~~~~~~~

Access the following configuration settings in the System Console by going to **Site Configuration > Announcement Banner**.

Enable Announcement Banner
^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

Enable an announcement banner across all teams. The banner is displayed at the top of the screen and is the entire width of the screen. By default, users can dismiss the banner until you either change the text of the banner or until you re-enable the banner after it has been disabled. You can prevent users from dismissing the banner, and you can control the text color and the background color.

**True**: Enable the announcement banner. The banner is displayed only if ``BannerText`` has a value.

**False**: Disable the announcement banner.

+-----------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableBanner": false`` with options ``true`` and ``false``.  |
+-----------------------------------------------------------------------------------------------------------+

Banner Text
^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

The text of the announcement banner.

+------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"BannerText": ""`` with string input.  |
+------------------------------------------------------------------------------------+

Banner Color
^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

The background color of the announcement banner.

+---------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"BannerColor": "#f2a93b"`` with string input.   |
+---------------------------------------------------------------------------------------------+

Banner Text Color
^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

The color of the text in the announcement banner.

+-------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"BannerTextColor": "#333333"`` with string input.   |
+-------------------------------------------------------------------------------------------------+

Allow Banner Dismissal
^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Users can dismiss the banner until the next time they log in or the banner is updated.

**False**: The banner is permanently visible until it is turned off by the System Admin.

+-------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AllowBannerDismissal": true`` with options ``true`` and ``false``.   |
+-------------------------------------------------------------------------------------------------------------------+

Emoji
~~~~~~

Access the following configuration settings in the System Console by going to **Site Configuration > Emoji**.

Enable Emoji Picker
^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Enables an emoji picker that allows users to select emojis to add as reactions or use in messages. Enabling the emoji picker with a large number of custom emojis may slow down performance.

**False**: The emoji picker is disabled.

+--------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableEmojiPicker": true`` with options ``true`` and ``false``. |
+--------------------------------------------------------------------------------------------------------------+

Enable Custom Emoji
^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Enables a **Custom Emoji** option in the emoji picker, where users can go to add custom emojis.

**False**: Custom emojis are disabled.

+--------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableCustomEmoji": true`` with options ``true`` and ``false``. |
+--------------------------------------------------------------------------------------------------------------+

Posts
~~~~~~

Access the following configuration settings in the System Console by going to **Site Configuration > Posts**.

Automatically Follow Threads
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting must be enabled to support `Collapsed Reply Threads <https://docs.mattermost.com/channels/organize-conversations.html>`__. See the `administrator’s guide to enabling Collapsed Reply Threads <https://support.mattermost.com/hc/en-us/articles/6880701948564>`__ knowledge base article for details.

**True**: Threads a user starts, participates in, or is mentioned in are automatically followed. A new ``Threads`` table is added in the database that tracks threads and thread participants, and a ``ThreadMembership`` table tracks followed threads for each user and the read or unread state of each followed thread. Mattermost Cloud workspaces have this setting enabled.

**False**: All backend operations for Collapsed Reply Threads are disabled and server performance will not be impacted by the feature. Collapsed Reply Threads (``CollapsedThreads``) cannot be enabled if ``ThreadAutoFollow`` is disabled.    

.. note::

   Enabling this configuration setting doesn’t retroactively follow threads for actions taken prior to the setting being enabled. For example, threads a user participated in prior to enabling this setting won't be automatically followed. However, if this setting is enabled, and a user adds a new comment on an old thread, they will automatically start following the thread.

+--------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ThreadAutoFollow": true`` with options ``true`` and ``false``.  |
+--------------------------------------------------------------------------------------------------------------+

Collapsed Reply Threads
~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Collapsed Reply Threads offers an enhanced experience for users communicating in threads and replying to messages. Collapsed Reply Threads is generally available in Mattermost Cloud and from self-hosted Mattermost v7.0, and is enabled by default for all new Mattermost deployments. See our `Organizing Conversations using Collapsed Reply Threads <https://docs.mattermost.com/channels/organize-conversations.html>`__ documentation to learn more about this feature.

.. important::
    
    Customers upgrading to v7.0 must review the `administrator’s guide to enabling Collapsed Reply Threads <https://support.mattermost.com/hc/en-us/articles/6880701948564>`__ knowledge base article to learn about the system requirements, steps to enable, and self-host prerequisites to consider prior to enabling this functionality. 

System Admins can set the default availability of Collapsed Reply Threads for their workspace by going to **System Console > Site Configuration > Posts**, then setting **Collapsed Reply Threads** to one of the following options:

**Always On**: Enables Collapsed Reply Threads functionality on the server and for all users. Users can't disable this functionality. This is the recommended configuration for optimal user experience and to ensure consistency in how users read and respond to threaded conversations. Mattermost Cloud workspaces have Collapsed Reply Threads set to ``always_on`` by default.

**Default On**: Enables Collapsed Reply Threads functionality on the server and for all users. Users can choose to `disable Collapsed Reply Threads <https://docs.mattermost.com/channels/channels-settings.html#collapsed-reply-threads>`__ for their Mattermost account in **Settings > Display > Collapsed Reply Threads**. 

**Default Off**: Enables Collapsed Reply Threads functionality on the server but not for users. Users can choose to `enable Collapsed Reply Threads <https://docs.mattermost.com/channels/channels-settings.html#collapsed-reply-threads>`__ for their Mattermost account in **Settings > Display > Collapsed Reply Threads**.

**Disabled**: Disables Collapsed Reply Threads front-end functionality.

+-----------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"CollapsedThreads": always_on`` with options ``disabled``, ``default_off``, ``default_on``, and ``always_on`` |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable Link Previews
^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Link previews are previews of linked website content, image links, and YouTube videos that are displayed below posts when available.

Link previews are requested by the server, meaning the Mattermost server must be connected to the internet for previews to be displayed. This connection can be established through a `firewall or outbound proxy <https://docs.mattermost.com/install/outbound-proxy.html>`__ in environments where direct internet connectivity is not given or security policies make this necessary.

**True**: Website link previews, image link previews, and YouTube previews are enabled on the server. Users can enable or disable website previews for themselves from **Settings > Display > Website Link Previews**.

**False**: Website link previews, image link previews, and YouTube previews are disabled. The server does not request metadata for any links sent in messages.

+---------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableLinkPreviews": true`` with options ``true`` and ``false``. |
+---------------------------------------------------------------------------------------------------------------+

Disable Link Previews for Specific Domains
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Link previews are disabled for this list of comma-separated domains (e.g. “github.com, mattermost.com”). 

+---------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"RestrictLinkPreviews": ""`` with string input. |
+---------------------------------------------------------------------------------------------+

Enable message link previews
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Links to messages generate a preview for any users with access to the original message. 

**False**: Links to messages don't include a preview.

+--------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnablePermalinkPreviews": true`` with options ``true`` and ``false``. |
+--------------------------------------------------------------------------------------------------------------------+

Enable SVGs
^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Enables users to see previews of SVG file attachments and SVG image links.

**False**: Previews of SVG file attachments and SVG image links are not displayed.

+--------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableSVGs": false`` with options ``true`` and ``false``. |
+--------------------------------------------------------------------------------------------------------+

Enable LaTeX Code Block Rendering
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Enables rendering of LaTeX code in a ``latex`` code block.

**False**: Disables rendering of LaTeX code to prevent the app from crashing when sharing code that might outgrow assigned memory. When disabled, LaTeX code will be highlighted.

+---------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableLatex": false`` with options ``true`` and ``false``. |
+---------------------------------------------------------------------------------------------------------+

Enable Inline LaTeX Rendering
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Enables inline rendering of LaTeX code.

**False**: Disables inline rendering of LaTeX code to prevent the app from crashing when sharing code that might outgrow assigned memory. When disabled, LaTeX code will be highlighted. When disabled, Latex code can only be `rendered in a code block using syntax highlighting <https://docs.mattermost.com/configure/configuration-settings.html#enable-latex-code-block-rendering>`__. 

+---------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableInlineLatex": false`` with options ``true`` and ``false``. |
+---------------------------------------------------------------------------------------------------------------+

Custom URL Schemes
^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

A list of URL schemes that are used for autolinking in message text. ``http``, ``https``, ``ftp``, ``tel`` and ``mailto`` always create links.

+------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"CustomUrlSchemes": []`` with string array input consisting of URL schemes, such as ``["git", "smtp"]``. |
+------------------------------------------------------------------------------------------------------------------------------------------------------+

Google API Key
^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Mattermost offers the ability to embed YouTube videos from URLs shared by end users. 

Set this key and add YouTube Data API v3 as a service to your key to enable the display of titles for embedded YouTube video previews. Without the key, YouTube previews will still be created based on hyperlinks appearing in messages or comments but they will not show the video title. If Google detects the number of views is exceedingly high, they may throttle embed access. 

Should this occur, you can remove the throttle by registering for a Google Developer Key and entering it in this field following these instructions: https://www.youtube.com/watch?v=Im69kzhpR3I. Your Google Developer Key is used in client-side Javascript.

Using a Google API Key allows Mattermost to detect when a video is no longer available and display the post with a *Video not found* label.

+-------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"GoogleDeveloperKey": ""`` with string input. |
+-------------------------------------------------------------------------------------------+

File Sharing and Downloads
~~~~~~~~~~~~~~~~~~~~~~~~~~~

Access the following configuration settings in the System Console by going to **Site Configuration > File Sharing and Downloads**.

Allow File Sharing
^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

When ``false``, disables file sharing on the server. All file and image uploads on messages are forbidden across clients and devices, including mobile.

+---------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableFileAttachments": true`` with options ``true`` and ``false``.    |
+---------------------------------------------------------------------------------------------------------------------+

Allow File Uploads on Mobile
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

**True**: Enables file uploads on messages using Mattermost clients.

**False**: Disables file uploads on mobile apps. All file and image uploads on messages are forbidden across clients and devices, including mobile.

+---------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableMobileUpload": true`` with options ``true`` and ``false``.       |
+---------------------------------------------------------------------------------------------------------------------+

Allow File Downloads on Mobile
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

**True**: Enables file downloads on Mattermost mobile apps.

**False**: Disables file downloads on mobile apps. Users can still download files from a mobile web browser.

+---------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableMobileDownload": true`` with options ``true`` and ``false``.     |
+---------------------------------------------------------------------------------------------------------------------+

Public Links
~~~~~~~~~~~~

Access the following configuration settings in the System Console by going to **Site Configuration > Public Links**.

Enable Public File Links
^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

**True**: Allow users to generate public links to files and images for sharing outside the Mattermost system with a public URL.

**False**: The **Get Public Link** option is hidden from the image preview user interface.

.. note:: 

   When set to ``False``, anyone who tries to visit a previously generated public link will receive an error message saying public links have been disabled. When set back to ``True``, old public links will work again unless the **Public Link Salt** has been regenerated.

+-------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnablePublicLink": true`` with options ``true`` and ``false``. |
+-------------------------------------------------------------------------------------------------------------+

Public Link Salt
^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

32-character salt added to the URL of public links when public links are enabled. Select **Regenerate** in the System Console to create a new salt, which will invalidate all existing public links.

+---------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"PublicLinkSalt": ""`` with string input. |
+---------------------------------------------------------------------------------------+

Notices
~~~~~~~~

Access the following configuration settings in the System Console by going to **Site Configuration > Notices**.

Enable Admin Notices
^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: System Admins will receive notices about available server upgrades and relevant system administration features. `Learn more <https://docs.mattermost.com/manage/in-product-notices.html>`__.

**False**: System Admins will not receive notices except those that apply to all end users (See ``UserNoticesEnabled``). 

+----------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AdminNoticesEnabled": true`` with options ``true`` and ``false``. |
+----------------------------------------------------------------------------------------------------------------+

Enable End User Notices
^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: All users will receive notices about available client upgrades and relevant end user features to improve user experience. `Learn more <https://docs.mattermost.com/manage/in-product-notices.html>`__.

**False**: Users will not receive notices about available client upgrades and relevant end user features. 

+---------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"UserNoticesEnabled": true`` with options ``true`` and ``false``. |
+---------------------------------------------------------------------------------------------------------------+

Authentication
---------------

Authentication settings to enable account creation and log in with email, GitLab, Google or Office 365 OAuth, AD/LDAP, or SAML.

Signup
~~~~~~~

Enable Account Creation
^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Ability to create new accounts is enabled via inviting new members or sharing the team invite link.

**False**: Ability to create accounts is disabled. The **Create Account** button displays an error when trying to signup via an email invite or team invite link.

+---------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableUserCreation": true`` with options ``true`` and ``false``. |
+---------------------------------------------------------------------------------------------------------------+

Restrict account creation to specified email domains
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Teams and user accounts can only be created by a verified email from this list of comma-separated domains (e.g. "corp.mattermost.com, mattermost.com").

This setting only affects email login. For domain restrictions to be effective, you must also set `Require Email Verification <https://docs.mattermost.com/configure/configuration-settings.html#require-email-verification>`__ to ``true``.

+--------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"RestrictCreationToDomains": ""`` with string input. |
+--------------------------------------------------------------------------------------------------+

Enable Open Server
^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Users can sign up to the server from the root page without an invite.

**False**: Users can only sign up to the server if they receive an invite.

+--------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableOpenServer": false`` with options ``true`` and ``false``. |
+--------------------------------------------------------------------------------------------------------------+

Enable Email Invitations
^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Users can invite others to the Mattermost system by email.

**False**: Email invitations are disabled.

+--------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableEmailInvitations": false`` with options ``true`` and ``false``. |
+--------------------------------------------------------------------------------------------------------------------+

Invalidate pending email invites
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

This button invalidates active email invitations that have not been accepted by the user. By default email invitations expire after 48 hours.

Email
~~~~~

Enable account creation with email
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Allow team creation and account signup using email and password.

**False**: Email signup is disabled. This limits signup to single sign-on services like OAuth or AD/LDAP.

+------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableSignUpWithEmail": true`` with options ``true`` and ``false``. |
+------------------------------------------------------------------------------------------------------------------+

Require Email Verification
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Require email verification after account creation prior to allowing login.

**False**: Users do not need to verify their email address prior to login. Developers may set this field to ``false`` to skip sending verification emails for faster development.

+----------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"RequireEmailVerification": false`` with options ``true`` and ``false``. |
+----------------------------------------------------------------------------------------------------------------------+

Enable sign-in with email
^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Mattermost allows account creation using email and password.

**False**: Log in with email is disabled and does not appear on the login screen. Use this value when you want to limit sign up to a Single Sign-on service like AD/LDAP, SAML, or GitLab.

+------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableSignInWithEmail": true`` with options ``true`` and ``false``. |
+------------------------------------------------------------------------------------------------------------------+

Enable sign-in with username
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Mattermost allows users with email login to log in using their username and password. This setting does not affect AD/LDAP login.

**False**: Log in with username is disabled and does not appear on the login screen.

+--------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``EnableSignInWithUsername": true`` with options ``true`` and ``false``. |
+--------------------------------------------------------------------------------------------------------------------+

Password
~~~~~~~~~

Minimum Password Length
^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

*This feature was moved to Team Edition in Mattermost v5.0, released June 16th, 2018. Prior to v5.0, this feature is available in legacy Enterprise Edition E10 and E20.*

Minimum number of characters required for a valid password. Must be a whole number greater than or equal to 5 and less than or equal to 64.

+----------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"MinimumLength": 8`` with numerical input.                   |
+----------------------------------------------------------------------------------------------------------+

Password Requirements
^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

*This feature was moved to Team Edition in Mattermost v5.0, released June 16th, 2018. Prior to v5.0, this feature is available in legacy Enterprise Edition E10 and E20.*

Set the required character types to be included in a valid password. Defaults to allow any characters unless otherwise specified by the checkboxes. The error message previewed in the System Console will appear on the account creation page if a user enters an invalid password.

- **At least one lowercase letter**: Select this checkbox if a valid password must contain at least one lowercase letter.
- **At least one uppercase letter**: Select this checkbox if a valid password must contain at least one uppercase letter.
- **At least one number**: Select this checkbox if a valid password must contain at least one number.
- **At least one symbol**: Select this checkbox if a valid password must contain at least one symbol. Valid symbols include: ``!"#$%&'()*+,-./:;<=>?@[]^_`|~``.

This feature's ``config.json`` settings are, respectively:

.. list-table::
    :widths: 80

    * - ``"Lowercase": false`` with options ``true`` and ``false``.
    * - ``"Number": false`` with options ``true`` and ``false``.
    * - ``"Uppercase": false`` with options ``true`` and ``false``.
    * - ``"Symbol": false`` with options ``true`` and ``false``.

Maximum Login Attempts
^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Failed login attempts allowed before a user is locked out and required to reset their password via email.

+------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"MaximumLoginAttempts": 10`` with numerical input. |
+------------------------------------------------------------------------------------------------+

MFA
~~~~

Configure security settings for multi-factor authentication.

The default recommendation for secure deployment is to host Mattermost within your own private network, with VPN clients on mobile, so everything works under your existing security policies and authentication protocols, which may already include multi-factor authentication.

If you choose to run Mattermost outside your private network, bypassing your existing security protocols, we recommend you set up a multi-factor authentication service specifically for accessing Mattermost.

Enable Multi-factor Authentication
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Users with LDAP and email authentication will be given the option to require a phone-based passcode, in addition to their password-based authentication, to log in to the Mattermost server. Specifically, they'll be asked to download the `Google Authenticator <https://en.wikipedia.org/wiki/Google_Authenticator>`__ app to their iOS or Android mobile device, connect the app with their account, and then enter a passcode generated by the app on their phone whenever they log in to the Mattermost server.

**False**: Multi-factor authentication is disabled.

+-----------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableMultifactorAuthentication": false`` with options ``true`` and ``false``. |
+-----------------------------------------------------------------------------------------------------------------------------+

Enforce Multi-factor Authentication
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10 and E20*

**True**: `Multi-factor authentication (MFA) <https://docs.mattermost.com/onboard/multi-factor-authentication.html>`__ is required for login. New users will be required to configure MFA on signup. Logged in users without MFA configured are redirected to the MFA setup page until configuration is complete. If your system has users with login options other than AD/LDAP and email, MFA must be enforced with the authentication provider outside of Mattermost.

**False**: Multi-factor authentication is optional.

+------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnforceMultifactorAuthentication": false`` with options ``true`` and ``false``. |
+------------------------------------------------------------------------------------------------------------------------------+

AD/LDAP
~~~~~~~~

Enable sign-in with AD/LDAP
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10 and E20*

**True**: Mattermost allows login using AD/LDAP or Active Directory.

**False**: Login with AD/LDAP is disabled.

+----------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Enable": false`` with options ``true`` and ``false``. |
+----------------------------------------------------------------------------------------------------+

Enable Synchronization with AD/LDAP
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Mattermost periodically synchronizes users from AD/LDAP.

**False**: AD/LDAP synchronization is disabled.

+--------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableSync": false`` with options ``true`` and ``false``. |
+--------------------------------------------------------------------------------------------------------+

Login Field Name
^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

The placeholder text that appears in the login field on the login page. Typically this would be whatever name is used to refer to AD/LDAP credentials in your company, so it is recognizable to your users. Defaults to **AD/LDAP Username**.

+---------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"LoginFieldName": ""`` with string input. |
+---------------------------------------------------------------------------------------+

AD/LDAP Server
^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

The domain or IP address of the AD/LDAP server.

+-----------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"LdapServer": ""`` with string input. |
+-----------------------------------------------------------------------------------+

AD/LDAP Port
^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

The port Mattermost will use to connect to the AD/LDAP server. Defaults to ``389``.

+-------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"LdapPort": 389`` with numerical input. |
+-------------------------------------------------------------------------------------+

Connection Security
^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

The type of connection security Mattermost uses to connect to AD/LDAP.

**None**: No encryption, Mattermost will not attempt to establish an encrypted connection to the AD/LDAP server.

**TLS**: Encrypts the communication between Mattermost and your server using TLS.

**STARTTLS**: Takes an existing insecure connection and attempts to upgrade it to a secure connection using TLS.

If the "No encryption" option is selected it is highly recommended that the AD/LDAP connection is secured outside of Mattermost, for example, by adding a stunnel proxy.

+----------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ConnectionSecurity": ""`` with options ``""``, ``"TLS"``, and ``"STARTTLS"``. |
+----------------------------------------------------------------------------------------------------------------------------+

Skip Certificate Verification
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Skips the certificate verification step for TLS or STARTTLS connections. Not recommended for production environments where TLS is required. For testing only.

**False**: Mattermost does not skip certificate verification.

+-------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"SkipCertificateVerification": false`` with options ``true`` and ``false``. |
+-------------------------------------------------------------------------------------------------------------------------+

Private Key
^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

(Optional) The private key file provided by your LDAP Authentication Provider and uploaded if TLS client certificates are being used as the primary authentication mechanism.

+---------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"PrivateKeyFile": ""`` with string input. |
+---------------------------------------------------------------------------------------+

Public Certificate
^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

(Optional) The public TLS certificate file provided by your LDAP Authentication Provider and uploaded if TLS client certificates are being used as the primary authentication mechanism.

+---------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"PublicCertificateFile": ""`` with with string input. |
+---------------------------------------------------------------------------------------------------+

Bind Username
^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

The username used to perform the AD/LDAP search. This should be an account created specifically for use with Mattermost. Its permissions should be limited to read-only access to the portion of the AD/LDAP tree specified in the **Base DN** field. When using Active Directory, **Bind Username** should specify domain in ``"DOMAIN/username"`` format. This field is required, and anonymous bind is not currently supported.

+-------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"BindUsername": ""`` with string input. |
+-------------------------------------------------------------------------------------+

Bind Password
^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

Password of the user given in **Bind Username**. Anonymous bind is not currently supported.

+-------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"BindPassword": ""`` with string input. |
+-------------------------------------------------------------------------------------+

Base DN
^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

The **Base Distinguished Name** of the location where Mattermost should start its search for users in the AD/LDAP tree.

+-------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"BaseDN": ""`` with string input. |
+-------------------------------------------------------------------------------+

User Filter
^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

(Optional) Enter an AD/LDAP Filter to use when searching for user objects (accepts `general syntax <https://www.ldapexplorer.com/en/manual/109010000-ldap-filter-syntax.htm>`__). Only the users selected by the query will be able to access Mattermost.

Sample filters for Active Directory:

- To filter out disabled users: ``(&(objectCategory=Person)(!(UserAccountControl:1.2.840.113556.1.4.803:=2)))``.
- To filter out by group membership, determine the distinguishedName of your group, then use the group membership general syntax format as your filter.

  * For example, if the security group distinguishedName is ``CN=group1,OU=groups,DC=example,DC=com``, then the user filter to use is: ``(memberOf=CN=group1,OU=groups,DC=example,DC=com)``. Note that the user must explicitly belong to this group for the filter to apply.

This filter uses the permissions of the **Bind Username** account to execute the search. Administrators should make sure to use a specially created account for Bind Username with read-only access to the portion of the AD/LDAP tree specified in the **Base DN** field.

+-----------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"UserFilter": ""`` with string input. |
+-----------------------------------------------------------------------------------+

Group Filter
^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

(Optional) Enter an AD/LDAP Filter to use when searching for group objects (accepts `general syntax <https://www.ldapexplorer.com/en/manual/109010000-ldap-filter-syntax.htm>`__). Only the groups selected by the query will be able to access Mattermost.

This filter is defaulted to ``(|(objectClass=group)(objectClass=groupOfNames)(objectClass=groupOfUniqueNames))`` when blank.

.. note::
  This filter is used only when AD/LDAP Group Sync is enabled. See `AD/LDAP Group Sync documentation <https://docs.mattermost.com/onboard/ad-ldap-groups-synchronization.html>`__ for more information on enabling and configuring AD/LDAP Group Sync.

+------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"GroupFilter": ""`` with string input. |
+------------------------------------------------------------------------------------+

Enable Admin Filter
^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Enables System Admins to configure an AD/LDAP filter.

**False**: Disables the ability for System Admins to configure an AD/LDAP filter.

Admin Filter
^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

(Optional) Enter a filter to use for designating the System Admin role to users. When enabled the user is promoted to this role on their next login or at the next scheduled AD/LDAP sync. If the Admin Filter is removed, users who are currently logged in retain their Admin role. When they log out this is revoked and on their next login they will no longer have Admin privileges.

This filter default is ``false`` and must be set to ``true`` in order for the Admin Filter to be used.

+---------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableAdminFilter": false`` with options ``true`` and ``false``. |
+---------------------------------------------------------------------------------------------------------------+

Guest Filter
^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

(Optional) Enter an AD/LDAP Filter to use when searching for external users who have Guest Access to Mattermost. Only the users selected by the query will be able to log in to and use Mattermost as Guests. This filter default is blank.

See the `Guest Accounts documentation <https://docs.mattermost.com/onboard/guest-accounts.html>`__ for more information.

+------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"GuestFilter": ""`` with string input. |
+------------------------------------------------------------------------------------+

ID Attribute
^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

The attribute in the AD/LDAP server used as a unique identifier in Mattermost. It should be an AD/LDAP attribute with a value that does not change.

If a user's ID Attribute changes, a new Mattermost account (unassociated with the previous one) is created. To prevent this, it's recommended that a unique attribute such as ``objectGUID`` in Active Directory and ``entryUUID`` in LDAP be used instead.

Before making any changes confirm with your LDAP provider whether these attributes are available in your environment.

If you need to change this field after users have already logged in, use the `mattermost ldap idmigrate <https://docs.mattermost.com/manage/command-line-tools.html#mattermost-ldap-idmigrate>`__ CLI tool.

+------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"IdAttribute": ""`` with string input. |
+------------------------------------------------------------------------------------+

Login ID Attribute
^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

The attribute in the AD/LDAP server used to log in to Mattermost. Normally this attribute is the same as the **Username Attribute** field above.

If your team typically uses domain\username to log in to other services with AD/LDAP, you may enter domain\username in this field to maintain consistency between sites.

+-----------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"LoginIdAttribute": ""`` with string input. |
+-----------------------------------------------------------------------------------------+

Username Attribute
^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

The attribute in the AD/LDAP server used to populate the username field in Mattermost. This may be the same as the Login ID Attribute.

This attribute will be used within the Mattermost user interface to identify and mention users. For example, if a Username Attribute is set to **john.smith** a user typing ``@john`` will see ``@john.smith`` in their auto-complete options and posting a message with ``@john.smith`` will send a notification to that user that they've been mentioned.

The **Username Attribute** may be set to the same value used to log in to the system, called a **Login ID Attribute**, or it can be mapped to a different value.

+------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"UsernameAttribute": ""`` with string input. |
+------------------------------------------------------------------------------------------+

Email Attribute
^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

The attribute in the AD/LDAP server used to populate the email address field in Mattermost.

Email notifications will be sent to this email address, and this email address may be viewable by other Mattermost users depending on privacy settings chosen by the System Admin.

+------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EmailAttribute": ""`` with string input.    |
+------------------------------------------------------------------------------------------+

First Name Attribute
^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

(Optional) The attribute in the AD/LDAP server used to populate the first name of users in Mattermost. When set, users cannot edit their first name, since it is synchronized with the LDAP server. When left blank, users can set their first name as part of their :doc:`profile settings </welcome/manage-your-profile>`.

+----------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"FirstNameAttribute": ""`` with string input.    |
+----------------------------------------------------------------------------------------------+

Last Name Attribute
^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

(Optional) The attribute in the AD/LDAP server used to populate the last name of users in Mattermost. When set, users cannot edit their last name, since it is synchronized with the LDAP server. When left blank, users can set their last name as part of their :doc:`profile settings </welcome/manage-your-profile>`.

+-----------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"LastNameAttribute": ""`` with string input.      |
+-----------------------------------------------------------------------------------------------+

Nickname Attribute
^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

(Optional) The attribute in the AD/LDAP server used to populate the nickname of users in Mattermost. When set, users cannot edit their nickname, since it is synchronized with the LDAP server. When left blank, users can set their nickname as part of their :doc:`profile settings </welcome/manage-your-profile>`.

+--------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"NicknameAttribute": ""`` with string input.   |
+--------------------------------------------------------------------------------------------+

Position Attribute
^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

(Optional) The attribute in the AD/LDAP server used to populate the position field in Mattermost. When set, users cannot edit their position, since it is synchronized with the LDAP server. When left blank, users can set their position as part of their :doc:`profile settings </welcome/manage-your-profile>`.

+------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"PositionAttribute": ""`` with string input. |
+------------------------------------------------------------------------------------------+

Profile Picture Attribute
^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

The attribute in the AD/LDAP server used to synchronize (and lock) the profile picture used in Mattermost.

The Mattermost server will replace the user’s profile image upon login (not at the sync interval as with other attributes). The sync will not occur if the current Mattermost profile image matches the image associated with that user in AD/LDAP.

+-----------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"PictureAttribute": ""`` with string input. |
+-----------------------------------------------------------------------------------------+

Group Display Name Attribute
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

(Required) Enter an AD/LDAP Group Display name attribute used to populate Mattermost Group names.

.. note::
  This attribute is used only when AD/LDAP Group Sync is enabled. See `AD/LDAP Group Sync documentation <https://docs.mattermost.com/onboard/ad-ldap-groups-synchronization.html>`__ for more information on enabling and configuring AD/LDAP Group Sync.

+--------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"GroupDisplayNameAttribute": ""`` with string input. |
+--------------------------------------------------------------------------------------------------+

Group Id Attribute
^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

(Required) Enter an AD/LDAP Group ID attribute to use as a unique identifier for Groups. This should be an AD/LDAP value that does not change. This is usually ``entryUUID`` for LDAP and ``objectGUID`` for AD.

.. note::
  This attribute is used only when AD/LDAP Group Sync is enabled. See `AD/LDAP Group Sync documentation <https://docs.mattermost.com/onboard/ad-ldap-groups-synchronization.html>`__ for more information on enabling and configuring AD/LDAP Group Sync.

+-----------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"GroupIdAttribute": ""`` with string input. |
+-----------------------------------------------------------------------------------------+

Synchronization Interval (minutes)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

Set how often Mattermost accounts synchronize attributes with AD/LDAP, in minutes. 

When synchronizing, Mattermost queries AD/LDAP for relevant account information and updates Mattermost accounts based on changes to attributes (first name, last name, and nickname). 

When accounts are disabled in AD/LDAP users are made inactive in Mattermost, and their active sessions are revoked once Mattermost synchronizes attributes. To synchronize immediately after disabling an account, use the **AD/LDAP Synchronize Now** button.

+-----------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"SyncIntervalMinutes": 60`` with numerical input. |
+-----------------------------------------------------------------------------------------------+

.. note::
  LDAP syncs cause a large number of database read queries. Ensure that you monitor database load during a sync to determine how often these syncs should happen in your environment in order to minimize performance degradation.

Maximum Page Size
^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

The maximum number of users the Mattermost server will request from the AD/LDAP server at one time. Use this setting if your AD/LDAP server limits the number of users that can be requested at once.

- A value of 0 is unlimited and does not paginate the results.
- A value of 1500 is recommended to align with the default AD/LDAP ``MaxPageSize`` setting.

+--------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"MaxPageSize": 0`` with numerical input. |
+--------------------------------------------------------------------------------------+

Query Timeout (seconds)
^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

The timeout value for queries to the AD/LDAP server. Increase this value if you are getting timeout errors caused by a slow AD/LDAP server.

+----------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"QueryTimeout": 60`` with numerical input. |
+----------------------------------------------------------------------------------------+

AD/LDAP Test
^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

This button can be used to test the connection to the AD/LDAP server. If the test is successful, it shows a confirmation message and if there is a problem with the configuration settings it will show an error message.

AD/LDAP Synchronize Now
^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

This button causes AD/LDAP synchronization to occur as soon as it is pressed. Use it whenever you have made a change in the AD/LDAP server you want to take effect immediately. After using the button, the next AD/LDAP synchronization will occur after the time specified by the Synchronization Interval.

You can monitor the status of the synchronization job in the table below this button.

.. note::
  If synchronization **Status** displays as ``Pending`` and does not complete, make sure that the **Enable Synchronization with AD/LDAP** setting is set to ``true``.

.. figure:: ../images/ldap-sync-table.png

.. _saml-enterprise:

SAML
~~~~~

.. note::
   In line with Microsoft ADFS guidance we recommend `configuring intranet forms-based authentication for devices that do not support WIA <https://docs.microsoft.com/en-us/windows-server/identity/ad-fs/operations/configure-intranet-forms-based-authentication-for-devices-that-do-not-support-wia>`__.

Enable Login With SAML
^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

**True**: Mattermost allows login using SAML. Please see `documentation <https://docs.mattermost.com/onboard/sso-saml.html>`__ to learn more about configuring SAML for Mattermost.

**False**: Login with SAML is disabled.

+----------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Enable": false`` with options ``true`` and ``false``. |
+----------------------------------------------------------------------------------------------------+

Enable Synchronizing SAML Accounts With AD/LDAP
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

**True**: Mattermost periodically synchronizes SAML user attributes, including user deactivation and removal, with AD/LDAP. Enable and configure synchronization settings at **Authentication > AD/LDAP**. See `documentation <https://docs.mattermost.com/onboard/ad-ldap.html>`__ to learn more.

**False**: Synchronization of SAML accounts with AD/LDAP is disabled.

+----------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableSyncWithLdap": false`` with options ``true`` and ``false``. |
+----------------------------------------------------------------------------------------------------------------+

Ignore Guest Users When Synchronizing with AD/LDAP
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

Available when ``Enable Synchronizing SAML Accounts With AD/LDAP`` is set to ``true``. 

**True**: Mattermost ignores Guest Users identified by the Guest Attribute when synchronizing with AD/LDAP on user deactivation and removal. Manage guest deactivation manually via **System Console > Users**. See `documentation <https://docs.mattermost.com/onboard/ad-ldap.html>`__ to learn more.

**False**: Synchronization of SAML deactivates and removes Guest Users when synchronizing with AD/LDAP.

+------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"IgnoreGuestsLdapSync": false`` with options ``true`` and ``false``. |
+------------------------------------------------------------------------------------------------------------------+

Override SAML Bind Data with AD/LDAP Information
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

**True**: Mattermost overrides the SAML ID attribute with the AD/LDAP ID attribute if configured or overrides the SAML Email attribute with the AD/LDAP Email attribute if SAML ID attribute is not present. See `documentation <https://docs.mattermost.com/onboard/ad-ldap.html>`__ to learn more.

**False**: Mattermost uses the email attribute to bind users to SAML.

.. note::
  Moving from ``true`` to ``false`` will prevent the override from happening. To prevent the disabling of user accounts, SAML IDs must match the LDAP IDs when this feature is enabled. This setting should be set to ``false`` unless LDAP sync is enabled.

+---------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableSyncWithLdapIncludeAuth": false`` with options ``true`` and ``false``. |
+---------------------------------------------------------------------------------------------------------------------------+

Identity Provider Metadata URL
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

The URL where Mattermost sends a request to obtain setup metadata from the provider.

+---------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"IdpMetadataUrl": ""`` with string input. |
+---------------------------------------------------------------------------------------+

SAML SSO URL
^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

The URL where Mattermost sends a SAML request to start login sequence.

+-------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"IdpURL": ""`` with string input. |
+-------------------------------------------------------------------------------+

Identity Provider Issuer URL
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

The issuer URL for the Identity Provider you use for SAML requests.

+-----------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"IdpDescriptorUrl": ""`` with string input. |
+-----------------------------------------------------------------------------------------+

Identity Provider Public Certificate
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

The public authentication certificate issued by your Identity Provider.

+-------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"IdpCertificateFile": ""`` with string input. |
+-------------------------------------------------------------------------------------------+

Verify Signature
^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

**True**: Mattermost verifies that the signature sent from the SAML Response matches the Service Provider Login URL.

**False**: Not recommended for production environments. For testing only.

+---------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Verify": true`` with options ``true`` and ``false``. |
+---------------------------------------------------------------------------------------------------+

Service Provider Login URL
^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

Enter ``https://<your-mattermost-url>/login/sso/saml`` (example: ``https://example.com/login/sso/saml``). Make sure you use HTTP or HTTPS in your URL depending on your server configuration. This field is also known as the Assertion Consumer Service URL.

+----------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AssertionConsumerServiceURL": ""`` with string input. |
+----------------------------------------------------------------------------------------------------+

Service Provider Identifier
^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

The unique identifier for the Service Provider, usually the same as Service Provider Login URL. In ADFS, this must match the Relying Party Identifier.

+--------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ServiceProviderIdentifier": ""`` with string input. |
+--------------------------------------------------------------------------------------------------+

Enable Encryption
^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

**True**: Mattermost will decrypt SAML Assertions encrypted with your Service Provider Public Certificate.

**False**: Not recommended for production environments. For testing only.

+----------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Encrypt": true`` with options ``true`` and ``false``. |
+----------------------------------------------------------------------------------------------------+

Service Provider Private Key
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

The private key used to decrypt SAML Assertions from the Identity Provider.

+---------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"PrivateKeyFile": ""`` with string input. |
+---------------------------------------------------------------------------------------+

Service Provider Public Certificate
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

The certificate file used to generate the signature on a SAML request to the Identity Provider for a service provider initiated SAML login, when Mattermost is the Service Provider.

+----------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"PublicCertificateFile": ""`` with string input. |
+----------------------------------------------------------------------------------------------+

Sign Request
^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

When ``true``, Mattermost signs the SAML request using your Service Provider Private Key. When ``false``, Mattermost does not sign the SAML request.

+------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"SignRequest": ""`` with string input. |
+------------------------------------------------------------------------------------+

Signature Algorithm
^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

The signature algorithm used to sign the request. Supported options are `RSAwithSHA1 <https://www.w3.org/2000/09/xmldsig#rsa-sha1>`__, `RSAwithSHA256 <https://www.w3.org/2000/09/xmldsig#rsa-sha1>`__, and `RSAwithSHA512 <https://www.w3.org/2001/04/xmldsig-more#rsa-sha512>`__.

+-------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"SignatureAlgorithm": ""`` with string input. |
+-------------------------------------------------------------------------------------------+

Canonical Algorithm
^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

The canonicalization algorithm. Supported options are ``Canonical1.0`` for `Exclusive XML Canonicalization 1.0 (omit comments) <https://www.w3.org/TR/2002/REC-xml-exc-c14n-20020718/>`__ (``http://www.w3.org/2001/10/xml-exc-c14n#``) and ``Canonical1.1`` for `Canonical XML 1.1 (omit comments) <https://www.w3.org/TR/2008/REC-xml-c14n11-20080502/>`__ (``http://www.w3.org/2006/12/xml-c14n11``).

+-------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"CanonicalAlgorithm": "Canonical1.0"`` with string input. |
+-------------------------------------------------------------------------------------------------------+

Email Attribute
^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

The attribute in the SAML Assertion that will be used to populate the email addresses of users in Mattermost.

Email notifications will be sent to this email address, and this email address may be viewable by other Mattermost users depending on privacy settings chosen by the System Admin.

+---------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EmailAttribute": ""`` with string input. |
+---------------------------------------------------------------------------------------+

Username Attribute
^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

The attribute in the SAML Assertion that will be used to populate the username field in Mattermost user interface. This attribute will be used within the Mattermost user interface to identify and mention users. For example, if a Username Attribute is set to **john.smith** a user typing ``@john`` will see ``@john.smith`` in their auto-complete options and posting a message with ``@john.smith`` will send a notification to that user that they've been mentioned.

+------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"UsernameAttribute": ""`` with string input. |
+------------------------------------------------------------------------------------------+

Id Attribute
^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

(Optional) The attribute in the SAML Assertion used to bind users from SAML to users in Mattermost.

+------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"IdAttribute": ""`` with string input. |
+------------------------------------------------------------------------------------+

Guest Attribute
^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

(Optional) The attribute in the SAML Assertion used to apply a Guest role to users in Mattermost.

See the `Guest Accounts documentation <https://docs.mattermost.com/onboard/guest-accounts.html>`__ for more information.

+---------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"GuestAttribute": ""`` with string input. |
+---------------------------------------------------------------------------------------+

Enable Admin Attribute
^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

**True**: Enables System Admins to configure the SAML Assertion.

**False**: Disables the ability for System Admins to configure the SAML Assertion.

Admin Attribute
^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

(Optional) The attribute in the SAML Assertion for designating System Admins. The user is automatically promoted to this role on their next login. If the Admin Attribute is removed, users who are currently logged in retain their Admin role. When they log out this is revoked and on their next login they will no longer have Admin privileges.

This attribute's default is ``false`` and must be set to ``true`` in order for the Admin Attribute to be used.

+------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableAdminAttribute": false`` with options ``true`` and ``false``. |
+------------------------------------------------------------------------------------------------------------------+

First Name Attribute
^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

(Optional) The attribute in the SAML Assertion that will be used to populate the first name of users in Mattermost.

+-------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"FirstNameAttribute": ""`` with string input. |
+-------------------------------------------------------------------------------------------+

Last Name Attribute
^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

(Optional) The attribute in the SAML Assertion that will be used to populate the last name of users in Mattermost.

+------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"LastNameAttribute": ""`` with string input. |
+------------------------------------------------------------------------------------------+

Nickname Attribute
^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

(Optional) The attribute in the SAML Assertion that will be used to populate the nickname of users in Mattermost.

+------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"NicknameAttribute": ""`` with string input. |
+------------------------------------------------------------------------------------------+

Position Attribute
^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

(Optional) The attribute in the SAML Assertion that will be used to populate the position field for users in Mattermost (typically used to describe a person's job title or role at the company).

+------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"PositionAttribute": ""`` with string input. |
+------------------------------------------------------------------------------------------+

Preferred Language Attribute
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

(Optional) The attribute in the SAML Assertion that will be used to populate the language of users in Mattermost.

+----------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"LocaleAttribute": ""`` with string input. |
+----------------------------------------------------------------------------------------+

Login Button Text
^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

(Optional) The text that appears in the login button on the login page. Defaults to **SAML**.

+----------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"LoginButtonText": ""`` with string input. |
+----------------------------------------------------------------------------------------+

OAuth 2.0
~~~~~~~~~

.. note::
  
  OAuth 2.0 is being deprecated and will be replaced by `OpenID Connect <https://docs.mattermost.com/configure/configuration-settings.html#openid-connect>`__ in a future release.

Settings to configure OAuth login for account creation and login.

Select OAuth 2.0 service provider
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

Choose whether OAuth can be used for account creation and login. Options include:

- **Do not allow login via an OAuth 2.0 provider**
- **GitLab** (available in all plans; see `GitLab Settings <https://docs.mattermost.com/configure/configuration-settings.html#gitlab-settings>`__ for details)
- **Google Apps** (Available in Mattermost Enterprise and Professional; see `Google Settings <https://docs.mattermost.com/configure/configuration-settings.html#google-settings>`__ for details)
- **Office 365** (Available in Mattermost Enterprise and Professional; see `Office 365 Settings <https://docs.mattermost.com/configure/configuration-settings.html#office-365-settings>`__ for details)

This feature's setting does not appear in ``config.json``.

GitLab
''''''

Enable authentication with GitLab
.................................

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Allow team creation and account signup using GitLab OAuth. To configure, input the **Secret** and **Id** credentials.

**False**: GitLab OAuth cannot be used for team creation or account signup.

.. note:: 
   For Enterprise subscriptions, GitLab settings can be found under **OAuth 2.0**

+----------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Enable": false`` with options ``true`` and ``false``. |
+----------------------------------------------------------------------------------------------------+

Application ID
..............

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Obtain this value by logging into your GitLab account. Go to **Profile Settings > Applications > New Application**, enter a Name, then enter Redirect URLs ``https://<your-mattermost-url>/login/gitlab/complete`` (example: ``https://example.com:8065/login/gitlab/complete`` and ``https://<your-mattermost-url>/signup/gitlab/complete``.

+---------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Id": ""`` with string input. |
+---------------------------------------------------------------------------+

Application Secret Key
......................

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Obtain this value by logging into your GitLab account. Go to **Profile Settings > Applications > New Application**, enter a Name, then enter Redirect URLs ``https://<your-mattermost-url>/login/gitlab/complete`` (example: ``https://example.com:8065/login/gitlab/complete`` and ``https://<your-mattermost-url>/signup/gitlab/complete``.

+-------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Secret": ""`` with string input. |
+-------------------------------------------------------------------------------+

GitLab Site URL
................

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Specify the URL of your GitLab instance (example ``https://example.com:3000``). If your GitLab instance is not set up with SSL, start the URL with ``http://`` instead of ``https://``.

User API Endpoint
.................

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Enter ``https://<your-gitlab-url>/api/v3/user`` (example: ``https://example.com:3000/api/v3/user``). Use HTTP or HTTPS depending on how your server is configured.

+----------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"UserApiEndpoint": ""`` with string input. |
+----------------------------------------------------------------------------------------+

Auth Endpoint
..............

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Enter ``https://<your-gitlab-url>/oauth/authorize`` (example: ``https://example.com:3000/oauth/authorize``). Use HTTP or HTTPS depending on how your server is configured.

+-------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AuthEndpoint": ""`` with string input. |
+-------------------------------------------------------------------------------------+

Token Endpoint
..............

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Enter ``https://<your-gitlab-url>/oauth/token`` (example: ``https://example.com:3000/oauth/token``). Use HTTP or HTTPS depending on how your server is configured.

+--------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"TokenEndpoint": ""`` with string input. |
+--------------------------------------------------------------------------------------+

Google
''''''

Enable authentication with Google by selecting ``Google Apps`` from **OAuth 2.0 > Select OAuth 2.0 service provider**.

**True**: Allow team creation and account signup using Google OAuth. To configure, input the **Client ID** and **Client Secret** credentials. See `the documentation <https://docs.mattermost.com/onboard/sso-google.html>`__ for more detail.

**False**: Google OAuth cannot be used for team creation or account signup.

+----------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Enable": false`` with options ``true`` and ``false``. |
+----------------------------------------------------------------------------------------------------+

Client ID
.........

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

Obtain this value by registering Mattermost as an application in your Google account.

+---------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Id": ""`` with string input. |
+---------------------------------------------------------------------------+

Client Secret
.............

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

Obtain this value by registering Mattermost as an application in your Google account.

+-------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Secret": ""`` with string input. |
+-------------------------------------------------------------------------------+

User API Endpoint
..................

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

We recommend you use ``https://people.googleapis.com/v1/people/me?personFields=names,emailAddresses,nicknames,metadata`` as the User API Endpoint. Otherwise, enter a custom endpoint in ``config.json`` with HTTP or HTTPS depending on how your server is configured.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"UserApiEndpoint": "https://people.googleapis.com/v1/people/me?personFields=names,emailAddresses,nicknames,metadata"``   |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Auth Endpoint
..............

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

We recommend you use ``https://accounts.google.com/o/oauth2/v2/auth`` as the Auth Endpoint. Otherwise, enter a custom endpoint in ``config.json`` with HTTP or HTTPS depending on how your server is configured.

+---------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AuthEndpoint": "https://accounts.google.com/o/oauth2/v2/auth"`` with string input. |
+---------------------------------------------------------------------------------------------------------------------------------+

Token Endpoint
..............

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

We recommend that you use ``https://www.googleapis.com/oauth2/v4/token`` as the Token Endpoint. Otherwise, enter a custom endpoint in ``config.json`` with HTTP or HTTPS depending on how your server is configured.

+--------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"TokenEndpoint": "https://www.googleapis.com/oauth2/v4/token"`` with string input. |
+--------------------------------------------------------------------------------------------------------------------------------+

Office 365
'''''''''''

.. note::
   In line with Microsoft ADFS guidance we recommend `configuring intranet forms-based authentication for devices that do not support WIA <https://docs.microsoft.com/en-us/windows-server/identity/ad-fs/operations/configure-intranet-forms-based-authentication-for-devices-that-do-not-support-wia>`__.

Enable authentication with Office 365 by selecting **Office 365** from **System Console > Authentication > OAuth 2.0 > Select OAuth 2.0 service provider**.

**True**: Allow team creation and account signup using Office 365 OAuth. To configure, input the **Application ID** and **Application Secret Password** credentials. See `the documentation <https://docs.mattermost.com/onboard/sso-office.html>`__ for more detail.

**False**: Office 365 OAuth cannot be used for team creation or account signup.

+----------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Enable": false`` with options ``true`` and ``false``. |
+----------------------------------------------------------------------------------------------------+

Application ID
..............

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

Obtain this value by registering Mattermost as an application in your Microsoft or Office account.

+---------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Id": ""`` with string input. |
+---------------------------------------------------------------------------+

Application Secret Password
...........................

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

Obtain this value by registering Mattermost as an application in your Microsoft or Office account.

+-------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Secret": ""`` with string input. |
+-------------------------------------------------------------------------------+

Directory (tenant) ID
.....................

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

This value is the ID of the application's AAD directory.

+------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"DirectoryId": ""`` with string input. |
+------------------------------------------------------------------------------------+

User API Endpoint
.................

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

We recommend using ``https://graph.microsoft.com/v1.0/me`` as the User API Endpoint. Otherwise, enter a custom endpoint in ``config.json`` with HTTP or HTTPS depending on how your server is configured.

+---------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"UserApiEndpoint": "https://graph.microsoft.com/v1.0/me"`` with string input. |
+---------------------------------------------------------------------------------------------------------------------------+

Auth Endpoint
.............

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

We recommend using ``https://accounts.google.com/o/oauth2/v2/auth`` as the Auth Endpoint. Otherwise, enter a custom endpoint in ``config.json`` with HTTP or HTTPS depending on how your server is configured.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AuthEndpoint": "https://login.microsoftonline.com/common/oauth2/v2.0/authorize"`` with string input.                    |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Token Endpoint
..............

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

We recommend that you use ``https://login.microsoftonline.com/common/oauth2/v2.0/token`` as the Token Endpoint. Otherwise, enter a custom endpoint in ``config.json`` with HTTP or HTTPS depending on how your server is configured.

+------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"TokenEndpoint": "https://login.microsoftonline.com/common/oauth2/v2.0/token"`` with string input. |
+------------------------------------------------------------------------------------------------------------------------------------------------+

OpenID Connect
~~~~~~~~~~~~~~

Select OpenID Connect service provider
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

Choose whether OpenID Connect can be used for account creation and login. Options include:

- **Do not allow login via an OpenID provider**
- **GitLab** (available in all plans; see `GitLab Settings <https://docs.mattermost.com/configure/configuration-settings.html#gitlab-settings>`__ for details)
- **Google Apps** (Available in Mattermost Enterprise and Professional; see `Google Settings <https://docs.mattermost.com/configure/configuration-settings.html#google-settings>`__ for details)
- **Office 365** (Available in Mattermost Enterprise and Professional; see `Office 365 Settings <https://docs.mattermost.com/configure/configuration-settings.html#office-365-settings>`__ for details)
- **OpenID Connect (Other)** (Available in Mattermost Enterprise and Professional; see `OpenID Connect Settings <https://docs.mattermost.com/configure/configuration-settings.html#openid-connect-other-settings>`__ for more detail)

This feature's setting does not appear in ``config.json``.

GitLab Settings
'''''''''''''''

GitLab Site URL
................

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10 and E20. Not available in Cloud Starter.*

Specify the URL of your GitLab instance (example ``https://example.com:3000``). If your GitLab instance is not set up with SSL, start the URL with ``http://`` instead of ``https://``.

Discovery Endpoint
..................

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10 and E20*
*Not available in Cloud Starter*

Obtain this value by registering Mattermost as an application in your service provider account. Should be in the format ``https://myopenid.provider.com/{my_company}/.well-known/openid-configuration`` where the value of *{my_company}* is replaced with your organization.

Client ID
.........

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10 and E20*
*Not available in Cloud Starter*

Obtain this value by registering Mattermost as an application in your service provider account.

Client Secret
..............

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10 and E20*
*Not available in Cloud Starter*

Obtain this value by registering Mattermost as an application in your Google account.

Google Settings
'''''''''''''''

Enable authentication with Google by selecting ``Google Apps`` from **System Console > Authentication > OpenID Connect > Select service provider**.

**True**: Allow team creation and account signup using Google OpenID Connect. To configure, input the **Client ID**, **Client Secret**, and **DiscoveryEndpoint** credentials. See `the documentation <https://docs.mattermost.com/onboard/sso-google.html>`__ for more detail.

**False**: Google OpenID Connect cannot be used for team creation or account signup.

+----------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Enable": false`` with options ``true`` and ``false``. |
+----------------------------------------------------------------------------------------------------+

Discovery Endpoint
...................

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

This value is prepopulated with ``https://accounts.google.com/.well-known/openid-configuration``.

+------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"DiscoveryEndpoint": ""`` with string input. |
+------------------------------------------------------------------------------------------+

Client ID
..........

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

Obtain this value by registering Mattermost as an application in your Google account.

+---------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Id": ""`` with string input. |
+---------------------------------------------------------------------------+

Client Secret
.............

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

Obtain this value by registering Mattermost as an application in your Google account.

+-------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Secret": ""`` with string input. |
+-------------------------------------------------------------------------------+

Office 365 Settings
'''''''''''''''''''

.. note::
   In line with Microsoft ADFS guidance, we recommend `configuring intranet forms-based authentication for devices that do not support WIA <https://docs.microsoft.com/en-us/windows-server/identity/ad-fs/operations/configure-intranet-forms-based-authentication-for-devices-that-do-not-support-wia>`_.

Enable authentication with Office 365 by selecting **Office 365** from **System Console > Authentication > OpenID Connect > Select service provider**.

**True**: Allow team creation and account signup using Office 365 OpenID Connect. To configure, input the **Application ID** and **Application Secret Password** credentials. See `the documentation <https://docs.mattermost.com/onboard/sso-office.html>`__ for more detail.

**False**: Office 365 OpenID Connect cannot be used for team creation or account signup.

+----------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Enable": false`` with options ``true`` and ``false``. |
+----------------------------------------------------------------------------------------------------+

Directory (tenant) ID
.....................

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

This value is the ID of the application's AAD directory.

Discovery Endpoint
..................

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

This value is prepopulated with https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration.

Client ID
..........

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

Obtain this value by registering Mattermost as an application in your Google account.

Client Secret
..............

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

Obtain this value by registering Mattermost as an application in your Google account.

OpenID Connect (Other) 
'''''''''''''''''''''''

Enable authentication with a service provider by selecting ``OpenID Connect (Other)`` from **System Console > Authentication > OpenID Connect > Select service provider**.

**True**: Allow team creation and account signup using OpenID Connect. To configure, input the **Client ID**, **Client Secret**, and **DiscoveryEndpoint** credentials. See `the documentation <https://docs.mattermost.com/onboard/sso-openidconnect.html>`__ for more detail.

**False**: OpenID Connect cannot be used for team creation or account signup.

+----------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Enable": false`` with options ``true`` and ``false``. |
+----------------------------------------------------------------------------------------------------+

Button Name
............

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

Specify the text that displays on the OpenID login button.

+-----------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ButtonText": ""`` with string input. |
+-----------------------------------------------------------------------------------+

Button Color
.............

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

Specify the color of the OpenID login button for white labeling purposes. Use a hex code with a #-sign before the code, for example ``#145DBF``.

+------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ButtonColor": ""`` with string input. |
+------------------------------------------------------------------------------------+

Discovery Endpoint
..................

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

Obtain this value by registering Mattermost as an application in your service provider account. Should be in the format ``https://myopenid.provider.com/{my_company}/.well-known/openid-configuration`` where the value of *{my_company}* is replaced with your organization.

+------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"DiscoveryEndpoint": ""`` with string input. |
+------------------------------------------------------------------------------------------+

Client ID
..........

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

Obtain this value by registering Mattermost as an application in your service provider account.

+---------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Id": ""`` with string input. |
+---------------------------------------------------------------------------+

Client Secret
..............

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

Obtain this value by registering Mattermost as an application in your service provider account.

+-------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Secret": ""`` with string input. |
+-------------------------------------------------------------------------------+

Guest Access
~~~~~~~~~~~~

Enable Guest Access
^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10 and E20*

**True**: Allow guest invitations to channels within teams. Please see `Guest Accounts documentation <https://docs.mattermost.com/onboard/guest-accounts.html>`__ for more information.

**False**: Email signup is disabled. This limits signup to Single sign-on services like OAuth or AD/LDAP.

+----------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Enable": false`` with options ``true`` and ``false``. |
+----------------------------------------------------------------------------------------------------+

Whitelisted Guest Domains
^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10 and E20*

When populated, guest accounts can only be created by a verified email from this list of comma-separated domains.

+--------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"RestrictCreationToDomains": ""`` with string input. |
+--------------------------------------------------------------------------------------------------+

Enforce Multi-factor Authentication
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10 and E20*

This setting defaults to false and is read-only if multi-factor authentication is not enforced for regular users.

**True**: Multi-factor authentication (MFA) is required for login. New guest users will be required to configure MFA on sign-up. Logged in guest users without MFA configured are redirected to the MFA setup page until configuration is complete.

**False**: Multi-factor authentication for guests is optional.

+------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnforceMultifactorAuthentication": false`` with options ``true`` and ``false``. |
+------------------------------------------------------------------------------------------------------------------------------+

Plugins
--------

Settings to configure Mattermost plugins.

Plugin Management
~~~~~~~~~~~~~~~~~~~

Access the following configuration settings in the System Console by going to **Plugins > Plugin Management**.

Enable Plugins
^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Enables plugins on your Mattermost server. Use plugins to integrate with third-party systems, extend functionality, or customize the user interface of your Mattermost server. See `documentation <https://developers.mattermost.com/integrate/admin-guide/admin-plugins-beta/>`__ to learn more.

**False**: Disables plugins on your Mattermost server.

+---------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Enable": true`` with options ``true`` and ``false``. |
+---------------------------------------------------------------------------------------------------+

Require Plugin Signature
^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Require valid plugin signatures before starting managed or unmanaged plugins. Pre-packaged plugins are not subject to plugin signature verification. Plugins installed through the Plugin Marketplace are always subject to plugin signature verification at the time of download.

**False**: Don't require valid plugin signatures before starting managed or unmanaged plugins. Pre-packaged plugins are not subject to plugin signature verification. Plugins installed through the Plugin Marketplace are always subject to plugin signature verification at the time of download.

+---------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"RequirePluginSignature": true`` with options ``true`` and ``false``.   |
+---------------------------------------------------------------------------------------------------------------------+

Automatic Prepackaged Plugins
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Any pre-packaged plugins enabled in the configuration will be installed or upgraded automatically. If a newer version is already installed, no changes are made.

**False**: Pre-packaged plugins aren't installed or upgraded automatically but may be installed manually from the Plugin Marketplace, even when offline.

+------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AutomaticPrepackagedPlugins": true`` with options ``true`` and ``false``. |
+------------------------------------------------------------------------------------------------------------------------+

Enable Marketplace
^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Enables Plugin Marketplace on your Mattermost server for all System Admins.

**False**: Disables Plugin Marketplace on your Mattermost server for all System Admins.

+--------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableMarketplace": true`` with options ``true`` and ``false``. |
+--------------------------------------------------------------------------------------------------------------+

Enable Remote Marketplace
^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: The server will attempt to connect to the configured Plugin Marketplace to show the latest plugins. If the connection fails, the Plugin Marketplace shows only pre-packaged and already installed plugins alongside a connection error.

**False**: The server won't attempt to connect to a remote marketplace, and will show only pre-packaged and already installed plugins. Use this setting if your server can't connect to the internet.

+--------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableRemoteMarketplace": true`` with options ``true`` and ``false``. |
+--------------------------------------------------------------------------------------------------------------------+

This setting only takes effect when ``"EnableMarketplace": true``.

.. note::
   For the Remote Marketplace to operate, each host running the Mattermost service requires network access to the marketplace service endpoint (hosted at ``https://api.integrations.mattermost.com``, see `Marketplace URL <#marketplace-url>`__ ).

Marketplace URL
^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

If the Marketplace is enabled, this setting specifies which URL should be used to query for new Marketplace plugins.

+------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"MarketplaceUrl": "https://api.integrations.mattermost.com"`` with string input. |
+------------------------------------------------------------------------------------------------------------------------------+

Installed Plugin State
^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Lists installed plugins on your Mattermost server and whether they are enabled. Pre-packaged plugins are installed by default and can be deactivated, but not removed.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"PluginStates": {}`` with object input mapping plugin IDs as keys to objects, each of which contains a key ``"Enable": false`` with options ``true`` or ``false``. |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Plugin Settings
^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Settings specific to each Mattermost plugin.

+------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Plugins": {}`` with object input mapping plugin IDs as keys to objects containing plugin-specific data. |
+------------------------------------------------------------------------------------------------------------------------------------------------------+

Agenda
~~~~~~~

Access the following configuration settings in the System Console by going to **Plugins > Agenda**.

Enable Plugin
^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

**True**: Enables the Agenda plugin on your Mattermost server.

**False**: Disables the Agenda plugin on your Mattermost server.

Antivirus
~~~~~~~~~~

This plugin allows the forwarding of uploaded files to an antivirus scanning application, `ClamAV anti-virus software <https://www.clamav.net/>`__, and prevents the upload from completing if there is a virus detected in the file. 

Use this plugin to prevent users from inadvertently spreading malware or viruses via your Mattermost server. See the `Mattermost Antivirus Plugin <https://github.com/mattermost/mattermost-plugin-antivirus>`__ documentation for details.

Access the following configuration settings in the System Console by going to **Plugins > Antivirus**.

Enable Plugin
^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

**True**: Enables the Antivirus plugin on your Mattermost server.

**False**: Disables the Antivirus plugin on your Mattermost server.

ClamAV - Host and Port
^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Specify the hostname and port to connect to the ClamAV server.

Scan Timeout (seconds)
^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Specify how long the virus scan can take before timing out.

Apps
~~~~

Enable Plugin
^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud.rst
  :start-after: :nosearch:

**True**: Enables the Apps plugin on your Mattermost server.

**False**: Disables the Apps plugin on your Mattermost server.

To create your own Mattermost App, see the `Mattermost Apps <https://developers.mattermost.com/integrate/apps/>`__ developer documentation.

Autolink
~~~~~~~~~

This plugin creates regular expression (regexp) patterns that are reformatted into a Markdown link before the message is saved into the database. System Admins can configure this plugin in the ``config.json`` file, using the ``/autolink`` slash command (when enabled), or through using the System Console. See the `Autolink Plugin <https://github.com/mattermost/mattermost-plugin-autolink/blob/master/README.md>`__ documentation for details.

Access the following configuration settings in the System Console by going to **Plugins > Autolink**.

Enable Plugin
^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

**True**: Enables the Autolink plugin on your Mattermost server.

**False**: Disables the Autolink plugin on your Mattermost server.

Enable administration with /autolink command
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

**True**: Enables the ability to configure the Apps plugin using the ``/autolink`` slash command.

**False**: Disables the ability to use the slash command to configure the plugin.

Apply plugin to updated posts as well as new posts
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

**True**: Applies the plugin to updated posts as well as new posts. 

**False**: Applies the plugin to new posts only.

Admin User IDs
^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Specify users authorized to administer the plugin in addition to System Admins. Separate multiple user IDs with commas.

.. tip::
  Find user IDs by going to **System Console > User Management > Users**.

AWS SNS
~~~~~~~~

This plugin is used to receive alert notifications from `Amazon AWS CloudWatch <https://aws.amazon.com/cloudwatch/>`__ to Mattermost channels via `AWS Simple Notification Server (SNS) <https://docs.aws.amazon.com/sns/latest/dg/welcome.html>`__. 

Access the following configuration settings in the System Console by going to **Plugins > AWS SNS**.

Enable Plugin
^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

**True**: Enables the AWS SNS plugin on your Mattermost server.

**False**: Disables the AWS SNS plugin on your Mattermost server.

Channel to send notifications to
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Specify the channel to send notifications to in the format ``teamname,channelname``. For example, for a channel with a URL of ``https://example.com/myteam/channels/mychannel``, set the value to ``myteam,mychannel``. If the specified channel does not exist, the plugin creates the channel for you.

Authorized User IDs
^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Specify users authorized to accept AWS SNS subscriptions to a Mattermost channel. Separate multiple user IDs with commas.

.. tip::
  Find user IDs by going to **System Console > User Management > Users**.

Token
^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Generate a token to validate incoming requests from AWS SNS by selecting ``Regenerate``.

Calls (beta)
~~~~~~~~~~~~

Access the following configuration settings in the System Console by going to **Plugins > Calls**.

Enable Plugin
^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Enables the calls plugin on your Mattermost workspace.

**False**: Disables the calls plugin on your Mattermost workspace.

RTC Server Port
^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

The UDP port the RTC server will listen on. All calls traffic will be served through this port. The Default setting is 8443.

Changing this setting requires a plugin restart to take effect.

Enable on specific channels
^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

**True**: Allow Channel Admins to enable or disable calls on specific channels. It also allows participants in DMs/GMs to enable or disable calls.

**False**: Only System Admins will be able to enable or disable calls on specific channels.

Enable on all channels
^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

**True**: Enable calls by default on all channels.

**False**: Calls have to be explicitly enabled on channels.

Max call participants
^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

The maximum number of participants that can join a single call. This is an optional field and default is 0 (unlimited). The maximum recommended setting is 200.

ICE Host Override
^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

An optional override to the host that gets advertised to clients when connecting to calls. Depending on the network infrastructure (e.g. instance behind a NAT device) it may be necessary to set this field to the client facing external IP in order to let clients connect successfully. When empty or unset, the RTC service will attempt to automatically find the instance's public IP through STUN.

This is an optional field. Changing this setting requires a plugin restart to take effect.

ICE Servers Configurations
^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

A list of ICE servers (STUN/TURN) to be used by the service. Value should be valid JSON.

Default is ``[{"urls": ["stun:stun.global.calls.mattermost.com:3478"]}]``

**Example**

.. code-block:: json

  [
   {
      "urls":[
         "stun:stun.global.calls.mattermost.com:3478"
      ]
   },
   {
      "urls":[
         "turn:turn.example.com:3478"
      ],
      "username":"webrtc",
      "credentials":"turnpassword"
   }
  ]

This is an optional field. Changing this setting may require a plugin restart to take effect.

TURN Static Auth Secret
^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

A static secret used to generate short-lived credentials for TURN servers.

This is an optional field.

TURN Credentials Expiration
^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

The expiration, in minutes, of the short-lived credentials generated for TURN servers.

Server Side TURN
^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

**True**: The RTC server will use the configured TURN candidates for server-initiated connections.

**False**: TURN will be used only on the client-side.

Changing this setting requires a plugin restart to take effect.

RTCD Service URL
^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

The URL to a running `rtcd <https://github.com/mattermost/rtcd>`__ service instance that will host the calls. When set (non empty) all the calls will be handled by this external service.

This is an optional field. Changing this setting requires a plugin restart to take effect.

Channel Export
~~~~~~~~~~~~~~

Access the following configuration settings in the System Console by going to **Plugins > Channel Export**.

Enable Plugin
^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Enables the Channel Export plugin on your Mattermost workspace.

**False**: Disables the Channel Export plugin on your Mattermost workspace.

Demo Plugin
~~~~~~~~~~~

Access the following configuration settings in the System Console by going to **Plugins > Demo Plugin**.

Enable Plugin
^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

**True**: Enables the Demo plugin on your Mattermost workspace.

**False**: Disables the Demo plugin on your Mattermost workspace.

Channel Name
^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Specify the channel to use as part of the demo plugin. If the specified channel does not exist, the plugin creates the channel for you.

Username
^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Specify the user to use as part of the demo plugin. If the specified user does not exist, the plugin creates the user for you.

GIF commands
~~~~~~~~~~~~

Access the following configuration settings in the System Console by going to **Plugins > GIF commands**.

This plugin is used to post GIFs from Gfycat, Giphy, or Tenor using slash commands.

Enable Plugin
^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

**True**: Enables the GIF commands plugin on your Mattermost server.

**False**: Disables the GIF commands plugin on your Mattermost server.

Display the GIF as
^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Display the GIF as an embedded image where the GIF can't be collapsed, or as a collapsible image preview where the full URL displays. 

.. note::
   `Link previews <https://docs.mattermost.com/configure/configuration-settings.html#enable-link-previews>`__ must be enabled in order to display GIF link previews. Mattermost deployments restricted to access behind a firewall must open port 443 to both ``https://api.gfycat.com/v1`` and ``https://gfycat.com/<id>`` (for all request types) for this feature to work.

GIF Provider
^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Specify the GIF provider as GIPHY, Tenor, or Gfycat.

.. note::
  Selecting GIPHY or Tenor requires an API Key for this feature to work. An API key is not required for Gfycat.

Giphy/Tenor API Key
^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Configure your own API Key when specifying the GIF Provider as GIPHY or Tenor. An API key is not required for Gfycat. 

To get your own API key, see the `GIPHY Developers Quick Start <https://developers.giphy.com/docs/api/#quick-start-guide>`__ documentation, or the `Tenor Developer <https://tenor.com/developer/keyregistration>`__ documentation for details.

Content Rating (GIPHY & Tenor only)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Select an `MPAA-style content rating <https://en.wikipedia.org/wiki/Motion_Picture_Association_film_rating_system>`__ for GIFs from GIPHY or Tenor. Leave this field empty to disable content filtering.

Gfycat display style
^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Specify the display style for GIFs from Gfycat. See the `Gfycat Developer API <https://developers.gfycat.com/api/>`__ documentation for details.

GIPHY display style
^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Specify the display style for GIFs from GIPHY. See the `GIPHY Developers Rendition Guide <https://developers.giphy.com/docs/optional-settings/>`__ for details.

Tenor display style
^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Specify the display style for GIFs from Tenor. See the `Tenor API <https://tenor.com/gifapi/documentation#responseobjects-gifformat>`__ documentation for details.

Language
^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Specify the language used to search GIFs from GIPHY. See the `GIPHY Developers Language Support <https://developers.giphy.com/docs/optional-settings/#language-support>`__ documentation for details.

Force GIF preview before posting (force /gifs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

**True**: Enabled by default to prevent accidental posting of inappropriate GIFs from a provider that does not support content rating filtering.

**False**: Both ``/gif`` and ``/gifs`` slash commands are available for the GIF commands plugin on your Mattermost server.

Mattermost Boards
~~~~~~~~~~~~~~~~~

Mattermost Boards is an open source alternative to Trello, Notion, and Asana that's integrated from Mattermost v5.36. Boards is a project management tool that helps define, organize, track and manage work across teams, using a familiar kanban board view. See the `Mattermost Boards <https://docs.mattermost.com/guides/boards.html>`__ product documentation for details.

Access the following configuration settings in the System Console by going to **Plugins > Mattermost Boards**.

Enable Plugin
^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Enables the Mattermost Boards plugin on your Mattermost workspace.

**False**: Disables the Mattermost Boards plugin on your Mattermost workspace.

Mattermost Playbooks
~~~~~~~~~~~~~~~~~~~~

Mattermost Playbooks is an open source, self-hosted collaboration tool for teams. Each playbook represents a recurring outcome or specific goal that your teams collaborate on to achieve, such as service outage recovery or customer onboarding. Teams run a playbook every time they want to orchestrate people, tools, and data to achieve that outcome as quickly as possible while providing visibility to stakeholders. Playbooks also allow teams to incorporate learnings from the retrospective to tweak and improve the playbook with every iteration. See the `Mattermost Playbooks <https://docs.mattermost.com/guides/playbooks.html>`__ documentation for details.

Access the following configuration settings in the System Console by going to **Plugins > Playbooks**.

Enable Plugin
^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Enables the Mattermost Playbooks plugin on your Mattermost workspace.

**False**: Disables the Mattermost Playbooks plugin on your Mattermost workspace.

Enabled Teams
^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Enable Playbooks for all Mattermost teams, or for only selected teams.

Enable Experimental Features
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Enables experimental Playbooks features on your Mattermost workspace.

**False**: Disables experimental Playbooks features on your Mattermost workspace.

User Satisfaction Surveys
~~~~~~~~~~~~~~~~~~~~~~~~~

This plugin enables Mattermost to send user satisfaction surveys to gather feedback and improve product quality directly from your Mattermost users. Please refer to the `Mattermost Privacy Policy <https://mattermost.com/privacy-policy/>`__ for more information on the collection and use of information received through Mattermost services.

Access the following configuration settings in the System Console by going to **Plugins > User Satisfaction Surveys**.

Enable Plugin
^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Enables the Mattermost Playbooks plugin on your Mattermost workspace.

**False**: Disables the Mattermost Playbooks plugin on your Mattermost workspace.

Enable User Satisfaction Survey
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: A user satisfaction survey will be sent out to all users on a quarterly basis. The survey results will be used by Mattermost, Inc. to improve the quality and user experience of the product. Please refer to the `Mattermost Privacy Policy <https://mattermost.com/privacy-policy/>`__ for more information on the collection and use of information received through Mattermost services.

**False**: User satisfaction surveys are disabled. 

Zoom
~~~~

This plugin allows team members to initiate a Zoom meeting with a single click. All participants in a channel can easily join the Zoom meeting and the shared link is updated when the meeting is over. See the `Zoom Conferencing Plugin <https://mattermost.gitbook.io/plugin-zoom/>`__ product documentation for details.

.. note::
  To set up this plugin, you need to create a Zoom App using a Zoom Administrator account. See the `Zoom Configuration <https://mattermost.gitbook.io/plugin-zoom/installation/zoom-configuration>`__ documentation for details. 

Access the following configuration settings in the System Console by going to **Plugins > Zoom**.

Enable Plugin
^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

**True**: Enables the Zoom plugin on your Mattermost server.

**False**: Disables the Zoom plugin on your Mattermost server.

Zoom URL
^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Specify the URL for a self-hosted private cloud or on-premise Zoom server. For example, ``https://yourzoom.com``. Leave blank if you're using Zoom's vendor-hosted SaaS service.

Zoom API URL
^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Specify the API URL for a self-hosted private cloud or on-premise Zoom server. For example, ``https://api.yourzoom.com/v2``. Leave blank if you're using Zoom's vendor-hosted SaaS service.

Enable OAuth
^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

**True**: OAuth will be used as the authentication means with Zoom.

**False**: JWT will be used as the authentication means with Zoom.

.. note::

  If you are currently using a JWT Zoom application and switch to OAuth, all users will need to connect their Zoom account using OAuth the next time they try to start a meeting. See the `Zoom Configuration <https://mattermost.gitbook.io/plugin-zoom/installation/zoom-configuration>`__ documentation for details.

OAuth by Account Level App (Beta)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

**True**: Only an account administrator has to log in. The rest of the users will use their e-mail to log in.

**False**: All users must use their e-mail to log in.

Zoom OAuth Client ID
^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Specify the Client ID for the OAuth app registered with Zoom. Leave blank if not using OAuth.

Zoom OAuth Client Secret
^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Specify the Client Secret for the OAuth app registered with Zoom. Leave blank if not using OAuth.

At Rest Token Encryption Key
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Generate an AES encryption key for Zoom OAuth Token used to encrypt stored access tokens by selecting ``Regenerate``. Regenerating the key invalidates your existing Zoom OAuth.

API Key
^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Specify the API Key generated by Zoom used to create meetings and pull user data.

API Secret
^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Specify the API Secret generated by Zoom for your API key.

Webhook Secret
^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Generate a secret for the webhook URL endpoint used to authenticate the webhook to Mattermost. Regenerating the secret invalidates your existing Zoom plugin.

Integrations
-------------

Settings to configure webhooks, slash commands, and external integration services.

Integration Management
~~~~~~~~~~~~~~~~~~~~~~~~~

Access the following configuration settings in the System Console by going to **Integrations > Integration Management**.

Enable Incoming Webhooks
^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Developers building integrations can create webhook URLs for Public channels and Private channels. Please see our `documentation page <https://docs.mattermost.com/developer/webhooks-incoming.html>`__ to learn about creating webhooks, viewing samples, and letting community know about integrations you've built.

**True**: Incoming webhooks are allowed. To manage incoming webhooks, select **Integrations** from the Mattermost Product menu. The webhook URLs created can be used by external applications to create posts in any Public or Private channels that you have access to.

**False**: The **Integrations > Incoming Webhooks** section of the Mattermost Product menu is hidden and all incoming webhooks are disabled.

.. important::
   Security note: By enabling this feature, users may be able to perform `phishing attacks <https://en.wikipedia.org/wiki/Phishing>`__ by attempting to impersonate other users. To combat these attacks, a BOT tag appears next to all posts from a webhook. Enable at your own risk.

+-------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableIncomingWebhooks": true`` with options ``true`` and ``false``. |
+-------------------------------------------------------------------------------------------------------------------+

Enable Outgoing Webhooks
^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Developers building integrations can create webhook tokens for Public channels. Trigger words are used to fire new message events to external integrations. For security reasons, outgoing webhooks are only available in Public channels. Please see our `documentation page <https://docs.mattermost.com/developer/webhooks-outgoing.html>`__ to learn about creating webhooks and viewing samples.

**True**: Outgoing webhooks will be allowed. To manage outgoing webhooks, select **Integrations** from the Mattermost Product menu.

**False**: The **Integrations > Outgoing Webhooks** of the Mattermost Product menu is hidden and all outgoing webhooks are disabled.

.. important:: 
   Security note: By enabling this feature, users may be able to perform `phishing attacks <https://en.wikipedia.org/wiki/Phishing>`__ by attempting to impersonate other users. To combat these attacks, a BOT tag appears next to all posts from a webhook. Enable at your own risk.

+-------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableOutgoingWebhooks": true`` with options ``true`` and ``false``. |
+-------------------------------------------------------------------------------------------------------------------+

Enable Custom Slash Commands
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Slash commands send events to external integrations that send a response back to Mattermost.

**True**: Allow users to create custom slash commands from **Main Menu > Integrations > Commands**.

**False**: Slash commands are hidden in the **Integrations** user interface.

+------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableCommands": false`` with options ``true`` and ``false``. |
+------------------------------------------------------------------------------------------------------------+

Enable OAuth 2.0 Service Provider
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Mattermost acts as an OAuth 2.0 service provider allowing Mattermost to authorize API requests from external applications.

**False**: Mattermost does not function as an OAuth 2.0 service provider.

+------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableOAuthServiceProvider": false`` with options ``true`` and ``false``. |
+------------------------------------------------------------------------------------------------------------------------+

Enable integrations to override usernames
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Webhooks, slash commands, OAuth 2.0 apps, and other integrations such as `Zapier <https://docs.mattermost.com/integrations/zapier.html>`__, will be allowed to change the username they are posting as. If no username is present, the username for the post is the same as it would be for a setting of ``False``.

**False**: Custom slash commands can only post as the username of the user who used the slash command. OAuth 2.0 apps can only post as the username of the user who set up the integration. For incoming webhooks and outgoing webhooks, the username is "webhook". See https://developers.mattermost.com/integrate/other-integrations/ for more details.

+------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnablePostUsernameOverride": false`` with options ``true`` and ``false``. |
+------------------------------------------------------------------------------------------------------------------------+

Enable integrations to override profile picture icons
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Webhooks, slash commands, and other integrations, such as `Zapier <https://docs.mattermost.com/integrations/zapier.html>`__, will be allowed to change the profile picture they post with.

**False**: Webhooks, slash commands, and OAuth 2.0 apps can only post with the profile picture of the account they were set up with. See https://developers.mattermost.com/integrate/other-integrations/ for more details.

+--------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnablePostIconOverride": false`` with options ``true`` and ``false``. |
+--------------------------------------------------------------------------------------------------------------------+

Enable Personal Access Tokens
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Users can create `personal access tokens <https://developers.mattermost.com/integrate/admin-guide/admin-personal-access-token/>`__ for integrations in **Profile > Security**. They can be used to authenticate against the API and give full access to the account.

To manage who can create personal access tokens or to search users by token ID, go to the **System Console > Users** page.

**False**: Personal access tokens are disabled on the server.

+--------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableUserAccessTokens": false`` with options ``true`` and ``false``. |
+--------------------------------------------------------------------------------------------------------------------+

Bot Accounts
~~~~~~~~~~~~

Access the following configuration settings in the System Console by going to **Integrations > Bot Accounts**.

Enable Bot Account Creation
^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Users can create bot accounts for integrations in **Integrations > Bot Accounts**. Bot accounts are similar to user accounts except they cannot be used to log in. See `documentation <https://developers.mattermost.com/integrate/admin-guide/admin-bot-accounts/>`__ to learn more.

**False**: Bot accounts cannot be created through the user interface or the RESTful API. Plugins can still create and manage bot accounts.

+----------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableBotAccountCreation": false`` with options ``true`` and ``false``. |
+----------------------------------------------------------------------------------------------------------------------+

Disable bot accounts when owner is deactivated
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: When a user is deactivated, disables all bot accounts managed by the user. To re-enable bot accounts, go to **Integrations > Bot Accounts**.

**False**: When a user is deactivated, all bot accounts managed by the user remain active.

+-------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"DisableBotsWhenOwnerIsDeactivated": false`` with options ``true`` and ``false``. |
+-------------------------------------------------------------------------------------------------------------------------------+

GIF (Beta)
~~~~~~~~~~

Access the following configuration settings in the System Console by going to **Integrations > GIF (Beta)**.

Enable GIF Picker
^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Allow users to select GIFs from the emoji picker via a Gfycat integration.

**False**: GIFs cannot be selected in the emoji picker.

+------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableGifPicker": true`` with options ``true`` and ``false``. |
+------------------------------------------------------------------------------------------------------------+

.. note::
   `Link previews <https://docs.mattermost.com/configure/configuration-settings.html#enable-link-previews>`__ must be enabled in order to display GIF link previews. Mattermost deployments restricted to access behind a firewall must open port 443 to both https://api.gfycat.com/v1 and https://gfycat.com/<id> (for all request types) for this feature to work.

Gfycat API Key
^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

When blank, uses the default API key provided by Gfycat. Alternatively, a unique API key can be requested at https://developers.gfycat.com/signup/#/. Enter the client ID you receive via email to this field.

+-----------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"GfycatApiKey": "2_KtH_W5"`` with string input.   |
+-----------------------------------------------------------------------------------------------+

Gfycat API Secret
^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

The API secret generated by Gfycat for your API key. When blank, uses the default API secret provided by Gfycat.

+---------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"GfycatApiSecret": "3wLVZPiswc3DnaiaFoLkDvB4X0IV6CpMkj4tf2inJRsBY6-FnkT08zGmppWFgeof"`` with string input.  |
+---------------------------------------------------------------------------------------------------------------------------------------------------------+

CORS
~~~~~

Access the following configuration settings in the System Console by going to **Integrations > CORS**.

Enable cross-origin requests from
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Enable HTTP cross-origin requests from specific domains separated by spaces. Type ``*`` to allow CORS from any domain or leave it blank to disable it.

.. note::
 Please make sure you have entered your Site URL before enabling this setting to prevent losing access to the System Console after saving. If you experience lost access to the System Console after changing this setting, you can set your `Site URL <https://docs.mattermost.com/configure/configuration-settings.html#site-url>`__ through the ``config.json`` file.

+--------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AllowCorsFrom": ""`` with string input. |
+--------------------------------------------------------------------------------------+

CORS Exposed Headers
^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Whitelist of headers that will be accessible to the requester.

+-------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"CorsExposedHeaders": ""`` with string input. |
+-------------------------------------------------------------------------------------------+

CORS Allow Credentials
^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

**True**: Requests that pass validation will include the ``Access-Control-Allow-Credentials`` header.

**False**: Requests won't include the ``Access-Control-Allow-Credentials`` header.

+------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"CorsAllowCredentials": false`` with options ``true`` and ``false``. |
+------------------------------------------------------------------------------------------------------------------+

CORS Debug
^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

**True**: Prints messages to the logs to help when developing an integration that uses CORS. These messages will include the structured key value pair ``"source": "cors"``.

**False**: Debug messages not printed to the logs.

+-------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"CorsDebug": false`` with options ``true`` and ``false``. |
+-------------------------------------------------------------------------------------------------------+

Compliance
------------

Data Retention Policies
~~~~~~~~~~~~~~~~~~~~~~~

Changes to properties in this section require a server restart before taking effect.

.. warning:: 
   Once a message or a file is deleted, the action is irreversible. Please be careful when setting up a custom data retention policy.

Access the following configuration settings in the System Console by going to **Compliance > Data Retention Policies**.


Global Retention Policy for Messages
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

Set how long Mattermost keeps messages across all teams and channels. Doesn't apply to custom retention policies. Requires the `global retention policy for messages <https://docs.mattermost.com/configure/configuration-settings.html#enable-global-retention-policy-for-messages>`__ configuration setting to be set to ``true``.

By default, messages are kept forever. If **Days** or **Years** is chosen, set how many days or years messages are kept in Mattermost. Messages older than the duration you set will be deleted nightly. The minimum time is one day.

+-------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"MessageRetentionDays": 365`` with numerical input. |
+-------------------------------------------------------------------------------------------------+

Global Retention Policy for Files
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

Set how long Mattermost keeps files across all teams and channels. Doesn't apply to custom retention policies. Requires the `global retention policy for files <https://docs.mattermost.com/configure/configuration-settings.html#enable-global-retention-policy-for-files>`__ configuration setting to be set to ``true``.

By default, messages are kept forever. If **Days** or **Years** is chosen, set how many days or years files are kept in Mattermost. Files older than the duration you set will be deleted nightly. The minimum time is one day.

+----------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"FileRetentionDays": 365`` with numerical input. |
+----------------------------------------------------------------------------------------------+

Custom retention policy
^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

Set how long Mattermost keeps messages and files across specific teams and channels by specifying a name for the custom retention policy, setting a duration value, specifying the teams and channels that will follow this policy.

Data Deletion Time
^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

Set the start time of the daily scheduled data retention job. Choose a time when fewer people are using your system. Must be a 24-hour time stamp in the form ``HH:MM``.

This setting is based on the local time of the server.

+-------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"DeletionJobStartTime": "02:00"`` with 24-hour timestamp input in the form ``"HH:MM"``. |
+-------------------------------------------------------------------------------------------------------------------------------------+

Run Deletion Job Now
^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

Start a Data Retention deletion job immediately. You can monitor the status of the job in the data deletion job table within the Policy Log section.

Compliance Export
~~~~~~~~~~~~~~~~~~

Access the following configuration settings in the System Console by going to **Compliance > Compliance Export**.

Enable Compliance Export
^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available as an add-on to legacy Enterprise Edition E20*

**True**: Mattermost will generate a compliance export file that contains all messages that were posted in the last 24 hours. The export task is scheduled to run once per day. See the `documentation to learn more <https://docs.mattermost.com/comply/compliance-export.html>`__.

**False**: Mattermost doesn't generate a compliance export file.

+----------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableExport": false`` with options ``true`` and ``false``. |
+----------------------------------------------------------------------------------------------------------+

Compliance Export Time
^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available as an add-on to legacy Enterprise Edition E20*

Set the start time of the daily scheduled compliance export job. Choose a time when fewer people are using your system. Must be a 24-hour time stamp in the form ``HH:MM``.

This setting is based on the local time of the server.

+---------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"DailyRunTime": 01:00`` with 24-hour timestamp input in the form ``"HH:MM"``. |
+---------------------------------------------------------------------------------------------------------------------------+

Export File Format
^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available as an add-on to legacy Enterprise Edition E20*

File format of the compliance export. Corresponds to the system that you want to import the data into.

Currently supported formats are CSV, Actiance XML, and Global Relay EML.

If Global Relay is chosen, the following options will be presented:

Global Relay Customer Account
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available as an add-on to legacy Enterprise Edition E20*

Type of Global Relay customer account your organization has, either ``A9/Type 9`` or ``A10/Type 10``.

+-------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"CustomerType": "A9/Type 9"`` with options ``"A9/Type 9"`` and ``"A10/Type 10"``. |
+-------------------------------------------------------------------------------------------------------------------------------+

Global Relay SMTP Username
^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available as an add-on to legacy Enterprise Edition E20*

The username for authenticating to the Global Relay SMTP server.

+-------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"SmtpUsername": ""`` with string input. |
+-------------------------------------------------------------------------------------+

Global Relay SMTP Password
^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available as an add-on to legacy Enterprise Edition E20*

The password associated with the Global Relay SMTP username.

+-------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"SmtpPassword": ""`` with string input. |
+-------------------------------------------------------------------------------------+

Global Relay Email Address
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available as an add-on to legacy Enterprise Edition E20*

The email address your Global Relay server monitors for incoming compliance exports.

+-------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EmailAddress": ""`` with string input. |
+-------------------------------------------------------------------------------------+

Run Compliance Export Job Now
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available as an add-on to legacy Enterprise Edition E20*

This button initiates a compliance export job immediately. You can monitor the status of the job in the compliance export job table.

Compliance Monitoring
~~~~~~~~~~~~~~~~~~~~~~

Settings used to enable and configure Mattermost compliance reports. 

Access the following configuration settings in the System Console by going to **Compliance > Compliance Monitoring**.

Enable Compliance Reporting
^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available as an add-on to legacy Enterprise Edition E20*

**True**: Compliance reporting is enabled in Mattermost.

**False**: Compliance reporting is disabled.

+----------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Enable": false`` with options ``true`` and ``false``. |
+----------------------------------------------------------------------------------------------------+

Compliance Report Directory
^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available as an add-on to legacy Enterprise Edition E20*

Sets the directory where compliance reports are written.

+-----------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Directory": "./data/"`` with string input. |
+-----------------------------------------------------------------------------------------+

Enable Daily Report
^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available as an add-on to legacy Enterprise Edition E20*

**True**: Mattermost generates a daily compliance report.

**False**: Daily reports are not generated.

+---------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableDaily": false`` with options ``true`` and ``false``. |
+---------------------------------------------------------------------------------------------------------+

Batch Size
^^^^^^^^^^

.. include:: ../_static/badges/ent-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available as an add-on to legacy Enterprise Edition E20*

Set the size of the batches in which posts will be read from the database to generate the compliance report. This setting is currently not available in the System Console and can only be set in ``config.json``.

+------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"BatchSize": 30000`` with default value ``30000``. |
+------------------------------------------------------------------------------------------------+

Custom Terms of Service
~~~~~~~~~~~~~~~~~~~~~~~

Access the following configuration settings in the System Console by going to **Compliance > Custom Terms of Service**.

Enable Custom Terms of Service
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available as an add-on to legacy Enterprise Edition E20*

.. note::
  This configuration setting can only be modified using the System Console user interface.

**True**: New users must accept the Terms of Service before accessing any Mattermost teams on desktop, web, or mobile. Existing users must accept them after login or a page refresh. To update the Terms of Service link displayed in account creation and login pages, go to **System Console > Legal and Support > Terms of Service Link**.

**False**: During account creation or login, users can review Terms of Service by accessing the link configured via **System Console > Legal and Support > Terms of Service link**.

Custom Terms of Service Text
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available as an add-on to legacy Enterprise Edition E20*

Text that will appear in your custom Terms of Service. Supports Markdown-formatted text.

Re-Acceptance Period
^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available as an add-on to legacy Enterprise Edition E20*

The number of days before Terms of Service acceptance expires, and the terms must be re-accepted.

Defaults to 365 days. 0 indicates the terms do not expire.

Experimental
-------------

There are a number of settings considered "experimental" that are configurable from the System Console. These may be replaced or removed in a future release.

AD/LDAP Settings
~~~~~~~~~~~~~~~~

Access the following configuration settings in the System Console by going to **Experimental > Features**.

AD/LDAP Login Button Color
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

Specify the color of the AD/LDAP login button for white labeling purposes. Use a hex code with a #-sign before the code. This setting only applies to the mobile apps.

+-------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"LoginButtonColor": ""`` with string input.                                       |
+-------------------------------------------------------------------------------------------------------------------------------+

AD/LDAP Login Button Border Color
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

Specify the color of the AD/LDAP login button border for white labeling purposes. Use a hex code with a #-sign before the code. This setting only applies to the mobile apps.

+-------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"LoginButtonBorderColor": ""`` with string input.                                 |
+-------------------------------------------------------------------------------------------------------------------------------+

AD/LDAP Login Button Text Color
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

Specify the color of the AD/LDAP login button text for white labeling purposes. Use a hex code with a #-sign before the code. This setting only applies to the mobile apps.

+-------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"LoginButtonTextColor": ""`` with string input.                                   |
+-------------------------------------------------------------------------------------------------------------------------------+

Allow Authentication Transfer
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10 and E20*

**True**: Users can change their login method to any that is enabled on the server, either via **Profile > Security** or the APIs.

**False**: Users cannot change their login method, regardless of which authentication options are enabled.

+-------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ExperimentalEnableAuthenticationTransfer": true`` with options ``true`` and ``false``. |
+-------------------------------------------------------------------------------------------------------------------------------------+

Link Metadata Timeout
^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Adds a configurable timeout for requests made to return link metadata. If the metadata is not returned before this timeout expires, the message will post without requiring metadata. This timeout covers the failure cases of broken URLs and bad content types on slow network connections.

+---------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"LinkMetadataTimeoutMilliseconds": 5000`` with numerical input.                     |
+---------------------------------------------------------------------------------------------------------------------------------+

Bleve Settings
~~~~~~~~~~~~~~

Access the following configuration settings in the System Console by going to **Experimental > Bleve**.

Enable Bleve Indexing
^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

**True**: The indexing of new posts occurs automatically. Search queries will not use bleve search until `Enable Bleve for search queries <https://docs.mattermost.com/configure/configuration-settings.html#enable-bleve-for-search-queries>`__ is enabled.

**False**: The indexing of new posts does not occur automatically.

+------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableIndexing": false`` with options ``true`` and ``false``. |
+------------------------------------------------------------------------------------------------------------+

Index Directory
^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Directory path to use for storing bleve indexes. 

.. tip::
   
   The bleve index directory path isn't required to exist within the ``mattermost`` directory. When it exists outside of the ``mattermost`` directory, no  additional steps are needed to preserve or reindex these files as part of a Mattermost upgrade. See our `Upgrading Mattermost Server <https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html>`__ documentation for details. 

+-----------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"IndexDir": ""`` with string input.                           |
+-----------------------------------------------------------------------------------------------------------+

Bulk Index Now
^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Select **Index Now** to index all users, channels, and posts in the database from oldest to newest. Bleve is available during indexing, but search results may be incomplete until the indexing job is complete.

You can configure the maximum time window used for a batch of posts being indexed. See the `Bulk Indexing Time Window Seconds <https://docs.mattermost.com/configure/configuration-settings.html#bulk-indexing-time-window-seconds>`__ documentation for details.

Purge Indexes
^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

Select **Purge Index** to remove the contents of the Bleve index directory. Search results may be incomplete until a bulk index of the existing database is rebuilt.

Enable Bleve for search queries
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

**True**: Search queries will use bleve search.

**False**: Search queries will not use bleve search.

+--------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableSearching": false`` with options ``true`` and ``false``.  |
+--------------------------------------------------------------------------------------------------------------+

Enable Bleve for autocomplete queries
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

**True**: Autocomplete queries will use bleve search.

**False**: Autocomplete queries will not use bleve search.

+-----------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableAutocomplete": false`` with options ``true`` and ``false``.  |
+-----------------------------------------------------------------------------------------------------------------+

Email Settings
~~~~~~~~~~~~~~

Email Batching Buffer Size
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Specify the maximum number of notifications batched into a single email.

+--------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``EmailBatchingBufferSize": 256`` with numerical input.                        |
+--------------------------------------------------------------------------------------------------------------------------+

Email Batching Interval
^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Specify the maximum frequency, in seconds, which the batching job checks for new notifications. Longer batching intervals will increase performance.

+-----------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``EmailBatchingInterval": 30`` with numerical input.                        |
+-----------------------------------------------------------------------------------------------------------------------+

Email Login Button Color
^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Specify the color of the email login button for white labeling purposes. Use a hex code with a #-sign before the code. This setting only applies to the mobile apps.

+-------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"LoginButtonColor": ""`` with string input.                                       |
+-------------------------------------------------------------------------------------------------------------------------------+

Email Login Button Border Color
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Specify the color of the email login button border for white labeling purposes. Use a hex code with a #-sign before the code. This setting only applies to the mobile apps.

+-------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"LoginButtonBorderColor": ""`` with string input.                                 |
+-------------------------------------------------------------------------------------------------------------------------------+

Email Login Button Text Color
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Specify the color of the email login button text for white labeling purposes. Use a hex code with a #-sign before the code. This setting only applies to the mobile apps.

+-------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"LoginButtonTextColor": ""`` with string input.                                   |
+-------------------------------------------------------------------------------------------------------------------------------+

Enable Account Deactivation
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Ability for users to deactivate their own account from **Settings > Advanced**. If a user deactivates their own account, they will get an email notification confirming they were deactivated.

**False**: Ability for users to deactivate their own account is disabled.

+--------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableUserDeactivation": false`` with options ``true`` and ``false``. |
+--------------------------------------------------------------------------------------------------------------------+

Enable Automatic Replies
^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Users can enable Automatic Replies in **Settings > Notifications**. Users set a custom message that will be automatically sent in response to Direct Messages.

**False**: Disables the Automatic Direct Message Replies feature and hides it from **Settings**.

+--------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ExperimentalEnableAutomaticReplies": false`` with options ``true`` and ``false``. |
+--------------------------------------------------------------------------------------------------------------------------------+

Enable Channel Viewed WebSocket Messages
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

This setting determines whether ``channel_viewed WebSocket`` events are sent, which synchronize unread notifications across clients and devices. Disabling the setting in larger deployments may improve server performance.

+------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableChannelViewedMessages": true`` with options ``true`` and ``false``. |
+------------------------------------------------------------------------------------------------------------------------+

Enable Client-Side Certification
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

**True**: Enables client-side certification for your Mattermost server. See `the documentation <https://docs.mattermost.com/onboard/certificate-based-authentication.html>`__ to learn more.

**False**: Client-side certification is disabled.

+------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ClientSideCertEnable": false`` with options ``true`` and ``false``. |
+------------------------------------------------------------------------------------------------------------------+

Client-Side Certification Login Method
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

Used in combination with the ``ClientSideCertEnable`` configuration setting.

**Primary**: After the client side certificate is verified, user's email is retrieved from the certificate and is used to log in without a password.

**Secondary**: After the client side certificate is verified, user's email is retrieved from the certificate and matched against the one supplied by the user. If they match, the user logs in with regular email/password credentials.

+----------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ClientSideCertCheck": "secondary"`` with options ``"primary"`` and ``"secondary"``. |
+----------------------------------------------------------------------------------------------------------------------------------+

Enable Default Channel Leave/Join System Messages
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

This setting determines whether team leave/join system messages are posted in the default ``town-square`` channel.

**True**: Enables leave/join system messages in the default ``town-square`` channel.

**False**: Disables leave/join messages from the default ``town-square`` channel. These system messages won't be added to the database either.

+----------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ExperimentalEnableDefaultChannelLeaveJoinMessages": true`` with options ``true`` and ``false``. |
+----------------------------------------------------------------------------------------------------------------------------------------------+

Enable Hardened Mode (Experimental)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Enables a hardened mode for Mattermost that makes user experience trade-offs in the interest of security.

**False**: Disables hardened mode.

Changes made when hardened mode is enabled:

- Failed login returns a generic error message instead of a specific message for username and password.
- If `multi-factor authentication (MFA) <https://docs.mattermost.com/onboard/multi-factor-authentication.html>`__ is enabled, the route to check if a user has MFA enabled always returns true. This causes the MFA input screen to appear even if the user does not have MFA enabled. The user may enter any value to pass the screen. Note that hardened mode does not affect user experience when MFA is enforced.
- Password reset does not inform the user that they can not reset their SSO account through Mattermost and instead claims to have sent the password reset email.
- Mattermost sanitizes all 500 errors before returned to the client. Use the supplied ``request_id`` to match user facing errors with the server logs.

+----------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ExperimentalEnableHardenedMode": false`` with options ``true`` and ``false``. |
+----------------------------------------------------------------------------------------------------------------------------+

Enable AD/LDAP Group Sync
^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

**True**: Enables AD/LDAP Group Sync configurable under **User Management > Groups**.

**False**: Disables AD/LDAP Group Sync and removes **User Management > Groups** from the System Console.

For more information on AD/LDAP Group Sync, please see the `AD/LDAP Group Sync documentation <https://docs.mattermost.com/onboard/ad-ldap-groups-synchronization.html>`__.

+-----------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ExperimentalLdapGroupSync": false`` with options ``true`` and ``false``. |
+-----------------------------------------------------------------------------------------------------------------------+

Enable Preview Features
^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Preview features can be enabled from **Settings > Advanced > Preview Pre-release features**.

**False**: Disables and hides preview features from **Settings > Advanced > Preview Pre-release features**.

+------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnablePreviewFeatures": true`` with options ``true`` and ``false``. |
+------------------------------------------------------------------------------------------------------------------+

Enable Theme Selection
^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10 and E20*

**True**: Enables the **Display > Theme** tab in **Settings** so users can select their theme.

**False**: Users cannot select a different theme. The **Display > Theme** tab is hidden in **Settings**.

+-----------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableThemeSelection": true`` with options ``true`` and ``false``. |
+-----------------------------------------------------------------------------------------------------------------+

Allow Custom Themes
^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10 and E20*

**True**: Enables the **Display > Theme > Custom Theme** section in **Settings**.

**False**: Users cannot use a custom theme. The **Display > Theme > Custom Theme** section is hidden in **Settings**.

+--------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AllowCustomThemes": true`` with options ``true`` and ``false``. |
+--------------------------------------------------------------------------------------------------------------+

Default Theme
^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10 and E20*

Set a default theme that applies to all new users on the system.

+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"DefaultTheme": "default"`` with options ``"default"``, ``"organization"``, ``"mattermostDark"``, and ``"windows10"``. |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable Tutorial (Experimental)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Users are prompted with a tutorial when they open Mattermost for the first time after account creation.

**False**: The tutorial is disabled. Users are placed in Town Square when they open Mattermost for the first time after account creation.

+--------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableTutorial": true`` with options ``true`` and ``false``.                                  |
+--------------------------------------------------------------------------------------------------------------------------------------------+

Enable Onboarding 
^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

**True**: New Mattermost users are shown key tasks to complete as part of initial onboarding.

**False**: User onboarding tasks are disabled. Users are placed in Town Square when they open Mattermost for the first time after account creation.

+--------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableOnboarding": true`` with options ``true`` and ``false``.                                |
+--------------------------------------------------------------------------------------------------------------------------------------------+

Enable User Typing Messages
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

This setting determines whether "user is typing..." messages are displayed below the message box. Disabling the setting in larger deployments may improve server performance.

+---------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableUserTypingMessages": true`` with options ``true`` and ``false``. |
+---------------------------------------------------------------------------------------------------------------------+

Time Between User Typing Updates (User Typing Timeout)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

This setting defines how frequently "user is typing..." messages are updated, measured in milliseconds.

+----------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"TimeBetweenUserTypingUpdatesMilliseconds": 5000`` with numerical input. |
+----------------------------------------------------------------------------------------------------------------------+

Primary Team (Experimental)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

The primary team of which users on the server are members. When a primary team is set, the options to join other teams or leave the primary team are disabled.

If the team URL of the primary team is https://example.mattermost.com/myteam/, then set the value to ``myteam`` in ``config.json``.

+-----------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ExperimentalPrimaryTeam": ""`` with string input.                  |
+-----------------------------------------------------------------------------------------------------------------+

SAML Settings
~~~~~~~~~~~~~

SAML Login Button Color
^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

Specify the color of the SAML login button for white labeling purposes. Use a hex code with a #-sign before the code. This setting only applies to the mobile apps.

+-------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"LoginButtonColor": ""`` with string input.                                       |
+-------------------------------------------------------------------------------------------------------------------------------+

SAML Login Button Border Color
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

Specify the color of the SAML login button border for white labeling purposes. Use a hex code with a #-sign before the code. This setting only applies to the mobile apps.

+-------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"LoginButtonBorderColor": ""`` with string input.                                 |
+-------------------------------------------------------------------------------------------------------------------------------+

SAML Login Button Text Color
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

Specify the color of the SAML login button text for white labeling purposes. Use a hex code with a #-sign before the code. This setting only applies to the mobile apps.

+-------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"LoginButtonTextColor": ""`` with string input.                                   |
+-------------------------------------------------------------------------------------------------------------------------------+

Use Channel Name in Email Notifications (Experimental)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

**True**: Channel and team name appears in email notification subject lines. Useful for servers using only one team.

**False**: Only team name appears in email notification subject line.

+----------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"UseChannelInEmailNotifications": false`` with options ``true`` and ``false``. |
+----------------------------------------------------------------------------------------------------------------------------+

User Status Away Timeout
^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

This setting defines the number of seconds after which the user's status indicator changes to "Away", when they are away from Mattermost.

+--------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"UserStatusAwayTimeout": 300`` with numerical input. |
+--------------------------------------------------------------------------------------------------+

Enable Shared Channels
^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

Shared channels enables the ability to establish secure connections between Mattermost instances, and invite secured connections to shared channels where secure connections can participate as they would in any public and private channel. Enabling shared channels functionality requires a server restart. 

+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's two ``config.json`` settings include ``"ExperimentalSettings:EnableSharedChannels": false`` with options ``true`` or ``false``, and ``"ExperimentalSettings:EnableRemoteClusterService": false`` with options ``true`` or ``false``. |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

.. note::

   - Both configuration settings must be enabled in order to share channels with secure connections. Only the **Enable Shared Channels** configuration option is available through the System Console.
   - System Admins for Cloud deployments can submit a request to have the ``EnableRemoteClusterService`` configuration setting enabled in their Cloud instance.

Enable Apps Bar
^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

This setting enables the Apps Bar and moves all Mattermost integration icons from the channel header to a vertical pane on the far right side of the screen. 

.. note::
  
  Integrations currently registered to the channel header will move to the Apps Bar automatically; however, we strongly encourage Mattermost integrators to update their integrations to provide the best user experience. See the `channel header plugin changes <https://forum.mattermost.com/t/channel-header-plugin-changes/13551>`__ user forum discussion for details on how to register integrations with the Apps Bar.

**True**: All integration icons in the channel header move to the Apps Bar with the exception of the calls beta feature.

**False**: All integration icons in the channel header display in the channel header.

+----------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableAppBar": false`` with options ``true`` and ``false``. |
+----------------------------------------------------------------------------------------------------------+

Settings configurable only in ``config.json``
----------------------------------------------

There are a number of settings customizable in ``config.json`` which are unavailable in the System Console and require updating from the file itself.

Data Retention Policies
~~~~~~~~~~~~~~~~~~~~~~~

Enable Global Retention Policy for Messages
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

**True**: Messages can be deleted as part of a scheduled data retention job. This doesn't apply to custom retention policies.

**False**: Messages can't be deleted as part of a scheduled data retention job.

+-------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableMessageDeletion": false`` with options ``true`` and ``false``. |
+-------------------------------------------------------------------------------------------------------------------+

Enable Global Retention Policy for Files
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

**True**: Files can be deleted as part of a scheduled data retention job. This doesn't apply to custom retention policies.

**False**: Files can't be deleted as part of a scheduled data retention job.

+----------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableFileDeletion": false`` with options ``true`` and ``false``. |
+----------------------------------------------------------------------------------------------------------------+

Email Settings
~~~~~~~~~~~~~~

Disable Inactive Server Email Notifications
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

This configuration setting disables the ability to send inactivity email notifications to Mattermost System Admins.

+-------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableInactivityEmail": true`` with options ``true`` and ``false``.  |
+-------------------------------------------------------------------------------------------------------------------+

Service Settings
~~~~~~~~~~~~~~~~

Custom User Groups
^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

This configuration setting controls the ability for users to create custom user groups. This configuration setting is disabled by default.

+----------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableCustomGroups": true`` with options ``true`` and ``false``.  |
+----------------------------------------------------------------------------------------------------------------+

Developer Flags
^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

This configuration setting specifies a list of strings where each string is a flag used to set the content security policy (CSP) for the Mattermost Web App. Each flag must be in the format ``flag=true`` (e.g. ``unsafe-eval=true,unsafe-inline=true``). Not recommended for production environments.

The following values are currently supported:

- ``unsafe-eval``: Adds the ``unsafe-eval`` CSP directive to the root webapp, allowing increased debugging in developer environments.
- ``unsafe-inline``: Adds the ``unsafe-inline`` CSP directive to the root webapp, allowing increased debugging in developer environments.

This configuration setting is disabled by default and requires `developer mode <https://docs.mattermost.com/configure/configuration-settings.html#enable-developer-mode>`__ to be enabled. 

+----------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"DeveloperFlags": ""`` with string input.  |
+----------------------------------------------------------------------------------------+

Enable Post Search
^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

If this setting is enabled, users can search messages. Disabling search can result in a performance increase, but users get an error message when they attempt to use the search box.

+-------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnablePostSearch": true`` with options ``true`` and ``false``. |
+-------------------------------------------------------------------------------------------------------------+

Enable File Search
^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

This configuration setting enables users to search documents attached to messages by filename. To enable users to search documents by their content, you must also enable the ``ExtractContent`` configuration setting. See our `Enable Document Search by Content <https://docs.mattermost.com/configure/configuration-settings.html#enable-document-search-by-content>`__ documentation for details. Document content search is available in Mattermost Server from v5.35, with mobile support coming soon. 

**True**: Supported document types are searchable by their filename. 

**False**: File-based searches are disabled.

+-------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableFileSearch": true`` with options ``true`` and ``false``. |
+-------------------------------------------------------------------------------------------------------------+

Enable User Status Updates
^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

Turn status updates off to improve performance. When status updates are off, users appear online only for brief periods when posting a message, and only to members of the channel in which the message is posted.

+---------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableUserStatuses": true`` with options ``true`` and ``false``. |
+---------------------------------------------------------------------------------------------------------------+

WebSocket Secure Port
^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``. Changes to this setting require a server restart before taking effect.

(Optional) This setting defines the port on which the secured WebSocket will listen using the ``wss`` protocol. Defaults to ``443``. When the client attempts to make a WebSocket connection it first checks to see if the page is loaded with HTTPS. If so, it will use the secure WebSocket connection. If not, it will use the unsecure WebSocket connection. IT IS HIGHLY RECOMMENDED PRODUCTION DEPLOYMENTS ONLY OPERATE UNDER HTTPS AND WSS.


+------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"WebsocketSecurePort": 443`` with numerical input. |
+------------------------------------------------------------------------------------------------+

WebSocket Port
^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``. Changes to this setting require a server restart before taking effect.

(Optional) This setting defines the port on which the unsecured WebSocket will listen using the ``ws`` protocol. Defaults to ``80``. When the client attempts to make a WebSocket connection it first checks to see if the page is loaded with HTTPS. If so, it will use the secure WebSocket connection. If not, it will use the unsecure WebSocket connection. IT IS HIGHLY RECOMMENDED PRODUCTION DEPLOYMENTS ONLY OPERATE UNDER HTTPS AND WSS.

+----------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``WebsocketPort": 80`` with numerical input. |
+----------------------------------------------------------------------------------------+

Enable API Team Deletion
^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

**True**: The ``api/v4/teams/{teamid}?permanent=true`` API endpoint can be called by Team and System Admins to permanently delete a team.

**False**: The API endpoint cannot be called. Note that ``api/v4/teams/{teamid}`` can still be used to soft delete a team.

+-------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableAPITeamDeletion": false`` with options ``true`` and ``false``. |
+-------------------------------------------------------------------------------------------------------------------+

Enable API User Deletion
^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

**True**: The ``api/v4/users/{userid}?permanent=true`` API endpoint can be called by System Admins, or users with appropriate permissions, to permanently delete a user.

**False**: The API endpoint cannot be called. Note that ``api/v4/users/{userid}`` can still be used to soft delete a user.

+-------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableAPIUserDeletion": false`` with options ``true`` and ``false``. |
+-------------------------------------------------------------------------------------------------------------------+

Enable API Channel Deletion
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

**True**: The ``api/v4/channels/{channelid}?permanent=true`` API endpoint can be called by System Admins, or users with appropriate permissions, to permanently delete a channel.

**False**: The API endpoint cannot be called. Note that ``api/v4/channels/{channelid}`` can still be used to soft delete a channel.

+----------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableAPIChannelDeletion": false`` with options ``true`` and ``false``. |
+----------------------------------------------------------------------------------------------------------------------+

Enable OpenTracing
^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

**True**: A Jaeger client is instantiated and is used to trace each HTTP request as it goes through App and Store layers. Context is added to App and Store and is passed down the layer chain to create OpenTracing 'spans'.

By default, in order to avoid leaking sensitive information, no method parameters are reported to OpenTracing. Only the name of the method is reported.

**False**: OpenTracing is not enabled.

+---------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableOpenTracing": false`` with options ``true`` and ``false``. |
+---------------------------------------------------------------------------------------------------------------+

Import Settings Default Directory
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

The directory where the imported files are stored. The path is relative to the ``FileSettings`` directory. By default, imports are stored under ``./data/import``.

+---------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting under the ``ImportSettings`` section is ``Directory: ./import`` with string input. |
+---------------------------------------------------------------------------------------------------------------------------+

Import Settings Default Retention Days
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

The number of days to retain the imported files before deleting them.

+----------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting under the ``ImportSettings`` section is ``RetentionDays: 30`` with numerical input. |
+----------------------------------------------------------------------------------------------------------------------------+

Export Settings Default Directory
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

The directory where the exported files are stored. The path is relative to the ``FileSettings`` directory. By default, exports are stored under ``./data/export``.

+---------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting under the ``ExportSettings`` section is ``Directory: ./export`` with string input. |
+---------------------------------------------------------------------------------------------------------------------------+

Export Settings Default Retention Days
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

The number of days to retain the exported files before deleting them.

+----------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting under the ``ExportSettings`` section is ``RetentionDays: 30`` with numerical input. |
+----------------------------------------------------------------------------------------------------------------------------+

Enable Local Mode
^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

**True**: Enables local mode for mmctl.

**False**: Prevents local mode for mmctl.

+-------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableLocalMode": false`` with options ``true`` and ``false``. |
+-------------------------------------------------------------------------------------------------------------+

Enable Local Mode Socket Location
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

The path for the socket that the server will create for mmctl to connect and communicate through local mode. If the default value for this key is changed, you will need to point mmctl to the new socket path when in local mode, using the ``--local-socket-path /new/path/to/socket`` flag in addition to the ``--local`` flag.

If nothing is specified, the default path that both the server and mmctl assumes is ``/var/tmp/mattermost_local.socket``.

+--------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"LocalModeSocketLocation": "/var/tmp/mattermost_local.socket"`` with string input. |
+--------------------------------------------------------------------------------------------------------------------------------+

Scoping IDP Provider Id
^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

This setting isn't available in the System Console and can only be set in ``config.json``.

Allows an authenticated user to skip the initial login page of their federated Azure AD server, and only require a password to log in.

+---------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ScopingIDPProviderId": ""`` with string input. |
+---------------------------------------------------------------------------------------------+

Scoping IDP Name
^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

This setting isn't available in the System Console and can only be set in ``config.json``.

Adds the name associated with a user's Scoping Identity Provider ID.

+---------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ScopingIDPName": ""`` with string input. |
+---------------------------------------------------------------------------------------+

Global Relay SMTP Server Timeout
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available as an add-on to legacy Enterprise Edition E20*

This setting isn't available in the System Console and can only be set in ``config.json``.

The number of seconds that can elapse before the connection attempt to the SMTP server is abandoned. The default value is 1800 seconds. This setting is currently not available in the System Console and can only be set in ``config.json``.

+-----------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"GlobalRelaySettings.SMTPServerTimeout": "1800"`` with numerical input.   |
+-----------------------------------------------------------------------------------------------------------------------+

Batch Size
^^^^^^^^^^^

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

This setting isn't available in the System Console and can only be set in ``config.json``.

Determines how many new posts are batched together to a compliance export file.

+----------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"BatchSize": 10000`` with numerical input. |
+----------------------------------------------------------------------------------------+

App Custom URL Schemes
^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

Define valid custom URL schemes for redirect links provided by custom-built mobile Mattermost apps. This ensures users are redirected to the custom-built mobile app and not Mattermost's mobile client. 

When configured, after OAuth or SAML user authentication is complete, custom URL schemes sent by mobile clients are validated to ensure they don't include default schemes such as ``http`` or ``https``. Mobile users are then redirected back to the mobile app using the custom scheme URL provided by the mobile client. We recommend that you update your mobile client values as well with valid custom URL schemes.

+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"NativeAppSettings.AppCustomURLSchemes"`` with an array of strings as input. For example: ``[custom-app://, some-app://]``.                    |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Colorize plain text console logs
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

**True**: When logged events are output to the console as plain text, colorize log levels details.

**False**: Plain text log details aren't colorized in the console.

+---------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableColor": false`` with options ``true`` and ``false``. |
+---------------------------------------------------------------------------------------------------------+

Clean Up Old Database Jobs
^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

Defines the threshold in hours beyond which older completed database jobs are removed. This setting applies to both MySQL and PostgreSQL databases, is disabled by default, and must be set to a value greater than or equal to ``0`` to be enabled.

+--------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"JobSettings.CleanupJobsThresholdDays": -1`` with numerical input.     |
+--------------------------------------------------------------------------------------------------------------------+

Clean Up Outdated Database Entries
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting only applies to configuration in the database. It isn't available in the System Console and can be set via mmctl or changed in the database.

Defines the threshold in days beyond which outdated configurations are removed from the database. This setting applies to both MySQL and PostgreSQL databases.

+--------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"JobSettings.CleanupConfigThresholdDays": 30`` with numerical input.   |
+--------------------------------------------------------------------------------------------------------------------+

Image Settings
~~~~~~~~~~~~~~

Maximum Image Resolution
^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

Maximum image resolution size for message attachments in pixels. 

+--------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"MaxImageResolution": 33177600`` with numerical input.     |
+--------------------------------------------------------------------------------------------------------+

File Settings
~~~~~~~~~~~~~~

Maximum Image Decoder Concurrency
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

Indicates how many images can be decoded concurrently at once. The default value of ``-1`` configures Mattermost to automatically use the number of CPUs present.

.. note::

  This configuration setting affects the total memory consumption of the server. The maximum memory of a single image is dictated by ``MaxImageResolution * 24 bytes`` Therefore, a good rule of thumb to follow is that ``MaxImageResolution* MaxImageDecoderConcurrency * 24`` should be less than the allocated memory for image decoding.

+--------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"MaxImageDecoderConcurrency": "-1"`` with numerical input. |
+--------------------------------------------------------------------------------------------------------+

Initial Font
^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

Font used in auto-generated profile pics with colored backgrounds.

+-----------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"InitialFont": "luximbi.ttf"`` with string input. |
+-----------------------------------------------------------------------------------------------+

Amazon S3 Signature V2
^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

By default, Mattermost uses Signature V4 to sign API calls to AWS, but under some circumstances, V2 is required. For more information about when to use V2, see https://docs.aws.amazon.com/general/latest/gr/signature-version-2.html.

**True**: Use Signature Version 2 Signing Process.

**False**: Use Signature Version 4 Signing Process.

+------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AmazonS3SignV2": false`` with options ``true`` and ``false``. |
+------------------------------------------------------------------------------------------------------------+

Amazon S3 Path
^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

Allows using the same S3 bucket for multiple deployments.

+------------------------------------------------------------------------------------------------------------+
| This feature’s ``config.json`` setting is ``"AmazonS3PathPrefix: ""`` with string input.                   |
+------------------------------------------------------------------------------------------------------------+

GitLab Settings
~~~~~~~~~~~~~~~

Scope
^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

*Not available in Cloud Starter*

This setting isn't available in the System Console and can only be set in ``config.json``.

Standard setting for OAuth to determine the scope of information shared with OAuth client. Not currently supported by GitLab OAuth.

+------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Scope": ""`` with string input. |
+------------------------------------------------------------------------------+

Google Settings
~~~~~~~~~~~~~~~

Scope
^^^^^^

.. include:: ../_static/badges/ent-pro-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

This setting isn't available in the System Console and can only be set in ``config.json``.

Standard setting for OAuth to determine the scope of information shared with OAuth client. Recommended setting is ``profile email``.

+-------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Scope": "profile email"`` with string input. |
+-------------------------------------------------------------------------------------------+

Office 365 Settings
~~~~~~~~~~~~~~~~~~~~

Scope
^^^^^^

.. include:: ../_static/badges/ent-pro-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

This setting isn't available in the System Console and can only be set in ``config.json``.

Standard setting for OAuth to determine the scope of information shared with OAuth client. Recommended setting is ``User.Read``.

+---------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Scope": "User.Read"`` with string input. |
+---------------------------------------------------------------------------------------+

Metrics Settings
~~~~~~~~~~~~~~~~~

Block Profile Rate
^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``. Changes to this setting require a server restart before taking effect.

Value that controls the `fraction of goroutine blocking events reported in the blocking profile <https://golang.org/pkg/runtime/#SetBlockProfileRate>`__.

The profiler aims to sample an average of one blocking event per rate nanoseconds spent blocked.

To include every blocking event in the profile, set the rate to ``1``. To turn off profiling entirely, set the rate to ``0``.

+---------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"BlockProfileRate": 0`` with options ``0`` and ``1``. |
+---------------------------------------------------------------------------------------------------+

Plugin Settings
~~~~~~~~~~~~~~~

Signature Public Key Files
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

In addition to the Mattermost plugin signing key built into the server, each public key specified here is trusted to validate plugin signatures.

+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"SignaturePublicKeyFiles": {}`` with string array input consisting of contents that are relative or absolute paths to signature files.              |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Chimera OAuth Proxy URL
^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

Specify the `Chimera <https://github.com/mattermost/chimera>`__ URL used by Mattermost plugins to connect with pre-created OAuth applications.

+-------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ChimeraOAuthProxyUrl": {}`` with string input.                             |
+-------------------------------------------------------------------------------------------------------------------------+

Welcome Bot
^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

The settings for the WelcomeBot plugin aren't available in the System Console, and can only be set in ``config.json``.

Learn more `in our documentation <https://github.com/mattermost/mattermost-plugin-welcomebot/blob/master/README.md>`__.

Experimental Settings only in ``config.json``
---------------------------------------------

Audit settings
~~~~~~~~~~~~~~

The audit settings output audit records to syslog (local or remote server via TLS) and/or to a local file. Both are disabled by default. They can be enabled simultaneously.

Remote Clusters
^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

This setting isn't available in the System Console and can only be set in ``config.json``.

Enable this setting to add, remove, and view remote clusters for shared channels. 

**True**: System Admins can manage remote clusters using the System Console.

**False**: Remote cluster management is disabled.

+------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"RemoteClusters": false`` with options ``true`` and ``false``. |
+------------------------------------------------------------------------------------------------------------+

Syslog configuration options
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

Enable this setting to write audit records to a local or remote syslog, specifying the IP, port, user-generated fields, and certificate settings. 

**True**: Syslog output is enabled.

**False**: Syslog output is disabled.

+-----------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"SysLogEnabled": false`` with options ``true`` and ``false``. |
+-----------------------------------------------------------------------------------------------------------+

Syslog IP
^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

The IP address or domain of the syslog server. Use ``localhost`` for local syslog. 

+-------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"SysLogIP": "localhost"`` with string input consisting of an IP address or domain name. |
+-------------------------------------------------------------------------------------------------------------------------------------+

Syslog port
^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

The port that the syslog server is listening on. The default port is 6514. 

+------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"SysLogPort": 6514`` with numeric input consisting of a port number. |
+------------------------------------------------------------------------------------------------------------------+

Syslog tag
^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

The syslog metadata tag field.

+-------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"SysLogTag": ""`` with string input consisting of a user-defined tag field. |
+-------------------------------------------------------------------------------------------------------------------------+

Syslog cert
^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

This is the path to the syslog server certificate for TLS connections (``.crt`` or ``.pem``). 

+-----------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"SysLogCert": ""`` with string input consisting of the path to the certificate. |
+-----------------------------------------------------------------------------------------------------------------------------+

Syslog insecure
^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

This setting controls whether a client verifies the server's certificate chain and host name. If ``true``, TLS accepts any certificate presented by the server and any host name in that certificate. In this mode, TLS is susceptible to man-in-the-middle attacks. 

.. note:: 
   This should be used only for testing and not in a production environment.

+------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"SysLogInsecure": false`` with options ``true`` and ``false``. |
+------------------------------------------------------------------------------------------------------------+

Syslog max queue size
^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

This setting determines how many audit records can be queued/buffered at any point in time when writing to syslog. The default is 1000 records. 
This setting can be left as default unless you are seeing audit write failures in the server log and need to adjust the number accordingly.

+------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"SysLogMaxQueueSize": 1000`` with numerical input. |
+------------------------------------------------------------------------------------------------+

File configuration options
^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

Enable this setting to write audit files locally, specifying size, backup interval, compression, maximum age to manage file rotation, and timestamps. 

**True**: File output is enabled.

**False**: File output is disabled.

+---------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"FileEnabled": false`` with options ``true`` and ``false``. |
+---------------------------------------------------------------------------------------------------------+

File name
^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

This is the path to the output file location. 

+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"FileName": ""`` with string input consisting of a user-defined path (e.g. ``/var/log/mattermost_audit.log``).                                    |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

File max size MB
^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

This is the maximum size (measured in megabytes) that the file can grow before triggering rotation. The default setting is 100. 

+------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"FileMaxSizeMB": 100`` with numerical input. |
+------------------------------------------------------------------------------------------+

File max age days
^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

This is the maximum age in days a file can reach before triggering rotation. The default value is 0, indicating no limit on the age. 

+-----------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"FileMaxAgeDays": 0`` with numerical input. |
+-----------------------------------------------------------------------------------------+

File max backups
^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

This is the maximum number of rotated files kept; the oldest is deleted first. The default value is 0, indicating no limit on the number of backups. 

+-----------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"FileMaxBackups": 0`` with numerical input. |
+-----------------------------------------------------------------------------------------+

File compress
^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

When ``true``, rotated files are compressed using ``gzip``. 

+----------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"FileCompress": false`` with options ``true`` and ``false``. |
+----------------------------------------------------------------------------------------------------------+

File max queue size
^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

This setting determines how many audit records can be queued/buffered at any point in time when writing to a file. The default is 1000 records. 
This setting can be left as default unless you are seeing audit write failures in the server log and need to adjust the number accordingly.

+----------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"FileMaxQueueSize": 1000`` with numerical input. |
+----------------------------------------------------------------------------------------------+

Advanced Audit Logging Configuration
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Output logs to multiple targets
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

This setting isn't available in the System Console and can only be set in ``config.json``.

Send log records to multiple targets:

- Multiple local file targets
- Multiple syslogs
- Multiple TCP sockets

Allow any combination of local file, syslog, and TCP socket targets. 

File target supports rotation and compression triggered by size and/or duration. Syslog target supports local and remote syslog servers, with or without TLS transport. TCP socket target can be configured with an IP address or domain name, port, and optional TLS certificate.

+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``ExperimentalAuditSettings.AdvancedLoggingConfig`` which can contain a filespec to another config file, a database DSN, or JSON.   |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Options are outlined in this text file: `Log Settings Options <https://github.com/mattermost/docs/files/5066579/Log.Settings.Options.txt>`__. Sample config: `Advanced Logging Options Sample.json.zip <https://github.com/mattermost/docs/files/5066597/Advanced.Logging.Options.Sample.json.zip>`__.

Service Settings
~~~~~~~~~~~~~~~~

Group Unread Channels (Experimental)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

This setting applies to the new sidebar only. You must disable the `Enable Legacy Sidebar <https://docs.mattermost.com/configure/configuration-settings.html#enable-legacy-sidebar>`__ configuration setting to see and enable this functionality in the System Console. 

**Default Off**: Disables the unread channels sidebar section for all users by default. Users can enable it in **Settings > Sidebar > Group unread channels separately**.

**Default On**: Enables the unread channels sidebar section for all users by default. Users can disable it in **Settings > Sidebar > Group unread channels separately**. 

+-----------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ExperimentalGroupUnreadChannels": "default_off"`` with options ``"default_off"`` and ``"default_on"``. |
+-----------------------------------------------------------------------------------------------------------------------------------------------------+

Strict CSRF Token Enforcement (Experimental)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

**True**: Enables CSRF protection tokens for additional hardening compared to the currently used custom header. When the user logs in, an additional cookie is created with the CSRF token contained.

**False**: Disables CSRF protection tokens.

+-------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ExperimentalStrictCSRFEnforcement": false`` with options ``true`` and ``false``. |
+-------------------------------------------------------------------------------------------------------------------------------+

Restrict System Admin
^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

**True**: Restricts the System Admin from viewing and modifying a subset of server configuration settings from the System Console. Not recommended for use in on-prem installations. This is intended to support Mattermost Private Cloud in giving the System Admin role to users but restricting certain actions only for Cloud Admins.

**False**: No restrictions are applied to the System Admin role.

+-------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"RestrictSystemAdmin": "false"`` with options ``true`` and ``false``. |
+-------------------------------------------------------------------------------------------------------------------+

Team Settings
~~~~~~~~~~~~~~

Teammate Name Display
^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

This setting isn't available in the System Console and can only be set in ``config.json``.

Control Teammate Name Display at the system level. 

**True**: Allows System Admins to control Teammate Name Display at the system level.

**False**: System Admins cannot control Teammate Name Display at the system level.

+------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"LockTeammateNameDisplay": []`` with options ``true`` and ``false``. |
+------------------------------------------------------------------------------------------------------------------+

Default Channels (Experimental)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

Default channels every user is added to automatically after joining a new team. Only applies to Public channels, but affects all teams on the server. 

When not set, every user is added to the ``off-topic`` and ``town-square`` channels by default.

.. note::

   Even if ``town-square`` is not listed, every user is added to that channel after joining a new team.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ExperimentalDefaultChannels": []`` with string array input consisting of channel names, such as ``["announcement", "developers"]``. |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Client Requirement Settings (Experimental)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Latest Android Version
^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

The latest version of the Android React Native app that is recommended for use. 

+----------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AndroidLatestVersion": ""`` with string input corresponding to a version string, such as ``"1.2.0"``. |
+----------------------------------------------------------------------------------------------------------------------------------------------------+

Minimum Android Version
^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

The minimum version of the Android React Native app that is required to be used. 

+-------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AndroidMinVersion": ""`` with string input corresponding to a version string, such as ``"1.2.0"``. |
+-------------------------------------------------------------------------------------------------------------------------------------------------+

Latest iOS Version
^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

The latest version of the iOS app that is recommended for use. 

+------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"IosLatestVersion": ""`` with string input corresponding to a version string, such as ``"1.2.0"``. |
+------------------------------------------------------------------------------------------------------------------------------------------------+

Minimum iOS Version
^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

The minimum version of the iOS React Native app that is required to be used. 

+---------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"IosMinVersion": ""`` with string input corresponding to a version string, such as ``"1.2.0"``. |
+---------------------------------------------------------------------------------------------------------------------------------------------+

Push Notification Buffer
^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

Used to control the buffer of outstanding Push Notification messages to be sent. If the number of messages exceeds that number, then the request making the Push Notification will be blocked until there's room. 

+---------------------------------------------------------------------------------------------------------------------------------------------+
| This feature’s ``config.json`` setting is ``"PushNotificationBuffer": 1000"`` with numerical input.                                         |
+---------------------------------------------------------------------------------------------------------------------------------------------+

Theme Settings (Experimental)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Allowed Themes
^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10 and E20*

This setting isn't available in the System Console and can only be set in ``config.json``.

Select the themes that can be chosen by users when ``EnableThemeSelection`` is set to ``true``. 

+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AllowedThemes": []`` with string array input consisting of the options ``"default"``, ``"organization"``, ``"mattermostDark"``, and ``"windows10"``, such as ``["mattermostDark", "windows10"]``. |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Experimental Settings
~~~~~~~~~~~~~~~~~~~~~

Disable Post Metadata
^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

This setting isn't available in the System Console and can only be set in ``config.json``.

**True**: Disabling post metadata is only recommended if you are experiencing a significant decrease in performance around channel and post load times.

**False**: Load channels with more accurate scroll positioning by loading post metadata.

+-----------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"DisablePostMetadata": false`` with options ``true`` and ``false``. |
+-----------------------------------------------------------------------------------------------------------------+

Analytics Settings
~~~~~~~~~~~~~~~~~~~

Maximum Users for Statistics
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-pro-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E10 and E20*

This setting isn't available in the System Console and can only be set in ``config.json``.

Sets the maximum number of users on the server before statistics for total posts, total hashtag posts, total file posts, posts per day, and active users with posts per day are disabled. 

This setting is used to maximize performance for large Enterprise deployments.

+---------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"MaxUsersForStatistics": 2500`` with numerical input. |
+---------------------------------------------------------------------------------------------------+

Message Export Settings
~~~~~~~~~~~~~~~~~~~~~~~

Export From Timestamp
^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

This setting isn't available in the System Console and can only be set in ``config.json``.

Set the Unix timestamp (seconds since epoch, UTC) to export data from. 

+----------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ExportFromTimestamp": 0`` with numerical input. |
+----------------------------------------------------------------------------------------------+

File Location
^^^^^^^^^^^^^^^

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Enterprise Edition E20*

This setting isn't available in the System Console and can only be set in ``config.json``.

Set the file location of the compliance exports. By default, they are written to the ``exports`` subdirectory of the configured `Local Storage directory <https://docs.mattermost.com/configure/configuration-settings.html#local-storage-directory>`__.

+-------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"FileLocation": "export"`` with string input. |
+-------------------------------------------------------------------------------------------+

Plugin Settings
~~~~~~~~~~~~~~~

Enable Plugin Uploads
^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

**True**: Enables plugin uploads by System Admins at **Plugins > Management**. If you do not plan to upload a plugin, set to ``false`` to control which plugins are installed on your server. See `documentation <https://developers.mattermost.com/integrate/admin-guide/admin-plugins-beta/>`__ to learn more.

**False**: Disables plugin uploads on your Mattermost server.

+-----------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableUploads": false`` with options ``true`` and ``false``. |
+-----------------------------------------------------------------------------------------------------------+

Allow Insecure Download URL
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

**True**: Enables downloading and installing a plugin from a remote URL.

**False**: Disables downloading and installing a plugin from a remote URL.

+-----------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AllowInsecureDownloadUrl": false`` with options ``true`` and ``false``.                    |
+-----------------------------------------------------------------------------------------------------------------------------------------+

Enable Plugin Health Check
^^^^^^^^^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

**True**: Enables plugin health check to ensure all plugins are periodically monitored, and restarted or deactivated based on their health status. The health check runs every 30 seconds. If the plugin is detected to fail 3 times within an hour, the Mattermost server attempts to restart it. If the restart fails 3 successive times, it's automatically disabled.

**False**: Disables plugin health check on your Mattermost server.

+--------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableHealthCheck": true`` with options ``true`` and ``false``. |
+--------------------------------------------------------------------------------------------------------------+

Directory
^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

The location of the plugin files. If blank, they are stored in the ``./plugins`` directory. The path that you set must exist and Mattermost must have write permissions in it. 

+-----------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Directory": "./plugins"`` with string input.                       |
+-----------------------------------------------------------------------------------------------------------------+

Client Directory
^^^^^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

The location of client plugin files. If blank, they are stored in the ``./client/plugins`` directory. The path that you set must exist and Mattermost must have write permissions in it. 

+-----------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Directory": "./client/plugins"`` with string input.                |
+-----------------------------------------------------------------------------------------------------------------+

Jobs
~~~~~

Settings to configure how Mattermost schedules and completes periodic tasks such as the deletion of old posts with Data Retention enabled or indexing posts with Elasticsearch. These settings control which Mattermost servers are designated as a Scheduler, a server that queues the tasks at the correct times, and as a Worker, a server that completes the given tasks.

When running Mattermost on a single machine, both ``RunJobs`` and ``RunScheduler`` should be enabled. Without both of these enabled, Mattermost will not function properly.

When running Mattermost in High Availability mode, ``RunJobs`` should be enabled on one or more servers while ``RunScheduler`` should be enabled on all servers under normal circumstances. A High Availability cluster will have one Scheduler and one or more Workers. See the below sections for more information.

Run Jobs
^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

This setting isn't available in the System Console and can only be set in ``config.json``.

Set whether or not this Mattermost server will handle tasks created by the Scheduler. When running Mattermost on a single machine, this setting should always be enabled.

When running Mattermost in `High Availablity mode <https://docs.mattermost.com/scale/high-availability-cluster.html>`__, one or more servers should have this setting enabled. We recommend that your High Availability cluster has one or more dedicated Workers with this setting enabled while the remaining Mattermost app servers have it disabled.

+------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"RunJobs": true`` with options ``true`` and ``false``.                                 |
+------------------------------------------------------------------------------------------------------------------------------------+

Run Scheduler
^^^^^^^^^^^^^^

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:
This setting isn't available in the System Console and can only be set in ``config.json``.

Set whether or not this Mattermost server will schedule tasks that will be completed by a Worker. When running Mattermost on a single machine, this setting should always be enabled.

When running Mattermost in `High Availablity mode <https://docs.mattermost.com/scale/high-availability-cluster.html>`__, this setting should always be enabled. In a High Availability cluster, exactly one of the servers will be designated as the Scheduler at a time to ensure that duplicate tasks aren't created. See `High Availability documentation <https://docs.mattermost.com/scale/high-availability-cluster.html>`__ for more details.

.. warning::

   We strongly recommend that you not change this setting from the default setting of ``true`` as this prevents the ``ClusterLeader`` from being able to run the scheduler. As a result, recurring jobs such as LDAP sync, Compliance Export, and data retention will no longer be scheduled. In previous Mattermost Server versions, and this documentation, the instructions stated to run the Job Server with ``RunScheduler: false``. The cluster design has evolved and this is no longer the case.

+-----------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"RunScheduler": true`` with options ``true`` and ``false``.                                 |
+-----------------------------------------------------------------------------------------------------------------------------------------+
source/configure/configuation-in-mattermost-database.rst METASEP
Configuration in the Mattermost database
========================================

.. include:: ../_static/badges/allplans-selfhosted.rst
  :start-after: :nosearch:

A new configuration option was added in the `5.10 release <https://docs.mattermost.com/install/self-managed-changelog.html>`_ to use the database as the single source of truth for the active configuration of your Mattermost installation. This changes the Mattermost binary from reading the default ``config.json`` file to reading the configuration settings stored within a configuration table in the database.

Mattermost has been running our `community server <https://community.mattermost.com>`__ on this option since the feature was released, and recommends its use for those on :doc:`High Availability deployments <../scale/high-availability-cluster>`.

Benefits to using this option:

* Conveniently manage configuration changes directly from the System Console, even in High Availability deployments and read-only containerized environments.
* Ensure all servers in a High Availability deployment have the same configuration, even when new servers are added to the cluster.
* Automatically deploy SAML certificates and keys to all servers in the cluster.

How to migrate configuration to the database
--------------------------------------------

These instructions cover migrating the Mattermost configuration to the database and updating your ``systemd`` configuration to load it from the database.

.. note::
  These instructions assume you have Mattermost server installed at ``/opt/mattermost``. If you're running Mattermost in a different directory you'll have to modify the paths to match your environment.

Get your database connection string
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The first step is to get your master database connection string. We recommend using the `mmctl config get command <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-config-get>`__, or using the CLI's ``mattermost config get`` command to do this.  

To use the ``mattermost config get`` command:

.. code-block:: bash

   sudo su mattermost
   cd /opt/mattermost
   mmctl config get SqlSettings.DataSource

Example output:

.. code-block:: text

   "mmuser:really_secure_password@tcp(127.0.0.1:3306)/mattermost?charset=utf8mb4,utf8\u0026writeTimeout=30s"

Another way to get your database connection string is to view your ``config.json`` file and get the value in ``SqlSettings.DataSource``.

If ``SqlSettings.DataSource`` does not start with ``postgres://`` or ``mysql://``, then you have to add this line to the beginning based on the database in use. Also, if you see ``\u0026`` replace it with ``&``.

Here are two example connection strings:

**MySQL**

.. code-block:: text

   mysql://mmuser:really_secure_password@tcp(127.0.0.1:3306)/mattermost?charset=utf8mb4,utf8&writeTimeout=30s

**PostgreSQL**

.. code-block:: text

   postgres://mmuser:really_secure_password@localhost:5432/mattermost?sslmode=disable&connect_timeout=10

Create an environment file
~~~~~~~~~~~~~~~~~~~~~~~~~~

.. note::
   
   If you're running Mattermost in a High Availability cluster, this step must be done on all servers in the cluster.

Create the file ``/opt/mattermost/config/mattermost.environment`` to set the ``MM_CONFIG`` environment variable to the database connection string. For example:

**MySQL**

.. code-block:: text

   MM_CONFIG='mysql://mmuser:mostest@tcp(127.0.0.1:3306)/mattermost?charset=utf8mb4,utf8&writeTimeout=30s'

**PostgreSQL**

.. code-block:: text

   MM_CONFIG='postgres://mmuser:mostest@localhost:5432/mattermost_test?sslmode=disable&connect_timeout=10'

.. note::
  Be sure to escape any single quotes in the database connection string by placing a ``\`` in front of them like this ``\'``. For example: ``MM_CONFIG='mysql://mmuser:it\'s-a-password!@tcp(127.0.0.1:3306)/mattermost?charset=utf8mb4,utf8&writeTimeout=30s'``

.. code-block:: text

   MM_CONFIG='mysql://mmuser:it\'s-a-password!@tcp(127.0.0.1:3306)/mattermost?charset=utf8mb4,utf8&writeTimeout=30s'

Finally, run this command to verify the permissions on your Mattermost directory:

.. code-block:: bash

   sudo chown -R mattermost:mattermost /opt/mattermost

Modify the Mattermost ``systemd`` file
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

First, find the ``mattermost.service`` file using:

.. code-block:: bash

   sudo systemctl status mattermost.service

The second line of output will have the location of the running ``mattermost.service``.

.. code-block:: text

      Loaded: loaded (/lib/systemd/system/mattermost.service; enabled; vendor preset: enabled)

Edit this file as *root* to add the below text just above the line that begins with ``ExecStart``\ :

.. code-block:: text

   EnvironmentFile=/opt/mattermost/config/mattermost.environment

Here's a complete ``mattermost.service`` file with the ``EnvironmentFile`` line added:

.. code-block:: text

   [Unit]
   Description=Mattermost
   After=network.target
   After=mysql.service
   Requires=mysql.service

   [Service]
   Type=notify
   EnvironmentFile=/opt/mattermost/config/mattermost.environment
   ExecStart=/opt/mattermost/bin/mattermost
   TimeoutStartSec=3600
   KillMode=mixed
   Restart=always
   RestartSec=10
   WorkingDirectory=/opt/mattermost
   User=mattermost
   Group=mattermost
   LimitNOFILE=49152

   [Install]
   WantedBy=mysql.service

.. note::
  If you're using PostgreSQL as your database, the ``mysql.service`` must be replaced with ``postgresql.service``. The easiest way to avoid making a mistake is to add only the ``EnvironmentFile`` line and not copy the entire example.

Migrate configuration from ``config.json``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

You can use the `mmctl config migrate <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-config-migrate>`__ command, or you can use the CLI mattermost config migrate command for this step, as described below.

.. note::
 
   If you're using a High Availability cluster, you only need to run this on a single server in the cluster.

The CLI command to migrate the config to the database should always be run as the *mattermost* user.

.. code-block:: bash

   sudo su mattermost
   cd /opt/mattermost
   mmctl config migrate ./config/config.json 'mysql://mmuser:mostest@tcp(127.0.0.1:3306)/mattermost?charset=utf8mb4,utf8&writeTimeout=30s'

.. warning::
   When migrating config, Mattermost will incorporate configuration from any existing ``MM_*`` environment variables set in the current shell. See `Environment Variables  <https://docs.mattermost.com/configure/configuration-settings.html>`_
   
As with the environment file, you'll have to escape any single quotes in the database connection string. Also, any existing SAML certificates will be migrated into the database as well so they are available for all servers in the cluster.

When configuration in the database is enabled, any changes to the configuration are recorded to the ``Configurations`` and ``ConfigurationFiles`` tables. Furthermore, ``ClusterSettings.ReadOnlyConfig`` is ignored, enabling full use of the System Console.

If you have configuration settings that must be set on a per-server basis you should add them as environment variables to the ``mattermost.environment`` file. These must be on their own line, and you must escape them properly.

Verify that the configuration was migrated correctly
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Configurations are stored in the ``Configurations`` table in the database. To verify that you've migrated the configuration successfully run this query:

.. code-block:: sql

   SELECT * FROM Configurations WHERE Active = 1;

There should be exactly one line returned, and the ``Value`` field for that line should match your ``config.json`` file.

Reload ``systemd`` files and restart Mattermost
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. note::
  If you're running Mattermost in High Availability this step must be run on all servers in the cluster.

Finally, run these commands to reload the daemon and restart Mattermost using the new ``MM_CONFIG`` environment variable.

.. code-block:: text

   sudo systemctl daemon-reload
   sudo systemctl restart mattermost

Rolling back
~~~~~~~~~~~~

If you run into issues with your configuration in the database you can roll back to the ``config.json`` file by commenting out the ``MM_CONFIG`` line in ``/opt/mattermost/config/mattermost.environment`` and restarting Mattermost with ``systemctl restart mattermost``.

Troubleshooting
-----------------

Server fails to start 
~~~~~~~~~~~~~~~~~~~~~

Providing the ``--disableconfigwatch`` flag while not actually pointing at a file will fail to start the server with an appropriate error message.

source/configure/config-ssl-http2-apache2.rst METASEP
:nosearch:

.. _config-ssl-http2-apache2:

Configuring Apache2 with SSL and HTTP/2 (unofficial)
----------------------------------------------------

.. important:: This unofficial guide is maintained by the Mattermost community and this deployment configuration is not yet officially supported by Mattermost, Inc. `Community testing, feedback and improvements are welcome and greatly appreciated <https://github.com/mattermost/docs/issues/1295>`__. You can `edit this page on GitHub <https://github.com/mattermost/docs/blob/master/source/configure/config-ssl-http2-apache2.rst>`__.

In order to use Apache as a reverse proxy for the Mattermost Server, you need to install and enable the following apache modules: ``mod_rewrite`` , ``mod_proxy``, ``mod_proxy_http``, ``mod_headers``, and ``mod_proxy_wstunnel``. Follow the installation instructions for your Linux distribution.

Once you've configured Apache2 as a proxy for your Mattermost Server, the easiest way to enable SSL on Apache2 is via Let's Encrypt and `Certbot <https://certbot.eff.org/#ubuntuxenial-apache>`__.

.. note::
   If Let’s Encrypt is enabled, forward port 80 through a firewall, with `Forward80To443 <https://docs.mattermost.com/configure/configuration-settings.html#forward-port-80-to-443>`__ ``config.json`` setting set to ``true`` to complete the Let’s Encrypt certification.

Once installed, run ``$ certbot --apache`` and follow the guide. Afterwards you should find a new configuration file in ``/etc/apache2/sites-available`` which should follow the format ``mysubdomain.mydomain.com-le-ssl.conf``.

When opened, edit it to look something like the following:

.. code-block:: apacheconf

	<IfModule mod_ssl.c>
	<VirtualHost *:443>
		ServerName mysubdomain.mydomain.com
		ServerAdmin hostmaster@mydomain.com
		ProxyPreserveHost On
		RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
		RequestHeader set "X-Forwarded-SSL" expr=%{HTTPS}
		
		RewriteEngine On
		RewriteCond %{REQUEST_URI} /api/v[0-9]+/(users/)?websocket [NC]
		RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC,OR]
		RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]
		RewriteRule .* ws://127.0.0.1:8065%{REQUEST_URI} [P,QSA,L]

		<Location />
			Require all granted
			ProxyPass http://127.0.0.1:8065/
			ProxyPassReverse http://127.0.0.1:8065/
			ProxyPassReverseCookieDomain 127.0.0.1 mysubdomain.mydomain.com
		</Location>

		# Generated by Certbot
		SSLCertificateFile /etc/letsencrypt/live/mydomain.com/fullchain.pem
		SSLCertificateKeyFile /etc/letsencrypt/live/mydomain.com/privkey.pem
		Include /etc/letsencrypt/options-ssl-apache.conf
	</VirtualHost>
	</IfModule>

1. Restart Apache2

    - On Ubuntu 14.04 and RHEL 6: ``sudo service apache2 restart``
    - On Ubuntu 16.04 and RHEL 7: ``sudo systemctl restart apache2``

2. Test that the site is working, that WebSockets are working, and if you enabled HTTP redirect to HTTPS during Certbot installation that the redirect is working.
3. Lastly, test your SSL configuration with https://www.ssllabs.com/ssltest/index.html.

Using Certbot means that you shouldn't have to do anything in the configuration of Mattermost.

source/configure/config-proxy-apache2.rst METASEP
:nosearch:

.. _config-proxy-apache2:

Configuring Apache2 as a proxy for Mattermost Server (Unofficial)
-----------------------------------------------------------------

.. important:: This unofficial guide is maintained by the Mattermost community and this deployment configuration is not yet officially supported by Mattermost, Inc. `Community testing, feedback and improvements are welcome and greatly appreciated <https://github.com/mattermost/docs/issues/1295>`__. You can `edit this page on GitHub <https://github.com/mattermost/docs/blob/master/source/configure/config-proxy-apache2.rst>`__.

On a Debian-based operating system such as Ubuntu, Apache2 proxy configuration is done in the ``/etc/apache2/sites-available`` directory. Red Hat-based systems organize Apache configuration files `differently <https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/system_administrators_guide/ch-web_servers>`__. If you're setting up Mattermost on a subdomain, you'll want to create a new configuration file along the lines of ``mysubdomain.mydomain.com.conf``.

**To configure Apache2 as a proxy**

1. SSH into your server.
2. Make sure the Apache modules ``mod_rewrite`` , ``mod_proxy``, ``mod_proxy_http``, and ``mod_proxy_wstunnel`` are installed and enabled. If not, follow the instructions from your Linux distribution to do so.
3. Create the above mentioned configuration file. It is often helpful to start with a copy of ``000-default.conf`` or ``default-ssl.conf`` (on Ubuntu).
4. Edit your configuration using the guide below:

	1. If you're not setting up a subdomain, your ``ServerName`` will simply be set to ``mydomain.com``.
	2. ``ServerAlias`` can been added too if you want to capture ``www.mydomain.com``.
	3. Remember to change the values to match your server's name, etc.
	4. If you have enabled TLS in the Mattermost settings, you must use the protocol ``wss://`` instead of ``ws://`` in the ``RewriteRule``.
	5. To serve requests on a different port (such as 8443), in addition to setting the port in the VirtualHost element, add ``Listen 8443`` on a separate line before the VirtualHost line.

.. code-block:: apacheconf

		<VirtualHost *:80>
		  # If you're not using a subdomain you may need to set a ServerAlias to:
		  # ServerAlias www.mydomain.com
		  ServerName mysubdomain.mydomain.com
		  ServerAdmin hostmaster@mydomain.com
		  ProxyPreserveHost On

		  # Set web sockets
		  RewriteEngine On
		  RewriteCond %{REQUEST_URI} /api/v[0-9]+/(users/)?websocket [NC]
		  RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC,OR]
		  RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]
		  RewriteRule .* ws://127.0.0.1:8065%{REQUEST_URI} [P,QSA,L]

		  <Location />
			Require all granted
			ProxyPass http://127.0.0.1:8065/
			ProxyPassReverse http://127.0.0.1:8065/
			ProxyPassReverseCookieDomain 127.0.0.1 mysubdomain.mydomain.com
		  </Location>

		</VirtualHost>

5. (Debian/Ubuntu only) Because you'll likely have not set up the subdomain before now on Apache2, run ``a2ensite mysubdomain.mydomain.com`` to enable the site (do not run ``a2ensite mysubdomain.mydomain.com.conf``).

6. Restart Apache2.

	- On Ubuntu 14.04 and RHEL 6: ``sudo service apache2 restart``
	- On Ubuntu 16.04+ and RHEL 7+: ``sudo systemctl restart apache2``

You should be all set! Ensure that your Mattermost config file is pointing to the correct URL (which may include a port), and then ensure that your socket connection is not dropping once deployed. To prevent external access to Mattermost on port 8065, in the config file, set ``ListenAddress`` to ``localhost:8065`` instead of ``:8065``.

source/configure/common-config-settings-notation.rst METASEP
:orphan:
:nosearch:

.. tip:: 

    Each configuration value below includes a JSON path to access the value programmatically in the ``config.json`` file using a JSON-aware tool. For example, the ``SiteURL`` value is under ``ServiceSettings``.
    
    - If using a tool such as `jq <https://stedolan.github.io/jq/>`__, you'd enter: ``cat config/config.json | jq '.ServiceSettings.SiteURL'``
    - When working with the ``config.json`` file manually, look for the key ``ServiceSettings``, then within that object, find the key ``SiteURL``.
source/configure/cloud-billing-account-settings.rst METASEP
Cloud billing and account settings
==================================

.. include:: ../_static/badges/allplans-cloud.rst
  :start-after: :nosearch:

Go to **System Console > Billing and Account** to manage the following aspects of your Cloud workspace:

- Access `billing history <https://docs.mattermost.com/about/cloud-subscriptions.html#billing-period>`__.
- Manage the `product subscription <https://docs.mattermost.com/about/cloud-subscriptions.html>`__ and account details for your Mattermost Cloud deployment.
- Review trial details.
- Contact the Mattermost Sales team for assistance.
source/configure/calls-deployment.rst METASEP
Calls self-hosted deployment
============================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

This document provides information on how to successfully make the Calls plugin work on self-hosted deployments. It also outlines some of the most common deployment strategies with example diagrams.

Terminology
-----------

- `WebRTC <https://bloggeek.me/webrtcglossary/webrtc-2/>`__: The set of underlying protocols/specifications on top of which calls are implemented. 
- **RTC (Real Time Connection)**: The real-time connection. This is the channel used to send media tracks (audio/video/screen).
- **WS (WebSocket)**: The WebSocket connection. This is the channel used to set up a connection (signaling process).
- `NAT (Network Address Translation) <https://bloggeek.me/webrtcglossary/nat/>`__: A networking technique to map IP addresses. 
- `STUN (Session Traversal Utilities for NAT) <https://bloggeek.me/webrtcglossary/stun/>`_: A protocol/service used by WebRTC clients to help traversing NATs. On the server side it's mainly used to figure out the public IP of the instance. 
- `TURN (Traversal Using Relays around NAT) <https://bloggeek.me/webrtcglossary/turn/>`_: A protocol/service used to help WebRTC clients behind strict firewalls connect to a call through media relay. 

Components
----------

- **Calls plugin**: This is the main entry point and a requirement to enable channel calls.

.. include:: ../_static/badges/ent-only.rst
  :start-after: :nosearch:

- **rtcd**: This is an optional service that can be deployed to offload all the functionality and data processing involved with the WebRTC connections. This is the preferred solution for a performant and scalable deployment. With ``rtcd``, the Mattermost server will be minimally impacted when hosting a high number of calls.

Requirements
------------

Server
~~~~~~

- Run Mattermost server on a secure (HTTPs) connection. This is a necessary requirement on the client to allow capturing devices (e.g., microphone, screen). See the `config TLS </install/config-tls-mattermost.html>`_ section for more info.
- See `network requirements </configure/calls-deployment.html#network>`_ below.

Client
~~~~~~
- Clients need to be able to connect (send and receive data) to the instance hosting the calls through the UDP port configured as ``RTC Server Port``. If this is not possible a TURN server should be used to achieve connectivity.
- Depending on the platform or operating system, clients may need to grant additional permissions to the application (e.g., browser, desktop app) to  allow them to capture audio inputs or share the screen.

Network
~~~~~~~

+---------------------------------+-------------------+-------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Service name                    | Ports (defaults)  | Protocols                     | Notes                                                                                                                                                                                                                                                                                                                                        |
+=================================+===================+===============================+==============================================================================================================================================================================================================================================================================================================================================+
| API (plugin)                    | 80, 443           | TCP (incoming) HTTP(s)/WS(s)  | This API is exposed on the same connection as Mattermost, so there’s no need to change anything.                                                                                                                                                                                                                                             |
+---------------------------------+-------------------+-------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| RTC (plugin or ``rtcd``)        | 8443              | UDP (incoming)                | Public/client facing. This should be open on any network component (e.g. NAT, firewalls) in between the instance running the plugin (or ``rtcd``) and the clients joining calls so that UDP traffic is correctly routed both ways (from/to clients). This is the connection that transports all the calls related media (e.g. audio, video)  |
+---------------------------------+-------------------+-------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| API (``rtcd``)                  | 8045              | TCP (incoming)                | Internal, private network. Only needs to be reachable by the instances running the Mattermost server.                                                                                                                                                                                                                                        |
+---------------------------------+-------------------+-------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| STUN/TURN (plugin or ``rtcd``)  | 3478              | UDP (outgoing)                | Public/client facing. Only needed if configuring STUN/TURN servers. This requirement does not apply when manually setting an IP/hostname through the ICE Host Override config option.                                                                                                                                                        |
+---------------------------------+-------------------+-------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Limitations
-----------

- In Mattermost Cloud, up to 200 participants per channel can join a call. 
- In Mattermost self-hosted deployments, the default maximum number of participants is unlimited. The recommended maximum number of participants per call is 200. This setting can be changed in **System Console > Plugin Management > Calls > Max call participants**. There's no limit to the total number of participants across all calls as the supported value greatly depends on instance resources. For more details, refer to the `performance section </configure/calls-deployment.html#performance>`_ below.

Configuration
-------------

For Mattermost self-hosted customers, the calls plugin is pre-packaged, installed, and enabled. Configuration to allow end-users to use it can be found in the `System Console <https://docs.mattermost.com/configure/configuration-settings.html#calls-beta>`_.

Modes of operation
------------------

Depending on how the Mattermost server is running, there are several modes under which the Calls plugin can operate.

.. image:: ../images/calls-deployment-image1.png
  :alt: A diagram of the calls deployment modes and their dependencies.

Single instance
~~~~~~~~~~~~~~~

Integrated
^^^^^^^^^^

This is the default mode when first installing the plugin on a single Mattermost instance setup. The WebRTC service is integrated in the plugin itself and runs alongside the Mattermost server.

.. image:: ../images/calls-deployment-image3.png
  :alt: A diagram of the integrated configuration model of a single instance.

rtcd
^^^^

An external, dedicated and scalable WebRTC service (``rtcd``) is used to handle all calls media routing.

.. image:: ../images/calls-deployment-image7.png
  :alt: A diagram of a Web RTC deployment configuration.

High availability cluster
~~~~~~~~~~~~~~~~~~~~~~~~~

Clustered
^^^^^^^^^

This is the default mode when running the plugin in a HA cluster. Every Mattermost node will run an instance of the plugin that includes a WebRTC service. Calls are distributed across all available nodes through the existing load-balancer: a call is hosted on the instance where the initiating websocket connection (first client to join) is made. A single call will be hosted on a single cluster node.

.. image:: ../images/calls-deployment-image5.png
  :alt: A diagram of a clustered calls deployment.

Single handler
^^^^^^^^^^^^^^

This is a fallback mode to only let one node in the cluster to host calls. While the plugin would still run on all nodes, all calls will be routed through the handler node. This mode must be enabled by running the instance with a special environment variable set (MM_CALLS_IS_HANDLER=true).

.. image:: ../images/calls-deployment-image4.png
  :alt: A diagram of a single handler deployment.

rtcd (HA)
^^^^^^^^^

.. image:: ../images/calls-deployment-image2.png
  :alt: A diagram of an rtcd deployment.

Kubernetes deployments
----------------------

.. image:: ../images/calls-deployment-kubernetes.png
  :alt: A diagram of calls deployed in a Kubernetes cluster.
  
If Mattermost is not deployed in a Kubernetes cluster, and you want to use this deployment type, visit the `Kubernetes operator guide <https://docs.mattermost.com/install/mattermost-kubernetes-operator.html>`_.

``rtcd`` is deployed with a Helm chart. To install this Helm chart run:

.. code-block:: none

  helm repo add mattermost https://helm.mattermost.com

More info about the version and the chart itself, please check here. Regarding changing the parameters of the helm chart, please check and copy the default values from here.

An example with sample values:

.. code-block:: none

 image:
   repository: mattermost/rtcd
   pullPolicy: IfNotPresent
   tag: "v0.6.9"

 imagePullSecrets: []
 nameOverride: ""
 fullnameOverride: ""

 serviceAccount:
    create: true
    annotations: {}
    name: ""

 podAnnotations: {}

 podSecurityContext: {}

  securityContext: {}

  daemonset:
    environmentVariables:
      RTCD_API_SECURITY_ALLOWSELFREGISTRATION: "\"true\""
      RTCD_RTC_ICESERVERS: 
    "\'[{\"urls\":[\"stun:stun.global.calls.mattermost.com:3478\"]}]\'"
      RTCD_LOGGER_CONSOLELEVEL: "\"DEBUG\""
      RTCD_LOGGER_ENABLEFILE: "\"false\""
    maxUnavailable: 1 # Only used when updateStrategy is set to 
   "RollingUpdate"
    updateStrategy: RollingUpdate
    terminationGracePeriod: 18000 # 5 hours, used to gracefully draining the instance.

  service:
    # APIport is the port used by rtcd HTTP/WebSocket API.
    APIport: 8045
    # RTCport is the UDP port used to route all the calls related traffic.
    RTCport: 8443

 ingress:
    enabled: false
    classname: nginx-calls
    annotations:
    hosts:
      - host: mattermost-rtcd.local
        paths:
          - "/"
          
 resources:
    limits:
      cpu: 7800m # Values for c5.2xlarge in AWS
      memory: 15Gi # Values for c5.2xlarge in AWS
    requests:
      cpu: 100m
      memory: 32Mi

 nodeSelector:
    kops.k8s.io/instancegroup: rtcd

  tolerations:
    - key: "rtcd"
      operator: "Equal"
      value: "true"
      effect: "NoSchedule"

  dnsConfig:
    options:
    - name: ndots
      value: "1"

  affinity: {}

``rtcd`` will be deployed as DaemonSet, for that reason the sections of nodeSelector and tolerations are used so that ``rtcd`` to be deployed in specific nodes.

After having the values above, to deploy the ``rtcd`` helm chart run:

.. code-block:: none

  helm upgrade mattermost-rtcd mattermost/mattermost-rtcd -f /Users/myuser/rtcd_values.yaml --namespace mattermost-rtcd --create-namespace --install --debug
  

Performance
-----------

Calls performance primarily depends on two resources: CPU and bandwidth (both network latency and overall throughput).
The final consumption exhibits quadratic growth with the number of clients transmitting and receiving media.

As an example, a single call with 10 participants of which two are unmuted (transmitting voice data) will generally consume double the resources than the same call with a single participant unmuted. What ultimately counts towards performance is the overall number of concurrent media flows (in/out) across the server.

Benchmarks
~~~~~~~~~~
Here are some results from internally conducted performance tests on a dedicated instance:

 ======== ============= =============== ================ ================= 
  Calls    Users/call    Unmuted/call    Screensharing    Instance (EC2)   
 ======== ============= =============== ================ ================= 
  100      4             1               100              c5.xlarge        
  200      8             2               25               c5.xlarge        
  200      8             2               0                c5.xlarge        
  50       20            2               50               c5.2xlarge       
  100      8             4               100              c5.2xlarge       
 ======== ============= =============== ================ ================= 

Dedicated service
~~~~~~~~~~~~~~~~~

For Enterprise customers we offer a way to offload performance costs through a `dedicated service <https://github.com/mattermost/rtcd>`_ that can be used to further scale up calls. 

System tunings
~~~~~~~~~~~~~~

If you wish to host many calls or calls with a large number of participants, take a look at the following platform specific (Linux) tunings (this is the only officially supported target for the plugin right now):

.. code::

  # Setting the maximum buffer size of the receiving UDP buffer to 16MB
  net.core.rmem_max = 16777216

  # Setting the maximum buffer size of the sending UDP buffer to 16MB
  net.core.wmem_max = 16777216

  # Allow to allocate more memory as needed for more control messages that need to be sent for each socket connected
  net.core.optmem_max = 16777216

Frequently asked questions
--------------------------

Is using UDP a requirement?
~~~~~~~~~~~~~~~~~~~~~~~~~~~

Yes, UDP is the recommended protocol to serve real-time media as it allows for the lowest latency between peers. While theoretically possible to use TCP, it's not currently supported by the plugin. If using a UDP port is unfeasible, one possible solution would be to run calls through an external TURN server that listens on TCP and relays all media traffic between peers. However, this is a sub-optimal solution that should be avoided if possible as it will introduce extra latency along with added infrastructural cost.

Do I need a TURN server?
~~~~~~~~~~~~~~~~~~~~~~~~

TURN becomes necessary when you expect to have clients that are unable to connect through the configured UDP port. This can happen due to very restrictive firewalls that either block non standard ports even in the outgoing direction or don't allow the use of the UDP protocol altogether (e.g. some corporate firewalls). In such cases TURN is needed to allow connectivity.

We officially support and recommend using `coturn <https://github.com/coturn/coturn>`_ for a stable and performance TURN service implementation.

How will this work with an existing reverse proxy sitting in front of Mattermost?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Generally clients should connect directly to either Mattermost or, if deployed, the dedicated ``rtcd`` service through the configured UDP port . However, it's also possible to route the traffic through an existing load balancer as long as this has support for routing the UDP protocol (e.g. nginx). Of course this will require additional configuration and potential changes to how the plugin is run as it won't be possible to load balance the UDP flow across multiple instances like it happens for HTTP.

Do calls require a dedicated server to work or can they run alongside Mattermost?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The plugin can function in different modes. By default calls are handled completely by the plugin which runs as part of Mattermost. It's also possible to use a dedicated service to offload the computational and bandwidth costs and scale further (Enterprise only).

Can the traffic between Mattermost and ``rtcd``  be kept internal or should it be opened to the public?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

When possible, it's recommended to keep communication between the Mattermost cluster and the dedicated ``rtcd`` service under the same private network as this can greatly simplify deployment and security. There's no requirement to expose ``rtcd``'s HTTP API to the public internet.

source/comply/electronic-discovery.rst METASEP
.. _ediscovery:

Electronic discovery
=====================

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

Electronic discovery (also known as eDiscovery) refers to a process where where electronic data is searched with the intent to use it as evidence in a legal case.

This page describes how to extract data from Mattermost for eDiscovery. There are three primary methods that can be used to accomplish the goal of extracting user post data from Mattermost:

- `Mattermost Compliance Exports <https://docs.mattermost.com/comply/compliance-export.html>`__
- `Mattermost RESTful API <https://docs.mattermost.com/comply/electronic-discovery.html#mattermost-restful-api>`__
- `Mattermost database using standard SQL queries <https://docs.mattermost.com/comply/electronic-discovery.html#mattermost-database>`__

Each of the options is discussed in detail below.

.. note::
  Litigation hold (also known as legal hold) is an extension of eDiscovery where in addition to searching for records, no electronically stored information nor paper documents may be discarded if they may be deemed relevant for a present or future legal case.

Mattermost compliance exports
-----------------------------

Mattermost Enterprise has compliance report export capabilities.

Mattermost can export compliance related data, including the content of messages and who might have seen those messages, in three formats: Actiance XML, Global Relay EML, and generic CSV. Reports can be configured to run on a delay basis and stored in a shared location.

For more information about the exports feature and how to set up reporting, see `our documentation <https://docs.mattermost.com/comply/compliance-export.html>`__.

Mattermost RESTful API
----------------------

The Mattermost API can be used to export a user's posts in CSV compliance format that is part of Mattermost Enterprise. The following section outlines how to use the API to create and retrieve a report for a specific user via the API. Please note that full documentation for the Mattermost API can be found at https://api.mattermost.com.

To use the API, you must first authenticate `as described here <https://api.mattermost.com/#tag/authentication>`__. The account you are authenticating with must have ``manage_system`` permissions. If you are using curl, you can authenticate using the following command:

.. code-block:: json

  curl -i -d '{"login_id": "username", "password": "password"}' https://yourmattermosturl/api/v4/users/login

Mattermost will return a response that looks like this:

.. code-block:: json

  HTTP/2 200 
  server: nginx/1.10.3 (Ubuntu)
  date: Thu, 12 Jul 2018 14:43:45 GMT
  content-type: application/json
  content-length: 679
  set-cookie: MMAUTHTOKEN=yi94pwci6ibjfc9phbikhqutbe; Path=/; Expires=Sat, 11 Aug 2018 14:43:45 GMT; Max-Age=2592000; HttpOnly; Secure
  set-cookie: MMUSERID=qfjzamfg47bu9gsyyfbqjk4s6a; Path=/; Expires=Sat, 11 Aug 2018 14:43:45 GMT; Max-Age=2592000; Secure
  token: yi94pwci6ibjfc9phbikhqutbe
  x-request-id: 5y45pxyfxpb8updtge1zts39he
  x-version-id: 5.0.0.5.0.1.18c0fbd759664a85fe95132bb7fc04cf.true

Include the ``token`` value sent in the response as part of the Authorization header on your future API requests with the Bearer method, e.g.:

.. code-block:: json

  curl -i -H 'Authorization: Bearer yi94pwci6ibjfc9phbikhqutbe http://yourmattermosturl/api/v4/users/me

Once you're authenticated into Mattermost, you can use the `Compliance API to create a new compliance report <https://api.mattermost.com/#tag/compliance%2Fpaths%2F~1compliance~1reports%2Fpost>`__. The curl based example below demonstrates how to send a request that bases the authentication token and asks Mattermost to create a report that spans posts from Dec 31, 2017 - 8:15 PM to Dec 31, 2018 - 8:15 PM for a user with the email address craig@mattermost.com:

.. note::

  The data in the JSON payload must be formatted as Unix Epoch. A tool like https://www.epochconverter.com/ can be useful when converting to and from the required format.

.. code-block:: json

  curl --header "Content-Type: application/json" \
  --request POST \
  -H 'Authorization: Bearer yi94pwci6ibjfc9phbikhqutbe \
  --data '{"id":"","create_at":0,"user_id":"craig","status":"","count":0,"desc":" ","type":"","start_at":1514769359000,"end_at": 1546305359000,"keywords":"","emails":"craig@mattermost.com"}' \
  https://yourmattermosturl/api/v4/compliance/reports

If the post is successful, Mattermost will return a message that looks like the following, indicating that the server is running the compliance export process:

.. code-block:: json

  {"id":"du6kektczifqxexeroywpz3nbc"," create_at":1531444617901, "user_id":"qfjzamfg47bu9gsyyfbqjk4s6a", "status":"running", "count":0, "desc":" ", "type":"adhoc", "start_at":1514769359000, "end_at":1546305359000, "keywords":"", "emails":"craig@mattermost.com"}

When the export process is complete (the execution time is based on the number of records to return and the current server load), you will need to send another HTTP Post request to Mattermost to retrieve and download a zip file containing the report that looks like the following curl request:

.. code-block:: json

  curl --request GET \
  -H 'Authorization: Bearer p9o1qx457fbc9gdrn39z9ah59o' \
  --data '{"status_code":0,"id":"du6kektczifqxexeroywpz3nbc","message":"","requestion_id":""}' \
  --output report-zip.zip \
  https://yourmattermosturl/api/v4/compliance/reports/du6kektczifqxexeroywpz3nbc/download

When sending the request, you need to get the report ID from the response returned by Mattermost when the report was created. You also need to supply a name to save that file as. In the example above, the file will be saved as ``report-zip.zip``.

Mattermost database
-------------------

Selecting messages from the Mattermost database using standard SQL is quite easy. If you know the username, the following query can be used to select all messages for the specified user:

.. code-block:: sql
  
  SELECT * FROM mattermost.Posts WHERE UserId = (SELECT Id FROM mattermost.Users WHERE Username = 'username');

If you want to limit the results of the query based on the date and time that the messages were posted, you can modify the above query to:

.. code-block:: sql
  
  SELECT * FROM mattermost.Posts WHERE UserId = (SELECT Id FROM mattermost.Users WHERE Username = 'username' AND CreateAt > 1530405832000 AND CreateAt < 1532997832000);

.. note:: 
  The Mattermost database stores date and time stamps in the `Unix Epoch <https://en.wikipedia.org/wiki/Unix_time>`__ format. A tool like the `Epoch Converter <https://www.epochconverter.com/>`__ can be useful in converting to and from the required format.

source/comply/data-retention-policy.rst METASEP
Data retention policy
=====================

.. include:: ../_static/badges/ent-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Mattermost Enterprise Edition E20*

By default, Mattermost stores all message history providing an unlimited search history to System Admins and end users.

In Mattermost Enterprise, you can set a global retention policy as well as custom retention policies to manage how long messages and file uploads are kept in Mattermost channels and direct messages.

For scheduled data retention jobs to work, the `global retention policy for files <https://docs.mattermost.com/configure/configuration-settings.html#enable-global-retention-policy-for-files>`__ as well as the `global retention policy for messages <https://docs.mattermost.com/configure/configuration-settings.html#enable-global-retention-policy-for-messages>`__ configuration settings in the ``config.json`` file must be set to ``true``. These configuration settings are disabled by default.

.. warning:: 
  Once a message or a file is deleted, the action is irreversible. Please use caution when setting up global or custom data retention policies.

Configure a global data retention policy
-----------------------------------------

To set a global data retention policy in Mattermost v5.38 and later:

1. Go to **System Console > Compliance > Data Retention Policies**.
2. Select **Edit** from the menu located to the right of the **Global retention policy** table. 
3. Specify a global retention policy for channel messages and direct messages by selecting a **Channel & direct message retention** option from the dropdown, then set how long to keep those messages. When a time is set, messages and file attachments older than the duration you set will be deleted. The minimum retention period is one day.
4. Select a **File retention** option from the dropdown. Set the number of days or years to keep files. When a time is set, uploaded files which are older than the duration you set will be deleted from your file storage system (either from your local disk or your Amazon S3 service as specified in **System Console > Environment > File Storage**. The minimum retention period is one day. The global file policy deletes all files regardless of whether they're in a direct message, private, or public channel.
5. Under the **Policy log** section, select **Edit** to specify the start time of the daily scheduled data retention job. Choose a time when fewer people are using your system. 

Select **Save**. Messages and files older than the duration you set will be deleted at the specified server time, as applicable.

Configure a custom data retention policy
----------------------------------------

To set a custom data retention policy in Mattermost v5.38 and later:

1. Go to **System Console > Compliance > Data Retention Policies**.
2. Select **Add policy** to the right of the **Custom retention policies** table. 
3. Specify a name for your policy. 
4. Specify a custom retention policy for channel and direct messages by selecting a **Channel & direct message retention** option from the dropdown, then set how long to keep uploaded files. When a time is set, messages and file attachments older than the duration you set will be deleted. The minimum retention period is one day.
5. Assign teams and channels to this policy by selecting **Add teams** and searching for a specific team, or by selecting **Add channels** and searching for a specific channel. If only teams are specified, all channels for selected teams will be included in the a policy. 
6. Under the **Policy log** section, select **Edit** to specify the start time of the daily scheduled data retention job. Choose a time when fewer people are using your system. If a time is already set for a global retention policy, then the same time applies to custom data retention policies. 

Save the settings. Messages and files older than the duration you set will be deleted at the specified server time, as applicable.

Run a deletion job manually
----------------------------

You can also run the deletion job manually at any time by selecting **Run Deletion Job Now** in **System Console > Compliance > Data Retention Policy**.

.. note::
  
  If using data retention and `ElasticSearch <https://docs.mattermost.com/scale/elasticsearch.html>`_, ensure the `ElasticSearch aggregate search indexes <https://docs.mattermost.com/configure/configuration-settings.html#aggregate-search-indexes>`_ setting is set to a value that is greater than your data retention policy in days.

Frequently Asked Questions (FAQs)
---------------------------------

What happens when a message is deleted?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The message is removed from the Mattermost user interface and deleted from the ``Posts`` table. The message is no longer searchable and cannot be retrieved in pinned posts or saved posts lists. 

Replies that did not exceed the message duration are still displayed in the user interface. However, further replies are no longer possible.

If there was a file attached to the message, it will be removed from the user interface only.  

What happens when a file is deleted by the file retention policy?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The file attachment is removed from the Mattermost user interface, deleted from the ``FileInfo`` table, and from your local disk or Amazon S3 service as specified in **System Console > Environment > File Storage**.

Why didn't an old file get deleted after running the deletion job?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

First, check the data deletion was successful in the deletion job table in **System Console > Compliance > Data Retention Policy**.

If the files were uploaded prior to Mattermost v4.2, you will need to delete the files manually from your local file storage or Amazon S3 storage:

1. Wait until all files uploaded prior to Mattermost v4.2 are past the file retention policy duration.
2. Delete the ``teams/`` folder in the root of your  Mattermost storage directory.

Note that these files will still be removed from the Mattermost user interface if they were uploaded in Mattermost v3.5 or later, which contain the `FileInfo table <https://docs.mattermost.com/install/self-managed-changelog.html#id41>`__. 

Why do I see ``Pending`` in the deletion job table with no details?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This usually means another data retention job is in progress. You can verify this in the deletion job table in  **System Console > Compliance > Data Retention Policy**.

How is data retention handled in the mobile apps?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

When messages or files are deleted, they are no longer searchable in the Mattermost mobile apps. 

In v1.5 and later of the iOS and Android apps, messages and files are deleted from local storage in the following cases, if they exceed the retention policy duration:

1. When the user opens the app.
2. When the user puts the app into the background.

In v1.4 and earlier of the mobile apps, messages and files are not cleared from local storage when the data retention policy is enabled.

How do I know if a data retention job fails?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost provides the status of each data retention job in **System Console** > **Compliance** > **Data Retention Policy**. Here, you can see if the job succeeded or failed, including the details of the error.

Additionally, any failures are returned in the server logs. The error log begins with the string ``Failed job`` and includes a job_id key/value pair. Data retention job failures are identified with worker name ``EnterpriseDataRetention``. You can optionally create a script that programmatically queries for such failures and notifies the appropriate system.

What happens when the data retention period is changed?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Data retention runs once a day at the time specified in the ``config.json`` file. Changing the retention period does not automatically schedule any additional run of the data retention job - it only updates how long data is kept in Mattermost.

Does the System Administrator get any notification when the data retention period is changed?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

No, the new config is updated, but the System Admin does not receive any feedback on what the effects will be (e.g. reporting of how many messages are to be deleted).

Does the data retention job affect the audits table? 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Prior to v5.20, data retention would delete all user activity corresponding to the data retention time configuration. From v5.20, the audit table will retain the user activity corresponding to the data retention time configuration. 

Does the data retention job include archived channels? 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Posts and attachments in archived channels are affected by the data retention job. If a post exceeds the age configured for the data retention job it will be deleted from the database.

How long does it take to run a deletion query and does it affect server performance?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Data retention runs the actual deletion query in batches, deleting data in blocks of 1000 records per query. This is so the database won’t be locked up for extended periods of time with long-running queries. Keeping to this limit keeps the query down to a few milliseconds' execution time on the database itself.

Each batch of data is deleted based on indexes - making the queries quick to execute on small batches. This helps the server remain fully responsive while the process is running.

How do I know whether the data retention job is running/scheduled?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The job scheduler runs the data retention job based on the time specified in the configuration settings. At this time a ``DEBUG``-level log line is printed: ``Scheduling data retention job``.

When a job server picks up that scheduled job for execution, a ``DEBUG``-level log line is generated: ``Worker EnterpriseDataRetention: Received a new candidate job``.

When the job is complete, an ``INFO``-level log line is generated: ``Worker EnterpriseDataRetention: Job is complete``. 

source/comply/custom-terms-of-service.rst METASEP
.. _custom-terms-of-service:

Custom terms of service
=======================

.. include:: ../_static/badges/ent-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Mattermost Enterprise Edition E20*

System Admins can outline custom Terms of Service for their team members to accept before they can access Mattermost on web, desktop, or mobile.

Configuring terms of service
----------------------------

To enable custom terms of service:

1. Go to **System Console > Compliance > Custom Terms of Service**.
2. Set **Enable Custom Terms of Service** to **true**.
3. Set **Custom Terms of Service Text** which contains your terms. Markdown formatting is supported, including lists, headings, and bolding.
4. Set **Re-Acceptance Period** to configure the number of days before Terms of Service acceptance expires, and when the terms must be re-accepted. Set to 0 if you don't want your terms to expire.
5. Select **Save**.

Once saved, all users must accept the terms of service by clicking **I Agree** next time they log in, or on the next page refresh. If they do not accept, they will be logged out.

.. note::
 
 If you make an update to your Terms of Service, make sure to update your terms of service link at **System Console > Site Configuration > Customization > Terms of Service link**. This link is presented to all users when they log in, and it's easily accessible to end users after accepting the terms.

Frequently Asked Questions
--------------------------

What happens if I update my terms of service text?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

There will be no impact to your end users. Users will simply be required to accept the new terms on next login or page refresh.

What happens if a user doesn't accept the terms of service?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Users won't be able to log in if they don't accept the Terms of Service.

How do I know if my users accepted the terms of service?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Each time a user agrees to the terms of service, the agreement is recorded in the database:

- A new field ``AcceptedServiceTermsId`` in the **Users** table indicates the most recent terms of service the user has accepted.
- Each time a user accepts the terms, the action is recorded in the **Audits** table, containing the username, timestamp of acceptance, and other relevant information.

Why isn't this feature in Team Edition for GDPR compliance?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Terms of service is presented to users on login and account creation, and available to users at all times in the link available by going to **System Console > Site Configuration > Customization**.

This feature is intended to meet compliance requirements for large Enterprise companies.

source/comply/compliance-monitoring.rst METASEP
Compliance monitoring
======================

.. This page is intentionally NOT accessible from the LHS.

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Mattermost Enterprise Edition E20*

This feature enables compliance exports to be produced from the System Console, with all query and download actions logged in an audit history to enable oversight and prevent unauthorized queries.

Compliance exports can be filtered to date range, user account, and keyword list. Requests from queries can be downloaded from the user interface in ``.csv`` format, with a ``.json`` metafile documenting the query, as well as placed in a directory set by the System Admin.

Daily compliance reports may also be generated, supporting integration with compliance solutions like `Global Relay <#global-relay-support>`__.

By default, all Mattermost deployments retain all messages, including edits and deletes, along with all files uploaded.

Enable compliance reporting 
-----------------------------

To enable the option to generate daily compliance reports:

1. Go to **System Console > Compliance > Compliance Monitoring** and set the **Enable Compliance Reporting** value to **true**.
2. (Optional) In **Compliance Report Directory** specify the directory in which to place completed compliance reports. Defaults to ``./data/`` if left blank.
3. Select **Save**.

Turn on daily compliance reports 
--------------------------------

After enabling compliance reporting: 

1. Go to **System Console > Compliance > Compliance Monitoring** and set the **Enable Daily Report** value to **true**.
2. Select **Save**. 

Your system will now export all new messages posted within a 24-hour period as a ``.csv`` file to the location specified in **Compliance Report Directory**. This feature can be used in conjunction with centralized compliance reporting systems that move.

Run compliance reports  
----------------------

Compliance reports are exports of all messages in Mattermost that match the report criteria. To run a report:

1. Go to **System Console > Compliance > Compliance Monitoring**.
2. Fill in the following:

     - **Job Name:** Name the compliance report you are about to run (e.g. "HR Audit 455").
     - **From:** Start date for search in YYYY-MM-DD format (e.g. "2016-03-11").
     - **To:** End date of search in YYYY-MM-DD format (e.g. "2016-05-11").
     - **Emails:** Comma-separated list of email addresses of users whose posted messages you want to search (e.g. ``bill@example.com, bob@example.com``).
     - **Keywords:** Indicate the words that would be contained in a message for it to be included in the compliance report results.
3. Select **Run Compliance Report**.

The report will be queued in the display below the fields described above. The properties of each compliance report run is explained as follows: 

- **Timestamp:** Time at which the report was requested.
- **Status:** ``running`` indicates the report is being run; ``finished`` indicates the report is complete and ready for download.
- **Records:** Shows the number of search results.
- **Type:** ``adhoc`` indicates the report was requested by completing query fields; ``daily`` indicates the report is a daily export.
- **Description:** Job Name indicated in request.
- **Requested by:** Email of person requesting the report.
- **Params:** Parameters of the compliance report request.

Each compliance report includes a **Download** link which downloads a compressed file named ``adhoc-[UNIQUE_ID].zip``. Inside the file is ``meta.json``, which includes the parameters of the search executed and ``posts.csv`` which includes the contents of messages found by the request.

Compliance query definition stored in ``meta.json``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The ``meta.json`` file contains the following information about the compliance query:

+---------------------+---------------------------------------------------------------+-----------------------------------+
| Field               | Description                                                   | Example                           |
+=====================+===============================================================+===================================+
| id                  | Unique identifier for compliance query                        | ja8z8egap7nq9kqetz3rt98khe        |
+---------------------+---------------------------------------------------------------+-----------------------------------+
| create_at           | Timestamp at which compliance query was executed              | 1463637842478                     |
+---------------------+---------------------------------------------------------------+-----------------------------------+
| user_id             | Mattermost User ID for person creating query                  | 3bq1shta93yztg3i6aiu1tzi5h        |
+---------------------+---------------------------------------------------------------+-----------------------------------+
| status              | Status of query: *finished* or *failed*                       | "finished"                        |
+---------------------+---------------------------------------------------------------+-----------------------------------+
| count               | Count of messages found matching keyword                      | 36                                |
+---------------------+---------------------------------------------------------------+-----------------------------------+
| desc                | User entered description of compliance query                  | Example Compliance Report         | 
+---------------------+---------------------------------------------------------------+-----------------------------------+
| type                | Type of compliance query: *adhoc* or *daily*                  | "adhoc"                           | 
+---------------------+---------------------------------------------------------------+-----------------------------------+
| start_at            | Timestamp at which query began to run                         | 1451606400000                     | 
+---------------------+---------------------------------------------------------------+-----------------------------------+
| end_at              | Timestamp at which query ended                                | 1463529600000                     | 
+---------------------+---------------------------------------------------------------+-----------------------------------+
| keywords            | Comma-separated, case insensitive keywords to match in query  | "drinking"                        | 
+---------------------+---------------------------------------------------------------+-----------------------------------+
| emails              | Comma-separated emails of users to search. Blank returns all  | ``frank.yu@ha.ca, mary.li@hi.co`` |  
+---------------------+---------------------------------------------------------------+-----------------------------------+

Compliance query results stored in ``posts.csv`` file
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

``posts.csv`` contains the following information about the compliance query results, one search result per row:

+---------------------+---------------------------------------------------------------+-------------------------------+
| Field               | Description                                                   | Example                       |
+=====================+===============================================================+===============================+
| TeamName            | URL name of team                                              | contosi                       |
+---------------------+---------------------------------------------------------------+-------------------------------+
| TeamDisplayName     | Display name of team                                          | Contosi Corporation           | 
+---------------------+---------------------------------------------------------------+-------------------------------+
| ChannelDisplayName  | Display name of channel where keyword was found               | Community Heartbeat           | 
+---------------------+---------------------------------------------------------------+-------------------------------+
| ChannelName         | URL name of channel                                           | community-heartbeat           | 
+---------------------+---------------------------------------------------------------+-------------------------------+
| UserUsername        | Username of user posting the message containing keyword       | frank.yu                      |
+---------------------+---------------------------------------------------------------+-------------------------------+
| UserEmail           | Email of user posting the message containing keyword          | "frank.yu@contosi.com"        | 
+---------------------+---------------------------------------------------------------+-------------------------------+
| UserNickname        | Nickname of user posting the message containing keyword       | fan du                        | 
+---------------------+---------------------------------------------------------------+-------------------------------+
| UserType            | Type of user posting the message ("user" or "bot")            | user                          |
+---------------------+---------------------------------------------------------------+-------------------------------+
| PostId              | Unique ID of message post containing keyword                  | xt9anyx6x3fx9y84aehgakdpze    | 
+---------------------+---------------------------------------------------------------+-------------------------------+
| PostCreateAt        | Timestamp at which post was created                           | 2016-03-02T16:01:59Z          | 
+---------------------+---------------------------------------------------------------+-------------------------------+
| PostDeletedAt       | Timestamp at which post was deleted (if applicable)           | 2016-03-02T16:01:59Z          | 
+---------------------+---------------------------------------------------------------+-------------------------------+
| PostUpdatedAt       | Timestamp at which post was last edited (if applicable)       | 2016-03-02T16:01:59Z          | 
+---------------------+---------------------------------------------------------------+-------------------------------+
| PostParentId        | Unique ID of parent post if post is a comment                 | xt9anyx6x3fx9y84aehgakdpze    | 
+---------------------+---------------------------------------------------------------+-------------------------------+
| PostOriginalId      | Unique ID of post if deleted or edited                        | xt9anyx6x3fx9y84aehgakdpze    | 
+---------------------+---------------------------------------------------------------+-------------------------------+
| PostMessage         | Message containing keyword                                    | Drinking from the fire hose   | 
+---------------------+---------------------------------------------------------------+-------------------------------+
| PostFilenames       | Comma separated list of filesnames attached to post           | ["/f../ho.png","/f../hi.png"] |
+---------------------+---------------------------------------------------------------+-------------------------------+

Global Relay support
--------------------

Mattermost daily compliance reports are compatible with Global Relay compliance solutions through the conversion of Mattermost ``.CSV`` exports into Global Relay ``EML`` files.

- This conversion can be done by in-house developers who have previously written scripts to convert other communication systems into Global Relay format based on your organization's specific needs.
- You can also contact your Global Relay account manager about a services project to establish this conversion.

We recommend using the new :doc:`Compliance Export feature <compliance-export>` for Global Relay exports.

source/comply/compliance-export.rst METASEP
Compliance export
=================

.. include:: ../_static/badges/ent-cloud-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Mattermost Enterprise Edition E20*

This feature enables compliance exports to be produced from the System Console, containing all messages including:

- Messages sent in direct message channels
- File uploads
- Posts from plugins
- Posts from bots/webhooks

The exports include information on channel member history at the time the message was posted.

From Mattermost v5.18 and in Mattermost Cloud, entries for deleted messages and files are included in CSV and Actiance reports. The deleted content is included in the compliance export. Global Relay reports include file deletion entries but message deletion entries are excluded.

By default, Mattermost stores all message history providing an unlimited search history to admins and end users. In Mattermost Enterprise, you may set a `custom data retention policy <https://docs.mattermost.com/comply/data-retention-policy.html>`__ for how long messages and file uploads are kept in Mattermost channels and direct messages.

Enterprise deployments with a requirement to archive history beyond the data retention period can enable this add-on to export compliance reports to third-party systems. Integration with Actiance Vantage and Global Relay are currently supported, with integrations with other systems in the roadmap.

.. note::
  
   This feature replaces legacy Compliance Reporting Oversight functionality. We recommend migrating to the new system. For a sample CSV output of the new compliance export system, `download a CSV export file here <https://github.com/mattermost/docs/blob/master/source/samples/csv_export.zip>`__.
   
Set up guide
------------

Use the following guides to configure exports for CSV, Actiance XML, or Global Relay EML. \

For self-hosted deployments, compliance exports are written to the ``exports`` subdirectory of the configured `Local Storage directory <https://docs.mattermost.com/configure/configuration-settings.html>`__ in the chosen format. If you've configured Mattermost to use S3 storage, the exports are written to the ``exports`` directory in the Mattermost bucket.

.. note::
   
   The compliance exports do not contain posts sent before the feature was enabled. For self-hosted deployments, you can export past history via the ``export`` :doc:`command line tool <../manage/command-line-tools>`. However, posts made prior to upgrading to Mattermost v4.5 will have less accurate channel member history information.

CSV
~~~~

1. Go to **System Console > Compliance > Compliance Export**.
2. Set **Enable Compliance Exports** to **true**.
3. Set the **Compliance Export time**. This is the start time of the daily scheduled compliance export job and must be a 24-hour time stamp in the form HH:MM. Choose a time when fewer people are using your system.
4. Set the export file format to **CSV**.
5. Select **Save**.

The daily compliance export job creates a zip file with a unique job identifier of all messages posted in the last 24 hours. You can unzip the file to easily transform the default ``.csv`` format into a desired format for your third-party archive system.

For a sample CSV output, `download a CSV export file here <https://github.com/mattermost/docs/blob/master/source/samples/csv_export.zip>`__.

Actiance XML
~~~~~~~~~~~~

1. Go to **System Console > Compliance > Compliance Export**.
2. Set **Enable Compliance Exports** to **true**.  
3. Set the **Compliance Export time**. This is the start time of the daily scheduled compliance export job and must be a 24-hour time stamp in the form HH:MM. Choose a time when fewer people are using your system.
4. Set the export file format to **Actiance XML**.
5. Select **Save**.

The daily compliance export job creates a ``.zip`` file with a unique job identifier of all messages posted in the last 24 hours. Once you've selected Actiance XML as your file format, you can set up an integration with Actiance Vantage archive system. For more information, see `their homepage <https://www.actianceworks.com/Vantage.asp>`__. For a sample Actiance output, `download an Actiance XML export file here <https://github.com/mattermost/docs/blob/master/source/samples/actiance_export.xml>`__.

.. note::
  
   In Actiance XML exports, channel type is prepended to the channel names.

Global Relay EML
~~~~~~~~~~~~~~~~

1. Go to **System Console > Compliance > Compliance Export**.
2. Set **Enable Compliance Exports** to **true**.
3. Set the **Compliance Export time**. This is the start time of the daily scheduled compliance export job and must be a 24-hour time stamp in the form HH:MM. Choose a time when fewer people are using your system.
4. Set the export file format to **GlobalRelay EML**.
5. Select `A9/Type 9` or `A10/Type 10` for the **Global Relay Customer Account**. This is the type of Global Relay customer account your organization has.
6. Set the **Global Relay SMTP username**, **Global Relay SMTP password**, and **Global Relay SMTP email address**, provided by Global Relay.
7. Select **Save**.

Once you've selected Global Relay EML as your file format, you can set up an integration with Global Relay archive system. For more information, see `Global Relay Archive <https://www.globalrelay.com/gr-services/archive>`__.

.. note::
  
   Messages larger than 250 MB will have their attachments removed because they are too large to send to Global Relay. An error is added to the server logs with id ``global_relay_attachments_removed``. It includes the post ID the attachments were removed from, as well as the attachment IDs. A `ticket is queued to better handle large messages <https://mattermost.atlassian.net/browse/MM-10038>`__.

For more information on Global Relay archive system, see `their homepage <https://www.globalrelay.com/>`__.

Frequently Asked Questions (FAQ)
--------------------------------

How do I export past history?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Run the ``export`` :doc:`command line tool <../manage/command-line-tools>`. You can specify an ``exportFrom`` option to export data from a specified timestamp. All posts that were made after this timestamp will be exported.

What happens if I export data manually?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

If the compliance export job is run automatically, manually via the System Console, or manually via the CLI (without the ``--exportFrom`` option), it exports all posts that were made since the last post that the previous execution of the job exported. If this is the first time that the job has ever run, all posts that were made since the feature was enabled will be exported.

If the ``--exportFrom`` option is specified with the CLI command, all posts that have been made since the supplied timestamp will be exported.

When run manually via the System Console, ``.csv`` and Actiance XML files are written to the ``exports`` subdirectory of the configured `Local Storage Directory <https://docs.mattermost.com/configure/configuration-settings.html#local-storage-directory>`__.  Files will be written to a folder with names based on an epoch time range. Global Relay EML export format files will be mailed to the configured email address when run manually.

Is there a maximum row limit for CSV files?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

No. From Mattermost Server v5.36, there's no limit to the number of rows within Compliance Monitoring CSV files.

How do I know if a compliance export job fails?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost provides the status of each compliance export job in **System Console > Compliance > Compliance Export**. Here, you can see if the job succeeded or failed, including the number of messages and files exported.

In addition, any failures are returned in the server logs for self-hosted deployments. The error log begins with the string ``Failed job`` and includes a ``job_id key/value`` pair. Compliance export job failures are identified with worker name ``MessageExportWorker``. You can optionally create a script that programmatically queries for such failures and notifies the appropriate system.

source/comply/audit-log.rst METASEP
Audit log v2 (experimental)
===========================

.. include:: ../_static/badges/ent-selfhosted.rst
  :start-after: :nosearch:

*Available in legacy Mattermost Enterprise Edition E20*

Audit log v2 is an experimental feature that provides System Admins with a comprehensive listing of events for more in-depth analysis. Additionally, the new audit log provides more control over where the logs are generated and stored. 

The advanced logging capabilities of the Audit Log V2 allow any combination of console, local file, syslog, and TCP socket targets, and can send log records to multiple targets. These targets have been chosen as they support the vast majority of log aggregators, and other log analysis tools, without needing additional software installed.

System Admins can define multiple log targets to:

- Mirror log output to files and log aggregators for redundancy.
- Log certain entries to specific destinations. For example, all errors could be routed to a specific destination for review.

All access to the REST API or CLI is audited. When using Advanced Logging for auditing, System Admins can capture the following auditing in the target configuration in addition to discrete log levels:

.. code-block:: none

   "Levels": [
      {"ID": 100, "Name": "audit-api"},
      {"ID": 101, "Name": "audit-content"},
      {"ID": 102, "Name": "audit-permissions"},
      {"ID": 103, "Name": "audit-cli"},
   ],

where:

- ``audit-api``: Enables output of REST API calls.
- ``audit-content``: Enables output of API calls that generate content (e.g. ``create post``, ``create reaction``).
- ``audit-permissions``: Enables output of all permissions failures.
- ``audit-cli``: Enables output of legacy CLI calls.

All levels can be viewed at ``mattermost-server/shared/mlog/levels.go``.

.. Note::
  - Logs are recorded asynchronously to reduce latency to the caller. 
  - In version 5.x advanced logging supports hot-reloading of logger configuration. In versions 6.0 and greater, hot-reloading of configuration as been removed. 

Configure audit log in Mattermost
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Configuring the Mattermost server to use the new audit log requires editing the ``config.json`` file directly. The audit settings output audit records to allow any combination of local file, syslog, and TCP socket targets.

File target supports rotation and compression triggered by size and/or duration. Syslog target supports local and remote syslog servers, with or without TLS transport. TCP socket target can be configured with an IP address or domain name, port, and optional TLS certificate.

.. note::
   Mattermost v6.0 introduced a change to the logging engine library which changes how the logger is configured in Mattermost 5.x versions. Please refer to :download:`Advanced Logging sample file <../samples/sample-logger-config.json>` for a sample configuration file supported from v6.0. 

   
**Accessing configuration options for audit log**

Open ``config.json`` and navigate to the audit settings under ``ExperimentalAuditSettings``. Within the setting ``AdvancedLoggingConfig`` you are able to specifiy a filespec to another config file, a database DSN, or JSON. 

The logging configuration JSON is an object (unordered collection) containing names and log target values. Each log target contains a type, options specific to the target type, format, and levels.

The example below specifies one log target that outputs to the console using a plain text format with pipes delimiting fields. The standard log levels are listed, with only `error` and lower outputting a stack trace. The `error` level will output in red for log targets and formatters that support color output.

.. code-block:: json

  {
      "sample-console": {
        "type": "console",
        "options": {
          "out": "stdout"
        },
        "format": "plain",
        "format_options": {
          "delim": " | "
        },
        "levels": [
          {"id": 5, "name": "debug"},
          {"id": 4, "name": "info"},
          {"id": 3, "name": "warn"},
          {"id": 2, "name": "error", "stacktrace": true, "color": 31},
          {"id": 1, "name": "fatal", "stacktrace": true},
          {"id": 0, "name": "panic", "stacktrace": true}
        ],
        "maxqueuesize": 1000
      }
    }
    
.. note::
    Filenames for ``AdvancedLoggingConfig`` can contain an absolute filename, a relative filename, or embedded JSON.

Sample configuration file
~~~~~~~~~~~~~~~~~~~~~~~~~~

Download the :download:`advanced logging options sample JSON ZIP file <../samples/advanced-logging-options-sample-json.zip>` for a sample configuration file. Options outlined in ``Log.Settings.Options.txt`` file within the downloaded ZIP file are described in the following table.

+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
|               |                                                                                                                                                        |             |
| **Key**       | **Definition**                                                                                                                                         | **Type**    |
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
|               |                                                                                                                                                        |             |
| **Levels**    |                                                                                                                                                        |             |
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
|               |                                                                                                                                                        |             |
| ID            | Unique log level identifier. Must be registered in ``mattermost/mattermost-server/shared/mlog/levels.go``.                                             | int         |
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
|               |                                                                                                                                                        |             |
| Name          | Human-readable name for the log level identifier.                                                                                                      | string      |
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
|               |                                                                                                                                                        |             |
| Stacktrace    | Set to ``true`` to generate a stacktrace. Set to ``false`` to prevent a stacktrace from being generated.                                               | bool        |
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
|               |                                                                                                                                                        |             |
| **Targets**   |                                                                                                                                                        |             |
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
|               |                                                                                                                                                        |             |
| Type          | Can be one of: ``console``, ``file``, ``syslog``, or ``tcp``.                                                                                          | string      |
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
|               |                                                                                                                                                        |             |
| Format        | Can be either ``json`` or ``plain``.                                                                                                                   | string      |
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
|               |                                                                                                                                                        |             |
| Levels        | Array of log levels.                                                                                                                                   | []          |
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
|               |                                                                                                                                                        |             |
| Options       | Map of options specific to the target type.                                                                                                            | {}          |
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
|               |                                                                                                                                                        |             |
| MaxQueueSize  | The number of audit records that can be queued/buffered at any point in time when writing to syslog. Default is 1000.                                  | int         |
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
|               |                                                                                                                                                        |             |
| **Console**   |                                                                                                                                                        |             |
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
|               |                                                                                                                                                        |             |
| Out           | Can be either ``stdout`` or ``stderr``.                                                                                                                | string      |
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
|               |                                                                                                                                                        |             |
| **File**      |                                                                                                                                                        |             |
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
|               |                                                                                                                                                        |             |
| Filename      | Path and filename for logs.                                                                                                                            | string      |
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
|               |                                                                                                                                                        |             |
| MaxAgeDays    | Number of days until a rotation is triggered. Set to ``0`` to not rotate based on age.                                                                 | int         |
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
|               |                                                                                                                                                        |             |
| MaxBackups    | Maximum number of rotated files to keep where the oldest are deleted. Set to ``0`` to discard rotated files.                                           | int         |
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
|               |                                                                                                                                                        |             |
| MaxSizeMB     | Maximum file size before a rotation is triggered. Set to ``0`` to prevent rotation based on file size.                                                 | int         |
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
|               |                                                                                                                                                        |             |
| Compress      | Set to ``true`` to compress files after rotation. Set to ``false`` to not compress files after rotation.                                               | bool        |
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
|               |                                                                                                                                                        |             |
| **SysLog**    |                                                                                                                                                        |             |
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
|               |                                                                                                                                                        |             |
| IP            | IP address or domain of the syslog server.                                                                                                             | string      |
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
|               |                                                                                                                                                        |             |
| Port          | Listening port of syslog server.                                                                                                                       | int         |
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
|               |                                                                                                                                                        |             |
| Tag           | Typically the program name, machine name, or node name.                                                                                                | string      |
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
|               |                                                                                                                                                        |             |
| TLS           | Set to ``true`` to connect via TLS. Set to ``false`` to prevent connecting via TLS.                                                                    | bool        |
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
|               |                                                                                                                                                        |             |
| Cert          | For TLS connections where TLS is set to ``true``, the filename of client certificate or base64-encoded certificate.                                    | string      |
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
|               |                                                                                                                                                        |             |
| Insecure      | Used for testing purposes only. Set to ``true`` to prevent a certificate check from being performed. Set to ``false`` to perform a certificate check.  | bool        |
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
|               |                                                                                                                                                        |             |
| **TCP**       |                                                                                                                                                        |             |
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
|               |                                                                                                                                                        |             |
| IP            | IP address or domain of the socket server.                                                                                                             | string      |
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
|               |                                                                                                                                                        |             |
| Port          | Listening port of the socket server.                                                                                                                   | int         |
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
|               |                                                                                                                                                        |             |
| TLS           | Set to ``true`` to connect via TLS. Set to ``false`` to prevent connecting via TLS.                                                                    | bool        |
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
|               |                                                                                                                                                        |             |
| Cert          | For TLS connections where TLS is set to ``true``, the filename of client certificate or base64-encoded certificate.                                    | string      |
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
|               |                                                                                                                                                        |             |
| Insecure      | Used for testing purposes only. Set to ``true`` to prevent a certificate check from being performed. Set to ``false`` to perform a certificate check.  | bool        |
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+

.. note::

    Filenames for ``AdvancedLoggingConfig`` can contain an absolute filename, a relative filename, or embedded JSON.

Log target types
~~~~~~~~~~~~~~~~

Log target types include Console, Syslog, File, or TCP. 

**Console configuration options:**

.. csv-table::
    :header: "Key", "Type", "Default", "Description"
       
       "out", "string", " ", "One of `stdout` or `stderr`. "

**Syslog configuration options:**

.. csv-table::
    :header: "Key", "Type", "Default", "Description"
       
       "host", "string", " ", "IP or domain name of server to receive log records."
       "port", "number", "", "Port number for server receiving log records."
       "tls", "bool", "false", "When true, a TLS connection will be created."
       "cert", "string", "  ", "Path to a cert file (.pem) to be used when establishing a TLS connection."
       "insecure", "bool", "false", "When true, Boards will accept any certificate presented by the server and any host name in that certificate. Should be used only in testing environments."
       "tag", "string", " ", "Syslog tag field."


**File configuration options:**

.. csv-table::
    :header: "Key", "Type", "Default", "Description"

       "filename", "string", "  ", "Full path to output file."
       "max_size", "number", "100", "Maximum size in megabytes the log file can grow before it gets rotated."
       "max_age", "number", "0", "Maximum number of days to retain old log files based on the timestamp encoded in their filename. 0 means do not remove old log files based on age."
       "max_backups", "number", "0", "Maximum number of old log files to retain.  0 means retain all old log files (though max_age may still cause them to get deleted.)"
       "compress", "bool", "false", "When true, the rotated log files will be compressed using gzip."

    
**TCP configuration options:** 

.. csv-table::
    :header: "Key", "Type", "Default", "Description"
       
       "host", "string", "  ", "IP or domain name of server to receive log records."
       "port", "number", " ", "Port number for server receiving log records."
       "tls", "bool", "false", "When true, a TLS connection will be created."
       "cert", "string", "  ", "Path to a cert file (.pem) to be used when establishing a TLS connection."
       "insecure", "bool", "false", "When true, any certificate will be accepted and any host name in that certificate. Should be used only in testing environments."

    
To temporarily disable a log target its type can be set to "none".

Log formatters
~~~~~~~~~~~~~~~

Mattermost currently supports three log formats: plain, JSON, and `GELF <https://docs.graylog.org/en/4.0/pages/gelf.html>`__.

**Plain configuration options:**

.. csv-table::
    :header: "Key", "Type", "Default", "Description"
 
       "disable_timestamp", "bool", "alse", "Disables output of the timestamp."
       "disable_level", "bool", "false", "Disables output of the level name."
       "disable_msg", "bool", "false", "Disables output of the message text."
       "disable_fields", "bool", "false", "Disables output of all fields."
       "disable_stacktrace", "bool", "false", "Disables output of stack traces."
       "delim", "string", "single space", "Delimiter placed between fields."
       "min_level_len", "number", "0", "Minimum level name length. If the level name is less than the minimum it will be padded with spaces."
       "min_msg_len", "number", "0", "Minimum msg length. If the msg text is less than the minimum it will be padded with spaces."
       "timestamp_format", "string", "2006-01-02 15:04:05.000 Z07:00", "Format for timestamps. See `format <https://golang.org/pkg/time/#Time.Format>`_ for format details."
       "line_end", "string", "\n ", "Alternative end of line character(s)."
       "enable_color", "bool", "false", "Enables color for targets that support color output."

**JSON configuration options:**

.. csv-table::
    :header: "Key", "Type", "Default", "Description"
 
       "disable_timestamp", "bool", "false", "Disables output of the timestamp."
       "disable_level", "bool", "false", "Disables output of the level name."
       "disable_msg", "bool", "false", "Disables output of the message text."
       "disable_fields", "bool", "false", "Disables output of all fields."
       "disable_stacktrace", "bool", "false", "Disables output of stack traces."
       "timestamp_format", "string", "2006-01-02 15:04:05.000 Z07:00", "Format for timestamps. See `format <https://golang.org/pkg/time/#Time.Format>`_ for format details."

 
**GELF configuration options:**

.. csv-table::
    :header: "Key", "Type", "Default", "Description"
  
       "hostname", "string", "string", "Provides a custom hostname to be output in log records, otherwise hostname is taken from the operating system."

Log levels 
~~~~~~~~~~~

**Level configuration options:**

.. csv-table::
    :header: "Key", "Type", "Default", "Description"
    
       "id", "number", " ", "Unique id for the log level."
       "name", "string"," ", "Name to be output."
       "stacktrace", "bool", "false", "When true, a stack trace is output."
       "color", "number", " ", "ANSI color code to output parts of the log record. See color chart below."

**Colors (ANSI)**

.. csv-table::
    :header: "Name", "Value"
       
       "black", "30"
       "red", "31"
       "green", "32"
       "yellow", "33"
       "blue", "34"
       "magenta", "35"
       "cyan", "36"
       "white", "37"


Data model
~~~~~~~~~~~

A single audit record is emitted for each event (``add``, ``delete``, ``login``, ``...``). Multiple auditable events may be emitted for a single API call.

.. csv-table::
    :header: "Name", "Type", "Description"

    "ID", "string", "audit record ID."
    "CreateAt", "int64", "timestamp of record creation, UTC."
    "Level", "string", "e.g. ``audit-rest``, ``audit-app``, ``audit-model``"
    "APIPath", "string", "rest endpoint"
    "Event", "string", "e.g. ``add``, ``delete``, ``login``, ``...``"
    "Status", "string", "e.g. ``attempt``, ``success``, ``fail``, ``...``"
    "UserId", "string", "ID of user calling the API"
    "SessionId", "string", "ID of session used to call the API"
    "Client", "string", "e.g. webapp, mmctl, user-agent"
    "IPAddress", "string", "IP address of client"
    "Meta", "map[string]interface{}", "API-specific info (e.g. user id being deleted)"

Log storage
~~~~~~~~~~~

Audit records are stored separately from general logging. The general log storage location is configurable via ``LogSettings`` in the ``config.json`` file.

During short spans of inability to write to targets, the audit records buffer in memory with a cap. Based on typical audit record volumes it could take many minutes to fill the buffer. After that, the records are dropped and the record drop event is logged.

When using remote syslog, the current best practice is to also write to local file so no records are lost. Note that this does not automatically take records from local file and send it to syslog when syslog becomes available again.

Configure audit log in Boards
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The `Boards configuration file <https://github.com/mattermost/focalboard/blob/main/config.json>`_ ``config.json`` is used to configure logging.

``logging_cfg_file`` is used to specify the path to a file containing the logging configuration in JSON format.

``logging_cfg_json`` is used to provide logging configuration directly as embedded JSON. Typically this is overridden using the corresponding environment variable ``FOCALBOARD_LOGGING_CFG_JSON``.

Both configuration methods can be used, but care must be taken to avoid multiple log targets writing to the same file.

The logging configuration JSON is an object (unordered collection) containing names and log target values. Each log target contains a type, options specific to the type, format, and levels.

Boards uses discrete log levels, meaning each level to be output must be listed. This allows for log targets to output specific log levels, and custom log levels to be created. See ``server/mlog/levels.go`` for a list of available log levels. 


Planned enhancements to the audit log
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

To ensure audit logs cannot be unknowingly corrupted or tampered with, make it possible to configure the logging engine to sign log files for specific targets. When an audit store cannot be made secure, audit logs could be stored in multiple places (e.g. file and database) so they can be reconciled if needed.

Planned enhancements to logging in general
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

See the `logging enhancements <https://docs.google.com/document/d/1DSE-SKfqwcpUIXKUokWFIh_uAp3nzw-5UkKBUt90ZqE/edit?usp=sharing>`_ proposal for more details.

source/channels/syntax-highlighting.rst METASEP
:nosearch:

.. raw:: html

  <table width="100%" border="1" cellpadding="5px" style="margin-bottom:20px;">
    <tr class="row-odd">
      <th class="head">Language</th>
      <th class="head">Aliases</th>
    </tr>
    <tr class="row-odd">
      <td valign="middle">ActionScript</td>
      <td valign="middle">actionscript, as, as3</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">AppleScript</td>
      <td valign="middle">applescript</td>
    </tr>  
    <tr class="row-odd">
      <td valign="middle">Bash</td>
      <td valign="middle">bash, sh</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">Clojure</td>
      <td valign="middle">clojure</td>
    </tr>  
    <tr class="row-odd">
      <td valign="middle">CoffeeScript</td>
      <td valign="middle">coffescript, coffee, coffee-script</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">C/C++</td>
      <td valign="middle">cpp, c++, c</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">C#</td>
      <td valign="middle">cs, c#, csharp</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">CSS</td>
      <td valign="middle">css</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">D</td>
      <td valign="middle">d, dlang</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">Dart</td>
      <td valign="middle">dart</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">Delphi</td>
      <td valign="middle">delphi</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">Diff</td>
      <td valign="middle">diff, patch, udiff</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">Django</td>
      <td valign="middle">django</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">Dockerfile</td>
      <td valign="middle">dockerfile, docker</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">Elixir</td>
      <td valign="middle">elixir, ex, exs</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">Erlang</td>
      <td valign="middle">erlang, erl</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">Fortran</td>
      <td valign="middle">fortran</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">F#</td>
      <td valign="middle">fsharp</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">G-Code</td>
      <td valign="middle">gcode</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">Go</td>
      <td valign="middle">go, golang</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">Groovy</td>
      <td valign="middle">groovy</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">Handlebars</td>
      <td valign="middle">handlebars, hbs, mustache</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">Haskell</td>
      <td valign="middle">haskell, hs</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">Haxe</td>
      <td valign="middle">haxe</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">Java</td>
      <td valign="middle">java</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">JavaScript</td>
      <td valign="middle">javascript, js</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">JSON</td>
      <td valign="middle">json</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">Julia</td>
      <td valign="middle">julia, jl</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">Kotlin</td>
      <td valign="middle">kotlin</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">LaTeX</td>
      <td valign="middle">latex, tex</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">Less</td>
      <td valign="middle">less</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">Lisp</td>
      <td valign="middle">lisp</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">Lua</td>
      <td valign="middle">lua</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">Makefile</td>
      <td valign="middle">makefile, make, mf, gnumake, bsdmake</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">Markdown</td>
      <td valign="middle">markdown, md, mkd</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">Matlab</td>
      <td valign="middle">matlab, m</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">Objective C</td>
      <td valign="middle">objectivec, objective_c, objc</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">OCaml</td>
      <td valign="middle">ocaml</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">Perl</td>
      <td valign="middle">perl, pl</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">PostgreSQL</td>
      <td valign="middle">pgsql, postgres, postgresql</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">PHP</td>
      <td valign="middle">php, php3, php4, php5</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">PowerShell</td>
      <td valign="middle">powershell, posh</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">Puppet</td>
      <td valign="middle">puppet, pp</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">Python</td>
      <td valign="middle">python, py</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">R</td>
      <td valign="middle">r, s</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">Ruby</td>
      <td valign="middle">ruby, rb</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">Rust</td>
      <td valign="middle">rust, rs</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">Scala</td>
      <td valign="middle">scala</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">Scheme</td>
      <td valign="middle">scheme</td>
    <tr class="row-odd">
      <td valign="middle">SCSS</td>
      <td valign="middle">scss</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">Smalltalk</td>
      <td valign="middle">smalltalk, st, squeak</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">SQL</td>
      <td valign="middle">sql</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">Stylus</td>
      <td valign="middle">stylus, styl</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">Swift</td>
      <td valign="middle">swift</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">Text</td>
      <td valign="middle">text</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">TypeScript</td>
      <td valign="middle">typescript, ts, tsx</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">VB.Net</td>
      <td valign="middle">vbnet, vb, visualbasic</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">VBScript</td>
      <td valign="middle">vbscript</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">Verilog</td>
      <td valign="middle">verilog</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">VHDL</td>
      <td valign="middle">vhdl</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">HTML, XML</td>
      <td valign="middle">html, xml</td>
    </tr>
    <tr class="row-odd">
      <td valign="middle">YAML</td>
      <td valign="middle">yaml, yml</td>
    </tr>
  </table>
source/channels/share-links.rst METASEP
Share links to messages
=======================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

.. |copy-link-icon| image:: ../images/link-variant_F0339.svg
  :alt: Use the Copy Link icon to copy the public URL link for an image in a message.

.. |more-icon| image:: ../images/dots-horizontal_F01D8.svg
  :alt: Use the More icon to access additional message options.

To share links to messages in Mattermost, select the **More** |more-icon| icon next to a message, then select **Copy Link**. Paste the link into a message to share the image link with others. Sharing links to messages generates a preview of the message.

.. image:: ../images/permalink-previews.png
   :alt: Mattermost generates previews of links shared in Channels.

.. tip::
  
  You can also hover over an image and select the |copy-link-icon| icon in the top right corner. 

Previews respect channel membership permissions, so they’re only visible to users who have access to the original message. If the link is to a message in a public channel, any member of the team can see the message preview. If the link is to a message in a private channel or direct message, only members in that channel can see the message preview.

.. tip::

    The timestamp next to the username of any message also functions as a permanent link to that conversation.
source/channels/share-files-in-messages.rst METASEP
Share files in messages
=======================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

.. |attachment-icon| image:: ../images/attachment-icon.png
  :alt: Use the Attachment icon to share files with messages.

.. |download-icon| image:: ../images/download-outline_F0B8F.svg
  :alt: Use the Download icon to download an attached file to your local system.

With file attachments, you can share additional information that helps your team to visually understand your ideas. Sharing videos, voice recordings, screenshots, and photos can make your messages more effective and clear.

You can share files with other Mattermost users or entire channels by:

- dragging and dropping files into Channels.
- selecting the **Attachment** |attachment-icon| icon in the message input box.
- pasting from the clipboard.

Attachment limits and sizes
---------------------------

Up to 10 files can be attached per post. The default maximum file size is 100 MB, but this can be changed by the System Admin. See our `Configuration Settings <https://docs.mattermost.com/configure/configuration-settings.html#maximum-file-size>`__ product documentation for details.

Image files can be a maximum size of 7680 pixels x 4320 pixels, with a maximum image resolution of 33 MP (mega pixels) or 8K resolution, and a maximum raw image file size of approximately 253 MB. System Admins can customize the maximum image resolution size within the ``config.json`` file. See our `Configuration Settings <https://docs.mattermost.com/configure/configuration-settings.html#maximum-image-resolution>`__ product documentation for details.

Preview file attachments
------------------------

Mattermost has a built-in file previewer that you can use to:

-  Download files
-  Share public links
-  View media

Select the thumbnail of an attached file to open it in the file previewer.

View media
^^^^^^^^^^

The following media formats are supported on most browsers:

-  Images: BMP, GIF, JPG, JPEG, PNG, SVG
-  Video: MP4
-  Audio: MP3, M4A
-  Files: PDF, TXT

Other document previews (such as Word, Excel, or PPT) are not yet supported.

Share public links
------------------

Public links allow you to share message attachments with anyone outside your Mattermost workspace. To share an attachment, select the thumbnail of an attachment, then select **Get Public Link**.

.. tip::
  
  If **Get Public Link** is not visible in the file previewer, ask your System Admin to enable the feature from the System Console under **Site Configuration > Public Links**.

Download files
--------------

You can download an attached file by selecting the **Download** |download-icon| icon next to the file thumbnail.
source/channels/set-channel-preferences.rst METASEP
Set channel preferences
=======================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

For each channel you're a member of, you can set notification preferences as well as the channel's header, purpose, and name. See the documentation for details on :doc:`renaming channels </channels/rename-channels>` and :doc:`channel naming convention recommendations </channels/channel-naming-conventions>`.

.. image:: ../images/channel-preferences.png
    :alt: Select the channel name at the top of the screen to set preferences for each channel you belong to.

Channel notification preferences
--------------------------------

To manage channel notification preferences, select the channel name at the top of the screen to access channel-specific settings, then select **Notification Preferences**.

Mute channel
~~~~~~~~~~~~~

Muting turns off desktop, email, and push notifications for a channel, and the channel will only be marked as unread in the channel sidebar if you're mentioned. By default, all channels are unmuted.

To mute the current channel and disable notifications, select **Mute Channel** from the channel name at the top of the screen. 

Once a channel is muted:

- Email, desktop, and push notifications are disabled.
- A mute icon displays next to the channel name.
- The channel appears at reduced opacity in the channel sidebar, and the channel isn't marked as unread unless you're mentioned directly.

To unmute the channel, select the channel name again to access the drop-down menu, then select **Unmute Channel**.

.. tip::

  Quickly mute or unmute any channel any time by selecting **Mute Channel** or **Unmute Channel** from the channel name at the top of the screen, or by selecting **More Options** for a channel in the Channel Sidebar.

Ignore mentions for @channel, @here, and @all
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

By default, you'll receive mention notifications every time someone on your team `mentions an entire channel <https://docs.mattermost.com/channels/mention-people.html>`__ using ``@channel``, ``@all``, or ``@here``. 

To stop receiving mention notifications, enable the **Ignore mentions for @channel, @here and @all** option, then select **Save**. When enabled, mention notifications for channel-wide mentions are ignored, but the channel is marked as unread unless the channel is muted. 

Send desktop notifications
~~~~~~~~~~~~~~~~~~~~~~~~~~

By default, your `desktop notification preferences <https://docs.mattermost.com/channels/channels-settings.html#notifications>`__ configured in **Settings** apply to all channels. Desktop notifications are available on Edge, Firefox, Safari, Chrome, and `Mattermost desktop apps <https://mattermost.com/apps>`__.

To customize desktop notifications per channel, edit **Send desktop notifications**, choose one of the following options, then select **Save**:

+---------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **Notification option**   | **You'll receive...**                                                                                                                                                                                                                            |
+===========================+==================================================================================================================================================================================================================================================+
| **Global default (None)** | Desktop notifications based on your `Settings <https://docs.mattermost.com/channels/channels-settings.html>`__ configuration.                                                                                                                    |
+---------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **For all activity**      | Desktop notifications for every new message.                                                                                                                                                                                                     |
+---------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **Only for mentions**     | - Desktop notifications for @mentions only.                                                                                                                                                                                                      |
|                           | - When you've `enabled Collapsed Reply Threads <https://docs.mattermost.com/channels/channels-settings.html#collapsed-reply-threads>`__, receive reply thread notifications by enabling **Notify me about threads I'm following**.               |
+---------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **Never**                 | No desktop notifications.                                                                                                                                                                                                                        |
+---------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Send mobile push notifications
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost push notifications `must be enabled <https://docs.mattermost.com/configure/configuration-settings.html#enable-push-notifications>`__ by a System Admin. Once enabled, your `mobile push notification preferences <https://docs.mattermost.com/messaging/manage-channels-settings.html#mobile-push-notifications>`__ configured in **Settings** apply to all channels by default.

To customize mobile push notifications per channel, edit **Send mobile push notifications**, choose one of the following options, then select **Save**:

+------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **Notification option**      | **You'll receive...**                                                                                                                                                                                                                            |
+==============================+==================================================================================================================================================================================================================================================+
| **Global default (Mention)** | Mobile notifications based on your `Settings <https://docs.mattermost.com/channels/channels-settings.html>`__ configuration.                                                                                                                     |
+------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **For all activity**         | Mobile notifications for every new message.                                                                                                                                                                                                      |
+------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **Only for mentions**        | - Mobile notifications for @mentions only.                                                                                                                                                                                                       |
|                              | - When you've `enabled Collapsed Reply Threads <https://docs.mattermost.com/channels/channels-settings.html#collapsed-reply-threads>`__, receive reply thread notifications by enabling **Notify me about threads I'm following**.               |
+------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **Never**                    | No desktop notifications.                                                                                                                                                                                                                        |
+------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Channel header
--------------

A channel header refers to text that displays under a channel name at the top of the screen. A channel header can be up to 1024 characters in length and is often used to summarize the channel's focus or to provide links to frequently accessed documents, tools, or websites. 

Change the channel header by selecting **Edit Channel Header**. You can use Markdown to `format channel header text <https://docs.mattermost.com/messaging/formatting-text.html>`__ using the same Markdown for messages. Any channel member can change a channel header, unless the System Admin has `restricted permissions to do so <https://docs.mattermost.com/configure/configuration-settings.html#enable-public-channel-renaming-for>`__.

.. image:: ../images/channel-header.png
    :alt: Channel headers can include links to documents, tools, or websites.

Channel purpose
---------------

A channel purpose refers to text that displays when users select **View Info** for a channel. A channel purpose can be up to 250 characters in length and is often used to help users decide whether to join the channel. 

Change the channel purpose by selecting **Edit Channel Purpose**. Any channel member can change a channel purpose, unless the System Admin has `restricted permissions to do so using advanced permissions <https://docs.mattermost.com/onboard/advanced-permissions.html>`__.

.. image:: ../images/channel-purpose.png
    :alt: Channel purpose helps users decide if they want to join the channel based on its scope or focus.

Channel name
------------

A channel name must be at least two characters, and can be up to 64 characters in length. `Some unicode characters <https://www.w3.org/TR/unicode-xml/#Charlist>`_ aren't supported.

Change the channel name by selecting **Rename Channel**. Changing the name of the channel also changes the channel URL. Any channel member can change a channel name, unless the System Admin has `restricted permissions to do so using advanced permissions <https://docs.mattermost.com/onboard/advanced-permissions.html>`__.

source/channels/send-messages.rst METASEP
Send messages
=============

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

.. |gear-icon| image:: ../images/settings-outline_F08BB.svg
  :alt: Select the Gear icon to open the Settings dialog.

.. |more-icon| image:: ../images/dots-horizontal_F01D8.svg
  :alt: Select the More icon to access additional message actions.

Compose a message by typing into the text box at the bottom of Mattermost. Press :kbd:`Enter` on Windows or Linux, or :kbd:`↵` on Mac, to send the message. To create a new line without sending the message, press :kbd:`Shift` :kbd:`Enter` on Windows or Linux, or press :kbd:`⇧` :kbd:`↵` on Mac. 

`Mattermost Professional or Enterprise <https://mattermost.com/pricing>`__ customers can `edit or delete messages <#edit-or-delete-messages>`__ after sending them if the System Admin hasn't restricted the ability to do so using `advanced permissions <https://docs.mattermost.com/onboard/advanced-permissions.html>`__.

.. tip::
  
  - When you send messages in a channel, depending on the `channel actions configured <https://docs.mattermost.com/channels/create-channels.html>`__, specific words in the post can trigger a prompt to run a playbook. Access **Channel Actions** from the channel name drop-down menu in the center pane to see what automatic actions have been configured.
  - Using a RTL plugin, Mattermost can automatically detect and display messages written using right-to-left scripts, such as Arabic, Hebrew, or Persian. Your System Admin must install the `RTL Plugin <https://github.com/QueraTeam/mattermost-rtl>`__ to enable this functionality.

.. tabs::

  .. tab:: Mattermost v6.0 onwards

      If you prefer to press :kbd:`Enter` on Windows or Linux, or :kbd:`↵` on Mac to insert new lines, and press :kbd:`Ctrl` :kbd:`Enter` on Windows or Linux, or :kbd:`⌘` :kbd:`↵` on Mac to send messages instead, select the **gear** |gear-icon| icon to go to **Settings**, then select **Advanced > Send messages on CTRL+ENTER**.

  .. tab:: Mattermost v5.39 and earlier

      In Mattermost versions up to v5.39, you can configure Mattermost to press :kbd:`Enter` on Windows or Linux, or :kbd:`↵` on Mac to insert new lines, and press :kbd:`Ctrl` :kbd:`Enter` on Windows or Linux, or :kbd:`⌘` :kbd:`↵` on Mac to send messages instead. Select the three horizontal lines at the top of the channel sidebar (also known as a hamburger menu) to go to **Account Settings**, then select **Advanced > Send messages on CTRL+ENTER**.
  
Edit or delete messages
-----------------------

Select the **More** |more-icon| icon next to a message that you've sent.

.. image:: ../images/more-actions.png
   :alt: Select the More option to edit or delete a sent message.

Select **Edit** to edit your own messages. Editing a message won't trigger new @mention notifications, desktop notifications, or notification sounds.

Select **Delete** to delete your own messages. Select **Delete** again to confirm.

source/channels/search-for-messages.rst METASEP
Search for messages
===================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

.. |product-list| image:: ../images/products_E82F.svg
  :height: 24px
  :width: 24px
  :alt: Navigate between Channels, Playbooks, and Boards using the product menu icon.

Use the Mattermost search field to find messages, replies, and the contents of files shared across all channels you're a member of in your team's conversation history. File content search is available in Mattermost Server from v5.35 and in Mattermost Cloud, with mobile support coming soon.

.. image:: ../images/ui_search.png
   :alt: Use Search to find messages, replies, and the contents of files shared across channels.

You can also do more advanced search using `search modifiers <#search-modifiers>`__.

.. tabs::
  
  .. tab:: Mattermost v6.1 onwards

    From Mattermost v6.1, your search results include messages from all of your teams.

  .. tab:: Mattermost v6.0 and earlier

    In Mattermost versions up to v6.0, your search results include messages from your current team only.

Search for message contents 
---------------------------

Select the Search field, then type your search criteria. 

.. image:: ../images/search-messages.png

When message results display in the Search Results pane, select **Jump** to view the full message in context.

.. image:: ../images/jump-to-message.png

.. tip::
  Message results return first automatically if a message search isn't specified. In the Search Results pane, select **Messages** or **Files** to toggle between results.
  
Search for file contents
------------------------

Select the **Search** field, select **Files**, then type your search criteria. 

.. image:: ../images/search-files.png

File contents that match on file name, or contain matching text content within supported document types, are returned in the Search Results pane. Each search result includes file name, extension, and size details, as well as details about when and where the file was originally shared.

- For Mattermost Cloud workspaces, supported document file formats include PDF, PPTX, DOCX, ODT, HTML, and plain text documents. DOC, RTF, and PAGES file formats, as well as the contents of ZIP files, are not supported.
- For Mattermost self-hosted deployments, supported document file formats include PDF, PPTX, DOCX, ODT, HTML, and plain text documents. 

  - System Admins can extend file content search support for self-hosted deployments to include:
  
    - `files shared before upgrading to Mattermost Server v5.35 <https://docs.mattermost.com/manage/command-line-tools.html#mattermost-extract-documents-content>`__.
    - `DOC, RTF, and PAGES file formats <https://docs.mattermost.com/configure/configuration-settings.html#enable-document-search-by-content>`__.
    - `documents within ZIP files <https://docs.mattermost.com/configure/configuration-settings.html#enable-searching-content-of-documents-within-zip-files>`__.

To narrow search results further, in the Search Results pane, select the **File Type Filter** option, then select specific file types, such as documents, spreadsheets, or images.
  
.. image:: ../images/file-search-filter.png

.. tip::
  Select the **Channel Files** icon below the channel name to access files recently shared in that channel. 
  
  .. image:: ../images/channel-files-icon.png

Search modifiers
----------------

You can apply search modifiers to any search to reduce the number of results returned. Select a search modifier to add it to the Search field. Supported modifiers are described below.

.. image:: ../images/search-modifiers.png

``from:`` and ``in:``
~~~~~~~~~~~~~~~~~~~~~

- Use ``from:`` to find messages or files from specific users. 

  * For example, searching ``from:john.smith`` only returns content from your direct message history with John Smith.

- Use ``in:`` to find messages or files posted in specific public channels, private channels, direct messages, or group messages. You can specify channels by display name or channel ID. 
  
  * For example, searching ``Mattermost in:town-square`` only returns results in the Town Square public channel that contains the term ``Mattermost``, while searching ``Mattermost in:john.doe`` only returns results that contains the term ``Mattermost`` in your direct message history with John Smith.

``before:``, ``after:``, and ``on:``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- Use ``before:`` to find messages or files posted before a specified date.

  * For example, searching ``website before: 2018-09-01`` returns messages or files containing the term ``website`` posted prior to September 1, 2018.

- Use ``after:`` to find messages or files posted after a specified date.

  * For example, searching ``website after: 2018-08-01`` returns messages or files containing the term ``website`` posted after August 1, 2018.

- Use both ``before:`` and ``after:`` together to search in a specified date range.

  * For example, searching ``website before: 2018-09-01 after: 2018-08-01`` returns all messages or files containing the term ``website`` posted between August 1, 2018 and September 1, 2018.

- Use ``on:`` to find messages files posted on a specific date. Use the date picker to select a date, or type it in YYYY-MM-DD format.

  * For example, searching ``website on: 2018-09-01`` returns messages or files containing the term ``website`` posted on September 1, 2018.

.. image:: ../images/calendar2.png

Exclusions
~~~~~~~~~~

Use the hyphen ``-`` symbol to exclude terms from your search results. For example, searching ``test -release`` only returns results that include the term ``test`` and exclude the term ``release``.

This exclusion modifier can be used in combination with other modifiers to further refine search results. For example, searching ``test -release -in:release-discussion -from:eric`` returns all results with the term ``test``, excludes posts with the term ``release``, excludes posts made in the ``release-discussion`` channel, and excludes messages sent in direct messages by ``eric``.

Quotation marks
~~~~~~~~~~~~~~~

Use quotation marks ``" "`` to return search results for exact terms. For example, searching ``"Mattermost website"`` returns messages containing the exact phrase ``Mattermost website``, but doesn't return results containing ``Mattermost`` and ``website`` as separate terms.

Wildcards
~~~~~~~~~

Use the asterisk ``*`` symbol for wildcard searches that match within words. For example, searching ``rea*`` returns messages or files containing ``reach``, ``reason``, ``reality``, ``real``, and other words starting with ``rea``.

Hashtags
--------

Hashtags are searchable labels for messages. Anyone can create a hashtag in a message by using the pound sign ``#`` followed by alphanumeric or other unicode characters. Hashtag examples include: ``#bug``, ``#marketing``, ``#user_testing``, ``#per.iod``, ``#check-in``, ``#마케팅``.

Valid hashtags:

- Don't start with a number.
- Are at least three characters long, excluding the ``#``.
- Are made up of alphanumeric or other unicode characters.
- May contain dots, dashes, or underscores.

To search for messages containing hashtags, select a hashtag in an existing post, or type the hashtag (including the pound ``#`` symbol) into the search bar. 

.. note::
  
  Hashtags don't link to channels. If you have a channel named “Marketing”, selecting a ``#marketing`` hashtag does not take you to the Marketing channel. To link to public channels, use the tilde ``~`` symbol followed by the channel name. For example ``~marketing``.

Notes about all searches
------------------------

- Multiple-word searches return results that contain *all* of your search criteria.
- Search modifiers can help narrow down searches. See the `Search Modifiers <#search-modifiers>`__ section for details.
- You can search Archived channels as long as you're a member of that channel.

  - If you're unable to see messages or files in archived channels in your search results, ask your System Admin if **Allow users to view archived channels** has been disabled under **System Console > Site Configuration > Users and Teams**.
  - To remove archived channels from your search results, you can leave the Archived channels.
- Like many search engines, common words such as ``the``, ``which``, and ``are`` (known as "stop words"), as well as two-letter and one-letter search terms, are not shown in search results because they typically return too many results. See the `Technical notes about searching <#technical-notes-about-searching>`__ section below for details.
- IP addresses (e.g. ``10.100.200.101``) don't return results.

Technical notes about searching
-------------------------------

Searching Chinese, Korean, and Japanese
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- The best experience for searching in Chinese, Korean, and Japanese is to use MySQL 5.7.6 or later with special configuration. See the `Chinese, Japanese and Korean Search documentation <https://docs.mattermost.com/install/i18n.html>`__ for details.
- You can perform searches without this configuration by adding wildcards ``*`` to the end of search terms.

Differences between PostgreSQL and MySQL search
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

By default, Mattermost uses full text search support included in MySQL and PostgreSQL. These databases have slightly different search behavior. Select the **product menu** |product-list| then select **About Mattermost** to see which database you’re using.

For example, different databases have different “stop words” filtered out of search results. See `MySQL <https://dev.mysql.com/doc/refman/5.7/en/fulltext-stopwords.html>`__ or `PostgreSQL <https://www.postgresql.org/docs/10/textsearch-dictionaries.html#TEXTSEARCH-STOPWORDS>`__ database documentation for a full list.

Other database-specific differences include:

PostgreSQL:

- Email addresses don't return results.
- URLs don’t return results.
- Hashtags or recent mentions of usernames containing a dash don't return results.
- Terms containing a dash return incorrect results since dashes are ignored in the search engine.
- From Mattermost v7.1, search results respect the ``default_text_search_config`` value instead of being hardcoded to English. We recommend that Mattermost system admins review this value to ensure it's set correctly.

MySQL:

- Hashtags or recent mentions of usernames containing a dot don't return results.
- Avoid using underline ``_`` symbol to `perform a wildcard search <#wildcards>`__. Use the asterisk ``*`` symbol instead.
- Stop words that are excluded from search in MySQL include: ``"a", "about", "an", "are", "as", "at", "be", "by", "com", "de", "en", "for", "from", "how", "i", "in", "is", "it", "la", "of", "on", "or", "that", "the", "this", "to", "was", "what", "when", "where", "who", "will", "with", "und", "the", "www"``.

source/channels/save-pin-messages.rst METASEP
Save and pin messages
=====================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

You have two ways to flag a post to make it easy to find later: `saving messages <#save-messages>`__ and `pinning messages <#pin-messages>`__. 

- Saving a message saves it for only you. 
- Pinning a message flags it for an entire channel.

Save messages
--------------

Save messages for later follow up by selecting the **Save** |save-icon| icon next to a message. 

.. |save-icon| image:: ../images/save-icon.png
  :alt: Save icon.

.. image:: ../images/save-message.png
   :alt: Save messages for later follow up.

See your saved messages
~~~~~~~~~~~~~~~~~~~~~~~

To see all of your saved messages, select the **Bookmark** icon to the left of your avatar. The right-hand sidebar opens to show the list of saved messages.

Unsave messages
~~~~~~~~~~~~~~~

To remove an item from your **Saved Posts** list, select the **Save** icon next to message to clear it.

.. image:: ../images/remove-from-saved-posts.png

Pin messages
------------

All members of a channel can pin important or useful messages to that channel. The list of pinned messages is visible to all channel members. There is no limit to the number of pinned posts in a channel.

1. Mouse over the message that you want to pin. The [...] link appears.
2. Select the **More** option, then select **Pin to channel**.

.. image:: ../images/message-more.png
  :alt: When you hover over messages, you can access more message options from the More icon.

.. image:: ../images/pin-message-to-channel.png
  :alt: You can pin messages to make them easy to return to later.

Pinned messages are marked with the pinned icon. For example:

.. image:: ../images/pinned-example-channel.png
  :alt: An example of a pinned message in a channel marked with a pin icon.

See all pinned messages
~~~~~~~~~~~~~~~~~~~~~~~

To see all pinned messages in a channel, select the **Pined posts** icon in the channel header. 

.. image:: ../images/pinned-posts.png
  :alt: Open pinned messages in the right-hand sidebar.

The right-hand sidebar opens to show the list of pinned messages. For example:

.. image:: ../images/pinned-example-rhs.png
  :alt: Review the list of pinned messages.

Unpin messages
~~~~~~~~~~~~~~

1. Mouse over the message that you want to unpin. The [...] link appears.
2. Select the **More** icon, then select **Unpin from channel**

.. image:: ../images/message-more.png
  :alt: When you hover over messages, you can access more message options from the More icon.

.. image:: ../images/unpin-message-from-channel.png
  :alt: You can unpin messages from a channel when they're no longer needed or become outdated.
source/channels/run-slash-commands.rst METASEP
Run slash commands
==================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Slash commands enable you to perform operations in Mattermost by typing into the text input box. Enter a ``/`` followed by a command and some arguments to perform actions.

Built-in slash commands come with all Mattermost installations and custom slash commands are configurable to interact with external applications. See our `developer documentation <https://developers.mattermost.com/integrate/admin-guide/admin-slash-commands/#built-in-commands>`__ for details on built-in slash commands available in your Mattermost workspace. Then see our `developer documentation <https://developers.mattermost.com/integrate/admin-guide/admin-slash-commands/#custom-slash-command>`__ to learn more about configuring custom slash commands.
source/channels/reply-to-messages.rst METASEP
Reply to messages
=================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Reply to messages by selecting the **Reply** |reply-arrow| icon next to the message text. You can `edit and delete messages <https://docs.mattermost.com/channels/send-messages.html#edit-or-delete-messages>`__ after you've sent them.

.. |reply-arrow| image:: ../images/reply-outline_F0F20.svg
  :alt: Reply icon.

.. image:: ../images/reply-to-message.png
   :alt: Reply to Mattermost messages

Organize conversations into threads
-----------------------------------

You can also reply to a message by hovering over a message and selecting the **Reply** link to organize the conversation into a thread. Threaded conversations are easy to follow and allow multiple parallel conversations to occur at the same time without confusion. Replies are indented slightly in the center pane to indicate that they are child messages of a parent message.

Selecting the reply link opens a sidebar in the right-hand sidebar. To expand the right-hand sidebar to its full width, select the **Expand** icon with two arrows at the top of the sidebar.

.. image:: ../images/expand-sidebar.png
   :alt: Expand right-hand sidebar to its full width

To shrink the right-hand sidebar to its original width, select the same **Collapse** icon.

.. image:: ../images/collapse-sidebar.png
   :alt: Collapse the right-hand sidebar to its original width

.. note::
  
  Your System Admin may restrict Messaging actions, such as editing or deleting messages, by configuring `advanced permissions <https://docs.mattermost.com/onboard/advanced-permissions.html>`__, available in `Mattermost Enterprise and Professional subscription plans <https://mattermost.com/pricing>`__.

Work with Collapsed Reply Threads
---------------------------------

Collapsed Reply Threads is generally available in Mattermost Cloud and from self-hosted Mattermost v7.0, and is enabled by default for all new Mattermost deployments. Collapsed Reply Threads offer a new way to organize conversations within channels. See our `Organizing Conversations using Collapsed Reply Threads <https://docs.mattermost.com/channels#organize-conversations.html>`__ documentation to learn more.
source/channels/rename-channels.rst METASEP
Rename channels
===============

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Anyone can rename the channels they belong to, unless the System Admin has `restricted the permissions to do so using advanced permissions <https://docs.mattermost.com/onboard/advanced-permissions.html>`__.

In the desktop app, select the channel name at the top of the center pane to access the drop-down menu, then select **Rename Channel**. You'll be prompted for two values:

- **Channel display name:** This appears in the Mattermost user interface. 
- **Channel handle:** This is part of the channel URL. You can also change the channel handle when renaming a channel, but changing channel handles may break existing links.

For example, for the following channel, ``https://community.mattermost.com/core/channels/ux-design``, The channel display name would be ``UX Design``, and the channel handle would be ``ux-design``.

source/channels/react-to-messages.rst METASEP
React to messages using emojis
==============================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Emojis are small, digital images or icons used to communicate or express concepts such as emotions and physical gestures in your messages. React to messages with emoji by selecting the **Smile** |smile-icon| icon inside the Mattermost message input box to open the Emoji Picker. If the existing emojis available in Mattermost don't cover what you want to express, you can also `upload your own custom emoji <#upload-custom-emojis>`__.

.. |smile-icon| image:: ../images/smile-icon.png
  :alt: Smile icon.

.. image:: ../images/selectemoji.png
  :alt: The Mattermost Emoji Picker dialog.

.. tip::

    You can also react to messages by typing ``:`` followed by at least two characters of the word describing the emoji, which will open an emoji autocomplete. Descriptions include skin tone details for people-based emojis, where supported.

    .. image:: ../images/emojiautocomplete.png
        :alt: Emoji Autocomplete

Select recent emojis
--------------------

From Mattermost v6.1 and in Mattermost Cloud, react to messages quickly by selecting a recent emoji while hovering over a message. Recent emojis are sorted based on the number of times you've used the emoji. If your most recent reactions aren't visible, you can enable quick reactions by selecting **Settings > Display > Quick reactions on messages**.

.. image:: ../images/recent-emojis.png
  :alt: React to messages quickly by selecting one of your most recently used emojis.

Select default skin tone
-------------------------

Select the **Skin Tone** icon in the top right corner of the Emoji Picker to specify the skin tone you prefer to use for people-based emojis by default. You can select an alternate skin tone any time.

.. image:: ../images/emoji-skin-tone.png
  :alt: Select a default skin tone preference for people-based emojis.

Upload custom emojis
---------------------
  
Everyone in your Mattermost workspace can use the custom emojis you upload. From the Emoji Picker, select **Custom Emoji**. Small, square pictures work best when selecting an image to upload. The file can be any JPG, GIF, or PNG that's up to one MB in size.
  
1. Enter a name for your custom emoji. This is the name that shows up in the emoji autocomplete.
2. Choose **Select**, then select the image to use for the emoji. 
3. Select **Save**. Once saved, your emoji is added to the list of custom emoji.
  
.. image:: ../images/add_custom_emoji.png
  
.. note::

  If you can't see the **Custom Emoji** option, then your Mattermost System Admin may have restricted access to upload custom emoji. Contact your Mattermost System Admin for assistance.
  
To use your custom emoji in a message, select it from the Emoji Picker, or type ``:`` followed by your emoji name to bring it up in the emoji autocomplete. 
  
Remove custom emojis
--------------------
  
You can remove custom emojis that you uploaded to Mattermost.
  
1. Open the Emoji Picker.
2. Select **Custom Emoji**.
3. If required, use the Search Bar to find your custom emoji in the list.
4. Under **Actions** select **Delete**.
5. Choose **Delete** to confirm.
  
.. image:: ../images/delete_custom_emoji.png
   :alt: Remove custom emoji.

source/channels/organize-conversations.rst METASEP
Organize conversations using Collapsed Reply Threads
====================================================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

.. |more-actions-icon| image:: ../images/dots-horizontal_F01D8.svg
  :height: 24px
  :width: 24px
  :alt: Access additional message actions using the More Actions icon.

Threads are a key part of the messaging experience in Mattermost Channels. They're used to organize conversations and enable users to discuss topics without adding noise to channels or direct messages.

Collapsed Reply Threads offers an enhanced experience for users communicating in threads and replying to messages that includes a unified threads inbox to read all conversations in one view. Threads improve the ability to process channel content, find, follow, and resume conversations more easily, and keep threaded conversations focused.

.. image:: ../images/collapsed-reply-threads.gif
  :alt: Organize conversations using Collapsed Reply Threads.

Start or reply to threads
-------------------------

Replies are collapsed under the first message of a thread. To reply to a thread, select the **Reply** icon, or select the reply count if a thread already exists.

.. tip:: 
    
    - Select anywhere on a message in a channel in the center pane to view it, or reply to it on the right-hand side.
    - In channels, a dot next to the thread participants indicates there are unread replies. You'll only see unreads for threads you're following.

.. image:: ../images/crt-new-unread-threads.jpg
   :alt: A dot on threads in a channel indicates unread replies.

Follow threads and messages
---------------------------

You can follow particular messages and threads so that any reply activity triggers `notifications <https://docs.mattermost.com/channels/channels-settings.html#notifications>`__. Follow or unfollow any thread, at any time, by toggling the thread’s **Follow/Following** indicator, or from the **More Actions** |more-actions-icon| icon.

.. image:: ../images/crt-following-thread.png
   :alt: Follow threads to stay updated on replies to messages.

You'll automatically follow every thread you participate or are mentioned in. If you’re no longer interested in a or message thread, you can unfollow it to stop receiving notifications. Viewing a thread without responding to it doesn’t automatically follow that thread.

.. image:: ../images/crt-following-thread.jpg
   :alt: Follow, unfollow, and mark threads as unread from the More Actions icon.
   
.. tip::
  - Follow messages with no replies from the **More Actions** |more-actions-icon| icon to be notified if someone replies to the message later based on your notification preferences.
  - Use keyboard arrow keys to navigate threads in the **Threads** view.

View all threads
----------------

Select **Threads** at the top of the channel sidebar to see all your followed threads on the currently selected team. Threads with the most recent replies display at the top of the list. 

Select **Unreads** to filter your followed threads by only those with unread replies.

.. image:: ../images/crt-thread-view.jpg
  :alt: Select Threads in the channel sidebar to see all thread updates in your Threads View.

Enable Collapsed Reply Threads
------------------------------

See our `configuration settings <https://docs.mattermost.com/configure/configuration-settings.html#collapsed-reply-threads>`__ documentation for details on configuring the default availability of collapsed reply threads. From Mattermost v7.0, Collapsed Reply Threads are enabled by default for all new Mattermost deployments.

Depending on how your System Admin has configured **Collapsed Reply Threads** for your workspace, it may already be enabled for you, or you may be able to `enable this feature for your account <https://docs.mattermost.com/channels/channels-settings.html#collapsed-reply-threads>`__ by going to **Settings > Display > Collapsed Reply Threads**. 

Tutorial video
---------------

.. raw:: html

  <script src="https://fast.wistia.com/embed/medias/5gjgi10rr0.jsonp" async></script><script src="https://fast.wistia.com/assets/external/E-v1.js" async></script><div class="wistia_responsive_padding" style="padding:56.25% 0 0 0;position:relative;"><div class="wistia_responsive_wrapper" style="height:100%;left:0;position:absolute;top:0;width:100%;"><div class="wistia_embed wistia_async_5gjgi10rr0 videoFoam=true" style="height:100%;position:relative;width:100%"><div class="wistia_swatch" style="height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;transition:opacity 200ms;width:100%;"><img src="https://fast.wistia.com/embed/medias/5gjgi10rr0/swatch" style="filter:blur(5px);height:100%;object-fit:contain;width:100%;" alt="" aria-hidden="true" onload="this.parentNode.style.opacity=1;" /></div></div></div></div>
  <br>


Known issues
------------

Collapsed Reply Threads was released as generally available in Mattermost v7.0, including significant server performance improvements and more flexible configuration options for System Admins to enable the feature by default. We highly recommended `upgrading to Mattermost v7.0 <https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html>`__ to take advantage of these configuration and performance enhancements.

Customers running Collapsed Reply Threads in beta on Mattermost v6.7 or earlier will likely experience bugs and unoptimized server performance. Learn more about the `beta release performance considerations <https://support.mattermost.com/hc/en-us/articles/4413183568276>`__ applicable only to Mattermost v5.37 through v6.7 deployments.

In particular, please be aware of these important known issues and risks:

  - When enabling Collapsed Reply Threads for the first time, you may see channels or threads you’ve seen before appear as unread. To resolve this, navigate to any unread channel, or select the **Mark all as read** button in the **Threads** view to mark all of your threads as read.
  - You may experience lag in your desktop or web client if you're following many threads or opening threads with many replies.
  - Server performance for instances with many users and posts may be impacted. 
  - You should expect to see more unread channels and notifications on your mobile device than you'll see on your desktop instance of Mattermost. This is expected when running a mobile app release older than v1.46.
  - For a comprehensive list of known issues, and to see our work queue in priority order, check out our `Kanban board <https://mattermost.atlassian.net/secure/RapidBoard.jspa?rapidView=91&quickFilter=499>`__.
source/channels/navigate-between-channels.rst METASEP
Navigate channels
=================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Navigate between channels
--------------------------

Use the **Find channel** option in the channel sidebar, or press :kbd:`Ctrl` :kbd:`K` on Windows or Linux, or :kbd:`⌘` :kbd:`K` on Mac to visit other channels, or to review `member availability <https://docs.mattermost.com/welcome/set-your-status-availability.html>`__ at a glance.

    .. image:: ../images/switch-channels.png
        :alt: Navigate between channels and review member availability.

Return to recently viewed channels
-----------------------------------

Use the **History** arrows at the top of the sidebar to move back and forth through your channel history. 

- Select the left arrow to go back one page. 
- Select the right arrow to go forward one page.
source/channels/mention-people.rst METASEP
Mention people in messages
==========================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

When you want to get the attention of specific Mattermost users, you can use @mentions. Mattermost supports the following types of @mentions:

- `@username <#username>`__
- `@channel <#channel-and-all>`__
- `@all <#channel-and-all>`__
- `@here <#here>`__
- `@groupname <#groupname>`__

.. note::

  - If you forget to mention someone in a message, editing the existing message to add an @mention won't trigger new @mention notifications, desktop notifications, or notification sounds.
  - Mattermost supports mentions for names that include accents (also known as diacritics). Names like Zoë, Jesús, Sørina, François, André, Jokūbas, Siân, KŠthe, or Fañch are returned in autocomplete results.

@username
---------

You can mention a teammate by using the *@* symbol plus their username to send them a mention notification.

Type *@* to bring up a list of team members who can be mentioned. To filter the list, type the first few letters of any username, first name, last name, or nickname. Press the :kbd:`↑` and :kbd:`↓` arrow keys to scroll through entries in the list, and then press :kbd:`ENTER` on Windows or Linux, or :kbd:`↵` on Mac, to select the person to mention. When selected, the username replaces the full name or nickname.

The following example sends a special mention notification to Alice, whose username is **alice**. The notification alerts her of the channel and message where she was mentioned. If Alice is away from Mattermost and has email notifications turned on, she'll receive an email alert of her mention along with the message text.

.. code-block:: none

  @alice how did your interview go with the new candidate?

If the person you mentioned doesn't belong to the channel, a system message is posted to let you know, and you're given the option to add the person to the channel. You are the only one who can see this message.

@channel and @all
-----------------

You can mention an entire channel by typing ``@channel`` or ``@all``. All members of the channel receive a mention notification that behaves the same way as if the members had been mentioned personally. If used in Town Square, it notifies all members of your team.

You can ignore channel-wide mentions in specific channels in the **Channel Menu > Notification Preferences > Ignore mentions for @channel, @here and @all**.

.. code-block:: none

  @channel great work on interviews this week. I think we found some excellent potential candidates!

If a channel has five or more members, you may be prompted to confirm that you want notifications sent to everyone in the channel.

@here
-----

You can mention everyone who is online in a channel by typing ``@here``. This sends a desktop notification and push notification to members of the channel who are online. It's counted as a mention in the sidebar. Members who are offline don't receive a notification. When they return to Mattermost they won't see a mention counted in the channel sidebar. Members who are away receive a desktop notification only if they have notifications set to **For all activity**, and they won't see a mention counted in the sidebar.

.. code-block:: none

  @here can someone complete a quick review of this?

If a channel has five or more members, you may be prompted to confirm that you want notifications sent to everyone in the channel.
  
You can ignore channel-wide mentions in specific channels by enabling the **Channel Menu > Notification Preferences > Ignore mentions for @channel, @here, and @all** option.
  
@groupname
----------

.. include:: ../_static/badges/ent-only.rst
  :start-after: :nosearch:

This feature enables System Admins to configure custom mentions for `LDAP synced groups <https://docs.mattermost.com/onboard/ad-ldap-groups-synchronization.html>`__ via the Group Configuration page. This functionality is also supported on the mobile app (from v1.34) if the AD/LDAP groups feature is enabled. The mobile app supports auto-suggesting groups, highlights group member mentions, and also provides a warning dialog when a mention will notify more than five users.

Once enabled for a specific group, users can mention and notify the entire group in a channel (similar to ``@channel`` or ``@all``). Members of the group in that channel will receive a notification. If members of the group mentioned aren't members of the channel, the user who posted the mention is prompted to invite them.

Group mention identifiers (slugs) use the LDAP group name by default. To customize/rename the slug:

1. Open **System Console > User Management > Groups**.
2. Select **Edit** next to the group you want to edit.
3. In **Group Profile > Group Mention** enter the new slug.
4. Select **Save**.

As with ``@username`` mentions, use *@* to bring up a list of groups that can be mentioned. To filter the list, type the first few letters of any group. Press the :kbd:`↑` and :kbd:`↓` arrow keys to scroll through entries in the list, and then press :kbd:`Enter` on Windows or Linux, or pressing :kbd:`↵` on Mac to select the group you want to mention.

.. code-block:: none

  @dev-managers great work hitting all of our code coverage goals this quarter!

Words that trigger mentions
---------------------------

You can customize words that trigger mention notifications in **Settings > Notifications > Words That Trigger Mentions**. By default, you receive mention notifications for your username and for ``@channel``, ``@all`` and ``@here``. You can choose to have your first name be a word that triggers mentions.

You can add a list of customized words to get mention notifications for by typing them into the input box, separated by commas. This is useful if you want to be notified of all posts on certain topics, such as "interviewing" or "marketing".

See all recent mentions
-----------------------

Select **@** to the right of the **Search** box to query for your most recent @mentions and words that trigger mentions (excluding LDAP group mentions).

.. image:: ../images/recent-mentions.png
   :alt: See your most recent @mentions

.. tabs::
  
  .. tab:: Mattermost v6.1 onwards

    From Mattermost v6.1, your recent mentions are shown for all of your teams.

  .. tab:: Mattermost v6.0 and earlier

    In Mattermost versions up to v6.0, your recent mentions are shown for your current team only.

Select **Jump** next to a search result in the right-hand sidebar to jump the center pane to the channel and location of the message with the mention.

Confirmation dialog warnings
----------------------------

When your System Admin has configured Mattermost to require confirmations for @messages, you must confirm any mention that will trigger notifications for more than five users before sending the notification.

This confirmation dialog only appears when your System Admin has configured this setting in the System Console. See our `configuration settings <https://docs.mattermost.com/configure/configuration-settings.html#show-channel-all-or-here-confirmation-dialog>`__ product documentation for details. This configuration setting is supported on the Mattermost Mobile App (from v1.34) if the `AD/LDAP groups <https://docs.mattermost.com/onboard/ad-ldap-groups-synchronization.html>`__ feature is enabled.

Mention highlights
------------------

Valid mentions will have highlighted font text with some exceptions, for example if mentions are disabled at the channel level. The highlighted text becomes a hyperlink when a username is displayed. When the username is selected, the profile popover is displayed.

When mentions trigger a notification, the user being notified will see highlighted font text and highlighted font background. This functions as an identifier of which mentions in the post triggered a notification for the user.
source/channels/mark-messages-unread.rst METASEP
Mark messages as unread
=======================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

.. |more-actions-icon| image:: ../images/dots-horizontal_F01D8.svg
  :height: 24px
  :width: 24px
  :alt: Access additional message actions using the More actions icon.

If you read a message, but don't have time to address it right away, you can mark that message as unread. Hover over the message, select the **More** |more-actions-icon| option, then select **Mark as Unread**.

.. image:: ../images/message-more.png
  :alt: When you hover over messages, you can access more message options from the More icon.

.. image:: ../images/mark-message-as-unread.png
  :alt: You can mark messages as unread to return to them later.

Marking a message as unread displays the channel as bold in the channel sidebar, and groups the message with all other unread messages. 

source/channels/manage-channel-members.rst METASEP
Manage channel members
=======================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Add members to a channel
------------------------

Any member of a channel can add other members to public or private channels, unless your System Admin has restricted access to do so. 

1. Select the channel name at the top of the center pane to access the drop-down menu, then select **Add Members**. 

  .. image:: ../images/add-member-to-channel.png
    :alt: Use options available through the channel name to add a member to a channel.

2. Search for users, select users, then select **Add** to add users to the current channel. Mattermost notifies you when a user is already a member of the channel.
 
Add users from their profile
----------------------------

You can also add users to channels within their profile pop-over.

1. Select a user's profile image to access their profile pop-over.
2. Select **Add to a Channel**.

  .. image:: ../images/add-member-pop.png
    :alt: Use options on a user's profile pop-over to add a member to a channel.

3. Type to find a channel name, then select a channel and choose **Add**.

Remove members from a channel
-----------------------------

Any member of a channel can remove other members from a channel. 

Select the channel name at the top of the center pane to access the drop-down menu, then select **Manage Members**. Select the member's `user role <https://docs.mattermost.com/welcome/about-user-roles.html>`__, then select **Remove from Channel**.

.. image:: ../images/remove-member-from-channel.png
    :alt: Use options available through the channel name to remove a member from a channel.
source/channels/make-calls.rst METASEP
Start a call (beta)
===================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:
  
Mattermost introduces beta voice calling and screen sharing functionality in channels, group messages, and direct messages from Mattermost v7.0 for Mattermost Cloud and Mattermost self-hosted deployments.

From 7.0, you can:

- Start or join a call from desktop and mobile apps in addition to web browsers.
- Share screen (not available on mobile), raise hands, chat in a thread, and even switch between products in the Mattermost suite (i.e., Channels, Boards, and Playbooks) while on a call.
- Start a call using the ``/call start`` slash command or **Start call** in the channel header.

Mattermost Cloud users can start calling right out of the box. For Mattermost self-hosted deployments, System Admins need to enable the plugin and adjust configurations `in the System Console <https://docs.mattermost.com/configure/configuration-settings.html#calls-beta>`_.

To start a call, select **Start call** in the channel header. Any active team member in the channel can join a call, whether it's a public or private channel. If someone from outside of the organization wants to join a call, you'll need to provide them with a guest account, and add them to the channel. Users who are archived or not registered won't be able to join a call.

You can share a call's link to use in a meeting request or share with other team mates. The link is unique to each channel, and contains the channel's ID, so it doesn't change between calls. Use the ``/call link`` slash command to generate a shareable link.

The call link is valid for long as the channel is active. When a channel is archived or deleted the link will become invalid.

Frequently asked questions
--------------------------

Is video supported?
~~~~~~~~~~~~~~~~~~~

The integration currently supports only voice calling and screen sharing. We are considering video support as well for the upcoming future.

Can I password-protect a call?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

No. Any member with sufficient permission to access the channel will be able to join the call.

Is there encryption?
~~~~~~~~~~~~~~~~~~~~

Media (audio/video) is encrypted using security standards as part of WebRTC. It's mainly a combination of DTLS and SRTP. It's not e2e encrypted in the sense that in the current design all media needs to go through Mattermost which acts as a media router and has complete access to it. Media is then encrypted back to the clients so it's secured during transit. In short: only the participant clients and the Mattermost server have access to unencrypted call data.

Are there any third-party services involved?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The only external service used is Mattermost official STUN server (``stun.global.calls.mattermost.com``) which is configured as default. This is primarily used to find the public address of the Mattermost instance. The only information sent to this service is the IP addresses of clients connecting as no other traffic goes through it. It can be removed in case the ``ICE Host Override`` setting is provided.

Troubleshooting
---------------

My call is disconnected after a few seconds and I can't transmit voice nor hear anything.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This is usually a sign that the underlying UDP channel has not been established and the connection times out after ~10 seconds. When the connection has been established correctly an ``rtc connected`` line should appear in the client-side logs (JS console). There isn't a single solution as it depends on the infrastructure/deployment specifics. However, if you're a System or Network Admin, you may need to open up the UDP port or configure the network accordingly.

Debugging
---------

If you experience issues with calls, collecting information is helpful as you can share it with us for debugging purposes. 

As with any other issue, but more importantly with calls, it’s very useful to provide date and time of when some problem occurred, with as much detail as possible so that information can be cross-checked with server logs as well. Also please include any reproduction steps if applicable. Other important information include:

- Browser/app version
- Operating system type and version

JS console logs
~~~~~~~~~~~~~~~

Web app
^^^^^^^

- **Chrome**: CMD+OPTION+J (macOS)/CTRL+SHIFT+J (Windows, Linux, ChromeOS)
- **Firefox**: CMD+SHIFT+J (macOS)/CTRL+SHIFT+J (Windows, Linux, ChromeOS).
- **Safari**: Enable Developer Menu in **Safari > Preferences > Advanced > Show Develop Menu in Menu Bar**. Then **Develop > Show Javascript Console**. Right-click on the console and select **Save to file** to download the logs.

Desktop app
^^^^^^^^^^^

In the top menu bar of the app, select **View > Developer Tools for Current Tab**. In the logs that are generated, right-click and select **Save as** to download the logs.

Call stats dump
---------------

In cases where there are audio/video issues, difficulty in hearing other participants, and/or stuttering video and/or choppy audio, run the ``/call stats`` slash command in the channel where the call is currently active. This returns a JSON object via an ephemeral message.

You can run this command in an active call or after leaving the call in question. However, we will only save data for the last joined call so joining again will delete the previous call's feedback.

WebRTC internals (Chrome + Firefox only)
----------------------------------------

This is an additional method for Chrome and Firefox users in cases where there are audio/video issues, difficulty in hearing other participants, and/or stuttering video and/or choppy audio.

Chrome browser (recommended)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Open ``chrome://webrtc-internals/`` in the browser that you're using for the active call.

Firefox browser
~~~~~~~~~~~~~~~

Open ``about://webrtc`` in the browser that you're using for the active call.

Share information
~~~~~~~~~~~~~~~~~

Debug information is helpful to our community as there may be other community members having the same issue as you. We recommend that debug information be shared in either of the two options below:

- Post in `Developers: Calls <https://community.mattermost.com/core/channels/developers-channel-call>`_ channel:  prefer this method when possible but keep in mind the channel is public.
- Post in `Team: Calls <https://community.mattermost.com/private-core/channels/calls-team>`_ channel: use this channel if posting sensitive information.

source/channels/keyboard-shortcuts-for-channels.rst METASEP
Keyboard shortcuts for Channels
===============================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Keyboard shortcuts for Mattermost Channels help you make a more efficient use of your keyboard.

.. tip::

  Display a list of available keyboard shortcuts by pressing :kbd:`Ctrl` :kbd:`/` on Windows or Linux, pressing :kbd:`⌘` :kbd:`/` on Mac, or using the ``/shortcuts`` slash command.

Navigation shortcuts for Mattermost Channels
--------------------------------------------

The following keyboard shortcuts are supported in all `supported browsers <https://docs.mattermost.com/install/software-hardware-requirements.html#software-requirements>`__ and in the Mattermost desktop app.

.. note::
  See our `Keyboard Accessibility in Channels <https://docs.mattermost.com/channels/keyboard-accessibility.html>`__ documentation for additional navigation keyboard shortcuts for screen readers.

+-------------------------------------+------------------------------+----------------------------------------------------------------------------------+
| On Windows & Linux                  | On Mac                       | Description                                                                      |
+=====================================+==============================+==================================================================================+
| :kbd:`Alt` :kbd:`↑`                 | :kbd:`⌥` :kbd:`↑`            | Previous channel or direct message in the channel sidebar.                       |
+-------------------------------------+------------------------------+----------------------------------------------------------------------------------+
| :kbd:`Alt` :kbd:`↓`                 | :kbd:`⌥` :kbd:`↓`            | Next channel or direct message in the channel sidebar.                           |
+-------------------------------------+------------------------------+----------------------------------------------------------------------------------+
| :kbd:`Alt` :kbd:`Shift` :kbd:`↑`    | :kbd:`⌥` :kbd:`⇧` :kbd:`↑`   | Previous channel or direct message in the channel sidebar with unread messages.  |
+-------------------------------------+------------------------------+----------------------------------------------------------------------------------+
| :kbd:`Alt` :kbd:`Shift` :kbd:`↓`    | :kbd:`⌥` :kbd:`⇧` :kbd:`↓`   | Next channel or direct message in the channel sidebar with unread messages.      |
+-------------------------------------+------------------------------+----------------------------------------------------------------------------------+
| :kbd:`Ctrl` :kbd:`K`                | :kbd:`⌘` :kbd:`K`            | Open the **Find Channels** dialog.                                               |
+-------------------------------------+------------------------------+----------------------------------------------------------------------------------+
| :kbd:`Ctrl` :kbd:`Shift` :kbd:`K`   | :kbd:`⌘` :kbd:`⇧` :kbd:`K`   | Open the **Direct Messages** dialog.                                             |
+-------------------------------------+------------------------------+----------------------------------------------------------------------------------+
| :kbd:`Ctrl` :kbd:`Shift` :kbd:`A`   | :kbd:`⌘` :kbd:`⇧` :kbd:`A`   | Open the **Settings** dialog.                                                    |
+-------------------------------------+------------------------------+----------------------------------------------------------------------------------+
| :kbd:`Ctrl` :kbd:`Shift` :kbd:`M`   | :kbd:`⌘` :kbd:`⇧` :kbd:`M`   | Open recent mentions.                                                            |
+-------------------------------------+------------------------------+----------------------------------------------------------------------------------+
| :kbd:`Ctrl` :kbd:`Shift` :kbd:`L`   | :kbd:`⌘` :kbd:`⇧` :kbd:`L`   | Set focus to center channel input field.                                         |
+-------------------------------------+------------------------------+----------------------------------------------------------------------------------+
| :kbd:`Ctrl` :kbd:`.`                | :kbd:`⌘` :kbd:`.`            | Open or close the right-hand sidebar.                                            |
+-------------------------------------+------------------------------+----------------------------------------------------------------------------------+
| :kbd:`Ctrl` :kbd:`Shift` :kbd:`.`   | :kbd:`⌘` :kbd:`⇧` :kbd:`.`   | Expand or shrink the width of the open right-hand sidebar.                       |
+-------------------------------------+------------------------------+----------------------------------------------------------------------------------+
| :kbd:`Ctrl` :kbd:`Shift` :kbd:`F`   | :kbd:`⌘` :kbd:`⇧` :kbd:`F`   | Move focus to the **Search** field and search the current channel.               |
+-------------------------------------+------------------------------+----------------------------------------------------------------------------------+

File upload shortcuts
---------------------

The following keyboard shortcuts are supported in all `supported browsers <https://docs.mattermost.com/install/software-hardware-requirements.html#software-requirements>`__ and in the Mattermost desktop app.

+-----------------------+--------------------+-----------------+
| On Windows & Linux    | On Mac             | Description     |
+=======================+====================+=================+
| :kbd:`Ctrl` :kbd:`U`  | :kbd:`⌘` :kbd:`U`  | Upload a file.  |
+-----------------------+--------------------+-----------------+

Message shortcuts
-----------------

The following keyboard shortcuts are supported in all `supported browsers <https://docs.mattermost.com/install/software-hardware-requirements.html#software-requirements>`__ and in the Mattermost desktop app.

+-----------------------------------------------+--------------------------------------------+-----------------------------------------------------------+
| On Windows & Linux                            | On Mac                                     | Description                                               |
+===============================================+============================================+===========================================================+
| :kbd:`Ctrl` :kbd:`↑` (in empty input field)   | :kbd:`⌘` :kbd:`↑` (in empty input field)   | Reprint previous message or slash command you entered.    |
+-----------------------------------------------+--------------------------------------------+-----------------------------------------------------------+
| :kbd:`Ctrl` :kbd:`↓` (in empty input field)   | :kbd:`⌘` :kbd:`↓` (in empty input field)   | Reprint next message or slash command you entered.        |
+-----------------------------------------------+--------------------------------------------+-----------------------------------------------------------+
| :kbd:`Shift` :kbd:`↑` (in empty input field)  | :kbd:`⇧` :kbd:`↑` (in empty input field)   | Reply to the most recent message in the current channel.  |
+-----------------------------------------------+--------------------------------------------+-----------------------------------------------------------+
| :kbd:`↑` (in empty input field)               | :kbd:`↑` (in empty input field)            | Edit your last message in the current channel.            |
+-----------------------------------------------+--------------------------------------------+-----------------------------------------------------------+
| :kbd:`@[character]` :kbd:`Tab`                | :kbd:`@[character]` :kbd:`Tab`             | Autocomplete @username beginning with [character].        |
+-----------------------------------------------+--------------------------------------------+-----------------------------------------------------------+
| :kbd:`~[character]` :kbd:`Tab`                | :kbd:`~[character]` :kbd:`Tab`             | Autocomplete channel beginning with [character].          |
+-----------------------------------------------+--------------------------------------------+-----------------------------------------------------------+
| :kbd:`:[character]` :kbd:`Tab`                | :kbd:`:[character]` :kbd:`Tab`             | Autocomplete emoji beginning with [character].            |
+-----------------------------------------------+--------------------------------------------+-----------------------------------------------------------+
| :kbd:`Ctrl` :kbd:`Shift` :kbd:`\\`            | :kbd:`⌘` :kbd:`⇧` :kbd:`\\`                | React to last message in channel or thread.               |
+-----------------------------------------------+--------------------------------------------+-----------------------------------------------------------+

Formatting shortcuts
--------------------

The following keyboard shortcuts are supported in all `supported browsers <https://docs.mattermost.com/install/software-hardware-requirements.html#software-requirements>`__ and in the Mattermost desktop app.

+-----------------------------------+-----------------------------+------------------------+
| On Windows & Linux                | On Mac                      | Description            |
+===================================+=============================+========================+
| :kbd:`Ctrl` :kbd:`B`              | :kbd:`⌘` :kbd:`B`           | Bold text.             |
+-----------------------------------+-----------------------------+------------------------+
| :kbd:`Ctrl` :kbd:`I`              | :kbd:`⌘` :kbd:`I`           | Italicize text.        |
+-----------------------------------+-----------------------------+------------------------+
| :kbd:`Ctrl` :kbd:`Alt` :kbd:`K`   | :kbd:`⌘` :kbd:`⌥` :kbd:`K`  | Format text as a link. |
+-----------------------------------+-----------------------------+------------------------+

Accessibility nagivation shortcuts
----------------------------------

The following keyboard shortcuts work in all `supported browsers <https://docs.mattermost.com/install/software-hardware-requirements.html#software-requirements>`__ and in the Mattermost desktop app.

+----------------------------------------------+------------------------------------------+--------------------------------------------------+
| On Windows & Linux                           | On Mac                                   | Description                                      |
+==============================================+==========================================+==================================================+
| :kbd:`Alt` :kbd:`←`                          | :kbd:`⌘` :kbd:`[`                        | Go to the previous channel in your history.      |
+----------------------------------------------+------------------------------------------+--------------------------------------------------+
| :kbd:`Alt` :kbd:`→`                          | :kbd:`⌘` :kbd:`]`                        | Go to the next channel in your history.          |
+----------------------------------------------+------------------------------------------+--------------------------------------------------+
| :kbd:`Shift` :kbd:`↑` (in input field)       | :kbd:`⇧` :kbd:`↑` (in input field)       | Highlight text to the previous line.             |
+----------------------------------------------+------------------------------------------+--------------------------------------------------+
| :kbd:`Shift` :kbd:`↓` (in input field)       | :kbd:`⇧` :kbd:`↓` (in input field)       | Highlight text to the next line.                 |
+----------------------------------------------+------------------------------------------+--------------------------------------------------+
| :kbd:`Shift` :kbd:`Enter` (in input field)   | :kbd:`⇧` :kbd:`Enter` (in input field)   | Create a new line.                               |
+----------------------------------------------+------------------------------------------+--------------------------------------------------+

.. note::

   Though Mattermost keyboard shortcuts support standard languages and keyboard layouts, they may not work if you use keymapping that overwrites default browser shortcuts.

source/channels/keyboard-accessibility.rst METASEP
Keyboard accessibility
=======================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Navigational keyboard shortcuts help you use Mattermost without requiring a mouse. Below is a list of supported accessibility shortcuts. Elements in focus have a colored outline, as shown here:

.. image:: ../images/focus.png
  :alt: Navigate Mattermost using a keyboard.

+----------------------------------------------+----------------------------------------------------------------------------------+
| Keyboard shortcut                            | Description                                                                      |
+==============================================+==================================================================================+
|| Desktop App: :kbd:`F6`                      || Move focus to the next section                                                  |
|| Browser: :kbd:`Ctrl` :kbd:`F6`              ||                                                                                 |
+----------------------------------------------+----------------------------------------------------------------------------------+
|| Desktop App: :kbd:`Shift` :kbd:`F6`         || Move focus to the previous section                                              |
|| Browser: :kbd:`Ctrl` :kbd:`Shift` :kbd:`F6` |                                                                                  |
+----------------------------------------------+----------------------------------------------------------------------------------+
| :kbd:`Tab`                                   | Move focus to the next element                                                   |
+----------------------------------------------+----------------------------------------------------------------------------------+
| :kbd:`Shift` :kbd:`Tab`                      | Move focus to the previous element                                               |
+----------------------------------------------+----------------------------------------------------------------------------------+
| :kbd:`↑` or :kbd:`↓`                         | Move focus between messages in the post list or sections in the channel sidebar  |
+----------------------------------------------+----------------------------------------------------------------------------------+
| :kbd:`Enter`                                 | Take action on the focused element                                               |
+----------------------------------------------+----------------------------------------------------------------------------------+

Region navigation
------------------

Mattermost has eight regions that can be focused for navigation. Use :kbd:`F6` in the desktop app, or use :kbd:`Ctrl` :kbd:`F6` in a browser repeatedly to move focus and loop through the regions in this order:

1. Message list region
2. Message input region
3. Right-hand side message list region
4. Right-hand side message input region
5. Team menu region
6. Channel sidebar region
7. Channel header region
8. Search

.. image:: ../images/navigation.gif
  :alt: Navigate through the sections of Mattermost using a keyboard.

Message navigation
------------------

When the message list region is focused, use the  :kbd:`↑` or :kbd:`↓` arrow keys to navigate through messages and reply threads. Press :kbd:`Tab` to navigate through message actions.

.. image:: ../images/message-navigation.gif
  :alt: Navigate through Mattermost messages using a keyboard.

Message composition
~~~~~~~~~~~~~~~~~~~

Mattermost is compatible with most popular screen readers, such as `Apple VoiceOver <https://www.apple.com/ca/accessibility/vision/>`__ or `JAWS for Windows <https://www.freedomscientific.com/products/software/jaws/>`__. A custom readout is composed for each message by combining the message elements and reading them together in full sentences. Message elements will read in the following order:

1. Header: Author, timestamp, message type (i.e. parent post or reply)
2. Main Content: The message content typed by the author
3. Attachments: The number of attachments (if applicable)
4. Emoji Reactions: The number of unique emoji reactions (if applicable)
5. Saves/Pins: If a message is saved or pinned (if applicable)

For example, a message read by a screen reader may sound like the following:

.. code-block:: none
  
  Eric Sethna at 12:57pm Thursday June 13th wrote a reply "Thanks for the review", 3 attachments, 2 reactions, message is saved and pinned.

Channel sidebar navigation
--------------------------

When the channel sidebar region is focused, use the :kbd:`↑` or :kbd:`↓` arrow keys to focus individual sidebar sections, such as Favorites, public channels, private channels, and direct messages. Press :kbd:`Tab` to navigate through channels or other buttons within a sidebar section.

.. image:: ../images/channel-sidebar-navigation.gif
  :alt: Navigate the Mattermost channel sidebar using a keyboard.

source/channels/join-leave-channels.rst METASEP
Join and leave channels
=======================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Join a channel
--------------

To join a private channel, you need to be added to the channel by a member of that channel.

To join a public channel:

1. Select the **+** symbol at the top of the channel sidebar, then select **Browse Channels**. 

  .. image:: ../images/browse-channels.png
    :alt: You can browse available channels to join using the + option at the top of the channel sidebar.

2. Select **Join** next to the public channel you want to join.

  .. image:: ../images/join-channels.png
    :alt: When browsing available channels, select the join option next to any channel to become a member.

.. tip::
  
  When you join channels, depending on the `channel actions configured <https://docs.mattermost.com/channels/create-channels.html>`__, you may see a welcome message, and channels may be added to `a category in your channel sidebar <https://docs.mattermost.com/channels/customize-your-channel-sidebar.html>`__ automatically. 
  Access **Channel Actions** from the channel name drop-down menu in the center pane to see what automatic actions have been configured.

Leave a channel
---------------

Select the channel name at the top of the center pane to access the drop-down menu, then select **Leave Channel**. 

.. image:: ../images/leave-channels.png
  :alt: You can use channel options available from the channel name to leave a channel.

When you leave a private channel, you must be re-added by another channel member to rejoin. You won't receive mention notifications from a channel if you're not a member of that channel.
source/channels/forward-messages.rst METASEP
Forward messages
================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

To forward messages in Mattermost, select the **More** |more-icon| icon next to a message, then select **Forward**. Specify where you want to forward the message, and include an optional comment. Forwarding messages generates a preview of the message.

.. image:: ../images/permalink-previews.png
   :alt: Mattermost generates previews of links shared in Channels.

Previews respect channel membership permissions, so they’re only visible to users who have access to the original message. If the link is to a message in a public channel, any member of the team can see the message preview. If the link is to a message in a private channel or direct message, only members in that channel can see the message preview.
source/channels/format-messages.rst METASEP
Format messages
===============

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

.. |bold-icon| image:: ../images/format-bold_F0264.svg
  :height: 24px
  :width: 24px
  :target: https://mattermost.com/deploy
  :alt: Bold message text using the Bold icon in the message formatting toolbar.

.. |italics-icon| image:: ../images/format-italic_F0277.svg
  :height: 24px
  :width: 24px
  :target: https://mattermost.com/deploy
  :alt: Italicize message text using the Italic icon in the message formatting toolbar.

.. |strikeout-icon| image:: ../images/format-strikethrough-variant_F0281.svg
  :height: 24px
  :width: 24px
  :target: https://mattermost.com/deploy
  :alt: Strike out message text using the Strikethrough icon in the message formatting toolbar.

.. |headings-icon| image:: ../images/format-header_E81D.svg
  :height: 24px
  :width: 24px
  :target: https://mattermost.com/deploy
  :alt: Format message text as a heading using the Heading icon in the message formatting toolbar. Headings 1 through 6 are supported.

.. |links-icon| image:: ../images/link-variant_F0339.svg
  :height: 24px
  :width: 24px
  :target: https://mattermost.com/deploy
  :alt: Add a message link using the Link icon in the message formatting toolbar.

.. |attachments-icon| image:: ../images/paperclip_F03E2.svg
  :height: 24px
  :width: 24px
  :target: https://mattermost.com/deploy
  :alt: Add a message attachment using the Upload files icon in the message formatting toolbar.

.. |numbered-icon| image:: ../images/format-list-numbered_F027B.svg
  :height: 24px
  :width: 24px
  :target: https://mattermost.com/deploy
  :alt: Format message text as a numbered list using the Numbered list icon in the message formatting toolbar.

.. |bullets-icon| image:: ../images/format-list-bulleted_F0279.svg
  :height: 24px
  :width: 24px
  :target: https://mattermost.com/deploy
  :alt: Format message text as a bulleted list using the Bulleted list icon in the message formatting toolbar.

.. |quotes-icon| image:: ../images/format-quote-open_F0757.svg
  :height: 24px
  :width: 24px
  :target: https://mattermost.com/deploy
  :alt: Format message text as a quotation using the Quote icon in the message formatting toolbar.

.. |code-icon| image:: ../images/code-tags_F0174.svg
  :height: 24px
  :width: 24px
  :target: https://mattermost.com/deploy
  :alt: Format message text as code using the Code icon in the message formatting toolbar.

.. |emoji-icon| image:: ../images/emoticon-outline_F01F2.svg
  :height: 24px
  :width: 24px
  :target: https://mattermost.com/deploy
  :alt: Add emojis or GIFs to message text using the Emoji/Gif picker icon in the message formatting toolbar.

.. |hide-formatting-icon| image:: ../images/format-letter-case_F0B34.svg
  :height: 24px
  :width: 24px
  :target: https://mattermost.com/deploy
  :alt: Hide formatting options in the message formatting toolbar using the Show/Hide Formatting icon.

.. |preview-icon| image:: ../images/eye-outline_F06D0.svg
  :height: 24px
  :width: 24px
  :target: https://mattermost.com/deploy
  :alt: Review your message text formatting using the Show/Hide preview icon in the message formatting toolbar.

Use the messaging formatting toolbar
------------------------------------

From Mattermost v7.0, you can format your messages in Mattermost using the message formatting toolbar without having to specify any Markdown syntax.

.. image:: ../images/message-formatting-toolbar.gif
  :scale: 50
  :alt: The message formatting toolbar, available from Mattermost v7.0, doesn't require Markdown syntax, and makes formatting message text fast and easy.

The message formatting toolbar offers the following formatting options:

+------------------------------------------------------------+--------------------+
| **Formatting option**                                      | **Icon**           | 
+============================================================+====================+
| Bold, italicize, or strike out text                        | |bold-icon|        |
|                                                            | |italics-icon|     | 
|                                                            | |strikeout-icon|   | 
+------------------------------------------------------------+--------------------+
| Add headings, links, or attachments                        | |headings-icon|    |
|                                                            | |links-icon|       | 
|                                                            | |attachments-icon| |
+------------------------------------------------------------+--------------------+
| Format a numbered list, a bulleted list, quoted text, or   | |numbered-icon|    | 
| text as code                                               | |bullets-icon|     | 
|                                                            | |quotes-icon|      |
|                                                            | |code-icon|        | 
+------------------------------------------------------------+--------------------+
| Add emojis or GIFs                                         | |emoji-icon|       | 
+------------------------------------------------------------+--------------------+

Review how your message formatting will look when the message is sent by selecting the **Show/Hide Preview** |preview-icon| icon. Return to your draft message by selecting the icon again.

You can hide the formatting options by selecting the **Show/Hide Formatting** |hide-formatting-icon| icon. Select the icon again to show the formatting options.

Use Markdown
-------------

You can also format your messages in Mattermost using Markdown to control `text styling <#text-style>`__, `links <#links>`__, `headings <#headings>`__, `lists <#lists>`__, `code blocks <#code-blocks>`__, `in-line code <#in-line-code>`__, `in-line images <#in-line-images>`__, `horizontal lines <#horizontal-lines>`__, `block quotes <#block-quotes>`__, `tables <#tables>`__, and `math formulas <#math-formulas>`__. Markdown makes it easy to format messages: type a message as you normally would, then use formatting syntax to render the message a specific way. For a guide to using Markdown in Mattermost, `see this blog post <https://mattermost.com/blog/laymans-guide-to-markdown-on-mattermost/>`_.

.. image:: ../images/messagesTable1.png
   :alt: Formatting markdown controls the look and feel of text messages.

Text style
~~~~~~~~~~

You can use either ``_`` or ``*`` around a word or phrase to make it italic, or ``__`` or ``**`` around a word or phrase to make it bold. 

.. tip::
    
    Common formatting keyboard shortcuts are supported. Bold text by pressing :kbd:`Ctrl` :kbd:`B` on Windows and Linux, or :kbd:`⌘` :kbd:`B` on Mac. Italicize text by pressing :kbd:`Ctrl` :kbd:`I` on Windows or Linux, or :kbd:`⌘` :kbd:`I` on Mac.

* ``*italics*`` (or ``_italics_``) renders as *italics*
* ``**bold**`` renders as **bold**
* ``***bold-italic***`` renders as |bold_italics|
* ``~~strikethrough~~`` renders as |strikethrough|

.. |bold_italics| image:: ../images/bold_italics.png
  :width: 100px
  :alt: Bold Italics
.. |strikethrough| image:: ../images/strikethrough.png
  :width: 100px
  :alt: Strike Through

Links
~~~~~

Channel links
^^^^^^^^^^^^^

Create a link to a public channel in a message by typing ``~`` followed by the channel name (e.g. ``~roadmap``). From Mattermost v6.2, channel members also see private channel names returned.

Labeled links
^^^^^^^^^^^^^

Create labeled links by putting the desired text in square brackets ``[ ]`` and the associated link in round brackets ``( )``.

``[Check out Mattermost!](https://about.mattermost.com/)``

Renders as: `Check out Mattermost! <https://about.mattermost.com/>`__

Headings
~~~~~~~~

Make a heading by typing ``#`` and a space before your title. For smaller headings, use more ``#``'s.

.. code-block:: none

  ## Large Heading
  ### Smaller Heading
  #### Even Smaller Heading

Renders as:

.. image:: ../images/Headings1.png
   :alt: Large Heading

Alternatively, you can underline the text using equal signs ``===`` or hyphens ``---`` to create headings.

.. code-block:: none

  Large Heading
  -------------

Renders as:

.. image:: ../images/Headings2.png
   :alt: Smaller Heading

Lists
~~~~~

Create a list by using asterisks ``*``, hyphens ``-``, and/or plus signs ``+`` interchangeably as bullets. Indent bullet points by adding two spaces in front each one.

.. code-block:: none

  * item one
  - item two
    + item two sub-point

Renders as:

* item one
* item two

  * item two sub-point

Make an ordered list by using numbers instead:

.. code-block:: none

  1. Item one
  1. Item two
  1. item three

Renders as:

#. Item one
#. Item two
#. Item three

You can also start a list at any number:

.. code-block:: none

  4. The first list number is 4.
  1. The second list number is 5.
  1. The third list number is 6.

Renders as:

4. The first list number is 4.
5. The second list number is 5.
6. The third list number is 6.

Make a task list by including square brackets ``[ ]``. Mark a task as complete by adding an ``x``.

.. code-block:: none

  - [ ] Item one
  - [ ] Item two
  - [x] Completed item

Renders as:

.. image:: ../images/checklist.png
   :alt: List

Code blocks
~~~~~~~~~~~

Creating a fixed-width code block is recommended for pasting multi-line blocks of code or other text output because it's easier to read with fixed-width font alignment. Examples include block text snippets, ASCII tables, and log files.

This can be accomplished by placing three backticks ``````` on the line directly above and directly below your code:

.. code-block:: none

  ```
  this is my
  code block
  ```

.. tip::

  Type three backticks ```````, press :kbd:`Shift` :kbd:`Enter` on Windows or Linux, or :kbd:`⇧` :kbd:`↵` on Mac, ``<type_your_code>``, press  :kbd:`Shift` :kbd:`Enter` on Windows or Linux, or :kbd:`⇧` :kbd:`↵` on Mac again, then type three more backticks ```````.


Or by indenting each line by four spaces:

.. code-block:: none

      this is my
      code block

  ^^^^ 4x spaces


**Syntax highlighting**

To add syntax highlighting, type the language to be highlighted after the ``````` at the beginning of the code block. Mattermost also offers four different code themes (GitHub, Solarized Dark, Solarized Light, and Monokai) that can be changed in **Settings > Display > Theme > Custom Theme > Center Channel Styles**.

Supported languages and their aliases include:

.. include:: syntax-highlighting.rst
  :start-after: :nosearch:

Example:

.. code-block:: none

  ``` go
  package main
  import "fmt"
  func main() {
      fmt.Println("Hello, 世界")
  }
  ```
Renders as:

**GitHub Theme**

.. image:: ../images/syntax-highlighting-github.png
   :alt: Syntax Highlighting in GitHub

**Solarized Dark Theme**

.. image:: ../images/syntax-highlighting-sol-dark.png
   :alt: Syntax Highlighting Dark

**Solarized Light Theme**

.. image:: ../images/syntax-highlighting-sol-light.png
   :alt: Syntax Highlighting Light

**Monokai Theme**

.. image:: ../images/syntax-highlighting-monokai.png
   :alt: Syntax Highlighting Monokai

In-line code
~~~~~~~~~~~~

Create in-line monospaced code text by surrounding it with backticks `````. Don't use single quotes ``'``.

.. code-block:: none

  `monospace`

Renders as: ``monospace``.

In-line images
~~~~~~~~~~~~~~

In-line images are images added within lines of text. From Mattermost Server v5.35 and in Mattermost Cloud, you can control whether all in-line images over 100px in height are automatically collapsed or expanded in messages by setting a `user preference <https://docs.mattermost.com/channels/channels-settings.html#website-link-previews>`__, or by using the ``/collapse`` and ``/expand`` slash commands.

To add in-line images to text, use an exclamation mark ``!`` followed by the ``alt text`` in square brackets ``[ ]``, then the ``image URL`` in round brackets ``( )``. You can add hover text after the link by placing the text in quotes ``" "``.

Example:

.. code-block:: none

  ![alt text](URL of image "Hover text")

If the height of the original image is more than 500 pixels, Mattermost sets the image height at 500 pixels and adjusts the width to maintain the original aspect ratio.

You can set the width and height of the displayed image after the URL of the image by using an equals sign ``=`` followed by values for both width and height ``##x##``. If you set only the width, Mattermost adjusts the height to maintain the original aspect ratio.

.. warning::
  The native apps do not support fixed width and height and will display the full-size image.

Examples:

.. code-block:: none

  .. |mattermost-icon-76x76| image:: ../images/icon-76x76.png
  .. |mattermost-icon-50x76| image:: ../images/icon-50x76.png

In-line image with hover text
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. code-block:: none

  ![Mattermost](../images/icon-76x76.png "Mattermost Icon")

Renders as:

  .. image:: ../images/icon-76x76.png
    :alt: Mattermost

In-line image with link
^^^^^^^^^^^^^^^^^^^^^^^

.. note::
  An extra set of square brackets ``[ ]`` is required around the alt text, and round brackets ``( )`` are required around the image link.

.. code-block:: none

  [![Mattermost](../images/icon-76x76.png)](https://github.com/mattermost/mattermost-server)

Renders as:

  .. image:: ../images/icon-76x76.png
    :target: https://github.com/mattermost/mattermost-server
   
In-line image displayed with fixed width and height
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Example: An in-line image that's 50 pixels wide and 76 pixels high.

.. code-block:: none

  ![Mattermost](../images/icon-76x76.png =50x76 "Mattermost Icon")

Renders as:

  .. image:: ../images/icon-50x76.png
    :alt: Mattermost
    :name: Mattermost Icon 

In-line image displayed with fixed width
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Example: An in-line image that's 50 pixels wide where the system adjusts the height to maintain the original aspect ratio.

.. code-block:: none

  ![Mattermost](../images/icon-76x76.png =50 "Mattermost Icon")

Renders as:

  .. image:: ../images/icon-76x76.png
    :alt: Mattermost
    :width: 50
 
Horizontal lines
~~~~~~~~~~~~~~~~

Create a line by using three ``*``, ``_``, or ``-``.

``***``

Renders as:

---------------------------------------------------------------------------

Block quotes
~~~~~~~~~~~~

Create block quotes using ``>``.

``> block quotes`` renders as:

.. image:: ../images/blockQuotes.png

Tables
------

Create a table by placing a dashed line ``---`` under the header row, then separating each column with using pipes ``|``. The columns don’t need to line up exactly. Choose how to align table columns by including colons ``:`` within the header row.

.. code-block:: none

  | Left-Aligned  | Center Aligned  | Right Aligned |
  | :------------ |:---------------:| -----:|
  | Left column 1 | this text       |  $100 |
  | Left column 2 | is              |   $10 |
  | Left column 3 | centered        |    $1 |

Renders as:

.. image:: ../images/markdownTable1.png
   :alt: Markdown Table Sample

Math Formulas
~~~~~~~~~~~~~

.. tabs::

  .. tab:: Using Inline LaTeX

    From Mattermost v6.1, you can create formulas that display inline using LaTeX. Use the dollar sign ($) symbol at the beginning and end of each formula.

    .. note::

      This feature is `disabled by default <https://docs.mattermost.com/configure/configuration-settings.html#enable-inline-latex-rendering>`__. Contact your System Admin to enable this setting in **System Console > Site Configuration > Posts** to use this feature.

    .. code-block:: none

      $X_k = \sum_{n=0}^{2N-1} x_n \cos \left[\frac{\pi}{N} \left(n+\frac{1}{2}+\frac{N}{2}\right) \left(k+\frac{1}{2}\right) \right]$
  
    Renders as:

    .. image:: ../images/latex-inline.png
      :alt: An inline LaTeX math equation sample.
      
  .. tab:: Using LaTeX in Code Blocks

    Create formulas as code blocks by using LaTeX in a ``latex`` `code blocks <#code-blocks>`__. 

    .. note::

      This feature is `disabled by default <https://docs.mattermost.com/configure/configuration-settings.html#enable-latex-code-block-rendering>`__. Contact your System Admin to enable this setting in **System Console > Site Configuration > Posts** to use this feature.

    .. code-block:: none

      ```latex
      X_k = \sum_{n=0}^{2N-1} x_n \cos \left[\frac{\pi}{N} \left(n+\frac{1}{2}+\frac{N}{2}\right) \left(k+\frac{1}{2}\right) \right]
      ```

    Renders as:

    .. image:: ../images/latex-codeblock.png
      :alt: A LaTeX code block math equation sample.
source/channels/find-channels.rst METASEP
Find channels
=============

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Find channels to join
---------------------

To see all available public channels you can join that you're not already a member of, select the **+** icon at the top of the channel sidebar, then select **Browse Channels**. Search for channels by name or scroll through the list. Select **Join** next to any channel to become a member of that channel.

.. tip:: 
  
  Want to see all of the channels you're already a member of? Select **Find Channel** in the channel sidebar to see all of the channels you're currently a member of across all of your teams, including public and private channels, direct and group messages, channels with unread messages, and threads.

Revisit recent channels
-----------------------

Use the **History** arrows at the top of the sidebar to move back and forth through your channel history. 

- Select the left arrow to go back one page. 
- Select the right arrow to go forward one page.

source/channels/favorite-channels.rst METASEP
Mark channels as favorites
==========================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Marking channels as a favorite is a great way to organize your channel sidebar by choosing which public channels, private channels, and direct messages are most important to you.

To mark a channel as a favorite, open the channel:

**On desktop:** At the top of the page, select on the star icon next to the channel name.

.. image:: ../images/favorite-channel-desktop.png
    :alt: Mark a channel as a favorite.
       
This adds the channel to a **Favorites** list at the top of the channel sidebar, so it's easy to access. To remove a channel from the **Favorites** list, select the star again.

.. image:: ../images/favorites-list-sidebar.png
    :alt: Favorite channels in the channel sidebar.
       
**On mobile:** Select the channel name at the top of the center pane to access the drop-down menu, then select **Favorite**. To remove a channel from the **Favorites** list, select **Favorite** again.
source/channels/extend-channels-functionality.rst METASEP
Extend Channels functionality
=============================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

`Visit the Mattermost Marketplace <https://mattermost.com/marketplace/>`__ to find dozens of open source integrations to common tools like Jira, Jenkins, GitLab, with interactive bot applications (Hubot, mattermost-bot), and other communication tools (Email, IRC, XMPP, Threema) that are freely available for use and customization.

Popular Mattermost integrations
-------------------------------

On the Mattermost Marketplace, you'll find popular integrations such as:

Collaboration
~~~~~~~~~~~~~
- `Matterpoll <https://mattermost.com/marketplace/matterpoll/>`__: Create polls using the ``/poll`` slash command in Mattermost.
- `Standup Raven <https://mattermost.com/marketplace/standup-raven/>`__: Communicate daily team updates in Mattermost.

Developer tools
~~~~~~~~~~~~~~~

- `CircleCI <https://mattermost.com/marketplace/circleci/>`__: Manage pipelines without leaving Mattermost.
- `Confluence <https://mattermost.com/marketplace/confluence/>`__: Notify Mattermost users of updates and new pages in Confluence.
- `GitHub <https://mattermost.com/marketplace/github-plugin/>`__: Subscribe to repositories, then stay updated with reviews and assignments in Mattermost.
- `GitLab <https://mattermost.com/marketplace/gitlab-plugin/>`__: Subscribe to repositories, then stay updated with reviews and assignments in Mattermost.
- `Jenkins <https://mattermost.com/marketplace/jenkins-plugin-2/>`__: Interact with jobs and builds with slash commands.
- `Jira <https://mattermost.com/marketplace/jira-plugin/>`__: Create tickets from messages, and get notified of updates in Jira.
- `Opsgenie <https://mattermost.com/marketplace/opsgenie/>`__: Send and receive updates, as well as acknowledge, close, or assign issues in Mattermost.
- `PagerDuty Notifier <https://mattermost.com/marketplace/pagerduty/>`__: Send events from PagerDuty to Mattermost.
- `Zendesk App <https://mattermost.com/marketplace/zendesk-app/>`__: Create tickets and receive ticket updates within Mattermost.

Productivity
~~~~~~~~~~~~

- `Autolink <https://mattermost.com/marketplace/autolink-plugin/>`__: Rewrite text matching a regular expression into a Markdown link.
- `Custom Attributes <https://mattermost.com/marketplace/custom-attributes-plugin/>`__: Add custom attributes to users in Mattermost. 
- `File List <https://mattermost.com/marketplace/file-list/>`__: Add a paged and searchable file list to a Mattermost channel.
- `Remind <https://mattermost.com/marketplace/remind-plugin/>`__: Schedule reminders for users and channels.
- `ToDo <https://mattermost.com/marketplace/todo/>`__: Create slash commands for Mattermost based on Node.js, Express, and MySQL.
- `WelcomeBot <https://mattermost.com/marketplace/welcomebot-plugin/>`__: Post welcome messages to new users and invite them into channels.

Social & fun
~~~~~~~~~~~~

- `GIF Commands <https://mattermost.com/marketplace/giphy-plugin/>`__: Share GIFs from Giphy or Gfycat using ``/gif`` and ``/gifs`` slash commands.
- `Memes <https://mattermost.com/marketplace/memes-plugin/>`__: Create memes using the ``/meme`` slash command in Mattermost.

Video calling & screensharing
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- `Skype for Business <https://mattermost.com/marketplace/skype4business-plugin/>`__: Start and join voice calls, video calls, and use screensharing in Mattermost.
- `Zoom <https://mattermost.com/marketplace/zoom-plugin/>`__: Start audio and video conferencing calls in Mattermost.



source/channels/customize-your-channel-sidebar.rst METASEP
Customize your channel sidebar
==============================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Conversations in Mattermost are crucial to company productivity and success. Keeping conversations organized in the sidebar creates an efficient workplace. You can customize your channel sidebar based on how you use Mattermost. Customizations you make are only visible to you and won't affect what your teammates see in their sidebars.

Here's how your sidebar is set up by default:

- All public and private channels you've joined are listed in the **Channels** category, sorted alphabetically.
- All your direct messages and group messages are listed in the **Direct Messages** category, sorted by recent activity.

What can you customize?
-----------------------

You can customize your sidebar in the following ways:

- `Create custom categories <#create-custom-categories>`__.
- `Group and order channels into your categories <#organize-channels-in-categories>`__.
- `Mute and unmute entire categories <#mute-and-unmute-categories>`__.
- `Sort channels in each category <#sort-channels-in-categories>`__ manually, alphabetically, or by recent activity.
- `Filter your sidebar to view unread channels only <#group-unread-channels-separately>`__, or choose to group unread messages into an **Unreads** category.
- `Manage your direct messages <#manage-direct-messages>`__ by sorting them alphabetically or by recent activity, and by setting how many to display in your sidebar.

  .. image:: ../images/channel_sidebar_updates.gif

Create custom categories
-------------------------

Create custom categories to group channels together for quicker and easier navigation. For example, you can create a category called "Design" or "Marketing".

To create categories, select the **+** symbol at the top of the sidebar. Or, select the **More options...** icon in the sidebar on any category header, then select **Create New Category**.

Next, type a category name, select **Create**, then drag any channels or direct messages into this new category. You can also multi-select channels and direct messages to drag them together as a group by pressing :kbd:`Ctrl` or :kbd:`Shift` and selecting on Windows or Linux, or :kbd:`⌘` or :kbd:`⇧` and selecting on Mac. See **Dragging and dropping selections** below for details.

Make categories work for you
----------------------------

**Categories are collapsible**

- When collapsed, only unread channels display to reduce unnecessary scrolling.
- When expanded, all channels in the category display, including channels with unread messages.

**You can reorder categories**

- Drag to reorder entire categories to prioritize important conversations. 

**Categories can contain direct message conversations**

- Select and drag direct messages into any category. You can also multi-select direct messages to drag them together as a group.

Rename categories
~~~~~~~~~~~~~~~~~

1. Select the **Category options** icon in the sidebar, then select **Rename Category**.
2. Type a new category name, then select **Rename**.

Delete categories
~~~~~~~~~~~~~~~~~

1. Select the **Category options** icon in the sidebar, then select **Delete Category**.
2. Select **Delete** to confirm or select **X** to cancel.

All channels and direct message conversations in the deleted category move back to their default **Channels** and **Direct Messages** categories. Deleting a category never removes you from channels you have joined.

Organize channels in categories
-------------------------------

Once you've created categories, you can move channels around to organize your sidebar.

Drag and drop selections
~~~~~~~~~~~~~~~~~~~~~~~~

To select multiple channels:

- Select sequential channels and/or direct messages by pressing :kbd:`Shift` while selecting on Windows or Linux, or :kbd:`⇧` while selecting  on Mac. 
- Select non-sequential channels and/or direct messages by pressing :kbd:`Ctrl` while selecting on Windows or Linux, or :kbd:`⌘` while selecting on Mac
- Press :kbd:`ESC` to clear channel or direct message selections.

Using the Mattermost web or desktop app, drag selected channels and/or direct messages between or within categories. 

.. tip::

  Multi-selected channels and direct messages move together as a group in the order they originally appeared. 

.. image:: ../images/multi-select-drag.gif

Move selections
~~~~~~~~~~~~~~~

In addition to selecting and dragging, you can specify a category destination for selected channels and/or direct messages. To do this, select the **Channel options** icon in the sidebar and then select **Move to**.

.. image:: ../images/multi-select-move.gif

From Mattermost v6.1, you can also specify a category destination for the current channel or conversation using the **Move to** option directly from the channel header. Channels that have been moved a category will display a checkmark next to the category name.

.. image:: ../images/channel-heading-categories.png
  :alt: Move channels or conversations directly from the channel header.

Mute and unmute categories
---------------------------

When you mute or unmute a category, all channels within that category are also muted or unmuted. You can still selectively unmute specific channels within a muted category.

Select the **Category options** icon in the sidebar, then select **Mute Category**.

Once a category is muted:

- Email, desktop, and push notifications are disabled for all channels in the category.
- A mute icon displays next to each channel name in the category.
- The category and all of its channels appear at reduced opacity in the left-hand sidebar. Channels in the category aren't marked as unread unless you’re mentioned directly.

To unmute the category, select the **Category options** icon in the sidebar, then select **Unmute Category**.

.. image:: ../images/mute-categories.gif

Sort channels in categories
----------------------------

Select the **Category options** icon in the sidebar, then select **Sort** and choose from **Alphabetically**, **Recent Activity**, or **Manually**.

.. image:: ../images/sort-categories.gif

Group unread channels separately
--------------------------------

By default, Mattermost provides a one-click **Unreads** filter to only show channels with unread activity. Alternatively, you may choose to automatically group unread channels in their own category at the top of your sidebar.

Go to **Settings > Sidebar**, set **Group unread channels separately** to **On**, then select **Save**.

- When this setting is enabled, all unread messages appear only in the **Unreads** category, sorted with mentions first.
- When this setting is disabled, all unread messages appear within their respective categories and channels. You can use the **Unread filter** to focus on only unread channels in the sidebar.

When enabled, unread channels with mentions will sort to the top of the category.

    .. image:: ../images/unreads.gif

.. tip::
  
  If you prefer to see only unread channels in their respective categories, we recommend collapsing your custom categories and disabling **Group unread channels separately** under **Settings > Sidebar**.

Manage direct messages
----------------------

To sort your direct messages, select the **Channel options** icon in the sidebar, then select **Sort** and choose from **Alphabetically** or **Recent Activity**.

How many direct messages to display?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Control how many direct message conversations display in the **Direct Messages** category to keep your conversations manageable. You can choose to show all messages or a fixed number of messages.

To configure the number of direct messages to display, go to **Settings > Sidebar**, then set **Number of direct messages to show**. Or select the **Channel options** icon in the sidebar, then select **Show**.

Choose from **All direct messages**, or choose to show **10**, **15**, **20**, or **40** messages. Once you exceed the number of direct messages configured, older messages are hidden from the **Direct Messages** category. You can always increase the number of conversations displayed to see older direct messages.

.. image:: ../images/dm-display.gif

.. note::
  Direct message conversations that you add to custom categories don't count against the maximum number of conversations shown in the **Direct Messages** category.

source/channels/create-channels.rst METASEP
Create channels
===============

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Anyone can create public channels, private channels, direct messages, and group messages unless the System Admin has `restricted permissions to do so using advanced permissions <https://docs.mattermost.com/onboard/advanced-permissions.html>`__.

.. tip::

  **Automate with channel actions**
  
  The user who creates a channel automatically becomes the Channel Admin. Channel Admins can access **Channel Actions** from the channel name drop-down menu in the center pane to configure automatic actions when users `join the channel <https://docs.mattermost.com/channels/join-leave-channels.html#join-a-channel>`__ or `post a message <https://docs.mattermost.com/channels/send-messages.html>`__ to the channel.
  
  Automatic actions include:
  
  - Displaying a temporary welcome message for new channel members.
  - Automatically adding the channel to a `category in the user's channel sidebar <https://docs.mattermost.com/channels/customize-your-channel-sidebar.html>`__.
  - Prompting to run a playbook based on the contents of a message.

Create a public or private channel
-----------------------------------

To create a public or private channel, select the **+** symbol at the top of the channel sidebar, then select **Create New Channel**.

.. image:: ../images/create-new-channel.png
    :alt: Create a channel.

Create a direct or group message
--------------------------------

To start a direct or group message, select the **+** symbol next to the **Direct Messages** category in the channel sidebar.

.. image:: ../images/write-dm.png
    :alt: Access recent direct messages and group messages.

.. tip::
    Alternatively, you can select the **+** symbol at the top of the channel sidebar, then select **Open a Direct Message**. 

In the **Direct Messages** popup, identify your most recent conversations by relative timestamps.

.. image:: ../images/recent-direct-group-messages.png
    :alt: Write a direct message or group message.

source/channels/convert-public-channels.rst METASEP
Convert public channels to private channels
===========================================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

You must be a System Admin, Team Admin, or Channel Admin to convert public channels to private channels. 

.. note::
    Default channels such as ``Town Square`` and ``Off-Topic`` can't be converted to private channels.

To convert a public channel to a private channel, select the public channel name at the top of the center pane to access the drop-down menu, then select **Convert to Private Channel**. 

.. image:: ../images/convert-public-channel-to-private.png
  :alt: From the channel name, you can convert a public channel to a private channel if you're an admin.

When a channel is converted from public to private, its history and membership are preserved. Membership in a private channel remains as invitation only. Publicly-shared files remain accessible to anyone with the link.

Convert private channels to public channels
-------------------------------------------

Due to potential security concerns with sharing private channel history, only System Admins can convert private channels to public channels via **System Console > Channels > Edit (Channel Configuration)**. 

Alternatively, System Admins can perform this action using the `mmctl channel modify command <https://docs.mattermost.com/manage/mmctl-command-line-tool.html?highlight=mmctl#mmctl-channel-modify>`__.

source/channels/channels-settings.rst METASEP
Customize your Channels experience
==================================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

You can customize your Channels experience in the following ways in **Settings**:

- `Notifications <#notifications>`__
- `Display <#display>`__
- `Sidebar <#sidebar>`__
- `Advanced <#advanced>`__

.. tabs::

  .. tab:: Mattermost v6.0 onwards

      In Mattermost v6.0, **Account Settings** have moved.

      - Access **Profile** and **Security** settings from your avatar in the Global Header.
      - Access **Notifications**, **Display**, **Sidebar**, and **Advanced Settings** by selecting the gear |gear-icon| icon in the Global Header.

      .. |gear-icon| image:: ../images/settings-outline_F08BB.svg
        :alt: Select the gear icon to open the Settings dialog.

  .. tab:: Mattermost v5.39 and earlier

      In Mattermost versions up to v5.39, access all of your user settings in **Account Settings** from the **Main Menu** by selecting the three horizontal lines (also known as a hambuger menu) at the top of the channel sidebar.

Notifications
-------------

Settings to configure desktop notifications, desktop notification sounds, email notifications, mobile push notifications, and words that trigger mentions.

Desktop notifications
~~~~~~~~~~~~~~~~~~~~~

Desktop notifications appear in the top corner of your main monitor when there is activity in Mattermost.

Send desktop notifications
^^^^^^^^^^^^^^^^^^^^^^^^^^

Choose what activity triggers a desktop notification. This setting applies globally, but this preference is customizable for each channel from the channel name drop-down menu. Desktop notifications are available on Chrome, Edge, Firefox, and Safari.

When `desktop app <https://mattermost.com/apps>`__ notifications are set to "Only for mentions and direct messages":

- An empty red circle is displayed over the upper right corner of the Mattermost dock icon when any message without an at-mention is received. 
- A solid red circle with a post count is displayed when a message with an at-mention is received.
- And when `Collapsed Reply Threads <https://docs.mattermost.com/channels/organize-conversations.html>`__ is enabled, you can choose to receive desktop notifications about `threads you're following <https://docs.mattermost.com/channels/organize-conversations.html#start-or-reply-to-threads>`__.

Notification sound
^^^^^^^^^^^^^^^^^^

Notification sounds fire for any activity that would trigger a desktop notification. Notification sounds are available on Chrome, Edge, Firefox, and Safari in addition to the Mattermost Desktop App.

Email notifications
~~~~~~~~~~~~~~~~~~~

Email notifications are sent for mentions and direct messages after you’ve been offline for more than 60 seconds or away from Mattermost for more than five minutes. Change the email where notifications are sent by selecting **Profile > Profile Settings > Email**.

If your System Admin has enabled `email batching <https://docs.mattermost.com/configure/configuration-settings.html#enable-email-batching>`__, you'll have additional options under this settings to select how often email notifications will be sent. All notifications received over this time period are combined and sent in a single email.

Mobile push notifications
~~~~~~~~~~~~~~~~~~~~~~~~~

Push notifications can be sent to your mobile device if you have the Android or iOS app installed. You can choose the type of activity that will send a notification.

By default, push notifications are sent **For mentions and direct messages**. If push notifications are sent **Never**, the Mattermost setting to trigger push notifications depending on your `Mattermost availability <https://docs.mattermost.com/welcome/set-your-status-availability.html>`__ is hidden. If your System Admin hasn't set up push notifications, this setting will be disabled.

If you're actively viewing a channel (public or private), direct message, or group message using the Desktop App or a browser, no push notifications will be sent for that channel. If a notification is viewed using the Desktop App or a browser, the lockscreen notification will clear on Android, and on iOS the badge on the Mattermost app icon will count down accordingly.

Browser tab notifications
~~~~~~~~~~~~~~~~~~~~~~~~~

If Mattermost is open in a browser tab, the favicon updates to notify you of unread messages (\*) and a count of mentions or direct messages. Browser tab notifications are available on Chrome, Edge, Firefox, and Safari.

.. image:: ../images/browser_notification.png

Trigger mobile push notifications when
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

You can also choose when to send push notifications depending on your Mattermost availability. By default, push notifications are sent if your availability is **Away** or **Offline**. If **Send Mobile Push Notifications** is set as **Never**, this setting is hidden. If your System Admin has not set up push notifications, this setting will be disabled.

Words that trigger mentions
~~~~~~~~~~~~~~~~~~~~~~~~~~~

By default, you receive notifications when someone posts a message that contains your non-case sensitive username or @username. You also receive notifications when someone uses the @channel, @all, and @here mentions. You can customize the words that trigger mentions by typing them into the input box. This is useful if you want to be notified of all posts on a certain topic, for example, "marketing".

Reply notifications
~~~~~~~~~~~~~~~~~~~

When `Collapsed Reply Threads <https://docs.mattermost.com/channels/organize-conversations.html>`__ is disabled, you can choose to receive mention notifications when someone replies to a thread you have started or have participated in.

- You're considered to start a thread when you post a message to which other members of your team reply.
- You're considered to be a participant in a thread when you post a message using the `reply button <https://docs.mattermost.com/channels/reply-to-messages.html>`__ in an pre-existing thread.

.. note::
  This setting is hidden when Collapsed Reply Threads is enabled.

Automatic direct message replies
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Set an automated custom message that will be sent once per day in response to direct messages. Mentions in public and private channels won't trigger the automated reply. Enabling Automatic Replies sets your availability to **Out of Office** and disables desktop, email, and push notifications. This setting is experimental and `must be enabled by your System Admin <https://docs.mattermost.com/configure/configuration-settings.html#enable-automatic-replies>`__.

Display
-------

Settings to configure clock and teammate name display preferences.

Theme
~~~~~

Select **Theme Colors** to select from four standard themes designed by the Mattermost team. To make custom adjustments on the four standard theme colours, select a standard theme and then select **Custom Theme** to load the standard theme into the custom theme color selectors.

Select **Custom Theme** to customize your theme colors and share them with others by copying and pasting theme vectors into the input box. Observe a live preview as you customize theme colors, then select **Save** to confirm your changes. Discard your changes by selecting **Cancel**, or by exiting the settings modal and selecting **Yes, Discard**.

In Enterprise edition, if you belong to multiple teams, you can optionally select the checkbox **Apply new theme to all my teams** to have the theme show up across teams. Otherwise, the changes will only apply to the current team.

Learn more about the custom theme color selectors `here <https://docs.mattermost.com/welcome/customize-your-theme.html>`__.

Select **Import theme colors from Slack** to import a Slack theme. In Slack, go to **Preferences > Sidebar Theme** and open the custom theme option. From there, copy the theme color vector and then paste it into the **Input Slack Theme** input box in Mattermost. Any theme settings that are not customizable in Slack will default to the “Sapphire” standard theme settings.

Clock display
~~~~~~~~~~~~~

Choose a 12-hour or 24-hour time preference that appears on the time stamp for all posts.

Teammate name display
~~~~~~~~~~~~~~~~~~~~~

Configure how names are displayed in the user interface: nickname, username, or full name. The default for this setting is dependent on the `configuration set by the System Admin <https://docs.mattermost.com/configure/configuration-settings.html#teammate-name-display>`__.

Show online availability on profile images
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Online availability icons display on user profile avatars in the center channel by default. Disable this setting to hide online availability icons within the center channel.

Timezone
~~~~~~~~~

Select the timezone used for timestamps in the user interface and for email notifications.

.. note::
  
  In Mattermost v5.38 or earlier, timezone functionality `must first be enabled by the System Admin <https://docs.mattermost.com/configure/deprecated-configuration-settings.html#timezone>`__. Timezone is enabled by default from Mattermost v6.0.

Website link previews
~~~~~~~~~~~~~~~~~~~~~

When available, the first web link in a message will show a preview of the website content below the message. This `setting must be enabled by your System Admin <https://docs.mattermost.com/configure/configuration-settings.html#enable-link-previews>`__.

Default appearance of image previews
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

When messages in Mattermost include images, an image preview can display directly below the message for image attachments, image link previews, and `in-line images <https://docs.mattermost.com/channels/format-messages.html#in-line-images>`__ over 100px in height. You can set this preference to **Expanded** or **Collapsed**.

.. tip::
  This setting can also be controlled using the slash commands ``/expand`` and ``/collapse``.

Message display
~~~~~~~~~~~~~~~

Specify how messages in a channel are displayed. **Compact** mode fits more messages on the screen by decreasing the spacing around posts, collapsing link previews, and hiding thumbnails so that only file names are shown. Some formatting types, such as block quotes and headings, are also reduced in size.

When you select **Compact**, usernames are colorized by default, and username colors are consistent for all users. Disable the **Colorize usernames** option to display all usernames in a single color instead.

Collapsed Reply Threads
~~~~~~~~~~~~~~~~~~~~~~~

Collapsed Reply Threads offers an enhanced experience for users communicating in threads and replying to messages. Collapsed Reply Threads are generally available in Mattermost Cloud and from self-hosted Mattermost v7.0, and are enabled by default for all new Mattermost deployments. 

Depending on how your System Admin has enabled **Collapsed Reply Threads** for your workspace, it may already be enabled for you, or you may be able to enable this feature for your account. See our `organize conversations using Collapsed Reply Threads <https://docs.mattermost.com/channels/organize-conversations.html>`__ documentation to learn more about working with Collapsed Reply Threads.

Select to open threads
~~~~~~~~~~~~~~~~~~~~~~~

By default, selecting any part of a message opens the reply thread in the right hand sidebar. You can disable this behavior in **Settings > Display > Click to open threads**. When disabled, reply to a message or select the replies count to open the reply thread.

Channel display
~~~~~~~~~~~~~~~

Choose whether the text in the center channel is fixed width and centered, or full width.

Quick reactions to messages
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

You can react to messages quickly with your most recently-used emojis by hovering over a message.

Language
~~~~~~~~

Select which language Mattermost displays in the user interface. Options include:

- Deutsch - German
- English (U.S.)
- English Australian
- Español - Spanish
- Français - French
- Italiano - Italian
- Magyar - Hungarian
- Nederlands - Dutch
- Polski - Polish
- Português (Brasil) - Portuguese
- Română - Romanian
- Svenska - Swedish
- Türkçe - Turkish
- български - Bulgarian
- Pусский - Russian
- Yкраїнська - Ukrainian
- فارسی - Persian
- 한국어 - Korean
- 中文 (简体) - Simplified Chinese
- 中文 (繁體) - Traditional Chinese
- 日本語 - Japanese

Sidebar
-------

The channel sidebar includes `enhanced sidebar features <https://docs.mattermost.com/channels/customize-your-channel-sidebar.html>`__, including custom, collapsible channel categories, drag and drop, unread filtering, channel sorting options, and more.

The following sidebar settings apply to your current sidebar only:

**Group unread channels separately**

This feature groups unread channels at the top of the channel sidebar in an **Unreads** category. System Admins can `set the default of this setting <https://docs.mattermost.com/configure/configuration-settings.html#group-unread-channels-experimental>`__ for you.

Legacy sidebar settings
~~~~~~~~~~~~~~~~~~~~~~~

The legacy sidebar `must be enabled by your System Admin <https://docs.mattermost.com/configure/configuration-settings.html#enable-legacy-sidebar>`__. The following sidebar settings apply only to the legacy sidebar:

Channel grouping
^^^^^^^^^^^^^^^^

Channels can be grouped by type (public, private, or direct message), or all channel types can be grouped in a single list.

Channel sorting
^^^^^^^^^^^^^^^

Channels can be sorted within their channel sidebar sections alphabetically (default) or by most recent message.

Channel switcher
^^^^^^^^^^^^^^^^

Hide the channel switcher used to jump between channels quickly. The channel switcher can also be accessed by pressing :kbd:`Ctrl` :kbd:`K` on Windows or Linux, or :kbd:`⌘` :kbd:`K` on Mac.

Autoclose direct messages
^^^^^^^^^^^^^^^^^^^^^^^^^

Hide direct message conversations that have been inactive for seven days. These conversations can be reopened using the **+** button in the channel sidebar, or by pressing :kbd:`Ctrl` :kbd:`K` on Windows or Linux, or :kbd:`⌘` :kbd:`K` on Mac, to open the Channel Switcher. This setting is experimental and `must be enabled by your System Admin <https://docs.mattermost.com/configure/deprecated-configuration-settings.html#autoclose-direct-messages-in-sidebar>`__.

Advanced
--------

Settings to configure when messages are sent.

Send messages on CTRL+ENTER
~~~~~~~~~~~~~~~~~~~~~~~~~~~

If **On for all messages** is enabled, pressing :kbd:`Enter` on Windows or Linux, or pressing :kbd:`↵` on Mac inserts a new line, and pressing :kbd:`Ctrl` :kbd:`Enter` on Windows or Linux, or :kbd:`⌘` :kbd:`↵` on Mac, posts a message. 

If **On only for code blacks starting with ```** is enabled, pressing :kbd:`Enter` on Windows or Linux, or pressing :kbd:`↵` on Mac inserts a new line inside an open code block, and pressing :kbd:`Ctrl` :kbd:`Enter` on Windows or Linux, or pressing :kbd:`↵` on Mac automatically closes the code block and posts the message. 

If disabled, pressing :kbd:`Shift` :kbd:`Enter` on Windows or Linux, or pressing :kbd:`⇧` :kbd:`↵` on Mac inserts a new line, and pressing :kbd:`Enter` on Windows or Linux, or pressing :kbd:`↵` on Mac posts the message.

Enable post formatting
~~~~~~~~~~~~~~~~~~~~~~

This setting controls whether post formatting is rendered. When **On**, posts will be rendered with `Markdown formatting <https://docs.mattermost.com/channels/format-messages.html>`__, emoji, autolinked URLs, and line breaks. When **Off**, the raw text will be shown.

.. note::

  From Mattermost v7.0, this setting has been deprecated in favor of the `message formatting toolbar <https://docs.mattermost.com/channels/format-messages.html#use-the-messaging-formatting-toolbar>`__.

Enable join/leave messages
~~~~~~~~~~~~~~~~~~~~~~~~~~

This setting controls whether system messages about users joining or leaving a channel are visible. When **On** these messages will appear. When **Off**, these messages will be hidden. If any users are added to or removed from a channel, a system message will still be shown even if this setting is **Off**.

Preview pre-release features
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Turn on preview features to view them early, ahead of their official release.

**Show markdown preview option in message input box** Turning this on will show a **Preview** option when typing in the text input box. Select **Preview** to see what the Markdown formatting in the message looks like before the message is sent.

.. note::

  From Mattermost v7.0, this setting has been deprecated in favor of the `message formatting toolbar <https://docs.mattermost.com/channels/format-messages.html#use-the-messaging-formatting-toolbar>`__.

Scroll position when viewing unread channels
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Configure where to start when viewing channels with unread messages. You can start where you left off at the oldest unread message, or start at the newest message. Your preference applies to all channels.

Performance debugging
~~~~~~~~~~~~~~~~~~~~~

Turn on settings intended to help isolate performance issues while debugging. We don't recommend leaving these settings enabled for an extended period of time as they can negatively impact your user experience. Available only when `client performance debugging <https://docs.mattermost.com/configure/configuration-settings.html>`__ is enabled.

Deactivate account
~~~~~~~~~~~~~~~~~~

Use this setting to deactivate your account. Deactivating your account removes your ability to log in to the Mattermost server and disables all email and mobile notifications. After deactivating, an email notification is sent confirming the deactivation was successful.

To reactivate your account, contact your System Admin. This is only available for accounts with email login, and when `user deactivation <https://docs.mattermost.com/configure/configuration-settings.html#enable-account-deactivation>`__ is enabled.

For accounts with other authentication methods such as AD/LDAP or SAML, or for accounts that do not have this setting available, contact your System Admin to deactivate your account.

Deprecated settings
-------------------

Notifications > Notification duration
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*Removed in June 16th, 2018 release*

In Mattermost v5.0 and later, desktop notifications will stay onscreen for five seconds when supported by the browser and operating system.

Display > Display font
~~~~~~~~~~~~~~~~~~~~~~

*Removed in July 16th, 2017 release*

Select what font is used.

source/channels/channel-types.rst METASEP
Channel types
=============

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

You'll find four types of channels in Mattermost: public channels, private channels, direct messages, and group messages.

Public channels
---------------

Public channels are open to everyone on a team and are identified with a |globe-icon| icon. New team members are automatically added to two public channels when they sign up: **Town Square** and **Off-Topic**. See the :doc:`Join and Leave Channels </channels/join-leave-channels>` documentation for details on discovering and joining other channels.

.. |globe-icon| image:: ../images/globe-icon.png
   :alt: A globe icon indicates a public channel.

Private channels
----------------

Private channels are for sensitive topics and are only visible to selected team members. Private channels are identified with a |lock-icon| icon. In Team Edition, any member of a private channel can add or remove other members from private channels, but in other Mattermost versions these permissions can be restricted to the Channel Admins and System Admins.

Channel members can choose to leave private channels at any time.

.. |lock-icon| image:: ../images/lock-icon.png
   :alt: A lock icon indicates a private channel.

Direct messages
---------------

Direct messages are channels for conversations between two people. You can also start a direct message with people on other teams when enabled by the System Admin. Only members of the conversation can see direct messages. 

Group messages
--------------

Group messages are channels for conversations among three or more people and up to seven people. You can also start a group message with people on other teams when enabled by the System Admin. Only members of the conversation can see group messages.

.. tip::

   Create a private channel to communicate with more than seven people. 

source/channels/channel-naming-conventions.rst METASEP
Channel naming conventions
==========================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

All organizations are different and have different communication needs. The importance of organizing your conversations increases as your user base grows. The following are ideas for how you might want to name, group, and structure your channels. If you change your mind about a channel's name, you can :doc:`rename it </channels/rename-channels>`. 

Basic structure
---------------

- Channel names appear in menus where users select which conversations to join.
- Channel names are unique.
- Channel names have a 64-character limit to ensure readability on both desktop and mobile devices.
- An additional 1024 characters are available for describing the channel's focus in the channel header and channel information pane.
- An additional 128 characters are available for a **Channel Purpose** that's visible in the channel header and the channel information pane.

Scope channel names
-------------------

It's natural to start with broadly defined channels and let them divide into narrower topics as discussions progress.

For example, you might begin with a general "Marketing" channel. As conversations progress, you might divide that channel into: "Marketing: Website", "Marketing: Social Media", "Marketing: General".

.. tip:: 

   Use colons to separate sections of channel names, rather than `` - `` or `` > `` which require more spaces to display.

As the organization grows, disciplines might split across business units, products and geographies, with channel names like "US: Marketing" and "UK: Marketing".

.. tip:: 
   
   If you need to shorten country names, use standard `2-letter country codes <https://www.nationsonline.org/oneworld/country_code_list.htm>`__.

You can combine the hierarchies, with formats like ``[SUB-TEAM]: [TOPIC]: [SUB-TOPIC]``. For example: ``US: Mrkt: Website`` and ``UK: Mrkt: Social Media``.

.. tip:: 
   
   Shorten words, particularly categories, by removing vowels, endings, and redundant letter sounds. Example: Turn "Marketing" into "Mrkt", and "Project" into "Prjt".

Good naming can take a team up to several thousand channels without significant confusion. Eventually every organization hits a limit and an additional team might need to be created on the server to accommodate the large number of channels. Keeping names clear and short lets users navigate large collections of channels quickly.

Here are different navigation options and types of channels to consider.

Navigate channels using the keyboard
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Keyboard shortcuts allow users to jump between channels. See the `keyboard shortcuts for Channels <https://docs.mattermost.com/channels/keyboard-shortcuts-for-channels.html>`__ documentation for all available keyboard shortcuts.

Topic channels
~~~~~~~~~~~~~~

Topics are broad categories for organizing discussions. Topics are similar to how a user might create a folder for organizing emails or documents. Examples: Recruiting, Interviews, Legal Reviews, Documentation.

Users can join and leave topic-based channels, as well as add colleagues to have topic-based discussions.

As teams get larger and the number of channels increase, you may start naming topics in a hierarchy to make them easier to find. Examples: Legal: Trademarks, Legal: Contracts, Legal: Licensing.

Meeting channels
~~~~~~~~~~~~~~~~

Meeting channels are often used to organize regular meetings. Members can add topics as messages to be discussed during the regular meeting time. Examples: Monday Sales Update, All Hands Meeting.

There are three built-in features to make meetings in Channels easier:

1. Numbered agenda items in title text

You can number and format messages as agenda items to discuss for the next meeting.

.. tip:: 
   
   Try pasting the following as an example in a channel designated for meetings::

	#### 1) Agenda item example
        #### Commentary about agenda item to be discussed.

2. Threaded messaging

On an agenda item message, you can select ``[...] > Reply`` to leave comments about an agenda item before or after a meeting to extended discussion.

3. Header links

When meeting remotely, add persistent links to your video or audio conferencing solution, like Zoom, Google Hangouts, or BlueJeans in the channel header. See our `documentation <https://docs.mattermost.com/channels/set-channel-preferences.html#channel-header>`__ to learn more about working with channel headers. 

When it's time to meet, your team can select the conference link to connect.

Sub-team channels
~~~~~~~~~~~~~~~~~

Sub-teams can include people from the same discipline, project teams, people with the same manager or other groups brought together for a shared purpose. Examples: Developers, Marketers, Offsite Organizing Committee, SusanK's Directs

As sub-teams grow beyond a manageable size for one channel, they can sub-divide. Examples: US: Developers, UK: Developers, SusanK's Directs, SusanK's Extended Directs.

Project channels
~~~~~~~~~~~~~~~~

Project channels discuss how groups of people come together to achieve specific outcomes. Examples: Logo Design, Localization, Product Launch.

Projects are often private channels rather than public channels and are used to organize a small team around a project brought up in a larger channel. The Project Channel is used to do detailed work, and updates are typically communicated back to larger channels.

Location channels
~~~~~~~~~~~~~~~~~~

If your teams are in different buildings, cities or regions, you can create Location channels to help people coordinate meetings and get-togethers. Examples: Building 10, Palo Alto, Toronto, Delaware.

This helps share announcements and discussions relevant to only those locations.

Data channels
~~~~~~~~~~~~~

Data channels allow automatic integration. Information like new or updated support tickets or bug reports, Twitter updates or mentions of your company name in the news can all be made available in channels your team chooses to monitor.  
There is a wide array of options. Examples: Bugs, Support Tickets, Twitter, News Mentions.
	
People might use these channels like a daily newspaper, reading about everything that's happened in the last day, while other configurations allow notifications to alert only when their username or certain key words are mentioned.

Channel naming examples
-----------------------

Here is an example of what a marketer's channels might look like in a small team:

CHANNELS

* Recruiting
* Interviews
* Marketing
* Sales
* All Hands Meeting
* Town Square
* Off-Topic

PRIVATE CHANNELS

* Website
* Twitter Marketing
* Logo Design

DIRECT MESSAGES

* [Sales People]
* [Marketers]
* [Recruiter]
* [Manager]

Here's an example of what a marketer's channels might look like if she was working in the Palo Alto, California office of a large enterprise, working on a product called "Pontoon":

CHANNELS

* Geo: PA: Recruiting
* Geo: PA: Interviews
* US: Mrkt: General
* US: Sales: West Coast
* US: All Hands
* Town Square
* Off-Topic

PRIVATE CHANNELS

* Pontoon: Mkrt: Website
* Pontoon: Mkrt: Twitter
* Pontoon: Mkrt: Logo Design

DIRECT MESSAGES

* [West Coast Sales People]
* [Marketing Peers]
* [Recruiter for PA office]
* [Manager]

source/channels/archive-unarchive-channels.rst METASEP
Archive and unarchive channels
==============================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Archive a channel
-----------------

Anyone can archive the public channels or private channels they belong to, unless the System Admin has restricted the permissions.
Select the channel name at the top of the center pane to access the drop-down menu, then select **Archive Channel**. 

When a channel is archived, it's removed from the user interface, but a copy exists on the server in case it's needed for audit reasons at a later stage. Because of this, the URL of a newly created channel can't be the same URL as an archived channel.

In addition to this, when a channel is archived, by default the contents can't be viewed, shared, or searched. If you want to be able to view or search the channel later, either:

1. Ask your System Admin to set ``ExperimentalViewArchivedChannels`` to ``true`` in ``config.json`` to allow users to view, share, and search for content of channels that have been archived; or
2. Leave the channel open, but post a message in the channel saying it's considered archived: such as ``# This channel is archived.``

.. note::
  
  System Admins can archive channels in the System Console without needing to be a channel member.

Unarchive a channel
-------------------

System Admins and Team Admins can unarchive public channels or private channels they belonged to when it was archived.
Search for the channel if required. Then, open the channel, select the channel name at the top of the center pane to access the drop-down menu and select **Unarchive Channel**. 

.. image:: ../images/unarchive-channel.png
    :alt: Unarchive a channel.

When a channel is unarchived, channel membership and all its content is restored, unless messages and files have been deleted based on the `data retention policy <https://docs.mattermost.com/configure/configuration-settings.html#data-retention-policies>`__.

Alternatively, System Admins can unarchive channels `via the CLI <https://docs.mattermost.com/manage/command-line-tools.html#mattermost-channel-restore>`__, or via the `mmctl <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-channel-unarchive>`__. Team Admins can unarchive channels `via the API <https://api.mattermost.com/#operation/RestoreChannel>`__.

source/boards/working-with-boards.rst METASEP
Working with boards
===================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Adding new Boards
-----------------

Using Boards begins with selecting the type of board you want to use. A board contains cards, which typically track tasks or topics, and views, which define how to display the cards, or a subset of them. Views can display cards in a board, table, or gallery layout, optionally filtered and grouped by a property (e.g., priority, status, etc).

* To add a new board, select **+ Add Board** in the bottom left corner of the screen. 
* To rename a board, select the title area to edit it.
* To display or edit the board description, hover over the board's name to activate the **show**/**hide** toggle.
* Boards and cards are created with random icons by default. To change or remove icons, select the icon then choose the appropriate action.

Select the headers to sort them or insert new properties.

All changes you make to boards and cards are saved immediately.

Changing views
--------------

You can change boards views to adjust how your cards are represented. To add a new view to a board, select the menu next to the current view name. Scroll down and select **+ Add view**, then select the new visualization you'd like to use.

Board view
~~~~~~~~~~

This is a vertical list view where cards are sorted by columns. The column names are editable and you can drag cards between columns.

Calendar view
~~~~~~~~~~~~~

To use this view, cards need to have the **Date** property added.

If cards don't have a custom **Date** property, they'll be sorted and displayed by the card creation date (default). These cards can't be moved around the board until a custom **Date** property is added.

.. note:: 
  
  If your cards do have a **Date** property and you're not able to move them around, you may be displaying them by **Created Time** or **Last Updated Time**.

* To add a new card, select the **+** option in the top-left corner of the relevant date.
* To create a date range event, select a start date and then drag to the end date to create a card for that date range event.
* To add a date range to an existing card, hover over the side of the card to display the arrow and drag to the left or right to create a date range.

Table view
~~~~~~~~~~

Each column corresponds to a card property. You can edit cells directly or you can select **Open** to open the card editor for that row. All changes you make to boards and cards are saved immediately.

For this exercise, select the **Project Tasks** template. The first view of the new board is a table of all tasks.

* Select **By Status** in the sidebar to see a board view.
* Select **Properties** and enable **Priority** and **Date created** to add those properties to the card display.
* You can also change the **Group By**, **Filter**, and **Sort** settings of the view.

Adding cards
------------

Select **New** to add a new card to a board.

Editing cards 
-------------

Select a card to edit it. A card consists of:

* **A set of properties:** Properties are common to all cards in a board. Board views can group cards by “Select” type properties into different columns.
* **A list of comments:** Comments are useful for noting important changes or milestones.
* **A set of content:** The content of a card can consist of markdown text and images. Use this to record detailed specs or design decisions for an item for example.

Press ESC or select **X** on the top left corner of a card to close it.

Dragging cards 
--------------

Drag cards from one column to another to change their group-by property. For example, drag a card to the **Completed** column to mark it as completed. When a board is unsorted, you can drag a card to a specific row in a column.

For sorted boards, dragging a card to a column will auto-sort it using the specified sort settings.

source/boards/work-with-cards.rst METASEP
Work with cards
===============

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Our templates provide some default card properties that can be customized or removed. In the Roadmap template, we include **Type** property, whereas in the Project Tasks template, we include an **Estimated Hours** property. These properties are not exclusive to any template and can be easily re-created in any of the templates provided.

Card descriptions
-----------------

Card descriptions can include text with Markdown formatting, checkboxes, and visual elements such as images or GIFs. These images and GIFs are also included in card import and export data.

Customize card properties
-------------------------

Cards can contain different data fields depending on the purpose of the board. For example, in a **Roadmap** board, cards include a **Type** field where you can add categories such as **Bug**, **Triage**, etc. In a **Task** board, cards include the **Estimated Hours** field instead.

Add and manage properties
-------------------------

To create a new property field open a card and select **Add a property**. Then select the type of property from the drop-down menu. The property type specifies the type of data you plan to capture within that field. When you create new card properties, they are added to all new and all existing cards on the current board.

Properties are automatically added to the board filter list at the top of the page, so ensure you customize all property names to make it easy to filter your board by specific properties later. To rename a property, open a card and select the property name to open an editable field. Your changes are saved immediately, and applied across all cards on the current board.

To delete properties you no longer need, select the property, then choose **Delete**. You'll be asked to confirm that you want to remove that property from every card on the current board.

Once you have card properties defined, you have full control over which properties are visible on the board. Select **Properties** at the top of the board, then enable all properties you want to see at a glance, and hide all properties you don't want to see.

Work with property types
~~~~~~~~~~~~~~~~~~~~~~~~

* **Checkboxes** are useful for agenda items that are regularly revisited in weekly sprint or grooming meetings.
* **Multi-select** allows you to create badges to indicate things like status.
* **Numbers** are useful to capture metrics such as task sizing or effort estimates.
* **Person** provides a quick way to capture user assignments. Note that this is not available in Personal Desktop.
* **URL** can be used to provide a link to a pull request or relevant website.
* **Created time/Created by/Last updated time/Last updated by** are good ways order tasks in order of recency.

Card badges
-----------

Card badges are a quick way to view card details without opening up a card. To add them, select **Properties > Comments and Description**. Icons related to the card description, comments, and checkboxes will be displayed on cards with the respective content. Open the card to view the details.

- The description icon indicates that a card has a text description.
- The comment icon displays a number indicating how many comments have been added to a card. When a new comment is added, that number is updated.
- The checkbox icon displays the number of items checked off relative to the total number of checkboxes within the card. When an item is checked off, the icon is automatically updated.

Rename a card property
----------------------

The default name for a new property is the name of the property type (e.g. **Date**, **URL**) and properties are automatically added to the filter list at the top of the board. You can use this to toggle which properties you see displayed on each card preview.

To rename a property field, open up a card and select the property name. Enter the new name in the field provided. The change is saved immediately and applied across all cards.

Mention people
--------------

You can include a team member on a card by `mentioning them on a card <https://docs.mattermost.com/channels/mention-people.html>`__ the same way you would in Channels. The team member you mention will receive a Direct Message notification from the Boards bot with a link to the card you mentioned them on. To mention multiple team members, separate each name with a comma.

Share card previews
-------------------

When you share a link to a card within Mattermost, the card details are automatically displayed in a preview. This preview highlights what the card is about at a glance without having to navigate to it.

Receive updates
---------------

When you create a card, you automatically follow it. You can @mention someone on a card to add them as a follower. This can be a card you've created or someone else's card. Lastly, you can also follow cards manually using the **Follow** option on the top-right corner of a card. To unfollow a card, select **Following**.

When updates are made to a card you're following, you'll receive a Direct Message from the boards bot with a summary of the change (e.g. Bob changed status from **In progress** to **Done**) and a link to the card for more detailed information.

.. note::

  You won't get a notification of your own changes made to a card, even if you're following that card.

Calculations
------------

When you view a board in table, Kanban, or Board view, you can use calculations to answer basic metric questions without needing to create complex reports. Hover over the bottom of a column to display the **Calculate** feature, then select the arrow to open the menu options.

You can use calculations to quickly see:

- How many story points are planned for a release.
- How many tasks have been assigned or not assigned.
- How long has the oldest bug been sitting in the backlog.
- The count of cards where particular properties are empty (useful to make sure important info isn’t missing).
- The sum of estimated developer days for features (to make sure your team isn’t overloaded).
- The range of estimated dates (to make sure your milestones all line up).

The calculation options are detailed below:

* **Count**: Counts the total number of rows in Table view or total number of cards in a column in Board view. Applies to any property type.
* **Count Empty**: Applies to any property type.
  
  - Table View: Counts the total number of empty rows per column selected.
  - Board View: Counts the total number of empty values per property specified within the same column.

* **Count Not Empty**: Applies to any property type.
 
  - Table View: Counts the total number of rows with non-empty cells per column selected.
  - Board View: Counts the total number of non-empty values per property specified within the same column.

* **Percent Empty**: Applies to any property type.

  - Table View: Percentage of empty rows per column selected.
  - Board View: Percentage of empty values per property specified within the same column.

* **Percent Not Empty**: Applies to any property type.

  - Table View: Percentage of rows with non-empty cells per column selected.
  - Board View: Percentage of non-empty values per property specified within the same column.

* **Count Value**: Applies to any property type.

  - Table View: Counts the total number of values within the column (helpful for multi-select properties).
  - Board View: Counts the total number of values per property specified within the same column.

* **Count Unique Values**: Applies to any property type.

  - Table View: Counts the total number of rows with unique values within the column, omitting any duplicates from the count.
  - Board View: Counts the total number of unique values per property specified within the same column, omitting any duplicates from the count.

* **Sum**: The sum of any specified number property within the same column.
* **Average**: The average of any specified number property within the same column.
* **Median**: The median of any specified number property within the same column.
* **Min**: The lowest number of any specified number property within the same column.
* **Max**: The highest number of any specified number property within the same column.
* **Range**: Displays the lowest and highest number. Requires a number property.
* **Earliest Date**: Displays the oldest date. Requires any custom date property or the included "Created time" or "Last updated time".
* **Latest Date**: Displays the most recent date. Requires any custom date property or the included "Created time" or "Last updated time".
* **Date Range**: The difference between the most recent date and oldest date within the same column. In Table View, it is labeled simply as "Range" for any date property/column. Requires any custom date property or the included "Created time" or "Last updated time".

source/boards/views-and-sorting.rst METASEP
View, sort, and filter
======================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

There are a number of ways you can visualize your boards and cards. The type of template you choose provides a set of view options.

You can organize cards and narrow your focus on key work items with our filter, sort, and grouping options. From the board header, you can quickly toggle on different properties to display, change the card grouping, apply filters, and adjust how the cards are sorted.

You can filter by multiple properties as well as multiple values within the same property. When filtering by multiple properties, **all conditions** that you've selected need to be true in order for the filtered results to display. For example, if you want to filter your view to only display cards associated with a **Status** of **Not Started** and a **Priority** of **High**, you would add both of them to that filter.

.. note:: 
   Groups and filters currently only support the `SELECT` property type.

When filtering by multiple values within the same property, **any condition** that you've selected can be true for the filtered results to display. For example, if you filter your view by **Priority** values of **High** and **Medium**, your board will display any cards with either of those property values.

Additionally, you can adjust whether you want to include or exclude specific values within a property, or only display properties with empty or populated results.

Lastly, you can combine views with filters to create unique display options without having to constantly reapply filters. Each view retains all the applied filters, groups, and sort options, allowing you to create multiple views with unique filters. For example, you can create a **By milestone** view under a board, and use a filter to only display items for specific milestones.

source/boards/templates.rst METASEP
Templates
=========

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Templates provide you with a predefined structure so that you can get started quickly. Alternatively, you can create your own board and card templates. When you create a new board, select each template's name to preview it and make sure it suits your requirements.

Board templates 
---------------

Standard board templates include:

* **Content Calendar**: Plan and organize your content creation and publication schedule.
* **Meeting Agenda**: Use this template for recurring meetings. Queue up items, organize discussions, and plan what to revisit later. 
* **Personal Goals**: Categorize and plan your personal goals.
* **Personal Tasks**: Organize your life and track your personal tasks.
* **Project Tasks**: Stay on top of your project tasks, track progress, and set priorities.
* **Roadmap**: Plan your roadmap and manage your releases more efficiently.

Editing board templates
~~~~~~~~~~~~~~~~~~~~~~~

You can rename all of the fields provided, hide them, delete them, and change the default color.

To create a custom board template select **+ Add Board**, then select **+ New template**. To turn an existing board into a template, hover over the board title in the sidebar. Select the options menu **(…)**, then select **New template from board**.

Create a new template
~~~~~~~~~~~~~~~~~~~~~

If none of the available templates suit your requirements, you can create your own using the **Empty Board** option. Note that boards (and templates) are channel-specific so whichever channel you create your board in, is where you'll find it.

Share a template
----------------

If you'd like to re-use a board as a template, you can export it and then import the archive file in the channel of your choosing.

To do this, select the **...** in the toolbar at the top of the board. Then select **Export board archive**. Download the archive file. Navigate to the channel where you'd like to add the exported board. Select the Gear icon next to your profile avatar, then choose **Import archive**. The board you created will be added to this channel.

Card templates
--------------

Each board can have a set of card templates. To create a new card template:

1. Open the board you're adding the card to.
2. Select the drop-down arrow next to **New**, then select **Empty card**.

Alternatively, you can turn any card into a template:

1. Open the card you want to use as a template.
2. Select the options menu **...** in the top-right corner of the card.
3. Select **New template from card**.
4. Edit the card as needed, including a helpful name.
5. Close the card using the **X** in the top left corner.
6. Select the drop-down arrow next to **New**, then select the card you just created.

The card template is applicable only to the board in which it's created and isn't available in other boards in your workspace.

source/boards/sharing-boards.rst METASEP
Sharing boards
==============

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

To share a board with others:

1. Go to **System Console > Mattermost Boards**.
2. Set **Enable Publicly-Shared Boards** to **true**.
3. Open a board in any view.
4. Select **Share board** in the top-right corner of the board.
5. The following two options are available:

   * On the **Share** tab, you can share an editable view link with users who have permissions to the board.
   * On the **Publish** tab, you can share a read-only link online with everyone.

6. Copy the link provided.

Anyone with the link will be able to view the board.

Select **Regenerate Token** if you want to invalidate all the previously shared links. Confirm the action to regenerate the token.

Import and export a board
-------------------------

If you'd like to re-use a board, you can export it as an archive file, and then import the archive file in the channel of your choosing. Exported and imported board archives include card image attachments.

To do this, select the **...** in the toolbar at the top of the board. Then select **Export board archive**. Download the archive file. Navigate to the channel where you'd like to add the exported board. Select the Gear icon next to your profile avatar, then choose **Import archive**. The board you created will be added to this channel.

From v6.4, the archive format is changing with a new ``.boardarchive`` extension and all new exports will only be in this format. 

.. note::

  The previous ``.focalboard`` format will be deprecated in a future release, but will support importing until then. Currently, the import dialog looks for ``.boardarchive``. Use **Select all files** to select ``.focalboard`` files to import.

source/boards/overview.rst METASEP
Overview
========

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Mattermost Boards provides tight integration between project management and Mattermost to align, define, organize, track, and manage work across teams, and is part of all Mattermost editions.

With Boards you can:

* **Manage projects and organize tasks:** A familiar kanban board structure integrated with channel-based communication.
* **Manage and collaborate on various projects:** Software releases, product launches, meetings, personal to-do’s, events, etc.
* **Stay on schedule:** Clearly-defined tasks, owners, checklists, and deadlines
* **Increase transparency and keep everybody in the loop:** Everything your team needs in one place, including documents, images, and links that are visible to every stakeholder

Boards is also available as a separate single-user Personal Edition called Focalboard.

source/boards/getting-started.rst METASEP
Getting started
===============

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Mattermost Boards (formerly known as Focalboard) is accessible from the Product menu in the top left corner of Mattermost.

.. tabs::
   
  .. tab:: Mattermost v6.0 onwards
   
      If you're using Mattermost 6.0, select the Product menu in the top left corner of Mattermost to activate Boards. The Boards dashboard is where you can get
      started, where you'll find all the boards you have access to, and also where you can navigate between workspaces. Once you've activated Boards, you'll see a tab at the top of Mattermost called **Boards**. Select that for quick access to your dashboard.
  
  .. tab:: Mattermost v5.39 and earlier

      For self-hosted deployments using versions 5.38 and earlier, Boards is available in the Marketplace.

      1. As a System Admin, go to **Main Menu > Marketplace**.
      2. Search for **Boards**.
      3. Select **Install** if not yet installed, then select **Configure** to enable.
      4. From the plugin configuration page, set **Enable Plugin** to **true**.
      5. Select **Save** to enable the plugin.

Configuration
-------------

Board sharing is disabled by default. This means that the "Share Board" option is not available in the board menu. To enable board sharing open **Product menu > System Console > Plugins > Boards**.

source/boards/get-started-with-boards.rst METASEP
Get Started with Mattermost Boards
==================================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Access Mattermost Boards by selecting **Boards** from the **Product menu** |product-list| icon.

.. |product-list| image:: ../images/products_E82F.svg
  :height: 24px
  :width: 24px
  :alt: Navigate between Channels, Playbooks, and Boards using the Product list icon.

Boards are used for planning projects collaboratively. You can access the list of channels and their boards from the drop-down menu in the left-hand sidebar. Boards are made up of cards, and cards can have a wide range of purposes.

See our `Mattermost Boards <https://docs.mattermost.com/guides/boards.html>`__ documentation for details on the many ways you can use Boards to enable team collaboration.

Create a board
--------------

When you first start using Boards, you need to create a board. You can select a template from the options provided or you can create an empty board. The only difference is that a template will be populated with sample cards, properties, and views, and in an empty template you start from scratch.

To find a board, open Boards and select the drop-down menu in the sidebar. You can search for a workspace or browse through all existing workspaces. Each workspace is linked to the channel it was created in. This includes direct messages and group messages.

See the `Working with Boards <https://docs.mattermost.com/boards/working-with-boards.html>`_ and `templates <https://docs.mattermost.com/boards/templates.html>`_ documentation for more information.

Create a card
-------------

Cards are like sticky notes. You can arrange them in various ways, using different views. You can also give them multiple areas of information called properties. Adding and using properties makes it easier to organize and find cards using filters based on card properties.

Once you've chosen a board template, you'll find pre-populated cards. You can use and edit those, or create new ones. Use the **Description** field to add details, and you can use Markdown to add formatting. You can add comments to a card in the **Comments** section.

Select an existing card to open it or create a new card.

See the `Work with Cards documentation <https://docs.mattermost.com/boards/work-with-cards.html>`_ for more information about working with cards.

Description
-----------

Use the description to provide context around the reason for the card. Cards are visible to anyone who can access the board, so if there's sensitive information it's best not to include it here. You can add links to external documentation, as well as at-mention teammates.

Comments
--------

Comments are a helpful way to provide feedback or ask questions related to a card, and comments are time and date stamped so they're easy to track. Comments are listed in descending order from most recent to oldest.

To add a comment, select the **Comment** field. When you're finished, select **Save**.

Properties
----------

You can create properties for your cards that suit the way you're using them. If you're planning a project, you might want to have properties such as **Due date**, **Assigned to**, and **Priority**. Properties are displayed on the card when you open it, and you can also choose to display your cards based on their properties, using filters.

Properties can be renamed and deleted.

See the `Properties <https://docs.mattermost.com/boards/work-with-cards.html#add-and-manage-properties>`_ documentation for more information.

Views
-----

View are a great way to assess your board from various angles and allow your team to visualize the same cards and data from different perspectives, so they can stay up-to-date in the way that works best for them. Some views are linear, while others are closer to Kanban style. Views with a more linear display, such as the table view, display less context but are easier to scroll through. 

To add a new view, go to **Add a new view** from the view drop-down, then select from any of the following views:

- **Board**: Adds a Kanban board that allows your team to organize cards in swim lanes grouped by any property of your choosing. This view helps you visualize your project progress.
- **Table**: Displays cards in a table format with rows and columns. Use this view to get an overview of all your project tasks. Easily view and compare the state of all properties across all cards without needing to open individual cards.
- **Gallery**: Displays cards in a gallery format, so you can manage and organize cards with image attachments.
- **Calendar**: Adds a calendar view to easily visualize your cards by dates and keep track of deadlines.

See the `Working with Views <https://docs.mattermost.com/boards/working-with-boards.html#changing-views>`__ documentation for more information.

Filters and sorting
-------------------

You can organize and find the cards you're looking for with our filter, sort, and grouping options. From the Board header, you can quickly toggle on different properties, change the group display, set filters, and change how the cards are sorted. Combine views with filters to make unique boards for specific items. For example, you can create a **By milestone** board and then use a filter to only display items for specific milestones.

Share
-----

Once you've created a board and cards, you can generate a link which can be shared publicly or within only your team. To share a board, select **Share** at the top right of the Board view. Copy the link to share the board internally with your team or generate public link that can be accessed by anyone externally.

source/boards/data-and-archives.rst METASEP
Import your data
================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

You can import data from other tools to use with Boards. `Contribute code <https://mattermost.github.io/focalboard/>`_ to expand this.

Import from Asana
-----------------

This node app converts an Asana JSON archive into a ``.boardarchive`` file.

1. Log into your Asana account.
2. Select the drop-down menu next to the Asana board's name. Then select **Export/Print > JSON**. This will create an archive file which you'll use in Boards.
3. Save the file locally, e.g. to ``asana.json``.
4. Open a terminal window on your local machine and navigate to ``focalboard/webapp``.
5. Run ``npm install``.
6. Change directory to ``focalboard/import/asana``.
7. Run ``npm install``.
8. From within the same folder, run ``npx ts-node importAsana.ts -i <asana.json> -o archive.boardarchive``. This generates the following data:

.. code-block::
   
    My-MacbookPro:asana macbook$ npx ts-node importAsana.ts -i ~/Downloads/asana.json -o archive.boardarchive
    Board: 1:1 Meeting Agenda Test
    Card: [READ ME] Instructions for using this project
    Card: [EXAMPLE TASK] Feedback on design team presentation
    Card: [EXAMPLE TASK] Finalize monthly staffing plan
    Card: [EXAMPLE TASK] Review Q2 launch video outline
    Card: [EXAMPLE TASK] Mentor a peer
    
    Found 5 card(s).
    Exported to archive.boardarchive

9. In Boards, open the board you want to use for the export.
10. Select **Settings > Import archive** and select ``archive.boardarchive``.
11. Select **Upload**.
12. Return to your board and confirm that your Asana data is now displaying.

If you don't see your Asana data, an the error should be displayed. You can also check log files for errors.

Import scope
^^^^^^^^^^^^

Currently, the script imports all cards from a single board, including their section (column) membership, names, and notes.

Import from Notion
------------------

This node app converts a Notion CSV and markdown export into a ``.boardarchive`` file.

1. From a Notion Board, open the **...** menu at the top right corner of the board.
2. Select `Export` and pick `Markdown & CSV` as the export format.
3. Save the generated file locally, and unzip the folder.
4. Open a terminal window on your local machine and navigate to ``focalboard/webapp``.
5. Run ``npm install``.
6. Change directory to ``focalboard/import/notion``.
7. Run ``npm install``.
8. From within the same folder, run ``npx ts-node importNotion.ts -i <path to the notion-export folder> -o archive.boardarchive``.
9. In Boards, open the board you want to use for the export.
10. Select **Settings > Import archive** and select ``archive.boardarchive``.
11. Select **Upload**.
12. Return to your board and confirm that your Notion data is now displaying.

Import scope
^^^^^^^^^^^^

Currently, the script imports all cards from a single board, including their properties and markdown content.

The Notion export format does not preserve property types, so the script currently imports all card properties as a Select type. You can change the type after importing into Focalboard.

Import from Jira
----------------

This node app converts a Jira ``.XML`` export into a ``.boardarchive`` file.

1. Open Jira advanced search, and search for all the items to export.
2. Select **Export > Export XML**.
3. Save the generated file locally, e.g. to ``jira_export.xml``.
4. Open a terminal window on your local machine and navigate to ``focalboard/webapp``.
5. Run ``npm install``.
6. Change directory to ``focalboard/import/jira`.
7. Run ``npm install``.
8. From within the same folder, run ``npx ts-node importJira.ts -i <path-to-jira.xml> -o archive.boardarchive``.
9. In Boards, open the board you want to use for the export.
10. Select **Settings > Import archive** and select ``archive.boardarchive``.
11. Select **Upload**.
12. Return to your board and confirm that your Jira data is now displaying.

Import scope and known limitations
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Currently, the script imports each item as a card into a single board. Note that Jira ``.XML`` export is limited to 1000 issues at a time.

Users are imported as Select properties, with the name of the user.

The following aren't currently imported:

* Custom properties
* Comments
* Embedded files

Import from Trello
------------------

This node app converts a Trello ``.json`` archive into a ``.boardarchive`` file.

1. From the Trello Board Menu, select **...Show Menu**.
2. Select **More > Print and Export > Export to JSON**.
3. Save the generated file locally, e.g. to ``trello.json``.
4. Open a terminal window on your local machine and navigate to ``focalboard/webapp``.
5. Run ``npm install``.
6. Change directory to ``focalboard/import/trello``.
7. Run ``npm install``.
8. From within the same folder, run ``npx ts-node importTrello.ts -i <path-to-trello.json> -o archive.boardarchive``.
9. In Boards, open the board you want to use for the export.
10. Select **Settings > Import archive** and select ``archive.boardarchive``.
11. Select **Upload**.
12. Return to your board and confirm that your Trello data is now displaying.

Import scope
^^^^^^^^^^^^

Currently, the script imports all cards from a single board, including their list (column) membership, names, and descriptions.

Import from Todoist
-------------------

This node app converts a Todoist ``.json`` archive into a ``.boardarchive`` file.

1. Visit the open source Todoist data export service at https://darekkay.com/todoist-export/.
2. From the **Options** menu, select **Export As > JSON (all data)**.
3. Uncheck the **Archived** option if checked.
4. Select **Authorize and Backup**. This will take you to your Todoist account. Follow the instructions on screen.
5. Note the name and location of the downloaded ``.json`` file.
6. Open a terminal window on your local machine and navigate to ``focalboard/webapp``.
7. Run ``npm install``.
8. Change directory to ``focalboard/import/todoist``.
9. Run ``npm install``.
10. From within the same folder, run ``npx ts-node importTodoist.ts -i <path-to-todoist.json> -o archive.boardarchive``.
11. In Boards, open the board you want to use for the export.
12. Select **Settings > Import archive** and select ``archive.boardarchive``.
13. Select **Upload**.
14. Return to your board and confirm that your Todoist data is now displaying.

source/boards/accessing-boards.rst METASEP
Access your boards
==================

.. include:: ../_static/badges/allplans-cloud-selfhosted.rst
  :start-after: :nosearch:

Select **Boards** from the **product menu** |product-list| in the top-left corner of Mattermost to access all your boards as well as boards in channels you belong to.

.. |product-list| image:: ../images/products_E82F.svg
  :height: 24px
  :width: 24px
  :alt: Navigate between Channels, Playbooks, and Boards using the Product list icon.

Boards uses channel-based permissions, meaning that all members of the associated channel can access (read/write) the boards for that channel.

To create private boards: 

1. Create or join a private channel, group message, or direct message.
2. Select the **Boards** icon in the channel header.
3. Create a board.

You can share a read-only version of any board with anyone who has the link.

source/archive/zoom.rst METASEP
:nosearch:

Zoom plugin
============

This page has moved.  Please see the Documentation page for the Zoom Plugin `here <https://github.com/mattermost/mattermost-plugin-zoom/blob/master/README.md>`_.

source/archive/zapier.rst METASEP
:nosearch:

Zapier integration
===================

`Zapier <https://zapier.com/>`__ is a service that automates tasks between web apps. You can create "zaps" that contain a trigger and an action for a task that you want to perform repeatedly. Zapier regularly checks your trigger for new data and automatically performs the action for you.

Using Zapier you can integrate over 700 apps into Mattermost, including `Email <https://zapier.com/zapbook/email-parser/>`__, `GitHub <https://zapier.com/zapbook/github/>`__, `Jira <https://zapier.com/zapbook/jira/>`__, `Wufoo <https://zapier.com/zapbook/wufoo/>`__, `Salesforce <https://zapier.com/zapbook/salesforce/>`__, `Twitter <https://zapier.com/zapbook/twitter/>`__, `Gmail <https://zapier.com/zapbook/gmail/>`__ and `many more <https://zapier.com/zapbook/>`__.

This documentation includes:

- `Zapier Setup Guide <https://docs.mattermost.com/integrations/zapier.html#id1>`__: Instructions on registering the Zapier app on your server and creating a zap.
- `Message Formatting Tips <https://docs.mattermost.com/integrations/zapier.html#id6>`__: Tips from the Mattermost team on formatting Zapier integration messages.
- `Troubleshooting Guide <https://docs.mattermost.com/integrations/zapier.html#id8>`__: Advice on troubleshooting common setup issues.

Zapier setup guide
-------------------

Zapier is authorized using OAuth2.0. The setup guide requires that a System Admin register the Zapier app on their Mattermost server and can then optionally allow any users with a Zapier account to create integrations.

Enable Zapier on your Mattermost instance
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The first time you set up Zapier on your Mattermost instance you will be required to enable an OAuth 2.0 application which can be used by everyone on your server. Your System Admin must execute these steps.

To learn more about OAuth 2.0 applications, including what permissions they have access to, see the `OAuth 2.0 documentation <https://docs.mattermost.com/developer/oauth-2-0-applications.html>`__.

Enable OAuth 2.0
^^^^^^^^^^^^^^^^

1. Open **Main Menu > System Console**.
2. Under **Integrations > Integration Management** (or **Integrations > Custom Integrations** in versions prior to 5.12):

  a. Set `Enable OAuth 2.0 Service Provider <https://docs.mattermost.com/administration/config-settings.html#enable-oauth-2-0-service-provider>`__ to **True**.
  b. If you’d like to allow Zapier integrations to post with customizable usernames and profile pictures, then set `Enable integrations to override usernames <https://docs.mattermost.com/administration/config-settings.html#enable-integrations-to-override-usernames>`__ and `Enable integrations to override profile picture icons <https://docs.mattermost.com/administration/config-settings.html#enable-integrations-to-override-profile-picture-iconss>`__ to **True**.

Register Zapier as an OAuth 2.0 application
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

1. Go to **Main Menu** > **Integrations**.
2. Select **OAuth 2.0 Applications > Add OAuth 2.0 Application** and enter the following fields:

  a. **Is Trusted**: No
  b. **Display Name**: ``Zapier``
  c. **Description**: ``Application for Zapier integrations``
  d. **Homepage**: ``https://zapier.com/``
  e. **Icon URL**: ``https://cdn.zapier.com/zapier/images/logos/zapier-logomark.png``
  f. **Callback URLs**: ``https://zapier.com/dashboard/auth/oauth/return/MattermostDevAPI/``

3. Click **Save** to create the application.

You'll be provided with a **Client ID** and **Client Secret**. Save these values, or share them with your team to connect Zapier in the steps below.

.. image:: ../images/zapier-oauth.png

Create a zap
~~~~~~~~~~~~~

1. `Sign up <https://zapier.com/sign-up/>`__ for a free Zapier account or `log in <https://zapier.com/app/login>`__ if you already have one.
2. On your `Zapier dashboard <https://zapier.com/app/dashboard>`__ click **Make a Zap!**.
3. **Trigger App**: Events in this app will trigger new messages in Mattermost.

  a. **Select a Trigger App**. This will trigger new messages in Mattermost. If the app you’re looking to connect isn’t supported on Zapier, consider firing in-app events to a Gmail account and then connecting Gmail to Mattermost using Zapier.
  b. **Select the Trigger Event**. New messages in Mattermost will fire depending on these selected events in conjunction with any filters you apply.
  c. **Connect the Trigger Account**. Connect the account from which you’d like to trigger events and **Test** it to ensure Zapier can connect successfully.

4. **Filtering** (Optional): Exclude certain events from triggering new messages. Learn more about using `Zapier custom filtering <https://zapier.com/learn/how-to-use-zapier/custom-filters/>`__.

  a. Add a filter by clicking the small **+** icon before the **Action** step.
  b. Zapier supports **AND** and **OR** filters. Use the dropdown selectors to choose what events will allow the trigger to send a Mattermost message.

5. **Mattermost Action**: Connect your Mattermost Account and then specify posting details.

  a. **Select the Action App**. Search for “Mattermost”.
  b. **Select the Action Event**. Select **Post a Message**. The Mattermost team plans to expand the actions available here.
  c. **Connect the Action Account**. Click **Connect a New Account** and enter the following fields:

    1. **Mattermost URL**: This is the URL you use to access your Mattermost site. Don't include a slash at the end of the URL and don't append a team to the end of the server URL. For example, ``https://community.mattermost.com/core`` is the entire URL to the Contributors team on our community server. The **Mattermost URL** entered here would be ``https://community.mattermost.com``.
    2. **Client ID/Secret**: If Zapier has been enabled as an OAuth application as per the steps above, then these values can be found by navigating to one of your Mattermost teams, then **Main Menu > Integrations > OAuth 2.0 Applications**. Click **Show Secret** next to the Zapier app, then obtain the Client ID and Client Secret.
    3. **Log in to Mattermost**. After completing the above fields you will be prompted to log in to your Mattermost account if you're not logged in already. If you’re having trouble connecting then please read our `troubleshooting guide <https://docs.mattermost.com/integrations/zapier.html#id6>`__.
    4. You'll then be prompted to allow Zapier to access your Mattermost account. Click **Allow**.

  d. **Message Post Details**: Specify the formatting of the messages and the team/channel where messages will be posted.

    1. **Team**: Choose the team where new messages will post. The dropdown should contain all teams you have access to on Mattermost.
    2. **Channel**: Choose the channel where new messages will post. The dropdown contains all channels that you belong to. Zapier cannot post into Direct Message channels.
    3. **Message Text**: Enter the message text that will post to Mattermost. This text can be formatted using `Markdown <https://docs.mattermost.com/help/messaging/formatting-text.html>`__ and include the dynamic fields offered by your selected trigger app. Read our `message formatting tips <https://docs.mattermost.com/integrations/zapier.html#id4>`__ below.

      .. image:: ../images/zapier-dynamic-fields.png

    4. **Username**: This is the username that Zapier will post as. Zapier integrations will always appear with a ``BOT`` tag next to the username. In order for bots to override the username of the authorized user, your System Admin must set `Enable integrations to override usernames <https://docs.mattermost.com/administration/config-settings.html#enable-integrations-to-override-usernames>`__ to **True**.
    5. **Icon URL**: This is the profile picture of the bot that Zapier will post as. In order for bots to override the profile picture of the authorized user, your System Admin must set `Enable integrations to override profile picture icons <https://docs.mattermost.com/administration/config-settings.html#enable-integrations-to-override-profile-picture-iconss>`__ to **True**.

  e. **Test the Zap**: You may want to test your zap formatting in a Private Channel before posting in a channel that is visible to your entire team.

Message formatting tips
-----------------------

Here are some useful tips we recommend to get the most out of Zapier integration:

- **Markdown:** Mattermost supports the use of `Markdown. <https://docs.mattermost.com/help/messaging/formatting-text.html>`__ in Zapier integrations. For example, use `heading markdown <https://docs.mattermost.com/help/messaging/formatting-text.html#headings>`__ for Jira issue titles.
- **Custom Icons:** Use different icons for different services and Zapier integrations.
- **Hashtags:** Use hashtags to make your Zapier posts searchable. Use different hashtags for different services and Zapier integrations. For example, use the dynamic fields available in Zapier to include ticket a Jira ticket number in hashtags. This makes all conversation on a specific ticket instantly searchable by clicking the hashtag.
- **Quick Links:** Link back to the service that fired the zap through the use of Markdown `embedded links <https://docs.mattermost.com/help/messaging/formatting-text.html#links>`__. For example, in our zaps we embed a link back to the service within the timestamp so it’s easy to take action on any zap.

Examples
~~~~~~~~

The Mattermost team has over 50 zaps integrated on our `Community Contributors team <https://community.mattermost.com/core/>`__ used for internal communication and interacting with contributors. The `Community Heartbeat channel <https://community.mattermost.com/core/channels/community-heartbeat>`__ integrates all our community services in one accessible location. These zaps are formatted in two ways depending on the service:

**GitHub Issues and Comments, UserVoice Suggestions and Comments, GitLab MM Issues, GitLab Omnibus MM Issues**

.. code::

    #### [Title of issue]

    #[searchable-hashtag] in [external service](link to service) by [author](link to author profile) on [time-stamp](link to specific issue or comment)

    [Body of issue or comment]

.. image:: ../images/zapier-ch1.png

**Forum Posts, Jira Comments, Hacker News Mentions, Tweets**

.. code::

     > [forum post, media mention, or tweet]

     #[searchable-hashtag] in [external service](link to service) by [author](link to author profile) on [time-stamp](link to specific forum post, media mention or tweet)

.. image:: ../images/zapier-ch2.png

Troubleshooting guide
---------------------

Possible solutions to common issues encountered during setup.

Cannot connect a Mattermost account
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. ``"Token named access_token was not found in oauth response!"``

  a. Possible Solution: Try removing any trailing ``/``'s on the end of your **Mattermost URL**.

    - Correct: ``https://community.mattermost.com``
    - Incorrect: ``https://community.mattermost.com/``

    .. image:: ../images/zapier-error1.png

2. ``"[Server URL] returned (404)"``

  a. Possible Solution: The **Mattermost URL** cannot have a team appended to the end of the server URL.

    - Correct: ``https://community.mattermost.com``
    - Incorrect: ``https://community.mattermost.com/core``

  .. image:: ../images/zapier-error2.png

3. ``"[Server URL] returned (500) Internal Server Error"``

  a. Possible Solution: The **Client Secret** might be incorrect. Verify this value in **Main Menu > Integrations > OAuth 2.0 Applications**, or check with your System Admin.

  .. image:: ../images/zapier-error4.png

4. ``"Error Invalid client id"``

  a. Possible Solution: The **Client ID** and/or **Client Secret** might have trailing spaces in them when copied and pasted into the form. Verify there are no trailing spaces in the **Client ID** and **Client Secret** fields then try again.

  .. image:: ../images/zapier-trailing-space-error.png

5. ``"Mattermost needs your help: We couldn't find the requested app"``

  a. Possible Solution: The **Client ID** might be incorrect. Verify this value in **Main Menu > Integrations > OAuth 2.0 Applications**, or check with your System Admin.

  .. image:: ../images/zapier-error3.png

Deauthorize the Zapier app
~~~~~~~~~~~~~~~~~~~~~~~~~~~

If you'd like to deauthorize Zapier so it can no longer post through your connected account, go to **Account Settings > Security > OAuth 2.0 Applications**, then click **Deauthorize** on the Zapier app.

.. image:: ../images/zapier-deauthorize.png

source/archive/working-at-mattermost.rst METASEP
:nosearch:

=====================
Working at Mattermost
=====================

The mission of Mattermost, Inc. is to give all organizations the power to achieve their highest priorities through modern communication. Our vision is a world more connected to what matters most.

- Our company maintains the Mattermost open source project, providing powerful, easy-to-use, self-hosted team communication across web, PC and phones. 

- We also provide Mattermost Enterprise Edition, a secure, modern, enterprise messaging solution as a fully supported commercial extension of our open source software. 

While our headquarters is in Palo Alto, California, we use Mattermost software to work as a distributed organization around the world in partnership with our community.

Top 10 reasons to work for Mattermost:

1. **Join an outstanding team:** Work with thoughtful, talented, high performance people who care about results.
2. **Build on the cutting edge:** Develop in Golang, React, React Native and other technologies changing the world.
3. **Work anywhere:** No commute, freedom to travel, complete control of your environment.
4. **Be recognized:** Working in open source, your contributions are public and echo on throughout your career. 
5. **Growth:** Join a growing open source project, a growing business, and a growing company.
6. **Do good:** Build open source software benefiting thousands of companies, institutions, schools and non-profits.
7. **Improve a product you use every day:** Work on a team with deep empathy for users and customers.
8. **Focus on results:** Output matters, not hours worked. Enjoy life and don't burn out.
9. **Learn, Master, Teach:** Building new skills, becoming experts, and training others is core to our culture.
10. **Friends around the world:** Build relationships with staff and contributors in dozens of countries.

----------------------------------------------------------
Work Anywhere 
----------------------------------------------------------

We're headquartered in Palo Alto, California, and like many open source companies a large portion of Mattermost, Inc. works from anywhere in the world.

This gives us tremendous advantages:

1. **Access to top talent.** We can hire from anywhere.
2. **More comfort.** People have 100% control of their surroundings.
3. **No commute.** Removing a 30-60 minute commute saves 250-500 hours a year.
4. **Time zone coverage.** We can more easily support global customers.
5. **Results-focused culture.** Output matters more than hours at a desk.

Also, we have Meetups around the world to deepen and broaden our relationships and build the future of our products together:

* Take a look at the  `MatterCon 2019 (held in Punta Cana, Dominican Republic) video <https://youtu.be/pMySvCfy7Bw>`_. 
* Check out `MatterCon 2018 in Lisbon, Portugal <https://www.youtube.com/watch?v=CZXaYttz3NA&feature=youtu.be>`__.
* Watch highlights of `our Community Meetup in Toronto, Canada <https://www.youtube.com/watch?v=5c9oJdbXrMU>`__.
* See `our Core Commiter Summit in Las Vegas, Nevada, USA <https://www.youtube.com/watch?v=_RpmrM-5UFY>`__.

We run as a distributed, high performance team using a few principles:

1) Work Anywhere with Good Internet
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Working from anywhere means more time with loved ones, no commute and controlling everything about your workspace. 

The one requirement is having the ability to occasionally `join video calls using Zoom <https://support.zoom.us/hc/en-us/articles/201362023-System-Requirements-for-PC-Mac-and-Linux>`__ between 8am and 1pm California time, which requires a good enough internet connection.

Recommended download/upload speeds should be 8 Mbps/512 kbps for smooth group calling and screensharing, with a bare minimum of 4 Mbps/128 kbps. The `CRS Video Conference Bandwidth Speed Tool <http://speed.conferenceroomsystems.com/>`__ can be used to check your internet speed.

There are exceptions to this requirement, for example: part-time roles that don't need to take meetings, or roles providing support outside core meeting hours.

2) Be Explicit
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Working in a distributed organization means it may take time before a person reads your message and responds, so make sure you are clear. 

Communicate relevant information in the first message:

- Avoid "Are you free to talk?" and "`Can we talk about something at 3pm? <https://www.nytimes.com/2015/08/16/jobs/when-youre-in-charge-your-whisper-may-feel-like-a-shout.html?_r=0>`__", instead use "Can we speak about ulimit issue Customer X is having?"

Write unambiguously:

- Avoid "I think the answer is Yes", instead use "Yes", "No", or "I think the answer is Yes, I'll confirm with Steve and let you know."

Likewise, we emphasize written communication. Reading is faster than listening and it reaches more people, which means more happens in less time.

3) Follow Through
~~~~~~~~~~~~~~~~~
When working on problems, make sure to be clear about next steps, and either follow through or create a ticket to track the work.

4) Hang Out
~~~~~~~~~~~
We have `warm-ups <https://docs.mattermost.com/process/training.html#warm-ups>`__ in some meetings to learn more about each other. It's part of a culture where we get to know each other.

Find time after meetings and video conferences to get to know your teammates. Ask them about their weekends and how their life is outside of work.

When you meet in person at off-sites and events, build on those relationships.

5) Be the Change You Want to See
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
When something's not clearly documented, take the initiative to figure out what's going on and update the documentation for the people who come after you.

`Learn, Master, Teach <https://docs.mattermost.com/process/training.html#learn-master-teach>`__ is a model we use to pass on training after you've been trained to help grow everyone at the company.


-------------
Paid Time Off
-------------

1) Time Off
~~~~~~~~~~~

Our culture is high trust and results-focused. We want people to take time away to relax, think and come back energized. 

When you take time off, please remember:

a) Discuss with your manager the dates you plan to take off, and decide who will be your backup.

b) For meetings you'll miss, message the chair with any status updates.

c) Post in the `Stand-up channel <https://community.mattermost.com/private-core/channels/stand-up>`__ the dates you'll be away and who'll be your backup. 

d) Block off time in the shared `Mattermost Timeoff calendar <https://calendar.google.com/calendar/embed?src=mattermost.com_mg3nulgf6e70e50ohlq2rrkcnc%40group.calendar.google.com&ctz=America%2FLos_Angeles>`__, so it's easy for the team to see who is going to be away.

There is no limit to how much time-off you can take when your work is meeting or exceeding expectations. We strongly recommend a minimum of 2 weeks per year.

2) Holidays
~~~~~~~~~~~

Please take off holidays relevant to your culture, region/country and preferences. When doing so, please follow the time off process in 1) above.

We're headquartered in the US and have a large Canadian contingent, so below are holidays we're expecting people from those countries to take off:

US and Canadian Holidays for 2020:

- New Year's Day (1/1/2020)
- US MLK Jr. Day (1/20/2020)
- Canadian Family Day and US Presidents' Day (2/17/2020)
- US and Canadian Good Friday (4/10/2020)
- Canadian Victoria Day (5/18/2020)
- US Memorial Day (5/25/2020)
- Canada Day (7/1/2020)
- Canada Day additional statutory holiday (7/2/2020)
- US Independence Day (7/4/2020+)
- Canadian Civic / Provincial Day (8/3/2020)
- US Labor Day, Canadian Labour Day (9/7/2020)
- Canadian Thanksgiving (10/12/2020)
- US Thanksgiving (11/26/2020)
- US and Canadian Christmas Day (12/25/2020)
- Canadian Boxing Day (12/26/2020++)

It's up to meeting chairs to decide whether to reschedule if few people can attend (e.g. if there are a lot of US or Canadians in the meeting).

+July 4, 2020 (the legal public holiday for US Independence Day), falls on a Saturday. For staff, Friday, July 3, may be treated as a holiday.

++December 26, 2020 falls on a Saturday.

3) On-call Rotations
~~~~~~~~~~~~~~~~~~~~

We have an "on-call" schedule for key staff to support customer escalations and for sales. Should your on-call schedule fall on a holiday or during time off, you can trade with teammates of similar qualification, or if you are called in because you are on-call during a holiday, you're encouraged to take time off on a non-holiday in exchange.

--------
Benefits
--------

General Benefits
~~~~~~~~~~~~~~~~

**1. Flexible hours**

Results matter more far more than hours in an office. Your time at Mattermost is flexible. Go see the dentist, visit a friend, walk your dog -- no need to ask permission.

If there's something urgent going on at work, just let teammates know your status.

For most roles, we require the ability to join meetings between 8am and 1pm California time. The exception is people who are dedicated to support in other timezones, or team members that don't need to be in real-time discussions. 

**2. Work from anywhere (with good internet)** 

The comfort of home, freedom to travel, no commute--learn more about our `work anywhere policies <https://docs.mattermost.com/process/working-at-mattermost.html#work-anywhere>`__.

**3. Paid time off**

Just as flexible as our working hours, learn more about our `paid time off policies <https://docs.mattermost.com/process/working-at-mattermost.html#paid-time-off>`__.

**4. Additional US and Canadian employee benefits**

Mattermost uses professional employment organizations in the United States and Canada and are able to offer additional `benefits to US employees <benefits-us.html>`__ and `benefits to Canadian employees <benefits-canada.html>`__.


---------
MatterCon 
---------

MatterCon is an annual conference for Mattermosters and the contributor community to come together. In 2018, it was held in Lisbon, Portugal. In 2019, in Punta Cana, Dominican Republic. In 2020, it was held in Nassau, Bahamas.

It's a time for Mattermosters and top contributors from our community to get together, to celebrate our achievements and to build shared experiences and empathy to increase the efficiency of working together. 

Traditions
~~~~~~~~~~

During one night of the meet up, teams get together for a dinner and afterwards there is an option to play a round of "hot seat". In hot seat one person volunteers to receive feedback from the rest of the group - one "like" (something they do well) and one "wish" (an opportunity to improve). After everyone has shared feedback, the volunteer has the option of making a commitment to the group on making a change in how they work and to ask the group's help to share feedback on the change and keep them accountable.  

source/archive/welcome-to-mattermost-channels.rst METASEP
:nosearch:

Welcome to Mattermost Channels!
===============================

|all-plans| |cloud| |self-hosted|

.. |all-plans| image:: ../images/all-plans-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in Mattermost Free and Starter subscription plans.

.. |cloud| image:: ../images/cloud-badge.png
  :scale: 30
  :target: https://mattermost.com/deploy
  :alt: Available for Mattermost Cloud deployments.

.. |self-hosted| image:: ../images/self-hosted-badge.png
  :scale: 30
  :target: https://mattermost.com/deploy
  :alt: Available for Mattermost Self-Hosted deployments.

Mattermost Channels are communication workflows that offer channel-based real-time and asynchronous collaboration through a modern, digital workspace that will help you be more productive in your day-to-day work life.

Some of the major benefits of using Channels include:

- All your team communication is in one place with channels for topic-based, group-based, or meeting-based project collaboration.
- Integrated voice, video, file, and link sharing.
- Removes information and organizational silos with Direct 1:1, Group Messaging, as well as site-wide search.
- Markdown and code syntax highlighting.
- Persistent communication history.

Take a look at the `Mattermost demo video  <https://www.youtube.com/watch?v=FuDvrkrqRzg>`__ and browse through our `channel documentation <https://docs.mattermost.com/guides/messaging.html>`__ for more information on how to use Mattermost Channels!
source/archive/webrtc.rst METASEP
:nosearch:

Video and Audio Calling (Beta)
==============================

This page has moved to https://docs.mattermost.com/deployment/video-and-audio-calling.html.

source/archive/webhooks-outgoing.rst METASEP
:nosearch:

.. _outgoing-webhooks:

Outgoing Webhooks
=================

.. note::
  
  This is the admin documentation for outgoing webhooks. If you're a developer looking to build an integration, see `our developer documentation <https://developers.mattermost.com/integrate/getting-started/>`__.

Mattermost supports webhooks to easily integrate external applications into the server.

Use outgoing webhooks to post automated responses to posts made by your users. Outgoing webhooks will send an HTTP POST request to a web service and process a response back to Mattermost when a message matches one or both of the following conditions:

 - It is posted in a specified channel
 - The first word matches or starts with one of the defined trigger words, such as ``gif``

Outgoing webhooks are supported in public channels only. If you need a trigger that works in a private channel or a direct message, consider using a `slash command <https://docs.mattermost.com/developer/slash-commands.html>`__ instead.

.. note::
  
  To prevent malicious users from trying to perform `phishing attacks <https://en.wikipedia.org/wiki/Phishing>`__ a *BOT* indicator appears next to posts coming from webhooks regardless of what username is specified.

.. toctree::
   :maxdepth: 2

Create an Outgoing Webhook
----------------------------

Suppose you want to write an external application, which executes software tests after someone posts a message starting with the word ``#build`` in the ``town-square`` channel.

You can follow these general guidelines to set up a Mattermost outgoing webhook for your application.

1 - First, go to **Main Menu > Integrations > Outgoing Webhook**. If you don't have the **Integrations** option in your Main Menu, outgoing webhooks may not be enabled on your Mattermost server or may be disabled for non-admins. Enable them by going to **System Console > Integrations > Integration Management**, or ask your System Admin to do so.

2 - Select **Add Outgoing Webhook** and add name and description for the webhook. The description can be up to 500 characters. 

3 - Choose the content type by which the request will be sent.

 - If ``application/x-www-form-urlencoded`` is chosen, the server will encode the parameters in a URL format in the request body.
 - If ``application/json`` is chosen, the server will format the request body as JSON.

4 - Select the public channel to receive webhook responses, or specify one or more trigger words that send an HTTP POST request to your application. You may configure either the channel or the trigger words for the outgoing webhook, or both. If both are specified, then the message must match both values.

In our example, we would set the channel to ``town-square`` and specify ``#build`` as the trigger word.

  .. note::
    If you leave the channel field blank, the webhook will respond to trigger words in all public channels of your team.
    
    Similarly, if you don't specify trigger words, then the webhook will respond to all messages in the selected public channel.

5 - If you specified one or more trigger words on the previous step, choose when to trigger the outgoing webhook.

 - If the first word of a message matches one of the trigger words exactly, or
 - If the first word of a message starts with one of the trigger words.

6 - Finally, set one or more callback URLs that HTTP POST requests will be sent to, and select **Save**. If the URL is private, add it as a `trusted internal connection <https://docs.mattermost.com/configure/configuration-settings.html#allow-untrusted-internal-connections-to>`__.

7 - On the next page, copy the **Token** value. This will be used in a later step.

.. image:: ../images/outgoing_webhooks_token.png
  :width: 500 px

8 - Next, write your external application. Include a function, which receives HTTP POST requests from Mattermost. The function should accept something like this:

    .. code-block:: text

      Content-Length: 244
      User-Agent: Go 1.1 package http
      Host: localhost:5000
      Accept: application/json
      Content-Type: application/x-www-form-urlencoded

      channel_id=hawos4dqtby53pd64o4a4cmeoo&
      channel_name=town-square&
      team_domain=someteam&
      team_id=kwoknj9nwpypzgzy78wkw516qe&
      post_id=axdygg1957njfe5pu38saikdho&
      text=some+text+here&
      timestamp=1445532266&
      token=zmigewsanbbsdf59xnmduzypjc&
      trigger_word=some&
      user_id=rnina9994bde8mua79zqcg5hmo&
      user_name=somename

If your integration sends back a JSON response, make sure it returns the ``application/json`` content-type.

9 - Add a configurable *MATTERMOST_TOKEN* variable to your application and set it to the **Token** value from step 7. This value will be used by your application to confirm the HTTP POST request came from Mattermost.

10 - To have your application post a message back to ``town-square``, it can respond to the HTTP POST request with a JSON response such as:

.. code-block:: text

  {"text": "
  | Component  | Tests Run   | Tests Failed                                   |
  |:-----------|:------------|:-----------------------------------------------|
  | Server     | 948         | :white_check_mark: 0                           |
  | Web Client | 123         | :warning: [2 (see details)](http://linktologs) |
  | iOS Client | 78          | :warning: [3 (see details)](http://linktologs) |
  "}

which would render in Mattermost as:

.. image:: ../images/webhooksTable.png

11 - You're all set! See `developer documentation <https://developers.mattermost.com/integrate/outgoing-webhooks/>`__ for details on what parameters are supported by outgoing webhooks. For instance, you can override the username and profile picture the messages post as, or specify a custom post type when sending a webhook message for use by `plugins <https://developers.mattermost.com/integrate/admin-guide/admin-plugins-beta/>`__.

Messages with advanced formatting can be created by including an :doc:`attachment array <message-attachments>` and :doc:`interactive message buttons <interactive-messages>` in the JSON payload.

.. note::
  `Enable integrations to override usernames <https://docs.mattermost.com/configure/configuration-settings.html#enable-integrations-to-override-usernames>`__ must be set to ``true`` in ``config.json`` to override usernames. Enable them by going to **System Console > Integrations > Integration Management**, or ask your System Admin. If not enabled, the username is set to *webhook*.

 Similarly, `Enable integrations to override profile picture icons <https://docs.mattermost.com/configure/configuration-settings.html#enable-integrations-to-override-profile-picture-icons>`__ must be set to ``true`` in ``config.json`` to override usernames. Enable them by going to **System Console > Integrations > Integration Management**, or ask your System Admin. If not enabled, the icon of the creator of the webhook URL is used to post messages.

Tips and Best Practices
------------------------

1. Webhooks are designed to easily allow you to post messages. For other actions such as channel creation, you must also use the `Mattermost APIs <https://api.mattermost.com>`__.

2. If the text in the JSON response is longer than the allowable character limit per post, the message is split into multiple consecutive posts, each within the character limit. Servers running Mattermost Server v5.0 or later `can support posts up to 16383 characters <https://docs.mattermost.com/administration/important-upgrade-notes.html>`__.

3. Outgoing webhooks are supported in public channels only. If you need a trigger that works in a private channel or a direct message, consider using a `slash command <https://docs.mattermost.com/developer/slash-commands.html>`__ instead.

4. You can restrict who can create outgoing webhooks in `System Console > Integrations > Integration Management <https://docs.mattermost.com/configure/configuration-settings.html#restrict-managing-integrations-to-admins>`__.

5. Mattermost outgoing webhooks are Slack-compatible. You can copy-and-paste code used for a Slack outgoing webhook to create Mattermost integrations. Mattermost `automatically translates the Slack's proprietary JSON response format <https://docs.mattermost.com/developer/webhooks-outgoing.html?highlight=translate%20slack%20data%20format%20mattermost#translate-slack-s-data-format-to-mattermost>`__.

6. The external application may be written in any programming language. It needs to provide a URL which reacts to the request sent by your Mattermost server, and send an HTTP POST in the required JSON format as a response.
 
Share Your Integration
-----------------------

If you've built an integration for Mattermost, please consider `sharing your work <https://developers.mattermost.com/contribute/getting-started/contribution-checklist/>`__ in our `app directory <https://mattermost.com/marketplace/>`__.

The `app directory <https://mattermost.com/marketplace/>`__ lists open source integrations developed by the Mattermost community and are available for download, customization and deployment to your private cloud or self-managed infrastructure.

Slack Compatibility
-------------------

Mattermost makes it easy to migrate integrations written for Slack to Mattermost. 

Translate Slack's data format to Mattermost
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost automatically translates the data coming from Slack:

1. JSON responses written for Slack, that contain the following, are translated to Mattermost markdown and rendered equivalently to Slack:
   
   - ``<>`` to denote a URL link, such as ``{"text": "<https://mattermost.com/>"}``
   - ``|`` within a ``<>`` to define linked text, such as ``{"text": "Click <https://mattermost.com/|here> for a link."}``
   - ``<userid>``  to trigger a mention to a user, such as ``{"text": "<5fb5f7iw8tfrfcwssd1xmx3j7y> this is a notification."}``
   - ``<!channel>``, ``<!here>`` or ``<!all>`` to trigger a mention to a channel, such as ``{"text": "<!channel> this is a notification."}``

2. The HTTP POST request body sent to a web service is formatted the same as Slack's. This means your Slack integration's receiving function does not need change to be compatible with Mattermost.

3. Slack attachments are supported with Slack-compatible outgoing webhooks. They also add support for mentions with `<@userid>` and announcement tokens (eg. `<!here>`) in the outgoing webhook responses.
  
Known Slack compatibility issues
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Using ``icon_emoji`` to override the username is not supported.
2. Referencing  channels using ``<#CHANNEL_ID>`` does not link to the channel.
3. ``<!everyone>`` and ``<!group>`` are not supported.
4. Parameters "mrkdwn", "parse", and "link_names" are not supported (Mattermost always converts markdown and automatically links @mentions).
5. Bold formatting supplied as ``*bold*`` is not supported (must be done as ``**bold**``).
6. Advanced formatting using :doc:`attachments <message-attachments>` is not yet supported.

Troubleshooting
---------------

To debug outgoing webhooks in **System Console > Logs**, set **System Console > Logging > Enable Webhook Debugging** to ``true`` and set **System Console > Logging > Console Log Level** to ``DEBUG``.

When ``TRUE``, as of v5.14 all outgoing webhooks are logged and include a ``request_id`` value in the log file. 

For further assistance, review the `Troubleshooting forum <https://forum.mattermost.org/c/trouble-shoot>`__ for previously reported errors, or `join the Mattermost user community for troubleshooting help <https://mattermost.com/pl/default-ask-mattermost-community/>`_.

My integration prints the JSON data in a Mattermost channel
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost handles multiple content types for integrations, including plain text content type. 

If your integration prints the JSON data instead of rendering the generated message, make sure your integration is returning the ``application/json`` content-type.

source/archive/webhooks-incoming.rst METASEP
:nosearch:

.. _incoming_webhooks:

Incoming Webhooks
=================

.. note::
  This is the admin documentation for incoming webhooks. If you're a developer looking to build an integration, see `our developer documentation <https://developers.mattermost.com/integrate/getting-started/>`__.

Mattermost supports webhooks to easily integrate external applications into the server.

Use incoming webhooks to post messages to Mattermost public channels, private channels and direct messages. Messages are sent via an HTTP POST request to a Mattermost URL generated for each application and contain a specifically formatted JSON payload in the request body.

.. image:: ../images/incoming_webhooks_sample.png
  :width: 500 px

*An example of a GitHub integration that posts updates to a Developers channel*

Use `curl <https://curl.haxx.se/>`__, a simple command line tool for sending HTTP requests in the examples that follow.

.. note::
  To prevent malicious users from trying to perform `phishing attacks <https://en.wikipedia.org/wiki/Phishing>`__, a *BOT* indicator appears next to posts coming from webhooks regardless of what username is specified.

.. toctree::
   :maxdepth: 2

Simple Incoming Webhook
-----------------------

Let's learn how to create a simple incoming webhook that posts the following message to Mattermost.

.. image:: ../images/incoming_webhooks_create_simple.png
  :width: 400 px
  
1. First, go to **Main Menu > Integrations > Incoming Webhook**.

  - If you don't have the **Integrations** option in your Main Menu, incoming webhooks may not be enabled on your Mattermost server or may be disabled for non-admins. They can be enabled by a System Admin from **System Console > Integrations > Integration Management**. Then continue with the steps below.

2. Select **Add Incoming Webhook** and add name and description for the webhook. The description can be up to 500 characters.
3. Select the channel to receive webhook payloads, then click **Add** to create the webhook.
4. Use a curl command from your terminal or commandline to send the following JSON payload in a HTTP POST request:

.. code-block:: text

  curl -i -X POST -H 'Content-Type: application/json' -d '{"text": "Hello, this is some text\nThis is more text. :tada:"}' http://{your-mattermost-site}/hooks/xxx-generatedkey-xxx
  # or
  curl -i -X POST --data-urlencode 'payload={"text": "Hello, this is some text\nThis is more text. :tada:"}' http://{your-mattermost-site}/hooks/xxx-generatedkey-xxx

If you're running `cURL on Windows <https://curl.haxx.se/windows/>`__, ensure inner double quotes are escaped with a backslash. Here's an example payload on Windows:

.. code-block:: text

  curl -i -X POST -H "Content-Type: application/json" -d "{\"text\": \"Hello, this is some text\nThis is more text. :tada:\"}" http://{your-mattermost-site}/hooks/xxx-generatedkey-xxx

See `developer documentation <https://developers.mattermost.com/integrate/incoming-webhooks/>`__ for details on what parameters are supported by incoming webhooks. For instance, you can override the username and profile picture the messages post as, or specify a custom post type when sending a webhook message for use by `plugins <https://developers.mattermost.com/integrate/admin-guide/admin-plugins-beta/>`__. The following payload gives an example webhook that uses additional parameters and formatting options:

.. code-block:: text

  payload={
    "channel": "town-square",
    "username": "test-automation",
    "icon_url": "https://mattermost.org/wp-content/uploads/2016/04/icon.png",
    "text": "#### Test results for July 27th, 2017\n<!channel> please review failed tests.\n
    | Component  | Tests Run   | Tests Failed                                   |
    |:-----------|:-----------:|:-----------------------------------------------|
    | Server     | 948         | :white_check_mark: 0                           |
    | Web Client | 123         | :warning: 2 [(see details)](http://linktologs) |
    | iOS Client | 78          | :warning: 3 [(see details)](http://linktologs) |
    "
    }

This content will be displayed in the Town Square channel.

.. image:: ../images/incoming_webhooks_full_example.png
  :width: 500 px

Messages with advanced formatting can be created by including an :doc:`attachment array <message-attachments>` and :doc:`interactive message buttons <interactive-messages>` in the JSON payload.

.. note::
  `Enable integrations to override usernames <https://docs.mattermost.com/administration/config-settings.html#enable-integrations-to-override-usernames>`__ must be set to ``true`` in ``config.json`` to override usernames. Enable them from **System Console > Integrations > Integration Management**, or ask your System Admin to do so. If not enabled, the username is set to ``webhook``.
  
  Similarly, `Enable integrations to override profile picture icons <https://docs.mattermost.com/administration/config-settings.html#enable-integrations-to-override-profile-picture-icons>`__ must be set to ``true`` in ``config.json`` to override profile picture icons. Enable them from **System Console > Integrations > Integration Management**, or ask your System Admin to do so. If not enabled, the icon of the creator of the webhook URL is used to post messages.

Tips and Best Practices
-----------------------

1. Webhooks are designed to easily allow you to post messages. For other actions such as channel creation, you must also use the `Mattermost APIs <https://api.mattermost.com>`__.

2. If the text is longer than the allowable character limit per post, the message is split into multiple consecutive posts, each within the character limit. Servers running Mattermost Server v5.0 or later `can support posts up to 16383 characters <https://docs.mattermost.com/administration/important-upgrade-notes.html>`__.

3. You can restrict who can create incoming webhooks in `System Console > Integrations > Integration Management <https://docs.mattermost.com/configure/configuration-settings.html#enable-incoming-webhooks>`__.

4. Mattermost incoming webhooks are Slack-compatible. You can copy-and-paste code used for a Slack incoming webhook to create Mattermost integrations. Mattermost `automatically translates the Slack's proprietary JSON payload format <https://docs.mattermost.com/developer/webhooks-incoming.html?highlight=translate%20slack%20data%20format%20mattermost#translate-slack-s-data-format-to-mattermost>`__.

5. The external application may be written in any programming language as long as it supports sending an HTTP POST request in the required JSON format to a specified Mattermost URL.

6. For the HTTP request body, if ``Content-Type`` is specified as ``application/json`` in the header of the HTTP request, then the body can be direct JSON. For example,

.. code-block:: text

  {"text": "Hello, this is some text."}

7. When using the ``icon_emoji`` parameter, the user profile image is replaced by the emoji provided. This will also override the ``icon_url`` parameter if both are provided.

Share Your Integration
----------------------

If you've built an integration for Mattermost, please consider `sharing your work <https://developers.mattermost.com/integrate/getting-started/>`__ in our `app directory <https://mattermost.com/marketplace/>`__.

The `app directory <https://mattermost.com/marketplace/>`__ lists open source integrations developed by the Mattermost community and are available for download, customization and deployment to your private cloud or self-managed infrastructure.

Slack Compatibility
-------------------

Mattermost makes it easy to migrate integrations written for Slack to Mattermost. Using the Slack ``icon_emoji`` parameter overrides the profile icon and the ``icon_url`` parameter and is supported from version 5.14.

Translate Slack's data format to Mattermost
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost automatically translates the data coming from Slack:

1. JSON payloads written for Slack, that contain the following, are translated to Mattermost markdown and rendered equivalently to Slack:
   
   - ``<>`` to denote a URL link, such as ``{"text": "<https://mattermost.com/>"}``
   - ``|`` within a ``<>`` to define linked text, such as ``{"text": "Click <https://mattermost.com/|here> for a link."}``
   - ``<userid>``  to trigger a mention to a user, such as ``{"text": "<5fb5f7iw8tfrfcwssd1xmx3j7y> this is a notification."}``
   - ``<!channel>``, ``<!here>`` or ``<!all>`` to trigger a mention to a channel, such as ``{"text": "<!channel> this is a notification."}``

2. You can override the channel name with a *@username*, such as ```payload={"text": "Hi", channel: "@jim"}`` to send a direct message like in Slack.
3. You can prepend a channel name with *#* and the message will still be sent to the correct channel like in Slack.

Mattermost webhooks in GitLab using Slack UI
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

GitLab is the leading open-source alternative to GitHub and offers built-in integrations with Slack. You can use the Slack interface in GitLab to add Mattermost webhooks directly without changing code:

1. In GitLab, go to **Settings > Services** and select **Slack**.
2. Paste the incoming webhook URL provided by Mattermost from **Main Menu > Integrations > Incoming Webhooks**.
3. Optionally set the **Username** you'd like displayed when the notification is made. Leave the **Channel** field blank.
4. Select **Save**, then test the settings to confirm messages are sent successfully to Mattermost.

Known Slack compatibility issues
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Referencing  channels using ``<#CHANNEL_ID>`` does not link to the channel.
2. ``<!everyone>`` and ``<!group>`` are not supported.
3. Parameters "mrkdwn", "parse", and "link_names" are not supported. Mattermost converts Markdown by default and automatically links @mentions.
4. Bold formatting as ``*bold*`` is not supported (must be done as ``**bold**``).
5. Webhooks cannot direct message the user who created the webhook.

Troubleshooting
---------------

To debug incoming webhooks in **System Console > Logs**, set **System Console > Logging > Enable Webhook Debugging** to **true**, and set **System Console > Logging > Console Log Level** to **DEBUG**.

Some common error messages include:

1. ``Couldn't find the channel``: Indicates that the channel doesn't exist or is invalid. Please modify the ``channel`` parameter before sending another request.
2. ``Couldn't find the user``: Indicates that the user doesn't exist or is invalid. Please modify the ``channel`` parameter before sending another request.
3. ``Unable to parse incoming data``: Indicates that the request received is malformed. Try reviewing that the JSON payload is in a correct format and doesn't have typos such as extra `"`.
4. ``curl: (3) [globbing] unmatched close brace/bracket in column N``: Typically an error when using cURL on Windows, when:

  1. You have space around JSON separator colons, ``payload={"Hello" : "test"}`` or  
  2. You are using single quotes to wrap the ``-d`` data, ``-d 'payload={"Hello":"test"}'``

If your integration prints the JSON payload data instead of rendering the generated message, make sure your integration is returning the ``application/json`` content-type.

For further assistance, review the `Troubleshooting forum <https://forum.mattermost.org/t/how-to-use-the-troubleshooting-forum/150>`__ for previously reported errors, or `join the Mattermost user community for troubleshooting help <https://mattermost.com/pl/default-ask-mattermost-community/>`_.

Frequently Asked Questions
--------------------------

How do I send a webhook post to a Direct Message channel?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

To send a message to a Direct Message channel, add an "@" symbol followed by the username to the channel parameter. You can add your own username to send the webhook posts to a Direct Message channel with yourself.

.. code-block:: text

  payload={"channel": "@username", "text": "Hello, this is some text\nThis is more text. :tada:"}

This will send a message from the account that has set up the incoming webhook to the username after the "@" symbol. For example, if you create a webhook with the user ``alice`` and send a Direct Message to ``bob`` using a webhook, it will show up as a direct message from ``alice`` to ``bob`` regardless of other settings such as username.

To send a message to a different Direct Message channel between two other users, you can specify the channel with the user IDs for the users separated with two underscore (_) symbols. To find the user ID you can `use ``mmctl user search``- see details `here <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-user-search>`__.

.. code-block:: text

  payload={"channel": "6w41z1q367dujfaxr1nrykr5oc__94dzjnkd8igafdraw66syi1cde", "text": "Hello, this is some text\nThis is more text. :tada:"}

source/archive/webhook.rst METASEP
:nosearch:

Using Mattermost with webhook
==============================

`Webhook <https://github.com/adnanh/webhook>`__ is a Golang application for setting up webhooks on a server with minimal configuration. It provides a simple way to trigger events on a server while keeping it separate from your web server.

Mattermost's outgoing webhooks feature  can be used with this fairly easily as long as you take a few things into account.

Sending information from Mattermost
-----------------------------------

Mattermost's :doc:`interactive message buttons <../developer/interactive-messages>` send information using a parameter called "context." The easiest way to get all the information from Mattermost is to use the following configuration, which will pass the entire payload to your script as a string:

.. code-block:: json

  {
  	"source": "entire-payload"
  }

Responding to the request
--------------------------

If you don't respond to the request you'll see an error in your Mattermost logs that looks like ``Action integration error [details: err=EOF]``.

To solve this, use the ``response-message`` configuration property to send back a response to prevent this. This response is sent immediately after receiving the webhook. 

If your script doesn't take very long to run you can use the ``include-command-output-in-response`` property to send that output to the Mattermost server.

Authenticating Requests
------------------------

Mattermost can be configured to send a token with an outgoing webhook to make sure that your webhook only responds to authorized requests. To enable this, use the following in your webhook configuration:

.. code-block:: json

    "trigger-rule":
    {
      "match":
      {
        "type": "value",
        "value": "<Outgoing webhook token>",
        "parameter":
        {
          "source": "request",
          "name": "token"
        }
      }
    }

source/archive/webapp-to-redux.rst METASEP
:nosearch:

To learn how to migrate the Webapp to Redux, see `developers.mattermost.com <https://developers.mattermost.com/contribute/webapp/webapp-to-redux/>`__.

source/archive/webapp-end-to-end-testing.rst METASEP
:nosearch:

See how to run End-to-End (E2E) testing and build tests for a section or page of the Mattermost web application at `developers.mattermst.com <https://developers.mattermost.com/contribute/webapp/end-to-end-tests/>`__.

source/archive/webapp-component.rst METASEP
:nosearch:

To build a webapp React component, see `developers.mattermost.com <https://developers.mattermost.com/contribute/webapp/build-component/>`__.

source/archive/web-service.rst METASEP
:nosearch:

This documentation has moved to https://api.mattermost.com/

source/archive/video-and-audio-calling.rst METASEP
:nosearch:

Voice, video, and screensharing
================================

Our `Integrations Directory <https://integrations.mattermost.com>`_ has several integrations to connect by voice or video call, or to share your screen with team members in Mattermost.

Here are some popular options below, including self-hosted on-prem, self-hosted private cloud solutions, and vendor-hosted SaaS solutions.

.. tip :: You can also neatly link voice, video and screensharing solutions to channels by using Markdown formatting in the channel header. Example: ``[Click for video call](https://link_to_solution)``.

Zoom
~~~~

- Start and join voice calls, video calls, and use screensharing with your team members, developed by Mattermost.
- Click a video icon in a Mattermost channel to invite team members to join a Zoom call, hosted using the credentials of the user who initiated the call.
- Requires one paid `Zoom Pro, Business, Education, or API plan, <https://zoom.us/pricing>`_ to generate an API key and secret.
- Supports a self-hosted cloud solution and a vendor-hosted cloud solution.
- Docs available at: https://docs.mattermost.com/integrations/zoom.html.
- Source code available at: https://github.com/mattermost/mattermost-plugin-zoom.

Microsoft Teams Meetings
~~~~~~~~~~~~~~~~~~~~~~~~

- Start and join voice calls, video calls, and use screensharing with your team members, developed by Mattermost.
- Click a video icon in a Mattermost channel to invite team members to join a Microsoft Teams Meeting, hosted using the credentials of the user who initiated the call.
- Requires a Microsoft Teams account.
- Requires Mattermost Enterprise Edition E20.
- Source code and docs available at: https://github.com/mattermost/mattermost-plugin-msteams-meetings.

Cisco Webex Cloud
~~~~~~~~~~~~~~~~~~

- Start and join voice and video calls, and share your screen with members of your team, developed by Mattermost.
- Use the ``/webex`` slash command or click the video icon in a Mattermost channel to invite team members to join a Webex call, hosted using the credentials of the user who initiated the call.
- Requires one paid `Cisco Webex Developer Account, <https://developer.webex.com/>`_ to generate an API key and secret.
- Supports a self-hosted cloud solution and a vendor-hosted cloud solution.
- Source code and docs available at: https://github.com/mattermost/mattermost-plugin-webex.

BigBlueButton
~~~~~~~~~~~~~~

- Start and join voice calls, video calls, and use screensharing with your team members, developed by Blindside Networks.
- A test install is provided to try out the feature on a Mattermost installation.
- Supports a self-hosted on-prem solution and a vendor-hosted cloud solution.
- Source code and docs available at: https://github.com/blindsidenetworks/mattermost-plugin-bigbluebutton.

Skype for Business (Beta)
~~~~~~~~~~~~~~~~~~~~~~~~~~

- Start and join voice calls, video calls and use screensharing with your team members, developed by kosgrz, and maintained by Mattermost.
- Clicking a video icon in a Mattermost channel invites team members to join a Skype for Business call, hosted using the credentials of the user who initiated the call.
- Supports a vendor-hosted cloud solution.
- Source code and docs available at: https://github.com/mattermost/mattermost-plugin-skype4business.

WebRTC
~~~~~~

- Start one-on-one voice and video calls, based on the WebRTC protocol, developed by Nikhil Rajan.
- Calls embedded into the Mattermost interface for seamless user experience.
- No third-party dependency, uses a browser-to-browser and serverless approach to initiate calls.
- Source code and docs available at: https://github.com/niklabh/mattermost-plugin-webrtc-video.

Kopano WebMeetings
~~~~~~~~~~~~~~~~~~

- Start one-on-one voice and video calls, based on the WebRTC protocol, developed by Kopano.
- Calls embedded into the Mattermost interface for seamless user experience.
- Supports a self-hosted on-prem solution.
- Source code and docs available at: https://stash.kopano.io/projects/KM/repos/mattermost-plugin-kopanowebmeetings/browse.

Jitsi
~~~~~~

- Start and join voice calls, video calls, and use screensharing with your team members, developed by Sean Sackowitz.
- Click a video icon in a Mattermost channel to invite team members to join a Jitsi call.
- Supports a self-hosted on-prem solution.
- Source code and docs available at: https://github.com/seansackowitz/mattermost-plugin-jitsi.

SIP PBX
~~~~~~~~

- Connect your company's individual desk extensions, external telephone lines, and mobile networks with Mattermost, developed by Bytemine GmbH.
- Supports a self-hosted on-prem solution.
- Source code and docs available at: https://github.com/bytemine/mattersip.

appear.in
~~~~~~~~~~

- Start and join voice calls, video calls, and use screensharing with your team members, developed by zarej.
- Use the ``/appearin`` slash command to start a new appear.in call.
- Supports a self-hosted on-prem solution.
- Source code and docs available at: https://github.com/zarej/Mattermost-Integration-with-Appear.in.

Have a proposal for a voice and video call integration? `Let us know in the feature proposal forum <https://mattermost.uservoice.com/forums/306457-general?category_id=202591>`_.

Have you built an integration? `Let us know <https://integrations.mattermost.com/submit-an-integration/>`_ and we'll share in our `Integrations Directory <https://integrations.mattermost.com>`_.

source/archive/using-emoji.rst METASEP
:nosearch:

Using Emojis
============

|all-plans| |cloud| |self-hosted|

.. |all-plans| image:: ../images/all-plans-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in Mattermost Free and Starter subscription plans.

.. |cloud| image:: ../images/cloud-badge.png
  :scale: 30
  :target: https://mattermost.com/download
  :alt: Available for Mattermost Cloud deployments.

.. |self-hosted| image:: ../images/self-hosted-badge.png
  :scale: 30
  :target: https://mattermost.com/deploy
  :alt: Available for Mattermost Self-Hosted deployments.

Emojis are small, digital images or icons used to communicate or express concepts such as emotions and physical gestures in your messages.

Adding Emojis to messages
-------------------------

Selecting an emoji
~~~~~~~~~~~~~~~~~~

Select the |smile-icon| icon inside the Mattermost message input box to open the Emoji Picker.

.. |smile-icon| image:: ../images/smile-icon.png
  :alt: Smile icon.

.. image:: ../images/selectemoji.png
  :alt: The Mattermost Emoji Picker dialog.

Selecting a default skin tone
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Select the **Skin Tone** icon in the top right corner of the Emoji Picker to specify a preferred skin tone for people-based emojis. 

.. image:: ../images/emoji-skin-tone.png
  :alt: Select a default skin tone for people-based emojis.

Selecting recent emojis
-----------------------

From Mattermost v6.1 and in Mattermost Cloud, react to messages quickly by selecting a recently-used emoji while hovering over a message. If your most recent reactions aren't visible, you can enable quick reactions by selecting **Settings > Display > Quick reactions on messages**.

.. image:: ../images/recent-emojis.png
  :alt: React to messages quickly by selecting one of your last three emojis.

Typing an emoji
---------------

Alternatively, open the emoji autocomplete by typing ``:`` followed by at least two characters of the word describing the emoji. Descriptions include skin tone details for people-based emojis, where supported.

.. image:: ../images/emojiautocomplete.png
   :alt: Emoji Autocomplete
   :scale: 80
   
It's also possible to `create your own custom emoji <#custom-emoji>`_ if the emoji you want to use doesn't exist.

Creating Custom Emojis
-----------------------
  
You can create Custom Emojis which are available to everyone on your Mattermost server. From the Emoji Picker, select **Custom Emoji**. Small, square pictures work best when selecting an image to upload. The file can be any JPG, GIF, or PNG and up to 1 MB in size.
  
1. Enter a name for your Custom Emoji. This is the name that will show up in the emoji autocomplete.
2. Choose **Select**, then select the image to use for the emoji. 
3. Select **Save**.
  
.. image:: ../images/add_custom_emoji.png
  
Once saved, your emoji is added to the list of Custom Emoji.

.. note::

  If you can't see the **Custom Emoji** option, then your Mattermost System Admin may have restricted access to certain users. Contact your Mattermost System Admin for help.
      
  For further assistance, review the `Troubleshooting forum <https://forum.mattermost.com/c/trouble-shoot>`__ for previously reported errors, or `join the Mattermost user community for troubleshooting help <https://mattermost.com/pl/default-ask-mattermost-community/>`_.
  
Using Custom Emojis
~~~~~~~~~~~~~~~~~~~

To use your Custom Emoji in a message, simply type ``:`` followed by your emoji name to bring it up in the emoji autocomplete. Other users on the site will also be able to see your emoji in the autocomplete, and will be able to use it in their own messages.
  
Deleting Custom Emojis
~~~~~~~~~~~~~~~~~~~~~~
  
You can delete Custom Emojis that you created. 
  
1. Open the Emoji Picker.
2. Select **Custom Emoji**.
3. If required, use the Search Bar to find your Custom Emoji in the list.
4. Under **Actions** select **Delete**.
5. Choose **Delete** to confirm.
  
.. image:: ../images/delete_custom_emoji.png
   :alt: Delete custom emoji.
 

source/archive/using-custom-emoji.rst METASEP
:nosearch:

Custom Emoji
============

You can create Custom Emojis which are available to everyone on your Mattermost server. 

To create and find Custom Emojis, open the **Main Menu** at the top right of the channels sidebar and select **Custom Emoji**.

.. note::
    
  If you cannot see the **Custom Emoji** option in the menu, then your Mattermost System Admin may have restricted access to certain users. Contact your Mattermost System Admin for help.
    
  For further assistance, review the `Troubleshooting forum <https://forum.mattermost.com/c/trouble-shoot>`__ for previously reported errors, or `join the Mattermost user community for troubleshooting help <https://mattermost.com/pl/default-ask-mattermost-community/>`_.

Creating Custom Emojis
----------------------

Small, square pictures work best when selecting an image. The file can be any JPG, GIF, or PNG and up to 1 MB in size.

1. Open the **Main Menu** at the top-right of the channels sidebar.
2. Select **Custom Emoji**.
3. Choose **Add Custom Emoji**.
4. Enter a name for your Custom Emoji. This is the name that will show up in the emoji autocomplete.
5. Choose **Select**, and choose what image to use for the emoji. 
6. Choose **Save**.

.. image:: ../images/add_custom_emoji.png

Once saved, your emoji will be added to the list of Custom Emoji. 

To use your Custom Emoji in a message, simply type ":" followed by your emoji name to bring it up in the emoji autocomplete. Other users on the site will also be able to see your emoji in the autocomplete, and will be able to use it in their own messages.

Deleting Custom Emojis
----------------------

You can delete Custom Emojis that you created. 

1. Open the **Main Menu** at the top-right of the channels sidebar.
2. Select **Custom Emoji**.
3. If required, use the Search Bar to find your Custom Emoji in the list.
4. Under **Actions** select **Delete**. 
5. Choose **Delete** to confirm. 

.. image:: ../images/delete_custom_emoji.png

source/archive/user.rst METASEP
:nosearch:

Mattermost User's Guide
=======================

End user help and documentation.

Getting Started
---------------

.. toctree::
   :maxdepth: 2
   :glob:

   /help/getting-started/welcome-to-mattermost.rst
   /help/getting-started/signing-in.rst
   /help/getting-started/setting-your-status-availability.rst
   /help/getting-started/messaging-basics.md
   /help/getting-started/configuring-notifications.md
   /help/getting-started/organizing-conversations.md
   /help/getting-started/organizing-your-sidebar.md
   /help/getting-started/searching.md
   /help/getting-started/creating-teams.md
   /help/getting-started/managing-members.md
   /help/getting-started/organizing.rst
   /help/getting-started/accessibility.rst
   /help/apps/desktop-guide.rst

Messaging
---------

.. toctree::
   :maxdepth: 2
   :glob:

   /help/messaging/sending-messages.md
   /help/messaging/emoji.rst
   /help/messaging/reading-messages.md
   /help/messaging/mentioning-teammates.md
   /help/messaging/formatting-text.md
   /help/messaging/attaching-files.rst
   /help/messaging/executing-commands.md
   /help/messaging/*

Settings
--------

.. toctree::
   :maxdepth: 2
   :titlesonly:
   :glob:

   /help/settings/account-settings.md
   /help/settings/theme-colors.md
   /help/settings/channel-settings.rst
   /help/settings/team-settings.md
   /help/settings/*

source/archive/use-kubernetes-mattermost.rst METASEP
:nosearch:

Using Mattermost operator functionality
---------------------------------------

Rolling upgrades
~~~~~~~~~~~~~~~~

The Mattermost Kubernetes operator supports rolling upgrades, so you can upgrade your Mattermost deployment with zero downtime. This process requires at least two replicas as a rolling upgrade cannot be performed if there is only one pod. Replicas are created when a user count is selected and exceeds 100.

New Mattermost releases are announced via our community server, as well as social media and email.

**Performing rolling upgrades**

1. Log in to your Kubernetes instance.
2. Open the ``mattermost-installation.yaml`` manifest (the one created during installation).
3. Update the ``spec.version`` value to the new version.
4. Save the changes.

Apply the changes with ``kubectl``:

.. code-block:: sh

  $ kubectl apply -n mattermost -f [PATH_TO_MATTERMOST_MANIFEST]

The operator initiates a job in the Kubernetes cluster and once migration is complete the pods are restarted. If necessary, a database migration is also performed.

To view information about the running job, use

.. code-block:: sh

  $ kubectl -n mattermost get jobs

At least one pod is available at all times and once all pods are restarted with the new version the upgrade is complete.

To view the status of the pods and to confirm their state, use

.. code-block:: sh

  $ kubectl -n mattermost get pods

The *STATUS* of the pods should be running/ready, with an *AGE* of 10-15 seconds.

source/archive/upgrading-to-3.0.rst METASEP
:nosearch:

Upgrading to version 3.0
========================

Use these instructions if you are upgrading from 2.0.0, 2.1.0, or 2.2.0. If you are upgrading from a version earlier than 2.0.0, you must first `upgrade to version 2.0 <../administration/upgrading-to-2.0.html>`__. 

You must upgrade to 3.0 before upgrading to the latest version of Mattermost.

Introduction
------------

If your Mattermost server contains more than one team, you need to understand the 3.0 upgrade process in detail and take special steps to upgrade successfully.

Before version 3.0, users needed a separate account for each team that they joined. Starting in version 3.0, users can have only one account, and that account is used across all teams.

This means that you must decide which of the teams on the server will be the **primary team**, and your users must take steps after the upgrade to consolidate their various accounts into one.

Username and email address changes
  During the upgrade, the database is migrated to the new design. The primary team is migrated first, and then the other teams are migrated. When a duplicate account is found, it is modified to ensure that all accounts in the system are unique. A duplicate account is an account that has either the same username or the same email address as an account in the primary team.

Duplicate usernames
  An account with a duplicate username is changed by prepending a string based on the team name to the username. For example, the user *steve* on the *Marketing* team becomes *marketing.steve*.

Duplicate email addresses
  An account with a duplicate email address is changed by adding a string based on the team name to the local part of the email address. For example, the email address of *steve@example.com* on the *Marketing* team becomes *steve+marketing@example.com*.

Users with accounts containing duplicate emails or usernames will receive a notification email explaining the upgrade, and instructions on how to move to a single user account.

**Before you begin**

Read these instructions carefully from start to finish. Make sure that you understand each step before starting the upgrade. If you have questions or concerns, you can ask on the Mattermost forum at https://forum.mattermost.org/.

You should gather the following information before starting the upgrade:

Existing install directory - *{install-path}*
  If you don't know where Mattermost Server is installed, use the ``whereis platform`` command. The output should be similar to */opt/mattermost/bin/platform*. The install directory is everything before the last occurrence of the string */mattermost*. In this example, the *{install-path}* is ``/opt``.
Location of your local storage directory
  The local storage directory contains all the files that users have attached to their messages. If you don't know its location, open the System Console and go to **Files > Storage** and read the value in **Local Storage Directory**. Relative paths are relative to the ``mattermost`` directory. For example, if the local storage directory is ``./data/`` then the absolute path is ``{install-path}/mattermost/data``.
Owner and group of the install directory - *{owner}* and *{group}*
  Use the ``ls -l {install-path}/mattermost/bin/platform`` command to get the owner and group.

**Upgrading to version 3.0**

1. Read the following post in the Mattermost forum which describes the steps that were taken to ensure success when upgrading to version 3.0. `Mattermost 3.0 upgrade example <https://forum.mattermost.org/t/mattermost-3-0-upgrade-example/1541>`__

2. In a terminal window on the server that hosts Mattermost Server, change to your home directory. If any, delete files and directories that might still exist from a previous download.

  ``cd ~``

3. Download version 3.0.3.

  ``wget https://releases.mattermost.com/3.0.3/mattermost-enterprise-3.0.3-linux-amd64.tar.gz``

4. Extract the Mattermost Server files.

  ``tar -xzf mattermost*.gz``

5. Stop Mattermost Server.

  On Ubuntu 14.04 and RHEL 6: ``sudo service mattermost stop``

  On Ubuntu 16.04 and RHEL 7: ``sudo systemctl stop mattermost``

6. Back up your data and application.
  a. Back up your database using your organization’s standard procedures for backing up MySQL or PostgreSQL.
  b. Back up your application by moving into your archive folder (e.g. ``mattermost-back-YYYY-MM-DD``).

    ``mv {install-path}/mattermost {install-path}/{mattermost-back-YYYY-MM-DD}``

7. Copy the files that you extracted earlier to the install directory.

  ``sudo cp -r mattermost {install-path}``

8. Restore your configuration, local file storage and logs.

  .. code-block:: text

    sudo cp -r {install-path}/{mattermost-back-YYYY-MM-DD}/config {install-path}/mattermost
    sudo cp -r {install-path}/{mattermost-back-YYYY-MM-DD}/data {install-path}/mattermost
    sudo cp -r {install-path}/{mattermost-back-YYYY-MM-DD}/logs {install-path}/mattermost

9. Change ownership of the new files.

  ``sudo chown -R {owner}:{group} {install-path}/mattermost``

10. Upgrade the database.
  a. Change to the Mattermost bin directory

    ``cd {install-path}/mattermost/bin``

  b. Run the database upgrade script

    ``sudo -u {owner} ./platform -upgrade_db_30``

  c. When prompted, enter the name of the team that you want to use as the primary team.

11. Start Mattermost server.

  On Ubuntu 14.04 and RHEL 6: ``sudo service mattermost start``

  On Ubuntu 16.04 and RHEL 7: ``sudo systemctl start mattermost``

12. Upgrade your ``config.json`` schema: Open the System Console and make a change and then save the change. Your current settings are preserved, and new settings are added with default values.

13. If you have TLS set up on your Mattermost server, you must activate the CAP_NET_BIND_SERVICE capability to allow the new Mattermost binary to bind to low ports.

  .. code-block:: text

    cd {install-path}
    sudo setcap cap_net_bind_service=+ep ./bin/platform

source/archive/upgrading-to-2.0.rst METASEP
:nosearch:

Upgrading to version 2.0
========================

To upgrade an early edition of Mattermost to the latest edition, you must first upgrade in a specific sequence until you get to version 2.0.0. After that, you must upgrade to version 3.0.3, and from there you can upgrade directly to the latest Mattermost version.

Read these instructions carefully from start to finish. Make sure that you understand each step before starting the upgrade. If you have questions or concerns, you can ask on the Mattermost forum at https://forum.mattermost.org/.

You should gather the following information before starting the upgrade:

Existing install directory - *{install-path}*
  If you don't know where Mattermost Server is installed, use the ``whereis platform`` command. The output should be similar to */opt/mattermost/bin/platform*. The install directory is everything before the last occurrence of the string */mattermost*. In this example, the *{install-path}* is ``/opt``.
Location of your local storage directory
  The local storage directory contains all the files that users have attached to their messages. If you don't know its location, open the System Console and go to **Files > Storage** and read the value in **Local Storage Directory**. Relative paths are relative to the ``mattermost`` directory. For example, if the local storage directory is ``./data/`` then the absolute path is ``{install-path}/mattermost/data``.
Owner and group of the install directory - *{owner}* and *{group}*
  Use the ``ls -l {install-path}/mattermost/bin/platform`` command to get the owner and group.

**To upgrade to version 2.0**:

1. In a terminal window on the server that hosts Mattermost Server, change to your home directory. If any, delete files and directories that might still exist from a previous download.

  ``cd ~``

2. Download the appropriate version for the upgrade:
  a. Run ``sudo ./platform -version`` to check the current version.
  b. Use the following table to determine the appropriate version to download:
    .. csv-table::
      :header: "From", "To", "Download command"
      :widths: auto

      "1.4.0", "2.0.0", "wget https://releases.mattermost.com/2.0.0/mattermost-team-2.0.0-linux-amd64.tar.gz"
      "1.3.0", "1.4.0", "wget https://releases.mattermost.com/1.4.0/mattermost-team-1.4.0-linux-amd64.tar.gz"
      "1.2.1", "1.3.0", "wget https://releases.mattermost.com/1.3.0/mattermost-team-1.3.0-linux-amd64.tar.gz"
      "1.2.0", "1.3.0", "wget https://releases.mattermost.com/1.3.0/mattermost-team-1.3.0-linux-amd64.tar.gz"
      "1.1.1", "1.2.1", "wget https://releases.mattermost.com/1.2.1/mattermost-team-1.2.1-linux-amd64.tar.gz"
      "1.1.0", "1.2.1", "wget https://releases.mattermost.com/1.2.1/mattermost-team-1.2.1-linux-amd64.tar.gz"
      "1.0.0", "1.2.1", "wget https://releases.mattermost.com/1.2.1/mattermost-team-1.2.1-linux-amd64.tar.gz"

3. When the download is complete, extract the Mattermost Server files.

  ``tar -xzf mattermost*.gz``

4. Stop Mattermost Server.

  On Ubuntu 14.04 and RHEL 6: ``sudo service mattermost stop``

  On Ubuntu 16.04 and RHEL 7: ``sudo systemctl stop mattermost``

5. Back up your data and application.
  a. Back up your database using your organization’s standard procedures for backing up MySQL or PostgreSQL.
  b. Back up your application by moving into your archive folder (e.g. ``mattermost-back-YYYY-MM-DD``).

    ``mv {install-path}/mattermost {install-path}/{mattermost-back-YYYY-MM-DD}``

6. Copy the files that you extracted earlier to the install directory.

  ``sudo cp -r mattermost {install-path}``

7. Restore your configuration, local file storage and logs.

  .. code-block:: text

    sudo cp -r {install-path}/{mattermost-back-YYYY-MM-DD}/config {install-path}/mattermost
    sudo cp -r {install-path}/{mattermost-back-YYYY-MM-DD}/data {install-path}/mattermost
    sudo cp -r {install-path}/{mattermost-back-YYYY-MM-DD}/logs {install-path}/mattermost

8. Change ownership of the new files.

  ``sudo chown -R {owner}:{group} {install-path}/mattermost``

9. Upgrade your ``config.json`` schema: Open the System Console and make a change and then save the change. Your current settings are preserved, and new settings are added with default values.

10. If you have TLS set up on your Mattermost server, you must activate the CAP_NET_BIND_SERVICE capability to allow the new Mattermost binary to bind to low ports.

  .. code-block:: text

    cd {install-path}
    sudo setcap cap_net_bind_service=+ep ./bin/platform

11. Make sure the system is working, then repeat the steps 1 to 10 until version 2.0 is installed and running.

source/archive/upgrade.md METASEP
See the [new upgrade guide](https://docs.mattermost.com/administration/upgrade.html).

source/archive/upgrade-script.rst METASEP
:nosearch:

Upgrading Mattermost Server with a Script
=========================================

.. important:: This unofficial guide is maintained by the Mattermost community and this deployment configuration is not yet officially supported by Mattermost, Inc. Community testing, feedback, and improvements are welcome and greatly appreciated.

*Preparing the script*

Copy and save the following script to your Mattermost server as ``upgrade_mattermost.sh``.

.. code-block:: sh

   #!/usr/bin/env bash

   # Immediately exit if a command run from a loop, a pipeline or a compound
   # command statement fails or a variable is used unset.
   set -e

Configuration - please adapt it to your environment
-----------------------------------------------------

   # Mattermost path
   mattermostdir="/opt/mattermost"

   # Backup path
   backupdir="/opt"

   # Temporary path for download
   downloaddir="/tmp"

   # Specify the edition you use
   #edition="Team"
   edition="Enterprise"

   # Start with plugins? Set 1 for starting with plugins active
   plugins=0

   # Set 1 for overriding the database backup question
   backupdatabase=0

      # Check dependencies
   if ((EUID != 0)); then
   	echo "[-] This script needs to be run as root to work properly. Aborted."
   	exit 1
   fi

   if ! type "systemctl" >/dev/null 2>&1 && ! type "service" >/dev/null 2>&1; then
   	echo "[-] The daemon manager (systemd or sysvinit) is not accessible. Aborted."
   	exit 1
   fi

   if ! type "wget" >/dev/null 2>&1 && ! type "curl" >/dev/null 2>&1; then
   	echo "[-] A download tool like wget or curl is not accessible. Aborted."
   	exit 1
   fi

   # Check requirements
   if [[ "${edition}" != "Team" ]] && [[ "${edition}" != "Enterprise" ]]; then
   	echo "[-] The edition must either be \"Team\" or \"Enterprise\". Aborted."
   	exit 1
   fi

   # Check config variables
   test -d ${backup}
   test -d ${downloaddir}
   test -d ${mattermostdir}

   # Ask for database backup
   if [ "${backupdatabase}" -eq 0 ]; then
   	read -r -p "[?] Do you have a current backup of the Mattermost database? [Y/n] " input

   	case "$input" in
   		[yY])
   			echo "[+] Starting the update process of Mattermost..."
   			;;
   		*)
   			echo "[-] Please create a backup and start again"
   			exit 1
   			;;
   	esac
   fi

   # Check if Mattermost exists in the path provided above
   if [ ! -f "${mattermostdir}/bin/mattermost" ];  then
   	echo "Mattermost not found please check the path for the Mattermost directory"
   	exit 1
   fi

   # Get version from argument
   if [ -z "${1}" ]; then
   	echo "Please specify the version of Mattermost to download"
   	exit 1
   fi
   version="${1}"

   if [[ "${edition}" == "Team" ]]; then
   	url="https://releases.mattermost.com/${version}/mattermost-team-${version}-linux-amd64.tar.gz"
   else
   	url="https://releases.mattermost.com/${version}/mattermost-${version}-linux-amd64.tar.gz"
   fi

   # Main

   # Get the file
   function get_the_file() {
   	echo "[+] Downloading Mattermost ${edition} \"${version}\"..."
   	if type "curl" >/dev/null 2>&1; then
   		if ! curl -LC - "${url}" -o "${downloaddir}/mattermost-upgrade.tar.gz"; then
   			echo "[-] An issue occurred when downloading the Mattermost update package."
   			exit 1
   		fi
   	else
   		if ! wget "${url}" -o "${downloaddir}/mattermost-upgrade.tar.gz"; then
   			echo "[-] An issue occurred when downloading the Mattermost update package."
   			exit 1
   		fi
   	fi

   	echo "[+] The Mattermost update package has been downloaded with successful"
   }

   # Check previous download
   if [ -e "${downloaddir}/mattermost-upgrade.tar.gz" ]; then
   	read -r -p "[?] A previous download exists. Do you want to replace it by a new one? [Y/n " input

   	case "$input" in
   		[yY])
   			echo "[+] Remove previous download."
   			rm -rf "${downloaddir}/mattermost-upgrade.tar.gz"
   			get_the_file
   			;;
   	esac
   else
   	get_the_file
   fi

   echo "[+] Extracting Mattermost update package..."
   mkdir -p "${downloaddir}/mattermost-upgrade"
   tar -xf "${downloaddir}/mattermost-upgrade.tar.gz" -C "${downloaddir}/mattermost-upgrade/"

   echo "[+] Stopping Mattermost service..."
   if type systemctl >/dev/null 2>&1;  then
   	systemctl stop mattermost
   else
   	service mattermost stop
   fi

   if pgrep mattermost > /dev/null; then
   	echo "[-] Mattermost is still running. Update not possible. Aborting..."
   	rm -rf "${downloaddir}/mattermost-upgrade"
   	rm -f "${downloaddir}/mattermost-upgrade.tar.gz"
   	exit 1
   fi

   echo "[+] Creating backup of Mattermost..."
   cp -ra "${mattermostdir}" "${backupdir}/mattermost-backup-$(date +'%F-%H-%M')/"

   echo "[+] Preparing update..."
   USER="$(stat -c '%U' ${mattermostdir}/bin/mattermost)"
   GROUP="$(stat -c '%G' ${mattermostdir}/bin/mattermost)"
   chown -hR "$USER":"$GROUP" "${downloaddir}/mattermost-upgrade/"

   # Clean up Mattermost directory
   find "${mattermostdir}" -mindepth 1 -maxdepth 1 -not \( -path "${mattermostdir}/config" -o -path "${mattermostdir}/logs" -o -path "${mattermostdir}/plugins" -o -path "${mattermostdir}/data" -o -path "${mattermostdir}/client" \) -exec rm -rf {} \;
   find "${mattermostdir}/client" -mindepth 1 -maxdepth 1 -not \( -path "${mattermostdir}/client/plugins" \) -exec rm -rf {} \;

   # Rename plugin directory
   if [ "${plugins}" -eq 0 ];  then
   	echo "[+] Renaming plugin folders..."
   	if [ -d "${mattermostdir}/plugins/" ]; then
   		mv "${mattermostdir}/plugins/" "${mattermostdir}/plugins~"
   	fi
   	if [ -d "${mattermostdir}/client/plugins/" ]; then
   		mv "${mattermostdir}/client/plugins/" "${mattermostdir}/client/plugins~"
   	fi
   fi

   echo "[+] Updating Mattermost..."
   cp -an "${downloaddir}/mattermost-upgrade/mattermost/"* "${mattermostdir}"


   echo "[+] Cleaning Mattermost temporary files..."
   rm -rf "${downloaddir}/mattermost-upgrade/"
   rm -f "${downloaddir}/mattermost-upgrade.gz"

   echo "[+] Allowing Mattermost to run on port 0-1023..."
   setcap cap_net_bind_service=+ep "${mattermostdir}/bin/mattermost"

   echo "[+] Starting Mattermost service..."
   if type systemctl >/dev/null 2>&1;  then
   	systemctl start mattermost
   else
   	service mattermost start
   fi

   echo "[+] Mattermost updated with successful"

   if [ "${plugins}" -eq 0 ];  then
   	echo "*************************************************"
   	echo "Dont forget to reactivate your plugins"
   	echo "mv \"${mattermostdir}/plugins~\" \"${mattermostdir}/plugins\""
   	echo "mv \"${mattermostdir}/client/plugins\" \"${mattermostdir}/client/plugins~\""
   	echo "*************************************************"
   fi


Make it executable.

.. code-block:: sh

   # chmod +x ./upgrade_mattermost.sh

Please adjust the parameters at the beginning of the script according to your environment.

*Start the script*

To start the update process, start the script and add the desired version number as an argument.

.. code-block:: sh

   # ./upgrade_mattermost.sh <VERSION>

Example:

.. code-block:: sh

   # ./upgrade_mattermost.sh 5.26.0

source/archive/upgrade-guide.rst METASEP
:nosearch:

Please see :doc:`upgrade`.
source/archive/training.rst METASEP
:nosearch:

==========
Onboarding
==========

.. note:: 
    This guide is being moved to the `Mattermost Handbook <https://handbook.mattermost.com/>`_. Where possible, links to the Handbook have been provided.

This document is intended for new hires to summarize norms for working at Mattermost, Inc. including:

- `Getting Started Checklist`_ - Getting ready to work here
- `Channels`_ - Where we discuss work-related topics
- `Meetings`_ - When we get together and why
- `Mindsets`_ - Shared toolsets we have for solving problems
- `Terminology`_- Shared vocabulary to convey ideas quickly
- `Training`_ - Material available to help us ramp quickly in different areas

.. contents::
    :backlinks: top

-------------------------
Getting Started Checklist
-------------------------

Company Agreements
------------------

This section has been moved to the `Mattermost Handbook <https://handbook.mattermost.com/operations/operations/company-processes/company-agreements>`_.

Hiring
-------

- (People Ops and New Hire) Offer letter accepted via click-sign.
- (Logistics) Mail track jacket and socks.

T-minus 1-3 weeks
-----------------

- (People Ops and New Hire) People Ops should find out new hire's preference for laptop, either to be purchased or taken from stock and shipped by People Ops or purchased locally by new hire and expensed. Windows laptops generally cost less than Macs so budget is based on Macs. For non-developers, budget is cost of a MacBook in your local area, for developers budget is cost of a MacBook Pro. Since these items are company property, you do not need to buy insurance or extended warranties for them, but you do need to report any loss or damage to people@mattermost.com as soon as it occurs.
- (New Hire) Read the entirety of Onboarding page for info on meetings, mindsets, terminology, and training materials.
- (People Ops) Send email invite to New Hire to set up an @mattermost.com email address. New Hire should use this email address on community.mattermost.com (replace personal email with company email if already registered there). `FIRST_NAME.LAST_NAME@mattermost.com` is the standard naming convention.
 
T-minus 1 week
---------------

- (People Ops and New Hire) Set up payroll.

 - US FTE, receive email to complete TriNet sign-up, payroll, benefits enrollment, I-9 form, banking information, personal information, tax forms.
 - Non-US Employee/Non-Canadian Employee, complete bank info form for monthly wire transfer.
 - Non-US Resident Contractor, complete W8-BEN form.
 - US Contractor, complete W-9 form.

First Day
---------

- (Manager) Posts welcome message in Stand-up channel.
- (Manager) Meets New Hire for first 1-1 meeting.
- (People Ops) Meets New Hire for check-in meeting.
- (Buddy) Meets New Hire for first 1-1 meeting.
- (New Hire) Confirm with Manager all HR paperwork is completed by end of first day (should have been sent in advance).

First Week
----------

- (CEO) Meets New Hire for welcome meeting.

Three Months 
------------

- (People Ops) US FTE - Email regarding 401K account set up.

Channels
---------

This section has been moved to the `Mattermost Handbook <https://handbook.mattermost.com/operations/workplace/people/working-at-mattermost/onboarding/frequently-asked-questions#what-channels-should-i-join-to-get-a-feel-for-the-company/>`_.

Meetings
--------

This section summarizes norms for public and private meetings for the Mattermost community and for Mattermost staff (people paid by Mattermost, Inc.).

Timezones 
---------

When proposing meetings use famous cities as references for time (e.g. 9am Toronto time), since it's clear and `easy to web search <https://www.google.com/search?ei=8w9nXdn0HMH4-wTH1JrgCA&q=time+in+toronto&oq=time+in+toronto>`__. Avoid using "UTC", as it has been shown to cause confusion.

When selecting a timezone city, use the most well-known city in a country where at least one team member is located. Exception: When possible, use a city where we have an official mailing address, e.g. In Western Americas use Palo Alto, instead of San Francisco. In Eastern Americas use Toronto, instead of New York.

Scheduling Recurring Group Meetings
-----------------------------------

Recurring meetings with more than two people should have one or more regular slots on the calendar reserved so that meetings can be coordinated in a straight-forward way.

1. Meetings with internal colleagues should be coordinated by checking everyone's availability in G Suite Calendar.
2. Meetings with external colleagues should be coordinated manually with one internal person coordinating everyone's G Suite Calendars.

For efficiency, when Mattermost works with advisors and consultants who engage with two or more internal team members, we aim to schedule meetings in regular slots (or a collection of regular slots) 2-4 weeks apart.

Meeting Etiquette
-----------------

Inspired by Corey Hulen's blog article of `6 Annoying Things People Do During Video Conferencing <http://hulen.com/video-conf-peevs/>`__.

1. Avoid responding to messages in chat while on a meeting:

  - It can be distracting when someone tries to covertly respond to a message. First, other people on call may hear your keyboard and notice you’re looking somewhere else. Second, if they are in the same channel as you, they can see the message ``[User] is typing...`` in Mattermost.
  - **Tip:** If you feel the need to respond immediately and are easily distracted, set yourself to "Do Not Disturb" mode while in meetings.

2. Avoid answering calls or checking text messages on your cell phone:

  - **Tip:** Put your phone on silent and place it out of arm’s reach, face down, so you don’t feel compelled to act.

3. Display your video on a monitor with your camera:

  - If you have your video display on a second monitor, it may cause you to look away from the camera, not looking at the camera when talking. It almost feels like you’re talking to someone else in the room behind your computer monitor.
  
  - **Tip:** Either move your camera, or move your video window so they are somewhat inline. Also remember to look towards the camera.

4. Mute audio in large video conferences when not speaking:
 
  - When not muted, others can hear random noises, like a fan running or a loud click-clack keyboard, which can be distracting.
  
  - **Tip:** Set your Zoom meetings to be on mute by default via Zoom settings.

5. Avoid fidgeting uncontrollably or spinning in your office chair:

  - **Tip:** If you’re in a group meeting and not doing much talking, feel free to stop your video.

6. Avoid connecting with your computer but also dialing in via cell phone:
 
  - If you connect with your computer and dial in, there are two of you in the meeting and the voice/video are not synced when you talk. In large groups, there will be a random cell phone number that no one will know who they are.
  
  - **Tip:** If you have a bad internet connection and have to dial in, exit the Zoom meeting on your computer.
  
7. When presenting, increase window zoom size or set Powerpoint slides to presenter mode:

  - Otherwise, the text on screen may be too hard for others to see.

Open Meetings
-------------

Developer Meeting
^^^^^^^^^^^^^^^^^

**Open to the public** - (Developers - 1-2 hours/week) Wednesdays 8:30 AM (`San Francisco Time <https://everytimezone.com/>`__)

- Goal: Discuss developer issues across Mattermost staff, key contributors and the contributor community.
- Attendees: (required) Mattermost staff developers, (optional) key contributors, contributors, and anyone who would like to join.

Procedure:

1. (Team and Public): Post meeting agenda in `Developers Meeting channel <https://community.mattermost.com/core/channels/developers-meeting>`__ (open to the public). Please see instructions on `how to queue an item <https://community.mattermost.com/core/pl/q4wcrcnxhtf1fr9grneb6fbrxy>`__.
2. (Team and Public): At the time of the meeting:

      - Join the **Zoom** link found in the header of the `Developers Meeting channel <https://community.mattermost.com/core/channels/developers-meeting>`__.

Mattermost Staff Meetings
-------------------------

For confidentiality of customers, internal process meetings are limited to Mattermost staff only.

Customer Obsession All-Hands Meeting
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

This is our "All Hands" meeting focused on how we're aligning the company to serve our customers. "Customer Obsession" is a key leadership principle and we emphasize its priority when we bring the company together.

Attendees:

- All Mattermost Staff
- Chair: Jason Blais
- Co-Chairs: Co-founders

Objectives:

- Reaffirm our obsession with making customers safer and more productive.
- Share how we're aligning resources to make customers successful.

Time:

- Weekly meeting on Wednesdays from 8:00am to 8:25am Palo Alto time.

Procedure:

**Before meeting:**

1. (Chair) Schedules items for the weekly agenda, and works 1-1 with presenters to prepare for them.
2. (Vice Chair) Works with new hires and their managers to schedule week 2 welcomes. If new hire or manager is away, introduction is postponed to the following meeting.

     - New team members are introduced on their second week by their manager, including name, role, what they're working on, timezone, additional info as appropriate (max 2 minutes).
     - New hire can opt-in to introduce themselves if they choose (default is not to require public speaking).
3. (Team) Shares potential meeting agenda topics with Chair via direct message. Must be shared at least 24 hours prior to meeting start and be aligned with the meeting objectives above.
4. (Vice Chair) Posts a reminder message in the meeting channel about the meeting 24 hours prior to meeting start.
5. (Chair & Vice Chair) Signs into their Zoom account to access recording and screenshare during the meeting.

**During meeting:**

1. (Vice Chair) At 7:58am Palo Alto time on the day meeting is held, post a reminder in `Customer Obsession Meeting channel <https://community.mattermost.com/private-core/channels/cust-obs-meeting>`_.

  .. code-block:: none

    @channel Customer Obsession meeting starting now https://zoom.us/j/2244480297
    
    Meeting notes: https://docs.google.com/document/d/16F86k0I_ipjhHofm5pP6yA_dWTNvmA4ZBr_z53_087Q/edit

2. (Team) Join the **Zoom** link in the header of the `Customer Obsession Meeting channel <https://community.mattermost.com/private-core/channels/cust-obs-meeting>`_, and open the **Meeting Notes** link in the header to see the agenda.

3. (Vice Chair) Start Zoom recording at 8:00am Palo Alto time.

3. (Chair and Co-Chairs) Run through the agenda, which comprises one or more of the following items:

  - **Introduction:** One of the founders does an introduction to the meeting.
  - **Week 2 welcomes of new team members:** New team members introduced on their second week by their manager, or optionally by the new team member themselves.
  - **Main topics:** Examples include: Series A marketing announce; FOSDEM event; key use cases and stories from customers to understand how they use Mattermost. Links to publicly shared documents or slides may be included in meeting notes.
  - **Feedback:** At end of meeting, concludes meeting with a reminder to share feedback via survey.

**After meeting:**

1. (Vice Chair) Share meeting recording and link to feedback survey.

  .. code-block:: none

    ### All Hands Meeting: February 20, 2019
    
    Meeting recording (and transcript) [here](https://zoom.us/recording/play/j7MHmiva3D7G4KqIcL6qV2Z46NMJZDpsdYo4B0GPDtmrRC0owvEJnC8Xpa9tAyxy?continueMode=true).
    
    Share your thoughts on this week's meeting [here](https://goo.gl/forms/AgCNmu3JxTDmSQvp2) @here.

2. (Vice Chair) Post recording to Cust Obs Prep channel, with timecode of co-founder's introduction.
3. (Chair & Vice Chair) Review recording and decide if the introduction is converted to a YouTube video and included in onboarding documentation. Sample recordings include discussions of leadership principles, mission, and core values.

Frequently Asked Questions
~~~~~~~~~~~~~~~~~~~~~~~~~~

**Why don't new people introduce themselves?**

Not everyone is comfortable with speaking in front of 60+ people. Not everyone speaks clear English. We don’t want the first company-wide meeting to be anxious for new team members, hence by default managers intro them. New hires can opt-in to introducing themselves.

Product Training and Q&A Session
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

These are our product training sessions for the Sales and Customer Success teams, along with QA, focused on frequently asked product areas. They include a functional and technical training session targeted for specific audiences.

Attendees:

- All Sales (including CEs), Customer Success (including CSMs and Support), and QA staff
- Chair: Jason Blais
- Co-Chairs: Product training session leads

Time:

- Every 3 weeks on Wednesdays from 9:00am to 10:30am Palo Alto time.

Procedure:

**Before meeting:**

1. (Chair) Schedules a kick-off call with co-chairs two weeks prior to the training session. Purpose is to review expectations and plans for the session, as well as answer any questions.
2. (Co-Chairs) Prepares a pre-screening survey to assess team members' knowledge of the product area. This is optional but recommended as it can help guide focus areas of the training session.
3. (Co-Chairs) Prepares slides and other reference material for the session. Must be shared with Chair at least 48 hours ahead of the session.

.. tip :: 

  - When sharing code snippets, highlight the area of focus within the code snippet.
  - Focus on visuals, diagrams and live demonstrations instead of slides where possible.
  - Share at least one memorable customer story.
  - Ensure enough time is given for Q&A.
  - See the Google Drive on `previous materials and training recordings for reference <https://drive.google.com/drive/u/0/folders/10Ijgspfz-hsibZMApN2GdDgWr3QfU29_>`_.

4. (Co-Chairs) Two days prior to the training session, practices a dry run for length and structure of the session. This is optional but recommended.
5. (Chair) Queues an item for that week's Customer Obsession meeting to remind everyone of the product training session taking place. Include a mention of the topic, along with who is leading the session.
6. (Chair & Co-Chairs) Signs into their Zoom account via OneLogin to access recording and screenshare capabilities during the meeting.

**During meeting:**

1. (Chair) At 8:58am Palo Alto time on the day the meeting is held, posts a reminder of the session along with a Zoom link to join the call. `See example <https://community.mattermost.com/core/pl/ward3bdkii895kw9g4sigbikwo>`_.
2. (Team) Joins the **Zoom** link in the header of the `Product Training and Q&A channel <https://community-release.mattermost.com/core/channels/product-training-and-qa>`_.
3. (Chair) Starts Zoom recording at 9:00am Palo Alto time.
4. (Chair and Co-Chairs) Runs through the agenda, which typically comprises of one or more of the following items:

- **Introductions**

- (15 minutes) **Business Use Case**

  - Audience: Everyone, but primarily CEs, CSMs
  - What does it do, why do people use it, who uses it
  - Customer use case examples and success stories
  - Roadmap (status and committed timelines, if any)
  - Q&A

- (30 minutes) **Live Product Demo**

  - Audience: Everyone
  - End user demo
  - Admin configuration demo
  - Known customer issues and workarounds
  - Q&A

- (15 minutes) **Technical Overview**

  - Audience: Primarily CSMs, CEs, Support, QA
  - Technical flow for the feature, data structure, etc.
  - What to ask for when troubleshooting
  - Q&A

- (30 minutes) **Technical Deep Dive**

  - Audience: Primarily CEs, Support, QA
  - Deeper technical review of how the feature works and how it was built
  - Working session on specific customer issues, retros on support tickets, etc.
  - Q&A

- **Feedback**: At end of meeting, remind to share feedback via survey.

5. (Chair) Encourages questions in Mattermost or Zoom chat throughout the session, but refrains audience from asking during presentation time. Asks back the questions during alloted Q&A time. By reserving questions during Q&A, the session stays on time and sets expectations for attendees on when to join the conversation with questions.

**After meeting:**

1. (Chair) Shares link to feedback survey, tailored for each training session to measure its effectiveness. `See example <https://community.mattermost.com/core/pl/7w5w5aou4jfkxm95g6fwkcqxry>`_.
2. (Chair) Uploads meeting recording and slides to `Google Drive folder <https://drive.google.com/drive/u/0/folders/10Ijgspfz-hsibZMApN2GdDgWr3QfU29>`_, then share in channel. `See example <https://community.mattermost.com/core/pl/dkeh34y5pt8ybrb5mmrfbyy1ee>`_.
3. (Chair & Co-Chairs) Holds a retrospective meeting two days after the training session to review feedback and discuss what could have been improved.
4. (Chair) Makes adjustments to meeting process based on feedback and discussion with co-chairs. Schedules kick-off call for the next training session.
5. (Co-Chairs) Updates product documentation or other resources based on the training session.
6. (Chair & Co-Chairs) Shares slides and meeting recording with Marketing team for potential GTM collateral.

Sprint Planning
^^^^^^^^^^^^^^^

**Mattermost staff only** - Each team is responsible for its own sprint planning process. Sprints are currently one week long, and start on Tuesdays. Note that teams also share demos and short updates with the whole product team in the "R&D Meeting" (see below).

- Goal: Share demos, reflect on previous sprint, and lock on tickets for next sprint.
- Attendees: Development team members (typically developers and product manager).

Triage Meeting
^^^^^^^^^^^^^^

**Mattermost staff-only** - (Triage team - 2-2.5 hours/week) daily at 09:30 or 10:00 (`San Francisco Time <https://everytimezone.com/>`__).

- Goal: To provide consistent review, prioritization and ownership assignment of all tickets.
- Attendees: One dev representative from each development team, at least one PM, QA team, Release Manager, and optionally leads, customer support and other Mattermost staff.

**Note:**

- When tickets are first created, they go to triage to be reviewed for clarity and priority and assigned a Fix Version, Mattermost Team and Sprint. Unclear tickets may be assigned to their creator for more information.
     - The **Fix Version** determines the sequence in which tickets are addressed and triage team is accountable for that sequence. It is the responsibility of the triage team to make sure tickets are clear before they're assigned a Fix Version.
     - When assigning a ticket to a **Mattermost Team**, it gets assigned to a dev and put into the current release's Fix Version and the current sprint if the ticket is time-sensitive for release. Otherwise the ticket is assigned to a team with a "Triage" Fix Version and is later prioritized and assigned to the appropriate people within that team.
     - The **Sprint** determines the time frame within which a dev is responsible for fixing the ticket.

- If you're ever unsure about a ticket (if it's not clear, or doesn't seem appropriate) add a comment and add triage to the Fix Version field, which will trigger a review by the triage team in 1-6 working days.
     - **Note:** If the ticket is already assigned to a team, it will not appear in the triage query - easiest is to let the triage team know about the ticket so that it won't be missed.

Procedure:

1. (Attendees): Join Zoom meeting link in calendar invitation at scheduled time.
2. (Attendees): Review `query for tickets needing triage <https://mattermost.atlassian.net/browse/MM-8015?filter=15011>`__ and assign a development team, sprint, and fix version.

Leads Meeting
^^^^^^^^^^^^^

**Mattermost staff only** - (Leads - 1 hour/week) Wednesday (13:00 `San Francisco Time <https://everytimezone.com/>`__)

- Goal: Address leadership and process topics.
- Attendees: (Required) Leads from R&D, Marketing, Sales, and Operations.

Note:

- Decisions should go to Leads meetings when there is lack of clarity or ownership, or to discuss special case topics where process is not well defined.
    - When possible, decision-making should belong to the people closes to details.
    - Individual developers or PMs should make most decisions, and raise to developer or PM team if things are unclear, and go to Leads if lack of clarify persists.
- To queue an item for Leads ask the dev or PM lead.
- Leads is also used for cross-discipline Q&A.

    - Rather than randomize individual contributors, cross-discipline discussion (e.g. marketing to PM, community to dev, etc.) can happen in leads.

Procedure:

1. (Leads): Queue items in Leads channel for discussion.

2. (Leads): During meeting discuss agenda items in sequence.

R&D Meeting
^^^^^^^^^^^

**Mattermost Inc-only** - (Product Staff - 45 min/week) Thursdays at 09:00 (`San Francisco Time <https://everytimezone.com/>`__).

Regular team meeting for product staff team at Mattermost Inc.

- Goal: Increase team output by effectively reviewing priorities and finding blindspots.
- Scope: Mattermost Inc-only meeting given confidential customer issues discussed.
- Attendees: Mattermost Inc colleagues working on mattermost-server and mattermost-webapp.

The meeting includes presentations and demos, controlled agenda items (e.g. queued items) with an "open session" where staff can bring up anything they want. Staff should arrive at decisions during the meeting or schedule further discussion for the next meeting.

Procedure:

1. (Vice Chair) the day before the meeting, post a reminder in `R&D Meeting private channel <https://community.mattermost.com/core/channels/platform-meeting>`__ (Mattermost Inc only).

::

   #### @channel A reminder to prepare your items for R&D meeting [DATE]:
   1. @[name], @[name] and @[name] - you're up for `ice-breaker <https://docs.mattermost.com/process/training.html#ice-breaker>`__.
   2. If you'll be giving a demo, please queue it [in the meeting notes](link).
   ##### Everyone is encouraged to bring up items for discussion. If the discussion is `time-copped` during the meeting, please be sure to add a `next step` to the notes and post a link to where the conversation can be continued. ~platform channel is usually a good place to continue discussions.

2. (Team) At time of meeting:

   - Join the **Zoom** link in the header of the `R&D Meeting private channel <https://community.mattermost.com/core/channels/platform-meeting>`__.
   - Open the **Notes** link in the header to see the agenda.

3. (Vice-Chair) Post `meeting notes template <https://docs.google.com/document/d/1ImSgkF7T03wbKwz_t4-Dr4n3I8LixVbFb2Db_u0FmdM>`__ into R&D meeting notes.
   
   - Add **Follow-ups** from previous meeting.
   - Add **New items** queued in `R&D Meeting private channel <https://community.mattermost.com/core/channels/platform-meeting>`__ (Mattermost Inc only).

Meeting Agenda:

- **Ice-breaker:** See **Meeting Elements > Ice-breaker** below for examples.
- **Release updates:** Overview of current release status.
- **Announcements:** Short announcements that the entire team needs to know about.
- **Demos:** Team members show highlights of what's been completed this week. Relevant follow-ups noted.
- **Blind spots, Inspiration, Knowledge Share:** Colleagues share areas of concern and ask questions. Proposals for items that have already been discussed outside of the meeting can also be queued here.

Post Meeting:

- If there are follow-up items, these are posted to the  `R&D Meeting private channel <https://community.mattermost.com/core/channels/platform-meeting>`__ (Mattermost Inc only).
- Vice Chair posts a link to the meeting recording for those who could not attend.

Meeting Elements
----------------

Here we summarize meeting elements that can be re-used for meetings across teams.

Ice-breaker
^^^^^^^^^^^

- 2-3 minute exercises designed to learn more about colleagues at the start of a recurring meeting.
- Typically rotates in random order with names pulled from the `R&D Meeting Ice-breaker List <https://docs.google.com/spreadsheets/d/1dCgKFdYkaDYd7yzgbK2VcqscZ1Ni5uNnnkZZv63XtOg/edit#gid=0>`__, three colleagues per meeting (2 R&D staff, 1 'other' (e.g. Sales, Ops, etc).

- Examples:
   - "Hobby talk" - Sharing about an interesting hobby, past or present.
   - "My home town" - Sharing something interesting about where you grew up.
   - "Two truths and a lie" - Share two true facts about yourself and one lie, team guesses which is the lie.
   - "Questions" - e.g. "What would constitute a “perfect” day for you?"
   - Need further inspiration? Take a look `here <https://medium.com/signal-v-noise/the-25-most-popular-icebreaker-questions-based-on-four-years-of-data-893df9b27531>`__.

Blind spots, Inspiration, Knowledge Share
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

- Exercise to find blindspots in team thinking at the end of a meeting.
- Items for team discussion can also be queued in this section.
- Colleagues share areas of concern and ask questions which invariably disclose blind-spots or are an opportunity to improve communication.
- Examples of questions:
    - "What's the status on X?" // often an important item that got forgotten.
    - "Who owns X?" // reveals need for more clarity or communication.
    - "Why do we do X?" // let's us verify if a process is needed, and if we're handling it the right way.

Mindsets
--------

This section has been moved to the `Mattermost Handbook <https://handbook.mattermost.com/company/about-mattermost/mindsets/>`_.

Terminology
-----------

Designing world-class software means bringing people together across disciplines and cultures. We want to create a limited amount of shared terminology to help us work better together, while being careful not to make it difficult for newcomers to follow our conversation.

Perhaps in future we'll have a bot that helps teach newcomers about the terminology in-context. Until then we have this guide.

Purpose
-------

We use Mattermost terminology to achieve specific benefits:

1) Increase precision through unambiguous definitions of useful terms
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

For example, "0/5" and "5/5" help convey the level of conviction behind an opinion. Also, a precise classification of tickets as "Bug" or "Improvement" is critical since it affects scheduling and decision making, and so forth.

2) Increase the speed of communication via a small number of frequently used acronyms
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

`LHS`_ and `RHS`_ are examples of a very limited number of acronyms to use to speed discussions, specifications, and ticket writing.

3) Reduce repeated mistakes by naming very specific undesirable behaviors
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Naming specific repeated mistake helps us find patterns, avoid repeated mistakes in future, and helps newcomers avoid making similar mistakes as they learn our organization's terminology.

List of Terms
-------------

This section has been moved to the `Mattermost Handbook <https://handbook.mattermost.com/company/about-mattermost/list-of-terms>`_.

Training
--------

At Mattermost, "Learn, Master, Teach" cycles are core to our culture. You should be constantly growing and cross-training into new skills and responsibilities, developing expertise, and then training your replacement as you prepare to take on new challenges.

Cross-training creates a culture of constant growth, protects against single-points of failure, and challenges each of us to rise to our fullest potential.

Roles
------

The "Learn, Master, Teach" cycle happens in the context of roles. Roles are sets of responsibility needed to achieve objectives. Roles aren't necessarily job titles, for small projects, a developer might take on a product manager role, or vice versa. Each team member has a "primary role" and training should move people to mastery and teaching in that role, before moving to the next role.

Developer
^^^^^^^^^

Developers are responsible for architecting and delivering software improvements, and for technical leadership among the Mattermost community.

- Architecture
    - Developers are responsible for researching, analyzing, designing and reviewing technical solutions to achieve functional requirements. Solutions should thoroughly consider trade-offs and be evaluated based on the effectiveness of the end implementation.

- Delivery
   - Based on technical designs, developers estimate, implement, test, maintain, review, debug and release software improvements in collaboration with teammates. This includes working closely with product managers to validate requirements and the output of designs and making appropriate adjustments. The success of implementation is judged on the end results achieved by the changes.

- Technical Community Leadership
   - As leading experts on Mattermost technology, developers support and engage constantly with the broader Mattermost community to accelerate adoption and to discover new ways to improve Mattermost software and processes. This includes investigating and  supporting issues from users and customers, reviewing and providing feedback on projects from contributors, and understanding priorities, trends and patterns across the community.

Product Managers
^^^^^^^^^^^^^^^^

Product Managers are responsible for aligning teams to strategic priorities, leading and managing the product development process, and working effectively with marketing to bring the full benefits of Mattermost solutions to users and customers.

- Strategy
   - Every project and every team needs to align to strategic priorities and focus on intended outcomes developed through a deep understanding of the market, user, customers and competing products and services. Amid a flood of compelling suggestions, opinions, and data, product managers must find what's vital, and rally teams around a shared vision.

- Product development
   - Product Managers lead both the functional design process (user, customer and competitor research, analysis, ideation, prioritization, functional and user experience design, functional specification, user and customer validation), and the software development process (ticketing, prioritization, roadmap design, scheduling, sprint planning, triage, functional verification, implementation validation with users and customers, documentation, and release logistics).
   - It's the Product Manager's responsibility to see features shipped predictably and at high quality through planning, attention to detail and thoughtful persuasion.

- Marketing connection
   - Delivering benefits to users and customers based on product features is a core responsibility of product managers, working in conjunction with marketing to shape messaging and positioning and delivering collateral, events, and user and customer discussions to support sales.

Resources
---------

The following is a list of recommended resources for developing skills "the Mattermost way" in different areas. For the ones that require purchase, message your manager to request an order, whether as physical books, digital books, audiobooks, or other formats.


Developers
^^^^^^^^^^

Books
^^^^^

1. `Code Complete, Steve McConnell <https://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670>`__ - Best practices and guidelines for writing high quality code.
2. `Design Patterns, Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides (aka "Group of Four") <https://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented-ebook/dp/B000SEIBB8>`__ - Fundamental reading on design patterns. Other design pattern books work too, this is one of the most popular.

Product Management
^^^^^^^^^^^^^^^^^^

Courses

1. `Harvard Business School PM 101 <https://sites.google.com/site/hbspm101/home/2015-16-sessions/the-mrd-customer-discovery>`__

Relevant Docs

1. :doc:`design-process`

Software Strategy
^^^^^^^^^^^^^^^^^^^

1. `Monetizing Open Source (Or, All Enterprise Software) <https://a16z.com/2017/04/10/monetizing-open-source-enterprise-software/>`__ - Required reading for business roles.

System Security
^^^^^^^^^^^^^^^

Papers and Course Materials

1. `Framework for Improving Critical Infrastructure Cybersecurity. National Institute of Standards and Technology <https://templatelab.com/cybersecurity-framework/>`__ - Standards for internal Mattermost security processes and safeguards.
2. `Computer Security in the Real World. Butler Lampson <https://research.microsoft.com/en-us/um/people/blampson/69-SecurityRealIEEE/69-SecurityRealIEEE.pdf>`__ - Fundamental challenges with system security.
3. `Course notes from CS513: System Security (Cornell University). Fred B. Schneider <https://www.cs.cornell.edu/courses/cs513/2007fa/02.outline.html>`__ - Well written introduction to system security from one of the leaders in the field.

Additional Training Resources
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Recommended training materials are recommended by role at three different levels of priority:

1. P1 - Required - Complete within 30 days of starting in role.
2. P2 - Priority - Complete within 30-90 days of starting.
3. P3 - Supplementry - Complete within 180 days.

The following chart outlines training materials by category, with notes on which materials are relevant to which disciplines by P1, P2, P3 priority:

.. raw:: html

    <embed>
        <iframe class="airtable-embed" src="https://airtable.com/embed/shrbjzgakQoNaXhYt?backgroundColor=gray&viewControls=on" frameborder="0" onmousewheel="" width="100%" height="1320" style="background: transparent; border: 1px solid #ccc;"></iframe>
        <p>&nbsp;</p>
    </embed>

The following table summarizes abbreviations used in the above table:

.. raw:: html

    <embed>
        <iframe class="airtable-embed" src="https://airtable.com/embed/shrlwbsr0Y9telZn8?backgroundColor=gray&viewControls=on" frameborder="0" onmousewheel="" width="100%" height="395" style="background: transparent; border: 1px solid #ccc;"></iframe>
        <p>&nbsp;</p>
    </embed>

Consulting Advisers
-------------------

To provide guidance, coaching and development for senior and functional leaders, we bring in experts to advise in key areas.

- As an example, `Jono Bacon <http://www.jonobacon.org/about/>`__--a leading author, speaker and consultant on open source community advocacy--meets with our CEO and community team regularly to refine our processes and understanding. There's a range of similarly adept company advisers that help advance our thinking and capabilities in critical ways.

Meetings typically take place over phone or video calls. We bring on advisers with `standard consulting agreements <https://docs.google.com/document/d/1G4wFLq_wHHEDJ-hrv5Kmu022mFJgh3rJ4-glM0W6riI/edit#heading=h.pwxwwq4ezzfx>`_ on either a time and materials basis or a recurring fee.

We use a range of advisers from senior board-level contributors to operational and subject-matter experts.

Mattermost Avatar
-----------------

When becoming a core committer to the Mattermost project we create a "Mattermost Avatar" for you as a fun way to recognize your new level of contribution.

Mattermost avatars are caricatures of core committers in the costume of a popular culture character (e.g. Spiderman, Wonder Woman, Luke Skywalker, etc.) created for personal use, and which may be potentially used in team rosters, demonstration sites, "group photos" where avatar images from the team are collected in one image of all the characters together, and other public uses.

To have a Mattermost avatar created, you'll be invited to create a Mattermost avatar via email:

1. Please use the email subject "[YOUR_FULL_NAME] as [CHARACTER_NAME]", for example "Corey Hulen as Han Solo".
2. Attach a clear image at least 600 pixels high and 600 pixels wide showing your character's full body in a standing pose.
3. Send a clear photo of your face at least 600 pixels high and 600 pixels wide facing the same direction as your character image.

Notes: 

1. Character should be human-sized (no giant characters).
2. Character's appearance should be family-friendly. For example, no gory or provocative costumes.
 
You should receive your digital Mattermost avatars by email in 6-8 weeks.

In special cases, a Mattermost avatar may be created for someone from the Mattermost community who has made an extraordinary contribution to the open source project.

- Example of photo from core committer: `Corey Hulen, co-creator of the Mattermost open source project <https://cloud.githubusercontent.com/assets/177788/25364362/c2fee10c-2916-11e7-9de3-2947987a9dce.png>`__

- Example of reference image for popular culture character: `Han Solo from the movie Star Wars  <https://cloud.githubusercontent.com/assets/177788/25364375/e49415bc-2916-11e7-94ae-038a120743b3.png>`__

Example of finished Mattermost Avatar:

.. image:: https://cloud.githubusercontent.com/assets/177788/25364270/0425b738-2916-11e7-9a23-5ced2d9dfc8f.png

Mattermost Teams and Naming Conventions
---------------------------------------

Staff must use their full name for their username, as in ``first.last``, on the community server. Staff are also encouraged to link to their GitHub account using the command `/github connect` so that your GitHub handle will appear on your profile pop-over card.  All Mattermost  staff should be issued a OneLogin account with a username of ``first.last``.  If issued a OneLogin account, you should switch your sign-in method from email/password to OneLogin via **Account Settings > Security > Sign-in Method** page.  Once this is done, your username will be set from SAML.

Contributors Team
-----------------

This is a team open for any and all to join.  It is the main place where staff, contributors, users, customers and partners interact.  Our goal is to do as much work as possible in the open.  If you find yourself creating a private channel on this team you should pause and ask yourself if it really needs to be private.  Mattermost staff will be synced to the appropriate channels based on their LDAP group sync settings.

Staff Team
----------

This is restricted to people with an `@mattermost.com` email address.  It is meant for Mattermost employees and staff and is where we discuss internal company matters.  Since this team only includes people with mattermost.com email address, you should prefer creating public channels.  Also, if you find yourself creating a channel here, you should ask yourself if it would be better served to have it in the Contributors team.  Mattermost staff will be synced to the appropriate channels based on their LDAP group sync settings.

Partners Team
-------------

This is an invite-only team meant for Mattermost staff and partners.  This is a team for staff to interact with partners and for partners to interact with other partners. You should prefer public channels when you want partner-to-partner interactions and private channels when you want staff-to-partner interactions.  Remember that any partner added to the team will be able to join any public channel.

source/archive/tooltip.png METASEP

source/archive/toolkit.rst METASEP
:nosearch:

Mattermost Developer Toolkit 
============================

More Power for Developers
--------------------------

This document is a work in progress, summarizing developer toolkit capabilities currently under development. For developer-focused documentation, see `developers.mattermost.com/extend <https://developers.mattermost.com/extend/plugins/>`__.

The Mattermost Developer Toolkit gives community and in-house customer developers the power to integrate deeply with, and extend, Mattermost servers and clients in order to meet their particular requirements - without “reinventing the wheel”. We are still in the early stages of architecting the toolkit so what follows is a non-definitive list of the features we would like to offer.

If you have ideas on additional features that you would like to see in our Developer Toolkit, `please get in touch <https://community.mattermost.com/core/channels/developer-toolkit>`__.

Better Control for System Admins
---------------------------------

The main benefits of the Mattermost Developer Toolkit from a system administration perspective are first, that it puts all of the resources and information that developers will need in one central location and second, it simplifies integrations with Mattermost.

Consequently this will save time for system administrators as well as developers.

Features of the Developer Toolkit
---------------------------------

Below is a list of planned features of the developer toolkit with estimated time of delivery.

1. Completed:

 - Webhooks and slash commands to allow easy, low-effort extension and integration.
 - Mattermost HTTP REST APIv4 allowing for much more powerful server interaction.
 - Mattermost webapp moved over to Redux infrustructure.
 - API developer token to provide a simple method to authenticate to the Mattermost REST API.
 - The ability to build webapp client plugins to override existing UI components (replace posts with your custom components, use your own video services etc.), modify/extend client drivers to interact with custom server API endpoints, and add whole new UI views in predetermined places.
 - The ability to build server plugins to hook directly into server events (e.g., new post events, user update events, etc.), have some form of database access (possibly access to certain tables, and the ability to create new tables) and to add custom endpoints to extend the Mattermost REST API.

2. Upcoming:

 - The ability to build plugins similar to the webapp but for React Native apps for iOS and Android.
 - A system or architecture to combine the above plugins into one easy-to-share and easy-to-install package.
 - A market or directory to find official and/or certified by Mattermost plugins and a process to get your plugin certified.
 - A guide or system to enable the embedding of Mattermost into other apps as a chat service.

All of the documentation required to support the use and building of the toolkit will be done as we work through the above systems.

Example Uses
------------

Examples of uses for the plugin architecture include:

1. Building common integrations such as Jira and GitHub, and including them as default integrations for Mattermost.

	.. image:: ../../source/images/developer-toolkit-jira.png

2. Providing tools to interact with user posts.

	.. image:: ../../source/images/developer-toolkit-map.png

3. Redesigning the current video and audio calling to use the plugin architecture, and offering it as one of many video and audio calling solutions.

4. Incorporating other third-party applications such as annual performance reviews right from the Mattermost interface.

	.. image:: ../../source/images/developer-toolkit-appcenter.png

source/archive/title.png METASEP

source/archive/template-mm-rollout.rst METASEP
:nosearch:

.. _template-mm-rollout:

Mattermost Rollout Template
===========================

This template provides sample text and links for internal distribution. It can be used by organizations to help their users get started with Mattermost, and assumes that the users are not familiar with other messaging systems.

Announcement Template
---------------------

Welcome to Mattermost at {name-of-organization}.

To get started, go to http://{web-address} and log in. The login depends on how your organization has set up Mattermost.

When you log in for the first time, page through the brief tutorial. When done, you're at the Mattermost interface where you can start chatting with colleagues.

Every time you log in, you end up in the Town Square channel in a team that you are a member of. Within a team, conversations take place in channels, private groups, and direct messages. For more information about writing messages, see `Messaging Basics <https://docs.mattermost.com/help/getting-started/messaging-basics.html>`__

To learn how to send, edit, and reply to messages, see `Sending Messages <https://docs.mattermost.com/help/messaging/sending-messages.html>`__

Teams
  In most cases, only one team is visible to you, but multiple teams are allowed. If you are a member of more than one team, you can see the list of teams beside the navigation panel in the Team Sidebar.

  Each team has its own set of public channels, private groups, and direct messages that are visible only to the members of that team.

  To create a team, see `Creating Teams <https://docs.mattermost.com/help/getting-started/creating-teams.html>`__

Public Channels
  You have access to all public channels in your team, and can add yourself to any public channel in the team. To find out how to create, join, and manage channels, see `Managing Channels <https://docs.mattermost.com/help/getting-started/organizing-conversations.html#managing-channels>`__

Private Groups
  Private groups are channels that are invite-only. The conversations are visible only to the channel members.

Direct Messages and Group Messages
  Direct Messages are for conversations between two people. Group Messages are Direct Messages that have conversations among three or more people. Both are visible only to the people involved.

For more information about using channels, groups, and direct messages, see `Organizing Conversations <https://docs.mattermost.com/help/getting-started/organizing-conversations.html>`__

Instructions for System Admin
------------------------------

Replace {name-of-organization} and {web-address} with appropriate values.

Add new user login instructions that are specific to your organization. The login experience varies depending on whether you set up SSO, SAML, LDAP, or some other method.

Users can access Mattermost via their browsers, or they can download and install one or more of the following client apps:

Windows PC Desktop App
  Download: https://releases.mattermost.com/desktop/3.6.0/mattermost-setup-3.6.0-win64.exe
  Installation Instructions: https://docs.mattermost.com/install/desktop.html#windows-10-windows-8-1-windows-7
Apple Mac Desktop App
  Download: https://releases.mattermost.com/desktop/3.6.0/mattermost-desktop-3.6.0-osx.tar.gz
  Installation Instructions: https://docs.mattermost.com/install/desktop.html#mac-os-x-10-9
Linux Desktop App (beta)
  Download: https://releases.mattermost.com/desktop/3.6.0/mattermost-desktop-3.6.0-linux-x64.tar.gz
  Installation Instructions: https://docs.mattermost.com/install/desktop.html#linux-beta
iOS App
  Download and install from the Apple App Store: https://itunes.apple.com/us/app/mattermost/id984966508?ls=1&mt=8
Android App
  Download and install from Google Play: https://play.google.com/store/apps/details?id=com.mattermost.mattermost&hl=en

source/archive/system-administration.rst METASEP
:nosearch:
source/archive/sso-saml-troubleshooting.rst METASEP
:nosearch:

Troubleshooting
---------------

The following are troubleshooting suggestions on common error messages and issues.

1. Unable to switch to SAML authentication successfully

  First, ensure you have installed the `XML Security Library <https://www.aleksey.com/xmlsec/download.html>`__ on your Mattermost instance and that **it is available in your** PATH.

  Second, ensure you have completed each step of the SAML configuration.

If you are still having trouble with configuration, see further troubleshooting notes below or feel free to post in our `Troubleshooting forum <https://forum.mattermost.com/c/trouble-shoot>`__ and we'll be happy to help with issues during setup.

2. System Administrator locks themselves out of the system

  If the System Administrator is locked out of the system during SAML configuration process, they can set an existing account to System Administrator using `a command line tool <https://docs.mattermost.com/getting-started/admin-onboarding-tasks.html#common-tasks>`__.

3. Received error message: `An account with that username already exists. Please contact your Administrator.`

  This usually means an existing account has another authentication method enabled. If so, the user should sign in using that method (such as email and password), then change their sign-in method to SAML via **Account Settings > Security > Sign-in method**.

  This error message can also be received if the `Username Attribute` of their SAML credentials doesn't match the username of their Mattermost account. If so, the user can update the attribute at their identity provider (for instance, back to the old value if it had been previously updated).

4. Received error message: `An account with that email already exists. Please contact your Administrator.`

  This usually means an existing account has another authentication method enabled. If so, the user should sign in using that method (such as email and password), then change their sign-in method to SAML via **Account Settings > Security > Sign-in method**.

  This error message can also be received if the `Email Attribute` of their SAML credentials doesn't match the email address of their Mattermost account. If so, the user can update the attribute at their identity provider (for instance, back to the old value if it had been previously updated).

5. Received error message: `SAML login was unsuccessful because one of the attributes is incorrect. Please contact your System Administrator.`

  Confirm all attributes, including `Email Attribute` and `Username Attribute`, are correct in both the Identity Provider configuration and in **System Console > SAML**.

source/archive/sso-saml-okta.md METASEP
# Configure SAML with Okta

The following process provides steps to configure SAML with Okta for Mattermost.

## Pre-installation

1 - Before configuring SAML with Okta, make sure you have the [XML Security Library](https://www.aleksey.com/xmlsec/download.html) installed on your Mattermost instance. The XML Security Library is usually included as part of Debian GNU/Linux.

Also confirm if the `xmlsec1-openssl` library was successfully installed. If not, run
 - `apt-get install libxmlsec1-openssl` on Ubuntu
 - `yum install xmlsec1-openssl` on RHEL

2 - (Optional) If you would like to set up encryption for your SAML connection, generate encryption certificates now. You are free to use [our script in the `/docs` repo](https://github.com/mattermost/docs/tree/master/source/scripts/generate-certificates) or use another method to generate them.

You should save the two files that are generated, which will be referred to as the **Service Provider Private Key** and the **Service Provider Public Certificate** in this guide.

## Set up a connection app for Mattermost SSO

3 - Sign into Okta as an administrator.

4 - Go to **Admin Dashboard > Applications > Add Application**.

5 - Click **Create New App** and choose `SAML 2.0` as the Sign on method.

![okta_1_new_app](../../source/images/okta_1_new_app.png)

6 - Enter **General Settings** for the application, including `App name` and `App logo` (optional). It is recommended to display the application icon to users, including in the Okta Mobile app.

If you’d like to use a Mattermost logo for the application, you are free to download one [from our page](https://handbook.mattermost.com/operations/operations/publishing/publishing-guidelines/brand-and-visual-design-guidelines).

![okta_2_general_settings](../../source/images/okta_2_general_settings.png)

7 - Enter **SAML Settings**, including:
 - Single sign on URL: `https://<your-mattermost-url>/login/sso/saml`
 - Audience URL: For instance, `mattermost`
 - Name ID format: `unspecified`
 - Application username: `Email`

![okta_3_initial_saml_settings.png](../../source/images/okta_3_initial_saml_settings.png)

8 - (Optional) Set up encryption for your SAML connection. First, click **Show Advanced Settings**.

![okta_4_initial_saml_settings.png](../../source/images/okta_4_initial_saml_settings.png)

Then, set **Assertion Encryption** as `Encrypted` and upload the **Service Provider Public Certificate** you generated in step 2 to the **Encryption Certificate** field.

![okta_5_advanced_saml_settings.png](../../source/images/okta_5_advanced_saml_settings.png)

9 - Enter attribute statements, which will be used to map attributes between Okta and Mattermost. For more information on which attributes are configurable, see our [documentation on SAML configuration settings](https://docs.mattermost.com/configure/configuration-settings.html#saml). Email and username attributes are required. For Mattermost servers running 3.3 and earlier, first name and last name attributes are also required.

![okta_6_attribute_statements.png](../../source/images/okta_6_attribute_statements.png)

10 - Click **Next**. Then, set Okta support parameters for the application. Recommended settings:
 - I’m an Okta customer adding an internal app
 - This is an internal app that we have created

![okta_7_support_configuration.png](../../source/images/okta_7_support_configuration.png)

11 - Click **Finish**. On the next screen, click the **Sign On** tab and click **View Setup Instructions**.

![okta_8_view_instructions.png](../../source/images/okta_8_view_instructions.png)

12 - Take note of `Identity Provider Single Sign-On URL` (also known as `SAML SSO URL`), and the Identity Provider Issuer, as both will be needed to configure SAML for Mattermost. 

Furthermore, you **must download the X.509 Public Certificate file** and save it. You will need to upload it to Mattermost at a later step.

![okta_9_view_instructions.png](../../source/images/okta_9_view_instructions.png)

## Configure SAML for Mattermost

13 - Start Mattermost server and sign into Mattermost as a System Administrator. Go to **System Console > Authentication > SAML**, and enter the following fields:
 - **SAML SSO URL**: `Identity Provider Single Sign-On URL` from Okta, specified in step 12.
 - **Identity Provider Issuer URL**: `Identity Provider Issuer` from Okta, specified in step 12.
 - **Identity Provider Public Certificate**: X.509 Public Certificate file you downloaded from Okta in step 12.

![okta_10_mattermost_basics.png](../../source/images/okta_10_mattermost_basics.png)

14 - (Optional) Configure Mattermost to verify the signature. The **Service Provider Login URL** is the `Single sign on URL` you specified in Okta in step 7.

![okta_11_mattermost_verification.png](../../source/images/okta_11_mattermost_verification.png)

15 - (Optional) Enable encryption based on the parameters provided in step 8.

![okta_12_mattermost_encryption.png](../../source/images/okta_12_mattermost_encryption.png)

16 - Set attributes for the SAML Assertions, which will be used to update user information in Mattermost. Attributes for email and username are required and should match the values you entered in Okta in step 9. See [documentation on SAML configuration settings](https://docs.mattermost.com/configure/configuration-settings.html#saml) for more detail.

For Mattermost servers running 3.3 and earlier, the first name and last name attributes are also required fields.

![okta_13_mattermost_attributes.png](../../source/images/okta_13_mattermost_attributes.png)

17 - (Optional) Lastly, customize the login button text.

![okta_14_mattermost_login_button.png](../../source/images/okta_14_mattermost_login_button.png)

18 - Click **Save**.

You’re done! If you’d like to confirm SAML SSO is successfully enabled, switch your System Administrator account from email to SAML-based authentication via **Account Settings > General > Sign-in Method > Switch to SAML SSO** and sign in with your SAML credentials to complete the switch.

It is also recommended to post an announcement about how the migration will work to users.

You may also configure SAML for Okta by editing `config.json`. Before starting the Mattermost server, edit `config.json` to enable SAML based on [SAML configuration settings](https://docs.mattermost.com/configure/configuration-settings.html#saml). You must restart the Mattermost server for the changes to take effect.

### Troubleshooting

The following are troubleshooting suggestions on common error messages and issues. 

#### 1. System Administrator locks themselves out of the system

If the System Administrator is locked out of the system during SAML configuration process, they can set an existing account to System Administrator using [a commandline tool](https://docs.mattermost.com/getting-started/admin-onboarding-tasks.html). 

#### 2. Received error message: `An account with that username already exists. Please contact your Administrator.`

This usually means an existing account has another authentication method enabled. If so, the user should sign in using that method (such as email and password), then change their sign-in method to SAML via **Account Settings > Security > Sign-in method**.

#### 3. Received error message: `An account with that email already exists. Please contact your Administrator.`

This usually means an existing account has another authentication method enabled. If so, the user should sign in using that method (such as email and password), then change their sign-in method to SAML via **Account Settings > Security > Sign-in method**.

#### 4. Received error message: `SAML login was unsuccessful because one of the attributes is incorrect. Please contact your System Administrator.`

Confirm all attributes, including `Email Attribute` and `Username Attribute`, are correct in both the Okta configuration and in **System Console > SAML**.

#### 5. Unable to switch to SAML authentication successfully

First, ensure you have installed the [XML Security Library](https://www.aleksey.com/xmlsec/download.html) on your Mattermost instance and that **it is available in your** `PATH`.

Second, ensure you have completed each step in our guide above for configuring SAML with Okta.

Lastly, if you are still having trouble with configuration, feel free to post in our [Troubleshooting forum](https://forum.mattermost.com/c/trouble-shoot) and we'll be happy to help with issues during setup.

source/archive/sso-saml-adfs.md METASEP
# Configure SAML with Microsoft ADFS (Active Directory Federation Services)

The following process provides steps to configure SAML with Microsoft ADFS for Mattermost.

## Basic Requirements for ADFS

The following are basic requirements to use ADFS for Mattermost:
 - An Active Directory instance where all users have a specified email and username attributes. For Mattermost servers running 3.3 and earlier, users must also have their first name and last name attributes specified.
 - A Microsoft Server running. The screenshots used in this guide are from Microsoft Server 2012R2, but similar steps should work for other versions.
 - An SSL certificate to sign your ADFS login page.
 - ADFS installed on your Microsoft Server. You can find a detailed guide for deploying and configuring ADFS in [this article](https://msdn.microsoft.com/en-us/library/gg188612.aspx).

## Pre-installation

1 - On your ADFS installation, note down the value of the **SAML 2.0/W-Federation URL** in ADFS Endpoints section, also known as the **SAML SSO URL Endpoint** in this guide. If you chose the defaults for the installation, this will be `/adfs/ls/`.

2 - Before configuring SAML with Microsoft ADFS, make sure you have the [XML Security Library](https://www.aleksey.com/xmlsec/download.html) installed on your Mattermost instance. The XML Security Library is usually included as part of Debian GNU/Linux.

Also confirm if the `xmlsec1-openssl` library was successfully installed. If not, run
 - `apt-get install libxmlsec1-openssl` on Ubuntu
 - `yum install xmlsec1-openssl` on RHEL

3 - (Optional) If you would like to set up encryption for your SAML connection, generate encryption certificates now. You are free to use [our script in the `/docs` repo](https://github.com/mattermost/docs/tree/master/source/scripts/generate-certificates) or use another method to generate them.

You should save the two files that are generated, which will be referred to as the **Service Provider Private Key** and the **Service Provider Public Certificate** in this guide.

## Adding a Relying Party Trust

4 - In ADFS management sidebar, go to **AD FS > Trust Relationships > Relying Party Trusts** and click **Add Relying Party Trust…**

![adfs_1_add_new_relying_party_trust.png](../../source/images/adfs_1_add_new_relying_party_trust.png)

5 - A configuration wizard for adding a new relying party trust opens. In the **Welcome** screen, click **Start**.

![adfs_2_start_wizard.png](../../source/images/adfs_2_start_wizard.png)

6 - In the **Select Data Source** screen, select the option **Enter data about the relying party manually**.

![adfs_3_select_data_source.png](../../source/images/adfs_3_select_data_source.png)

7 - In the **Specify Display Name** screen, enter a **Display Name** to recognize the trust, such as `Mattermost`, and add any notes you want to make.

![adfs_4_specify_display_name.png](../../source/images/adfs_4_specify_display_name.png)

8 - In the **Choose Profile** screen, select the option **AD FS profile**.

![adfs_5_choose_profile.png](../../source/images/adfs_5_choose_profile.png)

9 - In the **Configure Certificate** screen, leave the certificate settings at their default values. 

![adfs_6_configure_certificate_default.png](../../source/images/adfs_6_configure_certificate_default.png)

However, if you would like to set up encryption for your SAML connection, click the **Browse…** button and upload your Service Provider Public Certificate.

![adfs_7_configure_certificate_encryption.png](../../source/images/adfs_7_configure_certificate_encryption.png)

10 - In the **Configure URL** screen, select the option **Enable Support for the SAML 2.0 WebSSO protocol** and enter the **SAML 2.0 SSO service URL**, which is of the form `https://<your-mattermost-url>/login/sso/saml`.

![adfs_8_configure_url.png](../../source/images/adfs_8_configure_url.png)

11 - In the **Configure Identifiers** screen, enter the **Relying party trust identifier** (also known as the **Identity Provider Issuer URL**) of the form `https://<your-idp-url>/adfs/services/trust`and click **Add**.

![adfs_9_configure_identifiers.png](../../source/images/adfs_9_configure_identifiers.png)

12 - In the **Configure Multi-factor Authentication Now** screen, you may enable multi-factor authentication, but this is beyond the scope of this guide.

![adfs_10_configure_mfa.png](../../source/images/adfs_10_configure_mfa.png)

13 - In the **Choose Issuance Authorization Rules** screen, select the option **Permit all users to access this relying party**.

![adfs_11_authorization.png](../../source/images/adfs_11_authorization.png)

14 - In the **Ready to Add Trust** screen, you can review your settings.

![adfs_12_ready_to_add_trust.png](../../source/images/adfs_12_ready_to_add_trust.png)

15 - In the **Finish** screen, select the option **Open the Edit Claim Rules dialog for this relying party trust when the wizard closes**, and click **Close**. You will now exit configuration wizard and a **Claim Rules** editor opens.

![adfs_13_finish_trust.png](../../source/images/adfs_13_finish_trust.png)

## Creating Claim Rules

16 - In the **Issuance Transform Rules** of the **Claim Rules** editor, click the **Add Rule…** button. This action opens an **Add Transform Claim Rule Wizard**.

![adfs_14_claim_rules_editor.png](../../source/images/adfs_14_claim_rules_editor.png)

17 - In the **Choose Rule Type** screen, select **Send LDAP Attributes as Claims** from the drop-down menu, then click **Next**.

![adfs_15_choose_rule_type.png](../../source/images/adfs_15_choose_rule_type.png)

18 - In the **Configure Claim Rule** screen, enter a **Claim Rule Name** of your choice, select **Active Directory** as the **Attribute Store** and do the following:
  - From the **LDAP Attribute column**, select `E-Mail-Addresses`. From the **Outgoing Claim Type**, type `Email`
  - From the **LDAP Attribute column**, select `Given-Name`. From the **Outgoing Claim Type**, type `FirstName`
  - From the **LDAP Attribute column**, select `Surname`. From the **Outgoing Claim Type**, type `LastName`
  - From the **LDAP Attribute column**, select `SAM-Account-Name`. From the **Outgoing Claim Type**, type `Username`

For Mattermost 3.4 and later, the `FirstName` and `LastName` attributes are optional.

Then, click **Finish** to add the rule.

Note that the entries in the **Outgoing Claim Type** column can be chosen to be something else. They can contain dashes but no spaces. Note that they will be used to map the corresponding fields in Mattermost later.

![adfs_16_configure_claim_rule.png](../../source/images/adfs_16_configure_claim_rule.png)

19 - Create another new rule by clicking the **Add Rule…** button.

20 - In the **Choose Rule Type** screen, select **Transform an Incoming Claim** from the drop-down menu, then click **Next**.

![adfs_17_transformation_of_incoming_claim.png](../../source/images/adfs_17_transformation_of_incoming_claim.png)

21 - In the **Configure Claim Rule** screen, enter a **Claim Rule Name** of your choice, then
  - Select `Name ID` for the **Incoming claim type**
  - Select `Unspecified` for the **Incoming name ID format**
  - Select `E-Mail Address` for the **Outgoing claim type**

Moreover, select the **Pass through all claim values** option. Then click **Finish**.

![adfs_18_configure_incoming_claim.png](../../source/images/adfs_18_configure_incoming_claim.png)

22 - Click **Finish** to create the claim rule, then **OK** to finish creating rules.

23 - Open Windows PowerShell as an administrator and run the following command:

`Set-ADFSRelyingPartyTrust -TargetName <display-name> -SamlResponseSignature "MessageAndAssertion"`

where <display-name> is the name you specified in step 7. In our example it would be `mattermost`.

This action will add the signature to SAML messages, making verification successful.

## Export Identity Provider Certificate

Next, we export the identity provider certificate, which will be later uploaded to Mattermost to finish SAML configuration.

24 - In ADFS management sidebar, go to **AD FS > Service > Certificates** and double click on the certificate under **Token-signing**. You may alternatively right-click the field, then click **View Certificate...*

![adfs_19_export_idp_cert_start.png](../../source/images/adfs_19_export_idp_cert_start.png)

25 - In the **Certificate** screen, go to the **Details** tab and click **Copy to File…**, then **OK**. This opens a **Certificate Export Wizard**.

![adfs_20_export_idp_cert_copy.png](../../source/images/adfs_20_export_idp_cert_copy.png)

26 - In the **Certificate Export Wizard** screen, click **Next**. Then, select the option **Base-64 encoded X.509 (.CER)** and click **Next** again.

![adfs_21_export_idp_cert_wizard.png](../../source/images/adfs_21_export_idp_cert_wizard.png)

27 - In the **Certificate Export Wizard** screen, click **Browse** to specify the location you want the Identity Provider Certificate to be exported, and specify the file name.

![adfs_21-2_export_idp_cert_wizard.png](../../source/images/adfs_21-2_export_idp_cert_wizard.png)

28 - Click **Save**. In the **Certificate Export Wizard** screen, verify the file path is correct, and click **Next**. 

29 - In the **Completing the Certificate Export Wizard**, click **Finish**, then **OK** to confirm the export was successful.

![adfs_21-3_export_idp_cert_wizard.png](../../source/images/adfs_21-3_export_idp_cert_wizard.png)

You’re now about to finish configuring SAML for Mattermost!

## Configure SAML for Mattermost

30 - Start Mattermost server and sign into Mattermost as a System Administrator. Go to **System Console > Authentication > SAML**.
  - `SAML SSO URL`: **SAML 2.0/W-Federation URL** ADFS Endpoint you noted in step 1.
  - `Identity Provider Issuer URL`: `Relying party trust identifier` from ADFS you specified in step 11.
  - `Identity Provider Public Certificate`: X.509 Public Certificate you downloaded in step 29.

![adfs_22_mattermost_basics.png](../../source/images/adfs_22_mattermost_basics.png)

31 - (Optional) Configure Mattermost to verify the signature. The `Service Provider Login URL` is the `SAML 2.0 SSO service URL` you specified in ADFS in step 10.

![adfs_23_mattermost_verification.png](../../source/images/adfs_23_mattermost_verification.png)

32 - (Optional) Enable encryption by uploading the Service Provider Private Key and Service Provider Public Certificate you generated  in step 3.

![adfs_24_mattermost_encryption.png](../../source/images/adfs_24_mattermost_encryption.png)

33 - Set attributes for the SAML Assertions, which will be used to update user information in Mattermost. Attributes for email and username are required and should match the values you entered in ADFS in step 15. See [documentation on SAML configuration settings](https://docs.mattermost.com/configure/configuration-settings.html#saml) for more detail.

For Mattermost servers running 3.3 and earlier, the first name and last name attributes are also required fields.

![adfs_25_mattermost_attributes.png](../../source/images/adfs_25_mattermost_attributes.png)

34 - (Optional) Lastly, customize the login button text.

![adfs_26_mattermost_login_button.png](../../source/images/adfs_26_mattermost_login_button.png)

35 - Click `Save`.

You’re done! If you’d like to confirm SAML SSO is successfully enabled, switch your System Administrator account from email to SAML-based authentication via **Account Settings > General > Sign-in Method > Switch to SAML SSO** and sign in with your SAML credentials to complete the switch.

It is also recommended to post an announcement about how the migration will work to users.

You may also configure SAML for ADFS by editing `config.json`. Before starting the Mattermost server, edit `config.json` to enable SAML based on [SAML configuration settings](https://docs.mattermost.com/configure/configuration-settings.html#saml). You must restart Mattermost server for the changes to take effect.

### Troubleshooting

The following are troubleshooting suggestions on common error messages and issues. 

#### 1. System Administrator locks themselves out of the system

If the System Administrator is locked out of the system during SAML configuration process, they can set an existing account to System Administrator using [a commandline tool](https://docs.mattermost.com/getting-started/admin-onboarding-tasks.html#common-tasks). 

#### 2. Received error message: `An account with that username already exists. Please contact your Administrator.`

This usually means an existing account has another authentication method enabled. If the user wants to use the existing account for SAML authentication, they should sign in using that method (such as email and password), then change their sign-in method to SAML via **Account Settings > Security > Sign-in method**.

If the user wants to use another ADFS account for SAML instead, they will first need to log out from the existing session, then re-enter credentials for the other account. To log out from the existing session, either:

 - Go to the ADFS provider and log out from the account
 - Delete the existing session cookie by [invoking a passive sign out](https://social.technet.microsoft.com/wiki/contents/articles/1439.ad-fs-how-to-invoke-a-ws-federation-sign-out.aspx) via `https://{DNS_name_of_RP_STS}/adfs/ls/?wa=wsignout1.0` where [RP_STS is the relying party security token service](https://msdn.microsoft.com/en-us/library/ee748489.aspx).

#### 3. Received error message: `An account with that email already exists. Please contact your Administrator.`

This usually means an existing account has another authentication method enabled. If so, the user should sign in using that method (such as email and password), then change their sign-in method to SAML via **Account Settings > Security > Sign-in method**.

#### 4. Received error message: `SAML login was unsuccessful because one of the attributes is incorrect. Please contact your System Administrator.`

Confirm all attributes, including `Email Attribute` and `Username Attribute`, are correct in both the ADFS configuration and in **System Console > SAML**.

#### 5. Unable to switch to SAML authentication successfully

First, ensure you have installed the [XML Security Library](https://www.aleksey.com/xmlsec/download.html) on your Mattermost instance and that **it is available in your** `PATH`.

Second, ensure you have completed each step in our guide for configuring SAML with Microsoft ADFS.

Third, you may consult the [Microsoft ADFS troubleshooting guide](https://technet.microsoft.com/en-us/library/cc776135(v=ws.10).aspx) for potential issues with the ADFS installation.

Lastly, if you are still having trouble with configuration, feel free to post in our [Troubleshooting forum](https://forum.mattermost.com/c/trouble-shoot) and we'll be happy to help with issues during setup.

source/archive/sso-ldap.md METASEP

# Active Directory/LDAP Setup

## Overview

Active Directory (AD) is a service that stores authentication and authorization details of users on your organization's network. When you integrate your AD/LDAP system with Mattermost, users can log into Mattermost without having to create new credentials. User accounts are managed in AD/LDAP, and changes are synced with Mattermost.

Benefits of integrating AD/LDAP with Mattermost include:

- **Single sign-on.** Users can sign in to Mattermost with their AD/LDAP credentials.
- **Centralized identity management.** Mattermost accounts can display user information from AD/LDAP, such as first and last name, email, and username.
- **Automatic account provisioning.** A Mattermost user account is automatically created the first time a user signs in with their AD/LDAP credentials.
- **Sync groups to predefined roles in Mattermost.** Assign team and channel roles to groups via LDAP Group Sync.
- **Compliance alignment with administrator management.** Manage Administrator access to Mattermost in the System Console using LDAP filters.

## Pre-installation Notes

- If you're using Active Directory with **nested security groups** you need to write a PowerShell script, or similar, to flatten and aggregate the tree into a single security group to map into Mattermost.

## Getting Started

There are two ways to set up AD/LDAP:

1. **Configure AD/LDAP using the System Console user interface**
     - Log in to your workspace and create a new account using email and password. This is assigned the System Admin role as the first user created.
     - Next, configure AD/LDAP and then convert your System Admin account to use the AD/LDAP sign in method.

2. **Configure AD/LDAP by editing `config.json`**
     - Edit `config.json` to enable AD/LDAP based on the [AD/LDAP settings documentation](https://docs.mattermost.com/configure/configuration-settings.html#ad-ldap). When you log in to Mattermost the first user to log in with valid AD/LDAP credentials will be assigned the System Admin role.

### Configure AD/LDAP Sign In

1. **Create a System Admin account using email authentication.**
     - Create a new workspace and create an account using email and password, which is automatically assigned the **System Administrator** role since it is the first account created. You may also assign the role to another account.

2. **Configure AD/LDAP.**
     - Go to **System Console > Authentication > AD/LDAP** and fill in AD/LDAP settings based on the [configuration settings documentation](https://docs.mattermost.com/configure/configuration-settings.html#ad-ldap).

3. **Confirm that AD/LDAP sign-on is enabled.**
     - After AD/LDAP has been enabled, confirm that users can sign in using AD/LDAP credentials.

4. **Switch your System Admin account from email to AD/LDAP authentication.**
     - Navigate to **Account Settings > Security > Sign-in Method > Switch to AD/LDAP** and sign in with your AD/LDAP credentials to complete the switch.

5. **(Optional) Restrict authentication to AD/LDAP.**
     - Go to **System Console > Authentication > Email** and set **Enable sign-in with email** to **false** and **Enable sign-in with username** to **false**.
     - Then choose **Save** to save the changes. This should leave Active Directory/LDAP as the only sign in option.

6. **(Optional) If you configured `First Name Attribute` and `Last Name Attribute` in the System Console.**
     - Navigate to **System Console > Site Configuration > Users and Teams** and set **Teammate Name Display** to **Show first and last name**. This is recommended for a better user experience.

**Note:** If you've made a mistake and lock yourself out of the system somehow, you can [set an existing account to System Administrator using the command line tool](https://docs.mattermost.com/getting-started/admin-onboarding-tasks.html#common-tasks).

### Configure AD/LDAP Synchronization

In addition to configuring AD/LDAP sign-in, you can also configure AD/LDAP synchronization. When synchronizing, Mattermost queries AD/LDAP for relevant account information and updates Mattermost accounts based on changes to attributes (first name, last name, and nickname). When accounts are disabled in AD/LDAP users are made inactive in Mattermost, and their active sessions are revoked once Mattermost synchronizes the updated attributes.

**Note:** 

- The AD/LDAP synchronization depends on email. Make sure all users on your AD/LDAP server have an email address, or ensure their account is deactivated in Mattermost.
- When Mattermost is configured to use LDAP for user authentication, the following user attribute changes can't be made through the API: first name, last name, position, nickname, email, profile image, or username. LDAP must be the authoritative source for these user attributes.

To configure AD/LDAP synchronization with AD/LDAP sign-in:

1. Go to **System Console > Authentication > AD/LDAP** and set **Enable Synchronization with AD/LDAP** to **true**.

2. Scroll down to **Synchronization Interval (minutes)** to specify how often Mattermost accounts synchronize attributes with AD/LDAP. The default setting is 60 minutes. The profile picture attribute is only synchronized when the user logs in.
     - If you want to synchronize immediately after disabling an account, use the **AD/LDAP Synchronize Now** button in **System Console > AD/LDAP**.
     - To configure AD/LDAP synchronization with SAML sign-in, see the [SAML documentation](https://docs.mattermost.com/onboard/ad-ldap.html).

**Note:** Make sure that at least one LDAP user is in Mattermost or the sync will not complete.

### Configure AD/LDAP Sign-in Using Filters

Using filters assigns roles to specified users on login. To access AD/LDAP filter settings navigate to **System Console > AD/LDAP**.

#### User Filter

(Optional) Enter an AD/LDAP filter to use when searching for user objects. Only the users selected by the query will be able to access Mattermost. For Active Directory, the query to filter out disabled users is `(&(objectCategory=Person)(!(UserAccountControl:1.2.840.113556.1.4.803:=2)))`.

1. Navigate to **System Console > Authentication > AD/LDAP**.
2. Complete the **User Filter** field.
3. Choose **Save**.

When the user accesses Mattermost, they log in with same username and password that they use for organizational logins.

Filters can also be used for excluding users who belong to certain groups. For Active Directory, the query to filter out groups is `(&(memberof=cn=ACME_ALL,ou=Users,dc=sademo,dc=com)(!(memberof=cn=DEV_OPS,ou=Users,dc=sademo,dc=com)))`.

#### Guest Filter

(Optional) When enabled, the Guest Filter in Mattermost identifies external users whose AD/LDAP role is guest and who are invited to join your Mattermost workspace. These users will have the Guest role applied immediately upon first sign-in instead of the default member user role. This eliminates having to manually assign the role in the System Console.

If this filter is removed/changed, active guests will not be promoted to a member and will retain their Guest role. Guests can be promoted in **System Console > User Management**.

1. Navigate to **System Console > Authentication > Guest Access (Beta)** and set Guest Access to `true`.
2. Navigate to **System Console > Authentication > AD/LDAP**.
3. Complete the **Guest Filter** field.
4. Choose **Save**.

When a guest logs in for the first time they are presented with a default landing page until they are added to channels.

See the [Guest Accounts documentation](https://docs.mattermost.com/cloud/cloud-guest-accounts.html) for more information about this feature.

#### Admin Filter

(Optional) Enter an AD/LDAP filter to use for designating System Admins. The users selected by the query will have access to your Mattermost workspace as System Admins. By default, System Admins have complete access to the Mattermost System Console. Existing members that are identified by this attribute will be promoted from member to System Admin upon next login.

The next login is based upon Session lengths set in **System Console > Session Lengths**. It is recommended that users are demoted to members manually in **System Console > User Management** to ensure access is restricted immediately.

1. Navigate to **System Console > Authentication > AD/LDAP**.
2. Set **Admin Filter** to **true**.
3. Complete the **Admin Filter** field.
4. Choose **Save**.

**Note:** If the Admin Filter is set to `false` the member's role as System Admin is retained. However if this filter is removed/changed, System Admins that were promoted via this filter will be demoted to members and will not retain access to the System Console.

When this filter isn't in use, members can be manually promoted/demoted via **System Console > User Management**.

### Configure AD/LDAP Deployments with Multiple Domains

Organizations using multiple domains can integrate with Mattermost using a "Forest" configuration to bring together multiple domains. Please see [Forests as Collections of Domain Controllers that Trust Each Other](https://technet.microsoft.com/en-us/library/cc759073%28v=ws.10%29.aspx?f=255&MSPPError=-2147217396) for more information.

For forest configurations that contain multiple domains which do NOT share a common root, you can search across all of the domains using the Global Catalog. To do so, update your `config.json` as follows:

- Set the LdapPort to 3268 (instead of 389)
- Set the BaseDN to " " (A single space character)

See [Global Catalog and LDAP Searches](https://technet.microsoft.com/en-us/library/cc978012.aspx) for additional details.

## Troubleshooting/FAQ

The following are frequently asked questions and troubleshooting suggestions on common error messages and issues. It is recommended that you check your logs for errors as they can provide an idea of what the issue is.

### If the **AD/LDAP Test** button fails, how can I troubleshoot the connection?

Check that your AD/LDAP connection settings are correct by running an AD/LDAP user query in an external system. See [LDAP Connection Test Example](http://ldaptool.sourceforge.net). If the AD/LDAP connection is verified to be working outside of Mattermost, try the following:

- Check your AD/LDAP system to verify your `Bind Username` format.
- Check your **AD/LDAP Port** and **Connection Security** settings in the System Console. (**AD/LDAP Port** set to 389 typically uses **Connection Security** set to `None`. **AD/LDAP Port** set to 636 typically ties to **Connection Security** set to **TLS**).
- If you're seeing `x509: certificate signed by unknown authority` in your logs, try installing an intermediate SSL certificate or have your LDAP server send the complete certificate chain.

If these options don't work, please contact Mattermost support via the email address that came with your license key.

### When I first set up and synchronize AD/LDAP, are the users automatically created in Mattermost?

No, each user is created on their first login.

### When I try to synchronize AD/LDAP, why does the Status show as `Pending` and not complete?

Go to **System Console > AD/LDAP** and make sure that the **Enable Synchronization with AD/LDAP** setting is set to **true**.

If the issue persists, try performing a sync with the **User Filter** field blank. If the sync completes in this scenario, then the general syntax was formatted incorrectly. Refer to this [document](https://docs.mattermost.com/configure/configuration-settings.html#user-filter) for guidance on setting a correct syntax format.

Make sure that you also have at least one LDAP user in Mattermost or the sync will not complete.

### What's the difference between the Username Attribute, ID Attribute, and Login ID Attribute?

There are three AD/LDAP attributes that apear to be similar but serve a different purpose:

1. **Username Attribute:** Used within the Mattermost user interface to identify and mention users. For example, if **Username Attribute** is set to `john.smith`, a user typing `@john` will see `@john.smith` in their autocomplete options and posting a message with `@john.smith` will send a notification to that user that they’ve been mentioned.
2. **ID Attribute:** Used as the unique identifier in Mattermost. It should be an AD/LDAP attribute with a value that does not change, such as `ObjectGUID`. If a user's ID attribute changes, it will create a new Mattermost account unassociated with their old one. If you need to change this field after users have already logged in, use the [mattermost ldap idmigrate CLI tool](https://docs.mattermost.com/manage/command-line-tools.html#mattermost-ldap-idmigrate).
3. **Login ID Attribute:** The attribute in the AD/LDAP server used to log in to Mattermost. Normally this attribute is the same as the **Username Attribute** field above, or another field that users can easily remember.

### How do I deactivate users?

When AD/LDAP authentication is used in Mattermost, user deactivation must be done via the AD/LDAP server.

There are two main ways to do this:

1. **User deletion:** If the user is completely removed from the AD/LDAP server, they will be deactivated in Mattermost on the next synchronization.
2. **User filter:** Set the [user filter](https://docs.mattermost.com/configure/configuration-settings.html#user-filter) to only select the subset of AD/LDAP users you want to have access to Mattermost. When someone is removed from the selected group, they will be deactivated in Mattermost on the next synchronization.

For Active Directory, to filter out deactivated users you must set the user filter to:

`(&(objectCategory=Person)(!(UserAccountControl:1.2.840.113556.1.4.803:=2)))`

Filters can also be used for excluding users who belong to certain groups. For Active Directory, the query to filter out groups is: 

`(&(memberof=cn=ACME_ALL,ou=Users,dc=sademo,dc=com)`

`(!(memberof=cn=DEV_OPS,ou=Users,dc=sademo,dc=com)))`

When a user is deactivated in Mattermost, all the user's current sessions are revoked and they will be unable to log in or access Mattermost.

### Can I connect to multiple Active Directory servers?

There is currently no built-in way to connect to multiple AD servers. You will need to connect the instances in a forest before connecting to Mattermost. Consider upvoting the [feature request](https://mattermost.uservoice.com/forums/306457-general/suggestions/13589904-add-the-abilitiry) on our forum.

### When trying to sign in, I see the error `AD/LDAP not available on this server`.

This indicates that there is a problem somewhere with your configuration. We recommend that you check your Mattermost configuration settings to ensure that AD/LDAP is enabled, and the settings are correct.

If you're still having issues, you can [contact support](https://mattermost.com/support/) for additional troubleshooting.

### I see the error `User not registered on AD/LDAP server`.

This means the query sent back to the AD/LDAP server returned no results. We recommend that you:

1. Check that the user credentials were entered properly - you should log in with the field set as the [`ID Attribute`](https://docs.mattermost.com/configure/configuration-settings.html#login-id-attribute).
2. Check that the user account exists in the AD/LDAP server.
3. Check the AD/LDAP configuration settings are correct.

If you're still having issues, you can [contact support](https://mattermost.com/support/) for additional troubleshooting.

### I updated a user account in AD/LDAP, and they can no longer log in to Mattermost.

If the user can no longer log in to Mattermost with their AD/LDAP credentials - for example, they get an error message `An account with that email already exists`, or a new Mattermost account is created when they try to log in - this means the **ID Attribute** for their account has changed.

The issue can be fixed by changing the value of the field used for the **ID Attribute** back to the old value. If you're currently using a field that sometimes changes for an **ID Attribute** (e.g. username, email that changes when someone gets married), we recommend you switch to using a non-changing field such as a GUID.

To do this, you can set the [**Login ID Attribute**](https://docs.mattermost.com/configure/configuration-settings.html#login-id-attribute) to whatever you would like users to log in with (e.g. username or email).

**Note:** Currently the value is case sensitive. If the **ID Attribute** is set to the username and the username changes from `John.Smith` to `john.smith`, the user will experience problems logging in.

### I see the log error `LDAP Result Code 4 "Size Limit Exceeded"`.

This indicates your AD/LDAP server configuration has a maximum page size set and the query coming from Mattermost is returning a result set in excess of that limit.

To address this issue you can set the [max page size](https://docs.mattermost.com/configure/configuration-settings.html#maximum-page-size) in your Mattermost configuration to match the limit on your AD/LDAP server. This will return a sequence of result sets that do not exceed the max page size, rather than returning all results in a single query. A max page size setting of 1500 is recommended.

If the error is still occurring, it is likely that no AD/LDAP users have logged into Mattermost yet. Ensure that at least one AD/LDAP user has logged into Mattermost and re-run the sync. The error should disappear at that point.

### Can the AD/LDAP User Filter read security groups?

Yes it can, but make sure that:

- Permissions are correctly configured on the service account you are using.
- Each user object is a direct member of the security group.

### How do I know if an AD/LDAP sync job fails?

Mattermost provides the status of each AD/LDAP sync job in **System Console > Authentication > AD/LDAP**. Here you can see the number of users updated and if the job succeeded or failed.

source/archive/software-requirements.rst METASEP
:nosearch:

=================================
Mattermost Software Requirements
=================================

This page has moved to the `Mattermost Handbook <https://handbook.mattermost.com/operations/research-and-development/product/release-process/bug-fix-release>`__.

source/archive/slash-commands.rst METASEP
:nosearch:

.. _slash-commands:

Slash Commands
==============

.. note::

  This is the admin documentation for slash commands. If you're a developer looking to build an integration, see `our developer documentation <https://developers.mattermost.com/integrate/getting-started/>`__.

Mattermost supports slash commands to easily integrate external applications into the server. They function similarly to :doc:`outgoing webhooks <../developer/webhooks-outgoing/>`, except they can be used in any channel - including Private channels and Direct Messages.

Messages that begin with ``/`` are interpreted as slash commands. The commands will send an HTTP POST request to a web service, and process a response back to Mattermost. Mattermost supports both `built-in <https://docs.mattermost.com/developer/slash-commands.html#built-in-commands>`__ and `custom slash commands <https://docs.mattermost.com/developer/slash-commands.html#custom-slash-command>`__.

.. note::
  
  To prevent malicious users from trying to perform `phishing attacks <https://en.wikipedia.org/wiki/Phishing>`__, a *BOT* indicator appears next to posts coming from webhooks regardless of what username is specified.

.. toctree::
   :maxdepth: 2

Built-in Commands
-----------------

Each Mattermost installation comes with some built-in slash commands that are ready to use. These commands are available in the `latest Mattermost release <https://mattermost.com/deploy>`__:

.. csv-table::
    :header: "Command", "Description", "Example"

    "/away", "Set your availability to away", "/away"
    "/offline", "Set your availability to offline", "/offline"
    "/online", "Set your availability to online", "/online"
    "/dnd", "Set your availability to Do Not Disturb", "/dnd"
    "/code *{text}*", "Display text as a code block", "/code File bugs"
    "/collapse", "Turn on auto-collapsing of image previews", "/collapse"
    "/expand", "Turn off auto-collapsing of image previews", "/expand"
    "/echo *{message}* *{delay in seconds}*", "Echo back text from your account", "/echo Hello World 5"
    "/header *{text}*", "Edit the channel header", "/header File bugs here"
    "/invite *@{user}* *~{channel-name}*", "Invite user to the channel","/invite @john ~sampleChannel"
    "/purpose *{text}*", "Edit the channel purpose", "/purpose A channel to discuss bugs"
    "/rename *{text}*", "Rename the channel", "/rename Developers"
    "/help", "Open the Mattermost help page", "/help"
    "/invite *@{user}* *~{channel-name}*", "Invite user to the channel","/invite @john ~sampleChannel"
    "/invite_people *{name@domain.com ...}*", "Send an email invite to your Mattermost team","/invite_people john@example.com"
    "/kick (or /remove) *{@username}*", "Remove a member from a public or private channel", "/kick @alice"
    "/join (or /open) *{channel-name}*", "Join the given channel", "/join off-topic"
    "/leave", "Leave the current channel", "/leave"
    "/mute", "Turns off desktop, email and push notifications for the current channel or the [channel] specified", "/mute ~[channel]"
    "/logout", "Log out of Mattermost", "/logout"
    "/me *{message}*", "Do an action", "/me Hello World"
    "/msg *{@username}* *{message}*", "Send a Direct Message to a user", "/msg @alice hello"
    "/groupmsg *{@username1, @username2, ...}* *{message}*", "Sends a Group Message to the specified users", "/groupmsg @alice, @bob hello"
    "/search *{text}*", "Search text in messages", "/search meeting"
    "/settings", "Open the Settings dialog", "/settings"
    "/shortcuts", "Display a list of keyboard shortcuts", "/shortcuts"
    "/shrug *{message}*", "Add ``¯\_(ツ)_/¯`` to your message", "/shrug oh well"
    "/status *{emoji_name}* *{descriptive status_message}*", "Set a custom status that includes an optional emoji and a descriptive status message", "/status sick Feeling unwell and taking time off to recover"
    "/status clear", Clear the current status, "/status clear"

.. note::

  ``/status`` and ``/status clear`` slash commands listed above will be available in the Mattermost Mobile App in a future release.

Custom Slash Command
--------------------

Suppose you want to write an external application that is able to check the weather for certain cities. By creating a custom slash command, and setting up the application to handle the HTTP POST or GET from the command, you can let your users check the weather in their city using your command, say ``/weather toronto week``.

You can follow these general guidelines to set up a custom Mattermost slash command for your application.

1. Open **Main Menu > Integrations > Slash Commands**. If you don't have the **Integrations** option in your Main Menu, slash commands may not be enabled on your Mattermost server or may be disabled for non-admins. Enable them from **System Console > Integrations > Integration Management** or ask your Mattermost System Admin to do so.

2. Select **Add Slash Command** and add a name and description for the command.

3. Set the **Command Trigger Word**. The trigger word must be unique and cannot begin with a slash or contain any spaces. It also cannot be one of the `built-in commands <https://docs.mattermost.com/help/messaging/executing-commands.html#built-in-commands>`__.

4. Set the **Request URL** and **Request Method**. The request URL is the endpoint that Mattermost hits to reach your application, and the request method is either POST or GET and specifies the type of request sent to the request URL.

5. (Optional) Set the response username and icon the command will post messages as in Mattermost. If not set, the command will use your username and profile picture.

.. note::
  
    `Enable integrations to override usernames <https://docs.mattermost.com/administration/config-settings.html#enable-integrations-to-override-usernames>`__ must be set to ``true`` in ``config.json`` to override usernames, and `similarly for profile picture icons <https://docs.mattermost.com/administration/config-settings.html#enable-integrations-to-override-profile-picture-icons>`__. Enable them from **System Console > Integrations > Integration Management** or ask your Mattermost System Admin.

6. (Optional) Include the slash command in the command autocomplete list, displayed when typing ``/`` in an empty input box. Use it to make your command easier to discover by your teammates. You can also provide a hint listing the arguments of your command and a short description displayed in the autocomplete list.

7. Select **Save**. On the next page, copy the **Token** value. This will be used in a later step.

.. image:: ../images/slash_commands_token.png
  :width: 500 px

8. Next, write your external application. Include a function which receives HTTP POST or HTTP GET requests from Mattermost. The request will look something like this:

.. code-block:: text

  POST /slash-command HTTP/1.1
  Host: example.com
  User-Agent: Go-http-client/1.1
  Content-Length: 313
  Accept: application/json
  Authorization: Token okwexkjpe7ygb8eq1ww58t483w
  Content-Type: application/x-www-form-urlencoded
  Accept-Encoding: gzip

  channel_id=jux16pkewjrkfj3ehep1psxyxc&
  channel_name=town-square&
  command=%2Ftest&
  response_url=http%3A%2F%2Flocalhost%3A8065%2Fhooks%2Fcommands%2Fxbrkb8p393gjpq5cawei7npije&
  team_domain=test&
  team_id=carya1qs77bemjup96ff538snh&
  text=asd&
  token=okwexkjpe7ygb8eq1ww58t483w&
  user_id=aoa1agao6t8fmx3ikt1j9w5ybw&
  user_name=somename
  channel_mentions=["saepe-5", "aut-8"]
  channel_mentions_ids=["r3j6sby343fpfdxcbwqg95rfsa", "ehjj46yk7ifptr5bpfb966s6mc"]
  user_mentions=["aaron.peterson", "aaron.medina"]
  user_mentions_ids=["q5s3b7xzgprp5eid8h66j9epsy", "czwmumrmw7dfxecww7qibkkoor"]

If your integration sends back a JSON response, make sure it returns the ``application/json`` content-type.

9. Add a configurable *MATTERMOST_TOKEN* variable to your application and set it to the **Token** value from step 7. This value will be used by your application to confirm the HTTP POST or GET request came from Mattermost.

10. To have your application post a message back to ``town-square``, it can respond to the HTTP POST request with a JSON response such as:

.. code-block:: text

   {"response_type": "in_channel", "text": "
   ---
   #### Weather in Toronto, Ontario for the Week of February 16th, 2016

   | Day                 | Description                      | High   | Low    |
   |:--------------------|:---------------------------------|:-------|:-------|
   | Monday, Feb. 15     | Cloudy with a chance of flurries | 3 °C   | -12 °C |
   | Tuesday, Feb. 16    | Sunny                            | 4 °C   | -8 °C  |
   | Wednesday, Feb. 17  | Partly cloudly                   | 4 °C   | -14 °C |
   | Thursday, Feb. 18   | Cloudy with a chance of rain     | 2 °C   | -13 °C |
   | Friday, Feb. 19     | Overcast                         | 5 °C   | -7 °C  |
   | Saturday, Feb. 20   | Sunny with cloudy patches        | 7 °C   | -4 °C  |
   | Sunday, Feb. 21     | Partly cloudy                    | 6 °C   | -9 °C  |
   ---
   "}

which would render in Mattermost as:

.. image:: ../images/weatherBot.png
  :alt: Shows what the JSON response renders as in Mattermost

11. You're all set! See `developer documentation <https://developers.mattermost.com/integrate/slash-commands>`__ for details on what parameters are supported by slash commands. For instance, you can override the username and profile picture the messages post as, or specify a custom post type when sending a webhook message for use by `plugins <https://developers.mattermost.com/integrate/admin-guide/admin-plugins-beta/>`__.

Messages with advanced formatting can be created by including an :doc:`attachment array <message-attachments>` and :doc:`interactive message buttons <interactive-messages>` in the JSON payload.

.. note::
  
  `Enable integrations to override usernames <https://docs.mattermost.com/configure/configuration-settings.html#enable-integrations-to-override-usernames>`__ must be set to ``true`` in ``config.json`` to override usernames. Enable them from **System Console > Integrations > Integration Management** or ask your Mattermost System Admin. If not enabled, the username is set to ``webhook``.
  
  Similarly, `Enable integrations to override profile picture icons <https://docs.mattermost.com/configure/configuration-settings.html#enable-integrations-to-override-profile-picture-icons>`__ must be set to ``true`` in ``config.json`` to override usernames. Enable them from **System Console > Integrations > Integration Management** or ask your Mattermost System Admin. If not enabled, the icon of the creator of the webhook URL is used to post messages.

Tips and Best Practices
------------------------

1. Slash commands are designed to easily allow you to post messages. For other actions such as channel creation, you must also use the `Mattermost APIs <https://api.mattermost.com>`__.

2. Posts size is limited to 16393 characters for servers running `Mattermost Server v5.0 or later <https://docs.mattermost.com/administration/important-upgrade-notes.html>`__. Use the `extra_responses <https://developers.mattermost.com/integrate/slash-commands/#parameters>`__ field to reply to a triggered slash command with more than one post.

3. You can restrict who can create slash commands in `System Console > Integrations > Integration Management <https://docs.mattermost.com/administration/config-settings.html#restrict-managing-integrations-to-admins>`__.

4. Mattermost outgoing webhooks are Slack-compatible. You can copy-and-paste code used for a Slack outgoing webhook to create Mattermost integrations. Mattermost `automatically translates Slack's JSON format <https://docs.mattermost.com/developer/slash-commands.html?highlight=translate%20slack%20data%20format%20mattermost#translate-slack-s-data-format-to-mattermost>`__.

5. The external application may be written in any programming language. It needs to provide a URL which receives the request sent by your Mattermost server and responds with in the required JSON format.

Share Your Integration
----------------------

If you've built an integration for Mattermost, please consider `sharing your work <https://apps.mattermost.com/submit-an-integration/>`__ in our `app directory <https://mattermost.com/marketplace>`__.

The `app directory <https://mattermost.com/marketplace>`__ lists open source integrations developed by the Mattermost community and are available for download, customization and deployment to your private cloud or self-managed infrastructure.

Slack Compatibility
-------------------

Mattermost makes it easy to migrate integrations written for Slack to Mattermost.

Translate Slack's data format to Mattermost
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost automatically translates the data coming from Slack:

1. JSON responses written for Slack, that contain the following, are translated to Mattermost Markdown and rendered equivalently to Slack:
   
   - ``<>`` to denote a URL link, such as ``{"text": "<https://mattermost.com/>"}``
   - ``|`` within a ``<>`` to define linked text, such as ``{"text": "Click <https://mattermost.com/|here> for a link."}``
   - ``<userid>``  to trigger a mention to a user, such as ``{"text": "<5fb5f7iw8tfrfcwssd1xmx3j7y> this is a notification."}``
   - ``<!channel>``, ``<!here>`` or ``<!all>`` to trigger a mention to a channel, such as ``{"text": "<!channel> this is a notification."}``

2. Both the HTTP POST and GET request bodies sent to a web service are formatted the same as Slack's. This means your Slack integration's receiving function does not need change to be compatible with Mattermost.
  
Known Slack compatibility issues
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Using ``icon_emoji`` to override the username is not supported.
2. Referencing  channels using ``<#CHANNEL_ID>`` does not link to the channel.
3. ``<!everyone>`` and ``<!group>`` are not supported.
4. Parameters "mrkdwn", "parse", and "link_names" are not supported (Mattermost always converts markdown and automatically links @mentions).
5. Bold formatting supplied as ``*bold*`` is not supported (must be done as ``**bold**``).
6. Slack assumes default values for some fields if they are not specified by the integration, while Mattermost does not.

Troubleshooting
---------------

See `developer documentation <https://developers.mattermost.com/integrate/slash-commands>`__ for troubleshooting, or `join the Mattermost user community for help <https://mattermost.com/pl/default-ask-mattermost-community>`_.

source/archive/sharing-messages.rst METASEP
:nosearch:

Sharing Messages
================

|all-plans| |cloud| |self-hosted|

.. |all-plans| image:: ../images/all-plans-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in Mattermost Free and Starter subscription plans.

.. |cloud| image:: ../images/cloud-badge.png
  :scale: 30
  :target: https://mattermost.com/download
  :alt: Available for Mattermost Cloud deployments.

.. |self-hosted| image:: ../images/self-hosted-badge.png
  :scale: 30
  :target: https://mattermost.com/deploy
  :alt: Available for Mattermost Self-Hosted deployments.

You can share links to messages in Mattermost. Select the **More Actions** option next to a message, then select **Copy Link**. Paste the link into a message to share the link with others.

Sharing links to messages generates a preview of the message which helps minimize context switching. 

Previews respect channel membership permissions, so they’re only visible to users who have access to the original message. If the link is to a message in a Public Channel, any member of the team can see the message preview. If the link is to a message in a Private Channel or Direct Message, only members in that channel can see the message preview.

.. tip::

    The timestamp next to the username of any message also functions as a permanent link to that conversation.

.. image:: ../images/permalink-previews.png
   :alt: Mattermost generates previews of links shared in Channels.

source/archive/sharing-files.rst METASEP
:nosearch:

Sharing Files
===============

|all-plans| |cloud| |self-hosted|

.. |all-plans| image:: ../images/all-plans-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in Mattermost Free and Starter subscription plans.

.. |cloud| image:: ../images/cloud-badge.png
  :scale: 30
  :target: https://mattermost.com/download
  :alt: Available for Mattermost Cloud deployments.

.. |self-hosted| image:: ../images/self-hosted-badge.png
  :scale: 30
  :target: https://mattermost.com/deploy
  :alt: Available for Mattermost Self-Hosted deployments.

With file attachments, you can share additional information that will help your team to visually understand your ideas. Sharing videos, voice recordings, screenshots, and photos will make your messages more effective and clear.

Attach Files to Messages
------------------------

You can attach files to messages in the following ways:

-  Use the attachment icon inside the message input box
-  Drag and drop
-  Paste from the clipboard

Preview File Attachments
------------------------

Mattermost has a built-in file previewer that you can use to:

-  Download files
-  Share public links
-  View media

Select the thumbnail of an attached file to open it in the file previewer.

Downloading Files
~~~~~~~~~~~~~~~~~

You can download an attached file by selecting the download icon next to the file thumbnail.

Sharing Public Links
~~~~~~~~~~~~~~~~~~~~

Public URLs allow you to share attachments with anyone outside the Mattermost system. To share an attachment, select the thumbnail of an attachment, then select **Get Public Link**.

.. tip::
  
  If **Get Public Link** is not visible in the file previewer, and you prefer that the feature is enabled, you can request your System Admin to enable the feature from the System Console under **Site Configuration > Public Links**.

Viewing Media
~~~~~~~~~~~~~~

The following media formats are supported on most browsers:

-  Images: BMP, GIF, JPG, JPEG, PNG, SVG
-  Video: MP4
-  Audio: MP3, M4A
-  Files: PDF, TXT

Other document previews (such as Word, Excel, or PPT) are not yet supported.

Attachment Limits and Sizes
---------------------------

Up to 10 files can be attached per post. The default maximum file size is 100 MB, but this can be changed by the System Admin. See our `Configuration Settings <https://docs.mattermost.com/configure/configuration-settings.html#maximum-file-size>`__ product documentation for details.

Image files can be a maximum size of 7680 pixels x 4320 pixels, with a maximum image resolution of 33 MP (mega pixels) or 8K resolution, and a maximum raw image file size of approximately 253 MB. System Admins can customize the maximum image resolution size within the ``config.json`` file. See our `Configuration Settings <https://docs.mattermost.com/configure/configuration-settings.html#maximum-image-resolution>`__ product documentation for details.

source/archive/sg_rest_markup.rst METASEP
:nosearch:

ReStructuredText Markup
=======================

This page has moved to the `Mattermost Handbook <https://handbook.mattermost.com/operations/operations/company-processes/publishing/publishing-guidelines/voice-tone-and-writing-style-guidelines/documentation-style-guide#document-structure>`_.

source/archive/sg_grammar-spelling-mechanics.rst METASEP
:nosearch:

Grammar, Spelling, and Mechanics
================================

This page has moved to the `Mattermost Handbook <https://handbook.mattermost.com/operations/operations/company-processes/publishing/publishing-guidelines/voice-tone-and-writing-style-guidelines/documentation-style-guide#document-structure>`_.

source/archive/sg_general-guidelines.rst METASEP
:nosearch:

.. _general-guidelines:

General Guidelines
==================

This page has moved to the `Mattermost handbook <https://handbook.mattermost.com/operations/operations/company-processes/publishing/publishing-guidelines/voice-tone-and-writing-style-guidelines/documentation-style-guide#document-structure>`_.

source/archive/sg_document-structure.rst METASEP
:nosearch:

Document Structure
==================

This page has moved to the `Mattermost handbook <https://handbook.mattermost.com/operations/operations/company-processes/publishing/publishing-guidelines/voice-tone-and-writing-style-guidelines/documentation-style-guide#document-structure>`_.

source/archive/setting-your-status-availability.rst METASEP
:nosearch:

Setting Your Status and Availability
====================================

|all-plans| |cloud| |self-hosted|

.. |all-plans| image:: ../images/all-plans-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in Mattermost Free and Starter subscription plans.

.. |cloud| image:: ../images/cloud-badge.png
  :scale: 30
  :target: https://mattermost.com/deploy
  :alt: Available for Mattermost Cloud deployments.

.. |self-hosted| image:: ../images/self-hosted-badge.png
  :scale: 30
  :target: https://mattermost.com/deploy
  :alt: Available for Mattermost Self-Hosted deployments.

Let your team know whether you're available by setting a custom status and your availability in Mattermost.

Setting a Custom Status
-----------------------

Set a custom status to add an optional emoji to a descriptive status message. Other members can see your status anywhere they can see your name, such as the channel sidebar and in conversations. 

1. To set a custom status, select your avatar at the top of the channel sidebar, then select **Set a Custom Status**.

.. image:: ../images/set-custom-status.png
  :alt: Set a custom status.

2. Choose from a list of suggested statuses, reuse a recent status, or enter a new emoji and status, then select **Set Status**. The Speech bubble emoji 💬  is used by default if you don't specify an emoji. A custom status can be a maximum of 100 characters in length.

.. image:: ../images/Custom-Status-Marketing-Animation.gif
  :alt: Set a custom status that includes an optional emoji and a descriptive message.

.. note::

  - If custom statuses aren't available, you can request your System Admin to enable this feature in **System Console > Site Configuration > Users and Teams > Enable Custom Statuses**.
  - Custom statuses will be available in the Mattermost Mobile App in a future release. 

Clearing a Custom Status
------------------------

New custom statuses display until midnight the day they're set by default. You can configure a custom status to clear after a preferred period of time, clear at a specific date and time, or to continue to display until manually cleared.

.. image:: ../images/custom-status-expiry.png
   :alt: Set your custom status to expire after a period of time.

To manually clear a custom status at any time, select your avatar at the top of the channel sidebar, then select **Clear Status**, or select the **Clear** option next to your current status.

.. image:: ../images/clear-custom-status.png
  :alt: Clear your custom status.

Setting Your Availability
-------------------------

To set your availability, select your avatar, then specify your availability as  **Online**, **Away**, **Do Not Disturb**, or **Offline**.

.. image:: ../images/set-your-availability.png
  :alt: Set your availability to online, away, do not disturb, or offline.

When you set your availability, an availability icon displays next to your name. Setting your availability as **Do Not Disturb** automatically disables desktop, email, and push notifications.

Other members can see your availability anywhere they can see your name, such as the channel sidebar, within conversations, and within Direct Messages. 

How Mattermost Determines Your Availability
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. csv-table::
    :header: "Client", "**Online**", "**Away**", "**Offline**"

    "**Desktop App**", "You're interacting with your computer", "You're inactive on your computer for 5 minutes", "You close Mattermost, sleep, or lock your computer"
    "**Web Browser**", "You're interacting with Mattermost in a browser", "
    - You have not typed or switched channels for 5 minutes
    - The tab is unfocused for 5 minutes
    - The browser is in the background or minimized for 5 minutes", "You close the Mattermost browser window"
    "**Mobile App**", "Mattermost is open", "Mattermost is open with 5 minutes of inactivity", "You switch apps, close Mattermost, or lock your screen" 
    

source/archive/sending-receiving-messages.rst METASEP
:nosearch:

.. _sending-messages:

Sending and Receiving Messages
==============================
 
|all-plans| |cloud| |self-hosted|

.. |all-plans| image:: ../images/all-plans-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in Mattermost Free and Starter subscription plans.

.. |cloud| image:: ../images/cloud-badge.png
  :scale: 30
  :target: https://mattermost.com/download
  :alt: Available for Mattermost Cloud deployments.

.. |self-hosted| image:: ../images/self-hosted-badge.png
  :scale: 30
  :target: https://mattermost.com/deploy
  :alt: Available for Mattermost Self-Hosted deployments.

Sending messages and replying to messages are important ways to keep conversations active with your team. You can edit and delete messages after you've sent them.

.. note::
  
  Your System Admin may restrict Messaging actions, such as editing or deleting messages, by configuring `Advanced Permissions <https://docs.mattermost.com/onboard/advanced-permissions.html>`__, available in `Mattermost Enterprise and Professional subscription plans <https://mattermost.com/pricing>`__.

Send a message
---------------

Write a message by typing into the text input box, then press ENTER to send it. Use SHIFT+ENTER to create a new line without sending a message. To send messages by pressing CTRL+ENTER, go to **Settings > Advanced > Send Messages on CTRL/CMD+ENTER > Edit**.

.. tip::
  
  Mattermost can automatically detect and display messages written using right-to-left scripts, such as Arabic, Hebrew, or Persian. Your System Admin must install the `RTL Plugin <https://github.com/QueraTeam/mattermost-rtl>`__ to enable this functionality.

Reply to messages
-----------------

.. tip::

   An early access beta of Collapsed Reply Threads is available for Mattermost Cloud and Mattermost self-hosted customers from v5.37 offering a new way to organize conversations within channels. See our `Organizing Conversations using Collapsed Reply Threads (Beta) <https://docs.mattermost.com/messaging/organizing-conversations.html>`__ documentation to learn more.

You can reply to a message by hovering over a message and selecting the **Reply** link to organize the conversation into a thread.

.. image:: ../images/reply-to-message.png
   :alt: Reply to Mattermost messages

Threaded conversations are easy to follow and allow multiple parallel conversations to occur at the same time without confusion. Replies are indented slightly in the center pane to indicate that they are child messages of a parent message.

Selecting the reply link opens a sidebar in the right-hand sidebar. To expand the right-hand sidebar to its full width, select the **Expand** icon with two arrows at the top of the sidebar.

.. image:: ../images/expand-sidebar.png
   :alt: Expand right-hand sidebar to its full width

To shrink the right-hand sidebar to its original width, select the same **Collapse** icon.

.. image:: ../images/collapse-sidebar.png
   :alt: Collapse the right-hand sidebar to its original width

Edit or delete messages
-----------------------

Select the **More Actions** link next to a message that you've sent.

.. image:: ../images/more-actions.png
   :alt: More actions you can take with your messages

Select **Edit** to edit your own messages. Message edits do not trigger new @mention notifications, desktop notifications, or notification sounds.

Select **Delete** to delete your own messages. Select **Delete** again to confirm.

Mark messages as unread
-----------------------

Marking a message as unread bolds the channel in your sidebar, and adds the new messages line above the marked message. This can be a useful reminder to follow-up on the message later if you don't have time to address it when the message was read.

Select the **More Actions** link next to a message, then select **Mark as Unread**.

source/archive/sending-messages.md METASEP
# Sending Messages

## Message Types

Reply to posts to keep conversations organized in threads.

### Posts

Posts can be considered parent messages. They are the messages that often start a thread of replies. Posts can be written and sent from the text input box at the bottom of the center pane.

### Replies

Reply to a message by clicking the reply icon next to any message text. This action opens the right-hand sidebar (RHS) where you can see the message thread, then compose and send your reply. Replies are indented slightly in the center pane to indicate that they are child messages of a parent post.

When composing a reply in the right-hand sidebar, click the expand/collapse icon with two arrows at the top of the sidebar to make things easier to read.

## Posting a Message

Write a message by typing into the text input box, then press ENTER to send it. Use SHIFT+ENTER to create a new line without sending a message. To send messages by pressing CTRL+ENTER go to **Main Menu > Account Settings > Send messages on CTRL+ENTER**.

## Editing a Message

Edit a message by clicking the **[...]** icon next to any message that you’ve sent, then click **Edit**. When you're done editing, press ENTER to save the changes. Message edits do not trigger new @mention notifications, desktop notifications or notification sounds.

## Deleting a message

Delete a message by clicking the **[...]** icon next to any message that you've sent, then click **Delete**. System and Team Admins can delete any message on their system or team.

## Linking to a message

The **Permalink** feature creates a link to any message. Get the permalink to any message by clicking the **[...]** icon next to the a message  > **Permalink > Copy Link**. Sharing this link will let other users view the linked message in the Message Archives. If the link is to a message in a public channel, any user of the team can see the message. If the link is to a message in a private channel, only other users in the private channel can see the message.

source/archive/security-release.rst METASEP
:nosearch:

Security Release Process
==========================

This page has moved to the `Mattermost Handbook <https://handbook.mattermost.com/operations/research-and-development/product/release-process/security-release>`__.

source/archive/searching-in-mattermost.rst METASEP
:nosearch:

Searching
=========

|all-plans| |cloud| |self-hosted|

.. |all-plans| image:: ../images/all-plans-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in Mattermost Free and Starter subscription plans.

.. |cloud| image:: ../images/cloud-badge.png
  :scale: 30
  :target: https://mattermost.com/download
  :alt: Available for Mattermost Cloud deployments.

.. |self-hosted| image:: ../images/self-hosted-badge.png
  :scale: 30
  :target: https://mattermost.com/deploy
  :alt: Available for Mattermost Self-Hosted deployments.

Use the Mattermost Search field to find messages, replies, and the contents of files shared across all channels you're a member of in your team's conversation history. File content search is available in Mattermost Server from v5.35 and in Mattermost Cloud, with mobile support coming soon.

.. image:: ../images/ui_search.png
   :alt: Use Search to find messages, replies, and the contents of files shared across channels.

You can also do more advanced search using `search modifiers <https://docs.mattermost.com/messaging/searching-in-mattermost.html#search-modifiers>`__.

.. tabs::
  
  .. tab:: Mattermost v6.1 onwards

    From Mattermost v6.1, your search results include messages from all of your teams.

  .. tab:: Mattermost v6.0 and earlier

    In Mattermost versions up to v6.0, your search results include messages from your current team only.

Searching for message contents 
------------------------------

Select the Search field, then type your search criteria. 

.. image:: ../images/search-messages.png

When message results display in the Search Results pane, select **Jump** to view the full message in context.

.. image:: ../images/jump-to-message.png

.. tip::
  Message results return first automatically if a message search isn't specified. In the Search Results pane, select **Messages** or **Files** to toggle between results.
  
Searching for file contents
---------------------------

Select the **Search** field, select **Files**, then type your search criteria. 

.. image:: ../images/search-files.png

File contents that match on file name, or contain matching text content within supported document types, are returned in the Search Results pane. Each search result includes file name, extension, and size details, as well as details about when and where the file was originally shared.

- For Mattermost Cloud workspaces, supported document file formats include PDF, PPTX, DOCX, ODT, HTML, and plain text documents. DOC, RTF, and PAGES file formats, as well as the contents of ZIP files, are not supported.
- For Mattermost self-hosted deployments, supported document file formats include PDF, PPTX, DOCX, ODT, HTML, and plain text documents. 

  - System Admins can extend file content search support for self-hosted deployments to include:
  
    - `files shared before upgrading to Mattermost Server v5.35 <https://docs.mattermost.com/manage/command-line-tools.html#mattermost-extract-documents-content>`__.
    - `DOC, RTF, and PAGES file formats <https://docs.mattermost.com/configure/configuration-settings.html#enable-document-search-by-content>`__.
    - `documents within ZIP files <https://docs.mattermost.com/configure/configuration-settings.html#enable-searching-content-of-documents-within-zip-files>`__.

To narrow search results further, in the Search Results pane, select the **File Type Filter** option, then select specific file types, such as documents, spreadsheets, or images.
  
.. image:: ../images/file-search-filter.png

.. tip::
  Select the **Channel Files** icon below the channel name to access files recently shared in that channel. 
  
  .. image:: ../images/channel-files-icon.png

Search modifiers
----------------

You can apply search modifiers to any search to reduce the number of results returned. Select a search modifier to add it to the Search field. Supported modifiers are described below.

.. image:: ../images/search-modifiers.png

``from:`` and ``in:``
~~~~~~~~~~~~~~~~~~~~~

- Use ``from:`` to find messages or files from specific users. 

  * For example, searching ``from:john.smith`` only returns content from your Direct Message history with John Smith.

- Use ``in:`` to find messages or files posted in specific Public channels, Private channels, Direct Messages, or Group Messages. You can specify channels by display name or channel ID. 
  
  * For example, searching ``Mattermost in:town-square`` only returns results in the Town Square Public channel that contains the term ``Mattermost``, while searching ``Mattermost in:john.doe`` only returns results that contains the term ``Mattermost`` in your Direct Message history with John Smith.

``before:``, ``after:``, and ``on:``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- Use ``before:`` to find messages or files posted before a specified date.

  * For example, searching ``website before: 2018-09-01`` returns messages or files containing the term ``website`` posted prior to September 1, 2018.

- Use ``after:`` to find messages or files posted after a specified date.

  * For example, searching ``website after: 2018-08-01`` returns messages or files containing the term ``website`` posted after August 1, 2018.

- Use both ``before:`` and ``after:`` together to search in a specified date range.

  * For example, searching ``website before: 2018-09-01 after: 2018-08-01`` returns all messages or files containing the term ``website`` posted between August 1, 2018 and September 1, 2018.

- Use ``on:`` to find messages files posted on a specific date. Use the date picker to select a date, or type it in YYYY-MM-DD format.

  * For example, searching ``website on: 2018-09-01`` returns messages or files containing the term ``website`` posted on September 1, 2018.

.. image:: ../images/calendar2.png
  :width: 300 px

Exclusions
~~~~~~~~~~

Use the hyphen ``-`` symbol to exclude terms from your search results. For example, searching ``test -release`` only returns results that include the term ``test`` and exclude the term ``release``.

This exclusion modifier can be used in combination with other modifiers to further refine search results. For example, searching ``test -release -in:release-discussion -from:eric`` returns all results with the term ``test``, excludes posts with the term ``release``, excludes posts made in the ``release-discussion`` channel, and excludes messages sent in Direct Messages by ``eric``.

Quotation Marks
~~~~~~~~~~~~~~~

Use quotation marks ``" "`` to return search results for exact terms. For example, searching ``"Mattermost website"`` returns messages containing the exact phrase ``Mattermost website``, but doesn't return results containing ``Mattermost`` and ``website`` as separate terms.

Wildcard
~~~~~~~~

Use the asterisk ``*`` symbol for wildcard searches that match within words. For example, searching ``rea*`` returns messages or files containing ``reach``, ``reason``, ``reality``, ``real``, and other words starting with ``rea``.

Hashtags
--------

Hashtags are searchable labels for messages. Anyone can create a hashtag in a message by using the pound sign ``#`` followed by alphanumeric or other unicode characters. Hashtag examples include: ``#bug``, ``#marketing``, ``#user_testing``, ``#per.iod``, ``#check-in``, ``#마케팅``.

Valid hashtags:

- Don't start with a number.
- Are at least three characters long, excluding the ``#``.
- Are made up of alphanumeric or other unicode characters.
- May contain dots, dashes, or underscores.

To search for messages containing hashtags, select a hashtag in an existing post, or type the hashtag (including the pound ``#`` symbol) into the search bar. 

.. note::
  
  Hashtags don't link to channels. If you have a channel named “Marketing”, selecting a ``#marketing`` hashtag does not take you to the Marketing channel. To link to public channels, use the tilde ``~`` symbol followed by the channel name. For example ``~marketing``.

Notes about all searches
------------------------

- Multiple-word searches return results that contain *all* of your search criteria.
- Search modifiers can help narrow down searches. See the `Search Modifiers`_ section for details.
- You can search Archived channels as long as you're a member of that channel.

  - If you're unable to see messages or files in archived channels in your search results, ask your System Admin if **Allow users to view archived channels** has been disabled under **System Console > Site Configuration > Users and Teams**.
  - To remove archived channels from your search results, you can leave the Archived channels.
- Like many search engines, common words such as ``the``, ``which``, and ``are`` (known as "stop words"), as well as two-letter and one-letter search terms, are not shown in search results because they typically return too many results. See the `Technical Notes`_ section for details.
- IP addresses (e.g. ``10.100.200.101``) don't return results.

Technical notes
---------------

Searching Chinese, Korean, and Japanese
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- The best experience for searching in Chinese, Korean, and Japanese is to use MySQL 5.7.6 or later with special configuration. See the `Chinese, Japanese and Korean Search documentation <https://docs.mattermost.com/install/i18n.html>`__ for details.
- You can perform searches without this configuration by adding wildcards ``*`` to the end of search terms.

Differences between PostgreSQL and MySQL search
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

By default, Mattermost uses full text search support included in MySQL and PostgreSQL. These databases have slightly different search behavior. Check **Product menu > About Mattermost** to see which database you’re using.

For example, different databases have different “stop words” filtered out of search results. See `MySQL <https://dev.mysql.com/doc/refman/5.7/en/fulltext-stopwords.html>`__ or `PostgreSQL <https://www.postgresql.org/docs/10/textsearch-dictionaries.html#TEXTSEARCH-STOPWORDS>`__ database documentation for a full list.

Other database-specific differences include:

PostgreSQL:

- Email addresses don't return results.
- Hashtags or recent mentions of usernames containing a dash don't return results.
- Terms containing a dash return incorrect results since dashes are ignored in the search engine.

MySQL:

- Hashtags or recent mentions of usernames containing a dot don't return results.
- Avoid using underline ``_`` symbol to `perform a wildcard search <https://docs.mattermost.com/messaging/searching-in-mattermost.html#wildcard>`__. Use the asterisk ``*`` symbol instead.
- Stop words that are excluded from search in MySQL include: ``"a", "about", "an", "are", "as", "at", "be", "by", "com", "de", "en", "for", "from", "how", "i", "in", "is", "it", "la", "of", "on", "or", "that", "the", "this", "to", "was", "what", "when", "where", "who", "will", "with", "und", "the", "www"``.

source/archive/scripts.rst METASEP
:orphan:

.. This page is intentionally NOT accessible from the LHS, and is no longer maintained in this repository. Unofficial content has moved to the User Forum.

Scripts (unofficial)
====================

This repository contains a series of scripts to perform discrete tasks: https://github.com/icelander/mattermost-scripts.

.. important::
   
   This code is provided as-is without any warranty and is not sponsored by Mattermost. Please use cautiously and test before running any of these scripts against a production server.

These useful Mattermost scripts are outlined in the repository's README file (https://github.com/icelander/mattermost-scripts/blob/master/README.md) and include:

 - Get all deactivated users
 - Get last login time for all users
 - Get number of posts in public and private channels
 - Get posts by team and channel
 - Get user's last activity at
 - Get users in channels
 - Get users in teams

source/archive/saving-messages.rst METASEP
:nosearch:

Saving Messages
===============

|all-plans| |cloud| |self-hosted|

.. |all-plans| image:: ../images/all-plans-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in Mattermost Free and Starter subscription plans.

.. |cloud| image:: ../images/cloud-badge.png
  :scale: 30
  :target: https://mattermost.com/download
  :alt: Available for Mattermost Cloud deployments.

.. |self-hosted| image:: ../images/self-hosted-badge.png
  :scale: 30
  :target: https://mattermost.com/deploy
  :alt: Available for Mattermost Self-Hosted deployments.

Saving a message helps you mark messages for follow up. Your saved messages are personal, and can't be seen by other users. There's no limit to the number of posts you can save.

One way to use saved messages is to mark messages you want to respond to later. You can save the message in the list of **Saved posts**, refer back to it later, and once complete, you can remove it from the list.

Saving a Message
----------------

To try it out, hover over a message and select the **Save** icon to save the message for follow up.

.. image:: ../images/save-message.png

Viewing Saved Messages
----------------------

To view a list of saved posts for your current team, select the **Saved posts** icon in the Global Header. In Mattermost versions up to 5.39, the **Saved posts** icon is located at the top of the channel.

.. image:: ../images/saved-posts.png

Unsaving Messages
-----------------

To remove an item from the **Saved Posts** list, select the **Save** icon next to message to clear it.

.. image:: ../images/remove-from-saved-posts.png
   

source/archive/running-mattermost.rst METASEP
:nosearch:

Running Mattermost
==================

For information on running Mattermost, visit https://developers.mattermost.com/contribute/server/developer-workflow/.

source/archive/release-tips.rst METASEP
:nosearch:

Release Tips
==========================

This page has moved to the `Mattermost Handbook <https://handbook.mattermost.com/operations/research-and-development/product/release-process/release-tips>`__.

source/archive/release-scorecard-definitions.rst METASEP
:nosearch:

Release Scorecard Definitions
-----------------------------

This page has moved to the `Mattermost Handbook <https://handbook.mattermost.com/operations/research-and-development/product/release-process/release-scorecard-definitions>`__.

source/archive/release-process.rst METASEP
:nosearch:

Release Process
========================

See the new `feature release process <https://docs.mattermost.com/process/feature-release.html>`__.

source/archive/release-faq.rst METASEP
:nosearch:

Release Overview
==========================

This page has moved to the `Mattermost Handbook <https://handbook.mattermost.com/operations/research-and-development/product/release-process/release-overview>`__.

source/archive/redux.rst METASEP
:nosearch:

For information on how to work with Redux, add actions and add selectors, see `developers.mattermost.com <https://developers.mattermost.com/contribute/redux/>`__.

source/archive/redux-to-flow.rst METASEP
:nosearch:

See the process for migrating the Redux library to Flow at `developers.mattermost.com <https://developers.mattermost.com/contribute/redux/redux-to-flow/>`__.

source/archive/push.rst METASEP
:nosearch:

Mobile Applications Guide
=========================

Please see our new :doc:`../mobile/mobile-overview`.

source/archive/productivity-tools.rst METASEP
:nosearch:

Productivity Tools
===================

Our `Integrations Directory <https://integrations.mattermost.com>`_ has several integrations to connect productivity tools in Mattermost.

Here are some popular options below, including self-hosted on-prem or self-hosted private cloud solutions, and vendor-hosted SaaS solutions.

Matterpoll for polls
~~~~~~~~~~~~~~~~~~~~~

 - Create a poll by using a slash command, developed by Hanzei and Yusuke Nemoto.
 - Polls can be created in different languages, including English, French, German and Japanese.
 - Source code + docs: https://github.com/matterpoll/matterpoll

Google Calendar
~~~~~~~~~~~~~~~

 - Time management tool for Google Calendar, developed by Wasim Thabraze.
 - Get reminders about appointments and meetings from a configured Google Calendar to any Mattermost channel.
 - Source code + docs: https://github.com/waseem18/mattermost-plugin-google-calendar

CloudApp
~~~~~~~~

 - Tool for screen recording, screenshots, and GIF creation in the cloud, developed by CloudApp team.
 - Record a screen, generate a GIF or create a screenshot, and share in Mattermost.
 - Docs: https://www.getcloudapp.com/integrations/mattermost

Gyazo
~~~~~~

 - Screenshot application, developed by Sean Sackowitz.
 - Take screenshots, screen GIFs and full page captures, and share in Mattermost.
 - Source code: https://github.com/seansackowitz/mattermost-plugin-gyazo

Autotranslation Plugin
~~~~~~~~~~~~~~~~~~~~~~~~

 - Leverage the translation capabilities of Amazon AWS Translate and Mattermost, developed by Mattermost.
 - Instantly translate messages to other languages with supported translations available between English and French, German, and others.
 - Source code + docs: https://github.com/mattermost/mattermost-plugin-autotranslate

Remind Plugin
~~~~~~~~~~~~~

 - A Mattermost plugin that sets reminders for users and channels, developed by Scott Lee Davis.
 - Set reminders for one-time or recurring events and tasks in any Mattermost channel.
 - Source code + docs: https://github.com/scottleedavis/mattermost-plugin-remind

Have a proposal for a productivity integration? `Let us know in the feature proposal forum <https://mattermost.uservoice.com/forums/306457-general?category_id=202591>`_.

Have built an integration? `Let us know <https://integrations.mattermost.com/submit-an-integration/>`_ and we'll share in our `Integrations Directory <https://integrations.mattermost.com>`_.

source/archive/product-manager.rst METASEP
:nosearch:

=====================
Staff Product Manager
=====================

This page has moved to the `Mattermost Handbook <https://handbook.mattermost.com/contributors/join-us/staff-recruiting/product-manager-hiring>`_.

source/archive/product-manager-hiring.rst METASEP
:nosearch:

====================================
Product Manager Hiring Process
====================================

This page has moved to the `Mattermost Handbook <https://handbook.mattermost.com/contributors/join-us/staff-recruiting/product-manager-hiring>`_.

source/archive/prod-windows-2012.rst METASEP
:nosearch:

..  _prod-windows:

Production Install on Windows Server (Unofficial) 
=================================================

Install Mattermost in production mode on one, two or three machines.

.. important:: 

   This unofficial guide is maintained by the Mattermost community and this deployment configuration is not yet officially supported by Mattermost, Inc. `Community testing, feedback and improvements are welcome and greatly appreciated. <https://github.com/mattermost/docs/issues/360>`__
 
.. contents::
  :backlinks: top

Install Windows Server 2012+
----------------------------

1. Set up 3 machines with any edition of Windows Server 2012+ (except core) with 2GB of RAM or more. The
   servers will be used for the Web Proxy and SSL Termination, Mattermost, and Database.  The screenshots 
   used in this guide are from Microsoft Server 2012, but similar steps should work for other versions.

   -  **Optional:** You can also use a single machine for all 3
      components in this install guide, depending on the standards of
      your data center.  In this case, replace all 10.0.0.* IP addresses 
      with a single/common address.

2. Make sure the systems are up to date with the most recent security
   patches by executing Windows Update.

Set up Database Server
----------------------

1.  Log in to the database server. For the purposes of this guide we will assume this server has an IP address of 10.0.0.1.

Install and Configure MySQL
~~~~~~~~~~~~~~~~~~~~~~~~~~~

2. `Download the MySQL 5.6+ <https://dev.mysql.com/downloads/windows/installer/>`__ installer, (or PostgreSQL 10.0+).
   For the purposes of this guide, we'll be downloading and installing the latest version of MySQL Community Server
   Edition MSI-installer (version 5.7 at the time of writing this guide). Note that the appropriate link refers 
   to 32-bit (as shown in the figure below); however, this installer is 32-bit but is capable of installing the 
   64-bit version of MySQL.

3. Launch the installer.

4. On the **License Agreement** page, Check the box to accept the license terms and press Next.

5. On the **Choosing a Setup Type** choose **Custom** so you can decide exactly which packages to install. This 
   is the only place where you can specify whether to install 32-bit or 64-bit MySQL Server.

6. On the **Select Products and Features** page, select the **64bit** version of MySQL Server.

7. On the **Check Requirements** page, install any missing requirements by pressing the Execute button, or go back 
   to the previous page and change the packages that will be installed to remove the requirement. Once all of the 
   requirements are met, press the Next button.

8. On the **Installation** page, you will be shown a list of software that will be installed. Press the Execute 
   button to begin the installation.  Once the installations have completed, press the Next button.

9. On the **Product Configuration** page, press the Next button to begin the MySQL Server Configuration Wizard.

   a. On the **Type and Networking** page, select the appropriate **Config Type** based on your desired usage.
   b. On the **Accounts and Roles** page, enter a MySQL Root password and press the Next button.
   c. On the **Windows Service** page, keep the defaults and press the Next button.
   d. On the **Plugins and Extensions** page, keep the defaults and press the Next button.
   e. On the **Apply Server Configuration** page, press the Execute button to configure the MySQL Server installation.

10. Returning to the **Product Configuration** page, select **Next**.

11. On the **Installation Complete** page, select **Finish**.

Configure Windows PATH
~~~~~~~~~~~~~~~~~~~~~~~

Adding MySQL to the Windows PATH variable will allow you run various commands from the console, and allow third-party applications to execute various MySQL commands.

12. Press the ``WIN + PAUSEBREAK`` key combination to open the **System** Control Panel Applet.

13. Select the **Advanced System Settings** link.

14. Select the **Advanced** tab. 

15. Press the **Environment Variables** button.

16. In the **System Variables** section, select the **Path** variable in the list, then press the Edit button.

17. Append the path to your MySQL Server bin directory (make sure to add a semi-colon after any existing items in the path before appending the new path). The default path for a 64-bit  installation is ``C:\Program Files\MySQL\MySQL Server 5.7\bin``.

Create Mattermost Database
^^^^^^^^^^^^^^^^^^^^^^^^^^

Now that MySQL has been installed and configured, a database and user account must be provisioned for Mattermost to utilize.

18. Open a command prompt and enter ``mysql -u root -p`` to connect to the MySQL server

19. When prompted, enter the password created in step 9.a.       

20. At the ``mysql>`` prompt, execute the following commands to create the database and user account:

    .. code:: sql

       CREATE DATABASE mattermost;
       CREATE USER mmuser IDENTIFIED BY 'mmuser-password';
       GRANT ALL ON mattermost.* TO mmuser;
       exit

21. To confirm the database and user were configured correctly:

    a. Connect to the MySQL server/database by executing ``mysql -u mmuser -p mattermost``.
    b. When prompted, entering ``mmuser-password``.
    c. If If successful, you will be at the ``mysql>`` prompt.
    d. Type ``exit`` to finish.

Set up Mattermost Server
------------------------

1. For the purposes of this guide we will assume this server has an IP address of 10.0.0.2.

2. `Download <https://mattermost.com/download/>`__ the latest Mattermost Server by opening your favorite browser and navigating to ``https://releases.mattermost.com/X.X.X/mattermost-team-X.X.X-windows-amd64.zip`` where `X.X.X` is the latest Mattermost release version. For example, 3.4.0.

3. Create the storage directory for files. We assume you will have attached a large drive for storage of images and files. For this setup we will assume the directory is located at ``c:\mattermost\data``. Your directory structure should look similar to the image below.

   .. image:: ../images/windows_1_expected_directory_structure.png

4. Configure Mattermost Server by editing the config.json file at ``c:\mattermost\config\config.json``.
   
   * Update database name and server in the the connection string:
     
     * Old: ``"DataSource": "mmuser:mostest@tcp(dockerhost:3306)/mattermost_test?charset=utf8mb4,utf8"``    
     * New: ``"DataSource": "mmuser:mmuser-password@tcp(10.0.0.1:3306)/mattermost?charset=utf8mb4,utf8"``

   .. note :: Optionally you may continue to edit configuration settings in ``config.json`` or use the 
      System Console described in a later section to finish the configuration.

5. Test the Mattermost server.

   a. Open a command prompt, and execute ``cd c:\mattermost\bin`` to change your working directory

   b. Execute ``mattermost.exe``
   
   c. Verify that mattermost is running and connected to the database successfully by confirmed a console 
      log like ``Server is listening on :8065`` letting you know the service is running.

      .. image:: ../images/windows_2_platform_exe_test.png

   d. Stop the server by pressing CTRL+C
   
Configure the Firewall
~~~~~~~~~~~~~~~~~~~~~~

.. note:: This is not required if you are installing on a single server.

6. Open a command prompt as an administrator

7. Execute the following command to allow inbound traffic to Mattermost

   .. code:: batch

      netsh advfirewall firewall add rule name="Mattermost" dir=in action=allow program="C:\mattermost\bin\mattermost.exe" enable=yes 

Establish a Windows Service
~~~~~~~~~~~~~~~~~~~~~~~~~~~

Establishing a Windows service to supervise the Mattermost process is recommended to prevent the need to manually start/stop Mattermost. The included binary cannot be directly registered as a Windows service; therefore, a wrapper-utility must be used.

8. Download the latest version of `NSSM (Non-Sucking Service Manager) <https://nssm.cc/download>`__.

9. From the downloaded zip-file, extract ``win64\nssm.exe`` to ``C:\mattermost\bin\``.

10. Open the command line tool as an administrator.

11. To create the Windows service, execute the following:

    .. code:: batch

       cd c:\mattermost\bin
       nssm install mattermost c:\mattermost\bin\mattermost.exe
       nssm set mattermost AppDirectory c:\mattermost

12. Start the service by executing the following

    .. code:: batch

      net start mattermost
      tasklist /FI "IMAGENAME eq mattermost.exe"

Verify Mattermost Connectivity
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

To verify all steps executed thus far, we'll attempt to access Mattermost through standard HTTP traffic. To perform this step, you'll need access to a client machine with a compatible browser (e.g. Safari, Firefox, Edge, Chrome, etc).

13. From a client workstation meeting the criteria above, launch your favorite web browser.

14. Navigate to ``http://10.0.0.2:8065``.  If successful, you should reach an initialization web-page similar to the screenshot below.

    .. image:: ../images/windows_3_confirm_mattermost_browser.png

15. Assuming your test was successful, close the browser as we'll finish initializing Mattermost later in this guide.

Set up Web Proxy Server
-----------------------

A reverse proxy is recommended in order to provide:

- SSL termination
- HTTP to HTTPS redirection
- Port mapping :80/:443 to :8065
- Standard request logs
- Load balancing (not described in this guide).

Internet Information Server (IIS) for Windows Server is the standard capability provided out-of-the-box that provides this function.  

1. For the purposes of this guide we will assume this server has an IP address of 10.0.0.3.

2. Map a FQDN (fully qualified domain name), like **mattermost.example.com** to the proxy server (e.g. 10.0.0.2).

Install IIS
~~~~~~~~~~~

3. On the **Start** page, click the **Server Manager** tile, and then select **OK**.

4. In **Server Manager**, select **Dashboard**, and click **Add roles and features**.

5. In the **Add Roles and Features Wizard**, on the **Before you begin** page, select **Next**.

6. On the **Select installation type** page, select Role-based or feature-based installation, and select **Next**.

7. On the **Select destination server** page, select **Select a server from the server pool**, select your server, and choose Next.

8. On the **Select server roles** page, select **Web Server (IIS)**.

9. Expand **Web Server (IIS) > Web Server > Application Development** and select **WebSockets Protocol**, and then select **Next**.

10. On the **Add Roles and Features Wizard** popup dialog, click Add Features, and select **Next**.

11. On the **Select features** page, select **Next**.

12. On the **Web Server Role (IIS)** page, select **Next**.

13. On the **Select role services** page, accept the default selections, and select **Next**.

14. On the **Summary of Features to Install** page, select **Install**.

15. On the Installation progress page, confirm that your installation of the Web Server (IIS) role and required role services completed successfully, and then select **Close**.
 
16. To verify that IIS installed successfully, navigate to ``http://localhost`` in a web browser on the server, and confirm the default IIS Welcome page is displayed.

Configure Reverse Proxy
~~~~~~~~~~~~~~~~~~~~~~~

Reverse proxying involves rewriting an HTTP request and relaying it to a back-end server. IIS does not natively support this; however, Microsoft provides a `URL Rewrite <https://www.iis.net/learn/extensions/url-rewrite-module>`__ module and an `Application Request Routing 
<https://www.iis.net/downloads/microsoft/application-request-routing>`__ module which, when combined, are capable of performing these functions. We'll start by installing these module, and then configure the proxy.

17. `Download <https://go.microsoft.com/fwlink/?LinkID=615137>`__ the URL Rewrite 2.0 x64 module.

18. `Download <https://go.microsoft.com/fwlink/?LinkID=615136>`__ the Application Request Routing 3.0 x64 module.

19. Install the modules (trivial installers with no customizations or options to select).

20. On the **Start** page, click the **Server Manager** tile, and then select **OK**.

21. Expand the **Tools** menu, and select **Information Information Services (IIS) Manager**.

    .. image:: ../images/windows_4_IIS_manager.png

22. In the left-hand navigation tree, expand the server node, expand **Sites**, and select **Default Web Site**.

23. Double-click the URL Rewrite feature, as shown below.

    .. image:: ../images/windows_5_iis_manager_url_rewrite.png

24. In the actions pane (far-right), select **Add Rule(s)...**

25. Select **Reverse Proxy** and select **OK**.

26. If prompted to enable proxy functionality, select **OK**.

27. In the **Add Reverse Proxy Rules** dialog:

    a. Enter ``10.0.0.2:8065`` in the **Enter the server name or IP address where HTTP requests will be forwarded** field.

    b. Ensure the **Enable SSL Offloading** option is checked.

    c. Check **Rewrite the domain names of the links in HTTP responses**.

    d. Enter ``10.0.0.2:8065`` in the **From** field.

    e. Enter ``mattermost.example.com`` in the **To** field.

    f. Select **OK**.

28. At this point, your configuration will relay all incoming traffic from `http://mattermost.example.com` to `http://10.0.0.2:8065/`.  To confirm this, open your favorite browser and attempt to access `http://mattermost.example.com`, and upon success, you'll see the Mattermost initialization screen.

Configure SSL
~~~~~~~~~~~~~

.. note:: 

   SSL communication requires that the web server have a well-formed and trusted certificate. A common freely-available SSL encryption and certificate management is Let's Encrypt; however, this service does not formally support the Windows Operating system. A number of third-parties have created clients to support this, and you are free to try out any of them.  This section assumes that you have taken the necessary steps to obtain a web-server certificate that will be trusted by your users.

29. Within the IIS Manager, select the server node in the left-hand connections pane.

30. Double-click the **Server Certificates** option.

31. Select **Import...** from the list of actions on the right-hand-side.

32. Press the ... button to locate your PFX formatted certificate.

33. Enter the password to the certificate file.

34. Select the **Web Hosting** certificate store, and select **OK**.

35. In the left-hand navigation tree, expand the server node, expand **Sites**, and select **Default Web Site**.

36. In the right-hand-side **Actions** pane, select **Bindings...**.

37. Select **Add**,

38. In the **Add Site Binding** dialog, Set the type to **https** and set the **SSL Certificate** to the certificate loaded previously.  Press OK.

Redirect HTTP to HTTPS
~~~~~~~~~~~~~~~~~~~~~~

39. In the left-hand navigation tree, expand the server node, expand **Sites** and select **Default Web Site**.

40. Double-click to open the **Url Rewrite** feature.

41. In the actions-pane (far-right), select **Add Rule(s)..**.

42. Under the **Inbound Rules** section, select **Blank rule** and select **OK**.

43. Populate the fields in the rule to match the screenshot below:

    .. image:: ../images/windows_6_http_to_https_redirect.png   

44. Select **Apply**, and then **Back to Rules**.

45. Ensure that the **HTTP to HTTPS Redirect** rule is at the top of the list of inbound rules. If necessary, you can select a rule and use the **Move Up** and **Move Down** actions to reorganize.

46. On a client workstation, open your favorite browser and navigate to `http://mattermost.example.com` and confirm that you are redirected to `https://mattermost.example.com`.

Finish Mattermost Server Setup
------------------------------

1. Navigate to ``https://mattermost.example.com`` and create a user and team.

2. The first user in the system is automatically granted the ``system_admin`` role, which gives you access to the System Console.

3. From the ``town-square`` channel select the dropdown next to your team name and choose **System Console**.
   
4. Update **Environment > Web Server** to properly configure your reverse proxy by entering `https://mattermost.example.com` as the **Site URL**.

.. important::
   Failure to properly set the Site URL properly will result in unexpected behavior.

5. Update **Authentication > SMTP** to set up an SMTP email service. The example below assumes AmazonSES.

   a. Set **SMTP Username** to ``[YOUR_SMTP_USERNAME]``.
   b. Set **SMTP Password** to ``[YOUR_SMTP_PASSWORD]``.
   c. Set **SMTP Server** to ``email-smtp.us-east-1.amazonaws.com``.
   d. Set **SMTP Port** to ``465``.
   e. Set **Connection Security** to ``TLS``.
   f. Set **Send Email Notifications** to **true** (located at **Site Configuration > Notifications**).
   g. Set **Notification Display Name** to **No-Reply** (located at **Site Configuration > Notifications**).
   h. Set **Notification From Address** to ``mattermost@example.com`` (located at **Site Configuration > Notifications**).
   i. Set **Require Email Verification** to **true** (located at **Authentication > Email**).

6. (Optional) Update **Authentication > Signup**:

   - Set **Enable Email Invitations** to **true**.

7. Update **Environment > File Storage**:

   - Change **Local Directory Location** from ``./data/`` to ``/mattermost/data``

8. Update **General > Logging** settings:

   - Set **Log to The Console** to **false**.

9. Update **Environment > Rate Limiting** settings:

   - Set **Vary By Remote Address** to **false**.
   - Set **Vary By HTTP Header** to **X-Real-IP**.

10. Feel free to modify other settings.

11. Login to the Mattermost server (10.0.0.2) and restart the Mattermost Service by typing the following into a command line:

   .. code:: batch

      net stop mattermost
      net start mattermost

source/archive/prod-ubuntu-16.04.rst METASEP
:nosearch:

..  _prod-ubuntu-1604:

Ubuntu 16.04 reached end of life April, 2019. Please refer to install guides for :doc:`Ubuntu 18.04 LTS <../install/installing-ubuntu-1804-LTS>` or :doc:`Ubuntu 20.04 LTS <../install/installing-ubuntu-2004-LTS>` instead.
source/archive/prod-ubuntu-1404.rst METASEP
:nosearch:

..  _prod-ubuntu-1404:

Ubuntu 14.04 LTS reached end of life April, 2019. Please refer to install guides for :doc:`Ubuntu 18.04 LTS <../install/installing-ubuntu-1804-LTS>` or :doc:`Ubuntu 20.04 LTS <../install/installing-ubuntu-2004-LTS>` instead.
source/archive/prod-rhel-8.rst METASEP
:nosearch:

..  _prod-rhel-8:

Production Install on RHEL 8+
===============================

This document is replaced by :doc:`install-rhel-8`.

source/archive/prod-rhel-7.rst METASEP
:nosearch:
..  _prod-rhel-7:

Production Install on RHEL 7.1+
===============================

This document is superseded by :doc:`install-rhel-7`.

source/archive/prod-rhel-6.rst METASEP
:nosearch:

..  _prod-rhel-6:

Production Install on RHEL 6.6
==============================

This document is superseded by :doc:`install-rhel-6`.

source/archive/prod-docker.rst METASEP
:nosearch:

..  _docker-local-machine:

Deploy Mattermost on Docker
============================

.. important:: 

   This unofficial guide is maintained by the Mattermost community and this deployment configuration is not yet officially supported by Mattermost, Inc. Community testing, feedback, and improvements are welcome and greatly appreciated. You can `edit this page on GitHub <https://github.com/mattermost/docs/blob/master/source/install/prod-docker.rst>`__.

Deploy Mattermost using a multi-node configuration with `Docker Compose <https://docs.docker.com/compose/>`__. Experience with Docker Compose is recommended.

For a single-node preview of Mattermost (without email) see `Local Machine Setup using Docker <https://docs.mattermost.com/install/docker-local-machine.html>`__.

If you have any problems installing, see the `troubleshooting guide <https://forum.mattermost.com/c/trouble-shoot>`__. To submit an improvement or correction, click **Edit** at the top of this page.

Docker Setup on Ubuntu
-----------------------

1. **Install Docker** using `the Ubuntu online guide <https://docs.docker.com/installation/ubuntulinux/>`__ or these instructions:

   .. code:: bash

       sudo apt-get update
       sudo apt-get install wget
       wget -qO- https://get.docker.com/ | sh
       sudo usermod -aG docker <username>
       sudo service docker start
       newgrp docker

2. **Install Docker Compose** using `the online guide <https://docs.docker.com/compose/install/>`__. You have to download the latest release from the `Docker Compose Github page <https://github.com/docker/compose/releases/>`__ and put the binary on your :code:`/usr/local/bin` folder. Usually, you can use the following command, replacing :code:`$dockerComposeVersion` with the Docker Compose version to install:

   .. code:: bash
   
      sudo curl -L "https://github.com/docker/compose/releases/download/$dockerComposeVersion/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
      sudo chmod +x /usr/local/bin/docker-compose

3. **Deploy the Mattermost Docker** 

Mattermost by default uses :code:`uid=2000` (user ID) and :code:`gid=2000` to access :code:`./volumes/app/`.

If you need to use another group or user IDs you can uncomment following lines in `docker-compose.yml` (also change `chown -R 2000:2000` in set-up commands to your `uid:gid`)

.. code:: yaml

  mattermost-app:
    build:
      context: app
      # uncomment following lines for team edition or change UID/GID
      args:
        - edition=team
        - PUID=1000
        - PGID=1000
        - MM_VERSION=5.31
    restart: unless-stopped

Set up using:

.. code:: bash
   
   sudo apt-get install git
   git clone https://github.com/mattermost/mattermost-docker.git
   cd mattermost-docker
   docker-compose build
   mkdir -pv ./volumes/app/mattermost/{data,logs,config,plugins,client-plugins}
   sudo chown -R 2000:2000 ./volumes/app/mattermost/
   docker-compose up -d

The ``docker-compose`` network that is created defaults to 172.18.0.0/16.  If you need to change the default network this `link <https://success.docker.com/article/how-do-i-configure-the-default-bridge-docker0-network-for-docker-engine-to-a-different-subnet>`__ provides guidelines on how to do that. If the network is already set up with the default, you need to run the following command to remove it. Then, run the command again to regenerate the default network to include the new network setting.
   
.. code:: bash
 
   docker network rm mattermost-server_mm-test
	   
To verify the current Docker network use the following command to list it (you can access information about the options `here <https://docs.docker.com/engine/reference/commandline/network_ls/>`__):
   
.. code:: bash
   
   docker network ls [OPTIONS]

4. **Configure TLS** by following `the instructions <https://github.com/mattermost/mattermost-docker#install-with-ssl-certificate>`__.

5. **Configure Email** by following the `SMTP email setup guide <https://docs.mattermost.com/install/smtp-email-setup.html>`__.

6. (Optional) To enable enterprise features, go to **System Console > Edition and License** and select **Start trial**.

7. **Configure your Server** based on the `configuration settings documentation <https://docs.mattermost.com/configure/configuration-settings.html>`__.

Once you've saved your configurations, start an Enterprise E20 trial via **Main Menu > System Console > Edition and License > Start trial**.

Additional guides:

- **Start, Stop, and Remove Containers** using `management instructions. <https://github.com/mattermost/mattermost-docker/#startingstopping-docker>`__

- **Setup Database Backup** following the `database backup instructions. <https://github.com/mattermost/mattermost-docker#aws>`__

Docker Setup on Arch Linux
--------------------------

To install on Arch Linux, see the `installation guide <https://wiki.archlinux.org/index.php/Mattermost>`__ on the Arch Linux wiki.

Docker Setup on macOS
---------------------

You can run a deployment on macOS by `installing Docker Compose using the online guide <https://docs.docker.com/docker-for-mac/>`__ then following the above instructions.

Other Options
--------------

To install Mattermost Team Edition instead of Mattermost Enterprise Edition, open ``docker-compose.yaml`` and uncomment the following lines:

.. code-block:: text

   # args:
   #   - edition=team

source/archive/prod-debian.rst METASEP
:nosearch:

..  _prod-debian:

Production Install on Debian Jessie
===================================

This document is superseded by :doc:`install-debian`.

source/archive/process_security.md METASEP
# Security Policies 

This page has been moved to [the Mattermost Handbook](https://handbook.mattermost.com/operations/operations/company-policies/security-policies).

source/archive/process_overview_copy.rst METASEP
:nosearch:

Development Process Overview
============================

This page has moved to the `Mattermost Handbook <https://handbook.mattermost.com/operations/research-and-development/product/development-process>`__.

source/archive/process_engineer-expectations.md METASEP
# Engineer Onboarding Timeline & Expectations

This page has moved to the [Mattermost Handbook](https://handbook.mattermost.com/contributors/onboarding/staff-onboarding-guide/engineer-onboarding).

source/archive/process_community-systems.md METASEP
# Bugs, Feature Ideas, Troubleshooting

**Note:** This page is being migrated to the [Mattermost Handbook](https://handbook.mattermost.com/contributors/contributors). 

Here's how to engage with the Mattermost community: 

- **Bugs:** [Search for existing bugs and file a GitHub issue if your bug is new](https://mattermost.org/filing-issues/). 
- **Feature Ideas:** [Add a feature idea to be discussed or upvoted](https://mattermost.org/feature-ideas/).
- **Troubleshoot:** [Search articles and add topic if issue is new](https://forum.mattermost.org/t/how-to-use-the-troubleshooting-forum/150).
- **General discussion:** [Join the Mattermost Forum](https://forum.mattermost.org/t/welcome-to-the-mattermost-general-forum/8). 
- **Contribute code:** Select tickets marked [Accepting Pull Requests](https://mattermost.atlassian.net/browse/PLT-2244?filter=10101) (APR) and follow [guidelines to contribute](https://docs.mattermost.com/developer/contribution-guide.html). Join the [APR channel](https://community.mattermost.com/core/channels/tickets) to ask questions and discuss your work. 
- **Contributor and tester discussion:** Contributors and testers can use [nightly builds server](https://community.mattermost.com/core) to work on next release.
- **Integrations:** [Let us know about your work so we can promote it!](https://mattermost.org/share-your-mattermost-projects/) Join the [Integrations and Apps channel](https://community.mattermost.com/core/channels/integrations) to discuss your project. 
- **Localization:** Join the [translation server](https://translate.mattermost.com/projects/mattermost/) to start translating right away. If your language isn't yet started, join our [Localization channel](https://community.mattermost.com/core/channels/localization) to request a new language, or to ask general questions and meet others in the community. Join language-specific channels to discuss translation work. 
- **Approved changes:** See [Jira database](https://mattermost.atlassian.net/secure/Dashboard.jspa) to view open, in-progress, resolved and closed tickets. 
- **Commercial support:** [Mattermost Enterprise Edition](https://mattermost.com/pricing-self-managed/) customers can access [commercial support](https://mattermost.com/support/) based on their subscription option.

## How Improvements Are Made to Mattermost

Every month, the Mattermost community plans, builds, tests, documents, releases, and supports new product improvements for Team Edition to benefit the user community, and the Mattermost Enterprise Team does the same for Enterprise Edition to benefit the subscriber community. 

1. When a feature idea is within the scope of Team Edition, as [defined in the Mattermost Manifesto](https://mattermost.org/manifesto/#mattermost-teams) and considered a priority, a Jira ticket is created to define its implementation: 

    1. If the change is not complex, a [Help Wanted Ticket](https://handbook.mattermost.com/contributors/contributors/help-wanted) label may be added to the Jira ticket for any developer to contribute the change to the Mattermost Team Edition code base via the [contribution process](https://docs.mattermost.com/developer/contribution-guide.html). [A list of tickets accepting pull requests](https://mattermost.atlassian.net/browse/PLT-2667?filter=10101) is offered to all contributors who read the contributor's guide, and these provide a steady stream of improvements to Team Edition month after month. 
    2. If change is considered high priority without prerequisites, a Fix Version may be applied to the Jira ticket for the Mattermost core team or key contributors to add for an upcoming monthly release. Priority decisions are influenced by discussion and voting in the feature idea forum and community systems as well as feedback from key contributors. 
    3. If change is not seen as high priority or has prerequisites, it is assigned a Fix Version of `triage` or `unscheduled` and will be considered monthly for inclusion in a future release.

2. When a feature idea does not fit the scope of Team Edition, as [defined in the Mattermost Manifesto](https://mattermost.org/manifesto/#mattermost-teams), but benefits Enterprise Edition subscribers, a similar process as above is undertaken by the Enterprise Team.

    1. If change is considered high priority without prerequisites, a Fix Version may be applied to the Jira ticket for the Mattermost Enterprise Team to add for an upcoming monthly release. Priority decisions are influenced by discussion with Enterprise Edition subscribers.
    2. If change is not seen as high priority or has prerequisites, it is assigned a Fix Version of `triage` or `unscheduled` until this situation changes.
    3. If an existing or potential Enterprise Edition subscriber needs a specific change that has not yet been assigned a Fix Version, they can contact the Mattermost Enterprise Team to discuss sponsoring the feature with Non-Recurring Engineering (NRE) funding to have it delivered before it would otherwise be added. Feature sponsorship can only be applied to features where Jira tickets exist.
    
3. If a feature idea is not within the scope of either Team Edition or Enterprise Edition, you might consider: 

    1. Building an integration using Mattermost webhooks or slash commands. There are [dozens of open source examples](https://mattermost.com/marketplace/) to help you start. For example: Suppose you want a link preview for an esoteric file type that Mattermost isn't able to support, you can create an outgoing webhook to reply with an image that offers a preview. 
    
    2. Building a client application using the Mattermost Web Service API. This is useful if you want to customize the user experience to your specific needs. For example: You can recreate the Mattermost web interface using Windows controls to define front-end logic, similar to the [MattermostWPF project](https://github.com/limey98/MattermostWPF). 
    
    3. Creating an open source variation of Mattermost using the Team Edition source code. For example: The Mozilla Foundation created their own [open source Mattermost variation](https://github.com/mozilla/chat.mozillafoundation.org), which includes changes specific to their needs.
    
## Drafting a Ticket for New Features

Before a new feature can be implemented, it needs a ticket specifying how it should work. To speed up the process of implementing feature ideas, community members are welcome to propose what the ticket should say for a new feature. 

When drafting a ticket for a new feature, please include:

1. **Title:** A clear, concise title describing the new feature
2. **Description:** Instructions on how the feature should be implemented.

When writing the description, the following checklist should be addressed:  

1. Does this feature require an Account Setting, Team Setting, or System Console Setting?
    1. If "yes", please include the proposed: Location, Title, Setting Options, Default Setting, and Help Text (see [example](https://mattermost.atlassian.net/browse/PLT-1577)).
2. Is there any ambiguity in the ticket?  
    1. If "yes", please update description to remove ambiguity.  
    2. The ticket should not include multiple potential solutions. The exception to this is if a second solution is suggested as an alternative if the first is too much work.  
    3. The ticket should include specific numbers where necessary. For example, it should not say to “increase” or “decrease” the length of something without specifying what number to increase/decrease it to.  

## GitHub Issues Workflow

To minimize response times, templates and automation are used across community systems for common requests. When misfiled requests are posted in GitHub close them soon so the community does not confuse them as being appropriate. 

### Category: Issue Submitter Needs to do Something

Start with "Please..."

##### Label: Please move to Troubleshooting forum

```
Thanks @[GITHUB_USERNAME] for your question, 

Because this seems to be more a troubleshooting discussion than a product defect, could we have your help posting this to the [Troubleshooting Forum](https://mattermost.org/troubleshoot/)? 

Per above link, please include repro steps to make it easier to solve your issue. Also, please link back to your new post from this issue? 
```

##### Label: Please move to Feature Ideas forum

```
Thanks @[GITHUB_USERNAME], appreciate your feedback, 

To keep feature idea discussions in one place, could we have your help: 

1. [Contributing this in the feature idea forum](https://mattermost.org/feature-requests/) so it can be discussed, upvoted and considered for a [ticket accepting pull requests](https://docs.mattermost.com/process/accepting-pull-request.html)? 

   Please include a link back to this GitHub Issue. If you're interested in implementing, please say so and we'll prioritize the review. 

2. Posting a link back from the feature idea forum to this thread? 
```

##### Label: Please add repro steps 

```
Thanks @[GITHUB_USERNAME] for the bug report, 

Can you help [add more information](https://mattermost.org/filing-issues/) so we can reproduce the issue? 
```

##### Label: Please rebase 

```
Please rebase this Pull Request
```

### Category: We/community need to do something 

Start with "Needs..."

##### Label: Needs PR reviewer

Needs Reviewer to add `+1` or share feedback to submitter on how to adjust pull request. 

##### Label: Needs PR seconder

After code is reviewed, needs "Seconder" to add `+1` or share feedback to submitter on how to adjust pull request. 

##### Label: Needs PM review

```
Thanks @[GITHUB_USERNAME] for your feedback. 

This ticket requires design review. Asking help from @[Core Team PM]
```

##### Label: Needs merge (review complete)

PR has been reviewed and seconded and is awaiting merge. 

##### Label: Needs Jira ticket

? + Assign to ?

Response after Jira ticket is created:

```
Thanks @[GITHUB_USERNAME], [Jira ticket]([LINK_TO_JIRA_TICKET]) created for this issue. 
```

### Category: Miscellaneous Issues

##### Label: Asking community help to repro 

```
Thanks @[GITHUB_USERNAME] for the issue report, 

Would anyone from the community be able to help repro this issue to verify it can be reproduced? 
```

##### Label: Duplicate Jira ticket

```
Thanks @[GITHUB_USERNAME] for the report, 

We have a [Jira Ticket]([LINK_TO_JIRA_TICKET]) tracking the issue. 
```

##### Label: Setup Test Server

Adding this label sets up a test server, removing it shuts down the test server. 

##### Label: Substantial commit

A PR that requires careful review due to size. 

##### Label: DO NOT MERGE 

A PR submitted for discussion that SHOULD NOT be merged.

source/archive/process_BEFORE-YOU-GET-STARTED.md METASEP
:nosearch:

# Deprecated content

The files in this folder have, for the most part, been moved to other parts of the Documentation site - or to [The Mattermost Handbook](handbook.mattermost.com). However, you can still contribute to the content! Visit the Handbook to find the relevant content and submit a PR. If you can't find the **Edit on GitHub** option on the page, please note that this is a bug that's being attended to by Gitbook. In the meantime, you can edit pages directly in the repo, which you can find at [https://github.com/mattermost/mattermost-handbook](https://github.com/mattermost/mattermost-handbook).

Questions? Issues? Get hold of the Documentation Team in the [DWG channel](https://community.mattermost.com/core/channels/dwg-documentation-working-group).

Thank you!

source/archive/prev-config-settings.rst METASEP
:nosearch:

Configuration Settings Prior to v5.12
=====================================

.. note::
   This page is a reference to the organization of the configuration settings prior to the reorganization of the System Console in the June 16th, 2019 release. To view the configuration settings based on the organization of the System Console in versions v5.12 and later, please see this `documentation <https://docs.mattermost.com/administration/config-settings.html>`_.

Mattermost configuration settings are maintained in the configuration file ``config.json``, located in the ``mattermost/config`` directory. You can modify the configuration file using the System Console, or by using a text editor to modify it directly.

The default location of ``config.json`` is in the ``mattermost/config`` directory. Mattermost must have write permissions to ``config.json``, otherwise changes made in the System Console will have no effect.

**Configuration in Database**

Storing configuration in the database is supported in v5.10 and later.  Please see more information on how to set this up `here <https://docs.mattermost.com/administration/config-in-database.html>`_. 

**Environment Variables**

Starting in Mattermost version 3.8, you can use environment variables to manage the configuration. Environment variables override settings in ``config.json``. If a change to a setting in ``config.json`` requires a restart for it to take effect, then changes to the corresponding environment variable also require a server restart.

The name of the environment variable for any setting can be derived from the name of that setting in ``config.json``. For example, to derive the name of the Site URL setting:

1. Find the setting in ``config.json``. In this case, *ServiceSettings.SiteURL*.
2. Add ``MM_`` to the beginning and convert all characters to uppercase and replace the ``.`` with ``_``. For example, *MM_SERVICESETTINGS_SITEURL*.
3. The setting becomes ``export MM_SERVICESETTINGS_SITEURL="http://example.com"``.

Finally, if a setting is configured through an environment variable, modifying it in the System Console is disabled.

For any setting that is not set in ``config.json`` or in environment variables, the Mattermost server uses the default value as documented here.

.. note::
   If a setting is set through an environment variable and any other changes are made in the System Console, the value stored of the environment variable will be written back to the ``config.json`` as that setting's value.

.. contents::
  :depth: 2
  :local:
  :backlinks: entry

General
-------
General settings for server configuration, language defaults, user and team management, privacy, compliance reporting and logs.

Configuration
~~~~~~~~~~~~~~

Site URL
^^^^^^^^

The URL that users will use to access Mattermost. The port number is required if it's not a standard port such as 80 or 443.

This field is required in Mattermost v3.8 and later.

In Mattermost v5.1 and later, the URL may contain a subpath, like in ``"https://example.com/company/mattermost"``.

If Site URL is not set, the following features will operate incorrectly:

 - email notifications will contain broken links, and email batching will not work
 - authentication via OAuth 2.0, including GitLab, Google and Office 365, will fail
 - plugins may not work as expected
 
Changes to this setting require a server restart before taking effect.

+----------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"SiteURL": ""`` with string input.                                                                     |
+----------------------------------------------------------------------------------------------------------------------------------------------------+

Listen Address
^^^^^^^^^^^^^^

The address and port to which to bind and listen. Specifying ":8065" will bind to all network interfaces. Specifying ``127.0.0.1:8065`` will only bind to the network interface having that IP address.

If you choose a port of a lower level (called "system ports" or "well-known ports", in the range of 0-1023), you must have permissions to bind to that port.

On Linux you can use: ``sudo setcap cap_net_bind_service=+ep ./bin/mattermost`` to allow Mattermost to bind to well-known ports.

Changes to this setting require a server restart before taking effect.

+-------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ListenAddress": ":8065"`` with string input. |
+-------------------------------------------------------------------------------------------+

Forward port 80 to 443
^^^^^^^^^^^^^^^^^^^^^^

**True**: Forwards all insecure traffic from port 80 to secure port 443.

**False**: When using a proxy such as NGINX in front of Mattermost this setting is unnecessary and should be set to ``false``.

Changes to this setting require a server restart before taking effect.

+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Forward80To443": false`` with options ``true`` and ``false``.                                                        |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Connection Security
^^^^^^^^^^^^^^^^^^^

**None**: Mattermost will connect over an unsecure connection.

**TLS**: Encrypts the communication between Mattermost clients and your server. See `documentation <https://docs.mattermost.com/install/config-tls-mattermost.html>`__ for more details.

Changes to this setting require a server restart before taking effect.

+---------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ConnectionSecurity": ""`` with options ``""`` and ``"TLS"``.                                   |
+---------------------------------------------------------------------------------------------------------------------------------------------+

TLS Certificate File
^^^^^^^^^^^^^^^^^^^^

The path to the certificate file to use for TLS connection security.

Changes to this setting require a server restart before taking effect.

+------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"TLSCertFile": ""`` with string input. |
+------------------------------------------------------------------------------------+

TLS Key File
^^^^^^^^^^^^^

The path to the TLS key file to use for TLS connection security.

Changes to this setting require a server restart before taking effect.

+-----------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"TLSKeyFile": ""`` with string input. |
+-----------------------------------------------------------------------------------+

Use Let's Encrypt
^^^^^^^^^^^^^^^^^

**True**: Enable the automatic retrieval of certificates from Let's Encrypt. The certificate will be retrieved when a client attempts to connect from a new domain. This will work with multiple domains. See :doc:`../install/config-tls-mattermost` for more details on setting up Let's Encrypt.

**False**: Manual certificate specification based on the **TLS Certificate File** and **TLS Key File** specified above.

Changes to this setting require a server restart before taking effect.

+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"UseLetsEncrypt": false`` with options ``true`` and ``false``.                                                        |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+

.. note::
   If Let's Encrypt is enabled, forward port 80 through a firewall, with `Forward80To443 <https://docs.mattermost.com/administration/config-settings.html#forward-port-80-to-443>`__ ``config.json`` setting set to ``true`` to complete the Let's Encrypt certification.

Let's Encrypt Certificate Cache File
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The path to the file where certificates and other data about the Let's Encrypt service will be stored.

Changes to this setting require a server restart before taking effect.

+-----------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"LetsEncryptCertificateCacheFile": "./config/letsencrypt.cache"`` with string input.  |
+-----------------------------------------------------------------------------------------------------------------------------------+

Read Timeout
^^^^^^^^^^^^

Maximum time allowed from when the connection is accepted to when the request body is fully read.

Changes to this setting require a server restart before taking effect.

+----------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ReadTimeout": 300`` with numerical input. |
+----------------------------------------------------------------------------------------+

Write Timeout
^^^^^^^^^^^^^

If using HTTP (insecure), this is the maximum time allowed from the end of reading the request headers until the response is written. If using HTTPS, it is the total time from when the connection is accepted until the response is written.

Changes to this setting require a server restart before taking effect.

+-----------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"WriteTimeout": 300`` with numerical input. |
+-----------------------------------------------------------------------------------------+

Allow use of API v3 endpoints
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

*Removed in June 16, 2018 release*

Set to false to disable all version 3 endpoints of the REST API. Integrations that rely on API v3 will fail and can then be identified for migration to API v4. API v3 is deprecated and will be removed in the near future. See https://api.mattermost.com for details.

+---------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableAPIv3": false`` with options ``true`` and ``false``. |
+---------------------------------------------------------------------------------------------------------+

Webserver Mode
^^^^^^^^^^^^^^

gzip compression applies to the HTML, CSS, Javascript, and other static content files that make up the Mattermost web client. It is recommended to enable gzip to improve performance unless your environment has specific restrictions, such as a web proxy that distributes gzip files poorly.

**gzip**: The Mattermost server will serve static files compressed with gzip to improve performance.

**Uncompressed**: The Mattermost server will serve static files uncompressed.

**Disabled**: The Mattermost server will not serve static files.

Changes to this setting require a server restart before taking effect.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"WebserverMode": "gzip"`` with options ``"gzip"``, ``"uncompressed"`` and ``"disabled"``.                                |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Reload Configuration from Disk
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

*Available in Enterprise Edition E20*

This button resets the configuration settings by reloading the settings from the disk. The server will still need to be restarted if a setting requiring server restart was changed.

The workflow for failover without downing the server is to change the database line in the ``config.json`` file, click **Reload Configuration from Disk** then click **Recycle Database Connections** in the **Advanced > Database** section.

Purge All Caches
^^^^^^^^^^^^^^^^^

This button purges all the in-memory caches for sessions, accounts and channels. Deployments using High Availability will attempt to purge all the servers in the cluster. Purging the caches may adversely impact performance.

________

Localization
~~~~~~~~~~~~

Default Server Language
^^^^^^^^^^^^^^^^^^^^^^^

Default language for system messages and logs.

Changes to this setting require a server restart before taking effect.

+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"DefaultServerLocale": "en"`` with options ``"de"``, ``"en"``, ``"es"``, ``"fr"``, ``"it"``, ``"ja"``, ``"ko"``, ``"nl"``, ``"pl"``, ``"pt-br"``, ``"ro"``, ``"ru"``, ``"tr"``, ``"zh_CN"``, and ``"zh_TW"``. |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Default Client Language
^^^^^^^^^^^^^^^^^^^^^^^

Default language for newly created users and pages where the user hasn't logged in.

+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"DefaultClientLocale": "en"`` with options ``"de"``, ``"en"``, ``"es"``, ``"fr"``, ``"it"``, ``"ja"``, ``"ko"``, ``"nl"``, ``"pl"``, ``"pt-br"``, ``"ro"``, ``"ru"``, ``"tr"``, ``"zh_CN"``, and ``"zh_TW"``. |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Available Languages
^^^^^^^^^^^^^^^^^^^^

Sets which languages are available for users in **Account Settings > Display > Languages**. Leave the field blank to add new languages automatically by default, or add new languages using the dropdown menu manually as they become available. If you're manually adding new languages, the **Default Client Language** must be added before saving the setting.

.. note::
  Servers which upgraded to v3.1 need to manually set this field blank to have new languages added by default.

+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AvailableLocales": ""`` with options ``""``, ``"de"``, ``"en"``, ``"es"``, ``"fr"``, ``"it"``, ``"ja"``, ``"ko"``, ``"nl"``, ``"pl"``, ``"pt-br"``, ``"ro"``, ``"ru"``, ``"tr"``, ``"zh_CN"``, and ``"zh_TW"``.  |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

________

Users and Teams
~~~~~~~~~~~~~~~

Enable Account Creation
^^^^^^^^^^^^^^^^^^^^^^^

**True**: Ability to create new accounts is enabled via inviting new members or sharing the team invite link.

**False**: Ability to create accounts is disabled. The **Create Account** button displays an error when trying to signup via an email invite or team invite link.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableUserCreation": true`` with options ``true`` and ``false``.                                                        |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable Account Deactivation
^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Ability for users to deactivate their own account from **Account Settings > Advanced**. If a user deactivates their own account, they will get an email notification confirming they were deactivated. 

**False**: Ability for users to deactivate their own account is disabled.  

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableUserDeactivation": false`` with options ``true`` and ``false``.                                                   |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable Team Creation
^^^^^^^^^^^^^^^^^^^^^

*This permission has been migrated to the database and changing the ``config.json`` value no longer takes effect after upgrading to v4.9, released on April 16th, 2018. This permission can be modified using the System Console user interface.*

**True**: Ability to create a new team is enabled for all users.

**False**: Only System Admins can create teams from the team selection page. The **Create A New Team** button is hidden in the main menu UI.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableTeamCreation": true`` with options ``true`` and ``false``.                                                        |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Max Users Per Team
^^^^^^^^^^^^^^^^^^

Maximum number of users per team, excluding inactive users.

The **Max Users Per Team** refers to the size of the "team site" which is workspace a "team of people" inhabits. A team of people is considered a small organization where people work closely together towards a specific shared goal and share the same etiquette. In the physical world, a team of people could typically be seated around a single table to have a meal and discuss their project.

The default maximum of 50 people, is at the extreme high end of a single team of people. At this point organizations are more often "multiple teams of people" and investments in explicitly defining etiquette, such as `channel organization <https://docs.mattermost.com/help/getting-started/organizing.html>`__ or turning on `policy features <https://docs.mattermost.com/administration/config-settings.html#policy>`__ in Enterprise Edition, are often used to scale the high levels of productivity found in a team of people using Mattermost to multiple teams of people.

In terms of technical performance, `with appropriate hardware, Mattermost can easily scale to hundreds and even thousands of users <https://docs.mattermost.com/install/requirements.html>`__, and provided the administrator believes the appropriate etiquette is in place, they should feel free to increase the default value.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"MaxUsersPerTeam": 50`` with numerical input.                                                                            |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Max Channels Per Team
^^^^^^^^^^^^^^^^^^^^^

Maximum number of channels per team, including both active and deleted channels.

+---------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"MaxChannelsPerTeam": 2000`` with numerical input.    |
+---------------------------------------------------------------------------------------------------+

Max Notifications Per Channel
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Maximum total number of users in a channel before @all, @here, and @channel no longer send notifications to maximize performance.

If you want to increase this value, the recommendation is to increase it a little at a time and monitor system health with `performance monitoring metrics <https://docs.mattermost.com/deployment/metrics.html>`__. We also recommend only increasing this value if large channels have restricted permissions for who can post to the channel (for instance, a read-only Town Square channel).

+--------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"MaxNotificationsPerChannel": 1000`` with numerical input. |
+--------------------------------------------------------------------------------------------------------+

Show @channel and @all confirmation dialog
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Users will be prompted to confirm when posting @channel and @all in channels with over five members.

**False**: No confirmation is required.

+--------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableConfirmNotificationsToChannel": true`` with options ``true`` and ``false``. |
+--------------------------------------------------------------------------------------------------------------------------------+

Restrict account creation to specified email domains
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Teams and user accounts can only be created by a verified email from this list of comma-separated domains (e.g. "corp.mattermost.com, mattermost.org").

This setting only affects email login.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"RestrictCreationToDomains": ""`` with string input.                                                                     |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Restrict Team Names
^^^^^^^^^^^^^^^^^^^

*Removed in November 16th, 2016 release*

**True**: Newly-created team names cannot contain the following restricted words: www, web, admin, support, notify, test, demo, mail, team, channel, internal, localhost, dockerhost, stag, post, cluster, api, oauth.

**False**: Newly-created team names are not restricted.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"RestrictTeamNames": true`` with options ``true`` and ``false``.                                                         |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable users to open Direct Message channels with
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**Any user on the Mattermost server**: The Direct Messages **More** menu has the option to open a Direct Message channel with any user on the server.

**Any member of the team**: The Direct Messages **More** menu only has the option to open a Direct Message channel with users on the current team, and CTRL/CMD+K channel switcher only lists users on the current team. If a user belongs to multiple teams, direct messages will still be received regardless of what team they are currently on.

This setting only affects the UI, not permissions on the server. For instance, a Direct Message channel can be created with anyone on the server regardless of this setting.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"RestrictDirectMessage": "any"`` with options ``"any"`` and ``"team"`` for the above settings, respectively.             |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Allow Team Administrators to edit others posts
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

*This permission is stored in the database and can be modified using the System Console user interface.*

**True**: Team Administrators and System Administrators can edit other users' posts.  

**False**: Only System Administrators can edit other users' posts.

.. note::
This setting is only available for Team Edition servers. Enterprise Edition servers can use `Advanced Permissions <https://docs.mattermost.com/deployment/advanced-permissions.html>`__ to configure this permission.   


Enable Team Directory
^^^^^^^^^^^^^^^^^^^^^

*Removed in May 16th, 2016 release*

**True**: Teams that are configured to appear in the team directory will appear on the system main page. Teams can configure this setting from **Team Settings > Include this team in the Team Directory**.

**False**: Team directory on the system main page is disabled.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableTeamListing": false`` with options ``true`` and ``false``.                                                        |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Teammate Name Display
^^^^^^^^^^^^^^^^^^^^^

Specifies how names are displayed in the user interface.

**Show username**: Displays the user's username.

**Show nickname if one exists**: Displays the user's nickname. If the user does not have a nickname, their full name is displayed. If the user does not have a full name, their username is displayed.

**Show first and last name**: Displays the user's full name. If the user does not have a full name, their username is displayed. Recommended when using SAML or LDAP if first name and last name attributes are configured.

+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"TeammateNameDisplay": "username"`` with options ``"username"``, ``"nickname_full_name"``, and ``"full_name"`` for the above settings, respectively. |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

________

Policy
~~~~~~

*Removed in June 16, 2018 release*

Permission policy settings are available in Enterprise Edition E10 and E20. In v5.0 and later, these settings are found in the `Advanced Permissions <https://docs.mattermost.com/deployment/advanced-permissions.html>`__ page instead of configuration settings. 

Enable sending team invites from
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

*Removed in June 16, 2018 release*

Set policy on who can invite others to a team using the **Send Email Invite**, **Get Team Invite Link**, and **Add Members to Team** options on the main menu. If **Get Team Invite Link** is used to share a link, you can expire the invite code from **Team Settings > Invite Code** after the desired users have joined the team. Options include:

**All team members**: Allows any team member to invite others using an email invitation, team invite link or by adding members to the team directly.

**Team and System Admins**: Hides the email invitation, team invite link, and the add members to team buttons in the Main Menu from users who are not Team Admins or System Admins.

**System Admins**: Hides the email invitation, team invite link, and add members to team buttons in the Main Menu from users who are not System Admins.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"RestrictTeamInvite": "all"`` with options ``"all"``, ``"team_admin"``, and ``"system_admin"`` for the above settings, respectively. |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable public channel creation for
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

*Removed in June 16, 2018 release*

Restrict the permission level required to create public channels.

**All team members**: Allow all team members to create public channels.

**Team Admins and System Admins**: Restrict creating public channels to Team Admins and System Admins.

**System Admins**: Restrict creating public channels to System Admins.

+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"RestrictPublicChannelCreation": "all"`` with options ``"all"``, ``"team_admin"``, and ``"system_admin"`` for the above settings, respectively. |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable public channel renaming for
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

*Removed in June 16, 2018 release*

Restrict the permission level required to rename and set the header or purpose for public channels.

**All channel members**: Allow all channel members to rename public channels.

**Channel Admins, Team Admins, and System Admins**: Restrict renaming public channels to Channel Admins, Team Admins, and System Admins who are members of the channel.

**Team Admins and System Admins**: Restrict renaming public channels to Team Admins and System Admins who are members of the channel.

**System Admins**: Restrict renaming public channels to System Admins who are members of the channel.

+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"RestrictPublicChannelManagement": "all"`` with options ``"all"``, ``"channel_admin"``, ``"team_admin"``, and ``"system_admin"`` for the above settings, respectively. |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable public channel deletion for
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

*Removed in June 16, 2018 release*

Restrict the permission level required to delete public channels. Deleted channels can be recovered from the database using a `command line tool <https://docs.mattermost.com/administration/command-line-tools.html>`__.

**All channel members**: Allow all channel members to delete public channels.

**Channel Admins, Team Admins, and System Admins**: Restrict deleting public channels to Channel Admins, Team Admins, and System Admins who are members of the channel.

**Team Admins and System Admins**: Restrict deleting public channels to Team Admins and System Admins who are members of the channel.

**System Admins**: Restrict deleting public channels to System Admins who are members of the channel.

+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"RestrictPublicChannelDeletion": "all"`` with options ``"all"``, ``"channel_admin"``, ``"team_admin"``, and ``"system_admin"`` for the above settings, respectively. |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable private channel creation for
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

*Removed in June 16, 2018 release*

Restrict the permission level required to create private channels.

**All team members**: Allow all team members to create private channels.

**Team Admins and System Admins**: Restrict creating private channels to Team Admins and System Admins.

**System Admins**: Restrict creating private channels to System Admins.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"RestrictPrivateChannelCreation": "all"`` with options ``"all"``, ``"team_admin"``, and ``"system_admin"`` for the above settings, respectively. |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable private channel renaming for
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

*Removed in June 16, 2018 release*

Restrict the permission level required to rename and set the header or purpose for private channels.

**All channel members**: Allow all channel members to rename private channels.

**Channel Admins, Team Admins, and System Admins**: Restrict renaming private channels to Channel Admins, Team Admins, and System Admins who are members of the private channel.

**Team Admins and System Admins**: Restrict renaming private channels to Team Admins and System Admins who are members of the private channel.

**System Admins**: Restrict renaming private channels to System Admins who are members of the private channel.

+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"RestrictPrivateChannelManagement": "all"`` with options ``"all"``, ``"channel_admin"``, ``"team_admin"``, and ``"system_admin"`` for the above settings, respectively. |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable managing of private channel members for
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

*Removed in June 16, 2018 release*

Set policy on who can add and remove members from private channels.

**All team members**: Allow all team members to add and remove members.

**Team Admins, Channel Admins, and System Admins**: Allow only Team Admins, Channel Admins, and System Admins to add and remove members.

**Team Admins, and System Admins**: Allow only Team Admins and System Admins to add and remove members.

**System Admins**: Allow only System Admins to add and remove members.

+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"RestrictPrivateChannelManageMembers": "all"`` with options ``"all"``, ``"channel_admin"``, ``"team_admin"``, and ``"system_admin"`` for the above settings, respectively. |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable private channel deletion for
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

*Removed in June 16, 2018 release*

Restrict the permission level required to delete private channels. Deleted channels can be recovered from the database using a `command line tool <https://docs.mattermost.com/administration/command-line-tools.html>`__.

**All channel members**: Allow all channel members to delete private channels.

**Channel Admins, Team Admins, and System Admins**: Restrict deleting private channels to Channel Admins, Team Admins, and System Admins who are members of the private channel.

**Team Admins and System Admins**: Restrict deleting private channels to Team Admins and System Admins who are members of the private channel.

**System Admins**: Restrict deleting private channels to System Admins who are members of the private channel.

+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"RestrictPrivateChannelDeletion": "all"`` with options ``"all"``, ``"channel_admin"``, ``"team_admin"``, and ``"system_admin"`` for the above settings, respectively. |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Allow which users to delete messages
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

*Removed in June 16, 2018 release*

Restrict the permission level required to delete messages. Team Admins, Channel Admins, and System Admins can delete messages only in channels where they are members. Messages can be deleted any time.

**Message authors can delete their own messages, and Administrators can delete any message**: Allow authors to delete their own messages, and allow Team Admins, Channel Admins, and System Admins to delete any message.

**Team Admins and System Admins**: Allow only Team Admins and System Admins to delete messages.

**System Admins**: Allow only System Admins to delete messages.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"RestrictPostDelete": "all"`` with options ``"all"``, ``"team_admin"``, and ``"system_admin"`` for the above settings, respectively. |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Allow users to edit their messages
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

*Removed in June 16, 2018 release*

Set the time limit that users have to edit their messages after posting.

**Any time**: Allow users to edit their messages at any time after posting.

**Never**: Do not allow users to edit their messages.

**{n} seconds after posting**: Users can edit their messages within the specified time limit after posting. The time limit is applied using the ``config.json`` setting ``"PostEditTimeLimit"`` described below.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AllowEditPost": "always"`` with options ``"always"``, ``"never"``, and ``"time_limit"`` for the above settings, respectively. |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Post edit time limit
^^^^^^^^^^^^^^^^^^^^

When post editing is permitted, setting this to ``-1`` allows editing anytime, and setting this to a positive integer restricts editing time in seconds. If post editing is disabled, this setting does not apply.

+--------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"PostEditTimeLimit": -1`` with numerical input.      |
+--------------------------------------------------------------------------------------------------+

Privacy
~~~~~~~

Settings to configure the name and email privacy of users on your system.

Show Email Address
^^^^^^^^^^^^^^^^^^^

**True**: Show email address of all users.

**False**: Hide email address of users from other users in the user interface, including Team Admins. This is designed for managing teams where users choose to keep their contact information private. System Admins will still be able to see email addresses in the UI.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ShowEmailAddress": true`` with options ``true`` and ``false``.                                                          |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Show Full Name
^^^^^^^^^^^^^^^

**True**: Show full name of all users.

**False**: Hide full name of users from other users including Team Admins. This is designed for managing teams where users choose to keep their contact information private. System Admins will still be able to see full names in the UI.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ShowFullName": true`` with options ``true`` and ``false``.                                                              |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

________

Compliance
~~~~~~~~~~~

*Available in Enterprise Edition E20*

Settings used to enable and configure Mattermost compliance reports.

Enable Compliance Reporting
^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Compliance reporting is enabled in Mattermost.

**False**: Compliance reporting is disabled.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Enable": false`` with options ``true`` and ``false``.                                                                   |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Compliance Report Directory
^^^^^^^^^^^^^^^^^^^^^^^^^^^

Sets the directory where compliance reports are written.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Directory": "./data/"`` with string input.                                                                              |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable Daily Report
^^^^^^^^^^^^^^^^^^^

**True**: Mattermost generates a daily compliance report.

**False**: Daily reports are not generated.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableDaily": false`` with options ``true`` and ``false``.                                                              |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

________

Logging
~~~~~~~~

Output logs to console
^^^^^^^^^^^^^^^^^^^^^^

.. note::
   Logs are rotated once the log file reaches a size of 100 MB or more.

**True**: Output log messages to the console based on **ConsoleLevel** option. The server writes messages to the standard output stream (stdout).

**False**: Output log messages are not written to the console.

Changes to this setting require a server restart before taking effect.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableConsole": true`` with options ``true`` and ``false``.                                                             |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Console Log Level
^^^^^^^^^^^^^^^^^

Level of detail at which log events are written to the console when **EnableConsole** = ``true``.

**DEBUG**: Prints high detail for developers debugging issues.

**ERROR**: Outputs only error messages.

**INFO**: Outputs error messages and information around startup and initialization.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ConsoleLevel": "DEBUG"`` with options ``"DEBUG"``, ``"ERROR"``, and ``"INFO"``.                                         |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Output logs to file
^^^^^^^^^^^^^^^^^^^^

Typically set to ``true`` in production. When ``true``, logged events are written to the ``mattermost.log`` file in the directory specified by the **FileLocation** setting. The logs are archived to a file in the same directory, and given a name with a datestamp and serial number. For example, ``mattermost.2017-03-31.001``.

**True**: Log files are written to files specified in **FileLocation**.

**False**: Log files are not written.

Changes to this setting require a server restart before taking effect.

+----------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableFile": true`` with options ``true`` and ``false``.                                  |
+----------------------------------------------------------------------------------------------------------------------------------------+

Output console logs as JSON
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Typically set to ``true`` in production. When ``true``, logged events are written in a machine readable JSON format. Otherwise they are printed as plain text.

**True**: Logged events are written in a machine readable JSON format.

**False**: Logged events are written in plain text.

Changes to this setting require a server restart before taking effect.

+----------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ConsoleJson": true`` with options ``true`` and ``false``.                                 |
+----------------------------------------------------------------------------------------------------------------------------------------+

File Log Level
^^^^^^^^^^^^^^^

Level of detail at which log events are written to log files when **EnableFile** = ``true``.

**ERROR**: Outputs only error messages.

**INFO**: Outputs error messages and information around startup and initialization.

**DEBUG**: Prints high detail for developers debugging issues.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"FileLevel": "INFO"`` with options ``"DEBUG"``, ``"ERROR"``, and ``"INFO"``.                                             |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

File Log Directory
^^^^^^^^^^^^^^^^^^^

The location of the log files. If blank, they are stored in the ``./logs`` directory. The path that you set must exist and Mattermost must have write permissions in it.

Changes to this setting require a server restart before taking effect.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"FileLocation": ""`` with string input.                                                                                  |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Output file logs as JSON
^^^^^^^^^^^^^^^^^^^^^^^^^

Typically set to ``true`` in production. When ``true``, logged events are written in a machine readable JSON format. Otherwise they are printed as plain text.

**True**: Logged events are written in a machine readable JSON format.

**False**: Logged events are written in plain text.

Changes to this setting require a server restart before taking effect.

+----------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"FileJson": true`` with options ``true`` and ``false``.                                    |
+----------------------------------------------------------------------------------------------------------------------------------------+

Enable Webhook Debugging
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Contents of incoming webhooks are printed to log files for debugging.

**False**: Contents of incoming webhooks are not printed to log files.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableWebhookDebugging": true`` with options ``true`` and ``false``.                                                    |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable Diagnostics and Error Reporting
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: To improve the quality and performance of future Mattermost updates, this option sends error reporting and diagnostic information to Mattermost, Inc. All diagnostics and error reporting is encrypted in transit and does not include personally identifiable information or message contents. To learn more about this feature, see :doc:`telemetry`.

**False**: Diagnostics and error reporting are disabled.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableDiagnostics": true`` with options ``true`` and ``false``.                                                         |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

________

Advanced Permissions
--------------------

*Available in Enterprise Edition E10 and higher*

Advanced permissions offers Admins a way to restrict actions in Mattermost to authorized users only. See `permissions documentation <https://docs.mattermost.com/deployment/advanced-permissions.html>`__ for more details.

________

Authentication
--------------

Authentication settings to enable account creation and sign in with email, GitLab, Google or Office 365 OAuth, AD/LDAP, or SAML.

Email Authentication
~~~~~~~~~~~~~~~~~~~~~

Enable account creation with email
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Allow team creation and account signup using email and password.

**False**: Email signup is disabled. This limits signup to single sign-on services like OAuth or AD/LDAP.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableSignUpWithEmail": true`` with options ``true`` and ``false``.                                                     |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable sign-in with email
^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Mattermost allows account creation using email and password.

**False**: Sign in with email is disabled and does not appear on the login screen. Use this value when you want to limit sign up to a single sign-on service like AD/LDAP, SAML, or GitLab.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableSignInWithEmail": true`` with options ``true`` and ``false``.                                                     |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable sign-in with username
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Mattermost allows users with email login to sign in using their username and password. This setting does not affect AD/LDAP login.

**False**: Sign in with username is disabled and does not appear on the login screen.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``EnableSignInWithUsername": true`` with options ``true`` and ``false``.                                                   |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

________

OAuth 2.0
~~~~~~~~~~

Settings to configure OAuth login for account creation and login.

Select OAuth 2.0 service provider
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Choose whether OAuth can be used for account creation and login. Options include:

    - **Do not allow sign-in via an OAuth 2.0 provider**
    - **GitLab** (see `GitLab Settings <https://docs.mattermost.com/administration/config-settings.html#id14>`__ for more detail)
    - **Google Apps** (available in Enterprise Edition E20, see `Google Settings <https://docs.mattermost.com/administration/config-settings.html#google-enterprise>`__ for more detail)
    - **Office 365 (Beta)** (available in Enterprise Edition E20, see `Office 365 Settings <https://docs.mattermost.com/administration/config-settings.html#office-365-enterprise>`__ for more detail)

This feature's setting does not appear in ``config.json``.

________

GitLab
~~~~~~~

Enable authentication with GitLab
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Allow team creation and account signup using GitLab OAuth. To configure, input the **Secret** and **Id** credentials.

**False**: GitLab OAuth cannot be used for team creation or account signup.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Enable": false`` with options ``true`` and ``false``.                                                                   |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

**Note**: For Enterprise, GitLab settigs can be found under **OAuth 2.0**.

Application ID
^^^^^^^^^^^^^^^

Obtain this value by logging into your GitLab account. Go to **Profile Settings > Applications > New Application**, enter a **Name**, then enter **Redirect URLs** ``https://<your-mattermost-url>/login/gitlab/complete`` (example: ``https://example.com:8065/login/gitlab/complete`` and ``https://<your-mattermost-url>/signup/gitlab/complete``.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Id": ""`` with string input.                                                                                            |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Application Secret Key
^^^^^^^^^^^^^^^^^^^^^^

Obtain this value by logging into your GitLab account. Go to **Profile Settings > Applications > New Application**, enter a **Name**, then enter **Redirect URLs** ``https://<your-mattermost-url>/login/gitlab/complete`` (example: ``https://example.com:8065/login/gitlab/complete`` and ``https://<your-mattermost-url>/signup/gitlab/complete``.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Secret": ""`` with string input.                                                                                        |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

User API Endpoint
^^^^^^^^^^^^^^^^^^

Enter ``https://<your-gitlab-url>/api/v3/user`` (example: ``https://example.com:3000/api/v3/user``). Use HTTP or HTTPS depending on how your server is configured.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"UserApiEndpoint": ""`` with string input.                                                                               |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Auth Endpoint
^^^^^^^^^^^^^

Enter ``https://<your-gitlab-url>/oauth/authorize`` (example: ``https://example.com:3000/oauth/authorize``). Use HTTP or HTTPS depending on how your server is configured.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AuthEndpoint": ""`` with string input.                                                                                  |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Token Endpoint
^^^^^^^^^^^^^^

Enter ``https://<your-gitlab-url>/oauth/token`` (example: ``https://example.com:3000/oauth/token``). Use HTTP or HTTPS depending on how your server is configured.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"TokenEndpoint": ""`` with string input.                                                                                 |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

________

Google
~~~~~~

*Available in Enterprise Edition E20*

Enable authentication with Google by selecting ``Google Apps`` from **OAuth 2.0 > Select OAuth 2.0 service provider**

**True**: Allow team creation and account signup using Google OAuth. To configure, input the **Client ID** and **Client Secret** credentials. See `the documentation <https://docs.mattermost.com/deployment/sso-google.html>`__ for more detail.

**False**: Google OAuth cannot be used for team creation or account signup.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Enable": false`` with options ``true`` and ``false``.                                                                   |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Client ID
^^^^^^^^^

Obtain this value by registering Mattermost as an application in your Google account.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Id": ""`` with string input.                                                                                            |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Client Secret
^^^^^^^^^^^^^

Obtain this value by registering Mattermost as an application in your Google account.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Secret": ""`` with string input.                                                                                        |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

User API Endpoint
^^^^^^^^^^^^^^^^

It is recommended to use ``"https://www.googleapis.com/plus/v1/people/me"`` as the User API Endpoint. Otherwise, enter a custom endpoint in ``config.json`` with HTTP or HTTPS depending on how your server is configured.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"UserApiEndpoint": "https://www.googleapis.com/plus/v1/people/me"`` with string input.                                   |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Auth Endpoint
^^^^^^^^^^^^^

It is recommended to use ``"https://accounts.google.com/o/oauth2/v2/auth"`` as the Auth Endpoint. Otherwise, enter a custom endpoint in ``config.json`` with HTTP or HTTPS depending on how your server is configured.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AuthEndpoint": "https://accounts.google.com/o/oauth2/v2/auth"`` with string input.                                      |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Token Endpoint
^^^^^^^^^^^^^^

It is recommended to use ``"https://www.googleapis.com/oauth2/v4/token"`` as the Token Endpoint. Otherwise, enter a custom endpoint in ``config.json`` with HTTP or HTTPS depending on how your server is configured.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"TokenEndpoint": "https://www.googleapis.com/oauth2/v4/token"`` with string input.                                       |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

________

Office 365
~~~~~~~~~~

*Available in Enterprise Edition E20*

.. note::
   In line with Microsoft ADFS guidance we recommend `configuring intranet forms-based authentication for devices that do not support WIA <https://docs.microsoft.com/en-us/windows-server/identity/ad-fs/operations/configure-intranet-forms-based-authentication-for-devices-that-do-not-support-wia>`_. 

Enable authentication with Office 365 by selecting ``Office 365 (Beta)`` from **OAuth 2.0 > Select OAuth 2.0 service provider**.

**True**: Allow team creation and account signup using Office 365 OAuth. To configure, input the **Application ID** and **Application Secret Password** credentials. See `the documentation <https://docs.mattermost.com/deployment/sso-office.html>`__ for more detail.

**False**: Office 365 OAuth cannot be used for team creation or account signup.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Enable": false`` with options ``true`` and ``false``.                                                                   |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Application ID
^^^^^^^^^^^^^^

Obtain this value by registering Mattermost as an application in your Microsoft or Office account.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Id": ""`` with string input.                                                                                            |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Application Secret Password
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Obtain this value by registering Mattermost as an application in your Microsoft or Office account.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Secret": ""`` with string input.                                                                                        |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

User API Endpoint
^^^^^^^^^^^^^^^^^

It is recommended to use ``"https://graph.microsoft.com/v1.0/me"`` as the User API Endpoint. Otherwise, enter a custom endpoint in ``config.json`` with HTTP or HTTPS depending on how your server is configured.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"UserApiEndpoint": "https://graph.microsoft.com/v1.0/me"`` with string input.                                            |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Auth Endpoint
^^^^^^^^^^^^^

It is recommended to use ``"https://accounts.google.com/o/oauth2/v2/auth"`` as the Auth Endpoint. Otherwise, enter a custom endpoint in ``config.json`` with HTTP or HTTPS depending on how your server is configured.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AuthEndpoint": "https://login.microsoftonline.com/common/oauth2/v2.0/authorize"`` with string input.                    |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Token Endpoint
^^^^^^^^^^^^^^

It is recommended to use ``"https://login.microsoftonline.com/common/oauth2/v2.0/token"`` as the Token Endpoint. Otherwise, enter a custom endpoint in ``config.json`` with HTTP or HTTPS depending on how your server is configured.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"TokenEndpoint": "https://login.microsoftonline.com/common/oauth2/v2.0/token"`` with string input.                       |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

________

AD/LDAP
~~~~~~~

*Available in Enterprise Edition E10 and higher*

Enable sign-in with AD/LDAP
^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Mattermost allows login using AD/LDAP or Active Directory.

**False**: Login with AD/LDAP is disabled.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Enable": false`` with options ``true`` and ``false``.                                                                   |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable Synchronization with AD/LDAP
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Mattermost periodically synchronizes users from AD/LDAP.

**False**: AD/LDAP synchronization is disabled.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableSync": false`` with options ``true`` and ``false``.                                                               |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

AD/LDAP Server
^^^^^^^^^^^^^^

The domain or IP address of the AD/LDAP server.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"LdapServer": ""`` with string input.                                                                                    |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

AD/LDAP Port
^^^^^^^^^^^^

The port Mattermost will use to connect to the AD/LDAP server. Defaults to ``389``.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"LdapPort": 389`` with numerical input.                                                                                  |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Connection Security
^^^^^^^^^^^^^^^^^^^^

The type of connection security Mattermost uses to connect to AD/LDAP.

**None**: No encryption, Mattermost will not attempt to establish an encrypted connection to the AD/LDAP server.

**TLS**: Encrypts the communication between Mattermost and your server using TLS.

**STARTTLS**: Takes an existing insecure connection and attempts to upgrade it to a secure connection using TLS.

If the "No encryption" option is selected it is highly recommended that the AD/LDAP connection is secured outside of Mattermost, for example, by adding a stunnel proxy.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ConnectionSecurity": ""`` with options ``""``, ``"TLS"``, and ``"STARTTLS"``.                                           |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Skip Certificate Verification
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

(Optional) The attribute in the AD/LDAP server that will be used to populate the nickname of users in Mattermost.

**True**: Skips the certificate verification step for TLS or STARTTLS connections. Not recommended for production environments where TLS is required. For testing only.

**False**: Mattermost does not skip certificate verification.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"SkipCertificateVerification": false`` with options ``true`` and ``false``.                                              |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Base DN
^^^^^^^

The **Base Distinguished Name** of the location where Mattermost should start its search for users in the AD/LDAP tree.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"BaseDN": ""`` with string input.                                                                                        |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Bind Username
^^^^^^^^^^^^^^

The username used to perform the AD/LDAP search. This should be an account created specifically for use with Mattermost. Its permissions should be limited to read-only access to the portion of the AD/LDAP tree specified in the **Base DN** field. When using Active Directory, **Bind Username** should specify domain in ``"DOMAIN/username"`` format. This field is required, and anonymous bind is not currently supported.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"BindUsername": ""`` with string input.                                                                                  |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Bind Password
^^^^^^^^^^^^^^

Password of the user given in **Bind Username**. Anonymous bind is not currently supported.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"BindPassword": ""`` with string input.                                                                                  |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

User Filter
^^^^^^^^^^^^

(Optional) Enter an AD/LDAP Filter to use when searching for user objects (accepts `general syntax <https://www.ldapexplorer.com/en/manual/109010000-ldap-filter-syntax.htm>`__). Only the users selected by the query will be able to access Mattermost. 

Sample filters for Active Directory:

- To filter out disabled users: ``(&(objectCategory=Person)(!(UserAccountControl:1.2.840.113556.1.4.803:=2)))``.
- To filter out by group membership, determine the distinguishedName of your group, then use the group membership general syntax format as your filter.

  * For example, if the security group distinguishedName is ``CN=group1,OU=groups,DC=example,DC=com``, then the user filter to use is: ``(memberOf=CN=group1,OU=groups,DC=example,DC=com)``. Note that the user must explicitly belong to this group for the filter to apply.

This filter uses the permissions of the **Bind Username** account to execute the search. Administrators should make sure to use a specially created account for Bind Username with read-only access to the portion of the AD/LDAP tree specified in the **Base DN** field.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"UserFilter": ""`` with string input.                                                                                    |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Group Filter
^^^^^^^^^^^^^

(Optional) Enter an AD/LDAP Filter to use when searching for group objects (accepts `general syntax <https://www.ldapexplorer.com/en/manual/109010000-ldap-filter-syntax.htm>`__). Only the groups selected by the query will be able accessible to Mattermost. 

This filter is defaulted to ``(|(objectClass=group)(objectClass=groupOfNames)(objectClass=groupOfUniqueNames))`` when blank.

.. note::
  This filter is used only when AD/LDAP Group Sync is enabled. See `AD/LDAP Group Sync documentation <https://docs.mattermost.com/deployment/ldap-group-sync.html>`_ for more information on enabling and configuring AD/LDAP Group Sync (*Available in Enterprise Edition E20*).

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"GroupFilter": ""`` with string input.                                                                                   |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Group Display Name Attribute
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

(Required) Enter an AD/LDAP Group Display name attribute used to populate Mattermost Group names. 

.. note::
  This attribute is used only when AD/LDAP Group Sync is enabled. See `AD/LDAP Group Sync documentation <https://docs.mattermost.com/deployment/ldap-group-sync.html>`_ for more information on enabling and configuring AD/LDAP Group Sync (*Available in Enterprise Edition E20*).

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"GroupDisplayNameAttribute": ""`` with string input.                                                                     |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Group Id Attribute
^^^^^^^^^^^^^^^^^^^

(Required) Enter an AD/LDAP Group ID attribute to use as a unique identifier for Groups. This should be an AD/LDAP value that does not change.

.. note::
  This attribute is used only when AD/LDAP Group Sync is enabled. See `AD/LDAP Group Sync documentation <https://docs.mattermost.com/deployment/ldap-group-sync.html>`_ for more information on enabling and configuring AD/LDAP Group Sync (*Available in Enterprise Edition E20*).

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"GroupIdAttribute": ""`` with string input.                                                                              |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

First Name Attribute
^^^^^^^^^^^^^^^^^^^^^

(Optional) The attribute in the AD/LDAP server used to populate the first name of users in Mattermost. When set, users cannot edit their first name, since it is synchronized with the LDAP server. When left blank, users can set their first name in Account Settings.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"FirstNameAttribute": ""`` with string input.                                                                            |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Last Name Attribute
^^^^^^^^^^^^^^^^^^^^

(Optional) The attribute in the AD/LDAP server used to populate the last name of users in Mattermost. When set, users cannot edit their last name, since it is synchronized with the LDAP server. When left blank, users can set their last name in Account Settings.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"LastNameAttribute": ""`` with string input.                                                                             |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Nickname Attribute
^^^^^^^^^^^^^^^^^^^^^

(Optional) The attribute in the AD/LDAP server used to populate the nickname of users in Mattermost. When set, users cannot edit their nickname, since it is synchronized with the LDAP server. When left blank, users can set their nickname in Account Settings.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"NicknameAttribute": ""`` with string input.                                                                             |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Position Attribute
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
(Optional) The attribute in the AD/LDAP server used to populate the position field in Mattermost. When set, users cannot edit their position, since it is synchronized with the LDAP server. When left blank, users can set their position in Account Settings.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"PositionAttribute": ""`` with string input.                                                                             |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Email Attribute
^^^^^^^^^^^^^^^^^

The attribute in the AD/LDAP server used to populate the email address field in Mattermost.

Email notifications will be sent to this email address, and this email address may be viewable by other Mattermost users depending on privacy settings chosen by the System Admin.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EmailAttribute": ""`` with string input.                                                                                |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Username Attribute
^^^^^^^^^^^^^^^^^^^^

The attribute in the AD/LDAP server used to populate the username field in Mattermost. This may be the same as the Login ID Attribute.

This attribute will be used within the Mattermost user interface to identify and mention users. For example, if a Username Attribute is set to **john.smith** a user typing ``@john`` will see ``@john.smith`` in their auto-complete options and posting a message with ``@john.smith`` will send a notification to that user that they've been mentioned.

The **Username Attribute** may be set to the same value used to sign-in to the system, called a **Login ID Attribute**, or it can be mapped to a different value.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"UsernameAttribute": ""`` with string input.                                                                             |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

ID Attribute
^^^^^^^^^^^^^

The attribute in the AD/LDAP server used as a unique identifier in Mattermost. It should be an AD/LDAP attribute with a value that does not change.

If a user's ID Attribute changes, it will create a new Mattermost account unassociated with their old one.

If you need to change this field after users have already logged in, use the `mattermost ldap idmigrate <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-ldap-idmigrate>`__ CLI tool.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"IdAttribute": ""`` with string input.                                                                                   |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Login ID Attribute
^^^^^^^^^^^^^^^^^^^

The attribute in the AD/LDAP server used to log in to Mattermost. Normally this attribute is the same as the "Username Attribute" field above.

If your team typically uses domain\username to log in to other services with AD/LDAP, you may enter domain\username in this field to maintain consistency between sites.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"LoginIdAttribute": ""`` with string input.                                                                              |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Login Field Name
~~~~~~~~~~~~~~~~~

The placeholder text that appears in the login field on the login page. Typically this would be whatever name is used to refer to AD/LDAP credentials in your company, so it is recognizable to your users. Defaults to **AD/LDAP Username**.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"LoginFieldName": ""`` with string input.                                                                                |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Synchronization Interval (minutes)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Set how often Mattermost accounts synchronize attributes with AD/LDAP, in minutes. When synchronizing, Mattermost queries AD/LDAP for relevant account information and updates Mattermost accounts based on changes to attributes (first name, last name, and nickname). When accounts are disabled in AD/LDAP users are made inactive in Mattermost, and their active sessions are revoked once Mattermost synchronizes attributes. To synchronize immediately after disabling an account, use the **AD/LDAP Synchronize Now** button.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"SyncIntervalMinutes": 60`` with numerical input.                                                                        |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Maximum Page Size
^^^^^^^^^^^^^^^^^^^

The maximum number of users the Mattermost server will request from the AD/LDAP server at one time. Use this setting if your AD/LDAP server limits the number of users that can be requested at once. 0 is unlimited.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"MaxPageSize": 0`` with numerical input.                                                                                 |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Query Timeout (seconds)
^^^^^^^^^^^^^^^^^^^^^^^

The timeout value for queries to the AD/LDAP server. Increase this value if you are getting timeout errors caused by a slow AD/LDAP server.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"QueryTimeout": 60`` with numerical input.                                                                               |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

AD/LDAP Test
^^^^^^^^^^^^^^

This button can be used to test the connection to the AD/LDAP server. If the test is successful, it shows a confirmation message and if there is a problem with the configuration settings it will show an error message.

AD/LDAP Synchronize Now
^^^^^^^^^^^^^^^^^^^^^^^^

This button causes AD/LDAP synchronization to occur as soon as it is pressed. Use it whenever you have made a change in the AD/LDAP server you want to take effect immediately. After using the button, the next AD/LDAP synchronization will occur after the time specified by the Synchronization Interval.

You can monitor the status of the synchronization job in the table below this button.

.. note::
  If synchronization **Status** displays as ``Pending`` and does not complete, make sure that the **Enable Synchronization with AD/LDAP** setting is set to ``true``.

.. figure:: ../images/ldap-sync-table.png

________

.. _saml-enterprise:

SAML
~~~~

*Available in Enterprise Edition E20*

.. note::
   In line with Microsoft ADFS guidance we recommend `configuring intranet forms-based authentication for devices that do not support WIA <https://docs.microsoft.com/en-us/windows-server/identity/ad-fs/operations/configure-intranet-forms-based-authentication-for-devices-that-do-not-support-wia>`_. 

Enable Login With SAML
^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Mattermost allows login using SAML. Please see `documentation <https://docs.mattermost.com/deployment/sso-saml.html>`__ to learn more about configuring SAML for Mattermost.

**False**: Login with SAML is disabled.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Enable": false`` with options ``true`` and ``false``.                                                                   |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable Synchronizing SAML Accounts With AD/LDAP
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Mattermost periodically synchronizes SAML user attributes, including user deactivation and removal, with AD/LDAP. Enable and configure synchronization settings at **Authentication > AD/LDAP**. See `documentation <https://docs.mattermost.com/onboard/ad-ldap.html>`__ to learn more.

**False**: Synchronization of SAML accounts with AD/LDAP is disabled.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableSyncWithLdap": false`` with options ``true`` and ``false``.                                                       |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Override SAML Bind Data with AD/LDAP Information
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Mattermost overrides the SAML ID attribute with the AD/LDAP ID attribute if configured or overrides the SAML Email attribute with the AD/LDAP Email attribute if SAML ID attribute is not present. See `documentation <https://docs.mattermost.com/onboard/ad-ldap.html>`__ to learn more.

**False**: Mattermost uses the email attribute to bind users to SAML. 

.. note::
  Moving from ``true`` to ``false`` will prevent the override from happening. To prevent the disabling of user accounts, SAML IDs must match the LDAP IDs when this feature is enabled. This setting should be set to ``false`` unless LDAP sync is enabled.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableSyncWithLdapIncludeAuth": false`` with options ``true`` and ``false``.                                            |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

SAML SSO URL
^^^^^^^^^^^^^

The URL where Mattermost sends a SAML request to start login sequence.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"IdpURL": ""`` with string input.                                                                                        |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Identity Provider Issuer URL
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The issuer URL for the Identity Provider you use for SAML requests.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"IdpDescriptorUrl": ""`` with string input.                                                                              |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Identity Provider Public Certificate
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The public authentication certificate issued by your Identity Provider.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"IdpCertificateFile": ""`` with string input.                                                                            |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Verify Signature
^^^^^^^^^^^^^^^^^

**True**: Mattermost verifies that the signature sent from the SAML Response matches the Service Provider Login URL.

**False**: Not recommended for production environments. For testing only.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Verify": true`` with options ``true`` and ``false``.                                                                    |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Service Provider Login URL
^^^^^^^^^^^^^^^^^^^^^^^^^^^

Enter ``https://<your-mattermost-url>/login/sso/saml`` (example: ``https://example.com/login/sso/saml``). Make sure you use HTTP or HTTPS in your URL depending on your server configuration. This field is also known as the Assertion Consumer Service URL.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AssertionConsumerServiceURL": ""`` with string input.                                                                   |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable Encryption
^^^^^^^^^^^^^^^^^^^

**True**: Mattermost will decrypt SAML Assertions encrypted with your Service Provider Public Certificate.

**False**: Not recommended for production environments. For testing only.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Encrypt": true`` with options ``true`` and ``false``.                                                                   |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Service Provider Private Key
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The private key used to decrypt SAML Assertions from the Identity Provider.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"PrivateKeyFile": ""`` with string input.                                                                                |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Service Provider Public Certificate
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The certificate file used to generate the signature on a SAML request to the Identity Provider for a service provider initiated SAML login, when Mattermost is the Service Provider.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"PublicCertificateFile": ""`` with string input.                                                                         |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Email Attribute
^^^^^^^^^^^^^^^^

The attribute in the SAML Assertion that will be used to populate the email addresses of users in Mattermost.

Email notifications will be sent to this email address, and this email address may be viewable by other Mattermost users depending on privacy settings chosen by the System Admin.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EmailAttribute": ""`` with string input.                                                                                |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Username Attribute
^^^^^^^^^^^^^^^^^^^

The attribute in the SAML Assertion that will be used to populate the username field in Mattermost user interface. This attribute will be used within the Mattermost user interface to identify and mention users. For example, if a Username Attribute is set to **john.smith** a user typing ``@john`` will see ``@john.smith`` in their auto-complete options and posting a message with ``@john.smith`` will send a notification to that user that they've been mentioned.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"UsernameAttribute": ""`` with string input.                                                                             |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Id Attribute
^^^^^^^^^^^^^

(Optional) The attribute in the SAML Assertion used to bind users from SAML to users in Mattermost.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"IdAttribute": ""`` with string input.                                                                                   |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

First Name Attribute
^^^^^^^^^^^^^^^^^^^^^

(Optional) The attribute in the SAML Assertion that will be used to populate the first name of users in Mattermost.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"FirstNameAttribute": ""`` with string input.                                                                            |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Last Name Attribute
^^^^^^^^^^^^^^^^^^^

(Optional) The attribute in the SAML Assertion that will be used to populate the last name of users in Mattermost.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"LastNameAttribute": ""`` with string input.                                                                             |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Nickname Attribute
^^^^^^^^^^^^^^^^^^^

(Optional) The attribute in the SAML Assertion that will be used to populate the nickname of users in Mattermost.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"NicknameAttribute": ""`` with string input.                                                                             |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Position Attribute
^^^^^^^^^^^^^^^^^^^

(Optional) The attribute in the SAML Assertion that will be used to populate the position field for users in Mattermost (typically used to describe a person's job title or role at the company).

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"PositionAttribute": ""`` with string input.                                                                             |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Preferred Language Attribute
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

(Optional) The attribute in the SAML Assertion that will be used to populate the language of users in Mattermost.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"LocaleAttribute": ""`` with string input.                                                                               |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Login Button Text
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
(Optional) The text that appears in the login button on the login page. Defaults to ``SAML``.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"LoginButtonText": ""`` with string input.                                                                               |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Scoping IDP Provider Id
^^^^^^^^^^^^^^^^^^^^^^^^

Allows an authenticated user to skip the initial login page of their federated Azure AD server, and only require a password to log in.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ScopingIDPProviderId": ""`` with string input.                                                                          |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Scoping IDP Name
^^^^^^^^^^^^^^^^

Adds the name associated with a user's Scoping Identity Provider ID.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ScopingIDPName": ""`` with string input.                                                                                |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

________

MFA
~~~~

Configure security settings for multi-factor authentication.

The default recommendation for secure deployment is to host Mattermost within your own private network, with VPN clients on mobile, so everything works under your existing security policies and authentication protocols, which may already include multi-factor authentication.

If you choose to run Mattermost outside your private network, bypassing your existing security protocols, it is recommended you set up a multi-factor authentication service specifically for accessing Mattermost.

Enable Multi-factor Authentication
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: When ``true``, users with LDAP and email authentication will be given the option to require a phone-based passcode, in addition to their password-based authentication, to sign in to the Mattermost server. Specifically, they will be asked to download the `Google Authenticator <https://en.wikipedia.org/wiki/Google_Authenticator>`__ app to their iOS or Android mobile device, connect the app with their account, and then enter a passcode generated by the app on their phone whenever they log in to the Mattermost server.

**False**: Multi-factor authentication is disabled.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableMultifactorAuthentication": false`` with options ``true`` and ``false``.                                          |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enforce Multi-factor Authentication
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

*Available in Enterprise Edition E10 and higher*

**True**: When ``true``, `multi-factor authentication (MFA) <https://docs.mattermost.com/deployment/auth.html>`__ is required for login. New users will be required to configure MFA on sign-up. Logged in users without MFA configured are redirected to the MFA setup page until configuration is complete. If your system has users with login options other than AD/LDAP and email, MFA must be enforced with the authentication provider outside of Mattermost.

**False**: Multi-factor authentication is optional.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnforceMultifactorAuthentication": false`` with options ``true`` and ``false``.                                         |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

________


Security
--------

Configure security settings for account creation, login, public links, and connection requests.

Sign Up
~~~~~~~~

Require Email Verification
^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Require email verification after account creation prior to allowing login.

**False**: Users do not need to verify their email address prior to login. Developers may set this field to false so skip sending verification emails for faster development.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"RequireEmailVerification": false`` with options ``true`` and ``false``.                                                 |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable Open Server
^^^^^^^^^^^^^^^^^^^

**True**: Users can sign up to the server from the root page without an invite.

**False**: Users can only sign up to the server if they receive an invite.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableOpenServer": false`` with options ``true`` and ``false``.                                                         |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable Email Invitations
^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Users can invite others to the Mattermost system by email.

**False**: Email invitations are disabled.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableEmailInvitations": false`` with options ``true`` and ``false``.                                                   |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

________

Password
~~~~~~~~~

Minimum Password Length
^^^^^^^^^^^^^^^^^^^^^^^^

*This feature was moved to Team Edition in Mattermost v5.0, released June 16th, 2018. In previous versions, this feature is available in Enterprise Edition E10 and higher.*

Minimum number of characters required for a valid password. Must be a whole number greater than or equal to 5 and less than or equal to 64.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"MinimumLength": 5`` with numerical input.                                                                               |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Password Requirements
^^^^^^^^^^^^^^^^^^^^^^

*This feature was moved to Team Edition in Mattermost v5.0, released June 16th, 2018. In previous versions, this feature is available in Enterprise Edition E10 and higher.*

Set the required character types to be included in a valid password. Defaults to allow any characters unless otherwise specified by the checkboxes. The error messasage previewed in the System Console will appear on the account creation page if a user enters an invalid password.

- **At least one lowercase letter**: Select this checkbox if a valid password must contain at least one lowercase letter.
- **At least one uppercase letter**: Select this checkbox if a valid password must contain at least one uppercase letter.
- **At least one number**: Select this checkbox if a valid password must contain at least one number.
- **At least one symbol**: Select this checkbox if a valid password must contain at least one symbol. Valid symbols include: ``!"#$%&'()*+,-./:;<=>?@[]^_`|~``.

This feature's ``config.json`` settings are, respectively:

.. list-table::
    :widths: 80

    * - ``"Lowercase": false`` with options ``true`` and ``false``.
    * - ``"Number": false`` with options ``true`` and ``false``.
    * - ``"Uppercase": false`` with options ``true`` and ``false``.
    * - ``"Symbol": false`` with options ``true`` and ``false``.

Maximum Login Attempts
^^^^^^^^^^^^^^^^^^^^^^

Failed login attempts allowed before a user is locked out and required to reset their password via email.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"MaximumLoginAttempts": 10`` with numerical input.                                                                       |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

________

Public Links
~~~~~~~~~~~~

Enable Public File Links
^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Allow users to generate public links to files and images for sharing outside the Mattermost system with a public URL.

**False**: The **Get Public Link** option is hidden from the image preview user interface.

.. note::
 When switched to **False**, anyone who tries to visit a previously generated public link will receive an error message saying public links have been disabled. When switched back to **True**, old public links will work again unless the **Public Link Salt** has been regenerated.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnablePublicLink": true`` with options ``true`` and ``false``.                                                          |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Public Link Salt
^^^^^^^^^^^^^^^^

A 32-character salt added to the URL of public links when public links are enabled. Click **Regenerate** in the System Console to create a new salt, which will invalidate all existing public links.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"PublicLinkSalt": ""`` with string input.                                                                                |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

_________

Sessions
~~~~~~~~

User sessions are cleared when a user tries to log in. Additionally, a job runs every 24 hours to clear sessions from the sessions database table. 

Session length for email and AD/LDAP authentication (days)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Set the number of days from the last time a user entered their credentials to the expiry of the user's session on email and AD/LDAP authentication.

After changing this setting, the new session length will take effect after the next time the user enters their credentials.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"SessionLengthWebInDays": 180`` with numerical input.                                                                    |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Session length for mobile apps (days)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Set the number of days from the last time a user entered their credentials to the expiry of the user's session on mobile apps.

After changing this setting, the new session length will take effect after the next time the user enters their credentials.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"SessionLengthMobileInDays": 180`` with numerical input.                                                                 |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Session length for GitLab SSO authentication (days)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Set the number of days from the last time a user entered their credentials to the expiry of the user's session. If the authentication method is SAML or GitLab, the user may automatically be logged back in to Mattermost if they are already logged in to SAML or GitLab.

After changing this setting, the setting will take effect after the next time the user enters their credentials.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"SessionLengthSSOInDays": 30`` with numerical input.                                                                     |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Session Cache (minutes)
^^^^^^^^^^^^^^^^^^^^^^^^

Set the number of minutes to cache a session in memory.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"SessionCacheInMinutes": 10`` with numerical input.                                                                      |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Session Idle Timeout (minutes)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The number of minutes from the last time a user was active on the system to the expiry of the user's session. Once expired, the user will need to log in to continue. Minimum is 5 minutes, and 0 is unlimited.

Applies to the desktop app and browsers. For mobile apps, use an EMM provider to lock the app when not in use. In High Availability mode, enable IP hash load balancing for reliable timeout measurement.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"SessionIdleTimeoutInMinutes": 43200`` with numerical input.                                                             |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

________

Connections
~~~~~~~~~~~

Enable cross-origin requests from
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Enable HTTP cross-origin requests from specific domains separated by spaces. Type ``*`` to allow CORS from any domain or leave it blank to disable it.

.. note::
 Please make sure you have entered your Site URL before enabling this setting to prevent losing access to the System Console after saving. If you experience lost access to the System Console after changing this setting, you can set your `Site URL <https://docs.mattermost.com/administration/config-settings.html#site-url>`__ through the ``config.json`` file.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AllowCorsFrom": ""`` with string input.                                                                                 |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

CORS Exposed Headers
^^^^^^^^^^^^^^^^^^^^^

Whitelist of headers that will be accessible to the requester.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"CorsExposedHeaders": ""`` with string input.                                                                            |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

CORS Allow Credentials
^^^^^^^^^^^^^^^^^^^^^^

**True**: Requests that pass validation will include the ``Access-Control-Allow-Credentials`` header.

**False**: Requests won't include the ``Access-Control-Allow-Credentials`` header.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"CorsAllowCredentials": false`` with options ``true`` and ``false``.                                                     |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

CORS Debug
^^^^^^^^^^^

**True**: Prints messages to the logs to help when developing an integration that uses CORS. These messages will include the structured key value pair ``"source": "cors"``.

**False**: Debug messages not printed to the logs.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"CorsDebug": false`` with options ``true`` and ``false``.                                                                |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable Insecure Outgoing Connections
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Outgoing HTTPS requests can accept unverified, self-signed certificates. For example, outgoing webhooks to a server with a self-signed TLS certificate, using any domain, will be allowed.

**False**: Only secure HTTPS requests are allowed.

Security note: Enabling this feature makes these connections susceptible to man-in-the-middle attacks.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableInsecureOutgoingConnections": false`` with options ``true`` and ``false``.                                        |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

________

Notifications
-------------

Settings to configure email and mobile push notifications.

Email
~~~~~~

.. _email-notification-config:

Enable Email Notifications
^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Enables sending of email notifications.

**False**: Disables email notifications for developers who may want to skip email setup for faster development. To remove the **Preview Mode: Email notifications have not been configured** banner, also set **Enable Preview Mode Banner** to ``false``. 

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"SendEmailNotifications": false`` with options ``true`` and ``false``.                                                   |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

.. _email-preview-mode-banner-config:

Enable Preview Mode Banner
^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Preview Mode banner is displayed to all users when ``"SendEmailNotifications": false`` so users are aware that email notifications are disabled.

**False**: Preview Mode banner is not displayed to users.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnablePreviewModeBanner": true`` with options ``true`` and ``false``.                                                   |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable Email Batching
^^^^^^^^^^^^^^^^^^^^^

**True**: Users can select how often to receive email notifications, and multiple notifications within that timeframe will be combined into a single email. Batching will occur at a default interval of 15 minutes, configurable in **Account Settings > Notifications**. 

.. note::
  Email batching cannot be enabled unless the `SiteURL <https://docs.mattermost.com/administration/config-settings.html#site-url>`__ is configured. Email batching in `High Availability mode <https://docs.mattermost.com/administration/config-settings.html#enable-high-availability-mode>`__ is planned but not yet supported.

**False**: If email notifications are enabled in Account Settings, emails will be sent individually for every mention or direct message received.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableEmailBatching": false`` with options ``true`` and ``false``.                                                      |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable Notification Contents
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

*Available in Enterprise Edition E20*

**Send full message contents**: Sender name and channel are included in email notifications. 

**Send generic description with only sender name**: The team name and name of the person who sent the message, with no information about channel name or message contents, is included in email notifications. Typically used for compliance reasons if Mattermost contains confidential information and policy dictates it cannot be stored in email.

+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EmailNotificationContentsType": "full"`` with options ``"full"`` and ``"generic"`` for the above settings, respectively.             |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Notification Display Name
^^^^^^^^^^^^^^^^^^^^^^^^^

Name displayed on email account used when sending notification emails from Mattermost system.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"FeedbackName": ""`` with string input.                                                                                  |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Notification From Address
^^^^^^^^^^^^^^^^^^^^^^^^^

Address displayed on email account used when sending notification emails from Mattermost system.

So you don't miss messages, please make sure to change this value to an email your system administrator receives, such as ``"admin@yourcompany.com"``.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"FeedbackEmail": ""`` with string input.                                                                                 |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Notification Reply-To Address
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Email address used in the Reply-To header when sending notification emails from Mattermost.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ReplyToAddress": ""`` with string input.                                                                                |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Notification Footer Mailing Address
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Organization name and mailing address displayed in the footer of email notifications from Mattermost, such as "© ABC Corporation, 565 Knight Way, Palo Alto, California, 94305, USA". If the field is left empty, the organization name and mailing address will not be displayed.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"FeedbackOrganization": ""`` with string input.                                                                          |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

SMTP Server
^^^^^^^^^^^^

Location of SMTP email server.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"SMTPServer": ""`` with string input.                                                                                    |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

SMTP Server Port
^^^^^^^^^^^^^^^^^

Port of SMTP email server.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"SMTPPort": ""`` with string input.                                                                                      |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable SMTP Authentication
^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: SMTP username and password are used for authenticating to the SMTP server.

**False**: Mattermost doesn't attempt to authenticate to the SMTP server.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableSMTPAuth": false`` with options ``true`` and ``false``.                                                           |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

SMTP Server Username
^^^^^^^^^^^^^^^^^^^^

The username for authenticating to the SMTP server.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"SMTPUsername": ""`` with string input.                                                                                  |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

SMTP Server Password
^^^^^^^^^^^^^^^^^^^^

The password associated with the SMTP username.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"SMTPPassword": ""`` with string input.                                                                                  |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

.. _email-tls:

Connection Security
^^^^^^^^^^^^^^^^^^^

**None**: Send email over an unsecure connection.

**TLS**: Communication between Mattermost and your email server is encrypted.

**STARTTLS**: Attempts to upgrade an existing insecure connection to a secure connection using TLS.

+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ConnectionSecurity": ""`` with options ``""``, ``"TLS"``, and ``"STARTTLS"``.                                                      |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Skip Server Certificate Verification
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Mattermost will not verify the email server certificate.

**False**: Mattermost will verify the email server certificate.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"SkipServerCertificateVerification": false`` with options ``true`` and ``false``.                                        |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable Security Alerts
^^^^^^^^^^^^^^^^^^^^^^

**True**: Enable System Admins to be notified by email if a relevant security fix alert is announced. Requires email to be enabled. To learn more about this feature, see :doc:`telemetry`.

**False**: Security alerts are disabled.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableSecurityFixAlert": true`` with options ``true`` and ``false``.                                                    |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

________

Mobile Push
~~~~~~~~~~~

Enable Push Notifications
^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Your Mattermost server sends mobile push notifications to the server specified in **PushNotificationServer**.

**False**: Mobile push notifications are disabled.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"SendPushNotifications": false`` with options ``true`` and ``false``.                                                    |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Push Notification Server
^^^^^^^^^^^^^^^^^^^^^^^^

Location of Mattermost Push Notification Service (MPNS), which re-sends push notifications from Mattermost to services like Apple Push Notification Service (APNS) and Google Cloud Messaging (GCM).

To confirm push notifications are working, connect to the `Mattermost iOS App on iTunes <https://apps.apple.com/us/app/mattermost/id1257222717>`__ or the `Mattermost Android App on Google Play <https://play.google.com/store/apps/details?id=com.mattermost.rn>`__:

- For Enterprise Edition, enter ``https://push.mattermost.com`` for the push notification server hosted in the United States. If you prefer to use a push notification server hosted in Germany, enter ``https://hpns-de.mattermost.com/``.
- For Team Edition, enter ``https://push-test.mattermost.com``.

Please review the full documentation on `push notifications and mobile applications <https://docs.mattermost.com/deployment/push.html>`__ including guidance on compiling your own mobile apps and MPNS before deploying to production.

.. note::
  The ``https://push-test.mattermost.com`` server is provided for testing push notifications prior to compiling your own service please make sure `to read about its limitations <https://docs.mattermost.com/deployment/push.html#push-notifications-for-team-edition-users>`_.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"PushNotificationServer": "https://push-test.mattermost.com"`` with string input.                                        |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Push Notification Contents
^^^^^^^^^^^^^^^^^^^^^^^^^^

**Send generic description with only sender name**: Push notifications include only the name of the person who sent the message but no information about channel name or message text.

**Send generic description with user and channel names**: Push notifications include names of users and channels but no specific details from the message text.

**Send full message snippet**: Selecting "Send full message snippet" sends excerpts from messages triggering notifications with specifics and may include confidential information sent in messages. If your Push Notification Service is outside your firewall, it is HIGHLY RECOMMENDED this option only be used with an "https" protocol to encrypt the connection.

+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"PushNotificationContents": "generic"`` with options ``"generic_no_channel"``, ``"generic"``, and ``"full"`` for the above settings, respectively. |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

**Troubleshooting Push Notifications**

To confirm push notifications are working:

1. Go to **System Console > Notifications > Mobile Push > Send Push Notifications** and select **Use TPNS connection to send notifications to iOS and Android apps**.
2. Set **Push Notification Server** to *https://push.mattermost.com* if using Enterprise Edition. If using Team Edition, set the value to *https://push-test.mattermost.com*.
3. To confirm push notifications are working, connect to the `Mattermost iOS App on iTunes <https://apps.apple.com/us/app/mattermost/id1257222717>`__ or the `Mattermost Android App on Google Play <https://play.google.com/store/apps/details?id=com.mattermost.rn>`__ and log in to your team site.
4. Close the app on your device, and close any other connections to your team site.
5. Wait 5 minutes and have another team member send you a direct message, which should trigger a push notification to the Mattermost app on your mobile device.
6. You should receive a push notification on your device alerting you of the direct message.

If you did not receive an alert:

1. Set **System Console > General > Logging > File Log Level** to *DEBUG* (make sure to set this back to *INFO* after troubleshooting to save disk space).
2. Repeat the above steps.
3. Go to **System Console > Logs** and copy the log output into a file.
4. For Enterprise Edition customers, `submit a support request with the file attached <https://mattermost.zendesk.com/hc/en-us/requests/new>`__. For Team Edition users, please start a thread in the `troubleshooting forum <https://forum.mattermost.org/t/how-to-use-the-troubleshooting-forum/150>`__ for peer-to-peer support.

________

Integrations
------------

Settings to configure webhooks, slash commands, and external integration services.

Custom Integrations
~~~~~~~~~~~~~~~~~~~

Enable Incoming Webhooks
^^^^^^^^^^^^^^^^^^^^^^^^

Developers building integrations can create webhook URLs for public channels and private channels. Please see our `documentation page <https://docs.mattermost.com/developer/webhooks-incoming.html>`__ to learn about creating webhooks, view samples, and to let the community know about integrations you have built.

**True**: Incoming webhooks will be allowed. To manage incoming webhooks, go to **Account Settings > Integrations**. The webhook URLs created in Account Settings can be used by external applications to create posts in any public or private channels that you have access to.

**False**: The **Integrations > Incoming Webhooks** section of Account Settings is hidden and all incoming webhooks are disabled.

Security note: By enabling this feature, users may be able to perform `phishing attacks <https://en.wikipedia.org/wiki/Phishing>`__ by attempting to impersonate other users. To combat these attacks, a BOT tag appears next to all posts from a webhook. Enable at your own risk.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableIncomingWebhooks": true`` with options ``true`` and ``false``.                                                    |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable Outgoing Webhooks
^^^^^^^^^^^^^^^^^^^^^^^^^

Developers building integrations can create webhook tokens for public channels. Trigger words are used to fire new message events to external integrations. For security reasons, outgoing webhooks are only available in public channels. Please see our `documentation page <https://docs.mattermost.com/developer/webhooks-outgoing.html>`__ to learn about creating webhooks and view samples.

**True**: Outgoing webhooks will be allowed. To manage outgoing webhooks, go to **Account Settings > Integrations**.

**False**: The Integrations > Outgoing Webhooks section of Account Settings is hidden and all outgoing webhooks are disabled.

Security note: By enabling this feature, users may be able to perform `phishing attacks <https://en.wikipedia.org/wiki/Phishing>`__ by attempting to impersonate other users. To combat these attacks, a BOT tag appears next to all posts from a webhook. Enable at your own risk.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableOutgoingWebhooks": true`` with options ``true`` and ``false``.                                                    |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable Custom Slash Commands
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Slash commands send events to external integrations that send a response back to Mattermost.

**True**: Allow users to create custom slash commands from **Main Menu > Integrations > Commands**.

**False**: Slash commands are hidden in the **Integrations** user interface.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableCommands": false`` with options ``true`` and ``false``.                                                           |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable OAuth 2.0 Service Provider
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Mattermost acts as an OAuth 2.0 service provider allowing Mattermost to authorize API requests from external applications.

**False**: Mattermost does not function as an OAuth 2.0 service provider.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableOAuthServiceProvider": false`` with options ``true`` and ``false``.                                               |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Restrict managing integrations to Admins
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

*This permission has been migrated to the database and changing the ``config.json`` value no longer takes effect after upgrading to v4.9, released on April 16th, 2018. This permission can be modified using the System Console user interface.*

**True**: When ``true``, webhooks and slash commands can only be created, edited, and viewed by Team and System Admins, and OAuth 2.0 applications by System Admins. Integrations are available to all users after they have been created by the System Admin.

**False**: Any team members can create webhooks, slash commands, and OAuth 2.0 applications from **Main Menu > Integrations**.

.. note::
  OAuth 2.0 applications can be authorized by all users if they have the **Client ID** and **Client Secret** for an app setup on the server.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableOnlyAdminIntegrations": true`` with options ``true`` and ``false``.                                               |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable integrations to override usernames
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Webhooks, slash commands, OAuth 2.0 apps, and other integrations such as `Zapier <https://docs.mattermost.com/integrations/zapier.html>`__, will be allowed to change the username they are posting as. If no username is present, the username for the post is the same as it would be for a setting of **False**.

**False**: Custom slash commands can only post as the username of the user who used the slash command. OAuth 2.0 apps can only post as the username of the user who set up the integration. For incoming webhooks and outgoing webhooks, the username is "webhook". See https://docs.mattermost.com/guides/integration.html for more details.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnablePostUsernameOverride": false`` with options ``true`` and ``false``.                                               |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable integrations to override profile picture icons
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Webhooks, slash commands, and other integrations, such as `Zapier <https://docs.mattermost.com/integrations/zapier.html>`__, will be allowed to change the profile picture they post with.

**False**: Webhooks, slash commands, and OAuth 2.0 apps can only post with the profile picture of the account they were set up with. See https://docs.mattermost.com/guides/integration.html for more details.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnablePostIconOverride": false`` with options ``true`` and ``false``.                                                   |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable Personal Access Tokens
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: When ``true``, users can create `personal access tokens <https://developers.mattermost.com/integrate/admin-guide/admin-personal-access-token/>`__ for integrations in **Account Settings > Security**. They can be used to authenticate against the API and give full access to the account.

To manage who can create personal access tokens or to search users by token ID, go to the **System Console > Users** page.

**False**: Personal access tokens are disabled on the server.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableUserAccessTokens": false`` with options ``true`` and ``false``.                                                   |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

________

External Services
~~~~~~~~~~~~~~~~~

Google API Key
^^^^^^^^^^^^^^^

Mattermost offers the ability to embed YouTube videos from URLs shared by end users. Set this key and add YouTube Data API v3 as a service to your key to enable the display of titles for embedded YouTube video previews. Without the key, YouTube previews will still be created based on hyperlinks appearing in messages or comments but they will not show the video title. If Google detects the number of views is exceedingly high, they may throttle embed access. Should this occur, you can remove the throttle by registering for a Google Developer Key and entering it in this field following these instructions: https://www.youtube.com/watch?v=Im69kzhpR3I. Your Google Developer Key is used in client-side Javascript.

Using a Google API Key allows Mattermost to detect when a video is no longer available and display the post with a *Video not found* label.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"GoogleDeveloperKey": ""`` with string input.                                                                            |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

________

Plugins (Beta)
--------------

Settings to configure plugins.

Management
~~~~~~~~~~~~~~~~~~~~~~~~~

Enable Plugins
^^^^^^^^^^^^^^

**True**: Enables plugins on your Mattermost server. Use plugins to integrate with third-party systems, extend functionality or customize the user interface of your Mattermost server. See `documentation <https://developers.mattermost.com/integrate/admin-guide/admin-plugins-beta/>`__ to learn more.

**False**: Disables plugins on your Mattermost server.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Enable": true`` with options ``true`` and ``false``.                                                                    |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Plugin Settings
^^^^^^^^^^^^^^^^

Settings specific to each plugin.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Plugins": {}`` with object input mapping plugin IDs as keys to objects containing plugin-specific data.                 |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Installed Plugin State
^^^^^^^^^^^^^^^^^^^^^^

Lists installed plugins on your Mattermost server and whether they are enabled. Pre-packaged plugins are installed by default and can be deactivated, but not removed.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"PluginStates": {}`` with object input mapping plugin IDs as keys to objects, each of which contains a key ``"Enable": false`` with options ``true`` or ``false``. |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Jira (Beta)
~~~~~~~~~~~

Enable Jira
^^^^^^^^^^^^

**True**: You can configure Jira webhooks to post message in Mattermost. To help combat phishing attacks, all posts are labelled by a BOT tag.

**False**: Jira webhook integration is not enabled.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Enabled": false`` with options ``true`` and ``false``.                                                                  |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

User
^^^^^

Select the username that this integration is attached to.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"UserName": ""`` with string input.                                                                                      |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Secret
^^^^^^^

The secret used to authenticate to Mattermost. Regenerating the secret for the webhook URL endpoint invalidates your existing Jira integrations.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Secret": ""`` with string input.                                                                                        |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Note that to set up a Jira integration via ``config.json``, you can use the following format in ``"Plugins"``:

  .. code-block:: text

    "Plugins": {
        "jira": {
            "Enabled": true,
            "Secret": "k-ZtjoTrmIdPs7eAGjalDEK_3Q8r3gXJ",
            "UserName": "jira"
        }
    }

where ``"Enabled"``, ``"Secret"`` and ``"UserName"`` are specified above.

________

Files
-----

Mattermost currently supports storing files on the local filesystem and Amazon S3 or S3-compatible containers. 

.. note::
  We have tested Mattermost with `MinIO <https://www.minio.io/>`__ and `Digital Ocean Spaces <https://www.digitalocean.com/docs/spaces/>`_ products but not all S3-compatible containers on the market. If you are looking to use other S3-compatible containers we advise completing your own testing.

Storage
~~~~~~~

File Storage System 
^^^^^^^^^^^^^^^^^^^^

+-------------------------+-----------------------+
| ``config.json`` setting | ``DriverName``        |
+-------------------------+-----------------------+
| Allowed Values          | ``"local"`` (default) |
|                         | ``"amazons3"``        |
+-------------------------+-----------------------+

This selects which file storage system is used: Local File System, Amazon S3, or MinIO (using the same ``DriverName`` as Amazon S3: ``"amazons3"``).

**Local File System**: Files and images are stored in the specified local file directory.

**Amazon S3**: Files and images are stored on Amazon S3 based on the provided access key, bucket, and region fields. The ``"amazons3"`` driver is compatible with MinIO (Beta) and Digital Ocean Spaces based on the provided access key, bucket, and region fields.

**MinIO**: MinIO is an open source, self-hosted alternative to Amazon S3 and thus finds common ground with our community, providing cloud-like functionality but in a secure, self-hosted environment and is fully compatible with our S3 driver. To get started with MinIO you can download and run it locally from this page: `Download MinIO <https://min.io/download>`_.

Local Storage Directory
^^^^^^^^^^^^^^^^^^^^^^^

The local directory to which files are written when the File Storage System is set to ``"local"``. This is relative to the directory Mattermost is installed to and defaults to ``"./data"`` When File Storage System is set to S3 this setting has no effect.

+-------------------------+------------------------------------------------------------------------------------------+
| ``config.json`` setting | ``Directory``                                                                            |
+-------------------------+------------------------------------------------------------------------------------------+
| Allowed Values          | Any directory writeable by the user Mattermost is running as. Defaults to ``"./data/"``. |
+-------------------------+------------------------------------------------------------------------------------------+

Amazon S3 Bucket
^^^^^^^^^^^^^^^^

The name of the bucket for your S3-compatible object storage instance.

.. note::
  For MinIO, you can find this name in the left side bar of your MinIO browser if you want use an existing MinIO bucket or you can create a new one with the desired name.

+-------------------------+----------------------------------------------+
| ``config.json`` setting | ``AmazonS3Bucket``                           |
+-------------------------+----------------------------------------------+
| Allowed Values          | A string with the S3-compatible bucket name. |
+-------------------------+----------------------------------------------+


Amazon S3 Region
^^^^^^^^^^^^^^^^

The AWS region you selected when creating your S3 bucket. If no region is set, Mattermost attempts to get the appropriate region from AWS and sets it to ``"us-east-1"`` if none is found.

.. note::
  | For Digital Ocean Spaces leave this setting empty.
  | For MinIO you can leave it empty or set it to ``"None"``.

+-------------------------+-----------------------------------------------------+
| ``config.json`` setting | ``AmazonS3Region``                                  |
+-------------------------+-----------------------------------------------------+
| Allowed Values          | A string with the AWS region containing the bucket. |
+-------------------------+-----------------------------------------------------+

Amazon S3 Endpoint
^^^^^^^^^^^^^^^^^^

Hostname of your S3-compatible instance. Defaults to ``"s3.amazonaws.com"``.

.. note::
  | For Digital Ocean Spaces, the hostname should be set to ``"<region>.digitaloceanspaces.com"``, where ``<region>`` is the abbreviation for the region you chose when setting up the Space. It can be ``nyc3``, ``ams3``, or ``sgp1``.
  | For MinIO, the hostname is the URL at which you have hosted your MinIO instance, or ``"localhost:9000"`` if you are hosting it locally.

+-------------------------+-------------------------------------------------------------------+
| ``config.json`` setting | ``AmazonS3Endpoint``                                              |
+-------------------------+-------------------------------------------------------------------+
| Allowed Values          | A string with the hostname of the S3-compatible storage instance. |
+-------------------------+-------------------------------------------------------------------+


Amazon S3 Access Key ID
^^^^^^^^^^^^^^^^^^^^^^^

This is required for access unless you are using an `Amazon S3 IAM Role <https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html>`__ with Amazon S3. Your EC2 administrator can supply you with the access key ID.

.. note::
  For MinIO, you can find this in your terminal window with the name ``AccessKey`` when you start a new MinIO server.

+-------------------------+----------------------------------------------------------------------+
| ``config.json`` setting | ``AmazonS3AccessKeyId``                                              |
+-------------------------+----------------------------------------------------------------------+
| Allowed Values          | A string with the access key for the S3-compatible storage instance. |
+-------------------------+----------------------------------------------------------------------+

Amazon S3 Secret Access Key
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The secret access key associated with your Amazon S3 Access Key ID.

.. note::
  For MinIO, you can find this in your terminal window with the name ``SecretKey`` when you start a new MinIO server.

+-------------------------+-----------------------------------------------------------------------------+
| ``config.json`` setting | ``AmazonS3SecretAccessKey``                                                 |
+-------------------------+-----------------------------------------------------------------------------+
| Allowed Values          | A string with the secret access key for the S3-compatible storage instance. |
+-------------------------+-----------------------------------------------------------------------------+

Enable Secure Amazon S3 Connections
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Enables only secure Amazon S3 Connections.

**False**: Allows insecure connections to Amazon S3.

.. note::
  When using MinIO locally, set this option to ``false`` or use `OpenSSL <https://www.openssl.org/>`_ and install a new SSL Certificate or use a tunneling service like `ngrok <https://ngrok.com/>`_.

+-------------------------+----------------------------------------------+
| ``config.json`` setting | ``AmazonS3SSL``                              |
+-------------------------+----------------------------------------------+
| Allowed Values          | ``true`` or ``false``. Defaults to ``true``. |
+-------------------------+----------------------------------------------+

Enable Server-Side Encryption for Amazon S3
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

*Available in Enterprise Edition E20*

**True**: Encrypts files in Amazon S3 using server-side encryption with `Amazon S3-managed keys <https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingServerSideEncryption.html>`__.

**False**: Doesn't encrypt files in Amazon S3.

.. note::
  Server-Side Encryption only works with Amazon S3.

+-------------------------+-----------------------------------------------+
| ``config.json`` setting | ``AmazonS3SSE``                               |
+-------------------------+-----------------------------------------------+
| Allowed Values          | ``true`` or ``false``. Defaults to ``false``. |
+-------------------------+-----------------------------------------------+

Enable Amazon S3 Debugging
^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: When ``true``, log additional debugging information to the system logs. Typically set to ``false`` in production.

**False**: No Amazon S3 debugging information is included in the system logs.

+-------------------------+-----------------------------------------------+
| ``config.json`` setting | ``AmazonS3Trace``                             |
+-------------------------+-----------------------------------------------+
| Allowed Values          | ``true`` or ``false``. Defaults to ``false``. |
+-------------------------+-----------------------------------------------+

Test Connection
^^^^^^^^^^^^^^^^

Ensures that the user can access the server and that the settings are valid.

Allow File Sharing
^^^^^^^^^^^^^^^^^^

When ``false``, disables file sharing on the server. All file and image uploads on messages are forbidden across clients and devices, including mobile.

+---------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableFileAttachments": true`` with options ``true`` and ``false``.    |
+---------------------------------------------------------------------------------------------------------------------+

Allow File Uploads on Mobile
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

*Available in Enterprise Edition E20*

When ``false``, disables file uploads on mobile apps. All file and image uploads on messages are forbidden across clients and devices, including mobile.

+---------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableMobileUpload": true`` with options ``true`` and ``false``.       |
+---------------------------------------------------------------------------------------------------------------------+

Allow File Downloads on Mobile
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

*Available in Enterprise Edition E20*

When ``false``, disables file downloads on mobile apps. Users can still download files from a mobile web browser.

+---------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableMobileDownload": true`` with options ``true`` and ``false``.     |
+---------------------------------------------------------------------------------------------------------------------+

Maximum File Size
^^^^^^^^^^^^^^^^^^

Maximum file size for message attachments entered in megabytes in the System Console UI. Converted to bytes in ``config.json`` at 1048576 bytes per megabyte.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"MaxFileSize": 52428800`` with numerical input.                                                                          |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

.. warning:: 

   Verify server memory can support your setting choice. Large file sizes increase the risk of server crashes and failed uploads due to network disruptions.

Enable Image Proxy
^^^^^^^^^^^^^^^^^^

When ``true``, enables an image proxy for loading external images. The image proxy is used by the Mattermost apps to prevent them from connecting directly to remote servers. This anonymizes their connections and prevents them from accessing insecure content.

See the :doc:`documentation <image-proxy>` to learn more.

+---------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Enable": true`` with options ``true`` and ``false``.                   |
+---------------------------------------------------------------------------------------------------------------------+

Image Proxy Type
^^^^^^^^^^^^^^^^^

The type of image proxy used by Mattermost. There are two options:

**local**: The Mattermost server itself acts as the image proxy. This is the default option.

**atmos/camo**: An external `atmos/camo <https://github.com/atmos/camo>`_ image proxy is used.

See the `documentation <https://docs.mattermost.com/administration/image-proxy.html#atmos-camo-image-proxy>`_ to learn more.

+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ImageProxyType": "local"``, with options ``"local"`` and ``"atmos/camo"`` for the above settings, respectively. |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------+

Remote Image Proxy URL
^^^^^^^^^^^^^^^^^^^^^^^

The URL of the ``atmos/camo`` proxy. This setting is not needed when using the local image proxy.

+---------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"RemoteImageProxyURL": ""`` with string input.                          |
+---------------------------------------------------------------------------------------------------------------------+

Remote Image Proxy Options
^^^^^^^^^^^^^^^^^^^^^^^^^^

The URL signing key passed to an ``atmos/camo`` image proxy. This setting is not needed when using the local image proxy.

See the `documentation <https://docs.mattermost.com/administration/image-proxy.html#atmos-camo-image-proxy>`_ to learn more.

+---------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"RemoteImageProxyOptions": ""`` with string input.                      |
+---------------------------------------------------------------------------------------------------------------------+

________

Images
~~~~~~

Attachment Thumbnail Width
^^^^^^^^^^^^^^^^^^^^^^^^^^^

*Removed in July 16th, 2017 release*

Width of thumbnails generated from uploaded images. Updating this value changes how thumbnail images render in future, but does not change images created in the past.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ThumbnailWidth": 120`` with numerical input.                                                                            |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Attachment Thumbnail Height
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

*Removed in July 16th, 2017 release*

Height of thumbnails generated from uploaded images. Updating this value changes how thumbnail images render in future, but does not change images created in the past.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ThumbnailHeight": 100`` with numerical input.                                                                           |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Image Preview Width
^^^^^^^^^^^^^^^^^^^^

*Removed in July 16th, 2017 release*

Maximum width of preview image. Updating this value changes how preview images render in future, but does not change images created in the past.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"PreviewWidth": 1024`` with numerical input.                                                                             |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Image Preview Height
^^^^^^^^^^^^^^^^^^^^

*Removed in July 16th, 2017 release*

Maximum height of preview image. Setting this value to ``0`` instructs Mattermost to auto-size the preview image height based on the source image aspect ratio and the preview image width. Updating this value changes how preview images render in future, but does not change images created in the past.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"PreviewHeight": 0`` with numerical input.                                                                               |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Profile Picture Width
^^^^^^^^^^^^^^^^^^^^^

*Removed in July 16th, 2017 release*

The width to which profile pictures are resized after being uploaded via Account Settings.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ProfileWidth": 128`` with numerical input.                                                                              |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Profile Picture Height
^^^^^^^^^^^^^^^^^^^^^^

*Removed in July 16th, 2017 release*

The height to which profile pictures are resized after being uploaded via Account Settings.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ProfileHeight": 128`` with numerical input.                                                                             |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

________

Customization
--------------

Settings to customize your deployment with custom branding and legal and support links.

Custom Branding
~~~~~~~~~~~~~~~

Site Name
^^^^^^^^^^

Name of service shown in login screens and UI. Maximum 30 characters.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"SiteName": "Mattermost"`` with string input.                                                                            |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable Custom Branding
^^^^^^^^^^^^^^^^^^^^^^^

*This feature was moved to Team Edition in Mattermost v5.0, released June 16th, 2018. In previous versions, this feature is available in Enterprise Edition E10 and higher.*

**True**: Enables custom branding to show a JPG image some custom text on the server login page.

**False**: Custom branding is disabled.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableCustomBrand": false`` with options ``true`` and ``false``.                                                        |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Custom Brand Image
^^^^^^^^^^^^^^^^^^^

Custom JPG image is displayed on left side of server login page. Recommended maximum image size is less than 2 MB because image will be loaded for every user who logs in.

+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This features has no ``config.json`` setting and must be set in the System Console user interface.                                                                    |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Custom Brand Text
^^^^^^^^^^^^^^^^^^

Custom text will be shown below custom brand image on left side of server login page. Maximum 500 characters allowed. You can format this text using the same `Markdown formatting codes <https://docs.mattermost.com/help/messaging/formatting-text.html>`__ as using in Mattermost messages.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"CustomBrandText": ""`` with string input.                                                                               |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Site Description
^^^^^^^^^^^^^^^^^

Description of service shown in login screens and UI. When not specified, "All team communication in one place, searchable and accessible anywhere" is displayed.

+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"CustomDescriptionText": ""`` with string input.                                                                          |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

________

Announcement Banner
~~~~~~~~~~~~~~~~~~~~~~~~~

Enable Announcement Banner
^^^^^^^^^^^^^^^^^^^^^^^^^^

Enable an announcement banner across all teams. The banner is displayed at the top of the screen and is the entire width of the screen. By default, users can dismiss the banner until you either change the text of the banner or until you re-enable the banner after it has been disabled. You can prevent users from dismissing the banner, and you can control the text color and the background color.

**True**: Enable the announcement banner. The banner is displayed only if ``BannerText`` has a value.

**False**: Disable the announcement banner.

+-----------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableBanner": false`` with options ``true`` and ``false``.  |
+-----------------------------------------------------------------------------------------------------------+

Banner Text
^^^^^^^^^^^

The text of the announcement banner.

+------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"BannerText": ""`` with string input.  |
+------------------------------------------------------------------------------------+

Banner Color
^^^^^^^^^^^^

The background color of the announcement banner.

+---------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``""BannerColor": "#f2a93b"`` with string input.  |
+---------------------------------------------------------------------------------------------+

Banner Text Color
^^^^^^^^^^^^^^^^^

The color of the text in the announcement banner.

+-------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``""BannerTextColor": "#333333"`` with string input.  |
+-------------------------------------------------------------------------------------------------+

Allow Banner Dismissal
^^^^^^^^^^^^^^^^^^^^^^

**True**: Users can dismiss the banner until the next time they log in or the banner is updated.

**False**: The banner is permanently visible until it is turned off by the System Admin.

+-------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``""AllowBannerDismissal": true`` with options ``true`` and ``false``.  |
+-------------------------------------------------------------------------------------------------------------------+

________

Emoji
~~~~~

Enable Emoji Picker
^^^^^^^^^^^^^^^^^^^

**True**: Enables an emoji picker that allows users to select emoji to add as reactions or use in messages. Enabling the emoji picker with a large number of custom emoji may slow down performance.

**False**: Emoji picker is disabled.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableEmojiPicker": true`` with options ``true`` and ``false``.                                                         |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable Custom Emoji
^^^^^^^^^^^^^^^^^^^^

**True**: Enables a Custom Emoji option in the Main Menu, where users can go to create customized emoji.

**False**: Custom Emojis are disabled.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableCustomEmoji": false`` with options ``true`` and ``false``.                                                        |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Restrict Custom Emoji Creation
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

*This permission has been migrated to the database and changing the ``config.json`` value no longer takes effect after upgrading to v4.9, released on April 16th, 2018. This permission can be modified using the System Console user interface.*

*Available in Enterprise Edition E10 and higher*

**Allow everyone to create custom emoji**: Allows everyone to create Custom Emoji from the **Main Menu > Custom Emoji**.

**Allow System and Team Admins to create custom emoji**: The Custom Emoji option is hidden from the Main Menu for users who are not System or Team Admins.

**Only allow System Admins to create custom emoji**: The Custom Emoji option is hidden from the Main Menu for users who are not System Admins.

+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"RestrictCustomEmojiCreation": "all"`` with options ``"all"``, ``"admin"``, and ``"system_admin"`` for the above settings, respectively. |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

________


GIF (Beta)
~~~~~~~~~~

Enable GIF Picker
^^^^^^^^^^^^^^^^^^

**True**: Allow users to select GIFs from the emoji picker via a Gfycat integration.

**False**: GIFs cannot be selected in the emoji picker.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableGifPicker": false`` with options ``true`` and ``false``.                                                          |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

.. note::
  Mattermost deployments which are restricted to access behind a firewall must open port 443 to both https://api.gfycat.com/v1 and https://gfycat.com/<id> (for all request types) for this feature to work.

Gfycat API Key
^^^^^^^^^^^^^^^

When blank, uses the default API key provided by Gfycat. Alternatively, a unique API key can be requested at https://developers.gfycat.com/signup/#/. Enter the client ID you receive via email to this field. 

+-----------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"GfycatApiKey": "2_KtH_W5"`` with string input.   |
+-----------------------------------------------------------------------------------------------+

Gfycat API Secret
^^^^^^^^^^^^^^^^^

The API secret generated by Gfycat for your API key. When blank, uses the default API secret provided by Gfycat.

+---------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"GfycatApiSecret": "3wLVZPiswc3DnaiaFoLkDvB4X0IV6CpMkj4tf2inJRsBY6-FnkT08zGmppWFgeof"`` with string input.  |
+---------------------------------------------------------------------------------------------------------------------------------------------------------+

________

Posts
~~~~~~

Enable Link Previews
^^^^^^^^^^^^^^^^^^^^^

**True**: Enables users to display a preview of website content below the message, if available. When true, website previews can be enabled from **Account Settings > Display > Website Link Previews**.

**False**: Website link previews are disabled.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableLinkPreviews": false`` with options ``true`` and ``false``.                                                       |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Custom URL Schemes
^^^^^^^^^^^^^^^^^^

A list of URL schemes that are used for autolinking in message text. ``http``, ``https``, ``ftp``, ``tel``, and ``mailto`` always create links.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"CustomUrlSchemes": []`` with string array input consisting of URL schemes, such as ``["git", "smtp"]``.                 |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

________

.. _legal-support-links:

Legal and Support
~~~~~~~~~~~~~~~~~

Legal and Support links will be hidden in the user interface if these fields are left blank.

Terms of Service link
^^^^^^^^^^^^^^^^^^^^^^

Configurable link to Terms of Service your organization may provide to end users. By default, links to a Terms of Service page hosted on mattermost.com. If changing the link to a different Terms of Service, make sure to include the "Mattermost Conditions of Use" notice to end users that must also be shown to users from the "Terms of Service" link.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"TermsOfServiceLink": "https://mattermost.com/terms-of-use/"`` with string input.                                 |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Privacy Policy link
^^^^^^^^^^^^^^^^^^^^

Configurable link to Privacy Policy your organization may provide to end users. By default, links to a Privacy Policy page hosted on mattermost.com.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"PrivacyPolicyLink": "https://mattermost.com/privacy-policy/"`` with string input.                         |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

About link
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Configurable link to an About page describing your organization may provide to end users. By default, links to an About page hosted on mattermost.com.

+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AboutLink": "https://mattermost.com/platform-overview/"`` with string input.                                                              |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Help link
^^^^^^^^^^^

Configurable link to a Help page your organization may provide to end users. By default, links to Mattermost help documentation hosted on `docs.mattermost.com <https://docs.mattermost.com/>`__ .

+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"HelpLink": "https://docs.mattermost.com/"`` with string input.                                                                |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Report a Problem link
^^^^^^^^^^^^^^^^^^^^^^
Set the link for the support website.

+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ReportAProblemLink": "https://handbook.mattermost.com/contributors/contributors/ways-to-contribute#report-a-bug"`` with string input.                                            |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Support Email
^^^^^^^^^^^^^^

Set an email for feedback or support requests.

So you don't miss messages, please make sure to change this value to an email your system administrator receives, such as ``"support@yourcompany.com"``. This address is displayed on email notifications and during the Getting Started tutorial for end users to ask support questions.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"SupportEmail": "feedback@mattermost.com"`` with string input.                                                           |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Custom Terms of Service
~~~~~~~~~~~~~~~~~~~~~~~~~

*Available in Enterprise Edition E20*.

Enable Custom Terms of Service
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. note::
  This page can only be modified using the System Console user interface.

**True**: When true, new users must accept the terms of service before accessing any Mattermost teams on desktop, web or mobile. Existing users must accept them after login or a page refresh. To update terms of service link displayed in account creation and login pages, go to **System Console > Legal and Support > Terms of Service Link**.

**False**: During account creation or login, users can review terms of service by accessing the link configured via **System Console > Legal and Support > Terms of Service link**.

Custom Terms of Service Text
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Text that will appear in your custom Terms of Service. Supports Markdown-formatted text.

Re-Acceptance Period
^^^^^^^^^^^^^^^^^^^^^

The number of days before Terms of Service acceptance expires, and the terms must be re-accepted.

Defaults to 365 days. 0 indicates the terms do not expire.

________

Mattermost App Links
~~~~~~~~~~~~~~~~~~~~

Mattermost Apps Download Page Link
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Configurable link to a download page for Mattermost Apps. When a link is present, an option to "Download Apps" will be added in the Main Menu so users can find the download page. Leave this field blank to hide the option from the Main Menu. Defaults to a page on mattermost.com where users can download the iOS, Android, and Desktop clients. If you are using an `Enterprise App Store <https://docs.mattermost.com/deployment/push.html#push-notifications-and-mobile-devices>`__ for your mobile apps, change this link to point to a customized download page where users can find the correct apps.

+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AppDownloadLink": "https://mattermost.com/download/#mattermostApps"`` with string input.                                                            |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Android App Download Link
^^^^^^^^^^^^^^^^^^^^^^^^^^

Configurable link to download the Android app. When a link is present, users who access the site on a mobile web browser will be prompted with a page giving them the option to download the app. Leave this field blank to prevent the page from appearing. If you are using an `Enterprise App Store <https://docs.mattermost.com/deployment/push.html#enterprise-app-store-eas>`__ for your mobile apps, change this link to point to the correct app.

+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AndroidAppDownloadLink": "https://play.google.com/store/apps/details?id=com.mattermost.rn/"`` with string input.                                                            |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

iOS App Download Link
^^^^^^^^^^^^^^^^^^^^^^

Configurable link to download the iOS app. When a link is present, users who access the site on a mobile web browser will be prompted with a page giving them the option to download the app. Leave this field blank to prevent the page from appearing. If you are using an `Enterprise App Store <https://docs.mattermost.com/deployment/push.html#enterprise-app-store-eas>`__ for your mobile apps, change this link to point to the correct app.

+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"IosAppDownloadLink": "https://apps.apple.com/us/app/mattermost/id1257222717/"`` with string input.                                                            |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

________

Compliance
-----------

Data Retention Policy
~~~~~~~~~~~~~~~~~~~~~

*Available in Enterprise Edition E20*

Changes to this setting require a server restart before taking effect.

.. warning:: Once a message or a file is deleted, the action is irreversible. Please be careful when setting up a custom data retention policy.

Message Retention
^^^^^^^^^^^^^^^^^^

Set how long Mattermost keeps messages in channels and direct messages.

If **Keep messages for a set amount of time** is chosen, set how many days messages are kept in Mattermost. Messages, including file attachments older than the duration you set will be deleted nightly. The minimum time is one day.

+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableMessageDeletion": false`` with options ``true`` and ``false``.                                                             |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

and

+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"MessageRetentionDays": 365`` with numerical input.                                                                               |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

File Retention
^^^^^^^^^^^^^^

Set how long Mattermost keeps file uploads in channels and direct messages.

If **Keep files for a set amount of time** is chosen, set how many days file uploads are kept in Mattermost. Files older than the duration you set will be deleted nightly. The minimum time is one day.

+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableFileDeletion": false`` with options ``true`` and ``false``.                                                                |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

and

+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"FileRetentionDays": 365`` with numerical input.                                                                                  |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Data Deletion Time
^^^^^^^^^^^^^^^^^^^

Set the start time of the daily scheduled data retention job. Choose a time when fewer people are using your system. Must be a 24-hour time stamp in the form ``HH:MM``.

This setting is based on the local time of the server.

+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"DeletionJobStartTime": "02:00"`` with 24-hour timestamp input in the form ``"HH:MM"``.                                           |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Run Deletion Job Now
^^^^^^^^^^^^^^^^^^^^^

This button initiates a Data Retention deletion job immediately.

You can monitor the status of the job in the data deletion job table below this button.

Compliance Export (Beta)
~~~~~~~~~~~~~~~~~~~~~~~~~

*Available as an add-on to Enterprise Edition E20*

Enable Compliance Export
^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Mattermost will generate a compliance export file that contains all messages that were posted in the last 24 hours. The export task is scheduled to run once per day. See the `documentation to learn more <https://docs.mattermost.com/comply/compliance-export.html>`__.

**False**: Mattermost doesn't generate a compliance export file.

+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableExport": false`` with options ``true`` and ``false``.                                                                      |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Compliance Export Time
^^^^^^^^^^^^^^^^^^^^^^^^

Set the start time of the daily scheduled compliance export job. Choose a time when fewer people are using your system. Must be a 24-hour time stamp in the form ``HH:MM``.

This setting is based on the local time of the server.

+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"DailyRunTime": 01:00`` with 24-hour timestamp input in the form ``"HH:MM"``.                                                     |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Export File Format
^^^^^^^^^^^^^^^^^^

File format of the compliance export. Corresponds to the system that you want to import the data into.

Currently supported formats are CSV, Actiance XML, and Global Relay EML.

If Global Relay is chosen, the following options will be presented:

Global Relay Customer Account
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Type of Global Relay customer account your organization has, either ``A9/Type 9`` or ``A10/Type 10``.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"CustomerType": "A9/Type 9"`` with options ``"A9/Type 9"`` and ``"A10/Type 10"``.                                        |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Global Relay SMTP Username
^^^^^^^^^^^^^^^^^^^^^^^^^^

The username for authenticating to the Global Relay SMTP server.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"SmtpUsername": ""`` with string input.                                                                                  |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Global Relay SMTP Password
^^^^^^^^^^^^^^^^^^^^^^^^^^^

The password associated with the Global Relay SMTP username.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"SmtpPassword": ""`` with string input.                                                                                  |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Global Relay Email Address
^^^^^^^^^^^^^^^^^^^^^^^^^^

The email address your Global Relay server monitors for incoming compliance exports.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EmailAddress": ""`` with string input.                                                                                  |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Run Compliance Export Job Now
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

This button initiates a Compliance Export job immediately.

You can monitor the status of the job in the compliance export job table below this button.

Advanced
--------

Advanced settings to configure rate limiting, databases, and developer options.

Rate Limiting
~~~~~~~~~~~~~

Changes to this setting require a server restart before taking effect.

Enable Rate Limiting
^^^^^^^^^^^^^^^^^^^^^

**True**: APIs are throttled at the rate specified by **PerSec**.

**False**: APIs are not throttled.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Enable": false`` with options ``true`` and ``false``.                                                                   |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Maximum Queries per Second
^^^^^^^^^^^^^^^^^^^^^^^^^^

Throttle API at this number of requests per second if rate limiting is enabled.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"PerSec": 10`` with numerical input.                                                                                     |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Maximum Burst Size
^^^^^^^^^^^^^^^^^^

Maximum number of requests allowed beyond the per second query limit.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"MaxBurst": 100`` with numerical input.                                                                                  |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Memory Store Size
^^^^^^^^^^^^^^^^^

Maximum number of user sessions connected to the system as determined by **VaryByRemoteAddr** and **VaryByHeader** variables.

Typically set to the number of users in the system.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"MemoryStoreSize": 10000`` with numerical input.                                                                         |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Vary rate limit by remote address
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Rate limit API access by IP address. Recommended to set to ``true`` if you're using a proxy.

**False**: Rate limiting does not vary by IP address.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"VaryByRemoteAddr": true`` with options ``true`` and ``false``.                                                          |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Vary rate limit by HTTP header
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Vary rate limiting by HTTP header field specified (e.g. when configuring Ngnix set to ``X-Real-IP``, when configuring AmazonELB set to ``X-Forwarded-For``). Recommended to be set if you're using a proxy.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"VaryByHeader": ""`` with string input.                                                                                  |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Vary rate limit by user
^^^^^^^^^^^^^^^^^^^^^^^

**True**: Rate limit API access by user authentication token. Recommended to set to ``true`` if you're using a proxy.

**False**: Rate limiting does not vary by user authentication token.

+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"VaryByUser": false`` with options ``true`` and ``false``.                                                              |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
________


Database
~~~~~~~~~

Changes to this setting require a server restart before taking effect.

Driver Name
^^^^^^^^^^^

This setting can only be changed from ``config.json`` file, it cannot be changed from the System Console user interface.

**mysql**: Enables driver to MySQL database.

**postgres**: Enables driver to PostgreSQL database.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"DriverName": "mysql"`` with string input.                                                                               |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Data Source
^^^^^^^^^^^

This is the connection string to the master database. When **DriverName** is set to ``postgres``, use a connection string in the form ``postgres://mmuser:password@localhost:5432/mattermost_test?sslmode=disable&connect_timeout=10``. This setting can only be changed from ``config.json`` file.

.. note::
  To enable SSL, add ``&tls=true`` to your database connection string if your SQL driver supports it. Add ``&tls=skip-verify`` if you use self-signed certificates.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"DataSource": ""`` with string input.                                                                                    |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Maximum Idle Connections
^^^^^^^^^^^^^^^^^^^^^^^^^

Maximum number of idle connections held open to the database.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"MaxIdleConns": 10`` with numerical input.                                                                               |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Maximum Open Connections
^^^^^^^^^^^^^^^^^^^^^^^^

Maximum number of open connections held open to the database.

+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"MaxOpenConns": 300`` with numerical input.                                                                               |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

SQL Query Timeout
^^^^^^^^^^^^^^^^^

The number of seconds to wait for a response from the database after opening a connection and sending the query. Errors that you see in the UI or in the logs as a result of a query timeout can vary depending on the type of query.

+-------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"QueryTimeout": 30`` with numerical input.                                  |
+-------------------------------------------------------------------------------------------------------------------------+

Maximum Connection Lifetime
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Maximum lifetime for a connection to the database, in milliseconds. Use this setting to configure the maximum amount of time a connection to the database may be reused. Defaults to an hour (3,600,000 milliseconds).

+-------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ConnMaxLifetimeMilliseconds": 3600000`` with numerical input.              |
+-------------------------------------------------------------------------------------------------------------------------+

Minimum Hashtag Length
^^^^^^^^^^^^^^^^^^^^^^^

Minimum number of characters in a hashtag. This must be greater than or equal to 2. MySQL databases must be configured to support searching strings shorter than three characters, see `documentation <https://dev.mysql.com/doc/refman/8.0/en/fulltext-fine-tuning.html>`_.

+-------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"MinimumHashtagLength": 3`` with numerical input.                           |
+-------------------------------------------------------------------------------------------------------------------------+

At Rest Encrypt Key
^^^^^^^^^^^^^^^^^^^^

A 32-character key for encrypting and decrypting sensitive fields in the database. You can generate your own cryptographically random alphanumeric string, or you can go to **System Console > Advanced > Database** and click **Regenerate**, which displays the value until you click **Save**.

When using High Availability, the salt must be identical in each instance of Mattermost.

+------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AtRestEncryptKey": ""`` with string input.  |
+------------------------------------------------------------------------------------------+

Trace
^^^^^^

**True**: Executing SQL statements are written to the log for development.

**False**: SQL statements are not written to the log.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Trace": false`` with options ``true`` and ``false``.                                                                    |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Recycle Database Connections
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

*Available in Enterprise Edition E20*

This button reconnects to the database listed in the configuration settings. All old connections are closed after 20s.

The workflow for failover without downing the server is to change the database line in the ``config.json`` file, click **Reload Configuration from Disk** in the General > Configuration section then click **Recycle Database Connections**.

________

Elasticsearch
~~~~~~~~~~~~~~

*Available in Enterprise Edition E20*

Changes to properties in this section require a server restart before taking effect.

Enable Elasticsearch Indexing
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Indexing of new posts occurs automatically. Search queries will use database search until "Enable Elasticsearch for search queries" is enabled. `Learn more about Elasticsearch in our documentation <https://docs.mattermost.com/deployment/elasticsearch.html>`__.

**False**: Elasticsearch indexing is disabled and new posts are not indexed. If indexing is disabled and re-enabled after an index is created, it is recommended to purge and rebuild the index to ensure complete search results.

+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableIndexing": false`` with options ``true`` and ``false``.                                                                    |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Server Connection Address
^^^^^^^^^^^^^^^^^^^^^^^^^

The address of the Elasticsearch server. `Learn more about Elasticsearch in our documentation <https://docs.mattermost.com/deployment/elasticsearch.html>`__.

+------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ConnectionUrl": ""`` with string input.                                   |
+------------------------------------------------------------------------------------------------------------------------+

Server Username
^^^^^^^^^^^^^^^

(Optional) The username to authenticate to the Elasticsearch server.

+-------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Username": ""`` with string input.                                   |
+-------------------------------------------------------------------------------------------------------------------+

Server Password
^^^^^^^^^^^^^^^^

(Optional) The password to authenticate to the Elasticsearch server.

+-------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Password": ""`` with string input.                                   |
+-------------------------------------------------------------------------------------------------------------------+

Enable Cluster Sniffing
^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Sniffing finds and connects to all data nodes in your cluster automatically.

**False**: Sniffing is disabled.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Sniff": false`` with options ``true`` and ``false``.                                                                    |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Bulk Indexing
^^^^^^^^^^^^^

This button starts a bulk index of all existing posts in the database. If the indexing process is cancelled the index and search results will be incomplete. 

Purge Indexes
^^^^^^^^^^^^^^

This button purges the entire Elasticsearch index. Typically only used if the index has corrupted and search is not behaving as expected. After purging the index a new index can be created with the **Bulk Index** button.

Enable Elasticsearch for search queries
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Elasticsearch will be used for all search queries using the latest index. Search results may be incomplete until a bulk index of the existing post database is finished.

**False**: Database search is used for search queries.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableSearching": false`` with options ``true`` and ``false``.                                                          |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

________


Developer
~~~~~~~~~~~~~~~~~~~~~~~~~

Enable Testing Commands
^^^^^^^^^^^^^^^^^^^^^^^^

**True**: ``/test`` slash command is enabled to load test accounts and test data.

**False**: ``/test`` slash command is disabled.

Changes to this setting require a server restart before taking effect.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableTesting": false`` with options ``true`` and ``false``.                                                            |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable Developer Mode
^^^^^^^^^^^^^^^^^^^^^

**True**: Javascript errors are shown in a purple bar at the top of the user interface. Not recommended for use in production.

**False**: Users are not alerted to Javascript errors.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableDeveloper": false`` with options ``true`` and ``false``.                                                          |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Allow untrusted internal connections to
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

This setting limits the ability for the Mattermost server to make untrusted requests within its local network. A request is considered "untrusted" when it's made on behalf of a client. The following features make untrusted requests and are affected by this setting:

- Integrations using webhooks, slash commands, or message actions. This prevents them from requesting endpoints within the local network.
- Link previews. When a link to a local network address is posted in a chat message, this prevents a link preview from being displayed.
- The `local image proxy <https://docs.mattermost.com/administration/image-proxy.html#local-image-proxy>`_. If the local image proxy is enabled, images located on the local network cannot be used by integrations or posted in chat messages.

Requests that can only be configured by Admins are considered trusted and will not be affected by this setting. Trusted URLs include ones used for OAuth login or for sending push notifications.

.. warning:: 
   This setting is intended to prevent users located outside your local network from using the Mattermost server to request confidential data from inside your network. Care should be used when configuring this setting to prevent unintended access to your local network.

Some examples of when you may want to modify this setting include:

- When installing a plugin that includes its own images, such as `Matterpoll <https://github.com/matterpoll/matterpoll>`__, you will need to add the Mattermost server's domain name to this list.
- When running a bot or webhook-based integration on your local network, you will need to add the hostname of the bot/integration to this list.
- If your network is configured in such a way that publicly accessible webpages or images are accessed by the Mattermost server using their internal IP address, the hostnames for those servers must be added to this list.

This setting is a whitelist of local network addresses that can be requested by the Mattermost server. It is configured as a whitespace separated list of hostnames, IP addresses and CIDR ranges that can be accessed such as ``webhooks.internal.example.com 127.0.0.1 10.0.16.0/28``. Since v5.9 the public IP of the Mattermost application server itself is also considered a reserved IP.

IP address and domain name rules are applied before host resolution. CIDR rules are applied after host resolution. For example, if the domain "webhooks.internal.example.com" resolves to the IP address 10.0.16.20, a webhook with the URL "https://webhooks.internal.example.com/webhook" can be whitelisted using ``webhooks.internal.example.com`` or ``10.0.16.16/28``, but not ``10.0.16.20``.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AllowedUntrustedInternalConnections": ""`` with string input.                                                           |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
________________________________________________________________________________________________________________________________________________________________________

.. _high-availability:

High Availability
~~~~~~~~~~~~~~~~~~

*Available in Enterprise Edition E20*

Changes to properties in this section require a server restart before taking effect.

When High Availability mode is enabled, the System Console is set to read-only and settings can only be changed by editing the configuration file directly. However, for testing and validating a High Availability setup, you can set *ReadOnlyConfig* to ``false``, which allows changes made in the System Console to be saved back to the configuration file.

To learn more about configuring High Availability, see `High Availability Cluster <../deployment/cluster.html>`__.

Enable High Availability Mode
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: The Mattermost Server will attempt inter-node communication with the other servers in the cluster that have the same Cluster Name. This sets the System Console to read-only mode to keep the servers ``config.json`` files in sync.

**False**: Mattermost high availability is disabled.

+-----------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Enable": false`` with options ``true`` and ``false``.  |
+-----------------------------------------------------------------------------------------------------+

Cluster Name
^^^^^^^^^^^^

The cluster to join by name. Only nodes with the same cluster name will join together. This is to support blue-green deployments or staging pointing to the same database.

+------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ClusterName": ""`` with string input. |
+------------------------------------------------------------------------------------+

Override Hostname
^^^^^^^^^^^^^^^^^

If blank, Mattermost attempts to get the hostname from the OS or use the IP address. You can override the hostname of this server with this property. It is not recommended to override the Hostname unless needed. This property can also be set to a specific IP address if needed. Also see `cluster discovery <https://docs.mattermost.com/deployment/cluster.html#cluster-discovery>`_ for more details.

+-----------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"OverrideHostname": ""`` with string input. |
+-----------------------------------------------------------------------------------------+

Use IP Address
^^^^^^^^^^^^^^

**True**: The cluster attempts to communicate using the IP address.

**False**: The cluster attempts to communicate using the hostname.

+---------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"UseIpAddress": true`` with options ``true`` and ``false``. |
+---------------------------------------------------------------------------------------------------------+

Use Experimental Gossip
^^^^^^^^^^^^^^^^^^^^^^^

**True**: The server attempts to communicate via the gossip protocol over the gossip port.

**False**: The server attempts to communicate over the streaming port.

Note that the gossip port and gossip protocol are used to determine cluster health even when this setting is ``false``.

+-------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"UseExperimentalGossip": false`` with options ``true`` and ``false``. |
+-------------------------------------------------------------------------------------------------------------------+

Read Only Config
^^^^^^^^^^^^^^^^

**True**: Changes made to settings in the System Console are ignored.

**False**: Changes made to settings in the System Console are written to ``config.json``.

When running in production it is recommended to set this to ``true``.

+-----------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ReadOnlyConfig": true`` with options ``true`` and ``false``. |
+-----------------------------------------------------------------------------------------------------------+

Gossip Port
^^^^^^^^^^^

The port used for the gossip protocol. Both UDP and TCP should be allowed on this port.

+-------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"GossipPort": 8074`` with numerical input.    |
+-------------------------------------------------------------------------------------------+

Streaming Port
^^^^^^^^^^^^^^

The port used for streaming data between servers.

+----------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"StreamingPort": 8075`` with numerical input.    |
+----------------------------------------------------------------------------------------------+

Inter-Node Listen Address
^^^^^^^^^^^^^^^^^^^^^^^^^

*Deprecated. Not used in version 4.0 and later*

The address the Mattermost Server will listen on for inter-node communication. When setting up your network you should secure the listen address so that only machines in the cluster have access to that port. This can be done in different ways, for example, using IPsec, security groups, or routing tables.

+-----------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"InterNodeListenAddress": ":8075"`` with string input.  |
+-----------------------------------------------------------------------------------------------------+

Inter-Node URLs
^^^^^^^^^^^^^^^

*Deprecated. Not used in version 4.0 and later*

A list of all the machines in the cluster, separated by commas, for example, ``["http://10.10.10.2", "http://10.10.10.4"]``. It is recommended to use the internal IP addresses so all the traffic can be secured.

+--------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"InterNodeUrls": []`` with string array input consisting of the machines in the cluster. |
+--------------------------------------------------------------------------------------------------------------------------------------+

________________________________________________________________________________________________________________________________________________________________________

Performance Monitoring
~~~~~~~~~~~~~~~~~~~~~~~~~

*Available in Enterprise Edition E20*

Changes to properties in this section require a server restart before taking effect.

Enable Performance Monitoring
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Mattermost enables performance monitoring collection and profiling. Please see `documentation <https://docs.mattermost.com/deployment/metrics.html>`__ to learn more about configuring performance monitoring for Mattermost.

**False**: Mattermost performance monitoring is disabled.

+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Enable": false`` with options ``true`` and ``false``.                                                                             |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+


Listen Address
^^^^^^^^^^^^^^

The address the Mattermost server will listen on to expose performance metrics.

+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"InterNodeListenAddress": ":8067"`` with string input.                                                                          |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

------

Settings configurable only in ``config.json``
--------------------------------------------

There are a number of settings customizable in ``config.json`` unavailable in the System Console and require updating from the file itself.

Service Settings
~~~~~~~~~~~~~~~~

WebSocket URL
^^^^^^^^^^^^^^

This setting allows the server to instruct clients where they should try to connect WebSockets to.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"WebsocketURL": ""`` with string input.                                                                                  |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

License File Location
^^^^^^^^^^^^^^^^^^^^^

Path and filename of the license file on disk. On startup, if Mattermost cannot find a valid license in the database from a previous upload, it looks here. It can be an absolute path or a path relative to the ``mattermost`` directory.

+---------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"LicenseFileLocation": ""`` with string input.  |
+---------------------------------------------------------------------------------------------+

TLS Minimum Version
^^^^^^^^^^^^^^^^^^^^

The minimum TLS version used by the Mattermost server. TLS v1.2 is default given insecurities for TLS 1.0 and 1.1.

This setting only takes effect if you are using the built-in server binary directly, and not using a reverse proxy layer such as NGINX.

+-------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"TLSMinVer": "1.2"`` with string input. |
+-------------------------------------------------------------------------------------+

Enable Strict Transport Security (HSTS)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Adds the Strict Transport Security (HSTS) header to all responses, forcing the browser to request all resources via HTTPS. Learn more `here <https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security>`__.

**False**: No restrictions on TLS transport. Strict Transport Security (HSTS) header is not added to responses.

+--------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"TLSStrictTransport": false`` with options ``true`` and ``false``.                                         |
+--------------------------------------------------------------------------------------------------------------------------------------------------------+

Secure TLS Transport Expiry
^^^^^^^^^^^^^^^^^^^^^^^^^^^

The time in seconds that the browser remembers a site is only to be accessed using HTTPS. After this period, a site can be accessed using HTTP unless ``TLSStrictTransport`` is set to ``true``. Defaults to two years. Learn more `here <https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security>`__.

+-------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"TLSStrictTransportMaxAge": 63072000`` with numerical input.    |
+-------------------------------------------------------------------------------------------------------------+

TLS Cipher Overwrites
^^^^^^^^^^^^^^^^^^^^^^

Set TLS ciphers overwrites to meet requirements from legacy clients which don't support modern ciphers, or to limit the types of accepted ciphers.

If none specified, the Mattermost server assumes a set of currently considered secure ciphers, and allows overwrites in the edge case. See the ``ServerTLSSupportedCiphers`` variable in `/model/config.go <https://github.com/mattermost/mattermost-server/blob/master/model/config.go>`__ for the list of ciphers considered secure.

This setting only takes effect if you are using the built-in server binary directly, and not using a reverse proxy layer such as NGINX.

+-------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"TLSStrictTransportMaxAge": 63072000`` with numerical input.    |
+-------------------------------------------------------------------------------------------------------------+

Go Routine Health Threshold
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Set a threshold on the number of Go Routines when the Mattermost system is considered to be in a healthy state. When Go Routines exceed this limit, a warning is returned in the server logs.

To turn off checking for the threshold, set this value to ``-1``.

+----------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"GoroutineHealthThreshold": -1`` with numerical input.       |
+----------------------------------------------------------------------------------------------------------+

Allow Cookies for Subdomains
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Allows cookies for subdomains by setting the domain parameter on Mattermost cookies.

**False**: Cookies not allowed for subdomains.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AllowCookiesForSubdomains": true`` with options ``true`` and ``false``.                                                 |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Cluster Log Timeout
^^^^^^^^^^^^^^^^^^^

This setting defines the frequency of cluster request time logging for :doc:`../deployment/metrics`, measured in milliseconds.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ClusterLogTimeoutMilliseconds": 2000`` with numerical input.                                                            |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable Searching of Posts
^^^^^^^^^^^^^^^^^^^^^^^^^

If this setting is enabled, users can search messages. Disabling search can result in a performance increase, but users get an error message when they attempt to use the search box.

+-------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnablePostSearch": true`` with options ``true`` and ``false``. |
+-------------------------------------------------------------------------------------------------------------+

Enable User Typing Messages
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

This setting determines whether "user is typing..." messages are displayed below the message box. Disabling the setting in larger deployments may improve server performance.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableUserTypingMessages": true`` with options ``true`` and ``false``.                                                  |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Time Between User Typing Updates
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

This setting defines how frequently "user is typing..." messages are updated, measured in milliseconds.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"TimeBetweenUserTypingUpdatesMilliseconds": 5000`` with numerical input.                                                 |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable User Status Updates
^^^^^^^^^^^^^^^^^^^^^^^^^^

Turn status updates off to improve performance. When status updates are off, users appear online only for brief periods when posting a message, and only to members of the channel in which the message is posted.

+---------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableUserStatuses": true`` with options ``true`` and ``false``. |
+---------------------------------------------------------------------------------------------------------------+

Enable Channel Viewed WebSocket Messages
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

This setting determines whether channel_viewed WebSocket events are sent, which synchronize unread notifications across clients and devices. Disabling the setting in larger deployments may improve server performance.

+------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableChannelViewedMessages": true`` with options ``true`` and ``false``. |
+------------------------------------------------------------------------------------------------------------------------+

Segment Write Key
^^^^^^^^^^^^^^^^^

*Removed in March 16, 2017 release*

For deployments seeking additional tracking of system behavior using Segment.com, you can enter a Segment WRITE_KEY using this field. This value works like a tracking code and is used in client-side Javascript and will send events to Segment.com attributed to the account you used to generate the WRITE_KEY.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"SegmentDeveloperKey": ""`` with string input.                                                                           |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

WebSocket Secure Port
^^^^^^^^^^^^^^^^^^^^^

(Optional) This setting defines the port on which the secured WebSocket will listen using the ``wss`` protocol. Defaults to ``443``. When the client attempts to make a WebSocket connection it first checks to see if the page is loaded with HTTPS. If so, it will use the secure WebSocket connection. If not, it will use the unsecure WebSocket connection. IT IS HIGHLY RECOMMENDED PRODUCTION DEPLOYMENTS ONLY OPERATE UNDER HTTPS AND WSS.

Changes to this setting require a server restart before taking effect.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"WebsocketSecurePort" : 443`` with numerical input.                                                                      |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

WebSocket Port
^^^^^^^^^^^^^^

(Optional) This setting defines the port on which the unsecured WebSocket will listen using the ``ws`` protocol. Defaults to ``80``. When the client attempts to make a WebSocket connection it first checks to see if the page is loaded with HTTPS. If so, it will use the secure WebSocket connection. If not, it will use the unsecure WebSocket connection. IT IS HIGHLY RECOMMENDED PRODUCTION DEPLOYMENTS ONLY OPERATE UNDER HTTPS AND WSS.

Changes to this setting require a server restart before taking effect.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``WebsocketPort": 80`` with numerical input.                                                                               |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable API Team Deletion
^^^^^^^^^^^^^^^^^^^^^^^^

**True**: The ``api/v4/teams/{teamid}?permanent=true`` API endpoint can be called by Team and System Admins to permanently delete a team.

**False**: The API endpoint cannot be called. Note that ``api/v4/teams/{teamid}`` can still be used to soft delete a team.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableAPITeamDeletion": false`` with options ``true`` and ``false``.                                                    |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

SQL Settings
~~~~~~~~~~~~

Enable Public Channels Materialization
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

*Removed in December 16, 2018 release. The public channel materialization feature has become a permanent feature after thoroughly tested for performance.*

**True**: Enables materialization of public channels to increase channel search performance in the channel switcher (CTRL/CMD+K), channel autocomplete (~) and elsewhere in the UI. Notably, this allows the database to exclude direct messages for many queries, resulting in better query plans and more efficient indexes.

**False**: Disables materialization for public channels. 

If this feature is disabled and then later re-enabled, an offline migration is necessary to synchronize the materialized table. Use the following steps:

1. Shut down your application servers.
2. Connect to your Mattermost database.
3. Execute the following queries:

.. code:: sql

  DELETE FROM PublicChannels;
  INSERT INTO PublicChannels
      (Id, DeleteAt, TeamId, DisplayName, Name, Header, Purpose)
  SELECT
      c.Id, c.DeleteAt, c.TeamId, c.DisplayName, c.Name, c.Header, c.Purpose
  FROM
      Channels c
  WHERE
      c.Type = 'O';

The queries above rebuild the materialized ``PublicChannels`` table without modifying the authoritative ``Channels`` table.

+---------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnablePublicChannelsMaterialization": true`` with options ``true`` and ``false``.                    |
+---------------------------------------------------------------------------------------------------------------------------------------------------+

Read Replicas (Enterprise Edition)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Specifies the connection strings for the read replica databases. Each string must be in the same form as used for the `Data Source`_ setting.

Changes to this setting require a server restart before taking effect.

+---------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"DataSourceReplicas": []`` with string array input consisting of database connection strings.   |
+---------------------------------------------------------------------------------------------------------------------------------------------+

Search Replicas (Enterprise Edition)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Specifies the connection strings for the search replica databases. A search replica is similar to a read replica, but is used only for handling search queries. Each string must be in the same form as used for the `Data Source`_ setting.

Changes to this setting require a server restart before taking effect.

+---------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"DataSourceSearchReplicas": []`` with string array input consisting of database connection strings.   |
+---------------------------------------------------------------------------------------------------------------------------------------------------+

Team Settings
~~~~~~~~~~~~~

User Status Away Timeout
^^^^^^^^^^^^^^^^^^^^^^^^^

This setting defines the number of seconds after which the user's status indicator changes to "Away", when they are away from Mattermost.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"UserStatusAwayTimeout": 300`` with numerical input.                                                                     |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

________

File Settings
~~~~~~~~~~~~~

Initial Font
^^^^^^^^^^^^^

Font used in auto-generated profile pics with colored backgrounds.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"InitialFont": "luximbi.ttf"`` with string input.                                                                        |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Amazon S3 Bucket Endpoint
^^^^^^^^^^^^^^^^^^^^^^^^^^

Set an endpoint URL for Amazon S3 buckets.

*Removed in November 16th, 2016 release*

+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AmazonS3BucketEndpoint": ""`` with string input.                                                                         |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Amazon S3 Location Constraint
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: S3 region is location constrained.

**False**: S3 region is not location constrained.

*Removed in November 16th, 2016 release*

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AmazonS3LocationConstraint": false`` with options ``true`` and ``false``.                                               |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Amazon S3 Lowercase Bucket
^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: S3 bucket names are fully lowercase.

**False**: S3 bucket names may contain uppercase and lowercase letters.

*Removed in November 16th, 2016 release*

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AmazonS3LowercaseBucket": false`` with options ``true`` and ``false``.                                                  |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Amazon S3 Signature V2
^^^^^^^^^^^^^^^^^^^^^^

By default, Mattermost uses Signature V4 to sign API calls to AWS, but under some circumstances, V2 is required. For more information about when to use V2, see https://docs.aws.amazon.com/general/latest/gr/signature-version-2.html

**True**: Use Signature Version 2 Signing Process.

**False**: Use Signature Version 4 Signing Process.

+------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AmazonS3SignV2": false`` with options ``true`` and ``false``. |
+------------------------------------------------------------------------------------------------------------+

Email Settings
~~~~~~~~~~~~~~~~~~~~~~~~~

Email Batching Buffer Size
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Specify the maximum number of notifications batched into a single email.

+--------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``EmailBatchingBufferSize": 256`` with numerical input.                        |
+--------------------------------------------------------------------------------------------------------------------------+

Email Batching Interval
^^^^^^^^^^^^^^^^^^^^^^^^

Specify the maximum frequency, in seconds, which the batching job checks for new notifications. Longer batching intervals will increase performance.

+-----------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``EmailBatchingInterval": 30`` with numerical input.                        |
+-----------------------------------------------------------------------------------------------------------------------+

Skip Server Certificate Verification
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Do not validate SMTP servers when connecting to them.

**False**: Validate SMTP servers when connecting to them.

+-------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"SkipServerCertificateVerification": false`` with options ``true`` and ``false``. |
+-------------------------------------------------------------------------------------------------------------------------------+

Login Button Color
^^^^^^^^^^^^^^^^^^

Specify the color of the email login button for white labeling purposes. Use a hex code with a #-sign before the code. This setting only applies to the mobile apps.

+-------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"LoginButtonColor": ""`` with string input.                                       |
+-------------------------------------------------------------------------------------------------------------------------------+

Login Button Border Color
^^^^^^^^^^^^^^^^^^^^^^^^^

Specify the color of the email login button border for white labeling purposes. Use a hex code with a #-sign before the code. This setting only applies to the mobile apps.

+-------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"LoginButtonBorderColor": ""`` with string input.                                 |
+-------------------------------------------------------------------------------------------------------------------------------+

Login Button Text Color
^^^^^^^^^^^^^^^^^^^^^^^

Specify the color of the email login button text for white labeling purposes. Use a hex code with a #-sign before the code. This setting only applies to the mobile apps.

+-------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"LoginButtonTextColor": ""`` with string input.                                   |
+-------------------------------------------------------------------------------------------------------------------------------+

________

GitLab Settings
~~~~~~~~~~~~~~~

Scope
^^^^^^

Standard setting for OAuth to determine the scope of information shared with OAuth client. Not currently supported by GitLab OAuth.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Scope": ""`` with string input.                                                                                         |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

________

Google Settings
~~~~~~~~~~~~~~~

Scope
^^^^^^

Standard setting for OAuth to determine the scope of information shared with OAuth client. Recommended setting is ``profile email``.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Scope": "profile email"`` with string input.                                                                            |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

________

Office 365 Settings
~~~~~~~~~~~~~~~~~~~

Scope
^^^^^^

Standard setting for OAuth to determine the scope of information shared with OAuth client. Recommended setting is ``User.Read``.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Scope": "User.Read"`` with string input.                                                                                |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

________

AD/LDAP Settings
^^^^^^^^^^^^^^^^

Login Button Color
^^^^^^^^^^^^^^^^^^^

Specify the color of the AD/LDAP login button for white labeling purposes. Use a hex code with a #-sign before the code. This setting only applies to the mobile apps.

+-------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"LoginButtonColor": ""`` with string input.                                       |
+-------------------------------------------------------------------------------------------------------------------------------+

Login Button Border Color
^^^^^^^^^^^^^^^^^^^^^^^^^

Specify the color of the AD/LDAP login button border for white labeling purposes. Use a hex code with a #-sign before the code. This setting only applies to the mobile apps.

+-------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"LoginButtonBorderColor": ""`` with string input.                                 |
+-------------------------------------------------------------------------------------------------------------------------------+

Login Button Text Color
^^^^^^^^^^^^^^^^^^^^^^^

Specify the color of the AD/LDAP login button text for white labeling purposes. Use a hex code with a #-sign before the code. This setting only applies to the mobile apps.

+-------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"LoginButtonTextColor": ""`` with string input.                                   |
+-------------------------------------------------------------------------------------------------------------------------------+

________

SAML Settings
^^^^^^^^^^^^^

Login Button Color
^^^^^^^^^^^^^^^^^^^

Specify the color of the SAML login button for white labeling purposes. Use a hex code with a #-sign before the code. This setting only applies to the mobile apps.

+-------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"LoginButtonColor": ""`` with string input.                                       |
+-------------------------------------------------------------------------------------------------------------------------------+

Login Button Border Color
^^^^^^^^^^^^^^^^^^^^^^^^^^

Specify the color of the SAML login button border for white labeling purposes. Use a hex code with a #-sign before the code. This setting only applies to the mobile apps.

+-------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"LoginButtonBorderColor": ""`` with string input.                                 |
+-------------------------------------------------------------------------------------------------------------------------------+

Login Button Text Color
^^^^^^^^^^^^^^^^^^^^^^^^

Specify the color of the SAML login button text for white labeling purposes. Use a hex code with a #-sign before the code. This setting only applies to the mobile apps.

+-------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"LoginButtonTextColor": ""`` with string input.                                   |
+-------------------------------------------------------------------------------------------------------------------------------+

________

Cluster Settings
~~~~~~~~~~~~~~~~~

Maximum Idle Connections
^^^^^^^^^^^^^^^^^^^^^^^^^

The maximum number of idle connections held open from one server to all others in the cluster.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"MaxIdleConns": 100`` with numerical input.                                                                              |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Maximum Idle Connections per Host
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The maximum number of idle connections held open from one server to another server in the cluster.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"MaxIdleConnsPerHost": 128`` with numerical input.                                                                       |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Idle Connection Timeout (in Milliseconds)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The number of milliseconds to leave an idle connection open between servers in the cluster.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"IdleConnTimeoutMilliseconds": 90000`` with numerical input.                                                             |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

________

Metrics Settings
~~~~~~~~~~~~~~~~~

Block Profile Rate
^^^^^^^^^^^^^^^^^^^

Value that controls the `fraction of goroutine blocking events reported in the blocking profile <https://golang.org/pkg/runtime/#SetBlockProfileRate>`__.

The profiler aims to sample an average of one blocking event per rate nanoseconds spent blocked.

To include every blocking event in the profile, set the rate to ``1``. To turn off profiling entirely, set the rate to ``0``.

Changes to this setting require a server restart before taking effect.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"BlockProfileRate": 0`` with options ``0`` and ``1``.                                                                    |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Experimental Settings
~~~~~~~~~~~~~~~~~~~~~~~~~

*Available in Enterprise Edition E20*

Enable Client-Side Certification
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Enables client-side certification for your Mattermost server. See `documentation <https://docs.mattermost.com/deployment/certificate-based-authentication.html>`__ to learn more.

**False**: Client-side certification is disabled.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ClientSideCertEnable": false`` with options ``true`` and ``false``.                                                     |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Client-Side Certification Login Method
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Used in combination with the ``ClientSideCertEnable`` setting.

**Primary**: After the client side certificate is verified, user's email is retrieved from the certificate and is used to log in without a password.

**Secondary**: After the client side certificate is verified, user's email is retrieved from the certificate and matched against the one supplied by the user. If they match, the user logs in with regular email/password credentials.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ClientSideCertCheck": "secondary"`` with options ``"primary"`` and ``"secondary"``.                                     |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Disable Post Metadata 
^^^^^^^^^^^^^^^^^^^^^^

**True**: Disabling post metadata is only recommended if you are experiencing a significant decrease in performance around channel and post load times. 

**False**: Load channels with more accurate scroll positioning by loading post metadata.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"DisablePostMetadata": false`` with options ``true`` and ``false``.                                                      |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Link Metadata Timeout
^^^^^^^^^^^^^^^^^^^^^

Adds a configurable timeout for requests made to return link metadata. If the metadata is not returned before this timeout expires, the message will post without requiring metadata. This timeout covers the failure cases of broken URLs and bad content types on slow network connections.

+---------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"LinkMetadataTimeoutMilliseconds": 5000`` with numerical input.                     |
+---------------------------------------------------------------------------------------------------------------------------------+

Analytics Settings
~~~~~~~~~~~~~~~~~~~

*Available in Enterprise Edition E10 and higher*

Maximum Users for Statistics
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Sets the maximum number of users on the server before statistics for total posts, total hashtag posts, total file posts, posts per day, and active users with posts per day are disabled.

This setting is used to maximize performance for large Enterprise deployments.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"MaxUsersForStatistics": 2500`` with numerical input.                                                                    |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Elasticsearch Settings (Beta)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Post Index Replicas
^^^^^^^^^^^^^^^^^^^^^

The number of replicas to use for each post index. If this setting is changed, it only applies to newly created indexes. To apply the change to existing indexes, purge and rebuild the index after changing this setting.

+---------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"PostIndexReplicas": 2`` with numerical input.        |
+---------------------------------------------------------------------------------------------------+

Post Index Shards
^^^^^^^^^^^^^^^^^

The number of shards to use for each post index. If this setting is changed, it only applies to newly created indexes. To apply the change to existing indexes, purge and rebuild the index after changing this setting.

+-------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"PostIndexShards": 1`` with numerical input.        |
+-------------------------------------------------------------------------------------------------+

Aggregate Search Indexes
^^^^^^^^^^^^^^^^^^^^^^^^

Elasticsearch indexes over the age specified by this setting will be aggregated during the daily scheduled job.

+-----------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AggregatePostsAfterDays": 365`` with numerical input.        |
+-----------------------------------------------------------------------------------------------------------+

Post Aggregator Start Time
^^^^^^^^^^^^^^^^^^^^^^^^^^^

The start time of the daily scheduled aggregator job. Must be a 24-hour time stamp in the form ``HH:MM``.

This setting is based on the local time of the server.

+--------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"PostsAggregatorJobStartTime": "03:00"`` with 24-hour timestamp input in the form ``"HH:MM"``. |
+--------------------------------------------------------------------------------------------------------------------------------------------+

Index Prefix
^^^^^^^^^^^^^

Prefix on the Elasticsearch index name. Enables the use of Mattermost Elasticsearch on a shared Elasticsearch cluster.

+----------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"IndexPrefix": ""`` with string input.     |
+----------------------------------------------------------------------------------------+

Live Indexing Batch Size
^^^^^^^^^^^^^^^^^^^^^^^^^^^

Determines how many new posts are batched together before they are added to the Elasticsearch index. It may be necessary to increase this value to avoid hitting the rate limit of your Elasticsearch cluster on installs handling multiple messages per second.

+--------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"LiveIndexingBatchSize": 1`` with numerical input.         |
+--------------------------------------------------------------------------------------------------------+

Request Timeout
^^^^^^^^^^^^^^^

Timeout in seconds for Elasticseaerch calls.

+-------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"RequestTimeoutSeconds": 30`` with numerical input.       |
+-------------------------------------------------------------------------------------------------------+

Bulk Indexing Time Window
^^^^^^^^^^^^^^^^^^^^^^^^^

Determines the maximum time window for a batch of posts being indexed by the Bulk Indexer. This setting servers as a performance optimisation for installs with over ~10 million posts in the database. Approximate this value based on the average number of seconds for 2,000 posts to be added to the database on a typical day in production. Setting this value too low will cause Bulk Indexing jobs to run slowly.

+-----------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"BulkIndexingTimeWindowSeconds": 3600`` with numerical input.       |
+-----------------------------------------------------------------------------------------------------------------+

________

Message Export Settings
~~~~~~~~~~~~~~~~~~~~~~~

Export From Timestamp
^^^^^^^^^^^^^^^^^^^^^

Set the Unix timestamp (seconds since epoch, UTC) to export data from.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ExportFromTimestamp": 0`` with numerical input.                                                                         |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

File Location
^^^^^^^^^^^^^

Set the file location of the compliance exports.

By default, they are written to the ``exports`` subdirectory of the configured `Local Storage directory <https://docs.mattermost.com/administration/config-settings.html#storage>`.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"FileLocation": "export"`` with string input.                                                                            |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Batch Size
^^^^^^^^^^^

Determines how many new posts are batched together to a compliance export file.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"BatchSize": 10000`` with numerical input.                                                                               |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Plugin Settings (Beta)
~~~~~~~~~~~~~~~~~~~~~~

Enable Plugin Uploads
^^^^^^^^^^^^^^^^^^^^^^

**True**: Enables plugin uploads by System Admins at **Plugins > Management**. If you do not plan to upload a plugin, set to false to control which plugins are installed on your server. See `documentation <https://developers.mattermost.com/integrate/admin-guide/admin-plugins-beta/>`__ to learn more.

**False**: Disables plugin uploads on your Mattermost server.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableUploads": false`` with options ``true`` and ``false``.                                                            |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Directory
^^^^^^^^^^
The location of the plugin files. If blank, they are stored in the ``./plugins`` directory. The path that you set must exist and Mattermost must have write permissions in it.

+-----------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"Directory": "./plugins"`` with string input.                       |
+-----------------------------------------------------------------------------------------------------------------+

------

Experimental Settings
---------------------

There are a number of settings considered "experimental" and these may be replaced or removed in a future release.

Service Settings
~~~~~~~~~~~~~~~~~

Enable Tutorial (Experimental)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Users are prompted with a tutorial when they open Mattermost for the first time after account creation.

**False**: The tutorial is disabled. Users are placed in Town Square when they open Mattermost for the first time after account creation.

+--------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableTutorial": true`` with options ``true`` and ``false``.                                  |
+--------------------------------------------------------------------------------------------------------------------------------------------+

Enable Default Channel Leave/Join System Messages
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

This setting determines whether team leave/join system messages are posted in the default ``town-square`` channel.

**True**: Enables leave/join system messages in the default ``town-square`` channel.

**False**: Disables leave/join messages from the default ``town-square`` channel. These system messages won't be added to the database either.

+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ExperimentalEnableDefaultChannelLeaveJoinMessages": true`` with options ``true`` and ``false``.                                  |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Allow Authentication Transfer (Experimental)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

*Available in Enterprise Edition E10 and higher*

**True**: Users can change their sign-in method to any that is enabled on the server, either via Account Settings or the APIs.

**False**: Users cannot change their sign-in method, regardless of which authentication options are enabled.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ExperimentalEnableAuthenticationTransfer": true`` with options ``true`` and ``false``.                                  |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Autoclose Direct Messages in Sidebar (Experimental)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: By default, direct message conversations with no activity for 7 days will be hidden from the sidebar. Users can disable this in **Account Settings > Sidebar**.

**False**: Conversations remain in the sidebar until they are manually closed.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"CloseUnusedDirectMessages": false`` with options ``true`` and ``false``.                                                |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable Preview Features (Experimental)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Preview features can be enabled from **Account Settings > Advanced > Preview pre-release features**.

**False**: Disables and hides preview features from **Account Settings > Advanced > Preview pre-release features**.

+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnablePreviewFeatures": true`` with options ``true`` and ``false``.                                                    |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Sidebar Organization (Experimental)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Enables channel sidebar organization options in **Account Settings > Sidebar > Channel grouping and sorting** including options for grouping unread channels, sorting channels by most recent post and combining all channel types into a single list. 

**False**: Hides the channel sidebar organization options in **Account Settings > Sidebar > Channel grouping and sorting**.

+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ExperimentalChannelOrganization": false`` with options ``true`` and ``false``.                                         |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Group Unread Channels (Experimental)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

*Removed in December 16, 2018 release and replaced by a new ExperimentalChannelOrganization setting*

**Disabled**: Unread channels section is disabled for all users.

**Default On**: Enables the unread channels sidebar section by default. Users can turn it off in **Account Settings > Sidebar**.

**Default Off**: Disables the unread channels sidebar section by default. Users can turn it on in **Account Settings > Sidebar**.

+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ExperimentalGroupUnreadChannels": "disabled"`` with options ``"disabled"``, ``"default_on"``, and ``"default_off"``.                          |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable Hardened Mode (Experimental)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Enables a hardened mode for Mattermost that makes user experience trade-offs in the interest of security.

**False**: Disables hardened mode.

Changes made when hardened mode is enabled:

    - Failed login returns a generic error message instead of a specific message for username and password.
    - If `multi-factor authentication (MFA) <https://docs.mattermost.com/deployment/auth.html>`__ is enabled, the route to check if a user has MFA enabled always returns true. This causes the MFA input screen to appear even if the user does not have MFA enabled. The user may enter any value to pass the screen. Note that hardened mode does not affect user experience when MFA is enforced.
    - Password reset does not inform the user that they can not reset their SSO account through Mattermost and instead claims to have sent the password reset email.
    - Mattermost sanitizes all 500 errors before returned to the client. Use the supplied ``request_id`` to match user facing errors with the server logs.

+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ExperimentalEnableHardenedMode": false`` with options ``true`` and ``false``.                                          |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable AD/LDAP Group Sync (Experimental)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

*Available in Enterprise Edition E20*

**True**: Enables AD/LDAP Group Sync configurable under **Access Controls > Groups**.

**False**: Disables AD/LDAP Group Sync and removes the **Access Controls > Groups** from the System Console.  

For more information on AD/LDAP Group Sync, please see the `AD/LDAP Group Sync documentation <https://docs.mattermost.com/deployment/ldap-group-sync.html>`_.

+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ExperimentalLdapGroupSync": false`` with options ``true`` and ``false``.                                               |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Strict CSRF Token Enforcement (Experimental)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Enables CSRF protection tokens for additional hardening compared to the currently used custom header. When the user logs in, an additional cookie is created with the CSRF token contained.

**False**: Disables CSRF protection tokens.  

+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ExperimentalStrictCSRFEnforcement": false`` with options ``true`` and ``false``.                                       |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Limit Access to Config Settings Prior to Login
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

*Removed in December 16, 2018 release*

Enable this setting to limit the number of config settings sent to users prior to login.

Supported for Mattermost server v5.1.0 and later, and Mattermost Mobile apps v1.10.0 and later.

+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ExperimentalLimitClientConfig": "false"`` with options ``true`` and ``false``.                                       |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Disable Legacy MFA API Endpoint
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Disables the legacy ``checkMfa`` endpoint, which is only required for Mattermost Mobile Apps on version 1.16 or earlier when using multi-factor authentication (MFA). Recommended to set to ``true`` for additional security hardening.

**False**: Keeps the legacy ``checkMfa`` endpoint enabled to support mobile versions 1.16 and earlier. Keeping the endpoint enabld creates an information disclosure about whether a user has set up MFA.

+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"DisableLegacyMFA": true,`` with options ``true`` and ``false``.                                                      |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Restrict System Admin (Experimental)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Restricts the System Admin from viewing and modifying a subset of server configuration settings from the System Console. Not recommended for use in on-prem installations. This is intended to support Mattermost Private Cloud in giving the System Admin role to users but restricting certain actions only for Cloud Administrators.

**False**: No restrictions are applied to the System Admin role. 

+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"RestrictSystemAdmin": false,`` with options ``true`` and ``false``.                                                  |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Team Settings
~~~~~~~~~~~~~~

Primary Team (Experimental)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The primary team of which users on the server are members. When a primary team is set, the options to join other teams or leave the primary team are disabled.

If the team URL of the primary team is https://example.mattermost.com/myteam/, then set the value to ``myteam`` in ``config.json``.

+-----------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ExperimentalPrimaryTeam": ""`` with string input.                  |
+-----------------------------------------------------------------------------------------------------------------+

Default Channels (Experimental)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Default channels every user is added to automatically after joining a new team. Only applies to public channels, but affects all teams on the server.

When not set, every user is added to ``off-topic`` and ``town-square`` channel by default.

Note that even if ``town-square`` is not listed, every user is added to that channel after joining a new team.

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ExperimentalDefaultChannels": []`` with string array input consisting of channel names, such as ``["announcement", "developers"]``. |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable X to Leave Channels from Left-Hand Sidebar (Experimental)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Users can leave Public and Private Channels by clicking the "x" beside the channel name.

**False**: Users must use the **Leave Channel** option from the channel menu to leave channels.

+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableXToLeaveChannelsFromLHS": false`` with options ``true`` and ``false``.                                               |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Town Square is Read-Only (Experimental)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

*Available in Enterprise Edition E10 and higher*

**True**: Only System Admins can post in Town Square. Other members are not able to post, reply, upload files, emoji react, or pin messages to Town Square, nor are they able to change the channel name, header, or purpose.

**False**: Anyone can post in Town Square.

+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ExperimentalTownSquareIsReadOnly": false`` with options ``true`` and ``false``.                                                 |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Town Square is Hidden in Left-Hand Sidebar (Experimental)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

*Available in Enterprise Edition E10 and higher*

**True**: Hides Town Square in the left-hand sidebar if there are no unread messages in the channel.

**False**: Town Square is always visible in the left-hand sidebar even if all messages have been read.

+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ExperimentalHideTownSquareinLHS": false`` with options ``true`` and ``false``.                                                  |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Allow Users to View Archived Channels (Experimental)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Allows users to view permalinks and search for content of channels that have been archived. Users can only view the content in channels of which they were a member before the channel was archived.

**False**: Users are unable to view permalinks and search for content of channels that have been archived.

+-------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ViewArchivedChannels": false`` with options ``true`` and ``false``.                                      |
+-------------------------------------------------------------------------------------------------------------------------------------------------------+

Enable Automatic Replies (Experimental)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**True**: Users can enable Automatic Replies in **Account Settings > Notifications**. Users set a custom message that will be automatically sent in response to Direct Messages.

**False**: Disables the Automatic Direct Message Replies feature and hides it from Account Settings.

+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ExperimentalEnableAutomaticReplies": false`` with options ``true`` and ``false``.                                               |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Email Settings
~~~~~~~~~~~~~~

Use Channel Name in Email Notifications (Experimental)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
**True**: Channel and team name appears in email notification subject lines. Useful for servers using only one team.

**False**: Only team name appears in email notification subject line.

+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"UseChannelInEmailNotifications": false`` with options ``true`` and ``false``.                                        |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Client Requirement Settings (Experimental)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Latest Android Version
^^^^^^^^^^^^^^^^^^^^^^^^^

The latest version of the Android React Native app that is recommended for use.

+----------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AndroidLatestVersion": ""`` with string input corresponding to a version string, such as ``"1.2.0"``. |
+----------------------------------------------------------------------------------------------------------------------------------------------------+

Minimum Android Version
^^^^^^^^^^^^^^^^^^^^^^^

The minimum version of the Android React Native app that is required to be used.

+-------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AndroidMinVersion": ""`` with string input corresponding to a version string, such as ``"1.2.0"``. |
+-------------------------------------------------------------------------------------------------------------------------------------------------+

Latest Desktop Version
^^^^^^^^^^^^^^^^^^^^^^

The latest version of the desktop app that is recommended for use.

+----------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"DesktopLatestVersion": ""`` with string input corresponding to a version string, such as ``"1.2.0"``. |
+----------------------------------------------------------------------------------------------------------------------------------------------------+

Minimum Destop Version
^^^^^^^^^^^^^^^^^^^^^^^

The minimum version of the desktop app that is required to be used.

+-------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"DesktopMinVersion": ""`` with string input corresponding to a version string, such as ``"1.2.0"``. |
+-------------------------------------------------------------------------------------------------------------------------------------------------+

Latest iOS Version
^^^^^^^^^^^^^^^^^^

The latest version of the iOS app that is recommended for use.

+------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"IosLatestVersion": ""`` with string input corresponding to a version string, such as ``"1.2.0"``. |
+------------------------------------------------------------------------------------------------------------------------------------------------+

Minimum iOS Version
^^^^^^^^^^^^^^^^^^^

The minimum version of the iOS React Native app that is required to be used.

+---------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"IosMinVersion": ""`` with string input corresponding to a version string, such as ``"1.2.0"``. |
+---------------------------------------------------------------------------------------------------------------------------------------------+

Theme Settings (Experimental)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Enable Theme Selection
^^^^^^^^^^^^^^^^^^^^^^^

*Available in Enterprise Edition E10 and higher*

**True**: Enables the **Display > Theme** tab in Account Settings so users can select their theme.

**False**: Users cannot select a different theme. The **Display > Theme** tab is hidden in Account Settings.

+-----------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"EnableThemeSelection": true`` with options ``true`` and ``false``. |
+-----------------------------------------------------------------------------------------------------------------+

Default Theme
^^^^^^^^^^^^^

*Available in Enterprise Edition E10 and higher*

Set a default theme that applies to all new users on the system.

+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"DefaultTheme": "default"`` with options ``"default"``, ``"organization"``, ``"mattermostDark"``, and ``"windows10"``. |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Allow Custom Themes
^^^^^^^^^^^^^^^^^^^

*Available in Enterprise Edition E10 and higher*

**True**: Enables the **Display > Theme > Custom Theme** section in Account Settings.

**False**: Users cannot use a custom theme. The **Display > Theme > Custom Theme** section is hidden in Account Settings.

+--------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AllowCustomThemes": true`` with options ``true`` and ``false``. |
+--------------------------------------------------------------------------------------------------------------+

Allowed Themes
^^^^^^^^^^^^^^^

*Available in Enterprise Edition E10 and higher*

Select the themes that can be chosen by users when ``"EnableThemeSelection"`` is set to ``true``.

+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"AllowedThemes": []`` with string array input consisting of the options ``"default"``, ``"organization"``, ``"mattermostDark"``, and ``"windows10"``, such as ``["mattermostDark", "windows10"]``. |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Display Settings (Experimental)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Timezone
^^^^^^^^

Select the timezone used for timestamps in the user interface and email notifications.

**True**: The Timezone setting is visible in the Account Settings and a time zone is automatically assigned in the next active session.

**False**: The Timezone setting is hidden in the Account Settings.

+------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"ExperimentalTimezone": false`` with options ``true`` and ``false``. |
+------------------------------------------------------------------------------------------------------------------+

Supported Timezones Path
^^^^^^^^^^^^^^^^^^^^^^^^

*Removed in April 16, 2019 release*

Set the path of the JSON file that lists supported timezones when ``ExperimentalTimezone`` is set to ``true``.

The file must be in the same directory as your ``config.json`` file if you set a relative path. Defaults to ``timezones.json``.

+-----------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"SupportedTimezonesPath": "timezones.json"`` with string input.     |
+-----------------------------------------------------------------------------------------------------------------+

Jobs
~~~~

Settings to configure the how Mattermost schedules and completes periodic tasks such as the deletion of old posts with Data Retention enabled or indexing of posts with Elasticsearch. These settings control which Mattermost servers are designated as a Scheduler, a server that queues the tasks at the correct times, and as a Worker, a server that completes the given tasks.

- When running Mattermost on a single machine, both ``RunJobs`` and ``RunScheduler`` should be enabled. Without both of these enabled, Mattermost will not function properly.
- When running Mattermost in High Availability mode, ``RunJobs`` should be enabled on one or more servers while ``RunScheduler`` should be enabled on all servers under normal circumstances. A High Availability cluster will have one Scheduler and one or more Workers. See the below sections for more information.

Run Jobs
^^^^^^^^

Set whether or not this Mattermost server will handle tasks created by the Scheduler.

- When running Mattermost on a single machine, this setting should always be enabled.
- When running Mattermost in High Availability mode, one or more servers should have this setting enabled. It is recommended that a High Availability cluster has one or more dedicated Workers with this setting enabled while the remaining Mattermost app servers have it disabled.

+------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"RunJobs": true`` with options ``true`` and ``false``.                                 |
+------------------------------------------------------------------------------------------------------------------------------------+

Run Scheduler
^^^^^^^^^^^^^^

Set whether or not this Mattermost server will schedule tasks that will be completed by a Worker.

- When running Mattermost on a single machine, this setting should always be enabled.
- When running Mattermost in High Availability mode, this setting should always be enabled. In a High Availability cluster, exactly one of the servers will be designated as the Scheduler at a time to ensure that duplicate tasks aren't created. See `High Availability documentation <https://docs.mattermost.com/deployment/cluster.html#job-server>`__ for more details.

+-----------------------------------------------------------------------------------------------------------------------------------------+
| This feature's ``config.json`` setting is ``"RunScheduler": true`` with options ``true`` and ``false``.                                 |
+-----------------------------------------------------------------------------------------------------------------------------------------+

source/archive/pre-sales.rst METASEP
:nosearch:

Sales Engineering 
======================

As Mattermost Enterprise Edition is evaluated for advanced or large scale commercial deployments with a clear executive sponsor, timeline and budget, a sales engineering team may be engaged to support the evaluation of product features. 

Mattermost community server 
------------------------------------

Priority customers evaluating large scale deployments are invited to join the **Mattermost community server**.

This is a publicly accessible Mattermost deployment where hundreds of contributors to the Mattermost open source project meet and collaborate to collaboratively develop the software and community extensions. 

The community server runs daily builds of the Mattermost open source project, which means you will be able to see and interact with features being developed for the next release of the software. It also means you'll be exposed to some occasional bugs in the pre-released software. 

To get started: 

1. Sign-up for the `Mattermost community server <https://community.mattermost.com/signup_user_complete/?id=f1924a8db44ff3bb41c96424cdc20676>`__

2. After signing in and completing the tutorial, in the left hand sidebar go to Direct Messages > More then open a channel to **@hanna** and send her a note with the codename of your company, as assigned in your pre-sales discussion. 

3. Hanna will add you to a special private channel to discuss your deployment with Mattermost sales and technical staff. 

Following the evaluation period, if the customer includes `Premier Support <https://mattermost.com/support/>`__ with their subscription, the real time discussion channel with Mattermost, Inc. will persist and be staffed by the Mattermost customer success team for Premier Customers. 

source/archive/pm-faq.rst METASEP
:nosearch:

Product Manager FAQ
===================

This page has moved to the `Mattermost Handbook <https://handbook.mattermost.com/operations/research-and-development/product/product-management-team-handbook#frequently-asked-questions-faq>`__.

source/archive/plugins.rst METASEP
:nosearch:

Plugins (Beta)
===============

.. note::
  This is the admin documentation for plugins. If you're a developer looking to build a plugin, see `our developer documentation <https://developers.mattermost.com/extend/plugins/>`__.

Mattermost supports plugins to customize and extend the platform. See our `demo plugin <https://github.com/mattermost/mattermost-plugin-demo>`__ that illustrates the potential for a Mattermost plugin. To start writing your own plugin, consult our `starter template <https://github.com/mattermost/mattermost-plugin-starter-template>`__.

Consider using a plugin in the following scenarios:

 - When you want to customize the Mattermost user interface.
 - When you want to extend Mattermost functionality to meet a specific, complex requirement.
 - When you want to build integrations that are managed by your Mattermost server.

Plugins are fully supported in both Team Edition and Enterprise Edition.

Plugin Marketplace
------------------

The Plugin Marketplace is a collection of plugins that can greatly increase the value and capabilities of your Mattermost deployment. End users can see increased productivity through quick access to systems such as Jira, Zoom, Webex, and GitHub. Mattermost Admins can discover new plugins and quickly deploy them to their servers, including High Availability clusters. 

The Plugin Marketplace is available from v5.16 and is accessed via **Main Menu > Plugin Marketplace**. More listings will be added as we add new features and plugins that our customers request.

.. image:: https://user-images.githubusercontent.com/915956/66891467-1b18eb80-ef9e-11e9-9de3-37a3c5899bd8.png

Plugin labels
~~~~~~~~~~~~~

Plugins in the Plugin Marketplace are labeled to make it easier for administrators to choose plugins that fit their company's security and risk policies if they do not allow for community plugins to be used.

**Community Plugins**

Plugins identified as "Community" are produced by the open-source community or partners and the features/roadmap are not controlled directly by Mattermost. Prior to being listed on the Plugin Marketplace, they are reviewed by the Mattermost development team and code-signed to ensure the code Mattermost reviewed, is delivered. Mattermost does not directly support these plugins in production environments.

**Beta Plugins**

Plugins may be labeled as "Beta" if they're released to the Plugin Marketplace early for customer previews. We do not recommend running Beta plugins on production servers.

Installing a plugin
~~~~~~~~~~~~~~~~~~~

When a new plugin becomes available on the Plugin Marketplace, it's listed with an option to **Install**. Select **Install** to download and install the latest plugin binary from its respective GitHub repository. If there's a cluster present, the plugin will be distributed to each server automatically.

Configuring and enabling a plugin
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Once a plugin is installed (or pre-installed if shipped with Mattermost binary release):

1. Select **Configure** to open the **Settings** menu.
2. Enter the plugin settings as required.
3. Set **Enable Plugin** setting to ``True``. If this flag is not enabled, the plugin will not become active.
4. Test out the plugin as needed.

Upgrading plugins
~~~~~~~~~~~~~~~~~

Upgrade a plugin on demand when a new version becomes available. New versions of plugins that you have already installed will display a link to easily install the upgraded plugins. Some plugin versions may have breaking changes; please check the release notes if you are performing a major version change.

Upgrading plugins (prior to v5.18)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

In v5.16 and v5.17 the Plugin Marketplace only supports the installation of new plugins. To upgrade a plugin, you need to manually update it by downloading the binary file from the GitHub repository and then upload it in **System Console > Plugin Management**.

Marketplace server
------------------

There are two settings in **System Console > Plugin Management**:

.. image:: https://user-images.githubusercontent.com/915956/66892854-94660d80-efa1-11e9-805c-a85223d43a07.png

- **Enable Marketplace:** Turns the Plugin Marketplace user interface on or off for System Administrators (end users cannot see the Plugin Marketplace).
- **Marketplace URL:** The location of the Marketplace server to query for new plugins. Mattermost hosts a Plugin Marketplace for the community and this is the default value for this field. You can also set up your own Marketplace server.

When you first access the Marketplace, your Mattermost server will attempt to contact the Mattermost Plugin Marketplace server and return a list of available plugins that are appropriate based on the server version that is currently running. Only your server version and search query is passed over to the Mattermost Plugin Marketplace; we retain an anonymized record for product analytics whenever a new plugin is installed, unless you have opted out of `Telemetry <https://docs.mattermost.com/manage/telemetry.html>`__.

The `Plugin Marketplace server code <https://github.com/mattermost/mattermost-marketplace>`__ is available as an open source project and can be used to set up your own private Marketplace if desired.

Mattermost Marketplace
~~~~~~~~~~~~~~~~~~~~~~~

The `Mattermost Plugin Marketplace <https://github.com/mattermost/mattermost-marketplace>`__ is a service run by Mattermost that contains listings of plugins that we have reviewed and, in many cases, built. In the future, we plan to include community-developed plugins that will be labeled separately to Mattermost-developed plugins. as well as settings that would restrict which types of plugins you can install. Comments in our forum are welcome as we develop this feature further.

Mattermost integration directory
--------------------------------

There are many ways to integrate Mattermost aside from plugins, and we have created a directory of integration "recipes", some of which are scripts, plugins, or instructions on how to connect Mattermost with your Enterprise systems. Many are sourced from our community of customers. You can browse the directory at `https://integrations.mattermost.com/ <https://integrations.mattermost.com/>`__.

About plugins
-------------

Plugins may have one or both of the following parts:

 - **Web App plugins:** Customize the Mattermost user interface by adding buttons to the channel header, overriding the ``RHS``, or even rendering a custom post type within the center channel. All this is possible without having to fork the source code and rebase on every Mattermost release. For a sample plugin, see `our Zoom plugin <https://github.com/mattermost/mattermost-plugin-zoom>`__.
 - **Server plugins:** Run a Go process alongside the server, filtering messages, or integrating with third-party systems such as Jira, GitLab, or Jenkins. For a sample plugin, see `our Jira plugin <https://github.com/mattermost/mattermost-plugin-jira>`__.

Security
--------

Plugins are intentionally powerful and not artificially sandboxed in any way and effectively become part of the Mattermost server. Server plugins can execute arbitrary code alongside your server and webapp plugins can deploy arbitrary code in client browsers.

While this power enables deep customization and integration, it can be abused in the wrong hands. Plugins have full access to your server configuration and thus also to your Mattermost database. Plugins can read any message in any channel, or perform any action on behalf of any user in the Web App.

You should only install custom plugins from sources you trust to avoid compromising the security of your installation.

Plugin signing
--------------

The Plugin Marketplace allows system administrators to download and install plugins from a central repository. Plugins installed via the Plugin Marketplace must be signed by a public key certificate trusted by the local Mattermost server.

While the server ships with a default certificate used to verify plugins from the default Mattermost Plugin Marketplace, the server can be configured to trust different certificates and point at a different plugin marketplace. This document outlines the steps for generating a public key certificate and signing plugins for use with a custom plugin marketplace. It assumes access to the `GNU Privacy Guard (GPG) <https://gnupg.org>`__ tool.

Configuration
~~~~~~~~~~~~~

Configuring plugin signatures allows finer control over the verification process:

.. code-block:: sh

   PluginSettings.RequirePluginSignature = true

This is used to enforce plugin signature verification. With flag on, only Marketplace plugins will be installed and verified. With flag off, customers will be able to install plugins manually without signature verification.

Note that the Marketplace plugins will still be verified even if the flag is off.

Key generation
~~~~~~~~~~~~~~~

Public and private key pairs are needed to sign and verify plugins. The private key is used for signing and should be kept in a secure location. The public key is used for verification and can be distributed freely. To generate a key pair, run the following command:

.. code-block:: sh

   gpg --full-generate-key

.. code-block:: text

  Please select what kind of key you want:
    (1) RSA and RSA (default)
    (2) DSA and Elgamal
    (3) DSA (sign only)
    (4) RSA (sign only)
  Your selection? 1

  RSA keys may be between 1024 and 4096 bits long.
  What keysize do you want? (2048) 3072

  Requested keysize is 3072 bits

  Please specify how long the key should be valid.
        0 = key does not expire
        <n>  = key expires in n days
        <n>w = key expires in n weeks
        <n>m = key expires in n months
        <n>y = key expires in n years
  Key is valid for? (0) 0

  Key expires at ...

  Is this correct? (y/N) y

  GnuPG needs to construct a user ID to identify your key.
  Real name: Mattermost Inc

  Email address: info@mattermost.com
  Comment:

  You selected this USER-ID:
      "Mattermost Inc <info@mattermost.com>"
  Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O

.. note::

 Key size should be at least 3072 bits.

Exporting the private key
~~~~~~~~~~~~~~~~~~~~~~~~~

Find the ID of your private key first. The ID is a hexadecimal number.

.. code-block:: sh

  gpg --list-secret-keys

This is your private key and should be kept secret. Your hexadecimal key ID will, of course, be different.

.. code-block:: sh

  gpg --export-secret-keys F3FACE45E0DE642C8BD6A8E64C7C6562C192CC1F > ./my-priv-key

Exporting the public key
~~~~~~~~~~~~~~~~~~~~~~~~

Find the ID of your public key first. The ID is a hexadecimal number.

.. code-block:: sh

  gpg --list-keys

.. code-block:: sh

  gpg --export F3FACE45E0DE642C8BD6A8E64C7C6562C192CC1F > ./my-pub-key

Importing the key
~~~~~~~~~~~~~~~~~

If you already have a public and private key pair, you can import them to the GPG.

.. code-block:: sh

 gpg --import ./my-priv-gpg-key

 gpg --import ./my-pub-gpg-key

Running plugin signing
^^^^^^^^^^^^^^^^^^^^^^

For plugin signing, you have to know the hexadecimal ID of the private key. Let's assume you want to sign ``com.mattermost.demo-plugin-0.1.0.tar.gz`` file, run:

.. code-block:: sh

  gpg -u F3FACE45E0DE642C8BD6A8E64C7C6562C192CC1F --verbose --personal-digest-preferences SHA256 --detach-sign com.mattermost.demo-plugin-0.1.0.tar.gz

This command will generate ``com.mattermost.demo-plugin-0.1.0.tar.gz.sig``, which is the signature of your plugin.

Plugin verification
^^^^^^^^^^^^^^^^^^^

Mattermost server will verify plugin signatures downloaded from the Plugin Marketplace. To add custom public keys, run the following command on the Mattermost server:

.. code-block:: sh

  mattermost plugin add key my-pub-key

Multiple public keys can be added to the Mattermost server:

.. code-block:: sh

  mattermost plugin add key my-pk-file1 my-pk-file2

To list the names of all public keys installed on your Mattermost server, use:

.. code-block:: sh

  mattermost plugin keys

To delete public key(s) from your Mattermost server, use:

.. code-block:: sh

  mattermost plugin delete key my-pk-file1 my-pk-file2

Implementation
~~~~~~~~~~~~~~

See the `implementation document <https://docs.google.com/document/d/1qABE7VEx4k_ZAeh6Ydn4pGbu6BQfZt65x68i2s65MOQ>`__ for more information.

Set up guide
------------

To manage plugins, go to **System Console > Plugins > Plugin Management**. From here, you can:

 - Enable or disable pre-packaged plugins.
 - Install and manage custom plugins.

.. note::

  In versions prior to 5.16, go to **System Console > Plugins (Beta) > Configuration**.

Pre-packaged plugins
~~~~~~~~~~~~~~~~~~~~

Mattermost ships with a number of pre-packaged plugins written and maintained by Mattermost. Instead of building these features directly into the product, you can selectively enable the functionality your installation requires. Install pre-packaged plugins from the Plugin Marketplace, even if your system cannot directly connect to the internet.

Prior to v5.20, pre-packaged plugins were installed by default and could not be uninstalled without manually modifying the ``prepackaged_plugins`` directory. Any pre-packaged plugins installed prior to v5.20 and left enabled on upgrade will remain installed, but can now be uninstalled.

Custom plugins
~~~~~~~~~~~~~~

Installing a custom plugin introduces some risk. As a result, plugin uploads are disabled by default and cannot be enabled via the System Console or REST API.

To enable plugin uploads, manually set ``PluginSettings > EnableUploads`` to ``true`` in your ``config.json`` file and restart your server. You can disable plugin uploads at any time without affecting previously uploaded plugins.

With plugin uploads enabled, navigate to **System Console > Plugins > Management** and upload a plugin bundle. Plugin bundles are ``*.tar.gz`` files containing the server executables and web app resources for the plugin. You can also specify a URL to install a plugin bundle from a remote source.

.. note:: 

  When ``RequirePluginSignature`` is ``true``, plugin uploads cannot be enabled, and may only be installed via the Plugin Marketplace (which verifies Plugin Code Signatures).

Custom plugins may also be installed via the `command line interface <https://docs.mattermost.com/manage/command-line-tools.html#mattermost-plugin>`__.

While no longer recommended, plugins may also be installed manually by unpacking the plugin bundle inside the ``plugins`` directory of a Mattermost installation.

Plugin uploads in High Availability mode
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Prior to Mattermost 5.14, Mattermost servers configured for `High Availability mode <https://docs.mattermost.com/scale/high-availability-cluster.html>`_ required plugins to be installed manually. As of Mattermost 5.14, plugins uploaded via the System Console or the command line interface are persisted to the configured file store and automatically installed on all servers that join the cluster.

Manually installed plugins remain supported, but must be individually installed on each server in the cluster.

Frequently Asked Questions (FAQs)
---------------------------------

Where can I share feedback on plugins?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Join our community server discussion in the `Toolkit channel <https://community.mattermost.com/core/channels/developer-toolkit>`__.

Troubleshooting
---------------

Please see common questions below. For further assistance, review the `Troubleshooting forum <https://forum.mattermost.com/c/trouble-shoot>`__ for previously reported errors, or `join the Mattermost user community for troubleshooting help <https://mattermost.com/pl/default-ask-mattermost-community/>`_.

Plugin uploads fail even though uploads are enabled
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

If plugin uploads fail and you see ``permission denied`` errors in **System Console > Logs** such as:

.. code-block:: text

  [2017/11/13 20:42:18 UTC] [EROR] failed to start up plugins: mkdir /home/ubuntu/mattermost/client/plugins: permission denied

It's likely that the Mattermost server doesn't have the necessary permissions for uploading plugins. Ensure the Mattermost server has write access to the ``mattermost/client`` directory.

It may also be that the working directory for the service running Mattermost is not correct. On Ubuntu you might see:

.. code-block:: text

    [2018/01/03 08:34:47 EST] [EROR] failed to start up plugins: mkdir ./client/plugins: no such file or directory

This can be fixed on Ubuntu 16.04 and RHEL by opening the service configuration file and setting ``WorkingDirectory`` to the path to Mattermost (generally it's ``/opt/mattermost``).

A similar problem can occur on Windows:

.. code-block:: text

    [EROR] failed to start up plugins: mkdir ./client/plugins: The system cannot find the path specified.

To fix this, set the ``AppDirectory`` of your service using ``nssm set mattermost AppDirectory c:\mattermost``.

``x509: certificate signed by unknown authority``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

If you're seeing ``x509: certificate signed by unknown authority`` in your server logs, it usually means that the CA for a self-signed certificate for a server your plugin is trying to access has not been added to your local trust store of the machine the Mattermost server is running on.

You can add one in Linux `following instructions in this StackExchange article <https://unix.stackexchange.com/questions/90450/adding-a-self-signed-certificate-to-the-trusted-list>`_, or set up a load balancer like NGINX per :doc:`production install guide <config-ssl-http2-nginx>` to resolve the issue.

source/archive/pinning-messages.rst METASEP
:nosearch:

.. _pinning-messages:

Pinning Messages
================

|all-plans| |cloud| |self-hosted|

.. |all-plans| image:: ../images/all-plans-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in Mattermost Free and Starter subscription plans.

.. |cloud| image:: ../images/cloud-badge.png
  :scale: 30
  :target: https://mattermost.com/download
  :alt: Available for Mattermost Cloud deployments.

.. |self-hosted| image:: ../images/self-hosted-badge.png
  :scale: 30
  :target: https://mattermost.com/deploy
  :alt: Available for Mattermost Self-Hosted deployments.

All members of a channel can pin important or useful messages to that channel. The list of pinned messages is visible to all channel members. There is no limit to the number of pinned posts in a channel.

Pinned messages are marked with the pinned icon. For example:

.. image:: ../images/pinned-example-channel.png
  :alt: Enter slash commands in the message field.

**To view the list of pinned messages:**

To view the complete list of pinned messages, select the Pin icon in the channel header. 

.. image:: ../images/pinned-posts.png
  :alt: Open pinned messages in the right-hand sidebar.

The right-hand sidebar opens to show the list of pinned messages. For example:

.. image:: ../images/pinned-example-rhs.png
  :alt: Review the list of pinned messages.

Pin a Message
-------------

1. Mouse over the message that you want to pin. The [...] link appears.
2. Select **[...] > Pin to channel**

Unpin a Message
---------------

1. Mouse over the message that you want to unpin. The [...] link appears.
2. Select **[...] > Unpin from channel**

source/archive/personal-access-tokens.rst METASEP
:nosearch:

.. _personal_access_tokens:

Personal Access Tokens
======================

Personal access tokens function similar to session tokens and can be used by integrations to `authenticate against the REST API <https://api.mattermost.com/#tag/authentication>`__. It is the most commonly used type of token for integrations.

.. contents::
  :backlinks: top
  :depth: 1
  :local:

Creating a Personal Access Token
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Enable personal access tokens in **System Console > Integrations > Integration Management**.

2. Identify the account you want to create a personal access token with. You may optionally create a new user account for your integration, such as for a bot account. By default, only System Admins have permissions to create a personal access token.

3. To create an access token with a non-admin account, you must first give it the appropriate permissions. Go to **System Console > User Management > Users**, search for the user account, then select **Manage Roles** from the dropdown.

.. image:: ../../source/images/access_token_manage_roles.png
  :width: 500 px

4. Select **Allow this account to generate personal access tokens.**

.. image:: ../../source/images/access_tokens_additional_roles.png
  :width: 500 px

You may optionally allow the account to post to any channel in your Mattermost server, including direct messages by choosing the **post:all** role. **post:channels** role allows the account to post to any public channel in the Mattermost server.

Then hit **Save**.

5. Sign in to the user account to create a personal access token.

6. Go to **Account Settings > Security > Personal Access Tokens** and click **Create New Token**.

7. Enter a description for the token, so you remember what it's used for. Then hit **Save**.

.. note::
  If you create a personal access token for a System Admin account, be extra careful who you share it with. The token enables a user to have full access to the account, including System Admin privileges.
  
  It is recommended to create a personal access token for non-admin accounts.
  
8. Copy the access token now for your integration and store it in a secure location. You won't be able to see it again!

9. You're all set! You can now use the personal access token for integrations to interact with your Mattermost server and `authenticate against the Mattermost REST API <https://api.mattermost.com/#tag/authentication>`__.

.. image:: ../../source/images/access_token_settings.png
  :width: 500 px

Revoking a Personal Access Token
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

A personal access token can be revoked by deleting the token from either the user's account settings or from the System Console. Once deleted, all sessions using the token are deleted, and any attempts to use the token to interact with the Mattermost server are blocked.

Tokens can also be temporarily deactivated from the user's account settings. Once deactivated, all sessions using the token are deleted, and any attempts to use the token to interact with the Mattermost server are blocked. However, the token can be reactivated at any time.

Account Settings
.................

1. Sign in to the user account and go to **Account Settings > Security > Personal Access Tokens**.

2. Identify the access token you want to revoke and hit **Delete**. Confirm the deletion.

System Console
..............

1. Go to **System Console > Users**, search for the user account which the token belongs to, then select **Manage Tokens** from the dropdown.

2. Identify the access token you want to revoke and hit **Delete**. Confirm the deletion.

Frequently Asked Questions (FAQ)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

How do personal access tokens differ from regular session tokens?
..................................................................

- Personal access tokens do not expire. As a result, you can more easily integrate with Mattermost, bypassing the `session length limits set in the System Console <https://docs.mattermost.com/administration/config-settings.html#sessions>`__.
- Personal access tokens can be used to authenticate against the API more easily, including with AD/LDAP and SAML accounts.
- You can optionally assign additional roles for the account creating personal access tokens. This lets the account post to any channel in Mattermost, including direct messages.

Besides the above differences, personal access tokens are exactly the same as regular session tokens. They are cryptic random IDs and are not different from a user's regular session token created after logging in to Mattermost.

Can I set personal access tokens to expire?
............................................

Not in Mattermost, but you can automate your integration to cycle its token `through the REST API <https://api.mattermost.com/#tag/users%2Fpaths%2F~1users~1%7Buser_id%7D~1tokens%2Fpost>`__.

How do I identify a badly behaving personal access token?
..........................................................

Best option is to go to **System Console > Logs** and finding error messages relating to a particular token ID.

Once identified, you can search which user account the token ID belongs to in **System Console > Users** and revoke it through the **Manage Tokens** dropdown option.

Do personal access tokens continue to work if the user is deactivated?
........................................................................

No. The session used by the personal access token is revoked immediately after a user is deactivated, and a new session won't be created.

The tokens are preserved and continue to function if the user account is re-activated. This is useful when a bot account is temporarily deactivated for troubleshooting, for instance.

source/archive/people-ops.rst METASEP
:nosearch:

============================================================
People Ops
============================================================

This page summarizes logistics for working at Mattermost. 

Office Address 
==============================================================

Mattermost, Inc. is located at:: 

    Mattermost, Inc. 
    530 Lytton Avenue, 2nd Floor
    Palo Alto, CA, 94301

Letter of Employment 
==============================================================

If you need a letter from Mattermost verifying your employment or contractor status, please send the request to hr@mattermost.com citing what information is needed. 

For example, monthly fee, salary, start date, title, etc. People ops will send you the letter once it is completed.

Regular Compensation 
==============================================================

1. Employees of our US entity, Mattermost, Inc., receive salary by semi-monthly direct deposit via TriNet. Pay slips are available via `TriNet's portal <https://www.hrpassport.com/>`__.

2. Employees of our Canadian co-employer receive salary by direct deposit semi-monthly via ADP. 

3. Contractors to Mattermost, Inc. should email invoices monthly with:: 

    TO:       [Email specified in "Mattermost Invoice Instructions" emailed with your on-boarding instructions]
    CC:       [Email of your manager]
    SUBJECT:  [Please include MONTH YEAR and YOUR NAME or YOUR COMPANY NAME]

  - For 'fixed fee' contracts, it is fine to send invoice before the time period covered. Example: An invoice for services April 1-30 can be sent on April 25.
  - Your manager should reply on the email with any feedback on the invoice. 

source/archive/partner-programs.rst METASEP
:nosearch:

============================
Mattermost Partner Programs
============================

Mattermost offers multiple partner programs:

- `Mattermost Authorized Reseller Program`_ for one-time resale transactions fulfilling customer request to reseller.
- `Mattermost Value-Added Reseller Program`_ for on-going resellers providing first and second tier support in local language and local timezone.
- `Mattermost Deployment Solutions Partner Program`_ - for co-marketing relationships with both commercial and open source partners automating the deployment of Mattermost.

Mattermost Authorized Reseller Program
-------------------------------------

The purpose of the Mattermost Authorized Reseller Program is to enable customers to purchase Mattermost Enterprise Edition via a fulfillment partner who earns a fee from the customer for reselling Mattermost into their procurement department and navigating the various approval processes, but who does not provide support or installation services.

Companies who enter into a Mattermost Authorized Reseller agreement typically have existing relationships with customers and help them procure information technology products.

Becoming a Mattermost Authorized Reseller 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- Complete a `contact form <https://mattermost.com/contact-us/>`__ with Mattermost requesting an Authorized Reseller discussion and, if available, include the name of the customer to which you would like to resell.
- You'll be in contact with a partner manager via email, or possibly phone, to understand the details of your business and the resale transaction.
- Once the resale is approved internally, you will be provided a one-time click-sign authorized reseller agreement to complete, along with purchase order information for your customer.

Placing an Order as a Mattermost Authorized Reseller 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

When ready to place an order submit a purchase order to orders@mattermost.com along with the name, address, and contact information of your customer.

.. note::

  Mattermost does not accept customer purchase orders or custom terms for Reseller orders.
  
Mattermost, Inc. will then:

- Review the terms and conditions of the order.
- Send the customer contact a request to complete a `customer registration form <https://mattermost.com/support/>`__ (password provided after PO is sent), which includes an agreement to accept `Enterprise Edition Subscription Terms for Purchase by Resale <https://mattermost.com/terms-of-use/>`__.
- After the customer registration form is complete, it will be reviewed within one business day and a license key issued via email.
- Issue you an invoice (payment due within 30 days).

Mattermost Value-Added Reseller Program
----------------------------------------

The purpose of the Mattermost Value-Added Reseller program is to enable customers to purchase Mattermost Enterprise Edition via a partner who provides fulfillment support as well as first and second tier customer support in local timezone and local language.

Value-Added Resellers who complete online training and have set up local support processes are offered a discount to Mattermost Enterprise Edition list prices.

Benefits of being a Mattermost Value-Added Reseller ("VAR")
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- Reseller discount from list prices for selling Mattermost Enterprise Edition.
- Partner Evaluation License for Mattermost Enterprise Edition E20.
- Relationship with Mattermost field sales for fulfilling orders customer orders.

Becoming a Mattermost Value-Added Reseller ("VAR") 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- Complete a `contact form <https://mattermost.com/contact-us/>`__ with Mattermost requesting a reseller discussion.
- Reseller applications are reviewed within 1-2 weeks. Resellers meeting the following criteria are invited for a partnership discussion:

   - An existing customer has inquired by purchasing Mattermost Enterprise Edition via resale.
   - Your company has at least 2 years of operating history.
   - If your company is located in a non-English-speaking country, you are willing and able to provide 1st and 2nd tier support in the local language, via training materials provided by Mattermost, Inc.
   - Provided partnership discussion meets expectations, a non-exclusive reseller agreement is offered to the reseller specific to geography and industry.
- Reseller works with Strategic Alliance Manager on Mattermost Enterprise Edition opportunities.

Order Processing
~~~~~~~~~~~~~~~~

- For each customer opportunity, you must `complete a deal registration form <https://mattermost.com/reseller-deal-registration/>`__ to be eligible for a reseller discount.
- Once the deal is registered Mattermost will review the registration and contact you regarding approval, rejection, or to obtain more information.
- Request a quotation from your Mattermost Strategic Alliance Manager for customer purchase, including the email address of the customer contact who will receive the license key.
- The customer must sign the quotation before you issue a purchase order.

Mattermost, Inc. will then:

- Review the terms and conditions of the order.
- Send the customer contact a request to complete a `customer registration form <https://mattermost.com/support/>`__ (password provided after PO is sent), which includes an agreement to accept `Enterprise Edition Subscription Terms for Purchase by Resale <https://mattermost.com/terms-of-use/>`__.
- After the customer registration form is complete, it will be reviewed within one business day and a license key issued via email.
- Issue you an invoice (payment due within 30 days).

If a partner has registered a deal, received approval and the customer purchases online, the partner may invoice Mattermost for a referral fee equal to the discount off list price for the product with an invoice note "Referral fee for deal registration [DEAL_REGISTRATION_NUMBER]" (sent to payments@mattermost.com).

Mattermost Deployment Solutions Partner Program
-----------------------------------------------

Commercial and open source organizations who demonstrate the ability to automate the deployment and maintenance of Mattermost systems per our `Deployment Solution Program guidelines <https://docs.mattermost.com/guides/orchestration.html>`__ are offered a co-marketing partnership, which may include:

- Listings in the Mattermost partner directory.
- Guest writer opportunities on the Mattermost blog.
- Joint-webinar opportunties.
- Promotion on Mattermost social media accounts.
- Partner Evaluation License for Mattermost Enterprise Edition E20.

To apply for the program, complete the `contact form <https://mattermost.com/contact-us/>`__ with Mattermost requesting a deployment solutions partner discussion.

Partner Directory 
------------------

A directory of Mattermost partners can be found at https://mattermost.com/partners/.

After completion of a partner agreement, partners are invited to send an overview of their services with a logo to inclusion in the Mattermost partner directory. 

To get started, please email the following to partner-directory@mattermost.com:

- **Partner Name:** Your legal name may be shortened to fit in the directory listing. If you wish you can state your full legal name as part of your partner description.
- **Partner Contact Information:** The best email address (and phone number, if preferred) where you can be reached.
- **Partner Description:** Between 30-100 words describing your business. See examples at https://mattermost.com/partners/.
- **City, State/Province, and Country:** Location of key office or offices providing Mattermost services, or global headquarters.
- **Logo:** At least 200px wide.

If you have joined the Value-Added Reseller program, your reseller territory will appear in the listing as well.

Listing Location of Key Office
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

In the partner listing, city locations follow a "concise clarity" principle:

- Cities that are not well-known, or which have very similarly-named cities in the same country, are displayed as CITY, STATE/PROVINCE, COUNTRY.
- Well-known and uniquely-named cities, display is CITY, COUNTRY.

For example: A well-known city with a unique name like Johannesburg would be displayed as "Johannesburg, South Africa" and not "Johannesburg, Gauteng, South Africa", which is unnecessarily long. Similarly a less well-known city, like "Arvada" is referenced as "Arvada, Colorado, USA".

Partner Evaluation License 
--------------------------

As a Value-Added Reseller or Deployment Solution Partner you can request a renewable 1-year E20 license for up to 50 users.

- Go to https://www.mattermost.com/trial/ to complete a trial form and enter [RESELLER] after your organization name.
- In the “Where are you with Mattermost” section, select “other”.
- Please send an email to partners@mattermost.com letting us know the above have been completed so your application can be reviewed and matched against our certified reseller database.
- Please expect delivery in 2-3 business days.

Mattermost Partner Program FAQ 
------------------------------

Frequently asked questions from Mattermost partners.

Can a partner sell Mattermost products without revealing the name of an end customer?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

No. Mattermost, Inc. must know all end customers with whom it does business. This is important for Mattermost to be able to service and renew the end customer if the reseller relationship is discontinued. Moreover, Mattermost cannot do business with customers in countries embargoed by the United States and this must be confirmed in any commercial transaction.

source/archive/overview.rst METASEP
:nosearch:

Please see the updated :doc:`product`.
source/archive/organizing-your-sidebar.rst METASEP
:nosearch:

Organizing Your Sidebar
=======================

|all-plans| |cloud| |self-hosted|

.. |all-plans| image:: ../images/all-plans-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in Mattermost Free and Starter subscription plans.

.. |cloud| image:: ../images/cloud-badge.png
  :scale: 30
  :target: https://mattermost.com/download
  :alt: Available for Mattermost Cloud deployments.

.. |self-hosted| image:: ../images/self-hosted-badge.png
  :scale: 30
  :target: https://mattermost.com/deploy
  :alt: Available for Mattermost Self-Hosted deployments.

Conversations in Mattermost are crucial to company productivity and success. Keeping conversations organized in the sidebar creates an efficient workplace.

Channel types
-------------

Public channels
~~~~~~~~~~~~~~~

Public channels are open to everyone on a team. New team members are automatically added to two Public channels when they sign up: ``Town Square`` and ``Off-Topic``.

Private channels
~~~~~~~~~~~~~~~~

Private channels are for sensitive topics and are only visible to select team members. In Team Edition, any member of a Private channel can add or remove other members from Private channels, but in Enterprise Edition `these permissions can be restricted to the Channel Admins and System Admins <https://docs.mattermost.com/help/getting-started/managing-members.html#user-roles>`__.

Direct Messages and Group Messages
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Use a Direct Message when you want a private conversation with one person. Use a Group Message when you want to set up a private conversation with up to seven other participants. If you want to communicate with more than seven people, you must create a Private channel. Direct and Group Messages are visible only to the people involved.

If your System Admin has allowed it, you can start a Direct Message or a Group Message with people on other teams.

Customizing your sidebar
------------------------

You can customize your sidebar based on how you use Mattermost. Customizations you make are only visible to you and won't affect what your teammates see in their sidebars.

Here’s how your sidebar is set up by default:

- All Public and Private Channels you've joined are listed in the **Channels** category, sorted alphabetically.
- All your Direct Messages and Group Messages are listed in the **Direct Messages** category, sorted by recent activity.

What can you customize?
~~~~~~~~~~~~~~~~~~~~~~~

You can customize your sidebar in the following ways:

- `Create custom categories <https://docs.mattermost.com/help/getting-started/organizing-your-sidebar.html#creating-custom-categories>`_.
- `Group and order channels into your categories <https://docs.mattermost.com/help/getting-started/organizing-your-sidebar.html#organizing-channels-in-categories>`_.
- `Mute and unmute entire categories <https://docs.mattermost.com/help/getting-started/organizing-your-sidebar.html#muting-and-unmuting-categories>`_.
- `Sort channels in each category <https://docs.mattermost.com/help/getting-started/organizing-your-sidebar.html#sorting-channels-in-categories>`_ manually, alphabetically, or by recent activity.
- `Filter your sidebar to view unread channels only <https://docs.mattermost.com/help/getting-started/organizing-your-sidebar.html#group-unread-channels-separately>`_, or choose to group unread messages into an **Unreads** category.
- `Manage your Direct Messages <https://docs.mattermost.com/help/getting-started/organizing-your-sidebar.html#managing-direct-messages>`_ by sorting them alphabetically or by recent activity, and by setting how many to display in your sidebar.

  .. image:: ../images/channel_sidebar_updates.gif

Creating custom categories
--------------------------

Create custom categories to group channels together for quicker and easier navigation. For example, you can create a category called "Design" or "Marketing".

To create categories, select the **+** symbol at the top of the sidebar. Or, select the **More options...** icon in the sidebar on any category header, then select **Create New Category**.

Next, type a category name, select **Create**, then drag any channels or Direct Messages into this new category. You can also multi-select channels and Direct Messages to drag them together as a group using CTRL/CMD+Select or SHIFT+Select. See **Dragging and dropping selections** below for details.

Making categories work for you
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

**Categories are collapsible**

- When collapsed, only unread channels display to reduce unnecessary scrolling.
- When expanded, all channels in the category display, including channels with unread messages.

**You can reorder categories**

- Drag to reorder entire categories to prioritize important conversations. 

**Categories can contain Direct Message conversations**

- Select and drag Direct Messages into any category. You can also multi-select Direct Messages to drag them together as a group.

Renaming categories
^^^^^^^^^^^^^^^^^^^

1. Select the **Category options** icon in the sidebar, then select **Rename Category**.
2. Type a new category name, then select **Rename**.

Deleting categories
^^^^^^^^^^^^^^^^^^^

1. Select the **Category options** icon in the sidebar, then select **Delete Category**.
2. Select **Delete** to confirm or select **X** to cancel.

All channels and Direct Message conversations in the deleted category move back to their default **Channels** and **Direct Messages** categories. Deleting a category never removes you from channels you have joined. 

Organizing channels in categories
---------------------------------

Once you've created categories, you can move channels around to organize your sidebar.

Dragging and dropping selections
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

To select multiple channels:

- Select sequential channels and/or Direct Messages by pressing and holding SHIFT+Select. 
- Select non-sequential channels and/or Direct Messages by pressing and holding CMD+Select (for Mac) or CTRL+Select (for Windows/Linux). 
- Press ESC to clear channel or Direct Message selections.

Using the Mattermost Web or Desktop App, drag selected channels and/or Direct Messages between or within categories. 

.. tip::

  Multi-selected channels and Direct Messages move together as a group in the order they originally appeared. 

.. image:: ../images/multi-select-drag.gif

Moving selections
~~~~~~~~~~~~~~~~~

In addition to selecting and dragging, you can specify a category destination for selected channels and/or Direct Messages. To do this, select the **Channel options** icon in the sidebar and then select **Move to**.

.. image:: ../images/multi-select-move.gif

From Mattermost v6.1, you can also specify a category destination for the current channel or conversation using the **Move to** option directly from the channel header. Channels that have been moved a category will display a checkmark next to the category name.

.. image:: ../images/channel-heading-categories.png
  :alt: Move channels or conversations directly from the channel header.

Muting and unmuting categories
------------------------------

When you mute or unmute a category, all channels within that category are also muted or unmuted. You can still selectively unmute specific channels within a muted category.

Select the **Category options** icon in the sidebar, then select **Mute Category**.

Once a category is muted:

- Email, desktop, and push notifications are disabled for all channels in the category.
- A mute icon displays next to each channel name in the category.
- The category and all of its channels appear at reduced opacity in the left-hand sidebar. Channels in the category aren't marked as unread unless you’re mentioned directly.

To unmute the category, select the **Category options** icon in the sidebar, then select **Unmute Category**.

    .. image:: ../images/mute-categories.gif

Sorting channels in categories
------------------------------

Select the **Category options** icon in the sidebar, then select **Sort** and choose from **Alphabetically**, **Recent Activity**, or **Manually**.

    .. image:: ../images/sort-categories.gif

Group unread channels separately
--------------------------------

By default, Mattermost provides a one-click **Unreads** filter to only show channels with unread activity. Alternatively, you may choose to automatically group unread channels in their own category at the top of your sidebar.

Go to **Settings > Sidebar**, set **Group unread channels separately** to **On**, then select **Save**.

- When this setting is enabled, all unread messages appear only in the **Unreads** category, sorted with mentions first.
- When this setting is disabled, all unread messages appear within their respective categories and channels. You can use the **Unread filter** to focus on only unread channels in the sidebar.

When enabled, unread channels with mentions will sort to the top of the category.

    .. image:: ../images/unreads.gif

.. tip::
  
  If you prefer to see only unread channels in their respective categories, we recommend collapsing your custom categories and disabling **Group unread channels separately** under **Settings > Sidebar**.

Managing Direct Messages
------------------------

To sort your Direct Messages, select the **Channel options** icon in the sidebar, then select **Sort** and choose from **Alphabetically** or **Recent Activity**.

How many Direct Messages to display?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Control how many Direct Message conversations display in the **Direct Messages** category to keep your conversations manageable. You can choose to show all messages or a fixed number of messages.

To configure the number of Direct Messages to display, go to **Settings > Sidebar**, then set **Number of direct messages to show**. Or select the **Channel options** icon in the sidebar, then select **Show**.

Choose from **All direct messages**, or choose to show **10**, **15**, **20**, or **40** messages. Once you exceed the number of Direct Messages configured, older messages are hidden from the **Direct Messages** category. You can always increase the number of conversations displayed to see older Direct Messages.

  .. image:: ../images/dm-display.gif

.. note::
  Direct Message conversations that you add to custom categories don't count against the maximum number of conversations shown in the **Direct Messages** category.

source/archive/organizing-mattermost.rst METASEP
:nosearch:

Organizing Mattermost
=====================

|all-plans| |cloud| |self-hosted|

.. |all-plans| image:: ../images/all-plans-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in Mattermost Free and Starter subscription plans.

.. |cloud| image:: ../images/cloud-badge.png
  :scale: 30
  :target: https://mattermost.com/download
  :alt: Available for Mattermost Cloud deployments.

.. |self-hosted| image:: ../images/self-hosted-badge.png
  :scale: 30
  :target: https://mattermost.com/deploy
  :alt: Available for Mattermost Self-Hosted deployments.

The importance of organizing channels increases as Mattermost spreads to thousands of users.

This document shares best practices from various Mattermost deployments including:

1. `The importance of channel names`_
2. `How to navigate and organize channels`_
3. `Channel naming examples`_

The importance of channel names
-------------------------------

Channels organize communication in Mattermost.

When naming or renaming channels, consider the following:

Basic structure
~~~~~~~~~~~~~~~

- Channel names appear in menus where users select which conversations to join.
- Channel names are unique.
- Channel names have a 64 character limit to ensure readability on both desktop and mobile devices.
- An additional 128 characters are available to add a "Channel Purpose" visible when users are selecting channels.
- An additional 1024 characters are available for describing the channel in detail in the **Channel Header**.

Scoping names
~~~~~~~~~~~~~

It's natural to start with broadly defined channels and let them divide into narrower topics as discussions progress.

For example, you might begin with a general "Marketing" channel. As conversations progress, you might divide that channel into: "Marketing: Website", "Marketing: Social Media", "Marketing: General".

.. tip:: 

   Use colons to separate sections of channel names, rather than `` - `` or `` > `` which require more spaces to display.

As the organization grows, disciplines might split across business units, products, and geographies, with channel names like "US: Marketing" and "UK: Marketing".

.. tip:: 
   
   If you need to shorten country names, use standard `2-letter country codes <https://www.nationsonline.org/oneworld/country_code_list.htm>`__.

You can combine the hierarchies, with formats like ``[SUB-TEAM]: [TOPIC]: [SUB-TOPIC]``. For example: ``US: Mrkt: Website`` and ``UK: Mrkt: Social Media``.

.. tip:: 
   
   Shorten words, particularly categories, by removing vowels, endings and redundant letter sounds. Example: Turn "Marketing" into "Mrkt", and "Project" into "Prjt".

Good naming can take a team up to several thousand channels without significant confusion. Eventually every organization hits a limit and an additional team might need to be created on the server to accommodate the large number of channels.

How to navigate and organize channels
-------------------------------------

With guidance on how to set channel names, here are different navigation options and types of channels to consider:

Navigating channels using the keyboard
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Keyboard shortcuts allow users to jump between channels. 

Entering CTRL+K brings up a dialog where users can type in the first few letters of a channel, triggering auto-complete. Pressing ENTER jumps to the channel directly.

Keeping names clear and short lets users navigate large collections of channels quickly.

.. tip:: 
   
   Use ALT+SHIFT+UP and ALT+SHIFT+DOWN to move up and down to the next channel with an unread message.

Topic channels
~~~~~~~~~~~~~~

Topics are broad categories for organizing discussions. Topics are similar to how a user might create a folder for organizing emails or documents. Examples: Recruiting, Interviews, Legal Reviews, Documentation

Users can join and leave topic-based channels, as well as add colleagues to have topic-based discussions.

As teams get larger and the number of channels increase, you may start naming topics in a hierarchy to make them easier to find. Examples: Legal: Trademarks, Legal: Contracts, Legal: Licensing.

Meeting channels
~~~~~~~~~~~~~~~~

Meeting channels are often used to organize regular meetings. Members can add topics as messages to be discussed during the regular meeting time. Examples: Monday Sales Update, All Hands Meeting.

There are three built-in features to make meetings in Mattermost easier:

1. Numbered agenda items in title text

You can number and format messages as agenda items to discuss for the next meeting.

.. tip:: 
   
   Try pasting the following as an example in a channel designated for meetings::

	#### 1) Agenda item example
        #### Commentary about agenda item to be discussed.

2. Threaded messaging

On an agenda item message, you can select ``[...] > Reply`` to leave comments about an agenda item before or after a meeting to extended discussion.

3. Header links

When meeting remotely, add persistent links to your video or audio conferencing solution, like Zoom, Google Hangouts, or BlueJeans in the `channel header <https://docs.mattermost.com/help/settings/channel-settings.html#channel-header>`__.

When it's time to meet, your team can select the conference link to connect.

Sub-team channels
~~~~~~~~~~~~~~~~~

Sub-teams can include people from the same discipline, project teams, people with the same manager or other groups brought together for a shared purpose. Examples: Developers, Marketers, Offsite Organizing Committee, SusanK's Directs.

As sub-teams grow beyond a manageable size for one channel, they can sub-divide. Examples: US: Developers, UK: Developers, SusanK's Directs, SusanK's Extended Directs.

Project channels
~~~~~~~~~~~~~~~~

Project channels discuss how groups of people come together to achieve specific outcomes. Examples: Logo Design, Localization, Product Launch.

Projects are often Private channels rather than Public channels and are used to organize a small team around a project brought up in a larger channel. The Project Channel is used to do detailed work, and updates are typically communicated back to larger channels.

Location channels
~~~~~~~~~~~~~~~~~~

If your teams are in different buildings, cities, or regions, you can create Location channels to help people coordinate meetings and get-togethers. Examples: Building 10, Palo Alto, Toronto, Delaware.

This helps share announcements and discussions relevant to only those locations.

Data channels
~~~~~~~~~~~~~

Data channels allow automatic integration. Information like new or updated support tickets or bug reports, Twitter updates or mentions of your company name in the news can all be made available in channels your team chooses to monitor. There is a wide array of options. Examples: Bugs, Support Tickets, Twitter, News Mentions.
	
People might use these channels like a daily newspaper, reading about everything that's happened in the last day, while other configurations allow notifications to alert only when their username or certain key words are mentioned.

Channel naming examples
-----------------------

Here is an example of what a marketer's channels might look like in a small team:

CHANNELS

* Recruiting
* Interviews
* Marketing
* Sales
* All Hands Meeting
* Town Square
* Off-Topic

PRIVATE CHANNELS

* Website
* Twitter Marketing
* Logo Design

DIRECT MESSAGES

* [Sales People]
* [Marketers]
* [Recruiter]
* [Manager]

Here's an example of what a marketer's channels might look like if they were working in the Palo Alto, California office of a large enterprise, working on a product called "Pontoon":

CHANNELS

* Geo: PA: Recruiting
* Geo: PA: Interviews
* US: Mrkt: General
* US: Sales: West Coast
* US: All Hands
* Town Square
* Off-Topic

PRIVATE CHANNELS

* Pontoon: Mkrt: Website
* Pontoon: Mkrt: Twitter
* Pontoon: Mkrt: Logo Design

DIRECT MESSAGES

* [West Coast Sales People]
* [Marketing Peers]
* [Recruiter for PA office]
* [Manager]

source/archive/organizing-mattermost.html METASEP
<html><head><meta http-equiv="refresh" content="0; url=https://docs.mattermost.com/messaging/organizing-channels.html"></head></html>
source/archive/organizing-conversations.rst METASEP
:nosearch:

Organizing Conversations using Collapsed Reply Threads (Beta)
=============================================================

Threads are a key part of the messaging experience in Mattermost. Threads organize conversations within channels, and threads enable users to discuss topics without adding noise to channels or Direct Messages. 

Collapsed Reply Threads (Beta) offers an enhanced experience for users communicating in threads and replying to messages. Our goal is to improve users’ ability to process channel content, find, follow, and resume conversations more easily, and keep threaded conversations focused.

.. image:: ../../images/collapsed-reply-threads.gif
  :alt: Organize conversations using Collapsed Reply Threads.

Your System Admin must enable the Collapsed Reply Threads feature in the System Console. See our `Configuration Settings <https://docs.mattermost.com/configure/configuration-settings.html#collapsed-reply-threads-beta>`__ documentation for details. You can `enable this feature for your Mattermost account <https://docs.mattermost.com/messaging/manage-channels-settings.html#collapsed-reply-threads-beta>`__ by going to **Account Settings > Display > Collapsed Reply Threads (Beta)**.

Known Issues
------------

.. important::

    Collapsed Reply Threads are available as an early beta in Mattermost Cloud and Mattermost Server v5.37 and later. It's expected that you may experience bugs as we stabilize the feature. In particular, please be aware of these known issues: 
    
    - When enabling Collapsed Reply Threads for the first time, you may see channels or threads you’ve seen before appear as unread. To resolve this,
    
      - View any unread channels or use ALT+SHIFT+UP/DOWN to switch to unread channels with the keyboard. Work in-progress ticket: `MM-35494 <https://mattermost.atlassian.net/browse/MM-35494>`__
      - Use the **Mark all as read** button in the **Threads** view to mark your threads as read. Work in-progress ticket: `MM-35345 <https://mattermost.atlassian.net/browse/MM-35345>`__
       
    - You may experience lag in your desktop or web client if you're following many threads or opening threads with many replies. Work in-progress tickets: `MM-36696 <https://mattermost.atlassian.net/browse/MM-36696>`__, `MM-36697 <https://mattermost.atlassian.net/browse/MM-36697>`__, `MM-36698 <https://mattermost.atlassian.net/browse/MM-36698>`__
    - You should expect to see more unread channels and notifications on your mobile device than you'll see on your Desktop instance of Mattermost. This is expected until mobile support is available for Collapsed Reply Threads, expected in August 2021. For early access, join our `mobile beta program <https://github.com/mattermost/mattermost-mobile#testing>`__. 
    - For a comprehensive list of known issues, and to see our work queue in priority order, check out our `Kanban board <https://mattermost.atlassian.net/secure/RapidBoard.jspa?rapidView=91&quickFilter=499>`__.

Start or Reply to Threads
-------------------------

Replies are collapsed under the first message of a thread. To reply to a thread, select the **Reply** icon, or select the reply count if a thread already exists. 

.. tip:: 
    
    - Select anywhere on a message in a channel to view it, or reply to it, on the right-hand side.
    - In channels, a dot next to the thread participants indicates there are unread replies. You'll only see unreads for threads you're following.

.. image:: ../../images/crt-new-unread-threads.png
   :alt: A dot on threads in a channel indicates unread replies.

Follow Threads and Messages
---------------------------

You can follow particular messages and threads so that any reply activity triggers notifications. Follow or unfollow any thread, at any time, by toggling the thread’s **Follow/Following** indicator, or by accessing the **More Actions** menu. 

.. image:: ../../images/crt-following-thread.png
   :alt: Follow threads to stay updated on replies.

You'll automatically follow every thread you participate or are mentioned in. If you’re no longer interested in a or message thread, you can unfollow it to stop receiving notifications. Viewing a thread without responding to it doesn’t automatically follow that thread.

.. image:: ../../images/crt-more-actions.png
   :alt: Follow, unfollow, and mark threads as unread from More Actions.
   
.. tip::
  Follow messages with no replies from the **More Actions** menu to be notified if someone replies to the message later.

View All Threads
----------------

Select **Threads** at the top of the channel sidebar to see all your followed threads on the currently selected team. Threads with the most recent replies display at the top of the list. 

Select **Unreads** to filter your followed threads by only those with unread replies.

.. image:: ../../images/crt-thread-view.png
  :alt: Select Threads in the channel sidebar to see all thread updates in your Threads View.

Tutorial Video
---------------

For additional details about working with the Beta release of Collapsed Reply Threads, see our `tutorial video on YouTube <https://www.youtube.com/watch?v=hnD0Zj-mIbs>`_. 

.. raw:: html

   <div style="position: relative; padding-bottom: 50%; height: 0; overflow: hidden; max-width: 100%; height: auto;">
      <iframe src="https://www.youtube.com/embed/hnD0Zj-mIbs" frameborder="0" allowfullscreen style="position: absolute; top: 0; left: 0; width: 100%; height: 95%;"></iframe>
   </div>

source/archive/organizing-conversations-copy2.rst METASEP
:nosearch:

Organizing Conversations using Collapsed Reply Threads (Beta)
=============================================================

|all-plans| |cloud| |self-hosted|

.. |all-plans| image:: ../images/all-plans-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in Mattermost Free and Starter subscription plans.

.. |cloud| image:: ../images/cloud-badge.png
  :scale: 30
  :target: https://mattermost.com/download
  :alt: Available for Mattermost Cloud deployments.

.. |self-hosted| image:: ../images/self-hosted-badge.png
  :scale: 30
  :target: https://mattermost.com/deploy
  :alt: Available for Mattermost Self-Hosted deployments.

Threads are a key part of the messaging experience in Mattermost Channels. They're used to organize conversations and enable users to discuss topics without adding noise to channels or Direct Messages.

Collapsed Reply Threads (Beta) offers an enhanced experience for users communicating in threads and replying to messages. Our goal is to improve users’ ability to process channel content, find, follow, and resume conversations more easily, and keep threaded conversations focused.

.. image:: ../images/collapsed-reply-threads.gif
  :alt: Organize conversations using Collapsed Reply Threads.
  
Enable Collapsed Reply Threads (Beta)
-------------------------------------

Your System Admin must enable the Collapsed Reply Threads feature in the System Console. See our `Configuration Settings <https://docs.mattermost.com/configure/configuration-settings.html#collapsed-reply-threads-beta>`__ documentation for details. Before enabling, please ensure you are well versed with the known issues, particularly relating to database resource requirements and server performance implications. 

Once this feature is enabled in the System Console, you can `enable this feature for your account <https://docs.mattermost.com/messaging/managing-account-settings.html#collapsed-reply-threads-beta>`__ by going to **Settings > Display > Collapsed Reply Threads (Beta)**.

Known issues
------------

.. important::

    Collapsed Reply Threads is available as an early beta in Mattermost Cloud and Mattermost Server v5.37 and later. It's expected that you may experience bugs and server performance implications as we stabilize the feature. In particular, please be aware of these important known issues and risks:

    - Collapsed Reply Threads is a complex feature that will increase demand on your server and database resources. If you cannot easily scale up your database size, or are running the Mattermost application server and database server on the same machine, we recommended waiting to enable Collapsed Reply Threads until it's `promoted to general availability in Q2 2022 <https://mattermost.com/blog/collapsed-reply-threads-ga/>`_. Learn more about these `performance considerations here <https://support.mattermost.com/hc/en-us/articles/4413183568276>`__.   
    - When enabling Collapsed Reply Threads for the first time, you may see channels or threads you’ve seen before appear as unread. 
    - For a comprehensive list of known issues, and to see our work queue in priority order, check out our `Kanban board <https://mattermost.atlassian.net/secure/RapidBoard.jspa?rapidView=91&quickFilter=499>`__.

Start or reply to threads
-------------------------

Replies are collapsed under the first message of a thread. To reply to a thread, select the **Reply** icon, or select the reply count if a thread already exists.

.. tip:: 
    
    - Select anywhere on a message in a channel in the center pane to view it, or reply to it, on the right-hand side.
    - In channels, a dot next to the thread participants indicates there are unread replies. You'll only see unreads for threads you're following.

.. image:: ../images/crt-new-unread-threads.png
   :alt: A dot on threads in a channel indicates unread replies.

Follow threads and messages
---------------------------

You can follow particular messages and threads so that any reply activity triggers `notifications <https://docs.mattermost.com/messaging/managing-account-settings.html#notifications>`__. Follow or unfollow any thread, at any time, by toggling the thread’s **Follow/Following** indicator, or by accessing the **More Actions** menu.

.. image:: ../images/crt-following-thread.png
   :alt: Follow threads to stay updated on replies.

You'll automatically follow every thread you participate or are mentioned in. If you’re no longer interested in a or message thread, you can unfollow it to stop receiving notifications. Viewing a thread without responding to it doesn’t automatically follow that thread.

.. image:: ../images/crt-more-actions.png
   :alt: Follow, unfollow, and mark threads as unread from More Actions.
   
.. tip::
  Follow messages with no replies from the **More Actions** menu to be notified if someone replies to the message later based on your notification preferences.

View all threads
----------------

Select **Threads** at the top of the channel sidebar to see all your followed threads on the currently selected team. Threads with the most recent replies display at the top of the list. 

Select **Unreads** to filter your followed threads by only those with unread replies.

.. image:: ../images/crt-thread-view.png
  :alt: Select Threads in the channel sidebar to see all thread updates in your Threads View.

Tutorial video
---------------

For additional details about working with the Beta release of Collapsed Reply Threads, see our `tutorial video on YouTube <https://www.youtube.com/watch?v=hnD0Zj-mIbs>`_. 

.. raw:: html

   <div style="position: relative; padding-bottom: 50%; height: 0; overflow: hidden; max-width: 100%; height: auto;">
      <iframe src="https://www.youtube.com/embed/hnD0Zj-mIbs" frameborder="0" allowfullscreen style="position: absolute; top: 0; left: 0; width: 100%; height: 95%;"></iframe>
   </div>

source/archive/organizing-conversations copy.rst METASEP
:nosearch:

Managing Channels
==================

|all-plans| |cloud| |self-hosted|

.. |all-plans| image:: ../images/all-plans-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in Mattermost Free and Starter subscription plans.

.. |cloud| image:: ../images/cloud-badge.png
  :scale: 30
  :target: https://mattermost.com/deploy
  :alt: Available for Mattermost Cloud deployments.

.. |self-hosted| image:: ../images/self-hosted-badge.png
  :scale: 30
  :target: https://mattermost.com/deploy
  :alt: Available for Mattermost Self-Hosted deployments.

Channels can be created, joined, renamed, left, marked as a favorite, muted, unmuted, and archived.

Creating a channel
------------------

To create a new Public or Private channel, select the **+** symbol at the top of the channel sidebar, then select **Create New Channel**.

    .. image:: ../images/create-new-channel.png
        :alt: Create a channel.
    
Anyone can create Public channels or Private channels, unless the System Admin has `restricted the permissions <https://docs.mattermost.com/configure/configuration-settings.html#enable-public-channel-creation-for>`__.

Creating a Direct or Group Message
----------------------------------

To start a Direct or Group Message, select the **+** symbol at the top of the channel sidebar, then select **Open a Direct Message**. Or select the **+** symbol next to the **Direct Messages** category in the channel sidebar.

    .. image:: ../images/write-dm.png
        :alt: Access recent Direct Messages and Group Messages.
    
In the **Direct Messages** popup, identify your most recent conversations by relative timestamps.     

    .. image:: ../images/recent-direct-group-messages.png
        :alt: Write a Direct Message or Group Message.

Joining a channel
-----------------

To join a Public channel, select the **+** symbol at the top of the channel sidebar, then select **Browse Channels**. Search through the list of Public channels you can join, then select **Join**.

To join a Private channel, you need to be added to the channel by a member of that channel.

Adding members to a channel
---------------------------

Select the channel name at the top of the center pane to access the drop-down menu, then select **Add Members**. Any member of a channel can add up to 20 new members at a time by choosing **Add** next to a user's name. Users already added to the channel will not appear in this list.

    .. image:: ../images/add-member-to-channel.png

You can also add users to channels within their profile pop-over by choosing **Add to a Channel** and selecting the channel you want them to join.

    .. image:: ../images/add-member-pop.png
        :alt: Add a member to a channel.

Removing members from a channel
-------------------------------

Select the channel name at the top of the center pane to access the drop-down menu, then select **Manage Members**. Any member of a channel can remove other members by selecting the member’s channel role, then selecting **Remove from Channel**.

    .. image:: ../images/remove-member-from-channel.png
        :alt: Remove a member from a channel.

Naming a channel
----------------

Channels can be identified in two ways:

1. **Channel display name:** This appears in the Mattermost user interface. On Desktop, select the channel name at the top of the center pane to access the drop-down menu, then choose **Rename Channel**. Anyone can rename the channels they belong to, unless the System Admin has `restricted the permissions <https://docs.mattermost.com/configure/configuration-settings.html#enable-public-channel-renaming-for>`__.
2. **Channel handle:** This is part of the channel URL. You can also change the channel handle when renaming a channel, but changing channel handles may break existing links.

For example, for the following channel, ``https://community.mattermost.com/core/channels/ux-design``:

- Channel display name: ``UX Design``
- Channel handle: ``ux-design`` 

Leaving a channel
-----------------

Select the channel name at the top of the center pane to access the drop-down menu, then select **Leave Channel**. Any team member who leaves a Private channel must be re-added by another channel member if they wish to rejoin. Team members will not receive mention notifications from channels of which they are not members.

Archiving a channel
-------------------

Select the channel name at the top of the center pane to access the drop-down menu, then select **Archive Channel**. Anyone can archive the Public channels or Private channels they belong to, unless the System Admin has restricted the permissions.

When a channel is archived, it is removed from the user interface, but a copy exists on the server in case it is needed for audit reasons at a later stage. Because of this, the URL of a newly created channel cannot be the same URL name as an archived channel.

In addition to this, when a channel is archived, by default the contents cannot be viewed, shared, or searched. If you want to be able to view or search the channel later, either:

1. Ask your System Admin to set ``ExperimentalViewArchivedChannels`` to ``true`` in ``config.json`` to allow users to view, share, and search for content of channels that have been archived; or
2. Leave the channel open, but post a message in the channel saying it's considered archived: such as ``# This channel is archived.``

System Admins `can archive channels in the System Console <https://docs.mattermost.com/manage/team-channel-members.html#profile>`_ without needing to be a channel member.

Unarchiving a channel
---------------------

Search for the channel if required. Then, open the channel, select the channel name at the top of the center pane to access the drop-down menu and select **Unarchive Channel**. System Admins and Team Admins can unarchive Public channels or Private channels they belonged to when it was archived.

    .. image:: ../images/unarchive-channel.png
        :alt: Unarchive a channel.

When a channel is unarchived, channel membership and all its content is restored, unless messages and files have been deleted based on the `data retention policy <https://docs.mattermost.com/configure/configuration-settings.html#data-retention-policy>`__.

In addition to this, System Admins can also unarchive channels `via the CLI <https://docs.mattermost.com/manage/command-line-tools.html#mattermost-channel-restore>`_ and Team Admins can unarchive them `via the API <https://api.mattermost.com/#operation/RestoreChannel>`_.

Converting Public channels to Private channels (and vice versa)
---------------------------------------------------------------

Select the Public channel name at the top of the center pane to access the drop-down menu, then select **Convert to Private Channel**. Team and System Admins can convert Public channels to Private channels. Please note that default channels such as ``Town Square`` and ``Off-Topic`` cannot be converted to Private channels.

When a channel is converted, its history and membership are preserved. Membership in a Private channel is by invitation only. Publicly-shared files remain accessible to anyone with the link. 

.. note::
 
   Due to security concerns with sharing Private channel history, only System Admins can convert Private channels to Public channels via **System Console > Channels > Edit (Channel Configuration)**. Alternatively, perform this action using the `mmctl channel modify command <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-channel-modify>`__.

Favoriting a channel
--------------------

Favorite channels are a great way to organize your channel sidebar by choosing which Public channels, Private channels, and Direct Messages are most important to you.

To mark a channel as a favorite, open the channel:

**On desktop:** At the top of the page, select on the star icon next to the channel name.

    .. image:: ../images/favorite-channel-desktop.png
        :alt: Mark a channel as a favorite.
       
This adds the channel to a **Favorites** list at the top of the channel sidebar, so it's easy to access. To remove a channel from the **Favorites** list, select the star again.

    .. image:: ../images/favorites-list-sidebar.png
        :alt: Favorite channels in the channel sidebar.
       
**On mobile:** Select the channel name at the top of the center pane to access the drop-down menu, then select **Favorite**. To remove a channel from the **Favorites** list, select **Favorite** again.

Muting and unmuting a channel
-----------------------------

Select the channel name at the top of the center pane to access the drop-down menu, then select **Mute Channel**. 

Once a channel is muted:

- Email, desktop, and push notifications are disabled.
- A mute icon displays next to the channel name.
- The channel appears at reduced opacity in the channel sidebar, and the channel isn't marked as unread unless you're mentioned directly.

To unmute the channel, select the channel name again to access the drop-down menu, then select **Unmute Channel**.

Switching channels
------------------

Use the **Find channel** option in the channel sidebar, or press CMD/CTRL+K, to find other channels, visit recently reviewed channels, or review `member availability <https://docs.mattermost.com/messaging/setting-your-status-availability.html#setting-your-availability>`__ at a glance. 

.. image:: ../images/switch-channels.png
    :alt: Switch channels and review member availability.

Navigating recently viewed channels
-----------------------------------

Use the **History** arrows at the top of the sidebar to move back and forth through your channel history. 

- Select the left arrow to go back one page. 
- Select the right arrow to go forward one page.

source/archive/organizing-channels.rst METASEP
:nosearch:

Organizing Channels
====================

|all-plans| |cloud| |self-hosted|

.. |all-plans| image:: ../images/all-plans-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in Mattermost Free and Starter subscription plans.

.. |cloud| image:: ../images/cloud-badge.png
  :scale: 30
  :target: https://mattermost.com/download
  :alt: Available for Mattermost Cloud deployments.

.. |self-hosted| image:: ../images/self-hosted-badge.png
  :scale: 30
  :target: https://mattermost.com/deploy
  :alt: Available for Mattermost Self-Hosted deployments.

The importance of organizing your conversations increases as Channels spreads to thousands of users. This document shares best practices from various Mattermost deployments including:

1. `The importance of channel names`_
2. `How to navigate and organize channels`_
3. `Channel naming examples`_

The importance of channel names
-------------------------------

You can name and rename your conversations in Mattermost Channels. When you're choosing names, consider the following recommendations:

Basic Structure
~~~~~~~~~~~~~~~

- Channel names appear in menus where users select which conversations to join.
- Channel names are unique.
- Channel names have a 64 character limit to ensure readability on both desktop and mobile devices.
- An additional 128 characters are available to add a "Channel Purpose" visible when users are selecting channels.
- An additional 1024 characters are available for describing the channel in detail in the "Channel Header".

Scoping Names
~~~~~~~~~~~~~

It's natural to start with broadly defined channels and let them divide into narrower topics as discussions progress.

For example, you might begin with a general "Marketing" channel. As conversations progress, you might divide that channel into: "Marketing: Website", "Marketing: Social Media", "Marketing: General".

.. tip:: 

   Use colons to separate sections of channel names, rather than `` - `` or `` > `` which require more spaces to display.

As the organization grows, disciplines might split across business units, products and geographies, with channel names like "US: Marketing" and "UK: Marketing".

.. tip:: 
   
   If you need to shorten country names, use standard `2-letter country codes <https://www.nationsonline.org/oneworld/country_code_list.htm>`__.

You can combine the hierarchies, with formats like ``[SUB-TEAM]: [TOPIC]: [SUB-TOPIC]``. For example: ``US: Mrkt: Website`` and ``UK: Mrkt: Social Media``.

.. tip:: 
   
   Shorten words, particularly categories, by removing vowels, endings and redundant letter sounds. Example: Turn "Marketing" into "Mrkt", and "Project" into "Prjt".

Good naming can take a team up to several thousand channels without significant confusion. Eventually every organization hits a limit and an additional team might need to be created on the server to accommodate the large number of channels.

How to navigate and organize channels
-------------------------------------

With guidance on how to set channel names, here are different navigation options and types of channels to consider:

Navigating channels using the keyboard
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Keyboard shortcuts allow users to jump between channels. 

Entering CTRL+K brings up a dialog where users can type in the first few letters of a channel, triggering auto-complete. Pressing ENTER jumps to the channel directly.

Keeping names clear and short lets users navigate large collections of channels quickly.

.. tip:: 
   
   Use ALT+SHIFT+UP and ALT+SHIFT+DOWN to move up and down to the next channel with an unread message.

Topic Channels
~~~~~~~~~~~~~~

Topics are broad categories for organizing discussions. Topics are similar to how a user might create a folder for organizing emails or documents. Examples: Recruiting, Interviews, Legal Reviews, Documentation

Users can join and leave topic-based channels, as well as add colleagues to have topic-based discussions.

As teams get larger and the number of channels increase, you may start naming topics in a hierarchy to make them easier to find. Examples: Legal: Trademarks, Legal: Contracts, Legal: Licensing.

Meeting Channels
~~~~~~~~~~~~~~~~

Meeting channels are often used to organize regular meetings. Members can add topics as messages to be discussed during the regular meeting time. Examples: Monday Sales Update, All Hands Meeting.

There are three built-in features to make meetings in Channels easier:

1. Numbered agenda items in title text

You can number and format messages as agenda items to discuss for the next meeting.

.. tip:: 
   
   Try pasting the following as an example in a channel designated for meetings::

	#### 1) Agenda item example
        #### Commentary about agenda item to be discussed.

2. Threaded messaging

On an agenda item message, you can select ``[...] > Reply`` to leave comments about an agenda item before or after a meeting to extended discussion.

3. Header links

When meeting remotely, add persistent links to your video or audio conferencing solution, like Zoom, Google Hangouts or BlueJeans in the `channel header <https://docs.mattermost.com/messaging/channel-settings.html#channel-header>`__.

When it's time to meet, your team can click the conference link to connect.

Sub-Team Channels
~~~~~~~~~~~~~~~~~

Sub-teams can include people from the same discipline, project teams, people with the same manager or other groups brought together for a shared purpose. Examples: Developers, Marketers, Offsite Organizing Committee, SusanK's Directs

As sub-teams grow beyond a manageable size for one channel, they can sub-divide. Examples: US: Developers, UK: Developers, SusanK's Directs, SusanK's Extended Directs.

Project Channels
~~~~~~~~~~~~~~~~

Project channels discuss how groups of people come together to achieve specific outcomes. Examples: Logo Design, Localization, Product Launch.

Projects are often private channels rather than public channels and are used to organize a small team around a project brought up in a larger channel. The Project Channel is used to do detailed work, and updates are typically communicated back to larger channels.

Location Channels
~~~~~~~~~~~~~~~~~~

If your teams are in different buildings, cities or regions, you can create Location channels to help people coordinate meetings and get-togethers. Examples: Building 10, Palo Alto, Toronto, Delaware.

This helps share announcements and discussions relevant to only those locations.

Data Channels
~~~~~~~~~~~~~

Data channels allow automatic integration. Information like new or updated support tickets or bug reports, Twitter updates or mentions of your company name in the news can all be made available in channels your team chooses to monitor.  
There is a wide array of options. Examples: Bugs, Support Tickets, Twitter, News Mentions.
	
People might use these channels like a daily newspaper, reading about everything that's happened in the last day, while other configurations allow notifications to alert only when their username or certain key words are mentioned.

Channel naming examples
-----------------------

Here is an example of what a marketer's channels might look like in a small team:

CHANNELS

* Recruiting
* Interviews
* Marketing
* Sales
* All Hands Meeting
* Town Square
* Off-Topic

PRIVATE CHANNELS

* Website
* Twitter Marketing
* Logo Design

DIRECT MESSAGES

* [Sales People]
* [Marketers]
* [Recruiter]
* [Manager]

Here's an example of what a marketer's channels might look like if she was working in the Palo Alto, California office of a large enterprise, working on a product called "Pontoon":

CHANNELS

* Geo: PA: Recruiting
* Geo: PA: Interviews
* US: Mrkt: General
* US: Sales: West Coast
* US: All Hands
* Town Square
* Off-Topic

PRIVATE CHANNELS

* Pontoon: Mkrt: Website
* Pontoon: Mkrt: Twitter
* Pontoon: Mkrt: Logo Design

DIRECT MESSAGES

* [West Coast Sales People]
* [Marketing Peers]
* [Recruiter for PA office]
* [Manager]

source/archive/oauth-2-0-applications.rst METASEP
:nosearch:

OAuth 2.0 Applications
======================

OAuth 2.0 is a protocol that allows Mattermost to authorize API requests from external applications. The authorization allows:

- Users with an account on a Mattermost server to sign in to third-party applications. You can find a `sample OAuth2 Client Application for Mattermost here <https://github.com/enahum/mattermost-oauth2-client-sample>`__ to test the functionality.
- A Mattermost server to authenticate requests to a third-party API. One popular application is Zapier integration which allows you to integrate more than 700 applications with Mattermost through OAuth 2.0. See our `Zapier documentation <https://docs.mattermost.com/integrations/zapier.html>`__ to learn more.

This documentation includes the following details:

 - `Register your application in Mattermost <https://docs.mattermost.com/developer/oauth-2-0-applications.html#id1>`__
 - `Granting permissions to your application <https://docs.mattermost.com/developer/oauth-2-0-applications.html#id3>`__

Register your application in Mattermost
---------------------------------------

You must register your application in Mattermost to generate OAuth 2.0 credentials (client ID and secret), which your application can use to authenticate API calls to Mattermost, and which Mattermost uses to authorize API requests from the application.

If you'd like to set up a Zapier integration with OAuth 2.0, see our `Zapier documentation <https://docs.mattermost.com/integrations/zapier.html>`__ to learn more.

Enable OAuth 2.0 Applications
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

OAuth 2.0 applications are off by default and can be enabled by the System Admin as follows:

1. Log in to your Mattermost server as the System Administrator.
2. Go to **System Console > Integrations > Integration Management**.
3. Set `Enable OAuth 2.0 Service Provider <https://docs.mattermost.com/configure/configuration-settings.html#enable-oauth-2-0-service-provider>`__ to **True**.
4. (Optional) If you'd like to allow external applications to post with customizable usernames and profile pictures, then set `Enable integrations to override usernames <https://docs.mattermost.com/configure/configuration-settings.html#enable-integrations-to-override-usernames>`__ and `Enable integrations to override profile picture icons <https://docs.mattermost.com/configure/configuration-settings.html#enable-integrations-to-override-profile-picture-icons>`__ to **True**.
5. (Optional) If you'd like to allow users on your system who are not System Admins to create OAuth 2.0 applications, then set `Restrict managing integrations to Admins <https://docs.mattermost.com/administration/config-settings.html#restrict-managing-integrations-to-admins>`__ to **False**.

Register an OAuth 2.0 Application
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Go to **Main Menu** > **Integrations**
2. Select **OAuth 2.0 Applications**, then choose **Add OAuth 2.0 Application**
3. Set **Is Trusted**: When set to **Yes**, your application is considered trusted by Mattermost. This means Mattermost doesn't require users to accept authorization when signing to third-party applications. When set to **No**, users will be provided with the following page to accept or deny authorization when authenticating for the first time.

.. image:: ../images/oauth2_authorization_screen.png

Only System Admins can set OAuth 2.0 applications as trusted.

4. Specify the **Display Name**: Enter a name for your application made of up to 64 characters. This is the name users will see when granting access to the application, when viewing a list of authorized applications in **Account Settings > Security > OAuth 2.0 Applications** and when viewing a list of OAuth 2.0 applications in **Main Menu** > **Integrations**.
5. Add **Description**: This is a short description of your application that users will see when viewing a list of authorized applications in **Account Settings > Security > OAuth 2.0 Applications**.
6. Specify the **Homepage**: This is the homepage of the OAuth 2.0 application and lets users visit the app page to learn more what it does. The URL must be a valid URL and start with ``http://`` or ``https://`` depending on your server configuration.
7. (Optional) Add **Icon URL**: The image users will see when viewing a list of authorized applications in **Account Settings > Security > OAuth 2.0 Applications** and when viewing a list of OAuth 2.0 applications in **Main Menu** > **Integrations**. Must be a valid URL and start with ``http://`` or ``https://``.
8. Add **Callback URLs**: These are the URL(s) to which Mattermost will redirect users after accepting or denying authorization of your application, and which will be the only URL(s) that handle authorization codes or access tokens. If more than one URL is specified, users will be redirected to the URL used for the initial authorization of the app. Each URL must be on a separate line and start with ``http://`` or ``https://``.
9. Select **Save** to create the application. 

.. image:: ../images/oauth2_app_screen.png

10. You'll be provided with a **Client ID**, **Client Secret**, and the authorized redirect URLs. Save these values and use them in your application to connect it to Mattermost.

.. image:: ../images/oauth2_confirmation_screen.png

.. note::
  
  **Client Secret** can be regenerated by the application creator or System Admin. Tokens created with the old secret will remain valid and authorization of existing users will continue to work; however, new authorizations and requests for new tokens will fail until the client secret has been updated in your app configuration.

.. image:: ../images/oauth2_regenerate_secret.png

Granting permissions to your application 
----------------------------------------

Once you have created an OAuth 2.0 application, all users on the Mattermost server are automatically given access to it.

The application does not automatically have permissions based on the user who registers the app - the permissions are based on which users go through the OAuth flow, which could be the user who registers the app or anyone else on the system.

If the application was registered as a trusted OAuth 2.0 app on the Mattermost server, authorization from users is not required. Otherwise, the following page will be provided to accept or deny authorization when authenticating the app for the first time.

.. image:: ../images/oauth2_authorization_screen.png

Once authorized, the application receives an access token to perform requests on behalf of that user. The application can then perform any action for which the user has permission.

Users can view a list of authorized apps from **Account Settings > Security > OAuth 2.0 Applications**, and revoke authorization from this setting.

.. image:: ../images/oauth2_deauthorize_app.png

OAuth login endpoints
---------------------

- Authorize URI ``/oauth/authorize``
- Token URI ``/oauth/access_token``
- User info URI ``/api/v4/users/me``

Deleting your application
-------------------------

Deleting the application will revoke access from all users. Only the user who created the application or a System Admin can delete the app.

source/archive/new-bug-tickets.rst METASEP
:nosearch:

Creating New Jira Bug Tickets
===============================

This page has moved to the `Mattermost Handbook <https://handbook.mattermost.com/operations/research-and-development/product/development-process/new-bug-tickets>`__.

source/archive/navigating-mattermost.rst METASEP
:nosearch:

Navigating Mattermost
=====================

.. include:: common-navigating-mattermost-products.rst

source/archive/navigating-mattermost-playbooks.rst METASEP
:nosearch:

Navigating Mattermost
=====================

.. include:: ../messaging/common-navigating-mattermost-products.rst

source/archive/navigating-mattermost-boards.rst METASEP
:nosearch:

Navigating Mattermost
=====================

.. include:: ../messaging/common-navigating-mattermost-products.rst

source/archive/mobile-release-process.rst METASEP
:nosearch:

Mobile App Release Process
===========================

This page has moved to the `Mattermost Handbook <https://handbook.mattermost.com/operations/research-and-development/product/release-process/mobile-release>`__.

source/archive/mobile-mobileiron.rst METASEP
:nosearch:

Set Up Mattermost with MobileIron EMM
=====================================

1. Log in to your MobileIron Cloud tenant.

2. Click on **Apps** and then **App Catalog**.

.. image:: ../../source/images/mobileiron_step2.png

3. Click the **Add** button.

4. Select **App Store** or **Google Play** to use the published apps by Mattermost. If you are building the apps yourself, use the option for **In-House** and then browse to select the .apk or .ipa file.

.. image:: ../../source/images/mobileiron_step4.png

5. After uploading the .ipa or .apk file or selecting **Mattermost** from the published app search results, click **Next**. In our example will be using the app in the Apple App Store.

6. Review or fill in the information for the app, and click **Next**.

.. image:: ../../source/images/mobileiron_step6.png

7. Choose an option for distributing the Mattermost app to users and click **Next**.

.. image:: ../../source/images/mobileiron_step7.png

8. Here you'll be presented different options to configure the app. Fill in the ones you need, and then go to **iOS Managed App Configuration** and click on the "**+**" sign.

.. image:: ../../source/images/mobileiron_step8.png

9. Fill in a name for the configuration and optional description. Then enter the key-value pairs using the values from the :ref:`appconfig-table`.

.. image:: ../../source/images/mobileiron_step9.png

10. Select a distribution option for this configuration and click **Next**.

.. image:: ../../source/images/mobileiron_step10.png

11. Review all you config settings one more time and click **Done**.

source/archive/mobile-developer-setup.rst METASEP
:nosearch:

..  _mobile-developer-setup:

Mobile Developer Setup
======================

See mobile developer machine setup at `developers.mattermost.com <https://developers.mattermost.com/contribute/mobile/developer-setup/>`__.

source/archive/mobile-compile-yourself.rst METASEP
:nosearch:

Build Your Own Version of the Mattermost Mobile Apps
====================================================

To deploy in production with privately-hosted mobile apps compiled by your organization in an Enterprise App Store:

1. Compile your own iOS and Android mobile applications from the `open source repository <https://github.com/mattermost/mattermost-mobile>`__
  - See the :doc:`mobile developer guide <../developer/mobile-developer-setup>` for help setting up your environment and building the apps
  - Note: If your server version is not supported by the Mattermost apps, you will need to use the Mattermost Classic app repositories for `iOS <https://github.com/mattermost/mattermost-ios-classic>`__ and `Android  <https://github.com/mattermost/mattermost-android-classic>`__

2. Compile your own Mattermost Push Notification Service (MPNS) from the `open source repository <https://github.com/mattermost/mattermost-push-proxy>`__ or use the pre-compiled version from https://github.com/mattermost/mattermost-push-proxy/releases
  - To secure your push notifications, make sure to use encrypted TLS connections between:

    - MPNS and Apple Push Notification Service
    - MPNS and Google’s Firebase Cloud Messaging
    - MPNS and your Mattermost server

3. Set up a way to connect to your private network Mattermost instance, using:
  - An external proxy with encrypted transport through HTTPS and WSS network connections
  - (Recommended) Depending on your security policies, consider deploying a mobile VPN client with multi-factor authentication (MFA), GitLab SSO with MFA, or run Mattermost Enterprise Edition with MFA

4. Enable mobile push notifications
  - Go to **System Console** > **Notifications** > **Mobile Push** in prior versions or **System Console > Environment > Push Notification Server** in versions after 5.12
  - Under **Send Push Notifications**, select **Manually enter Push Notification Service location**
  - Enter the location of your Mattermost Push Notification Service in the **Push Notification Server** field

.. image:: ../images/mobile_manual_mpns.png

5. (Optional) Customize mobile push notification contents
  - Go to **System Console** > **Notifications** > **Mobile Push** in prior versions or **System Console > Site Configuration > Notifications** in versions after 5.12
  - Select an option for **Push Notification Contents** to specify what type of information to include in push notifications
  - Most deployments choose to include the **full message content sent in the notification payload**. If your organization has policies or compliance requirements regarding data security, you may opt for sending **full message content fetched from the server on receipt** (Enterprise Edition E20) so messages are not sent to Apple's Push Notification Service or Google's Firebase Cloud Messaging notification service.

.. image:: ../images/mobile_push_contents.png

6. Deploy to an Enterprise App Store

7. Confirm you're subscribed to `Mattermost Security Bulletins <https://mattermost.com/security-updates/#sign-up>`__. In future, when notified of security updates, apply them promptly. 

source/archive/mobile-blackberry.rst METASEP
:nosearch:

Set Up Mattermost with BlackBerry EMM
=====================================

1. Log in to your BlackBerry UEM environment.

2. Click on **Apps**.

.. image:: ../../source/images/blackberry_step2.png

3. Select the already published Mattermost app, or choose to add a new one.  When adding a new app, select **App Store** or **Google Play** to use the published apps by Mattermost. If you are building the apps yourself, use the option for **Internal apps** and then browse to select the .apk or .ipa file.

.. image:: ../../source/images/blackberry_step3.png

4. Next fill in the app name, description, and any other information needed for deployment in the screen below. See BlackBerry documentation for more details on the settings for `internal apps <https://help.blackberry.com/en/blackberry-uem/12.6/administration/adr1393870066674.html>`__, `public iOS apps <https://help.blackberry.com/en/blackberry-uem/12.6/administration/ios-apps.html>`__, and `Android for Work apps <https://help.blackberry.com/en/blackberry-uem/12.6/administration/adr1427221741509.html>`__.

.. image:: ../../source/images/blackberry_step4.png

5. In the same screen look for **App configuration**. You can either upload this :download:`xml file <mattermost-specfile.xml>` as the template, or add the configuration manually with the keys and values described in the :ref:`appconfig-table`.

  A. Using the template:

    - Browse for the xml template file (Note: If you build the app yourself, make sure to edit the template to use your bundle or package ID)

    .. image:: ../../source/images/blackberry_step5a1.png

    - Set the name of the app configuration and edit the settings that appear on screen, then click **Save**

    .. image:: ../../source/images/blackberry_step5a2.png

  B. Manual configuration:

    - Click on the "**+**" at the far right of the App configuration table and select **Configure Manually**

    .. image:: ../../source/images/blackberry_step5b1.png

    - Enter a name for the app configuration, and then add the key value pairs found in the :ref:`appconfig-table`.

    .. image:: ../../source/images/blackberry_step5b2.png

    - Save your configuration

source/archive/mobile-appstore-install.rst METASEP
:nosearch:

Install from Apple App Store and Google Play
============================================

To deploy the apps hosted in the Apple App Store and Google Play, we recommend you take the following steps to secure your deployment:

1. Set up a way to connect to your private network Mattermost instance, using:
  - An external proxy with encrypted transport through HTTPS and WSS network connections
  - (Recommended) Depending on your security policies, consider deploying a mobile VPN client with multi-factor authentication (MFA), GitLab SSO with MFA, or run Mattermost Enterprise Edition with MFA
  
2. Enable mobile push notifications
  - Go to **System Console > Notifications > Mobile Push** in prior versions or **System Console > Environment > Push Notification Server** in versions after 5.12
  - If testing the apps, or using Team Edition: Select "Use TPNS connection to send notifications to iOS and Android apps"
  - If using the apps in production with Enterprise Edition: Select "Use HPNS connection with uptime SLA to send notifications to iOS and Android apps"

.. image:: ../images/mobile_hpns.png

3. (Optional) Customize mobile push notification contents
  - Go to **System Console** > **Notifications** > **Mobile Push** in prior versions or **System Console > Site Configuration > Notifications** in versions after 5.12
  - Select an option for **Push Notification Contents** to specify what type of information to include in push notifications
  - Most deployments choose to include the **full message content sent in the notification payload**. If your organization has policies or compliance requirements regarding data security, you may opt for sending **full message content fetched from the server on receipt** (Enterprise Edition E20) so messages are not sent to Apple's Push Notification Service or Google's Firebase Cloud Messaging notification service.

.. image:: ../images/mobile_push_contents.png

4. Download the mobile applications to your mobile device:

  - `iOS App <https://apps.apple.com/us/app/mattermost/id1257222717>`__
  - `Android App <https://play.google.com/store/apps/details?id=com.mattermost.rn>`__

5. Open the mobile application and enter the address of your Mattermost server to connect

6. Confirm you're subscribed to `Mattermost Security Bulletins <https://mattermost.com/security-updates/#sign-up>`__. In future, when notified of security updates, apply them promptly. 

source/archive/mobile-apps-faq.rst METASEP
:nosearch:

Mobile Apps FAQ
===============

Can I connect to multiple Mattermost servers using the mobile apps?
-------------------------------------------------------------------

At the moment, we only support connecting to one server at a time; however, we are aware that this is one of the `top feature requests <https://mattermost.uservoice.com/forums/306457-general/suggestions/10975938-ios-and-android-apps-should-allow-multiple-server>`__ for the mobile app. We are currently investigating some technical challenges, such as how to handle push notifications coming from multiple servers. To follow our progress on this feature, you can join the `RN: Multi-Server <https://community.mattermost.com/core/channels/rn-multi-server-suppot>`_ channel on our community server.

As a workaround, you can install the released Mattermost mobile app and sign up to be a `tester <https://github.com/mattermost/mattermost-mobile/blob/master/README.md#testing>`__ for the Mattermost Beta mobile app. This allows you to connect and log in to a different server from each app.

Is there a tablet version of the mobile apps?
---------------------------------------------

Mattermost Classic mobile apps support tablets.

Our second generation mobile apps (Mattermost) have beta support for tablets.

Can the permanent sidebar on tablet devices be disabled?
--------------------------------------------------------

The permanent sidebar is on by default for tablet-sized devices, but can be disabled from **Settings > Display > Sidebar > Permanent Sidebar**. When disabled, the sidebar behaves similarly to mobile devices where the user must open it using the button in the top-left corner of the screen.

How is data handled on mobile devices after a user account is deactivated?
--------------------------------------------------------------------------

App data is wiped from the device when a user logs out of the app. If the user is logged in when the account is deactivated, then within one minute of deactivation the system logs the user out. Thereafter all app data is wiped from the device.

Do I need to compile the mobile apps to host my own push notification server?
------------------------------------------------------------------------------

Yes. To host your own push notification server, you'll need to compile the mobile apps. See `documentation <https://docs.mattermost.com/mobile/mobile-compile-yourself.html>`__ to learn how to compile your own mobile apps.

How do push notifications work?
-------------------------------

Your Mattermost server sends push notifications to a hosted push proxy server, which relays them via mobile push notification services provided by Apple and Google.

To ensure push notifications are coming from a trusted source, Apple and Google only allow push notifications sent from a service using a key or signature corresponding to a secret compiled into the mobile app itself.

The full process is outlined below:

1. An action triggering a push notification is detected in the Mattermost server running in your private network.

2. Your Mattermost server sends a push notification message to a Mattermost Push Notification Service (MPNS), either self-hosted in your private network, or publicly hosted by Mattermost, Inc.

3. MPNS sends a push notification message to either Apple Push Notification Service (APNS) or to Google’s Firebase Cloud Messaging (FCM) service over a TLS connection.

  - If sent to Apple, the message has a signature corresponding to a secret compiled in the iOS app.
  - If sent to Google, the message uses a key corresponding to a secret compiled in the Android app.

Regardless of whether you're using iOS or Android, the MPNS needs to have access to the appropriate secret compiled into the mobile app.

This means if you use the Mattermost apps from the Apple App Store or Google Play, you need to use the hosted push notification service from Mattermost, Inc. If you compile the apps yourself, you must also compile and use your own MPNS with the corresponding secret.

4. Either APNS or FCM receives the push notification message from MPNS over TLS, and then relays the message to the user's iOS or Android device to be displayed.

.. note:: 

  The use of push notifications with iOS and Android applications will require a moment where the contents of push notifications are visible and unencrypted by a server controlled by either Apple or Google. This is standard for any iOS or Android app. For this reason, there is an `option to omit the contents of Mattermost messages from push notifications <https://docs.mattermost.com/configure/configuration-settings.html#push-notification-contents>`_, or `to configure message content to be fetched from the server <https://docs.mattermost.com/configure/configuration-settings.html#push-notification-contents>`_ when the notification reaches the device (*available in Enterprise Edition E20*) in order to meet certain compliance requirements.

What post metadata is sent in mobile push notifications?
--------------------------------------------------------

The following post metadata is sent in all push notifications:

- ``Team ID``
- ``Channel ID``
- ``Post ID``
- ``User ID`` (post author)
- ``Username`` (post author or webhook override username)
- ``Root ID`` (only if the post is in a thread)
- ``Type`` (create or clear push notification)
- ``Category`` (iOS only, determines if the notifications can be replied to)
- ``Badge number`` (what the notification badge on the app icon should be set to when the notification is received)

Additional metadata may be sent depending on the System Console setting for `Push Notification Contents <https://docs.mattermost.com/configure/configuration-settings.html#push-notification-contents>`__:

- **Generic description with sender and channel names:** ``Channel name`` metadata will be included.
- **Full message content sent in the notification payload:** ``Post content`` and ``Channel name`` metadata will be included.
- **Full message content fetched from the server on receipt (*available in Enterprise Edition E20*):** ``Post content`` and ``Channel name`` are not included in the notification payload. Instead the ``Post ID`` is used to fetch ``Post content`` and ``Channel name`` from the server after the push notification is received on the device.

How can I use ID-Only Push Notifications to protect notification content from being exposed to third-party services?
---------------------------------------------------------------------------------------------------------------------

When it comes to mobile data privacy, many organizations prioritize secure handling of messaging data, particularly when it may contain mission-critical or proprietary information. These organizations may have concerns about using mobile notifications because data must pass through third-party entities like Apple Push Notification Service (APNS) or Google Firebase Cloud Messaging (FCM) before it reaches a device. This poses a potential risk for organizations that operate under strict compliance requirements and cannot expose message data to external entities.

To solve this, we offer an option for greater protection for Mattermost push notification message data by only sending a unique message ID in the notification payload rather than the full message data (*available in Enterprise Edition E20*). Once the device receives the ID, it then fetches the message content directly from the server and displays the notification per usual. External entities, such as APNS and FCM, handle only the ID and are unable to read any part of the message itself. 

If your organization has strict privacy or compliance needs, the `ID-Only Push Notification <https://docs.mattermost.com/configure/configuration-settings.html#push-notification-contents>`_ setting offers a high level of privacy while still allowing your team members to benefit from mobile push notifications.

What are my options for securing the mobile apps?
-------------------------------------------------

The following options for secure mobile app deployments are available:

1. Securing network connection to mobile apps
  - Use HTTPS and WSS network connections to encrypt transport.
  - Use of a mobile VPN client on mobile devices to establish secure connection to Mattermost server within private network.

2. Use multifactor authentication options
  - If a VPN client with multifactor authentication is not in use, it's highly recommended that MFA is required on authenticating into Mattermost, either within Mattermost itself or via your SSO provider.

What are my options for securing push notifications?
----------------------------------------------------

The following options are available for securing your push notification service:

1.  Protecting notification contents
  - You can `choose what type of information to include in push notifications <https://docs.mattermost.com/configure/configuration-settings.html#push-notification-contents>`__, such as excluding the message contents if your compliance policies require it. Default server settings have message contents turned off.

2. Disabling push notifications
  - Push notifications can also be disabled entirely depending on security requirements. Default server settings have push notifications disabled.

3. Encrypting connections for apps you compile yourself:
  - When using a privately-hosted Mattermost Push Notification Service (MPNS), use encrypted TLS connections between:

    - MNPS and Apple Push Notification Service (APNS)
    - MPNS and Google’s Firebase Cloud Messaging (FCM)
    - MPNS and your Mattermost server

4. Securing the Mattermost Apple App Store and Google Play apps:
  - When using Mattermost mobile apps from the App Store and Google Play, purchase an annual subscription to Mattermost Enterprise Edition E10 or higher, which offers a :doc:`Hosted Push Notification Service (HPNS) <mobile-hpns>`.

.. note:: 
  
  For configuration details, see guides for :doc:`deploying the Mattermost App Store and Google Play apps <mobile-appstore-install>` and :doc:`deploying your own version of the apps <mobile-compile-yourself>`. 

Why do I sometimes see a delay in receiving a push notification?
----------------------------------------------------------------

`Apple Push Notification Service (APNS) <https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/APNSOverview.html#//apple_ref/doc/uid/TP40008194-CH8-SW1>`_ and `Google Fire Cloud Messaging (FCM) <https://firebase.google.com/docs/cloud-messaging>`_ determine when your device receives a push notification from Mattermost. Thus, a delay is usually as a result of those services.

The technical flow for the device to receive a push notification is as follows:

1. User posts a message in Mattermost.
2. Mattermost server identifies if notifications needs to be sent.
3. If yes, Mattermost server sends a payload containing the push notification to the push proxy.
4. The push proxy parses the notification and relays it to APNS and FCM.
5. APNS and FCM informs the relevant devices that there is a push notification for Mattermost. This usually happens almost immediately, but may be delayed by a couple of minutes.
6. Mattermost processes the notification and displays it on the user's device.

How do I deploy Mattermost with Enterprise Mobility Management (EMM) providers?
-------------------------------------------------------------------------------

Mattermost enables customers with high privacy and custom security requirements to deploy mobile app and push notification services using keys that they alone control.

:doc:`Learn more about using AppConfig for EMM providers <mobile-appconfig>`.

How do I host the Mattermost push notification service?
-------------------------------------------------------

First, you can use the :doc:`Mattermost Hosted Push Notification Service (HPNS) <mobile-hpns>`. Organizations can also `host their own push proxy server instead <https://developers.mattermost.com/contribute/mobile/push-notifications/service/>`_. This is applicable when you want to:

1. Customize the `Mattermost mobile apps <https://developers.mattermost.com/contribute/mobile/build-your-own/>`_;
2. Deploy your own push notification service, or
3. Repackage the mobile apps with BlueCedar or AppDome (both of which are not officially supported but have been successfully deployed by some organizations).

How do I receive mobile push notifications if my IT policy requires the use of a corporate proxy server?
-------------------------------------------------------------------------------------------------------

See our `developer documentation about the Mattermost Push Notification Service with Corporate Proxy <https://developers.mattermost.com/contribute/mobile/push-notifications/corporate-proxy>`_.

How do I white label the app and customize build settings?
----------------------------------------------------------

All files in the ``/assets/base`` folder can be overridden as needed without conflicting with changes made to the upstream version of the app. To do this:

1. Create the folder ``/assets/override``.
2. Copy any files or folders that you wish to replace from ``/assets/base`` into ``/assets/override``.
3. Make your changes to the files in ``/assets/override``.

When you compile the app or run ``make dist/assets``, the contents of those two folders will be merged with files in ``/assets/override``, taking precedence in the case of any conflicts. For binary files such as images, an overridden file will completely replace the base version, while ``JSON`` files will be merged so that fields not set in the overridden copy use the base version.

For a more specific example of how to use this feature, see the following section.

How do I preconfigure the server URL for my users?
----------------------------------------------------

You can preconfigure the server URL and other settings by overriding default ``config.json`` settings and building the mobile apps yourself.

1. Fork the `mattermost-mobile repository <https://github.com/mattermost/mattermost-mobile>`__.
2. Create the file ``/assets/override/config.json`` in your forked mattermost-mobile repository.
3. Copy and paste all the settings from ``assets/base/config.json`` to the newly-created ``/assets/override/config.json`` file that you want to override.
4. To override the server URL, set ``DefaultServerURL`` to the server URL of your Mattermost server in ``/assets/override/config.json``.
5. (Optional) If you want to prevent users from changing the server URL, set ``AutoSelectServerUrl`` to ``true``.
6. (Optional) Override any other settings you like.

After the above, your ``/assets/override/config.json`` file would look something like this:

  .. code-block:: json
  
    {
        "DefaultServerURL": "my-mattermost-instance.example.com",
        "AutoSelectServerUrl": true,
        "ExperimentalUsernamePressIsMention": true
    }

7. Finally, `compile your own version <https://docs.mattermost.com/mobile/mobile-compile-yourself.html>`__ of the Mattermost mobile app and Mattermost push proxy server.

How can I get Google SSO to work with the Mattermost mobile app?
-----------------------------------------------------------------

The apps on the Apple App Store and Google Play Store cannot support Google SSO out of the box. This is because Google requires a unique Google API key that's specific to each organization.

If you need Google SSO support, you can create a custom version of the app for your own organization. Fork the `mattermost-mobile <https://github.com/mattermost/mattermost-mobile>`__  repository and add support for Google SSO before compiling the app yourself. If this is something you’re interested in, please `file an issue in GitHub <https://github.com/mattermost/mattermost-mobile/issues>`__ to start the discussion.

How do I configure deep linking?
--------------------------------

The app checks for platform-specific configuration on app install. If no configuration is found, then the deep linking code sits silently and permalinks act as regular links.

**Set up for iOS**

1. Create an ``apple-app-site-association`` file in the ``.well-known`` directory at the root of your server. It should be accessible by navigating to ``https://<your-site-name>/.well-known/apple-app-site-association``. There should not be a file extension.
2. In order to handle deep links, paste the following ``JSON`` into the ``apple-app-site-association`` file. Make sure to place your app ID in the ``appID`` property:
::
    {
        "applinks": {
            "apps": [],
            "details": [
                {
                    "appID": "<your-app-id-here>",
                    "paths": ["**/pl/*", "**/channels/*"]
                }
            ]
        }
    }

3. Add the associated domains entitlement to your app via the Apple developer portal.
4. Add an entitlement that specifies the domains your app supports via the Xcode entitlements manager.
5. Before installing the app with the new entitlement, make sure that you can view the contents of the ``apple-app-site-association`` file via a browser by navigating to ``https://<your-site-name>/.well-known/apple-app-site-association``. The app will check for this file on install and, if found, will allow outside permalinks to open the app.

Official documentation for configuring deep linking on iOS can be found `here <https://developer.apple.com/library/archive/documentation/General/Conceptual/AppSearch/UniversalLinks.html>`__.

**Set up for Android**

Please refer to the the App Links Assistant in Android Studio for configuring `deep linking on Android <https://developer.android.com/studio/write/app-link-indexing>`__.

How do I connect users across internal and external networks?
-----------------------------------------------------------------

By setting up global network traffic management, you can send a user to an internal or external network when connecting with a mobile app. Moreover, you can have two separate layers of restrictions on internal and external traffic, such as:

 - In the internal network, deploy on a private network via per device VPN.
 - In the external network, deploy with `TLS mutual auth <https://docs.mattermost.com/onboard/ssl-client-certificate.html>`__ with an NGINX proxy, and `client-side certificates <https://docs.mattermost.com/onboard/certificate-based-authentication.html>`__ for desktop and iOS.
 
Many services such as Microsoft Azure provide options for `managing network traffic <https://docs.microsoft.com/en-us/azure/traffic-manager/traffic-manager-overview>`__, or you can engage a services partner to assist.

source/archive/mobile-app-deployment.rst METASEP
:nosearch:

===========================
Mobile App Deployment Guide
===========================

################
About this guide
################

********
Audience
********

Leaders, Administrators, and/or Champions responsible for deploying Mattermost mobile apps in their organization.

    **Note:** Some features described in this guide are only available in Enterprise Edition E10 and/or E20.

*******************
Learning objectives
*******************

This guide provides foundational information necessary when developing a plan for a proof of concept and/or enterprise mobile deployment. 

By the end of this guide you will have an understanding of the high-level requirements for a successful Mattermost mobile deployment. 

This includes:

- Choosing how to obtain and distribute the Mattermost mobile applications
- Determining the ideal mobile deployment model for your organization
- Understanding the resource requirements when choosing to build your own Mattermost mobile apps

Technical implementation guides are included as links to keep the information in this guide concise.

.. _support:

*******
Support
*******

If at any point you need additional help, please reach out using the methods below.

**Community**
    Our entire team is active within the `public instance of Mattermost <https://community.mattermost.com>`_, plus you will have the support of one of the best open source communities around.
**Documentation**
    We link to a lot of `mobile-specific documentation <https://docs.mattermost.com/mobile/mobile-overview.html>`_ within this guide, but we encourage you to check `all of our documentation <https://docs.mattermost.com/>`_.
**Forums**
    For more troubleshooting help, `open a new topic in our forums <https://forum.mattermost.com/c/trouble-shoot>`_ with steps to reproduce your issue.
**GitHub**
    Visit us on `GitHub <https://github.com/mattermost/>`_ to create issues in any of our repositories.
**Enterprise Support**
    If you are an Enterprise Edition subscriber, you may open a support ticket in the `Enterprise Edition Support portal <https://support.mattermost.com>`_.

----

################################
Before you begin your deployment
################################

A successful mobile deployment is an important part of your experience with Mattermost.

Our highest priority is making sure you have what you need to be successful, but keep in mind that any change, even beneficial, will have an impact on your users. To ensure your success you need to identify the goals for your mobile deployment.

For example, you can deploy to thousands of users across the world in minutes with the publicly available Mattermost mobile apps on Google Play and Apple App Store.

Of course, large enterprise deployments will take more time, and the overall goals for your deployment will depend on many factors. We recommend taking a moment to write down what a successful deployment looks like. To start, ask yourself and your team what you want to achieve, what are your desired outcomes?

This takes a small amount of time upfront. But, we have seen the difference this makes in successful projects.

Below, we have added some key questions to ask yourself, your team, and any other stakeholders.

- Why have we decided to deploy the Mattermost mobile application?
- Who will, or should, play a key/critical role in this project?
- Who does this project impact?
- How much time do we have for this deployment?
- Should, or could, an initial deployment take a simpler path?
- Can we stagger our deployment, starting with simple requirements first?
- Are you going to run a pilot deployment, if so, with whom?
- What IT or HR policies need to change?

We recommend setting at least one achievable and time-based outcome.

At the same time, you should begin thinking about technical and security requirements. A great place to start is with an implementation plan. So, feel free to `use our template available <https://docs.mattermost.com/getting-started/implementation_plan.html>`_ in the Mattermost documentation. Also, begin by engaging with your technical and security teams with questions like those below.

- Are there any known security or access requirements?
- Is a VPN connection required?
- Do we use an Enterprise Mobile Management (EMM) Provider?

Again, this means pausing before you jump into your Mattermost mobile deployment. But it will make all the difference in ensuring you see a return on your investment.

----

###################################
Mattermost mobile deployment primer
###################################

While Mattermost provides options to make mobile deployment as easy as possible, it will take time and iteration.

This primer serves as an introduction to Mattermost mobile technologies. It is a complement to our technical documentation, and focuses on three main areas:

- Technical Requirements
- Basic Features and Technologies
- Troubleshooting

Regardless of your expertise, we recommend reading this section before starting your deployment. And keep in mind, we are here to support_ you.

**********************
Technical requirements
**********************

`Supported Mattermost Server Versions <https://github.com/mattermost/mattermost-mobile/blob/master/CHANGELOG.md>`_ 
    Minimum requirements for the Mattermost Server are maintained in our documentation (link above). 
    **However, we do recommend running the latest version** of the Mattermost Server as it contains the most recent features and any applicable security updates.

    If this is not possible, we encourage you to be on the most recent `Extended Support Release version <https://docs.mattermost.com/upgrade/extended-support-release.html>`_ of the Mattermost Server. This release has a number of critical feature updates that will ensure compatibility in a number of areas, including the Mattermost Push Notification Service (MPNS).

`Supported Devices/Mobile Device Requirements <https://docs.mattermost.com/install/requirements.html#mobile-apps>`_
    Basic mobile device requirements are provided in the link above.

*******************************************
Public app store vs. custom Mattermost apps
*******************************************

    **Note:** This guide uses the term Public App Store as generic for the two most commonly-used application stores: Apple App Store and Google Play Store.

The most critical decision you will make in your mobile deployment is whether to use the apps provided by Mattermost via Google Play and Apple App Store, or to build and distribute custom versions of the Mattermost apps. Below we provide a very general overview of these options.

Public app store
================

Utilizing the app distributed by Mattermost in Google Play and the Apple App Store greatly reduces the deployment time and is our recommended approach. Key benefits include:

- Easier deployment, driven by user needs.
- Ability to use the Hosted Push Notification Service, or HPNS.
- Apps automatically updated with the latest features, enhancements, and security updates.

Custom Mattermost apps
======================

If you desire to customize the applications, or do not want your users downloading the application from the public app stores, you will need to build the apps yourself. 

As the apps are an open source project, customization will require a fork, and your team will be responsible for maintaining the fork, as well as keeping the fork up to date with any changes made by Mattermost.

This process can be complicated. It will also greatly increase deployment time, not only initially, but whenever the apps need to be updated. 

We recommend having your development team take a look at the documentation to ensure they understand the scale and requirements of this path. In general, this route will present some challenges, including:

- Obtaining/providing certificates for your custom Mattermost application
- Signing your custom Mattermost applications
- Distributing your applications via public or private app stores

*******************************************
Mattermost Push Notification Service (MPNS)
*******************************************

Receiving notifications on a mobile device is a core value of any mobile deployment.

It also represents a return on your deployment investment through better-connected users. 

A push proxy is a key technology behind notification transmission. It enables notifications between the server and the mobile application.

Mattermost provides a self-hosted Push Proxy you can deploy, the Mattermost Push Notification Service (MPNS). This is also available via a hosted-by-Mattermost option, or Hosted Push Notification Service (HPNS).

    **Note:** `Only Mattermost Enterprise Edition E10 <https://mattermost.com/pricing-self-managed/>`_ or higher can be used to receive access to our Hosted Push Notification Service (HPNS)

If you will be using the Mattermost applications via Google Play and Apple App Store, the HPNS is all you need.

Our Hosted Push Notification Service offers:

- Access to a publicly-hosted Hosted Push Notification Service (HPNS).
- An explicit `privacy policy <https://mattermost.com/data-processing-addendum/>`_ for the contents of unencrypted messages.
- Encrypted TLS connections:
    - Between HPNS and Apple Push Notification Services
    - HPNS and Google’s Firebase Cloud Messaging service
    - HPNS and your Mattermost server
- Production-level uptime expectations
- Compatibility with EMM Providers*

\* *When using our publicly-available app store applications and the AppConfig standard.*

Hosting your own version of the MPNS is an option, but requires you to build the Mattermost app yourself. The `Choosing the Right Mobile Deployment Model`_ section of this guide, as well as our `Mobile App Admin Documentation <https://docs.mattermost.com/mobile/mobile-hpns.html>`_ are the best places to start.

********************************************
Enterprise Mobile Management (EMM) Providers
********************************************

EMM Providers develop software that helps enterprise teams manage secure mobile technology deployments. This includes the use of mobile devices and usage-ready applications.

Most large enterprise teams are familiar with `Enterprise Mobile Management <https://en.wikipedia.org/wiki/Enterprise_mobility_management>`_ providers, or EMMs. If this is a new term for you, review `Appendix B: EMM Provider List`_ for a list of providers and relevant information.

For those taking on larger deployments, we assume you are already using an EMM provider.

AppConfig is newer, more modern approach when compared to the previous standard, app wrapping.

AppConfig (supported) vs. app wrapping (not supported)
======================================================

    **Note:** Mattermost only supports the AppConfig standard. It does not support app wrapping. Use app wrapping at your own risk.

Here is `a helpful article  <https://www.computerworld.com/article/3209907/app-wrapping-the-key-to-more-secure-mobile-app-management.html>`_ defining AppConfig and app wrapping. Let us take a look at AppConfig first.

AppConfig
---------

"A community focused on providing tools and best practices around native capabilities in mobile operating systems to enable a more consistent, open and simple way to configure and secure mobile apps in order to increase mobile adoption in business." - AppConfig.org

So that sounds great, but are there any benefits for users?

Again, in the AppConfig Community’s words, "Users benefit with instant mobile productivity and a seamless out-of-the box experience, and businesses benefit with secure work-ready apps with minimal setup required while leveraging existing investments in Enterprise Mobility Management (EMM), VPN, and identity solutions. Put another way, your apps are simpler to configure, secure and deploy."

For now, focus on that last part, "... your apps are simpler to configure, secure and deploy." AppConfig provides the most efficient and scalable path for success. As an admin this means easier deployment and management of mobile applications. And again, when it comes to Mattermost, it is our only supported approach.

Application (App) Wrapping
--------------------------
From the article we `referenced earlier <https://www.computerworld.com/article/3209907/app-wrapping-the-key-to-more-secure-mobile-app-management.html>`_, application (app) wrapping involves "...the use of an SDK from an EMM vendor that allows a developer or admin to deploy an API that enables management policies to be set up." 

When going this route, there are two options:

**Option 1**
    The EMM provider gives you their libraries, and then you go to the source code for the app. Using the libraries you "wrap" the source and repackage the application. This approach will take significant development time and associated frustration. In the end you should have an app that is now wrapped with the EMM libraries. The hope, but not the guarantee, is that you have an app with an additional layer. This allows you to manage and secure the app on a user’s mobile device.

**Option 2**
    The EMM provider gives you a tool used for wrapping the app. In more modern cases, it’s a simple checkbox in your EMM application when configuring the app. These tools then inject all the needed code to wrap it. Then the tool (or EMM provider) builds it back up. This allows you to distribute the new, wrapped app. The wrapped app has a layer allowing you to manage and secure the app on a user’s mobile device. 

Until recently app wrapping has been the common approach. It does not come without risks and challenges to scalability though. 

For example, most modern applications follow continuous development. Each time an application changes it will need to go through the process described above. 

There is also functionality and compatibility risk. This is a known issue for the Mattermost application and app wrapping tools.

This incompatibility is not an issue with the Mattermost application. It results from the proprietary nature of the provider's tools. To make matters worse, there is no course of action to address compatibility issues.

In the end, this sets app wrapping in a negative light. This is the reason the `AppConfig Community <https://www.appconfig.org>`_ came together to create a standard. AppConfig is a modern, efficient, and scalable approach to enterprise mobile management. In that regard, the Mattermost application benefits from being built around this standard.

******************
Mobile VPN options
******************

A Virtual Private Network (VPN) allows a device outside a firewall to access content inside the firewall as if it were on the same network. Most enterprise teams are familiar with VPNs. We will not go into detail here.

There are VPN options which depend on the requirements of your organization. You should also consider the demands/needs of your users. Regardless, this can impact your approach to mobile deployment.

For the Mattermost mobile application, we will discuss two options: a device VPN or per-app VPN.

    **Note:** We suggest `following our recommended steps <https://docs.mattermost.com/mobile/mobile-appstore-install.html>`_ to secure your deployment.

**Device VPN**
    This is not as common, especially in the case of Bring Your Own Device (BYOD) scenarios. In this option, all internet traffic routes through the VPN specified in the profile. This could cause issues for personal applications.

**Per-app VPN**
    In contrast, the more common approach is to use a per-app VPN. This provides a connection to the VPN when needed (on-demand). For example, when using a particular app.

Regardless of the commonness of either option above, Mattermost provides support for both. Because Mattermost supports the AppConfig standard, both options are compatible with EMM providers.

    **Note:** Will you be connecting via a corporate proxy server? If so, `review our FAQ <https://docs.mattermost.com/mobile/mobile-faq.html#how-do-i-receive-mobile-push-notification-if-my-it-policy-requires-the-use-of-a-corporate-proxy-server>`_ covering architecture, troubleshooting, and best practices.

----

##########################################
Choosing the right mobile deployment model
##########################################

At this point you should have read through the deployment primer. It provides a large amount of context for the principles and best practices that follow. This next section aims to help you choose one of two recommended deployment models.

*****************************************
Using the public app stores (recommended)
*****************************************

**Desired Outcomes:**

- Quick rollout of the Mattermost mobile application
- Allow users to install the application on their device
- Ensure a high level of security and controlled access
- Use existing, internal processes and tools

We recommend either of these options if you are:

- Testing out the mobile applications
- Deploying Team Edition servers using no push notifications, or push notifications from Mattermost’s `TPNS <https://docs.mattermost.com/overview/faq.html#tpns>`_ (Test Push Notification Service)
- Deploying Enterprise Edition servers using push notifications from Mattermost’s `HPNS <https://docs.mattermost.com/mobile/mobile-hpns.html>`_ (Hosted Push Notification Service)

The mobile applications provided by Mattermost work with our hosted version of the Mattermost Push Notification Service (MPNS). This represents the easier path. The Mattermost mobile applications can be deployed with or without an EMM provider. These options are explained in more detail below. 

    **Note:** HPNS is compatible with EMM providers.

**Option 1** - Public App Store Installation (Easiest)

- Users download application via Apple App Store or Google Play
- Users enter URL to your hosted Mattermost Server

*Advantages:* Very easy, mobile deployment can be done by each individual user

*Disadvantages:* No additional EMM security features

**Option 2** - Public App Store Installation with EMM Provider (Easy)

- The EMM provider pushes the Mattermost app to the EMM enrolled devices
- Extend your organization’s security best practices/requirements via your EMM provider

*Advantages:* Easy, mobile deployment happens automatically to enrolled devices, app security and configuration can be maintained via your EMM provider

*Disadvantages:* No app customization

*********************************************
Distributing custom builds of the mobile apps
*********************************************

**Desired Outcomes**:

- Maintain full control over the distribution of applications
- Change the look, feel, and capabilities of the Mattermost mobile application
- Deploy your own MPNS to meet specific organizational requirements

This model is more difficult, and is recommended for organizations that can't (or don't desire) to use the HPNS. Often security and access requirements determine this, not the size of your organization.

Both Google and Apple require signatures of the application and push proxy to match. This means if you build the applications, you must host your own instance of MPNS.

Building the apps can be an involved process. This requires that you have the skillset to maintain and deploy packaged apps. Part of this process includes, but is not limited to:

- Obtaining/providing certificates for your custom Mattermost application
- Signing your custom Mattermost applications
- Distributing your applications via public or private app stores

Keeping your custom built apps up to date with features and security updates will be your responsibility.

To understand what’s involved, have your development team `read through our documentation <https://developers.mattermost.com/contribute/mobile/build-your-own/>`_.

    **Note:** As of Mattermost 5.18, E20 customers can limit data sent to the HPNS. With this option a message containing only an ID is transmitted. Once the mobile client receives this ID, the message contents are loaded from the server. Thus, the message contents are never transmitted through APNS/FCM.

----

#####################################################
Mobile deployment via public app stores (recommended)
#####################################################

To proceed you must have a Mattermost Server installed and accessible. This is also true for using the hosted version of the Mattermost push proxy (HPNS).

*********************************
Accessing the mobile applications
*********************************

The Mattermost mobile application is available for both Android and iOS devices. At this point, it is as simple as having your users download the application and `point to your Mattermost Server URL <https://docs.mattermost.com/help/getting-started/signing-in.html#ios-setup>`_.

    **Note:** The Mattermost mobile apps are signed and have certificates associated with Mattermost and the public app stores. This means they will not work if you are privately hosting the Mattermost Push Proxy Service.

`Mattermost for Android Devices <https://play.google.com/store/apps/details?id=com.mattermost.rn&hl=en_US>`_ (via Google Play)
`Mattermost of iOS Devices <https://apps.apple.com/us/app/mattermost/id1257222717>`_ (via Apple App Store)

If you do not desire (or require) additional security provided via an EMM Provider, your deployment is complete. Feel free to point your users to the `available documentation <https://docs.mattermost.com/guides/user.html>`_.

The sub-sections below serve as a high-level guide to understanding this deployment model. When necessary, we point to the documentation for technical instruction.

    **Note:** At a minimum, we recommend you follow our recommended steps to secure your deployment.

********************************************
Using an EMM Provider with public store apps
********************************************

EMM providers help extend security parameters to the Mattermost mobile applications. The AppConfig standard makes this possible. `Review the Mattermost AppConfig Values Documentation <https://docs.mattermost.com/mobile/mobile-appconfig.html#mattermost-appconfig-values>`_ for a complete list of available parameters.  

When going this route, you should consider:

- What is the mobile policy, is it company-owned, BYOD or both?
- Do you know what devices will be used if BYOD?
- What OS do you want to start with in testing?
- Creating a sample configuration then run validation tests against each config item

**********************************
Configuring Mattermost to use HPNS
**********************************

Configuring your Mattermost Server to use the Mattermost HPNS is a single configuration item. This is covered in our `Hosted Push Notification Service documentation <https://docs.mattermost.com/mobile/mobile-hpns.html>`_. 

Next your users would need to install the mobile application on their device. If desired, you can further configure security capabilities using an EMM provider.

**********************************
Updating via the public store apps
**********************************

While not part of your initial mobile deployment, you should consider a strategy for updating when new versions of the Mattermost mobile applications are available. Simultaneously, you should check any compatibility requirements for the mobile apps and the Mattermost Server. 

For example we recommend you:

- Check the compatibility requirements
- Validate versions connecting to server
- Update server
- Update apps

It is often easier to upgrade the mobile apps. However, not all provided updates are compatible with all previous versions of the Mattermost server.

Consult the `Mattermost mobile app changelog <https://github.com/mattermost/mattermost-mobile/blob/master/CHANGELOG.md>`_ and `Mattermsot server changelog <https://docs.mattermost.com/install/self-managed-changelog.html>`_ for more information.

    **Note:** Only updating the mobile apps, or updating the mobile apps before the Mattermost server, can result in incompatibility.

----

###################################
Mobile deployment via custom builds
###################################

Choosing this model means you have decided not to use the mobile applications Mattermost has made available via the public app stores. 

This also means you will need to maintain these applications. Maintenance includes rebuilding and incorporating feature and/or security updates. Otherwise, your applications will not match the functionality of our publicly available applications, and could be incompatible with future versions of the Mattermost Server.

Finally, this choice also means you cannot use the hosted version of the Mattermost Push Notification Service (MPNS).

A first step for this deployment model is `reviewing the documentation <https://developers.mattermost.com/contribute/mobile/>`_. Your development team should run through the requirements for building the applications. This documentation provides guidance on building, compiling, and signing. It also includes information for customizing the apps.

We’ve provided some recommended sections below.

- Developer Setup
- Build Your Own App
- Push Notifications

*********************************
Distribution through an app store
*********************************

Once you have built your own apps you will need to distribute them. There are two options:

Option 1 - Enterprise App Store via EMM Provider (most common and recommended): 

- This is the most common way for customers to distribute their apps
- Once added to your own Enterprise App Store, users can download from the EMM catalog, or you can use the EMM provider to push the application to the user's device

Option 2 - Apple App Store and Google Play (less common):

- To submit an app to the official app stores, you need to submit the app to Apple/Google for review
- This is the same process Mattermost uses make the apps available for everyone
- This process is more common if you are looking to white label the app to remove Mattermost branding

******************************************************
Using an EMM Provider with your custom Mattermost apps
******************************************************

If you will be using an EMM provider, note that Mattermost does not support app wrapping. Instead we use the AppConfig standard.

In some instances, there is an incompatibility with app wrapping and React Native applications. React Native is the technology used to develop the Mattermost mobile applications. The Mattermost mobile app will not function properly when using app wrapping. In fact, a majority of the app wrappers EMMs provide do not support WebSocket connections.

App wrapping is still often an option during the EMM configuration. Again, AppConfig is the only supported method for securing Mattermost mobile applications via an EMM provider.

AppConfig options will vary by EMM Provider and the associated device. You can review the available options in our `AppConfig Values documentation <https://docs.mattermost.com/mobile/mobile-appconfig.html#mattermost-appconfig-values>`_.

    **Note:** In Appendix B we have provided a list of popular EMM providers as well as example documentation where available.

As part of configuring your EMM solution, you should consider:

- What is the mobile policy, is it company-owned, BYOD or both?
- Do you know what devices will be used if BYOD?
- What OS do you want to start with in testing?
- Creating a sample configuration then run validation tests against each config item

****************************************************
Configuring the MPNS for your custom Mattermost apps
****************************************************

Building and distributing the Mattermost mobile apps requires you to deploy an instance of the MPNS.

As part of the process of building the applications you will need to sign the applications. You must also obtain the appropriate certificate for both Android and iOS. If this is not done, the applications will not be able to interact with your instance of the MPNS.

Once that is complete you can proceed with deployment of your MPNS instance.

The documentation topics listed below guide installation and configuration for your MPNS.

- `Push Notification Service Installation <https://developers.mattermost.com/contribute/mobile/push-notifications/service/>`_
- `Admin Configuration for Push Notifications <https://docs.mattermost.com/configure/configuration-settings.html>`_
- `Additional FAQs <https://docs.mattermost.com/mobile/mobile-faq.html#>`_

************************************
Updating your custom Mattermost apps
************************************

While not part of your initial mobile deployment, you should consider a strategy for updating when new versions of the Mattermost mobile applications are available. We highly recommend you update your custom Mattermost apps for any security or service releases. At the same time, if you have updated the apps, prior to distribution, check any compatibility requirements for the mobile apps and the Mattermost Server. 

    **Note:** Only updating the mobile apps, or updating the mobile apps before the Mattermost server, can result in incompatibility.

----

####################################
Appendix A: Troubleshooting and FAQs
####################################

We highly recommend you check out our `Mobile FAQ <https://docs.mattermost.com/mobile/mobile-faq.html>`_ and `Mobile Troubleshooting documentation <https://docs.mattermost.com/mobile/mobile-troubleshoot.html>`_. The most common questions we've received have been answered there. However, it’s important to call out a few common items customers run into.

*******************************
Data Security on Mobile Devices
*******************************

- `How is data handled on a device after an account is deleted? <https://docs.mattermost.com/mobile/mobile-faq.html#how-is-data-handled-on-mobile-devices-after-a-user-account-is-deactivated>`_
- `What post metadata is sent in mobile push notifications? <https://docs.mattermost.com/mobile/mobile-faq.html#what-post-metadata-is-sent-in-mobile-push-notifications>`_
- `What are my options for securing the mobile apps? <https://docs.mattermost.com/mobile/mobile-faq.html#what-are-my-options-for-securing-the-mobile-apps>`_
- `What are my options for securing push notifications? <https://docs.mattermost.com/mobile/mobile-faq.html#what-are-my-options-for-securing-push-notifications>`_

***********************
Corporate Proxy Servers
***********************

`How do I receive mobile push notifications if my IT policy requires the use of a corporate proxy server? <https://docs.mattermost.com/mobile/mobile-faq.html#how-do-i-receive-mobile-push-notification-if-my-it-policy-requires-the-use-of-a-corporate-proxy-server>`_

- `Deploy Mattermost with connection restricted post-proxy relay in DMZ or a trusted cloud environment <https://docs.mattermost.com/mobile/mobile-faq.html#deploy-mattermost-with-connection-restricted-post-proxy-relay-in-dmz-or-a-trusted-cloud-environment>`_
- `Whitelist Mattermost push notification proxy to bypass your corporate proxy server <https://docs.mattermost.com/mobile/mobile-faq.html#whitelist-mattermost-push-notification-proxy-to-bypass-your-corporate-proxy-server>`_
- `Run App Store versions of the Mattermost mobile apps <https://docs.mattermost.com/mobile/mobile-faq.html#run-app-store-versions-of-the-mattermost-mobile-apps>`_

----

#############################
Appendix B: EMM Provider List
#############################

We’ve compiled a list of the most popular EMM providers and the associated Unified Endpoint Management tools they employ. In two cases (Blackberry Dynamics and MobileIron) we’ve also provided corresponding documentation developed by the Mattermost team.

************************************
Blackberry Dynamics (Blackberry UEM)
************************************

"BlackBerry UEM is a multiplatform EMM solution that provides comprehensive device, app, and content management with integrated security and connectivity, and helps you manage iOS, macOS, Android, Windows 10, and BlackBerry 10 devices for your organization. BlackBerry UEM is included in the `BlackBerry Secure UEM & Productivity Suites <https://www.blackberry.com/us/en/products/blackberry-secure-uem-suites.html>`_ - Choice Suite, Freedom Suite, and Limitless Suite."

- `BlackBerry Website <https://www.blackberry.com/us/en/products/blackberry-uem>`_
- `BlackBerry Mattermost Documentation <https://docs.mattermost.com/mobile/mobile-blackberry.html>`_
- `Blackberry Documentation and Help Materials <https://docs.blackberry.com/en/endpoint-management/blackberry-uem/12_11>`_

**********
MobileIron
**********

"MobileIron Unified Endpoint Management (UEM) provides the foundation for the industry’s first mobile-centric, zero trust enterprise security framework. Unlike other UEM solutions, MobileIron UEM puts enterprise mobile security at the center of your enterprise and allows you to build upon it with enabling technologies such as `zero sign-on (ZSO) <https://www.mobileiron.com/en/products/access>`_ user and device authentication, multi-factor authentication (MFA), and `mobile threat detection (MTD) <https://www.mobileiron.com/en/products/mobile-threat-defense>`_."

- `MobileIron Website <https://www.mobileiron.com/en/products/uem>`_
- `MobileIron Mattermost Documentation <https://docs.mattermost.com/mobile/mobile-mobileiron.html>`_ 
- `MobileIron Support (requires login) <https://help.mobileiron.com/s/login/?startURL=%2Fs%2F&ec=302>`_

****
Fyde
****

"Securely access Mattermost’s messaging platform to enable productive team collaboration. Our connectionless, modern alternative to VPN helps mitigate breach risk by securing private cloud network from direct access by unmanaged devices."

- `Fyde for Mattermost Use Case <https://www.fyde.com/use-cases/fyde-for-mattermost>`_
- `Fyde Documentation <https://fyde.github.io/docs/>`_

****************************************
Workspace One (formerly VMware AirWatch)
****************************************

"Empower employees with a personalized “any app, any device” experience and engage them from Day One with a virtual assistant that speeds common tasks. With modern management and Zero Trust security, along with data-driven insights and automation, IT can unify siloed teams, protect corporate apps and data, and confidently provide the engaging experiences that modern workforces demand."

- `Workspace One Website <https://www.air-watch.com/why-workspace-one-airwatch/>`_
- `Workspace One Help Portal <https://my.workspaceone.com/>`_

***********************************************
Citrix Endpoint Management (formerly XenMobile)
***********************************************

"If you're still relying on multiple platforms to oversee endpoints, it's time for a change. Now more than ever, IT needs a way to manage and monitor mobile, traditional and IoT endpoints without having to consult dozens of different dashboards and reports. With the majority of employees working away from desks 50-60% of the time,1 the devices and apps they access are as varied as the tools available to manage them. As the diversity of end user options reaches an all-time high—`BYOD <https://www.citrix.com/digital-workspace/byod.html>`_, `Office 365 <https://www.citrix.com/digital-workspace/optimize-microsoft-ems-intune.html>`_ and frequent `Windows 10 updates <https://www.citrix.com/digital-workspace/windows-10.html>`_ all play a role—you need a consolidated console. Get a single view of multidevice users with UEM to unify device configurations, data protection and usage policies… all in one central location."

`Citrix Endpoint Website <https://www.citrix.com/products/citrix-endpoint-management/>`_
`Citrix Endpoint Management Documentation <https://docs.citrix.com/en-us/citrix-endpoint-management.html>`_

****************
Microsoft InTune
****************

"Microsoft Intune is a cloud-based service that focuses on mobile device management (MDM) and mobile application management (MAM). Intune is included in Microsoft's `Enterprise Mobility + Security (EMS) suite <https://www.microsoft.com/microsoft-365/enterprise-mobility-security>`_, and enables users to be productive while keeping your organization data protected. It integrates with other services, including Microsoft 365 and Azure Active Directory (Azure AD) to control who has access, and what they have access to, and Azure Information Protection for data protection. When you use it with Microsoft 365, you can enable your workforce to be productive on all their devices, while keeping your organization's information protected."

- `InTune Website <https://docs.microsoft.com/en-us/intune/fundamentals/what-is-intune>`_
- `Microsoft InTune Documentation <https://docs.microsoft.com/en-us/intune-user-help/use-managed-devices-to-get-work-done>`_

source/archive/microsoft-integrations.rst METASEP
:nosearch:

Microsoft Tools
===============

Our `Integrations Directory <https://integrations.mattermost.com>`_ has several integrations to connect Microsoft tools in Mattermost. Here are some popular options:

Office 365 Calendar (E20)
~~~~~~~~~~~~~~~~~~~~~~~~~

- Two-way integration between Mattermost and Office 365 Calendar, developed by Mattermost.
- Receive a daily summary of calendar events, and accept or decline new events.
- Reflect user status as "Do Not Disturb" when in a meeting scheduled via Outlook Calendar.
- Docs: https://mattermost.gitbook.io/plugin-mscalendar

Skype for Business
~~~~~~~~~~~~~~~~~~~

- Start and join voice calls, video calls, and use screen-sharing with your team members. Developed by kosgrz and maintained by Mattermost.
- Clicking a video icon in a Mattermost channel invites team members to join a Skype for Business call, hosted using the credentials of the user who initiated the call.
- Supports a vendor-hosted cloud solution.
- Source code + docs: https://github.com/mattermost/mattermost-plugin-skype4business

Office 365 SSO (E20)
~~~~~~~~~~~~~~~~~~~~

- Configure Mattermost to use your Office 365 credentials and Azure Active Directory account as a single sign-on (SSO) service, developed by Mattermost.
- Supports Microsoft Active Directory Tenants for team creation, account creation, and SSO.
- Receive a daily summary of calendar events, and accept or decline new events.
- Docs: https://docs.mattermost.com/onboard/sso-office.html

Collabora Online
~~~~~~~~~~~~~~~~

- View Microsoft Word (.doc and .docx), Excel (.xls and .xlsx), and PowerPoint (.ppt and .pptx) files in Mattermost, developed by Collabora.
- Allows multiple people to edit an Office 365 file at the same time from Mattermost, replacing the original file on the Mattermost server.
- Self-hosted solution for file sharing and management of Office 365 files.
- Source code + docs: https://github.com/CollaboraOnline/collabora-mattermost

source/archive/meta.json METASEP
{
    "id": "ja8z8egap7nq9kqetz3rt98khe",
    "create_at": 1463637842478,
    "user_id": "3bq1shta93yztg3i6aiu1tzi5h",
    "status": "",
    "count": 0,
    "desc": "HR Audit 388",
    "type": "adhoc",
    "start_at": 1451606400000,
    "end_at": 1463529600000,
    "keywords": "drinking",
    "emails": "person@example.com"
}
source/archive/messaging-basics_old.rst METASEP
:nosearch:

Messaging Basics
================

**Write messages** using the text input box at the bottom of the screen. Press ENTER to send a message. Use SHIFT+ENTER to create a new line without sending a message. To send messages on CTRL+ENTER and use ENTER to insert new lines go to **Main Menu > Account Settings > Advanced** > **Send messages on CTRL+ENTER**.


**Reply to messages** by clicking the reply arrow next to the message text.

.. image:: ../images/reply-icon.png
   :alt: reply arrow

**Notify teammates** when they are needed by typing ``@username``.

**Format your messages** using Markdown that supports text styling, headings, links, emojis, code blocks, block quotes, tables, lists, and in-line images.

You can use either ``_`` or ``*`` for italics and bold text. See the table below for examples.

.. image:: ../images/messagesTable1.png
   :alt: markdown

**Quickly add emojis** by typing ":" followed by two characters, which will open an emoji autocomplete. If the existing emojis don't cover what you want to express, you can also create your own `Custom Emoji <https://docs.mattermost.com/help/settings/custom-emoji.html>`__.

**Attach files** by dragging and dropping them into Mattermost or clicking the attachment icon in the text input box.

**Save messages for follow up** using the **Save** icon next to the message.

.. figure:: ../images/save-message.png
   :alt: flags

Learn more about:

* `Composing Messages and Replies <https://docs.mattermost.com/help/messaging/sending-messages.html>`__
* `Mentioning Teammates <https://docs.mattermost.com/help/messaging/mentioning-teammates.html>`__
* `Formatting Messages using Markdown <https://docs.mattermost.com/help/messaging/formatting-text.html>`__
* `Sharing Files <https://docs.mattermost.com/help/messaging/attaching-files.html>`__
* `Executing Commands <https://docs.mattermost.com/help/messaging/executing-commands.html>`__

source/archive/messaging-basics.html METASEP
<html><head><meta http-equiv="refresh" content="0; url=https://docs.mattermost.com/messaging/channels-basics.html"></head></html>
source/archive/message-attachments.rst METASEP
:nosearch:

Message Attachments
===================

A wide range of rich text formatting options, including bold, italic, headings, in-line images, and tables, can be used in integrations. For more information about formatting, see :doc:`../help/messaging/formatting-text`.

For additional formatting options, and for compatibility with Slack non-markdown integrations, an ``attachments`` array can be sent by integrations and rendered by Mattermost.

You can also add interactive message buttons as part of attachments. They help make your integrations richer by completing common tasks inside Mattermost conversations, increasing user engagement and productivity. For more information, see :doc:`documentation <interactive-messages>`.

Attachment Options
------------------

When sending an attachment, you can use any of the following to format how you want the posted message to look.

``fallback``: A required plain-text summary of the attachment. This is used in notifications, and in clients that don’t support formatted text (e.g. IRC).

``color``: A hex color code that will be used as the left border color for the attachment. If not specified, it will default to match the channel sidebar header background color.

.. image:: ../images/attachments-color.png

``pretext``: An optional line of text that will be shown above the attachment.

.. image:: ../images/attachments-pretext.png

``text``: The text to be included in the attachment. It can be formatted using :doc:`Markdown <../help/messaging/formatting-text>`. For long texts, the message is collapsed and a “Show More” link is added to expand the message.

.. image:: ../images/attachments-text.png

Author Details
~~~~~~~~~~~~~~

``author_name``: An optional name used to identify the author. It will be included in a small section at the top of the attachment.

``author_link``: An optional URL used to hyperlink the ``author_name``. If no ``author_name`` is specified, this field does nothing.

``author_icon``: An optional URL used to display a 16x16 pixel icon beside the ``author_name``.

.. image:: ../images/attachments-author.png

Titles
~~~~~~

``title``: An optional title displayed below the author information in the attachment.

``title_link``: An optional URL used to hyperlink the ``title``. If no ``title`` is specified, this field does nothing.

.. image:: ../images/attachments-titles.png

Fields
~~~~~~

Fields can be included as an optional array within ``attachments``, and are used to display information in a table format inside the attachment.

``title``: A title shown in the table above the ``value``.  As of v5.14 a title will render emojis properly.

``value``: The text value of the field. It can be formatted using :doc:`Markdown <../help/messaging/formatting-text>`.

``short``: Optionally set to true or false (boolean) to indicate whether the ``value`` is short enough to be displayed beside other values.

.. image:: ../images/attachments-fields.png

Images
~~~~~~

``image_url``: An optional URL to an image file (GIF, JPEG, PNG, BMP, or SVG) that is displayed inside a message attachment.

Large images are resized to a maximum width of 400px or a maximum height of 300px, while still maintaining the original aspect ratio.

.. image:: ../images/attachments-image.png

``thumb_url``: An optional URL to an image file (GIF, JPEG, PNG, BMP, or SVG)  that is displayed as a 75x75 pixel thumbnail on the right side of an attachment. We recommend using an image that is already 75x75 pixels, but larger images will be scaled down with the aspect ratio maintained.

.. image:: ../images/attachments-thumb.png

Example Message Attachment
--------------------------

Here is an example message attachment:

.. code-block:: JSON
  :linenos:

  {
    "attachments": [
      {
        "fallback": "test",
        "color": "#FF8000",
        "pretext": "This is optional pretext that shows above the attachment.",
        "text": "This is the text of the attachment. It should appear just above an image of the Mattermost logo. The left border of the attachment should be colored orange, and below the image it should include additional fields that are formatted in columns. At the top of the attachment, there should be an author name followed by a bolded title. Both the author name and the title should be hyperlinks.",
        "author_name": "Mattermost",
        "author_icon": "https://mattermost.org/wp-content/uploads/2016/04/icon_WS.png",
        "author_link": "https://mattermost.org/",
        "title": "Example Attachment",
        "title_link": "https://docs.mattermost.com/developer/message-attachments.html",
        "fields": [
          {
            "short":false,
            "title":"Long Field",
            "value":"Testing with a very long piece of text that will take up the whole width of the table. And then some more text to make it extra long."
          },
          {
            "short":true,
            "title":"Column One",
            "value":"Testing"
          },
          {
            "short":true,
            "title":"Column Two",
            "value":"Testing"
          },
          {
            "short":false,
            "title":"Another Field",
            "value":"Testing"
          }
        ],
        "image_url": "https://mattermost.org/wp-content/uploads/2016/03/logoHorizontal_WS.png"
      }
    ]
  }


And here is how it renders in Mattermost:

.. image:: ../images/attachments-example.png

Footer
~~~~~~~

``footer``: An optional line of text that will be displayed at the bottom of the attachment. Footers with more than 300 characters will be truncated with an ellipsis (``…``).

``footer_icon``: An optional URL to an image file (GIF, JPEG, PNG, BMP, or SVG) that is displayed as a 16x16 pixel thumbnail before the footer text.

.. image:: ../images/attachments-footer.png

Known Issues
------------

1. The footer timestamp field (``ts``) is not yet supported
2. Message Attachment contents do not show up in search

Frequently Asked Questions
---------------------------

Can I send a message attachment via the API?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Yes, you can use the `create post RESTful API <https://api.mattermost.com/#tag/posts%2Fpaths%2F~1posts%2Fpost>`_.

You need to add an "attachment" key to the post's props JSON field. The value is an array of message attachments you want attached to the post. See below for an example curl command.

.. code-block:: bash

  curl -i -X POST -H 'Content-Type: application/json' -d '{"channel_id":"qmd5oqtwoibz8cuzxzg5ekshgr", "message":"Test message #testing", "props":{"attachments": [{"pretext": "This is the attachment pretext.","text": "This is the attachment text."}]}}' http://{your-mattermost-site}/posts

Below is an example HTTP request:

.. code-block:: http

  POST /posts HTTP/1.1
  Host: {your-mattermost-site}
  User-Agent: curl/7.63.0
  Accept: */*
  Content-Type: application/json
  Content-Length: 192

  {"channel_id":"qmd5oqtwoibz8cuzxzg5ekshgr", "message":"Test message #testing", "props":{"attachments": [{"pretext": "This is the attachment pretext.","text": "This is the attachment text."}]}}

source/archive/menu.png METASEP

source/archive/mentioning-teammates.rst METASEP
:nosearch:

.. _mentioning-teammates:

Mentioning Teammates
====================

@Mentions
---------

|all-plans| |cloud| |self-hosted|

.. |all-plans| image:: ../images/all-plans-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in Mattermost Free and Starter subscription plans.
  
.. |enterprise| image:: ../images/enterprise-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in the Mattermost Enterprise subscription plan.

.. |cloud| image:: ../images/cloud-badge.png
  :scale: 30
  :target: https://mattermost.com/download
  :alt: Available for Mattermost Cloud deployments.

.. |self-hosted| image:: ../images/self-hosted-badge.png
  :scale: 30
  :target: https://mattermost.com/deploy
  :alt: Available for Mattermost Self-Hosted deployments.

Use @mentions to get the attention of specific team members.

.. note::

  Editing an existing message does not trigger new @mention notifications, desktop notifications, or notification sounds.

@username
~~~~~~~~~

|all-plans| |cloud| |self-hosted|

You can mention a teammate by using the *@* symbol plus their username to send them a mention notification.

Type *@* to bring up a list of team members who can be mentioned. To filter the list, type the first few letters of any username, first name, last name, or nickname. Use the UP and DOWN arrow keys to scroll through entries in the list, and then press ENTER to select the person to mention. When selected, the username replaces the full name or nickname.

The following example sends a special mention notification to Alice, whose username is **alice**. The notification alerts her of the channel and message where she was mentioned. If Alice is away from Mattermost and has email notifications turned on, she'll receive an email alert of her mention along with the message text.

.. code-block:: none

  @alice how did your interview go with the new candidate?

If the person you mentioned does not belong to the channel, a System Message is posted to let you know. This is a temporary message, and you are the only one who can see it. To add the mentioned person to the channel, open the dropdown menu next to the channel name and select **Add Members**.

@channel and @all
~~~~~~~~~~~~~~~~~

|all-plans| |cloud| |self-hosted|

You can mention an entire channel by typing ``@channel`` or ``@all``. All members of the channel receive a mention notification that behaves the same way as if the members had been mentioned personally. If used in Town Square, it notifies all members of your team.

You can ignore channel-wide mentions in specific channels in the **Channel Menu > Notification Preferences > Ignore mentions for @channel, @here and @all**.

.. code-block:: none

  @channel great work on interviews this week. I think we found some excellent potential candidates!

If a channel has five or more members, you may be prompted to confirm that you want notifications sent to everyone in the channel.

@here
~~~~~

|all-plans| |cloud| |self-hosted|

You can mention everyone who is online in a channel by typing ``@here``. This sends a desktop notification and push notification to members of the channel who are online. It's counted as a mention in the sidebar. Members who are offline don't receive a notification. When they return to Mattermost they won't see a mention counted in the channel sidebar. Members who are away receive a desktop notification only if they have notifications set to **For all activity**, and they won't see a mention counted in the sidebar.

.. code-block:: none

  @here can someone complete a quick review of this?

If a channel has five or more members, you may be prompted to confirm that you want notifications sent to everyone in the channel.
  
You can ignore channel-wide mentions in specific channels by enabling the **Channel Menu > Notification Preferences > Ignore mentions for @channel, @here, and @all** option.
  
@groupname (Beta)
~~~~~~~~~~~~~~~~~

|enterprise| |cloud| |self-hosted|

System Admins can enable mentions for `LDAP synced groups <https://docs.mattermost.com/onboard/ad-ldap-groups-synchronization.html>`__ via the Group Configuration page. This is supported on the mobile app (from v1.34) if the AD/LDAP Groups feature is enabled. The mobile app supports auto-suggesting groups, highlights group member mentions, and also provides a warning dialog when a mention will notify more than five users.

Once enabled for a specific group, users can mention and notify the entire group in a channel (similar to ``@channel`` or ``@all``). Members of the group in that channel will receive a notification. If members of the group mentioned are not members of the channel, the user who posted the mention is prompted to invite them.

Group mention identifiers (slugs) use the LDAP group name by default. To customize/rename the slug:

1. Open **System Console > User Management > Groups**.
2. Select **Edit** next to the group you want to edit.
3. In **Group Profile > Group Mention** enter the new slug.
4. Select **Save**.

As with ``@username`` mentions, use *@* to bring up a list of groups that can be mentioned. To filter the list, type the first few letters of any group. Use the UP and DOWN arrow keys to scroll through entries in the list, and then press ENTER to select the group you want to mention.

.. code-block:: none

  @dev-managers great work hitting all of our code coverage goals this quarter!

Words that trigger mentions
---------------------------

|all-plans| |cloud| |self-hosted|

You can customize words that trigger mention notifications in **Settings > Notifications > Words That Trigger Mentions**. By default, you receive mention notifications for your username and for ``@channel``, ``@all`` and ``@here``. You can choose to have your first name be a word that triggers mentions.

You can add a list of customized words to get mention notifications for by typing them into the input box, separated by commas. This is useful if you want to be notified of all posts on certain topics, such as "interviewing" or "marketing".

Recent mentions
---------------

|all-plans| |cloud| |self-hosted|

Select **@** next to the **Search** box to query for your most recent @mentions and words that trigger mentions (excluding LDAP group mentions). 

.. image:: ../images/recent-mentions.png
   :alt: See your most recent @mentions

.. tabs::
  
  .. tab:: Mattermost v6.1 onwards

    From Mattermost v6.1, your recent mentions are shown for all of your teams.

  .. tab:: Mattermost v6.0 and earlier

    In Mattermost versions up to v6.0, your recent mentions are shown for your current team only.

Select **Jump** next to a search result in the right-hand sidebar to jump the center pane to the channel and location of the message with the mention.

Confirmation dialog warnings
----------------------------

|all-plans| |cloud| |self-hosted|

For any mention that will trigger notifications for more than five users, the user posting the mention must confirm the action before sending the notifications.

This confirmation dialog only appears when your System Admin has configured this setting in the System Console. See our `Configuration Settings <https://docs.mattermost.com/configure/configuration-settings.html#show-channel-all-or-here-confirmation-dialog>`__ product documentation for details. This configuration setting is supported on the Mattermost Mobile App (from v1.34) if the `AD/LDAP Groups <https://docs.mattermost.com/onboard/ad-ldap-groups-synchronization.html>`__ feature is enabled.

Highlighting
------------

|all-plans| |cloud| |self-hosted|

Valid mentions will have highlighted font text with some exceptions, for example if mentions are disabled at the channel level. The highlighted text becomes a hyperlink when a username is displayed. When the username is selected, the profile popover is displayed.

When mentions trigger a notification, the user being notified will see highlighted font text and highlighted font background. This functions as an identifier of which mentions in the post triggered a notification for the user.

source/archive/mattermost-cloud-overview.rst METASEP
:nosearch:

Mattermost Cloud Overview
=========================

Mattermost Cloud delivers the industry’s leading open-source collaboration platform in a highly secure, dedicated cloud environment designed for privacy-conscious enterprises and developer collaboration.

Mattermost Cloud is built on open-source software powered by a thriving developer community. The open-source approach enables software with a modular architecture, built with modern software development practices. Open-source development and provides transparency in source code, extensibility, and public trust. Mattermost Cloud comes in two editions: Mattermost Cloud Professional and Mattermost Cloud Enterprise.

Mattermost Cloud Professional
-----------------------------

Mattermost Cloud Professional includes the full set of collaboration and DevOps features and is available from the Mattermost.com website. Signing up requires creating an account with an email and specifying a domain for the workspace. Once you sign up and create your workspace, a wizard will guide you through a quick setup, invitation for team members, and integration with developer tools. You can trial Mattermost Cloud Professional for free for 14 days.

Mattermost Cloud Professional offers all enterprise-grade administration features, including:

 - **Identity Management:** Single Sign-on, SAML and AD/LDAP user and group provisioning, guest management, and enterprise mobility management.
 - **Governance:** Message and file retention policies, system and team permission policies, custom terms of service, channel moderation settings, and compliance exports.  

To get started with Mattermost Cloud Professional, visit https://mattermost.com/mattermost-cloud.

Mattermost Cloud Enterprise
---------------------------

Mattermost Cloud Enterprise offers the isolation, security, and control of self-hosted editions but without the burden of managing deployment, maintaining uptime, or applying upgrades. Mattermost Cloud Enterprise offers all chat and administration features, integrated DevOps workflows, and enterprise-grade support.
  
Every Mattermost Cloud Enterprise instance is deployed in a private environment within an AWS VPC dedicated to a single customer. Within that VPC, all the required resources to run, monitor, and administer Mattermost are deployed in isolation. These resources include a dedicated RDS Aurora database cluster and a dedicated Kubernetes cluster, deployed across multiple Availability Zones and managed by Kubernetes experts.

This intentional isolation and dedicated deployment supports other privacy-centric features, such as VPC Peering, bring-your-own-domain and certificates, mutual TLS, access to monitoring tools, databases to run custom analysis, and more.

Future releases will include an enterprise network integration with VPC Peering, TLS mutual authentication, and additional data residency options.

To get started with Mattermost Cloud Enterprise, visit: https://mattermost.com/cloud to speak to a Mattermost Account Executive.

Frequently Asked Questions (FAQs)
---------------------------------

How much does Mattermost Cloud cost?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost Cloud Professional is $10 USD per user, per month as a pay-as-you-go subscription. If you have over 1000 users please contact us.

Mattermost Cloud Enterprise is an annual subscription. Please contact us for a quote.    

How can customers trial Mattermost Cloud?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost Cloud Professional edition is available to try free for up to 14 days. 

Mattermost Cloud Enterprise offers a discounted proof-of-concept program for a 60-day period. The proof-of-concept program includes a dedicated Customer Engineer.

When will support for other regions be available?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost Cloud Enterprise will support data residency in 2021. We appreciate feedback from our customers on regional support for both editions.

How is Mattermost Cloud secured?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost Cloud has encryption at-rest and in-transit. We are SOC2 Type 1 certified and working towards SOC2 Type 2.

Mattermost Cloud Enterprise is deployed in a private environment within an AWS VPC dedicated to a single customer. This architecture provides the isolation and security of an on-premises deployment while ensuring consistent performance and uptime of your Mattermost workspace.

What are the alternatives, and why should customers choose Mattermost Cloud?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Other SaaS offerings are closed-source and focus on a very broad usecase. Mattermost Cloud is built on our open source core offering, allowing customers to view our source code and have a high degree of transparency into Mattermost development processes. Mattermost provides a DevOps-centric offering and has deep integrations and workflows that help builders and operators be more effective.

Mattermost Cloud Enterprise is deployed in a private environment within an AWS VPC dedicated to a single customer. Other SaaS offerings are multi-tenant, meaning customers share resources.

Is Mattermost Cloud Enterprise a dedicated instance run on AWS systems?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost Cloud Enterprise can be deployed as a dedicated Mattermost environment running with separate infrastructure for your requirements (e.g., separate database, separate VMs, separate Kubernetes cluster). Please contact Mattermost Sales for more information on this option.

How is customer data in Mattermost Cloud Enterprise encrypted?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost uses AWS-provided functionality to enable encryption-at-rest for both databases and file stores. See `Encrypting Amazon RDS resources - Amazon Relational Database Service <https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Overview.Encryption.html>`__ and `Protecting data using server-side encryption - Amazon Simple Storage Service <https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html>`__ for details. 

Whether customer data should be stored in Mattermost Cloud depends heavily on the nature of the data and compliance requirements. We recommend that customers set up their own internal policies or controls around what can and cannot be put into Mattermost.

Are S3-managed keys used for server-side encryption? 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Yes. Customer-provided keys may be considered for a future release. 

source/archive/marketing-guidelines.rst METASEP
:nosearch:

Mattermost Community Content Guidelines
============================================================

.. note::
  This page is largely out-of-date and is stored for record-keeping purposes. For latest marketing processes and guidelines, see the `Mattermost Handbook <https://handbook.mattermost.com/operations/messaging-and-math>`_.

The following guidelines are intended to help community members contribute guest blog posts or propose Twitter content, as well as for staff at Mattermost, Inc. interacting with the community. 

How to write purposefully and persuasively 
------------------------------------------------------------

In this document we set out some easy-to-follow guidelines about writing. Follow them, while also relying on your own judgment. Writing for blogs, newsletters, magazine articles and other forms of content can then become a joy rather than a chore. 

Before we get into the guidelines themselves, let's consider the goal and objectives (why we think written communication is important in the first place) and a few principles (things to bear in mind when pursuing those goals).

Goal
~~~~~~~~~~~~~~~~~~~~~~~

Success in marketing means more people in our target audience discover, understand, and unlock the benefits of Mattermost for their organizations through faster, larger, more effective deployments.

Objectives
~~~~~~~~~~~~~~~~~~~~~~~~

In order to achieve this overriding goal, we must:

 1. Increase awareness of Mattermost as a solution to key challenges facing organizations as measured by new visits to mattermost.com
 2. Reduce the time for organizations to decide on deploying open source and commercial versions through educational content on product value 
 3. Increase the number of organizations deploying Mattermost swiftly, efficiently and effectively 
 4. Increase the compellingness and trustworthiness of Mattermost product and marketing content as measured by increase in return visits 

The biggest uplift to inbound marketing will come from being featured in online publications such as The Hacker News.

Principles
~~~~~~~~~~~~~~~~~~~~~~~~

In order to achieve these goals, our writing must be:

 1. **Magnetic to IT.** We need headlines and openings that draw in IT audiences (these include Linux admins, security experts, directors of end-user computing, CIOs). Bear in mind that, although they work in IT, these audiences are typically more interested in the business benefits of technology than technical features. 
 2. **Appealing to secondary audiences.** These include open source and in-house developers and end users at highly regulated companies.
 3. **Part of our brand.** Our style and message must be consistent over the long term. Therefore, all of our content, irrespective of purpose or subject-matter, must pull the reader in the same direction and reinforce our key messages. 
 4. **High quality.** Quality in writing reflects the professionalism of our organization. We pay attention to the rules of grammar and spelling.
 5. **Clear and transparent.** We aim to communicate simply, using language that is familiar to our audiences. People don't buy what they don't understand!
 6. **International.** Mattermost has customers around the world and in many cases English is their second language. Use standard American English but do not use metaphors or expressions that people outside of North America are unlikely to understand.
 7. **Avoiding unintentional controversy.** We might want to stir up a bit of controversy now and again – but only on relevant technological and business topics. Avoid subjects or analogies that might provoke an emotional or hostile response: religion, politics, warfare, personal relationships etc. 
 8. **Fit for purpose.** Is your content designed to persuade (e.g. an opinion piece), promote (e.g. a product description) or instruct (e.g. to guide a user through procedural steps)? Adjust your tone and your language accordingly.

Clear? So now let's look at our 12 tips for brilliant writing. To win the reader's attention, and hold it, our content must be a pleasure to read. Our words must sparkle. Yet at the same time, it should all seem effortless; it can be a turnoff if it appears that the writer is trying too hard. 

These guidelines are in place to help you achieve the right balance. 

Remember, these are only guidelines, not hard and fast rules that you have to follow slavishly. So, for example, you might decide that in a specific context the passive voice is better than the active (see Point 7). 

In general, if something sounds right the day after you wrote it, it is right. We'd like you to bear our tips in mind, but we also want you to trust your own judgment.

Guidelines: 12 tips for sparkling content
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 1. **Have something to say**. Always ask yourself, what am I trying to communicate? When you have nothing of value to say, you will end up writing sentences that may sound meaningful but deliver nothing.
 2. **Think from the reader's perspective**. Then ask yourself, "What's in it for me [the reader]?" For example, you might be proud to announce an exciting new product feature, but unless you can quickly and concisely describe the benefit to the reader, the reader will lose interest. However, do not go to the other extreme and overstate benefits. That will also drive away the reader.
 3. **Be specific**. Use concrete examples. Don't take things for granted. Explain terms that the reader may be unfamiliar with. For example, do not write "data sovereignty" without explaining the term (e.g. "data sovereignty means the ability to control the country in which your data is stored and the laws under which it may be legally accessed").
 4. **Choose simple words**. Write use rather than utilize or leverage, help rather than facilitate, improve rather than ameliorate, imperfect rather than sub-optimal. It is true that in technical and business writing you sometimes need to choose words that are not in everyday usage, in order to communicate with precision and clarity. An example is the word "compliance". However, if you use long or technical words unnecessarily, inappropriately or out of context you will only cloud your meaning. You would not, for example, say something like "my driving is fully in compliance with current traffic regulations". Instead, you'd use an everyday term like "I observe the rules of the road".
 5. **Write short sentences**. Ideally, each sentence should contain one thought. More than one creates complexity and causes confusion. Reread each sentence and remove words that are unnecessary. These include "fluff" words like very, little and rather. If something is important, there is no need to add the word "very".
 6. **Write short paragraphs**. In academic writing, each paragraph develops one idea and often includes many sentences. But in casual, everyday writing, the style is less formal and paragraphs may be as short as a single sentence (or even a single word). Look at newspaper articles: journalists write short sentences because this makes information easy to digest.
 7. **Use the active voice**. As a simple example: Mattermost improves your workplace productivity sounds far better than Your workplace productivity is improved by Mattermost. The active voice is direct and concrete. The passive voice tends to lead you into obscure and abstract thinking. 
 8. **Don't ramble or overwrite**. Remind yourself what you set out to communicate (Point 1). Do not lose your focus. Keep the text as long as necessary, but as short as possible. 
 9. **Avoid cliché openers**. By that we mean opening sentences that the audience has read a million times before, such as, "In an increasingly competitive business environment…"
 10. **Edit ruthlessly**. Use the first draft to get your thoughts together. Then leave it for a few hours (or even days). Shorten, delete, and rewrite anything that does not add to the meaning. Run a spelling and grammar check.
 11. **Ask a colleague**. Still not 100% happy? A colleague should review the text and tell you if anything is unclear or if you could express yourself better. They might offer some useful fresh insights.
 12. **Now, relax**. If you are in the wrong frame of mind you will either get writer's block or your writing will be stiff and unnatural. Take your time. Remove any distractions. Keep things simple. 

source/archive/manifesto.rst METASEP
:nosearch:

About the Mattermost Open Source Project 
========================================

Mattermost is an open source, private cloud alternative to proprietary communication services. Hundreds of contributors around the world help develop the software in over 10 languages. 

- **Mattermost Team Edition** is an open source, private cloud workplace messaging solution designed for deployment by non-technical users with basic IT skills. Combined with native Mattermost apps on mobile and desktop, it brings all your team communication to one place, with web, mobile and PC interfaces, continuous archiving, instant search and a host of 3rd party integrations. It deploys as a single Linux binary under MIT license, with either MySQL or PostgreSQL as a database, with a host of simple, automated deployment options created by our community. 

- **Mattermost Enterprise Edition** is a commercial extension of Mattermost offering enterprise-grade messaging and advanced security, configurability and scalability benefits for sophisticated organizations and users. 

History 
-------

The project was `created by a video game company <https://mattermost.org/why-we-made-mattermost-an-open-source-slack-alternative/>`__ who previously used a proprietary, SaaS-based messenger which was bought by a big company and neglected. The SaaS messenger started having outages, it crashed, it lost files, and export didn't work. When they stopped their subscription, the SaaS messenger paywalled them from their own data. 

Lesson learned, the company started using messaging software they'd developed for their video game players, and eventually open sourced the software in 2015. The software became surprisingly popular and eventually the company left the video game business, renamed itself "Mattermost, Inc." and shifted focus to expanding the open source project, funded by creating commercial Enterprise Edition extensions. 

Because of how we started, we're committed to never allowing commercial versions of Mattermost to lock in a user's data--organizations using Mattermost must always have full access to their information and be able to downgrade to the open source version.

Stewardship Principles for the Mattermost Open Source Project  
--------------------------------------------------------------

Mattermost, Inc. is for-profit company focused on making the open source `Mattermost Team Edition <https://docs.mattermost.com/overview/product.html#mattermost-editions>`__ highly successful and popular for teams, while also generating revenue for our commercial `Mattermost Enterprise Edition <https://docs.mattermost.com/overview/product.html#mattermost-editions>`__ for large and sophisticated organizations. 

The following stewardship principles for our open source work helps keep our intent and purpose clear: 

1. Never locked-in 
~~~~~~~~~~~~~~~~~~~

Mattermost software, whether open source or commercial, should never withhold an organization's data from the organization. Commercial versions of Mattermost should always have a path to downgrade to the open source version without loss of access to data. 

2. Quick Time-to-Value 
~~~~~~~~~~~~~~~~~~~~~~

Great software creates value quickly. A non-technical user with basic IT skills should be able to set up Team Edition, understand every feature in the UI, and roll out the product and increase team productivity in just a few minutes. We should automate as much as possible in a standard install, ask few technical questions, and provide full explanations for any decisions that need to be made.  

3. Minimalist
~~~~~~~~~~~~~~

Minimalism is providing the correct amount of functionality and not more and not less. Great design is about doing important things extremely well, and not many things poorly. Make features work well for their intended purpose before adding new features. 

4. Decisions not options
~~~~~~~~~~~~~~~~~~~~~~~~

Make decisions instead of providing options. Every time you present an option, you force the user to make a decision which can lead to frustration if it's not for the majority of users. 

5. Built for teams behind firewalls
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Team Edition is built for teams needing a modern communication experience secured behind a firewall. For our target audience, we should be by far the best solution in the world. 

6. No surprises 
~~~~~~~~~~~~~~~

Users should never run into anything unexpected with Mattermost. We ship on time and document our features and product changes. Users should be able to know well in advance what is being considered for inclusion and change in upcoming versions. 

7. Near zero administration 
~~~~~~~~~~~~~~~~~~~~~~~~~~~

Let people work simply. Team Edition is for teams needing a "virtual office" where everyone knows each other and is trusted to get things done appropriately, without hard limits and policies. The non-technical user who deployed Team Edition should spend zero time on any administration tasks. 

8. Open source alternative  
~~~~~~~~~~~~~~~~~~~~~~~~~~

For non-technical users with basic IT skills, Team Edition aspires to be an ideal workplace messaging solution deployed on a private network, emphasizing simplicity and fast time-to-value. For sophisticated organizations with advanced security, configurability and scalability needs, the commercial Enterprise Edition extension strives to be an ideal solution. 

For organizations who seek other options, full source code of the server and webapp for creating Team Edition should be available for the development of open source variants, including commercial variants, `provided the Mattermost trademark is not used and other protocols are respected. <https://docs.mattermost.com/overview/faq.html#can-i-create-a-derivative-work-of-the-mattermost-mattermost-server-repository-that-is-not-open-source>`__ 

These principles were inspired by WordPress Philosophy: https://wordpress.org/about/philosophy/

source/archive/managing-members.rst METASEP
:nosearch:

.. _managing-members:

Managing Members
================

|all-plans| |cloud| |self-hosted|

.. |all-plans| image:: ../images/all-plans-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in Mattermost Free and Starter subscription plans.

.. |cloud| image:: ../images/cloud-badge.png
  :scale: 30
  :target: https://mattermost.com/download
  :alt: Available for Mattermost Cloud deployments.

.. |self-hosted| image:: ../images/self-hosted-badge.png
  :scale: 30
  :target: https://mattermost.com/deploy
  :alt: Available for Mattermost Self-Hosted deployments.

Inviting team members
---------------------

If you have the required permissions, you can add people to your team via a direct invite, a public team invite link, or if they already have an account on the server, you can add them to the team yourself.

From Mattermost v5.16, System Admins can `enable guest access <https://docs.mattermost.com/onboard/guest-accounts.html>`_. A guest is a special role that is restricted to only the channels they have been invited to. When guest access is enabled, you can invite guests or users external to the organization, such as vendors or customers.

Direct invites
~~~~~~~~~~~~~~

Direct invites are invitation emails sent from your team's server directly to the invited person's email address. A link within the invitation directs them to an account creation page. Invitation links sent by email expire after 48 hours and can only be used once. A System Admin can invalidate all active invitation links via **System Console > Authentication > Signup > Invalidate pending email invites**.

**Send a direct invite**

1. Select the Team menu at the top of the Navigation Panel.
2. Select **Invite People**.
3. If there's an option to invite members and guests, choose **Invite Members**.
4. In the **Invite People** field, enter the email address of the person you want to add.
5. Select **Invite Members**.

**Send an invite to a guest**

1. Select the Team menu at the top of the Navigation Panel.
2. Select **Invite People**.
3. If there's a option to invite members and guests, choose **Invite Guests**.
4. In the **Invite People** field enter the email address of guest you want to add. You can add multiple email addresses to invite more than one guest.
5. Specify the channels the guest will be able to access.
6. [Optional] Add a custom message to be included in the invitation to the guest.
7. Select **Invite Guests**.

.. note::

  - If you aren't able to see the **Invite Guests** option, confirm with your System Admin that you have the correct permissions.
  - If you don't see the **Send Email Invite** option, confirm with your System Admin that **System Console > Authentication > Signup > Enable Email Invitations** is set to ``true``.

Team invite link
~~~~~~~~~~~~~~~~

The team invite link is a unique URL that directs people to an account creation page for a team. A team invite link can be used by anyone and does not change unless it is re-generated by a System Admin or Team Admin via **Team Settings > General > Invite Code**. For example, the team invite link can be included in a company-wide email to invite all employees to join a Mattermost team.

**Get a team invite link**

1. Select the Team menu at the top of the Navigation Panel.
2. Select **Invite People**.
3. If there's an option to invite members and guests, choose **Invite Members**.
4. Select the **Copy Link** button to save the URL to your clipboard and share it with those you want to invite to the team.

Adding someone to your team
~~~~~~~~~~~~~~~~~~~~~~~~~~~

If someone you want to add to your team already has an account on the server, you can add them to your team without sending an invitation.

**Add someone to your team**

1. Select the Team menu at the top of the Navigation Panel.
2. Select **Invite People**.
3. If there's an option to invite members and guests, choose **Invite Members**.
4. In the **Invite People** menu search for the person you want to add. If the people you want to add are not on the list, then they do not have an account on your server.
5. Select **Invite Members**.

**Add existing guests to your team**

1. Select the Team menu at the top of the Navigation Panel.
2. Select **Invite People**.
3. If there's a option to invite members and guests, choose **Invite Guests**.
4. In the **Invite People** menu search for the guest you want to add. If the people you want to add are not on the list, then they do not have an account on your server.
5. Specify the channels the guest will have access to.
6. Select **Invite Guests**.

.. note:: 
   
   - If you aren't able to see the **Invite Guests** option, confirm with your System Admin that you have the correct permissions.
   - System Admins can view and add team membership to individual users on the user profile page (via **System Console > Users > User Profile**) by selecting **Add Team**.

User roles
----------

There are six types of user roles with different permission levels in Mattermost: System Admins, Team Admins, Channel Admins, Members, Guests, and Inactive accounts. To view a list of users on the team and what their roles are, Team Admins can open the Team menu and select **Manage Members**.

System Admin
~~~~~~~~~~~~

The first user added to a newly-installed Mattermost system is assigned the System Admin role.

The System Admin is typically a member of the IT staff and has all the privileges of a Team Admin, along with the following additional privileges:

- Access to the System Console in any team site.
- Ability to change any setting on the Mattermost server available in the System Console.
- Ability to promote and demote other users from Member role to System Admin role (and vice versa).
- Ability to promote and demote other users to and from Guest role.
- Ability to deactivate user accounts and to reactivate them.
- Access to private channels, but only if given the link to the private channel.

A System Admin can view and manage users in **System Console > Users**. They can search users by name, filter users by teams, and filter to view other System Admins as well as inactive users.

Team Admin
~~~~~~~~~~

When a team is first created, the person who set it up is made a Team Admin. It is a team-specific role, meaning that someone can be a Team Admin for one team but only a member on another team. Team Admins have the following privileges:

- Access to the **Team Settings** menu.
- Ability to change the team name and import data from Slack export files.
- Access to the **Manage Members** menu, where they can control whether team members are a **Member** or a **Team Admin**.

Channel Admin
~~~~~~~~~~~~~

*Available in legacy Mattermost Enterprise Edition E10 or E20*

The person who creates a channel is assigned the Channel Admin role for that channel. People with the Channel Admin role have the following privileges:

- Ability to assign the Channel Admin role to other members of the channel.
- Ability to remove the Channel Admin role from other holders of the Channel Admin role.
- Ability to remove members from the channel.

Depending on your system configuration, Channel Admins can be granted special permissions by the System Admin to rename and delete channels.

Member
~~~~~~

This is the default role given to users when they join a team. Members have basic permissions on the Mattermost team.

Guest
~~~~~

Guest is a role with restricted permissions, which allow organizations to collaborate with users outside of their organization, and control what channels they are in and who they can collaborate with.

Guests can: 

- Pin messages to channels.
- Use slash commands (with the exception of those used to invite members).
- Favorite channels.
- Mute channels.
- Update their profile.

Guests cannot:

- Discover public channels.
- Join open teams.
- Create direct messages or group messages with members who aren’t within the same channel.

User with personal access token permission
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

A System Admin can enable `personal access tokens <https://developers.mattermost.com/integrate/admin-guide/admin-personal-access-token/>`__ and give permissions for that account to create personal access tokens in **System Console > Users**.

In addition, the System Admin can optionally set the following permissions for the account, useful for integrations and bot accounts:

- **post:all**: Allows the account to post to all Mattermost channels including direct messages.
- **post:channels**: Allows the account to post to all Mattermost public channels.

Deactivating users
~~~~~~~~~~~~~~~~~~

A System Admin can deactivate user accounts via **System Console > Users** for a list of all users on the server. The list can be searched and filtered to make finding users easier. Select the user's role and in the menu that opens, then select **Deactivate**.

When **Deactivate** is selected, the user is logged out of the system, and receives an error message if they try to log back in. The user no longer appears in channel member lists, and they are removed from the team members list. A deactivated account can also be reactivated from the System Console, in which case the user rejoins channels and teams that they previously belonged to.

Direct Message channels with deactivated users are hidden in users' sidebars, but can be reopened using the **More...** button or by pressing CMD/CTRL+K.

Mattermost is designed as a system-of-record, so there isn't an option to delete users from the Mattermost system, as such an operation could compromise the integrity of message archives.

Note that AD/LDAP user accounts cannot be deactivated from Mattermost; they must be deactivated from your Active Directory.

Removing a user from a team or leaving a team
---------------------------------------------

Remove from team
~~~~~~~~~~~~~~~~

A Team Admin can remove a user from a team via **Team menu > Manage Members > Remove From Team** in the dropdown menu beside a user entry.

When a user is removed from a team, the team will no longer show up in their team sidebar. If they currently have the team open, they are redirected to the first team that appears on their team sidebar. If they didn't belong to any other teams, the user is sent to the team selection page.

Removing a user from the team does not deactivate the account. The user will still be able to sign in to the site, and join other teams. They will also be able to rejoin the team they were removed from if they receive another invite, or if the team is set to `"Allow any user with an account on this server to join this team" <https://docs.mattermost.com/welcome/team-settings.html#allow-anyone-to-join-this-team>`__. If the user does rejoin the team, they will no longer belong to the channels they were previously a part of, and they will lose all Admin privileges if they had them previously.

A System Admin can also remove users from teams via **System Console > Users**, and selecting the dropdown beside a user entry and selecting **Manage Teams**. The list of teams an individual user belongs to can be viewed on the user's profile page via **System Console > Users** and selecting the member's name from the list provided in the **User Configuration** screen.

Leaving a Team
~~~~~~~~~~~~~~

Users can also choose to remove themselves from a team, from **Team menu > Leave Team**. This will remove the user from the team, and from all Public channels and Private channels on the team.

They will only be able to rejoin the team if it is set to `"Allow any user with an account on this server to join this team" <https://docs.mattermost.com/welcome/team-settings.html#allow-anyone-to-join-this-team>`__ team, or if they receive a new invite. If they do rejoin, they will no longer be a part of their old channels.

Obtaining User ID
~~~~~~~~~~~~~~~~~

A unique user ID is sometimes required for configuring certain plugins and other administrative tasks that require identifying specific users. This identifier can be found in both the user list as well as the individual profile page for each user via **System Console > Users**.

source/archive/managing-channels.rst METASEP
:nosearch:

Managing Channels
==================

|all-plans| |cloud| |self-hosted|

.. |all-plans| image:: ../images/all-plans-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in Mattermost Free and Starter subscription plans.

.. |cloud| image:: ../images/cloud-badge.png
  :scale: 30
  :target: https://mattermost.com/download
  :alt: Available for Mattermost Cloud deployments.

.. |self-hosted| image:: ../images/self-hosted-badge.png
  :scale: 30
  :target: https://mattermost.com/deploy
  :alt: Available for Mattermost Self-Hosted deployments.

Channels can be created, joined, renamed, left, marked as a favorite, muted, unmuted, and archived.

Creating a channel
------------------

To create a new Public or Private channel, select the **+** symbol at the top of the channel sidebar, then select **Create New Channel**.

    .. image:: ../images/create-new-channel.png
        :alt: Create a channel.
    
Anyone can create Public channels or Private channels, unless the System Admin has `restricted the permissions <https://docs.mattermost.com/configure/configuration-settings.html#enable-public-channel-creation-for>`__.

Creating a Direct or Group Message
----------------------------------

To start a Direct or Group Message, select the **+** symbol at the top of the channel sidebar, then select **Open a Direct Message**. Or select the **+** symbol next to the **Direct Messages** category in the channel sidebar.

    .. image:: ../images/write-dm.png
        :alt: Access recent Direct Messages and Group Messages.
    
In the **Direct Messages** popup, identify your most recent conversations by relative timestamps.     

    .. image:: ../images/recent-direct-group-messages.png
        :alt: Write a Direct Message or Group Message.

Modify the header of any Direct or Group Message by selecting **Edit Conversation Header** from the channel name drop-down menu. 

Mute or unmute a conversation by selecting **Mute Conversation** or **Unmute Conversation** from the channel name drop-down menu. 

Joining a channel
-----------------

To join a Public channel, select the **+** symbol at the top of the channel sidebar, then select **Browse Channels**. Search through the list of Public channels you can join, then select **Join**.

To join a Private channel, you need to be added to the channel by a member of that channel.

Adding members to a channel
---------------------------

Select the channel name at the top of the center pane to access the drop-down menu, then select **Add Members**. Any member of a channel can add new members by choosing **Add** next to a user's name. Users already added to the channel will not appear in this list.

    .. image:: ../images/add-member-to-channel.png

You can also add users to channels within their profile pop-over by choosing **Add to a Channel** and selecting the channel you want them to join.

    .. image:: ../images/add-member-pop.png
        :alt: Add a member to a channel.

Removing members from a channel
-------------------------------

Select the channel name at the top of the center pane to access the drop-down menu, then select **Manage Members**. Any member of a channel can remove other members by selecting the member’s channel role, then selecting **Remove from Channel**.

    .. image:: ../images/remove-member-from-channel.png
        :alt: Remove a member from a channel.

Naming a channel
----------------

Channels can be identified in two ways:

1. **Channel display name:** This appears in the Mattermost user interface. On Desktop, select the channel name at the top of the center pane to access the drop-down menu, then choose **Rename Channel**. Anyone can rename the channels they belong to, unless the System Admin has `restricted the permissions <https://docs.mattermost.com/configure/configuration-settings.html#enable-public-channel-renaming-for>`__.
2. **Channel handle:** This is part of the channel URL. You can also change the channel handle when renaming a channel, but changing channel handles may break existing links.

For example, for the following channel, ``https://community.mattermost.com/core/channels/ux-design``:

- Channel display name: ``UX Design``
- Channel handle: ``ux-design`` 

Leaving a channel
-----------------

Select the channel name at the top of the center pane to access the drop-down menu, then select **Leave Channel**. Any team member who leaves a Private channel must be re-added by another channel member if they wish to rejoin. Team members will not receive mention notifications from channels of which they are not members.

Archiving a channel
-------------------

Select the channel name at the top of the center pane to access the drop-down menu, then select **Archive Channel**. Anyone can archive the Public channels or Private channels they belong to, unless the System Admin has restricted the permissions.

When a channel is archived, it is removed from the user interface, but a copy exists on the server in case it is needed for audit reasons at a later stage. Because of this, the URL of a newly created channel cannot be the same URL name as an archived channel.

In addition to this, when a channel is archived, by default the contents cannot be viewed, shared, or searched. If you want to be able to view or search the channel later, either:

1. Ask your System Admin to set ``ExperimentalViewArchivedChannels`` to ``true`` in ``config.json`` to allow users to view, share, and search for content of channels that have been archived; or
2. Leave the channel open, but post a message in the channel saying it's considered archived: such as ``# This channel is archived.``

System Admins `can archive channels in the System Console <https://docs.mattermost.com/manage/team-channel-members.html#profile>`_ without needing to be a channel member.

Unarchiving a channel
---------------------

Search for the channel if required. Then, open the channel, select the channel name at the top of the center pane to access the drop-down menu and select **Unarchive Channel**. System Admins and Team Admins can unarchive Public channels or Private channels they belonged to when it was archived.

    .. image:: ../images/unarchive-channel.png
        :alt: Unarchive a channel.

When a channel is unarchived, channel membership and all its content is restored, unless messages and files have been deleted based on the `data retention policy <https://docs.mattermost.com/configure/configuration-settings.html#data-retention-policy>`__.

Alternatively, System Admins can unarchive channels `via the CLI <https://docs.mattermost.com/manage/command-line-tools.html#mattermost-channel-restore>`__, or via the `mmctl <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-channel-unarchive>`__. Team Admins can unarchive channels `via the API <https://api.mattermost.com/#operation/RestoreChannel>`_.

Converting Public channels to Private channels (and vice versa)
---------------------------------------------------------------

Select the Public channel name at the top of the center pane to access the drop-down menu, then select **Convert to Private Channel**. Team and System Admins can convert Public channels to Private channels. Please note that default channels such as ``Town Square`` and ``Off-Topic`` cannot be converted to Private channels.

When a channel is converted, its history and membership are preserved. Membership in a Private channel is by invitation only. Publicly-shared files remain accessible to anyone with the link. 

.. note::
 
   Due to security concerns with sharing Private channel history, only System Admins can convert Private channels to Public channels via **System Console > Channels > Edit (Channel Configuration)**. Alternatively, perform this action using the `mmctl channel modify command <https://docs.mattermost.com/manage/command-line-tools.html#mattermost-channel-modify>`__.

Favoriting a channel
--------------------

Favorite channels are a great way to organize your channel sidebar by choosing which Public channels, Private channels, and Direct Messages are most important to you.

To mark a channel as a favorite, open the channel:

**On desktop:** At the top of the page, select on the star icon next to the channel name.

    .. image:: ../images/favorite-channel-desktop.png
        :alt: Mark a channel as a favorite.
       
This adds the channel to a **Favorites** list at the top of the channel sidebar, so it's easy to access. To remove a channel from the **Favorites** list, select the star again.

    .. image:: ../images/favorites-list-sidebar.png
        :alt: Favorite channels in the channel sidebar.
       
**On mobile:** Select the channel name at the top of the center pane to access the drop-down menu, then select **Favorite**. To remove a channel from the **Favorites** list, select **Favorite** again.

Muting and unmuting a channel
-----------------------------

By default, channel muting is turned off for all channels. To mute or unmute a channel, select the channel name at the top of the center pane to access the channel menu, then choose **Mute channel**.

Once a channel is muted:

- Email, desktop, and push notifications are disabled.
- A mute icon displays next to the channel name.
- The channel appears at reduced opacity in the channel sidebar, and the channel isn't marked as unread unless you're mentioned directly.

To unmute the channel, select the channel name again to access the drop-down menu, then select **Unmute Channel**.

Navigating between channels
---------------------------

Use the **Find channel** option in the channel sidebar, or press CMD/CTRL+K, to visit other channels, or to review `member availability <https://docs.mattermost.com/messaging/setting-your-status-availability.html>`__ at a glance.

    .. image:: ../images/switch-channels.png
        :alt: Navigate between channels and review member availability.

Navigating recently viewed channels
-----------------------------------

Use the **History** arrows at the top of the sidebar to move back and forth through your channel history. 

- Select the left arrow to go back one page. 
- Select the right arrow to go forward one page.

source/archive/manage-channels-settings.rst METASEP
:nosearch:

Manage Channels Settings
========================

|all-plans| |cloud| |self-hosted|

.. |all-plans| image:: ../images/all-plans-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in Mattermost Free and Starter subscription plans.

.. |cloud| image:: ../images/cloud-badge.png
  :scale: 30
  :target: https://mattermost.com/download
  :alt: Available for Mattermost Cloud deployments.

.. |self-hosted| image:: ../images/self-hosted-badge.png
  :scale: 30
  :target: https://mattermost.com/deploy
  :alt: Available for Mattermost Self-Hosted deployments.

You can configure your notification and theme preferences, as well as sidebar and display options for Channels, in **Settings**.

.. tabs::

  .. tab:: Mattermost v6.0 onwards

      In Mattermost v6.0, **Account Settings** have moved.

      - Access **Profile** and **Security** settings from your Avatar in the Global Header.
      - Access **Notifications**, **Display**, **Sidebar**, and **Advanced Settings** by selecting the Gear |gear-icon| icon in the Global Header.

      .. |gear-icon| image:: ../images/settings-outline_F08BB.svg
        :alt: Select the Gear icon to open the Settings dialog.

  .. tab:: Mattermost v5.39 and earlier

      In Mattermost versions up to v5.39, access all of your user settings in **Account Settings** from the **Main Menu** by selecting the three horizontal lines (also known as a hambuger menu) at the top of the channel sidebar.

Notifications
-------------

Settings to configure desktop notifications, desktop notification sounds, email notifications, mobile push notifications, and words that trigger mentions.

Desktop Notifications
~~~~~~~~~~~~~~~~~~~~~

Desktop notifications appear in the top corner of your main monitor when there is activity in Mattermost.

Send Desktop Notifications
^^^^^^^^^^^^^^^^^^^^^^^^^^

Choose what activity triggers a desktop notification. This setting applies globally, but this preference is customizable for each channel from the channel name drop-down menu. Desktop notifications are available on Chrome, Edge, Firefox, and Safari.

When `Desktop App <https://mattermost.com/download/#mattermostApps>`__ notifications are set to "Only for mentions and direct messages":

- An empty red circle is displayed over the upper right corner of the Mattermost dock icon when any message without an at-mention is received. 
- A solid red circle with a post count is displayed when a message with an at-mention is received.
- And when `Collapsed Reply Threads (Beta) <https://docs.mattermost.com/messaging/manage-channels-settings.html#collapsed-reply-threads-beta>`__ is enabled, you can choose to receive desktop notifications about `threads you're following <https://docs.mattermost.com/messaging/organizing-conversations.html#start-or-reply-to-threads>`__.

Notification Sound
^^^^^^^^^^^^^^^^^^

Notification sounds fire for any activity that would trigger a desktop notification. Notification sounds are available on Chrome, Edge, Firefox, and Safari in addition to the Mattermost Desktop App.

Notification Duration
^^^^^^^^^^^^^^^^^^^^^

*Removed in June 16th, 2018 release*

In Mattermost v5.0 and later, desktop notifications will stay onscreen for five seconds when supported by the browser and operating system.

Email Notifications
~~~~~~~~~~~~~~~~~~~

Email notifications are sent for mentions and direct messages after you’ve been offline for more than 60 seconds or away from Mattermost for more than five minutes. Change the email where notifications are sent by selecting **Profile > Profile Settings > Email**.

If your System Admin has enabled `Email Batching <https://docs.mattermost.com/configure/configuration-settings.html#enable-email-batching>`__, you'll have additional options under this settings to select how often email notifications will be sent. All notifications received over this time period are combined and sent in a single email.

Mobile Push Notifications
~~~~~~~~~~~~~~~~~~~~~~~~~

Push notifications can be sent to your mobile device if you have the Android or iOS app installed. You can choose the type of activity that will send a notification. 

By default, push notifications are sent "For mentions and direct messages". If push notifications are sent "Never", the Mattermost setting to trigger push notifications depending on your `Mattermost availability <https://docs.mattermost.com/messaging/setting-your-status-availability.html>`__ is hidden. If your System Admin has not set up push notifications, this setting will be disabled.

If you're actively viewing a channel (Public or Private), Direct Message, or Group Message using the Desktop App or a browser, no push notifications will be sent for that channel. If a notification is viewed using the Desktop App or a browser, the lockscreen notification will clear on Android, and on iOS the badge on the Mattermost app icon will count down accordingly.

Trigger Mobile Push Notifications When
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

You can also choose when to send push notifications depending on your Mattermost availability. By default, push notifications are sent if your availability is **Away** or **Offline**. If **Send Mobile Push Notifications** is set as **Never**, this setting is hidden. If your System Admin has not set up push notifications, this setting will be disabled.

Words That Trigger Mentions
~~~~~~~~~~~~~~~~~~~~~~~~~~~

By default, you receive notifications when someone posts a message that contains your non-case sensitive username or @username. You also receive notifications when someone uses the @channel, @all, and @here mentions. You can customize the words that trigger mentions by typing them into the input box. This is useful if you want to be notified of all posts on a certain topic, for example, "marketing".

Reply Notifications
~~~~~~~~~~~~~~~~~~~

When `Collapsed Reply Threads (Beta) <https://docs.mattermost.com/messaging/manage-channels-settings.html#collapsed-reply-threads-beta>`__ is disabled, you can choose to receive mention notifications when someone replies to a thread you have started or have participated in. 

- You are considered to start a thread when you post a message to which other members of your team reply. 
- You are considered to participate in a thread when you post a message using the `Reply button <https://docs.mattermost.com/messaging/messaging-basics.html>`__ in an pre-existing thread.

.. note::
  This setting is hidden when Collapsed Reply Threads (Beta) is enabled.

Automatic Direct Message Replies
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Set an automated custom message that will be sent once per day in response to Direct Messages. Mentions in Public and Private Channels won't trigger the automated reply. Enabling Automatic Replies sets your availability to **Out of Office** and disables desktop, email, and push notifications. This setting is experimental and `must be enabled by your System Admin <https://docs.mattermost.com/configure/configuration-settings.html#enable-automatic-replies>`__.

Display
-------

Settings to configure clock and teammate name display preferences.

Theme
~~~~~

Select **Theme Colors** to select from four standard themes designed by the Mattermost team. To make custom adjustments on the four standard theme colours, select a standard theme and then select **Custom Theme** to load the standard theme into the custom theme color selectors.

Select **Custom Theme** to customize your theme colors and share them with others by copying and pasting theme vectors into the input box. Observe a live preview as you customize theme colors, then select **Save** to confirm your changes. Discard your changes by selecting **Cancel**, or by exiting the settings modal and selecting **Yes, Discard**.

In Enterprise Edition, if you belong to multiple teams, you can optionally select the checkbox "Apply new theme to all my teams" to have the theme show up across teams. Otherwise, the changes will only apply to the current team.

Learn more about the custom theme color selectors `here <https://docs.mattermost.com/messaging/customizing-theme-colors.html>`__.

Select **Import theme colors from Slack** to import a Slack theme. In Slack, go to **Preferences > Sidebar Theme** and open the custom theme option. From there, copy the theme color vector and then paste it into the *Input Slack Theme* input box in Mattermost. Any theme settings that are not customizable in Slack will default to the “Sapphire” standard theme settings.

Display Font
~~~~~~~~~~~~

*Removed in July 16th, 2017 release*

Select what font is used.

Clock Display
~~~~~~~~~~~~~

Choose a 12-hour or 24-hour time preference that appears on the time stamp for all posts.

Teammate Name Display
~~~~~~~~~~~~~~~~~~~~~

Configure how names are displayed in the user interface: nickname, username or full name. The default for this setting is dependent on the `configuration set by the System Admin <https://docs.mattermost.com/configure/configuration-settings.html#teammate-name-display>`__.

Show online availability on profile images
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Online availability icons display on user profile avatars in the center channel by default. Disable this setting to hide online availability icons within the center channel.

Timezone
~~~~~~~~~

Select the timezone used for timestamps in the user interface and for email notifications. 

.. note::
  
  In Mattermost v5.38 or earlier, timezone functionality `must first be enabled by the System Admin <https://docs.mattermost.com/configure/configuration-settings.html#timezone>`__ by replacing ``false`` with ``true`` in ``config.json``. Timezone is enabled by default from Mattermost v6.0.

Website Link Previews
~~~~~~~~~~~~~~~~~~~~~

When available, the first web link in a message will show a preview of the website content below the message. This `setting must be enabled by your System Admin <https://docs.mattermost.com/configure/configuration-settings.html#enable-link-previews>`__.

Default Appearance of Image Previews
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

When messages in Mattermost include images, an image preview can display directly below the message for image attachments, image link previews, and `in-line images <https://docs.mattermost.com/messaging/formatting-text.html#in-line-images>`__ over 100px in height. You can set this preference to **Expanded** or **Collapsed**.

.. tip::
  This setting can also be controlled using the slash commands ``/expand`` and ``/collapse``.

Message Display
~~~~~~~~~~~~~~~

Select the formatting for messages in the center channel. "Compact" mode decreases the spacing around posts, collapses link previews, and hides thumbnails so only file names are shown. Some formatting types, such as block quotes and headings, are also reduced in size.

Collapsed Reply Threads (Beta)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Collapsed Reply Threads (Beta) offers an enhanced experience for users communicating in threads and replying to messages. Collapsed Reply Threads are available in Mattermost Cloud and from self-hosted Mattermost v5.37 as an early access beta, and are disabled by default. If your System Admin has enabled **Collapsed Reply Threads** for your workspace, you can enable them in your Mattermost instance to start being notified about threads you're following in a new **Threads** option at the top of the channel sidebar.

See our `Organizing Conversations using Collapsed Reply Threads (Beta) <https://docs.mattermost.com/messaging/organizing-conversations.html>`__ documentation to learn more about this feature.

Click to open threads
~~~~~~~~~~~~~~~~~~~~~

By default, selecting any part of a message opens the reply thread in the right hand sidebar. You can disable this behavior in **Settings > Display > Click to open threads**. When disabled, reply to a message or select the replies count to open the reply thread.

Channel display
~~~~~~~~~~~~~~~

Select if the text in the center channel is fixed width and centered, or full width.

Quick reactions to messages
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

You can react to messages quickly with your most recently-used emojis by hovering over a message.

Language
~~~~~~~~

Select what language Mattermost displays in the user interface. Options include:

- Deutsch - German
- English (U.S.)
- English Australian
- Español - Spanish
- Français - French
- Italiano - Italian
- Magyar - Hungarian
- Nederlands - Dutch
- Polski - Polish
- Português (Brasil) - Portuguese
- Română - Romanian
- Svenska - Swedish
- Türkçe - Turkish
- български - Bulgarian
- Pусский - Russian
- Yкраїнська - Ukrainian
- 한국어 - Korean
- 中文 (简体) - Simplified Chinese
- 中文 (繁體) - Traditional Chinese
- 日本語 - Japanese

Sidebar
-------

The channel sidebar includes `enhanced sidebar features <https://docs.mattermost.com/messaging/organizing-your-sidebar.html>`__, including custom, collapsible channel categories, drag and drop, unread filtering, channel sorting options, and more.

The following sidebar settings apply to your current sidebar only:

**Group unread channels separately**

This feature groups unread channels at the top of the channel sidebar in an **Unreads** category. System Admins can `set the default of this setting <https://docs.mattermost.com/configure/configuration-settings.html#group-unread-channels-experimental>`__ for you. 

Legacy sidebar settings
~~~~~~~~~~~~~~~~~~~~~~~

The legacy sidebar `must be enabled by your System Admin <https://docs.mattermost.com/configure/configuration-settings.html#enable-legacy-sidebar>`__. The following sidebar settings apply only to the legacy sidebar:

Channel grouping
^^^^^^^^^^^^^^^^

Channels can be grouped by type (Public, Private, or Direct Message), or all channel types can be grouped in a single list. 

Channel sorting
^^^^^^^^^^^^^^^

Channels can be sorted within their channel sidebar sections alphabetically (default) or by most recent message.

Channel switcher
^^^^^^^^^^^^^^^^

Hide the channel switcher used to jump between channels quickly. The channel switcher can also be accessed using CTRL/CMD+K.

Autoclose Direct Messages
^^^^^^^^^^^^^^^^^^^^^^^^^

Hide Direct Message conversations with no activity for seven days. These conversations can be reopened with the **+** button in the channel sidebar, or by using the Channel Switcher (CTRL+K). This setting is experimental and `must be enabled by your System Admin <https://docs.mattermost.com/configure/configuration-settings.html#autoclose-direct-messages-in-sidebar-experimental>`__.

Advanced
--------

Settings to configure when messages are sent.

Send messages on CTRL+ENTER
~~~~~~~~~~~~~~~~~~~~~~~~~~~

If **On for all messages** is enabled, pressing ENTER inserts a new line and pressing CTRL+ENTER posts a message. If **On only for code blacks starting with ```** is enabled, pressing ENTER inserts a new line inside an open code block and pressing CTRL+ENTER automatically closes the code block and posts the message. If disabled, pressing SHIFT+ENTER inserts a new line and pressing ENTER posts the message.

Enable Post Formatting
~~~~~~~~~~~~~~~~~~~~~~

This setting controls whether post formatting is rendered. When "On", posts will be rendered with `markdown formatting <https://docs.mattermost.com/messaging/formatting-text.html>`__, emoji, autolinked URLs, and line breaks. When "Off", the raw text will be shown.

Enable Join/Leave Messages
~~~~~~~~~~~~~~~~~~~~~~~~~~

This setting controls whether system messages about users joining or leaving a channel are visible. When **On** these messages will appear. When **Off**, these messages will be hidden. If any users are added to or removed from a channel, a system message will still be shown even if this setting is **Off**.

Preview pre-release features
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Turn on preview features to view them early, ahead of their official release:

- **Show markdown preview option in message input box** Turning this on will show a "Preview" option when typing in the text input box. Pressing "Preview" shows what the Markdown formatting in the message looks like before the message is sent.

Deactivate Account
~~~~~~~~~~~~~~~~~~

Use this setting to deactivate your account. After deactivating, an email notification is sent confirming the deactivation was successful.

Deactivating your account removes your ability to log in to the Mattermost server and disables all email and mobile notifications. To reactivate your account, contact your System Admin.

Only available for accounts with email login, and if your System Admin has set ``EnableUserDeactivation`` to ``true`` in ``config.json``.

For accounts with other authentication methods such as AD/LDAP or SAML, or for accounts that do not have this setting available, contact your System Admin to deactivate your account.

source/archive/localization.rst METASEP
:nosearch:

Localization
============

This page has moved to the `Mattermost Handbook <https://handbook.mattermost.com/contributors/contributors/localization>`_.

source/archive/localization-process.md METASEP
:nosearch:

Please see [updated localization guides](https://docs.mattermost.com/developer/localization.html).
source/archive/light-install-hindi.rst METASEP
:nosearch:

लाइट इनस्टॉल गाइड
==============

मैटरमोस्ट एक मैसेजिंग और कोलैबोरेशन मंच है। मैटरमोस्ट के द्वारा,आप प्रतिदिन इस्तेमाल किए जाने वाले उपकरण एक ही जगह पर एकीकृत कर सकते है और कोई भी  अधिसूचना या कार्य नहीं छूटेगा।

आरंभ करने से पहले आपको इनकी आवश्यकता होगी:
- रूट लेवल एक्सेस वाला उबंटू सर्वर (18.04 या 20.04)
- (संस्तुत) आपके सर्वर से जुड़ा एक डोमेन नाम (जैसे कि mymattermostserver.com)
- (संस्तुत) अपनी टीम के सदस्यों के ईमेल ताकि आप उन्हें सर्वर पर आमंत्रित कर सकें

इंस्टालेशन
------

`मैटरमोस्ट ओमनीबस <https://docs.mattermost.com/install/mattermost-omnibus.html>`_ के द्वारा मैटरमोस्ट इनस्टॉल  करें।

टर्मिनल विंडो खोलें और एंटेर करें:

``curl -o- https://deb.packages.mattermost.com/repo-setup.sh | sudo bash``

फिर,मैटरमोस्ट ओमनीबस इनस्टॉल करने  लिए ये चलाएं:

``sudo apt install mattermost-omnibus``

!नोट 
यद्यपि ओमनीबस को इनस्टॉल करने और कॉन्फ़िगर करने का संस्तुत तरीका SSL इनेबल्ड है, यदि आपको उसके बिना (या डोमेन नाम के बिना) उपयोग या परीक्षण करना चाहते हैं, तो ये चलाएं: 

``sudo MMO_HTTPS=false apt install mattermost-omnibus``

जब आपका सर्वर चल रहा हो , तो उसे डोमेन नाम (जैसे कि mymattermostserver.com) के माध्यम से नेविगेट करें,जो आपके सर्वर (या यदि आप डोमेन नाम का उपयोग नहीं कर रहे हैं तो सर्वर के आईपी एड्रेस) को इंगित करता है। इसके बाद, एक टीम बनाएं और अपने मैटरमोस् सर्वर से जुड़ने के लिए लोगों को आमंत्रित करें।

यदि आपको मैटरमोस्ट ओमनीबस स्थापित करने में कोई समस्या आ रही हो ,तो सामान्य त्रुटि संदेशों के लिए `ट्रबलशूटिंग गाइड <https://docs.mattermost.com/install/troubleshooting.html>`_ देखें, या समस्या निवारण सहायता के लिए `मैटरमोस्ट उपयोगकर्ता समुदाय <https://mattermost.com/ask-mattermost-community>`_ में शामिल हों।

उपयोगकर्ताओं को जोड़ें
---------------

अब अपनी टीम के लोगों को आमंत्रण भेजकर उन्हें जोड़ें:

1. नेविगेशन पैनल के शीर्ष पर अपने यूजरनेम पर क्लिक करें। 
2. Invite People पर क्लिक करें और उन लोगों के ईमेल पते एंटेर करें जिन्हें आप जोड़ना चाहते हैं।
3. Invite Members पर क्लिक करें।

जब आमंत्रित व्यक्ति लिंक के साथ ईमेल प्राप्त करता है, तो आपके सर्वर से जुड़ने के लिए यह एक सिंगल क्लिक होगा, जिस चैनल को आपने बनाया है, उसी में चैट करें या स्वयं के चैनल बनाएं। उपयोगकर्ताओं को जोड़ने के बारे में अधिक जानकारी `यहाँ <https://docs.mattermost.com/help/getting-started/managing-members.html#managing-members>`_ उपलब्ध है।

अधिसूचना हब बनाए
--------------

एक `"heartbeat" चैनल <https://community.mattermost.com/core/channels/community-heartbeat>`_ बनाएं और एक ही जगह  पर अपने  स्टेटस अपडेट और महत्वपूर्ण सूचनाएं भेजने के लिए अपने सबसे अधिक उपयोग किए जाने वाले ऐप्स और प्लग इन को मैटरमोस्ट के साथ एकीकृत करें।

आप **Main Menu > Plugin Marketplace** के माध्यम से इंटीग्रेशन और प्लगइन्स पा और इंस्टॉल कर सकते हैं।

GitHub, Jira और Jenkins से परिचय करें: 

- अपनी समीक्षा को प्रबंधित करने, पुल रिक्वेस्ट,टिप्पणियों और मर्ज करने के लिए अपने स्लैश कमांड का उपयोग करके अपने Github संगठन को मैटरमोस्ट से कनेक्ट करें। GitHub मैटरमोस्ट में प्री-पैकेज्ड है। `कॉन्फ़िगरेशन स्टेप्स <https://github.com/mattermost/mattermost-plugin-github#configuration>`_ का पालन करें, और फिर अपनी टीम को ``/github connect`` चलाना बताए  ताकि वे अधिसूचना प्राप्त कर सकें।
- अपने Jira अकाउंट को मैटरमोस्ट से कनेक्ट करें और बॉट के लिए एक चैनल सेटअप करें ताकि आपकी टीम हमेशा अद्यतित रहे। आरंभ करने के लिए `कॉन्फ़िगरेशन गाइड <https://mattermost.gitbook.io/plugin-jira/setup/configuration>`_ पर जाएँ।  कॉन्फ़िगर करने के बाद, `उपयोगकर्ता डॉक्यूमेंटेशन <https://mattermost.gitbook.io/plugin-jira/end-user-guide/getting-started>`_ को अपनी टीम के साथ साझा करें ताकि वे सूचनाएं प्राप्त कर सकें।
- अपने वर्कफ़्लोज़ को केंद्रीकृत करने और बिल्ड प्रबंधित करने के लिए अपने Jenkins सर्वर को मैटरमोस्ट से कनेक्ट करें। आरंभ करने के लिए `इंस्टॉलेशन गाइड <https://github.com/mattermost/mattermost-plugin-jenkins#installation>`_ पर जाएं। अपनी टीम के साथ `फीचर्स लिस्ट <https://github.com/mattermost/mattermost-plugin-jenkins#features>`_ साझा करें ताकि वह तेज़ी से कार्य शुरू कर सकें।

source/archive/legacy-upgrade.md METASEP
# Upgrading from an Unsupported Version

These instructions apply only if you're upgrading from an unsupported version of Mattermost to the latest version. Only the current released version and the two previous versions are supported.

If you're upgrading a server that's already running a supported version, See [Upgrading Mattermost Server](../../administration/upgrade.html).

## Upgrade Team Edition from 3.0.0 and later

### Important Notices

1. Security-related changes were made in 3.9.0 that cause any previously created team invite links, password reset links, and email verification links to no longer work. You must update any place where you have published these links.

2. Security-related changes were made in 3.6.7, 3.7.5, and 3.8.0 that require you to verify settings in the System Console before upgrading.

    - Go to **System Console > Environment > Web Server**, then select **Configuration** and make sure that the **Site URL** is specified. It must not be empty. For more information about SiteURL, see [Configuration Settings](../../administration/config-settings.html#site-url).
    - Go to **System Console > Environment > Logging**, then select **Logging** and make sure that the **File Log Directory** field is either empty or has a directory path only. It must not have a filename as part of the path.

3. Changes were made in 3.8.0 that require a change in the proxy configuration. If you're using NGINX:
    1. Open the NGINX configuration file as *root*. The file is usually ``/etc/nginx/sites-available/mattermost`` but might be different on your system.
    2. Locate the following line:
     `location /api/v3/users/websocket {`
    3. Replace the  line with ``location ~ /api/v[0-9]+/(users/)?websocket$ {``.

    If you're using a proxy other than NGINX, make the equivalent change to that proxy's configuration.

4. RHEL6 and Ubuntu installations must verify the line `limit nofile 50000 50000` is included in `/etc/init/mattermost.conf` file. See the [installation guide](../../guides/administrator.html#install-guides) for your operating system for more details.

5. RHEL7 and Ubuntu installations must verify the line `LimitNOFILE=49152` is included in the `/etc/systemd/system/mattermost.service` file. See the [installation guide](../../guides/administrator.html#install-guides) for your operating system for more details.

**Upgrading from 3.0.0 and later**

1. Download the latest version of Team Edition server and note any compatibility procedures:
      1. Review past and upcoming deprecation notices [listed on our website](https://handbook.mattermost.com/operations/research-and-development/product/development-process/deprecated-features#definition-of-a-deprecated-feature).
      2. Download [the latest version of the Mattermost Server](https://mattermost.com/deploy/). In the following command, replace `X.X.X` with the version that you want to download:
          - **Team Edition**: `wget https://releases.mattermost.com/X.X.X/mattermost-team-X.X.X-linux-amd64.tar.gz`
2. Stop the Mattermost server
      1. Consider posting an announcement to active teams about stopping the Mattermost server for an upgrade.
      2. To stop the server run `sudo stop mattermost`.
3. Back up your data
      1. Back up your `config.json` file, which contains your system configuration. This will be used to restore your current settings after the new version is installed.
      2. Back up your database using your organization's standard procedures for backing up MySQL or PostgreSQL.
      3. If you're using local file storage, back up the location where files are stored.
4. Install the new version
      1. Run `tar -xvzf mattermost-team-X.X.X-linux-amd64.tar.gz` to decompress the upgraded version and replace the current version of Mattermost on disk, where `X.X.X` is the version number to which you are upgrading.
5. Restore the state of your server
      1. Copy the backed up version of `config.json` in place of the default `config.json`.
6. Start your server and address any setting changes relevant in the latest version of Mattermost
      1. Run `sudo start mattermost`.
      2. Open the System Console and save a change to upgrade your `config.json` schema to the latest version using default values for any new settings added.
7. If you have TLS set up on your Mattermost server, you must activate the CAP_NET_BIND_SERVICE capability to allow the new Mattermost binary to bind to low ports
      1. `cd {install-path}`
      2. `sudo setcap cap_net_bind_service=+ep ./bin/mattermost`

After the server is upgraded, users might need to refresh their browsers to experience any new features.

## Upgrade Enterprise Edition from 3.0.0 and later

### Important Notices

1. Security-related changes were made in 3.9.0 that cause any previously created team invite links, password reset links, and email verification links to no longer work. You must update any place where you have published these links.

2. Security-related changes were made in 3.6.7, 3.7.5, and 3.8.0 that require you to verify settings in the System Console before upgrading from version 3.5.3 and earlier to any version greater than 3.6.7.
    1. Go to **System Console > Environment > Web Server**, then select **Configuration** and make sure that the **Site URL** is specified. It must not be empty. For more information about SiteURL, see [Configuration Settings](../../administration/config-settings.html#site-url).
    2. Go to **System Console > Environment > Logging**, then select **Logging** and make sure that the **File Log Directory** field is either empty or has a directory path only. It must not have a filename as part of the path.

3. Changes were made in 3.8.0 that require a change in the proxy configuration. If you're using NGINX:
    1. Open the NGINX configuration file as root. The file is usually ``/etc/nginx/sites-available/mattermost`` but might be different on your system.
    2. Locate the following line:
     `location /api/v3/users/websocket {`
    3. Replace the  line with ``location ~ /api/v[0-9]+/(users/)?websocket$ {``.

    If you're using a proxy other than NGINX, make the equivalent change to that proxy's configuration.
    
4. If there are config settings set for `"RestrictPublicChannelManagement"` and `"RestrictPrivateChannelManagement"`, they will be used as the default values for `"RestrictPublicChannelCreation"`, `"RestrictPrivateChannelCreation"`, `"RestrictPublicChannelDeletion"`, and `"RestrictPrivateChannelDeletion"` after upgrade.

5. If public links are enabled, upgrading from `v3.3.x` and earlier to `v3.4.x` and later will invalidate existing public links due to a security upgrade allowing admins to invalidate links by resetting a public link salt from the System Console.

6. RHEL6 and Ubuntu installations must verify the line `limit nofile 50000 50000` is included in `/etc/init/mattermost.conf` file. See the [installation guide](https://docs.mattermost.com/guides/administrator.html#install-guides) for your operating system for more details.
7. RHEL7 and Ubuntu installations must verify the line `LimitNOFILE=49152` is included in the `/etc/systemd/system/mattermost.service` file. See the [installation guide](https://docs.mattermost.com/guides/administrator.html#install-guides) for your operating system for more details.

**Upgrading from 3.0.0 and later**

1. Download the latest version of Enterprise Edition server and note any compatibility procedures:
      1. Review past and upcoming deprecation notices [listed on our website](https://handbook.mattermost.com/operations/research-and-development/product/development-process/deprecated-features#definition-of-a-deprecated-feature).
      2. Download [the latest version of the Mattermost Server](https://mattermost.com/download/). In the following command, replace `X.X.X` with the version that you want to download:
          - **Enterprise Edition:** `wget https://releases.mattermost.com/X.X.X/mattermost-X.X.X-linux-amd64.tar.gz`
2. Stop the Mattermost server
      1. Consider posting an announcement to active teams about stopping the Mattermost server for an upgrade.
      2. To stop the server run `sudo stop mattermost`.
3. Back up your data
      1. Back up your `config.json` file, which contains your system configuration. This will be used to restore your current settings after the new version is installed.
      2. Back up your database using your organization's standard procedures for backing up MySQL or PostgreSQL.
      3. If you're using local file storage, back up the location where files are stored.
4. Install the new version
      1. Run `tar -xvzf mattermost-X.X.X-linux-amd64.tar.gz` to decompress the upgraded version and replace the current version of Mattermost on disk, where `X.X.X` is the version number to which you are upgrading.  
5. Restore the state of your server
      1. Copy the backed up version of `config.json` in place of the default `config.json`.
6. Start your server and address any setting changes relevant in the latest version of Mattermost
      1. Run `sudo start mattermost`.
      2. Open the System Console and save a change to upgrade your `config.json` schema to the latest version using default values for any new settings added.
7. If you have TLS set up on your Mattermost server, you must activate the CAP_NET_BIND_SERVICE capability to allow the new Mattermost binary to bind to low ports

      1. ``cd {install-path}``
      2. ``sudo setcap cap_net_bind_service=+ep ./bin/platform``

After the server is upgraded, users might need to refresh their browsers to experience any new features.

## Upgrade Team Edition to 3.0.3

In Mattermost 3.0 users can maintain a single account across multiple teams on a Mattermost server. This means one set of credentials, one place to configure all account settings, and a more streamlined sign-up and team joining process.

If your Mattermost server has duplicate accounts (users with multiple accounts in multiple teams with the same email address or username), you need to understand the 3.0 upgrade process in detail and take special steps to upgrade successfully.

1. Download Mattermost Team Edition 3.0.3:
      1. Run `platform -version` to confirm the current version of your Mattermost server is `v2.2.0`, `v2.1.0`, or `v2.0.0`. If not, please [upgrade to `v2.0.0`](https://docs.mattermost.com/administration/legacy-upgrade.html#upgrade-team-edition-to-2-2-x-and-earlier).
      2. Run `wget https://releases.mattermost.com/X.X.X/mattermost-team-X.X.X-linux-amd64.tar.gz` to download the appropriate new version.
2. Stop the Mattermost server
      1. Consider posting an announcement to active teams about stopping the Mattermost server for an upgrade
      2. To stop the server run `sudo stop mattermost`
3. Back up your data
      1. Back up your `config.json` file, which contains your system configuration. This will be used to restore your current settings after the new version is installed.
      2. Back up your database using your organization's standard procedures for backing up MySQL or PostgreSQL.
      3. If you're using local file storage, back up the location where files are stored. This location is specified in the `config.json` file under `FileSettings` > `Directory`.
      4. Verify your backups are successful.
4. Install the new version
      1. Double check that your database and configuration file has been backed up, as the database upgrade to 3.x from 2.x cannot be reversed.
      2. Run `tar -xvzf mattermost-team-X.X.X-linux-amd64.tar.gz` to decompress the upgraded version and replace the current version of Mattermost on disk, where `X.X.X` is the version number to which you are upgrading.
5. Restore the state of your server
      1. Copy the backed up version of `config.json` in place of the default `config.json`.
      2. If you're using local file storage, restore the data you backed up before running the server. Keep the backup until you're sure the upgrade has succeeded.
6. Upgrade your database
      1. Run `./platform -upgrade_db_30` to upgrade your database from 2.x to 3.x
         - You may need to run with `sudo -u linux_user_account ./platform -upgrade_db_30` if you've setup Mattermost to run under a different account.  This will ensure files under `./data/` have the correct permissions.
         - You will be asked `Have you performed a database backup? (YES/NO):`
             - If you have not backed up your database, enter `NO` and then back up your database.
             - If you have verified your database has been backed up, enter `YES`.
         - You will be asked to select a `primary team`.
             - If you only have one team, enter the name of the team.
             - If you have more than one team, specify the `primary team` based on the team you use the most.
                  - If your server contains duplicate accounts (multiple accounts with either the same email addresses or the same usernames) the user account in the `primary team` will be considered the primary account and remain unchanged.
                     - When the server finds a duplicate account not in the `primary team` the email address of the account may be changed to avoid conflicts.
                         - An account with a **duplicate email address** will be updated so `+[TEAM_URL_NAME]` is appended to the local part of the email address. For example: An account with a duplicate email `steve@company.com` in the team at URL `https://mattermost.company.com/marketing` becomes `steve+marketing@company.com`. The `+marketing` used in this procedure is part of the RFC5233 email specification and most email systems will properly route `steve+marketing@company.com` to `steve@company.com`. After the upgrade, if email authentication is used for sign-in, the user would need to sign-in with the new email address.
                         - An account with a **duplicate username** will be updated so `[TEAM_URL_NAME].`” is prepended to the username. For example: An account with a duplicate username `steve` in the team at URL `https://mattermost.company.com/marketing` becomes `marketing.steve`.
         - Users with accounts containing duplicate emails or usernames will receive a notification email explaining the upgrade, and instructions on how to move to a single user account ([see example](https://mattermost.org/upgrade-to-3-0/)).
7. Start your server and address any setting changes relevant in the latest version of Mattermost
      1. Run `sudo start mattermost`.
      2. Open the System Console and save a change to upgrade your `config.json` schema to the latest version using default values for any new settings added.
8. If you have TLS set up on your Mattermost server, run `sudo setcap cap_net_bind_service=+ep ./bin/platform` in your Mattermost directory to allow Mattermost to bind to low ports
9. Test the system is working by going to the URL of the server with an `https://` prefix
      1. You may need to refresh your Mattermost browser page in order to get the latest updates from the upgrade.
10. After the Mattermost 3.0 upgrade, users with duplicate accounts must follow the instructions in the upgrade email to:
      1. Log in to teams on which duplicate accounts were created.
      2. Add their primary account to the team and any private channels that are still actively used.

   Users can continue to access the direct message history of their duplicate accounts using their updated email addresses.

## Upgrade Team Edition to 2.2.0 and earlier

1. Download the **appropriate next upgrade** of your Team Edition server and note any compatibility procedures:
      1. Run `platform -version` to check the current version of your Mattermost server
      2. Determine the appropriate next upgrade for your server:
          - Mattermost `v2.0.x` and `v2.1.x` can upgrade directly to Mattermost `v2.2.x`.
          - Mattermost `v1.4.x` and `v2.0.x` can upgrade directly to Mattermost `v2.1.x`.
          - Mattermost `v1.2.x` must upgrade to Mattermost `v1.3.x` before further upgrades.
          - Mattermost `v1.1.x` must upgrade to Mattermost `v1.2.x` before further upgrades.
          - Mattermost `v1.0.x` must upgrade to Mattermost `v1.1.x` before further upgrades.
      3. Use the [Version Archive List](https://docs.mattermost.com/administration/upgrade.html#version-archive) to find the `[RELEASE URL]` for your desired version and enter `wget {RELEASE URL}` to download. For example, to download `vX.X.X`, use `wget https://releases.mattermost.com/X.X.X/mattermost-team-X.X.X-linux-amd64.tar.gz`.
      4. Review the **Compatibility** section in [CHANGELOG](https://docs.mattermost.com/administration/changelog.html) for the version downloaded and make sure to follow any instructions.
2. Stop the Mattermost server
      1. Consider posting an announcement to active teams about stopping the Mattermost server for an upgrade.
      2. To stop the server run `sudo stop mattermost`.
3. Back up your data
      1. Back up your `config.json` file, which contains your system configuration. This will be used to restore your current settings after the new version is installed.
      2. Back up your database using your organization's standard procedures for backing up MySQL or PostgreSQL.
      3. If you're using local file storage, back up the location where files are stored.
5. Install the new version
      1. Run `tar -xvzf mattermost-team-X.X.X-linux-amd64.tar.gz` to decompress the upgraded version and replace the current version of Mattermost on disk, where `X.X.X` is the version number to which you are upgrading.  
6. Restore the state of your server
      1. Copy the backed up version of `config.json` in place of the default `config.json`.
7. Start your server and address any setting changes relevant in the latest version of Mattermost
      1. Run `sudo start mattermost`.
      2. Open the System Console and save a change to upgrade your `config.json` schema to the latest version using default values for any new settings added.
8. If you have TLS set up on your Mattermost server, run `sudo setcap cap_net_bind_service=+ep ./bin/platform` in your Mattermost directory to allow Mattermost to bind to low ports
9. Test the system is working by going to the URL of the server with an `https://` prefix
      1. You may need to refresh your Mattermost browser page in order to get the latest updates from the upgrade.

## Upgrade Enterprise Edition to 3.0.3

In Mattermost 3.0 users can maintain a single account across multiple teams on a Mattermost server. This means one set of credentials, one place to configure all account settings, and a more streamlined sign up and team joining process.

If your Mattermost server has duplicate accounts (users with multiple accounts in multiple teams with the same email address or username), you need to understand the 3.0 upgrade process in detail and take special steps to upgrade successfully.

1. Download Mattermost Enterprise Edition 3.0.3
      1. Run `platform -version` to confirm the current version of your Mattermost server is `v2.2.0`, `v2.1.1`, or `v2.0.0` of either Mattermost Enterprise Edition or Mattermost Team Edition. If not, please [upgrade to at least Mattermost Enterprise Edition `v2.0.0`](https://docs.mattermost.com/administration/legacy-upgrade.html#upgrade-enterprise-edition-to-2-2-x-and-earlier).
      2. Run `wget https://releases.mattermost.com/X.X.X/mattermost-X.X.X-linux-amd64.tar.gz` to download the appropriate new version.
2. Stop the Mattermost server
      1. Consider posting an announcement to active teams about stopping the Mattermost server for an upgrade.
      2. To stop the server run `sudo stop mattermost`.
3. Back up your data
      1. Back up your `config.json` file, which contains your system configuration. This will be used to restore your current settings. after the new version is installed.
      2. Back up your database using your organization's standard procedures for backing up MySQL or PostgreSQL.
      3. If you're using local file storage, back up the location where files are stored.
      4. Verify your backups are successful.
4. Install the new version
      1. Double check that your database and configuration file has been backed up, as the database upgrade to 3.x from 2.x cannot be reversed.
      2. Run `tar -xvzf mattermost-X.X.X-linux-amd64.tar.gz` to decompress the upgraded version and replace the current version of Mattermost on disk, where `X.X.X` is the version number to which you are upgrading.
5. Restore the state of your server
      1. Copy the backed up version of `config.json` in place of the default `config.json`.
6. Upgrade your database
      1. Run `./platform -upgrade_db_30` to upgrade your database from 2.x to 3.x.
         - You may need to run with `sudo -u linux_user_account ./platform -upgrade_db_30` if you've setup Mattermost to run under a different account.  This will ensure files under `./data/` have the correct permissions.
         - You will be asked `Have you performed a database backup? (YES/NO):`
             - If you have not backed up your database, enter `NO` and then back up your database.
             - If you have verified your database has been backed up, enter `YES`.
         - You will be asked to select a `primary team`.
             - If you only have one team, enter the name of the team.
             - If you have more than one team, specify the `primary team` based on the team you use the most.
                  - If your server contains duplicate accounts (multiple accounts with either the same email addresses or the same usernames) the user account in the `primary team` will be considered the primary account and remain unchanged.
                     - When the server finds a duplicate account not in the `primary team` the email address of the account may be changed to avoid conflicts
                         - An account with a **duplicate email address** will be updated so `+[TEAM_URL_NAME]` is appended to the local part of the email address. For example: An account with a duplicate email `steve@company.com` in the team at URL `https://mattermost.company.com/marketing` becomes `steve+marketing@company.com`. The `+marketing` used in this procedure is part of the RFC5233 email specification and most email systems will properly route `steve+marketing@company.com` to `steve@company.com`. After the upgrade, if email authentication is used for sign-in, the user would need to sign-in with the new email address.
                         - An account with a **duplicate username** will be updated so `[TEAM_URL_NAME].`” is prepended to the username. For example: An account with a duplicate username `steve` in the team at URL `https://mattermost.company.com/marketing` becomes `marketing.steve`.
         - Users with accounts containing duplicate emails or usernames will receive a notification email explaining the upgrade, and instructions on how to move to a single user account ([see example](https://mattermost.org/upgrading-to-mattermost-3-0/#notification))
7. Start your server and address any setting changes relevant in the latest version of Mattermost
      1. Run `sudo start mattermost`.
      2. Open the System Console and save a change to upgrade your `config.json` schema to the latest version using default values for any new settings added.
8. If you have TLS set up on your Mattermost server, run `sudo setcap cap_net_bind_service=+ep ./bin/platform` in your Mattermost directory to allow Mattermost to bind to low ports
9. Test the system is working by going to the URL of the server with an `https://` prefix
      1. You may need to refresh your Mattermost browser page in order to get the latest updates from the upgrade.
10. After the Mattermost 3.0 upgrade, users with duplicate accounts must follow the instructions in the upgrade email to:
      1. Log in to teams on which duplicate accounts were created.
      2. Add their primary account to the team and any private channels that are still actively used.

   Users can continue to access the direct message history of their duplicate accounts using their updated email addresses.

For any issues, Mattermost Enterprise Edition subscribers and trial license users can email support@mattermost.com.

## Upgrade Enterprise Edition to 2.2.0 and earlier

1. Download the **appropriate next upgrade** of your Enterprise Edition server and note any compatibility procedures.
      1. Run `platform -version` to check the current version of your Mattermost server.
      2. Determine the appropriate next upgrade for your server:
          - Mattermost `v2.0.x` and `v2.1.x` can upgrade directly to Mattermost `v2.2.0`.
          - Mattermost `v1.4.x` and `v2.0.x` can upgrade directly to Mattermost `v2.1.0`.
          - Mattermost `v1.2.x` must upgrade to Mattermost `v1.3.x` before further upgrades.
          - Mattermost `v1.1.x` must upgrade to Mattermost `v1.2.x` before further upgrades.
          - Mattermost `v1.0.x` must upgrade to Mattermost `v1.1.x` before further upgrades.
      3. Use the [Version Archive List](https://docs.mattermost.com/administration/upgrade.html#version-archive) to find the `[RELEASE URL]` for your desired version and enter `wget {RELEASE URL}` to download. For example, to download `vX.X.X`, use `wget https://releases.mattermost.com/X.X.X/mattermost-X.X.X-linux-amd64.tar.gz`.
      4. Review the **Compatibility** section in [CHANGELOG](https://docs.mattermost.com/administration/changelog.html) for the version downloaded and make sure to follow any instructions.
2. Stop the Mattermost server
      1. Consider posting an announcement to active teams about stopping the Mattermost server for an upgrade.
      2. To stop the server run `sudo stop mattermost`.
3. Back up your data
      1. Back up your `config.json` file, which contains your system configuration. This will be used to restore your current settings after the new version is installed.
      2. Back up your database using your organization's standard procedures for backing up MySQL or PostgreSQL.
      3. If you're using local file storage, back up the location where files are stored.
5. Install the new version
      1. Run `tar -xvzf mattermost-X.X.X-linux-amd64.tar.gz` to decompress the upgraded version and replace the current version of Mattermost on disk, where `X.X.X` is the version number to which you are upgrading.  
6. Restore the state of your server
      1. Copy the backed up version of `config.json` in place of the default `config.json`.
7. Start your server and address any setting changes relevant in the latest version of Mattermost
      1. Run `sudo start mattermost`.
      2. Open the System Console and save a change to upgrade your `config.json` schema to the latest version using default values for any new settings added.
8. If you have TLS set up on your Mattermost server, run `sudo setcap cap_net_bind_service=+ep ./bin/platform` in your Mattermost directory to allow Mattermost to bind to low ports
9. Test the system is working by going to the URL of the server with an `https://` prefix
      1. You may need to refresh your Mattermost browser page in order to get the latest updates from the upgrade.

For any issues, Mattermost Enterprise Edition subscribers and trial license users can email support@mattermost.com.

source/archive/label_before.png METASEP

source/archive/label_after.png METASEP

source/archive/keyboard-shortcuts.rst METASEP
:nosearch:

Keyboard Shortcuts
==================

|all-plans| |cloud| |self-hosted|

.. |all-plans| image:: ../images/all-plans-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in Mattermost Free and Starter subscription plans.

.. |cloud| image:: ../images/cloud-badge.png
  :scale: 30
  :target: https://mattermost.com/download
  :alt: Available for Mattermost Cloud deployments.

.. |self-hosted| image:: ../images/self-hosted-badge.png
  :scale: 30
  :target: https://mattermost.com/deploy
  :alt: Available for Mattermost Self-Hosted deployments.

Keyboard shortcuts perform operations in Mattermost to help you navigate through channels and make a more efficient use of your keyboard. See the `Executing Slash Commands <https://docs.mattermost.com/messaging/executing-slash-commands.html>`__ documentation for alternate ways to help carry out actions with a keyboard instead of a mouse.

To display a list of available keyboard shortcuts, press CTRL+/ (CMD+/ on Mac), or use the ``/shortcuts`` slash command.

.. note::

   Though Mattermost keyboard shortcuts support standard languages and keyboard layouts, they may not work if you use keymapping that overwrites default browser shortcuts.


General Mattermost navigation 
-----------------------------

The following keyboard shortcuts are supported in all supported browsers and in the Mattermost Desktop App.

.. note::
  See our `Keyboard Accessibility <https://docs.mattermost.com/messaging/keyboard-accessibility.html>`__ documentation for additional navigation keyboard shortcuts for screen reader users.

+----------------------------+---------------------------+----------------------------------------------------------------------------------+
| On Windows                 | On Mac                    | Description                                                                      |
+============================+===========================+==================================================================================+
| ALT+UP                     | OPTION+UP                 | Previous channel or direct message in the channel sidebar.                       |
+----------------------------+---------------------------+----------------------------------------------------------------------------------+
| ALT+DOWN                   | OPTION+DOWN               | Next channel or direct message in the channel sidebar.                           |
+----------------------------+---------------------------+----------------------------------------------------------------------------------+
| ALT+SHIFT+UP               | OPTION+SHIFT+UP           | Previous channel or direct message in the channel sidebar with unread messages.  |
+----------------------------+---------------------------+----------------------------------------------------------------------------------+
| ALT+SHIFT+DOWN             | OPTION+SHIFT+DOWN         | Next channel or direct message in the channel sidebar with unread messages.      |
+----------------------------+---------------------------+----------------------------------------------------------------------------------+
| CTRL+ALT+UP                | CMD+OPTION+UP             | Navigate to the previous team.                                                   |
+----------------------------+---------------------------+----------------------------------------------------------------------------------+
| CTRL+ALT+DOWN              | CMD+OPTION+DOWN           | Navigate to the next team.                                                       |
+----------------------------+---------------------------+----------------------------------------------------------------------------------+
| CTRL+ALT+[1-9]             | CMD+OPTION+[1-9]          | Navigate to a specific team.                                                     |
+----------------------------+---------------------------+----------------------------------------------------------------------------------+
| CTRL+K                     | CMD+K                     | Open a quick channel selector dialog.                                            |
+----------------------------+---------------------------+----------------------------------------------------------------------------------+
| CTRL+SHIFT+K               | CMD+SHIFT+K               | Open the Direct Messages dialog.                                                 |
+----------------------------+---------------------------+----------------------------------------------------------------------------------+
| CTRL+SHIFT+A               | CMD+SHIFT+A               | Open the Settings dialog.                                                        |
+----------------------------+---------------------------+----------------------------------------------------------------------------------+
| CTRL+SHIFT+M               | CMD+SHIFT+M               | Open recent mentions.                                                            |
+----------------------------+---------------------------+----------------------------------------------------------------------------------+
| CTRL+SHIFT+L               | CMD+SHIFT+L               | Set focus to center channel input field.                                         |
+----------------------------+---------------------------+----------------------------------------------------------------------------------+
| CTRL+.                     | CMD+.                     | Open and close the right-hand sidebar.                                           |
+----------------------------+---------------------------+----------------------------------------------------------------------------------+
| CTRL+SHIFT+.               | CMD+SHIFT+.               | Expand or shrink the width of the open right-hand sidebar.                       |
+----------------------------+---------------------------+----------------------------------------------------------------------------------+
| CTRL+SHIFT+F               | CMD+SHIFT+F               | Move focus to the Search field and search the current channel.                   |
+----------------------------+---------------------------+----------------------------------------------------------------------------------+


Files
-----

The following keyboard shortcuts are supported in all supported browsers and in the Mattermost Desktop App.

+------------+--------+-----------------+
| On Windows | On Mac | Description     |
+============+========+=================+
| CTRL+U     | CMD+U  | Upload a file.  |
+------------+--------+-----------------+

Messages
--------

The following keyboard shortcuts are supported in all supported browsers and in the Mattermost Desktop App.

+----------------------------------+---------------------------------+-----------------------------------------------------------+
| On Windows                       | On Mac                          | Description                                               |
+==================================+=================================+===========================================================+
| CTRL+UP (in empty input field)   | CMD+UP (in empty input field)   | Reprint previous message or slash command you entered.    |
+----------------------------------+---------------------------------+-----------------------------------------------------------+
| CTRL+DOWN (in empty input field) | CMD+DOWN (in empty input field) | Reprint next message or slash command you entered.        |
+----------------------------------+---------------------------------+-----------------------------------------------------------+
| SHIFT+UP (in empty input field)  | SHIFT+UP (in empty input field) | Reply to the most recent message in the current channel.  |
+----------------------------------+---------------------------------+-----------------------------------------------------------+
| UP (in empty input field)        | UP (in empty input field)       | Edit your last message in the current channel.            |
+----------------------------------+---------------------------------+-----------------------------------------------------------+
| @[character]+TAB                 | @[character]+TAB                | Autocomplete @username beginning with [character].        |
+----------------------------------+---------------------------------+-----------------------------------------------------------+
| ~[character]+TAB                 | ~[character]+TAB                | Autocomplete channel beginning with [character].          |
+----------------------------------+---------------------------------+-----------------------------------------------------------+
| :[character]+TAB                 | :[character]+TAB                | Autocomplete emoji beginning with [character].            |
+----------------------------------+---------------------------------+-----------------------------------------------------------+
| CTRL+SHIFT+\\                    | CMD+SHIFT+\\                    | React to last message in channel or thread.               |
+----------------------------------+---------------------------------+-----------------------------------------------------------+

Formatting
----------

The following keyboard shortcuts are supported in all supported browsers and in the Mattermost Desktop App.

+------------+-----------+-------------------------+
| On Windows | On Mac    | Description             |
+============+===========+=========================+
| CTRL+B     | CMD+B     | Bold text.              |
+------------+-----------+-------------------------+
| CTRL+I     | CMD+I     | Italicize text.         |
+------------+-----------+-------------------------+
| CTRL+ALT+K | CMD+ALT+K | Format text as a link.  |
+------------+-----------+-------------------------+

Accessibility nagivation
------------------------

The following keyboard shortcuts work in all supported browsers and in the Mattermost Desktop App.

+------------------------------+------------------------------+----------------------------------------+
| On Windows                   | On Mac                       | Description                            |
+==============================+==============================+========================================+
| ALT+LEFT                     | CMD+[                        | Previous channel in your history.      |
+------------------------------+------------------------------+----------------------------------------+
| ALT+RIGHT                    | CMD+]                        | Next channel in your history.          |
+------------------------------+------------------------------+----------------------------------------+
| SHIFT+UP (in input field)    | SHIFT+UP (in input field)    | Highlight text to the previous line.   |
+------------------------------+------------------------------+----------------------------------------+
| SHIFT+DOWN (in input field)  | SHIFT+DOWN (in input field)  | Highlight text to the next line.       |
+------------------------------+------------------------------+----------------------------------------+
| SHIFT+ENTER (in input field) | SHIFT+ENTER (in input field) | Create a new line.                     |
+------------------------------+------------------------------+----------------------------------------+

source/archive/keyboard-accessibility.rst METASEP
:nosearch:

Keyboard Accessibility
======================

|all-plans| |cloud| |self-hosted|

.. |all-plans| image:: ../images/all-plans-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in Mattermost Free and Starter subscription plans.

.. |cloud| image:: ../images/cloud-badge.png
  :scale: 30
  :target: https://mattermost.com/download
  :alt: Available for Mattermost Cloud deployments.

.. |self-hosted| image:: ../images/self-hosted-badge.png
  :scale: 30
  :target: https://mattermost.com/deploy
  :alt: Available for Mattermost Self-Hosted deployments.

Navigational keyboard shortcuts help you use Mattermost without requiring a mouse. Below is a list of supported shortcuts. Elements in focus have a colored outline, as shown here:

.. image:: ../images/focus.png
  :alt: Navigate Mattermost using a keyboard.

+----------------------------------------+----------------------------------------------------------------------------------+
| Shortcut                               | Description                                                                      |
+========================================+==================================================================================+
| F6 (CTRL+F6 on Browser)                | Move focus to the next section                                                   |
+----------------------------------------+----------------------------------------------------------------------------------+
| SHIFT+F6 (SHIFT+CTRL+F6 on Browser)    | Move focus to the previous section                                               |
+----------------------------------------+----------------------------------------------------------------------------------+
| TAB                                    | Move focus to the next element                                                   |
+----------------------------------------+----------------------------------------------------------------------------------+
| SHIFT+TAB                              | Move focus to the previous element                                               |
+----------------------------------------+----------------------------------------------------------------------------------+
| Up or DOWN                             | Move focus between messages in the post list or sections in the channel sidebar  |
+----------------------------------------+----------------------------------------------------------------------------------+
| ENTER                                  | Take action on the focused element                                               |
+----------------------------------------+----------------------------------------------------------------------------------+

Region Navigation
--------------------

Mattermost has eight regions that can be focused for navigation. Use **F6** (Desktop App) or **CTRL+F6** (Browser) repeatedly to move focus and loop through the regions in this order:

1. Message list region
2. Message input region
3. Right-hand side message list region
4. Right-hand side message input region
5. Team menu region
6. Channel sidebar region
7. Channel header region
8. Search

.. image:: ../images/navigation.gif
  :alt: Navigate through the sections of Mattermost using a keyboard.

Message Navigation
------------------

When the message list region is focused, use the **UP** or **DOWN** arrow keys to navigate through messages and reply threads. Press **TAB** to navigate through message actions.

.. image:: ../images/message-navigation.gif
  :alt: Navigate through Mattermost messages using a keyboard.

Message Composition
~~~~~~~~~~~~~~~~~~~

Mattermost is compatible with most popular screen readers, such as `Apple VoiceOver <https://www.apple.com/ca/accessibility/vision/>`__ or `JAWS for Windows <https://www.freedomscientific.com/products/software/jaws/>`__. A custom readout is composed for each message by combining the message elements and reading them together in full sentences. Message elements will read in the following order:

1. Header: Author, timestamp, message type (i.e. parent post or reply)
2. Main Content: The message content typed by the author
3. Attachments: The number of attachments (if applicable)
4. Emoji Reactions: The number of unique emoji reactions (if applicable)
5. Saves/Pins: If a message is saved or pinned (if applicable)

For example, a message read by a screen reader may sound like the following:

  .. code-block:: none
  
    Eric Sethna at 12:57pm Thursday June 13th wrote a reply "Thanks for the review", 3 attachments, 2 reactions, message is saved and pinned.

Channel Sidebar Navigation
--------------------------

When the channel sidebar region is focused, use the **UP** or **DOWN** arrow keys to focus individual sidebar sections, such as Favorites, Public Channels, Private Channels and Direct Messages. Press **TAB** to navigate through channels or other buttons within a sidebar section.

.. image:: ../images/channel-sidebar-navigation.gif
  :alt: Navigate the Mattermost channel sidebar using a keyboard.

source/archive/jira.rst METASEP
:nosearch:

Jira plugin 
===========

The Jira/Mattermost plugin documentation is currently being updated and relocated to a `new location <https://mattermost.gitbook.io/jira-plugin/>`_.

Learn more about how to integrate with your other `Atlassian tools <https://docs.mattermost.com/deployment/atlassian-integrations.html>`_.

source/archive/interactive-messages.rst METASEP
:nosearch:

.. _interactive-messages:

Interactive Messages: Buttons and Menus
========================================

Mattermost supports interactive message buttons and menus for :doc:`incoming <webhooks-incoming>` and :doc:`outgoing webhooks <webhooks-outgoing>`, :doc:`custom slash commands <slash-commands>`, and :doc:`plugins <../administration/plugins>` via actions. They help make your integrations richer by completing common tasks inside Mattermost conversations, increasing user engagement and productivity.

.. image:: ../../source/images/interactive-messages.png

For information on interactive dialogs, :doc:`see here <interactive-dialogs>`.

Use interactive messages to simplify complex workflows by allowing users to take quick actions directly through your integration post. For example, they enable your integration to:

- Mark a task complete in your project management tracker
- Conduct a customer survey or a poll
- Initiate a command to merge a branch into a release

To try it out, you can use this `Matterpoll plugin <https://github.com/matterpoll/matterpoll>`__ to add polling to Mattermost channels via a ``/poll`` slash command.

.. image:: ../../source/images/poll.png

.. contents::
  :backlinks: top
  :depth: 1
  :local:

Message Buttons
----------------

Add message buttons as ``actions`` in your integration `message attachments <https://docs.mattermost.com/developer/message-attachments.html>`__.

The following payload gives an example that uses message buttons.

.. code-block:: text

  {
    "attachments": [
      {
        "pretext": "This is the attachment pretext.",
        "text": "This is the attachment text.",
        "actions": [
          {
            "id": "message",
            "name": "Ephemeral Message",
            "integration": {
              "url": "http://127.0.0.1:7357",
              "context": {
                "action": "do_something_ephemeral"
              }
            }
          }, {
            "id": "update",
            "name": "Update",
            "integration": {
              "url": "http://127.0.0.1:7357",
              "context": {
                "action": "do_something_update"
              }
            }
          }
        ]
      }
    ]
  }

The integration can respond with an update to the original post, or with an ephemeral message:

.. code-block:: text

  {
    "update": {
      "message": "Updated!",
      "props": {}
    },
    "ephemeral_text": "You updated the post!"
  }

.. image:: ../../source/images/interactive_message.gif

Message Menus
----------------

Similar to buttons, add message menus as ``actions`` in your integration `message attachments <https://docs.mattermost.com/developer/message-attachments.html>`__.

.. image:: ../../source/images/message-menus.png

The following payload gives an example that uses message menus.

.. code-block:: text

  {
    "attachments": [
      {
        "pretext": "This is the attachment pretext.",
        "text": "This is the attachment text.",
        "actions": [
          {
            "id": "action_options",
            "name": "Select an option...",
            "integration": {
              "url": "http://127.0.0.1:7357/action_options",
              "context": {
                "action": "do_something"
              }
            },
            "type": "select",
            "options": [
                    {
                        "text": "Option1",
                        "value": "opt1"
                    },
                    {
                        "text": "Option2",
                        "value": "opt2"
                    },
                    {
                        "text": "Option3",
                        "value": "opt3"
                    }
            ]
          }
        ]
      }
    ]
  }

The integration can respond with an update to the original post, or with an ephemeral message:

.. code-block:: text

  {
    "update": {
      "message": "Updated!",
      "props": {}
    },
    "ephemeral_text": "You updated the post!"
  }

Message Menus for Channels
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

You can provide a list of channels for message menus for users to select from. Users can only select from public channels in their teams.

Specify ``channels`` as your action's ``data_source`` as follows:

.. code-block:: text

  {
    "attachments": [
      {
        "pretext": "This is the attachment pretext.",
        "text": "This is the attachment text.",
        "actions": [
          {
            "id": "action_options",
            "name": "Select an option...",
            "integration": {
              "url": "http://127.0.0.1:7357/action_options",
              "context": {
                "action": "do_something"
              }
            },
            "type": "select",
            "data_source": "channels"
          }
        ]
      }
    ]
  }

Message Menus for Users
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Similar to channels, you can also provide a list of users for message menus. The user can choose the user who is part of the Mattermost system.

Specify ``users`` as your action's ``data_source`` as follows:

.. code-block:: text

  {
    "attachments": [
      {
        "id": "action_options",
        "pretext": "This is the attachment pretext.",
        "text": "This is the attachment text.",
        "actions": [
          {
            "name": "Select an option...",
            "integration": {
              "url": "http://127.0.0.1:7357/action_options",
              "context": {
                "action": "do_something"
              }
            },
            "type": "select",
            "data_source": "users"
          }
        ]
      }
    ]
  }

Parameters
^^^^^^^^^^^^^

Below is a brief description of each parameter to help you customize the interactive message button and menu in Mattermost. For more information on message attachments, `see our documentation <https://docs.mattermost.com/developer/message-attachments.html>`__.

ID
  A per post unique identifier.

Name
  Give your action a descriptive name.

URL
  The actions are backed by an integration that handles HTTP POST requests when users click the message button. The URL parameter determines where this action is sent. The request contains an ``application/json`` JSON string. As of 5.14, relative URLs are accepted, simplifying the workflow when a plugin handles the action.

Context
  The requests sent to the specified URL contain the user ID, post ID, channel ID, team ID, and any context that was provided in the action definition. If the post was of type ``Message Menus``, then context also contains the ``selected_option`` field with the user-selected option value. The post ID can be used to, for example, delete or edit the post after clicking on a message button.
  
  A simple example of a request is given below:
  
  .. code-block:: text

    {
    "user_id": "rd49ehbqyjytddasoownkuqrxe",
    "post_id": "gqrnh3675jfxzftnjyjfe4udeh",
    "channel_id": "j6j53p28k6urx15fpcgsr20psq",
    "team_id": "5xxzt146eax4tul69409opqjlf",
    "context": {
      "action": "do_something"
      }
    }

  In most cases, your integration will do one or both of these things:
  
  1. **Identifying which action was triggered**. For example, a GitHub integration might store something like this in the context:

    .. code-block:: text

      {
      "user_id": "rd49ehbqyjytddasoownkuqrxe",
      "post_id": "gqrnh3675jfxzftnjyjfe4udeh",
      "channel_id": "j6j53p28k6urx15fpcgsr20psq",
      "team_id": "5xxzt146eax4tul69409opqjlf",
      "context": {
        "repo": "mattermost/mattermost-server"
        "pr": 1234,
        "action": "merge"
        }
      }
      
  In the example above, when the message button is clicked, your integration sends a request to the specified URL with the intention to merge the pull request identified by the context.

  2. **Authenticating the server**. An important property of the context parameter is that it's kept confidential. If your integration is not behind a firewall, you could add a token to your context without users ever being able to see it:

    .. code-block:: text

      {
      "user_id": "rd49ehbqyjytddasoownkuqrxe",
      "post_id": "gqrnh3675jfxzftnjyjfe4udeh",
      "channel_id": "j6j53p28k6urx15fpcgsr20psq",
      "team_id": "5xxzt146eax4tul69409opqjlf",
      "context": {
        "repo": "mattermost/mattermost-server"
        "pr": 1234,
        "action": "merge",
        "token": "somerandomlygeneratedsecret"
        }
      }
   
  Then, when your integration receives the request, it can verify that the token matches one that you previously generated and know that the request is legitimately coming from the Mattermost server and is not forged.

  Depending on the application, integrations can also perform authentication statelessly with cryptographic signatures such as:

    .. code-block:: text

      {
      "user_id": "rd49ehbqyjytddasoownkuqrxe",
      "post_id": "gqrnh3675jfxzftnjyjfe4udeh",
      "channel_id": "j6j53p28k6urx15fpcgsr20psq",
      "team_id": "5xxzt146eax4tul69409opqjlf",
      "context": {
        "repo": "mattermost/mattermost-server"
        "pr": 1234,
        "action": "merge",
        "signature": "mycryptographicsignature"
        }
      }

  It's also possible for integrations to do both of these things with a single token and use something like this as context:

    .. code-block:: text

      {
      "user_id": "rd49ehbqyjytddasoownkuqrxe",
      "post_id": "gqrnh3675jfxzftnjyjfe4udeh",
      "channel_id": "j6j53p28k6urx15fpcgsr20psq",
      "team_id": "5xxzt146eax4tul69409opqjlf",
      "context": {
        "action_id": "someunguessableactionid"
        }
      }

  Then, when the integration receives the request, it can act based on the action ID, which should match the `[a-zA-Z0-9]+` regular expression.

Tips and Best Practices
------------------------

1. The external application may be written in any programming language. It needs to provide a URL which receives the request sent by your Mattermost server and responds within the required JSON format.
2. To get started, you can use this `sample plugin <https://github.com/matterpoll/matterpoll>`__ to add polling to Mattermost channels via a `/poll` slash command.

Share Your Integration
-----------------------

If you've built an integration for Mattermost, please consider `sharing your work <https://mattermost.org/share-your-mattermost-projects/>`__ in our `app directory <https://integrations.mattermost.com/>`__.

The `app directory <https://integrations.mattermost.com/>`__ lists open source integrations developed by the Mattermost community and are available for download, customization, and deployment to your private cloud or self-managed infrastructure.

Slack Compatibility
--------------------

Like Slack, actions are specified in an **Actions** list within the message attachment. Moreover, your integrations can react with ephemeral messages or message updates similar to Slack.

However, the schema for these objects is slightly different given Slack requires a Slack App and action URL to be pre-configured beforehand. Mattermost instead allows an integration to create an interactive message without pre-configuration.

If your `ephemeral_text` gets incorrectly handled by the Slack-compatibility logic, send ``"skip_slack_parsing":true`` along your `ephemeral_text` to bypass it.

.. code-block:: text

  {
    "update": {
      "message": "Updated!"
    },
    "ephemeral_text": "You updated the post!",
    "skip_slack_parsing": true
  }


Frequently Asked Questions
----------------------------------

Are message buttons and menus supported in ephemeral messages?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Yes, message buttons and menus are supported in ephemeral messages in Mattermost 5.10 and later. This applies to integrations using plugins, the RESTful API and webhooks, across the browser and desktop app.

As an advanced feature, you can also use plugins to update the contents of an ephemeral message with message buttons or menus with the `UpdateEphemeralMessage plugin API <https://developers.mattermost.com/extend/plugins/server/reference/#API.UpdateEphemeralPost>`_.

Why does an interactive button or menu return a 400 error?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

It is likely for one of three reasons:

1. Mattermost wasn't able to connect to the integration. If the integration is on your internal infrastructure, it'll need to be whitelisted (see `"AllowedUntrustedInternalConnections" config.json setting <https://docs.mattermost.com/administration/config-settings.html#allow-untrusted-internal-connections-to>`__). The log will include the text ``err=address forbidden`` in the error message.

2. The integration didn't return HTTP status 200. The log will include the text ``status=XXX`` in the error message.

3. The integration didn't return a valid JSON response. The log will include the text ``err=some json error message`` in the error message.

How do I manage properties of an interactive message?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Use ``update.Props`` in the following ways to manage properties (``Props``) of an interactive message after a user performs an action via an interactive button or menu:

 - ``update.Props == nil`` - Do not update ``Props`` field.
 - ``update.Props == {}`` - Clear all properties, except the username and icon of the original message, as well as whether the message was pinned to channel or contained emoji reactions.
 - ``update.Props == some_props`` - Post will be updated to ``some_props``. Username and icon of the original message, and whether the message was pinned to channel or contained emoji reactions will not be updated.
 
Note that in 5.10 and earlier, ``Update.Props == nil`` incorrectly cleared all properties of the interactive message.

source/archive/interactive-message-buttons.rst METASEP
:nosearch:

Interactive Message Buttons
============================

See our updated documentation for :doc:`interactive-messages`.

source/archive/interactive-dialogs.rst METASEP
:nosearch:

.. _interactive-dialogs:

Interactive Dialogs
===================

Interactive dialogs are used by applications that integrate with the Mattermost server. They are a method for integrations to receive some form-styled input from users and have that input submitted back to the integration. Use them to gather structured information from the end user to perform an action or a request.

Integrations open dialogs by sending an ``HTTP POST``, containing some data in the request body, to an endpoint on the Mattermost server. Integrations can use this endpoint to open dialogs when users :doc:`click message buttons or select an option from a menu <interactive-messages>`, or use a :doc:`custom slash command <slash-commands>`.

Moreover, :doc:`plugins <../administration/plugins>` can trigger a dialog based on user actions. For instance, if a plugin adds a button in the channel header, clicking that button may open a dialog.

Here is an example of what a dialog looks like for creating a Jira issue within the Mattermost user interface:

.. image:: ../../source/images/interactive-dialog-example.png

.. contents::
  :backlinks: top
  :depth: 1
  :local:

Opening a Dialog
----------------

To open a dialog, your integration must first receive an HTTP request from the Mattermost server. This request will be triggered by a slash command or an interactive message. It will include a trigger ID.

Once you have the trigger ID you can use it to open the interactive dialog by sending an ``HTTP POST`` request to ``https://<your-mattermost-url>/api/v4/actions/dialogs/open``. See the below section for what to include in the body of that HTTP request.

Parameters
----------

Interactive dialogs support the following parameters:

.. csv-table::
    :header: "Parameter", "Type", "Description"

    "``title``", "String", "Title of the dialog. Maximum 24 characters."
    "``introduction_text``", "string", "Markdown-formatted introduction text which is displayed above the dialog ``elements``."
    "``elements``", "Array", "Up to 5 elements allowed per dialog. See below for more details on elements. If none are supplied the dialog box acts as a simple confirmation."
    "``url``", "String", "The URL to send the submitted dialog payload to."
    "``icon_url``", "String", "(Optional) The URL of the icon used for your dialog. If none specified, no icon is displayed."
    "``submit_label``", "String", "(Optional) Label of the button to complete the dialog. Default is ``Submit``."
    "``notify_on_cancel``", "Boolean", "(Optional) When ``true``, sends an event back to the integration whenever there's a user-induced dialog cancellation. No other data is sent back with the event. Default is ``false``."
    "``state``", "String", "(Optional) String provided by the integration that will be echoed back with dialog submission. Default is the empty string."

Sample JSON is given below. Form submissions are sent back to the URL defined by the integration. You must also include the trigger ID you received from the slash command or interactive message.

.. code-block:: json

  {
      "trigger_id": "<unique ID generated by the server>",
      "url": "<URL to send the submitted request to>",
      "dialog": {
          "callback_id": "<ID specified by the integration to identify the request>",
          "title": "<title of the dialog>",
          "introduction_text": "<Text describing the dialog box content>",
          "elements": ["<Array of UI elements to display in the dialog>"],
          "submit_label": "<label of the button to complete the dialog>",
          "notify_on_cancel": false,
          "state": "<string provided by the integration that will be echoed back with dialog submission>",
      }
  }

Elements
--------

Each dialog supports elements for users to enter information.

- ``text``: Single-line plain text field. Use this for inputs such as names, email addresses, or phone numbers.
- ``textarea``: Multi-line plain text field. Use this field when the answer is expected to be longer than 150 characters.
- ``select``: Message menu. Use this for pre-selected choices. Can either be static menus or dynamic menus generated from users and Public channels of the system. For more information on message menus, see :doc:`the documentation <interactive-messages>`.
- ``bool``: Checkbox option. Use this for binary selection.
- ``radio``: Radio button option. Use this to quickly select an option from pre-selected choices.

Each element is required by default, otherwise the client will return an error as shown below. Note that the error message will appear below the help text, if one is specified. To make an element optional, set the field ``"optional": "true"``.

.. image:: ../../source/images/interactive-dialog-error.png

Text elements
^^^^^^^^^^^^^

Text elements are single-line plain text fields. Below is an example of a ``text`` element that asks for an email address.

.. image:: ../../source/images/interactive-dialog-text.png

.. code-block:: json

  {
    "display_name": "Email",
    "name": "email",
    "type": "text",
    "subtype": "email",
    "placeholder": "placeholder@example.com"
  }

There is an optional ``"subtype": "email"`` field in the above example, which specifies the keyboard layout used on mobile. For this example, the email keypad is shown to the user given the subtype is set to ``email``.

The full list of supported fields is included below:

.. csv-table::
    :header: "Field", "Type", "Description"

    "``display_name``", "String", "Display name of the field shown to the user in the dialog. Maximum 24 characters."
    "``name``", "String", "Name of the field element used by the integration. Maximum 300 characters. You should use unique ``name`` fields in the same dialog."
    "``type``", "String", "Set this value to ``text`` for a text element."
    "``subtype``", "String", "(Optional) One of ``text``, ``email``, ``number``, ``password`` (as of v5.14), ``tel``, or ``url``. Default is ``text``. Use this to set which keypad is presented to users on mobile when entering the field."
    "``min_length``", "Integer", "(Optional) Minimum input length allowed for an element. Default is 0."
    "``max_length``", "Integer", "(Optional) Maximum input length allowed for an element. Default is 150. If you expect the input to be greater 150 characters, consider using a ``textarea`` type element instead."
    "``optional``", "Boolean", "(Optional) Set to ``true`` if this form element is not required. Default is ``false``."
    "``help_text``", "String", "(Optional) Set help text for this form element. Maximum 150 characters."
    "``default``", "String", "(Optional) Set a default value for this form element. Maximum 150 characters."
    "``placeholder``", "String", "(Optional) A string displayed to help guide users in completing the element. Maximum 150 characters."
    
Textarea elements
^^^^^^^^^^^^^^^^^

Textarea elements are multi-line plain text fields. A sample JSON is provided below:

.. code-block:: json

  {
    "display_name": "Ticket Description",
    "name": "ticket_description",
    "type": "textarea",
    "help_text": "Provide description for your ticket."
  }

The maximum length for a ``textarea`` is 3,000 characters.

The list of supported fields is the same as for the ``textarea`` type element.

.. csv-table::
    :header: "Field", "Type", "Description"

    "``display_name``", "String", "Display name of the field shown to the user in the dialog. Maximum 24 characters."
    "``name``", "String", "Name of the field element used by the integration. Maximum 300 characters. You should use unique ``name`` fields in the same dialog."
    "``type``", "String", "Set this value to ``textarea`` for a textarea element."
    "``subtype``", "String", "(Optional) One of ``text``, ``email``, ``number``, ``tel``, or ``url``. Default is ``text``. Use this to set which keypad is presented to users on mobile when entering the field."
    "``min_length``", "Integer", "(Optional) Minimum input length allowed for an element. Default is 0."
    "``max_length``", "Integer", "(Optional) Maximum input length allowed for an element. Default is 3,000."
    "``optional``", "Boolean", "(Optional) Set to ``true`` if this form element is not required. Default is ``false``."
    "``help_text``", "String", "(Optional) Set help text for this form element. Maximum 150 characters."
    "``default``", "String", "(Optional) Set a default value for this form element. Maximum 3,000 characters."
    "``placeholder``", "String", "(Optional) A string displayed to help guide users in completing the element. Maximum 3,000 characters."

Select elements
^^^^^^^^^^^^^^^^^^^^^^^

Select elements are message menus that allow users to select one predefined option from a list. Below is an example of a ``select`` element that asks for one of three different options.

.. image:: ../../source/images/interactive-dialog-select.png

.. image:: ../../source/images/interactive-dialog-select-menu.png

.. code-block:: json

  {
    "display_name": "Option Selector",
    "name": "options",
    "type": "select",
    "options": [
       {
         "text": "Option1",
         "value": "opt1"
       },
       {
         "text": "Option2",
         "value": "opt2"
       },
       {
         "text": "Option3",
         "value": "opt3"
       }
     ]
  }

Note that the JSON payload for ``select`` type elements matches :doc:`interactive message menus <interactive-messages>`.

The ``select`` element can also be generated dynamically from users and channels of the system.

For users, use:

.. code-block:: json

  {
    "display_name": "Assignee",
    "name": "assignee",
    "type": "select",
    "data_source": "users"
  }

and for Public channels, use:

.. code-block:: json

  {
    "display_name": "Post this message to",
    "name": "channel",
    "type": "select",
    "data_source": "channels"
  }

The list of supported fields for the ``select`` type element is included below:

.. csv-table::
    :header: "Field", "Type", "Description"

    "``display_name``", "String", "Display name of the field shown to the user in the dialog. Maximum 24 characters."
    "``name``", "String", "Name of the field element used by the integration. Maximum 300 characters. You should use unique ``name`` fields in the same dialog."
    "``type``", "String", "Set this value to ``select`` for a ``select`` element."
    "``data_source``", "String", "(Optional) One of ``users``, or ``channels``. If none specified, assumes a manual list of options is provided by the integration."
    "``options``", "Array", "(Optional) An array of options for the select element. Not applicable for ``users`` or ``channels`` data sources."
    "``optional``", "Boolean", "(Optional) Set to ``true`` if this form element is not required. Default is ``false``."
    "``help_text``", "String", "(Optional) Set help text for this form element. Maximum 150 characters."
    "``default``", "String", "(Optional) Set a default value for this form element. Maximum 3,000 characters."
    "``placeholder``", "String", "(Optional) A string displayed to help guide users in completing the element. Maximum 3,000 characters."

Checkbox element
^^^^^^^^^^^^^^^^

From Mattermost v5.16 you can use ``checkbox`` elements. It looks like a plain text field with a checkbox to be selected. Below is an example of a ``checkbox`` element that asks for meeting feedback.

.. image:: ../../source/images/interactive-dialog-bool.png

.. code-block:: json

  {
    "display_name": "Can you please select below",
    "placeholder": "The meeting was helpful.",
    "name": "meeting_input",
    "type": "bool",
  }

The full list of supported fields is included below:

.. csv-table::
    :header: "Field", "Type", "Description"

    "``display_name``", "String", "Display name of the field shown to the user in the dialog. Maximum 24 characters."
    "``name``", "String", "Name of the field element used by the integration. Maximum 300 characters. You should use unique ``name`` fields in the same dialog."
    "``type``", "String", "Set this value to ``bool`` for a checkbox element."
    "``optional``", "Boolean", "(Optional) Set to ``true`` if this form element is not required. Default is ``false``."
    "``help_text``", "String", "(Optional) Set help text for this form element. Maximum 150 characters."
    "``default``", "String", "(Optional) Set a default value for this form element. ``true`` or ``false``."
    "``placeholder``", "String", "(Optional) A string displayed to include a label besides the checkbox. Maximum 150 characters."
    

Radio element
^^^^^^^^^^^^^

From Mattermost v5.16 you can use ``radio`` elements. It looks like a plain text field with a radio button to be selected. Below is an example of a ``radio`` element that asks for a department.

.. image:: ../../source/images/interactive-dialog-radio.png

.. code-block:: json

  {
    "display_name": "Which department do you work in?",
    "name": "department",
    "type": "radio",
    "options": [
      {
        "text": "Engineering",
        "value": "engineering"
      },
      {
        "text": "Sales",
        "value": "sales"
      },
      {
        "text": "Administration",
        "value": "administration"
      }
    ],
    "help_text": "Please indicate your department as of January 1.",
    "default": "engineering"
  }

The full list of supported fields are included below:

.. csv-table::
    :header: "Field", "Type", "Description"

    "``display_name``", "String", "Display name of the field shown to the user in the dialog. Maximum 24 characters."
    "``name``", "String", "Name of the field element used by the integration. Maximum 300 characters. You should use unique ``name`` fields in the same dialog."
    "``type``", "String", "Set this value to ``radio`` for a radio element."
    "``options``", "Array", "(Optional) An array of options for the radio element."
    "``help_text``", "String", "(Optional) Set help text for this form element. Maximum 150 characters."
    "``default``", "String", "(Optional) Set a default value for this form element."


Dialog submission
-----------------

When a user submits a dialog, Mattermost will perform client-side input validation to make sure:

  - All required fields are filled.
  - All formats are correct (e.g. email, telephone number, etc.).

The submission payload sent to the integration is:

.. code-block:: json

  {
      "type": "dialog_submission",
      "callback_id": "<callback ID provided by the integration>",
      "state": "<state provided by the integration>", 
      "user_id": "<user ID of the user who submitted the dialog>",
      "channel_id": "<channel ID the user was in when submitting the dialog>",
      "team_id": "<team ID the user was on when submitting the dialog>",
      "submission": {
          "some_element_name": "<value of that element>",
          "some_other_element": "<value of some other element>"
      },
      "cancelled": false
  }

Optionally, the dialog can send an event back to the integration if ``notify_on_cancel`` parameter is set to ``true``. If this happens, ``cancelled`` will be set to ``true`` on the above payload, and ``submission`` will be empty.

Moreover, Mattermost also allows the integration itself to perform input validation. This can be done by responding to the dialog submission request with a JSON body containing an ``errors`` field. The ``errors`` field can contain a JSON object, mapping input field names to string error messages you would like to display to the user. For example, if you have a field named ``num_between_0_and_10``, you can enforce the user to enter a number between 0 and 10 by returning the following response body if the condition isn't satisfied:

.. code-block:: json

  {"errors": {"num_between_0_and_10": "Enter a number between 0 and 10."}}

The integration may also return a generic error message to the user that is not attached to a specific field. This can be done by responding to the dialog submission request with a JSON body containing an ``error`` field. The ``error`` field should contain a string with the error message to display to the user. For example, if a server-side error occurs, you can return a message explaining it:

.. code-block:: json

  {"error": "Failed to fetch additional data. Please try again."}

Support for generic error messages was added in Mattermost v5.18.

Finally, once the request is submitted, we recommend that the integration responds with a system message or an ephemeral message confirming the submission. This should be a separate request back to Mattermost once the service has received and responded to a submission request from a dialog. This can be done either via `the REST API <https://api.mattermost.com/#tag/posts%2Fpaths%2F~1posts~1ephemeral%2Fpost>`_, or via the `Plugin API <https://developers.mattermost.com/extend/plugins/server/reference/#API.SendEphemeralPost>`_ if you're developing a plugin.

.. note::

  If the dialog is closed by clicking **Cancel** or **X**, no data will be submitted. If a user clicks away from the dialog, the dialog won’t close. This is to prevent accidentally losing any answers they've made to an unsubmitted dialog.

Example
-------

Below is a full example of a JSON payload that creates an interactive dialog in Mattermost:

.. code-block:: json

  {
     "trigger_id":"nbt1dxzqwpn6by14sfs66ganhc",
     "url":"http://localhost:5000/dialog_submit",
     "dialog":{
        "callback_id":"somecallbackid",
        "title":"Test Title",
        "icon_url":"https://mattermost.org/wp-content/uploads/2016/04/icon.png",
        "elements":[
           {
              "display_name":"Display Name",
              "name":"realname",
              "type":"text",
              "subtype":"",
              "default":"default text",
              "placeholder":"placeholder",
              "help_text":"This a regular input in an interactive dialog triggered by a test integration.",
              "optional":false,
              "min_length":0,
              "max_length":0,
              "data_source":"",
              "options":null
           },
           {
              "display_name":"Email",
              "name":"someemail",
              "type":"text",
              "subtype":"email",
              "default":"",
              "placeholder":"placeholder@bladekick.com",
              "help_text":"This a regular email input in an interactive dialog triggered by a test integration.",
              "optional":false,
              "min_length":0,
              "max_length":0,
              "data_source":"",
              "options":null
           },
           {
              "display_name":"Number",
              "name":"somenumber",
              "type":"text",
              "subtype":"number",
              "default":"",
              "placeholder":"",
              "help_text":"",
              "optional":false,
              "min_length":0,
              "max_length":0,
              "data_source":"",
              "options":null
           },
           {
              "display_name":"Display Name Long Text Area",
              "name":"realnametextarea",
              "type":"textarea",
              "subtype":"",
              "default":"",
              "placeholder":"placeholder",
              "help_text":"",
              "optional":true,
              "min_length":5,
              "max_length":100,
              "data_source":"",
              "options":null
           },
           {
              "display_name":"User Selector",
              "name":"someuserselector",
              "type":"select",
              "subtype":"",
              "default":"",
              "placeholder":"Select a user...",
              "help_text":"",
              "optional":false,
              "min_length":0,
              "max_length":0,
              "data_source":"users",
              "options":null
           },
           {
              "display_name":"Channel Selector",
              "name":"somechannelselector",
              "type":"select",
              "subtype":"",
              "default":"",
              "placeholder":"Select a channel...",
              "help_text":"Choose a channel from the list.",
              "optional":true,
              "min_length":0,
              "max_length":0,
              "data_source":"channels",
              "options":null
           },
           {
              "display_name":"Option Selector",
              "name":"someoptionselector",
              "type":"select",
              "subtype":"",
              "default":"",
              "placeholder":"Select an option...",
              "help_text":"",
              "optional":false,
              "min_length":0,
              "max_length":0,
              "data_source":"",
              "options":[
                 {
                    "text":"Option1",
                    "value":"opt1"
                 },
                 {
                    "text":"Option2",
                    "value":"opt2"
                 },
                 {
                    "text":"Option3",
                    "value":"opt3"
                 }
              ]
           }
        ],
        "submit_label":"Submit",
        "notify_on_cancel":true,
        "state":"somestate"
     }
  }

.. image:: ../../source/images/interactive-dialog-complete-example.png

Share your integration
-----------------------

If you've built an integration for Mattermost, please consider `sharing your work <https://mattermost.org/share-your-mattermost-projects/>`__ in our `app directory <https://integrations.mattermost.com/>`__.

The `app directory <https://integrations.mattermost.com/>`__ lists open source integrations developed by the Mattermost community and are available for download, customization and deployment to your private cloud or self-managed infrastructure.

Slack compatibility
--------------------

Like Slack, dialogs are triggered by an interactive message menu or button, or by a custom slash command. Additionally, Mattermost can trigger dialogs via plugins.

The schema for these objects is the same as Slack's, except for the following differences:

  - ``url`` field must be specified for Mattermost dialogs, which specifies where the request is sent to. In Slack, this is handled by specifying the URL within the Slack app that uses the dialog.
  - ``icon_url`` is an optional field to set the icon for Mattermost dialogs. In Slack, the dialogs use the icon set for the app that uses the dialog.
  - ``label`` in Slack dialogs is ``display_name`` in Mattermost dialogs for a more consistent naming convention with other integration types.
  - ``hint`` in Slack dialogs is ``help_text`` in Mattermost dialogs for a more consistent naming convention with other integration types.
  - ``value`` in Slack dialogs is ``default`` in Mattermost dialogs for a more consistent naming convention with other integration types.

Moreover, the JSON payload for ``select`` type elements matches :doc:`interactive message menus <interactive-messages>`.

source/archive/integrations-directory.rst METASEP
:nosearch:

How to Update Integrations Directory
====================================

This page has moved to the `Mattermost Handbook <https://handbook.mattermost.com/operations/research-and-development/product/how-to-guides-for-product/integrations-directory>`__.

source/archive/integration.rst METASEP
:nosearch:

:orphan:

Mattermost Integration Guide
============================

**Are you looking to install an integration?**

See one of the sample integrations below or visit the `Mattermost Integrations Directory <https://integrations.mattermost.com/>`__.

.. toctree::
   :maxdepth: 1
   :glob:
   
   /integrations/jira*
   /integrations/zoom*
   /integrations/zapier*

**Are you looking to develop an integration?**

See `our developer documentation <https://developers.mattermost.com/>`__. 

**Are you looking for an overview of what capabilities Mattermost offers for integrations?**

See our documentation below. 

.. toctree::
   :maxdepth: 1
   :glob:

   /developer/api.rst
   /developer/webhooks*
   /developer/slash*
   /administration/plugins*
   /developer/message-attachments*
   /developer/interactive-messages*
   /developer/interactive-dialogs*
   /developer/bot-accounts*
   /developer/personal-access-tokens*
   /developer/oauth*
   /developer/integration*
   /integrations/embedding*
   /integrations/webhook*

Come `join our "Contributors" community channel <https://community.mattermost.com/core/channels/tickets>`__ on our community server, where you can discuss questions with community members and the Mattermost core team. Join our `"Developers" channel <https://community.mattermost.com/core/channels/developers>`__ for technical discussions and our `"Developer Toolkit" channel <https://community.mattermost.com/core/channels/developer-toolkit>`__ for all integrations and plugins discussions.

source/archive/integration-faq.md METASEP
:nosearch:

# Integrations FAQ

Come [join our Contributors community channel](https://community.mattermost.com/core/channels/tickets) on our daily build server, where you can discuss questions with community members and the Mattermost core team. Join our [Developers channel](https://community.mattermost.com/core/channels/developers) for technical discussions and our [Integrations channel](https://community.mattermost.com/core/channels/integrations) for all integrations and plugins discussions.

## What's the difference between incoming and outgoing webhooks?

A webhook is a way for one app to send real-time data to another app.

In Mattermost, incoming webhooks receive data from external applications and make a post in a specified channel. They're great for setting up notifications when something happens in an external application.

Outgoing webhooks take data from Mattermost, and send it to an external application. Then the outgoing webhook can post a response back in Mattermost. They're great for listening in on channels, and then notifying external applications when a trigger word is used.

## What's a slash command?

A slash command is similar to an outgoing webhook, but instead of listening to a channel it is used as a command tool. This means if you type in a slash command it will not be posted to a channel, whereas an outgoing webhook is only triggered by posted messages.

## What does Slack-compatible mean?

Slack compatible means that Mattermost accepts integrations that have a payload in the same format as Slack.  

If you have a Slack integration, you should be able to set it up in Mattermost without changing the format.   

## What if I have a webhook from somewhere other than Slack?

If you have an integration that outputs a payload in a different format you need to write an intermediate application to act as a translation layer to change it to the format Mattermost uses. Since there’s currently no general standard for webhook formatting, this is unavoidable and just a part of how webhooks work.

If there's no translation layer, Mattermost won't understand the data you're sending.

## What are attachments?

When "attachments" are mentioned in the integrations documentation, it refers to Slack's Message Attachments. These "attachments" can be optionally added as an array in the data sent by an integration, and are used to customize the formatting of the message.

We currently don't support the ability to attach files to a post made by an integration.

## Where can I find existing integrations?

[Visit our app directory](https://mattermost.com/marketplace) for dozens of open source integrations to common tools like Jira, Jenkins, GitLab, Trac, Redmine, and Bitbucket, along with interactive bot applications (Hubot, mattermost-bot), and other communication tools (Email, IRC, XMPP, Threema) that are freely available for use and customization.

## Where should I install my integrations? 

For self-hosted deployments in small setups you might host integrations on the same server on which Mattermost is installed. For larger deployments you can setup a separate server for integrations, or add them to the server on which the external application is hosted - for example, if you're self-hosting a Jira server you could deploy a Jira integration on the Jira server itself.

When self-hosting restrictions are less strict, AWS, Heroku, and other public cloud options could also be used.

## How do I create a bot account with personal access tokens?

See [bot accounts documentation](https://developers.mattermost.com/integrate/admin-guide/admin-bot-accounts/) to learn more about how to create and manage bot accounts in Mattermost.

In version 5.11 and earlier, follow these steps to create a bot account with personal access tokens:

1. Create a bot account using any authentication method, including email and password, AD/LDAP, or SAML.
2. Create a personal access token for the account [using the steps here](https://docs.mattermost.com/developer/personal-access-tokens.html#creating-a-personal-access-token).
   - The steps also outline how to give the account permissions to post to any channel in your Mattermost server, including direct messages, or to any public channel.
3. Include the personal access token from step 2 as part of the `Authorization` header on API requests from your integration.
   - To confirm the token works, you can have your bot make a simple `GET` request to `/api/v4/users/me` with the `Authorization: bearer <yourtokenhere>` in the header. If it returns a `200` with the bot's user object in the response, the API request was made successfully.
     ```
     GET /api/v4/users/me HTTP/1.1
     Authorization: bearer <yourtokenhere>
     Host: your-mattermost-url.com
     ```
## How do I create a bot account without personal access tokens or webhooks?

Deployments that cannot create bot accounts via webhooks due to security reasons and do not want to use [personal access tokens](https://docs.mattermost.com/developer/personal-access-tokens.html) with no expiry time, can use the following approach:

1. Create a bot account using a secure email and strong password.
2. Manually add the account to all teams and channels it needs access to. If your deployment has a lot of teams or channels, you may create a CLI script to automate the process.
   - In a testing environment, you may also make the bot account a System Admin, giving the bot permissions to post to any channel. Not recommended in production due to potential security vulnerabilities.
3. Provide the email and password to your integration, and store it in a secure location with restricted access.
4. Have your integration use the email and password with an [`/api/v4/login`](https://api.mattermost.com/v4/#tag/authentication) endpoint to retrieve a session token. The session token is used to authenticate to the Mattermost system.
   - Set up your bot to make an HTTP POST to `your-mattermost-url.com/api/v4/users/login` with a JSON body, including the bot account's email and password.
  
     ```
     POST /api/v4/users/login HTTP/1.1
     Host: your-mattermost-url.com
     Content-Length: 66
     Content-Type: application/json
     
     {"login_id":"someone@nowhere.com","password":"thisisabadpassword"}
     ```
  
     where we assume there is a Mattermost instance running at http://localhost:8065.
   - If successful, the response will contain a `Token` header and a user object in the body:
   
     ```
     HTTP/1.1 200 OK
     Set-Cookie: MMSID=hyr5dmb1mbb49c44qmx4whniso; Path=/; Max-Age=2592000; HttpOnly
     Token: hyr5dmb1mbb49c44qmx4whniso
     X-Ratelimit-Limit: 10
     X-Ratelimit-Remaining: 9
     X-Ratelimit-Reset: 1
     X-Request-Id: smda55ckcfy89b6tia58shk5fh
     X-Version-Id: developer
     Date: Fri, 11 Sep 2015 13:21:14 GMT
     Content-Length: 657
     Content-Type: application/json; charset=utf-8
     
     {{user object as json}}
     ```
     
     The bot should retrieve the session token from the `Token` header and store it in memory for use with future requests.
   
   **Note:** Each session token has an expiry time, set depending on the server's configuration. If the session token your bot is using expires, it will receive a `401 Unauthorized` response from requests using that token. When your bot receives this response, it should reapply the login logic (using the above steps) to get another session token. Then resend the request that received the `401` status code.
5. Include the `Token` as part of the `Authorization` header on API requests from your integration.
   - To confirm the token works, you can have your bot make a simple `GET` request to `/api/v4/users/me` with the `Authorization: bearer <yourtokenhere>` in the header. If it returns a `200` with the bot's user object in the response, the API request was made successfully.
     ```
     GET /api/v4/users/me HTTP/1.1
     Authorization: bearer <yourtokenhere>
     Host: your-mattermost-url.com
     ```

**Note:** The Mattermost development team is also working on an [API developer token](https://docs.google.com/document/d/1ey4eNQmwK410pNTvlnmMWTa1fqtj8MV4d9XkCumI384), which allows you to authenticate the bot account via the API token rather than retrieving a session token from a user account.

## How should I automate the install and upgrade of Mattermost when included in another application?

Automating Mattermost installation within another application:

1. Review the [Mattermost installation guides](https://docs.mattermost.com/guides/administrator.html#installing-mattermost) to understand configuration steps of the production deployment.
2. Install Mattermost files to a dedicated `/opt/mattermost` directory by decompressing the `tar.gz` file of the latest release for your target platform (for example `linux-amd64`).
3. Review [Configuration Settings](https://docs.mattermost.com/configure/configuration-settings.html) in `config.json` and set your automation to customize your Mattermost deployment based on your requirements.
4. For directory locations defined in `config.json`, such as the location of the local file storage directory (`./data/`) or logs directory (`./logs`), you can redefine those locations in your `config.json` settings and move the directories.
   - All other directories should remain as they are in `/mattermost`.
5. Test that your Mattermost server is running with your new configuration.
6. Also, from the command line run `./bin/mattermost -version` to test that the command line interface is functioning properly.

Automating Mattermost upgrade within another application:

1. Review the [upgrade guide](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) for an overview of the upgrade procedure.
2. Create automation to upgrade to the next Mattermost versions:
    - Back up the `config.json` file to preserve any settings a user may have made.
    - Back up the `./data` directory if local storage is used for files.
    - Replace the contents of `/mattermost` directory with the decompressed contents of the latest release.
    - Restore `config.json` and `./data` to their previous locations (which may have been overwritten).
    - If you need to overwrite any `config.json` parameters use a [`sed` command](https://stackoverflow.com/questions/20568515/how-to-use-sed-to-replace-a-config-files-variable) or similar tool to update `config.json`
    - Starting the Mattermost server to upgrade the database, `config.json` file, and `./data` as necessary.
3. Optionally the upgrade procedure can be chained so users can upgrade across an arbitrary number of Mattermost versions rather than to just the latest release.

source/archive/installing-mattermost-desktop-app.rst METASEP
:nosearch:

Install the Mattermost Desktop App
==================================

|all-plans| |cloud| |self-hosted|

.. |all-plans| image:: ../images/all-plans-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in Mattermost Free and Starter subscription plans.

.. |cloud| image:: ../images/cloud-badge.png
  :scale: 30
  :target: https://mattermost.com/download
  :alt: Available for Mattermost Cloud deployments.

.. |self-hosted| image:: ../images/self-hosted-badge.png
  :scale: 30
  :target: https://mattermost.com/deploy
  :alt: Available for Mattermost Self-Hosted deployments.

The Mattermost Desktop App is available for Windows, macOS, and Linux operating systems.

.. image:: ../images/desktop.png

You can `download the Desktop App directly from our Download page <https://mattermost.com/download/#mattermostApps>`__, and visit our `installation guides <https://docs.mattermost.com/install/desktop-app-install.html>`__ for help during setup and for troubleshooting tips.

.. include:: ../upgrade/upgrading-to-v60.rst
    :start-after: :nosearch:

source/archive/install-ubuntu-1604.rst METASEP
:nosearch:
.. _install-ubuntu-1604:

Ubuntu 16.04 reached end of life April, 2019. Please refer to install guides for :doc:`Ubuntu 18.04 LTS <../install/installing-ubuntu-1804-LTS>` or :doc:`Ubuntu 20.04 LTS <../install/installing-ubuntu-2004-LTS>` instead.
source/archive/install-ubuntu-1604-server.rst METASEP
:nosearch:

.. _install-ubuntu-1604-server:

Installing Ubuntu Server 16.04 LTS
==================================

Ubuntu 16.04 reached end of life April, 2019. Please refer to install guides for :doc:`Ubuntu 18.04 LTS <../install/installing-ubuntu-1804-LTS>` or :doc:`Ubuntu 20.04 LTS <../install/installing-ubuntu-2004-LTS>` instead.
source/archive/install-ubuntu-1604-postgresql.rst METASEP
:nosearch:

.. _install-ubuntu-1604-postgresql:

Ubuntu 16.04 reached end of life April, 2019. Please refer to install guides for :doc:`Ubuntu 18.04 LTS <../install/installing-ubuntu-1804-LTS>` or :doc:`Ubuntu 20.04 LTS <../install/installing-ubuntu-2004-LTS>` instead.
source/archive/install-ubuntu-1604-mysql.rst METASEP
:nosearch:

.. _install-ubuntu-1604-mysql:

Ubuntu 16.04 reached end of life April, 2019. Please refer to install guides for :doc:`Ubuntu 18.04 LTS <../install/installing-ubuntu-1804-LTS>` or :doc:`Ubuntu 20.04 LTS <../install/installing-ubuntu-2004-LTS>` instead.
source/archive/install-ubuntu-1604-mattermost.rst METASEP
:nosearch:

.. _install-ubuntu-1604-mattermost:

Ubuntu 16.04 reached end of life April, 2019. Please refer to install guides for :doc:`Ubuntu 18.04 LTS <../install/installing-ubuntu-1804-LTS>` or :doc:`Ubuntu 20.04 LTS <../install/installing-ubuntu-2004-LTS>` instead.
source/archive/install-ubuntu-1404.rst METASEP
:nosearch:

.. _install-ubuntu-1404:

Ubuntu 14.04 LTS reached end of life April, 2019. Please refer to install guides for :doc:`Ubuntu 18.04 LTS <../install/installing-ubuntu-1804-LTS>` or :doc:`Ubuntu 20.04 LTS <../install/installing-ubuntu-2004-LTS>` instead.

source/archive/install-ubuntu-1404-server.rst METASEP
:nosearch:

.. _install-ubuntu-1404-server:

Ubuntu 14.04 LTS reached end of life April, 2019. Please refer to install guides for :doc:`Ubuntu 18.04 LTS <../install/installing-ubuntu-1804-LTS>` or :doc:`Ubuntu 20.04 LTS <../install/installing-ubuntu-2004-LTS>` instead.
source/archive/install-ubuntu-1404-postgresql.rst METASEP
:nosearch:

.. _install-ubuntu-1404-postgresql:

Ubuntu 14.04 LTS reached end of life April, 2019. Please refer to install guides for :doc:`Ubuntu 18.04 LTS <../install/installing-ubuntu-1804-LTS>` or :doc:`Ubuntu 20.04 LTS <../install/installing-ubuntu-2004-LTS>` instead.
source/archive/install-ubuntu-1404-mysql.rst METASEP
:nosearch:

.. _install-ubuntu-1404-mysql:

Ubuntu 14.04 LTS reached end of life April, 2019. Please refer to install guides for :doc:`Ubuntu 18.04 LTS <../install/installing-ubuntu-1804-LTS>` or :doc:`Ubuntu 20.04 LTS <../install/installing-ubuntu-2004-LTS>` instead.
source/archive/install-ubuntu-1404-mattermost.rst METASEP
:nosearch:

.. _install-ubuntu-1404-mattermost:

Ubuntu 14.04 LTS reached end of life April, 2019. Please refer to install guides for :doc:`Ubuntu 18.04 LTS <../install/installing-ubuntu-1804-LTS>` or :doc:`Ubuntu 20.04 LTS <../install/installing-ubuntu-2004-LTS>` instead.

source/archive/install-rhel-6.rst METASEP
:nosearch:
.. _install-rhel-6:

Installing Mattermost on RHEL 6
=================================

.. warning::
  RHEL 6 has approached its End of Life in December 2020.
  Because of this, we don't recommend installing new instances of Mattermost on RHEL 6.

You can use these instructions to install Mattermost on CentOS 6, Oracle Linux 6, or Scientific Linux 6. With the exception of the operating system that you install, the process is identical.

.. include:: install-common-intro.rst

.. contents:: Install and configure the components in the following order. Note that you need only one database, either MySQL or PostgreSQL.
  :backlinks: top
  :local:

.. include:: install-rhel-6-server.rst
.. include:: install-rhel-6-mysql.rst
.. include:: install-rhel-6-postgresql.rst
.. include:: install-rhel-6-mattermost.rst
.. include:: config-mattermost-server.rst
.. include:: config-tls-mattermost.rst
.. include:: install-rhel-nginx.rst
.. include:: config-proxy-nginx.rst
.. include:: config-ssl-http2-nginx.rst

source/archive/install-rhel-6-server.rst METASEP
:nosearch:
..  _install-rhel-6-server:

Installing Red Hat Enterprise Linux 6
=======================================

Install the 64-bit version of RHEL 6 on each machine that hosts one or more of the components.

**To install RHEL 6 Server:**

1. To install RHEL 6, see the `RedHat Installation Instructions <https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/pdf/Installation_Guide/Red_Hat_Enterprise_Linux-6-Installation_Guide-en-US.pdf>`__.

2. After the system is installed, make sure that it's up to date with the most recent security patches. Open a terminal window and issue the following commands:

  ``sudo yum update``
  
  ``sudo yum upgrade``

Now that the system is up to date, you can start installing the components that make up a Mattermost system.

source/archive/install-rhel-6-postgresql.rst METASEP
:nosearch:
..  _install-rhel-6-postgresql:

Installing PostgreSQL database
==============================

1. Log in to the server that will host the database, and open a terminal window.

2. Download the latest PostgreSQL repository. For more detailed install instructions visit the PostgreSQL docs site `here <https://www.postgresql.org/download/linux/redhat/>`_.

  ``sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-6-x86_64/pgdg-redhat-repo-latest.noarch.rpm``

3. Install PostgreSQL version 10 or higher. Replace the contents of the ``{version}`` with the version you wish to install.

  ``sudo yum install -y postgresql{version}-server``

  **Example:**

  ``sudo yum install -y postgresql13-server``

4. Initialize the database.

  ``sudo service postgresql-{version} initdb``

5. Set PostgreSQL to start on boot.

  ``sudo chkconfig postgresql-{version} on``

7. Start the PostgreSQL server.

  ``sudo service postgresql-{version} start``

8. Switch to the *postgres* Linux user account that was created during the installation.

  ``sudo --login --user postgres``

9. Start the PostgreSQL interactive terminal.

  ``psql``

10.  Create the Mattermost database.

  ``postgres=# CREATE DATABASE mattermost;``

11.  Create the Mattermost user 'mmuser'.

  ``postgres=# CREATE USER mmuser WITH PASSWORD 'mmuser-password';``

  .. note::
    Use a password that is more secure than 'mmuser-password'.

12.  Grant the user access to the Mattermost database.

  ``postgres=# GRANT ALL PRIVILEGES ON DATABASE mattermost to mmuser;``

13. Exit the PostgreSQL interactive terminal.

  ``postgres=# \q``

14. Log out of the *postgres* account.

  ``exit``

15. Allow Postgres to listen on all assigned IP Addresses.

  a. Open ``/var/lib/pgsql/{version}/data/postgresql.conf`` as root in a text editor.

  b. Find the following line:

    ``#listen_addresses = 'localhost'``

  c. Uncomment the line and change ``localhost`` to ``*``:

    ``listen_addresses = '*'``

  d. Restart PostgreSQL for the change to take effect:

    ``sudo service postgresql-{version} restart``

16. Modify the file ``pg_hba.conf`` to allow the Mattermost server to communicate with the database.

  **If the Mattermost server and the database are on the same machine**:

    a. Open ``/var/lib/pgsql/{version}/data/pg_hba.conf`` as root in a text editor.

    b. Find the following line:

      ``local   all             all                        peer``

    c. Change ``peer`` to ``trust``:

      ``local   all             all                        trust``

  **If the Mattermost server and the database are on different machines**:

    a. Open ``/var/lib/pgsql/{version}/data/pg_hba.conf`` as root in a text editor.

    b. Add the following line to the end of the file, where *{mattermost-server-IP}* is the IP address of the machine that contains the Mattermost server.

      ``host all all {mattermost-server-IP}/32 md5``

17. Reload PostgreSQL:

  ``sudo service postgresql-{version} reload``

18. Verify that you can connect with the user *mmuser*.

  a. If the Mattermost server and the database are on the same machine, use the following command:

    ``psql --dbname=mattermost --username=mmuser --password``

  b. If the Mattermost server is on a different machine, log into that machine and use the following command:

    ``psql --host={postgres-server-IP} --dbname=mattermost --username=mmuser --password``

    .. note::
      You might have to install the PostgreSQL client software to use the command.

  The PostgreSQL interactive terminal starts. To exit the PostgreSQL interactive terminal, type ``\q`` and press **Enter**.

With the database installed and the initial setup complete, you can now install the Mattermost server.

source/archive/install-rhel-6-mysql.rst METASEP
:nosearch:
..  _install-rhel-6-mysql:

Installing MySQL database server
================================

Install and set up the database for use by the Mattermost server. You can install either MySQL or PostgreSQL.

**To install MySQL 5.7 on RHEL 6:**

1. Log in to the server that will host the database, and open a terminal window.

2. Download the MySQL Yum repository from dev.mysql.com.

  ``wget http://dev.mysql.com/get/mysql57-community-release-el6-9.noarch.rpm``

3. Install the Yum repository from the file that you downloaded.

  ``sudo yum localinstall mysql57-community-release-el6-9.noarch.rpm``

4. Install MySQL.

  ``sudo yum install mysql-community-server``

5. Start the MySQL server.

  ``sudo service mysqld start``
  
  .. note::
    1. The first time that you start MySQL, the superuser account ``'root'@'localhost'`` is created and a temporary password is generated for it.
    2. Also the first time that you start MySQL, the ``validate_password`` plugin is installed. The plugin forces passwords to contain at least one upper case letter, one lower case letter, one digit, and one special character, and that the total password length is at least 8 characters.

6. Obtain the root password that was generated when you started MySQL for the first time.

  ``sudo grep 'temporary password' /var/log/mysqld.log``

7. Change the root password. Login with the password that you obtained from the previous step.

  ``mysql -u root -p``

8. Change the password. At the mysql prompt, type the following command. Be sure to replace ``Password42!`` with the password that you want to use.

  ``mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Password42!';``

9. Set MySQL to start automatically when the machine starts.

  ``sudo chkconfig mysqld on``

10. Create the Mattermost user 'mmuser'.

  ``mysql> create user 'mmuser'@'%' identified by 'mmuser-password';``

  .. note::
    1. Use a password that is more secure than 'mmuser-password'.
    2. The '%' means that mmuser can connect from any machine on the network. However, it's more secure to use the IP address of the machine that hosts Mattermost. For example, if you install Mattermost on the machine with IP address 10.10.10.2, then use the following command:

    ``mysql> create user 'mmuser'@'10.10.10.2' identified by 'mmuser-password';``

11. Create the Mattermost database.

  ``mysql> create database mattermost;``

12. Grant access privileges to the user 'mmuser'.

  ``mysql> grant all privileges on mattermost.* to 'mmuser'@'%';``

With the database installed and the initial setup complete, you can now install the Mattermost server.

source/archive/install-rhel-6-mattermost.rst METASEP
:nosearch:
..  _install-rhel-66-mattermost:

Installing Mattermost Server
============================

Install Mattermost Server on a 64-bit machine.

Assume that the IP address of this server is 10.10.10.2

**To install Mattermost Server on RHEL 6**

1. Log in to the server that will host Mattermost Server and open a terminal window.

2. Download `the latest version of the Mattermost Server <https://mattermost.com/deploy/>`__. In the following command, replace ``X.X.X`` with the version that you want to download:

  ``wget https://releases.mattermost.com/X.X.X/mattermost-X.X.X-linux-amd64.tar.gz``

3. Extract the Mattermost Server files.

  ``tar xvzf *.gz``

4. Move the extracted file to the ``/opt`` directory.

  ``sudo mv mattermost /opt``

5. Create the storage directory for files.

  ``sudo mkdir /opt/mattermost/data``

  .. note::
    The storage directory will contain all the files and images that your users post to Mattermost, so you need to make sure that the drive is large enough to hold the anticipated number of uploaded files and images.

6. Set up a system user and group called *mattermost* that will run this service, and set the ownership and permissions.

  a. ``sudo useradd --system --user-group mattermost``
  b. ``sudo chown -R mattermost:mattermost /opt/mattermost``
  c. ``sudo chmod -R g+w /opt/mattermost``

7. Set up the database driver in the file ``/opt/mattermost/config/config.json``. Open the file as root in a text editor and make the following changes:

  -  If you are using PostgreSQL:

    1.  Set ``"DriverName"`` to ``"postgres"``
    2.  Set ``"DataSource"`` to the following value, replacing ``<mmuser-password>``  and ``<host-name-or-IP>`` with the appropriate values:

     ``"postgres://mmuser:<mmuser-password>@<host-name-or-IP>:5432/mattermost?sslmode=disable&connect_timeout=10"``.

  -  If you are using MySQL:

    1.  Set ``"DriverName"`` to ``"mysql"``
    2.  Set ``"DataSource"`` to the following value, replacing ``<mmuser-password>``  and ``<host-name-or-IP>`` with the appropriate values. Also make sure that the database name is ``mattermost`` instead of ``mattermost_test``:

      ``"mmuser:<mmuser-password>@tcp(<host-name-or-IP>:3306)/mattermost?charset=utf8mb4,utf8&readTimeout=30s&writeTimeout=30s"``

8. Also set ``"SiteURL"`` to the full base URL of the site (e.g. ``"https://mattermost.example.com"``).

9. Test the Mattermost server to make sure everything works.

    a. Change to the ``mattermost`` directory:

      ``cd /opt/mattermost``

    b. Start the Mattermost server as the user *mattermost*:

      ``sudo -u mattermost ./bin/mattermost``

  When the server starts, it shows some log information and the text ``Server is listening on :8065``. You can stop the server by pressing CTRL+C in the terminal window.

10. Setup Mattermost to use the Upstart daemon which handles supervision of the Mattermost process.

  a. Create the Mattermost configuration file:

    ``sudo touch /etc/init/mattermost.conf``

  b. Open the configuration file in your favorite text editor, and copy the following lines into the file:

    .. code-block:: none

      start on runlevel [2345]
      stop on runlevel [016]
      respawn
      limit nofile 50000 50000
      chdir /opt/mattermost
      exec bin/mattermost

10. Start the Mattermost server.

  ``sudo start mattermost``

11. Verify that Mattermost is running.

  ``curl http://localhost:8065``

  You should see the HTML that's returned by the Mattermost server.

Now that Mattermost is installed and running, it's time to create the admin user and configure Mattermost for use.

source/archive/install-post-deployment-solution.rst METASEP
:nosearch:

.. _config-proxy-nginx:

Customizing your Mattermost install
====================================

After completing your Mattermost install with a deployment solution provider, such as Bitnami, you can customize the SSL security, email notifications, and core server options via the following procedures:

Set up SSL
-----------

- `Set up SSL with NGNIX <https://docs.mattermost.com/install/config-ssl-http2-nginx.html>`__
- `Set up SSL without NGINX using Mattermost as a web server <https://docs.mattermost.com/install/config-tls-mattermost.html>`__

Set up SMTP email
------------------

- `Set up SMTP email <https://docs.mattermost.com/install/smtp-email-setup.html>`__ to receive email notifications

Configure your core Mattermost server options
---------------------------------------------

- `Set up basic Mattermost options <https://docs.mattermost.com/install/config-mattermost-server.html>`__

source/archive/install-kubernetes-operator.rst METASEP
:nosearch:

Installing the operators
------------------------

The operators are installed using ``kubectl`` and each operator is created in its own namespace. You can install and run multiple Mattermost installations in the same cluster using different namespaces.

**1. Install NGINX ingress controller**

Follow the instructions `here <https://kubernetes.github.io/ingress-nginx/deploy/>`__.

**2. Install the Mattermost Operator**

.. code-block:: sh

  $ kubectl create ns mattermost-operator
  $ kubectl apply -n mattermost-operator -f https://raw.githubusercontent.com/mattermost/mattermost-operator/master/docs/mattermost-operator/mattermost-operator.yaml

Installing MySQL and MinIO operator
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The MySQL operator and MinIO operator are a good way to try out the Mattermost Operator or develop it on a local cluster but they **are not recommended for production usage**.

**1. Install the MySQL operator**

.. code-block:: sh

  $ kubectl create ns mysql-operator
  $ kubectl apply -n mysql-operator -f https://raw.githubusercontent.com/mattermost/mattermost-operator/master/docs/mysql-operator/mysql-operator.yaml

**2. Install the MinIO operator**

.. code-block:: sh

  $ kubectl create ns minio-operator
  $ kubectl apply -n minio-operator -f https://raw.githubusercontent.com/mattermost/mattermost-operator/master/docs/minio-operator/minio-operator.yaml

Installing the Operators via Helm
---------------------------------

The operators can be installed using the Mattermost Operator Helm chart.
Follow the instructions `here <https://github.com/mattermost/mattermost-helm/tree/master/charts/mattermost-operator>`__.

source/archive/install-kubernetes-cluster.rst METASEP
:nosearch:

.. _install-kubernetes-cluster:

Setting Up a Kubernetes cluster
-------------------------------

Prerequisites
~~~~~~~~~~~~~

Prerequisites for using the Mattermost Operator:

- Kubernetes cluster in version 1.16 or higher.
- Kubernetes CLI `kubectl <https://kubernetes.io/docs/reference/kubectl/overview/>`__ installed on local machine.

It’s recommended that you have a basic understanding of Kubernetes concepts (such as deployments, pods) and actions (such as applying manifests, viewing pod logs). It's also advisable to consult the `official Kubernetes setup documentation <https://kubernetes.io/docs/setup/>`__ on how to set up a cluster in your environment.

If you’re unsure about which environment you want to use for your Kubernetes cluster, we suggest using a managed service such as as `Amazon EKS <https://aws.amazon.com/eks/>`__, `Azure Kubernetes Service <https://azure.microsoft.com/en-ca/services/kubernetes-service/>`__, `Google Kubernetes Engine <https://cloud.google.com/kubernetes-engine/>`__, or `DigitalOcean Kubernetes <https://www.digitalocean.com/products/kubernetes/>`__.

Confirm resource requirements
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Running Mattermost in Kubernetes requires different resources based on your total number of users. The table below details the minimum Kubernetes cluster resources that Mattermost requires at different scales.

**Note:** These are minimum requirements and yours may differ significantly.

.. csv-table::
    :header: "User Count", "Node Count", "Memory per Node", "vCPU per Node"

    "5,000", "6", "8 GB", "4"
    "10,000", "8", "16 GB", "4"
    "25,000", "14", "16 GB", "4"


- These resources take into account all components required for Mattermost, including proxy, database, and file storage.
- Requirements may be significantly lower when using an external database and filestore (recommended).  
- Resource requirements may vary depending on user usage and bot activity.
- For larger installations, it may be beneficial to use nodes for the databases that have more memory and/or are optimized for memory.
- For installations of more than 25,000 users please `contact us <https://mattermost.com/contact-us/>`__ for sizing guidelines.

source/archive/install-debian-88.rst METASEP
:nosearch:

Please see :doc:`install-debian`.
source/archive/install-debian-88-server.rst METASEP
:nosearch:

Please see :doc:`install-debian`.
source/archive/install-debian-88-postgresql.rst METASEP
:nosearch:

Please see :doc:`install-debian`.
source/archive/install-debian-88-mysql.rst METASEP
:nosearch:

Please see :doc:`install-debian`.
source/archive/install-debian-88-mattermost.rst METASEP
:nosearch:

Please see :doc:`install-debian`.
source/archive/incident-response-and-monitoring.rst METASEP
:nosearch:

Incident Response and Monitoring Tools
======================================

Our `Integrations Directory <https://integrations.mattermost.com>`_ has several integrations to connect incident response and monitoring tools in Mattermost.

Here are some popular options below, including self-hosted on-prem or self-hosted private cloud solutions, and vendor-hosted SaaS solutions.

AWS CloudWatch SNS
~~~~~~~~~~~~~~~~~~

 - Two-way integration between Mattermost and Amazon AWS SNS, developed by Carlos Tadeu Panato Junior, supported by Mattermost.
 - Receive SNS notifications from Alerts created by Amazon AWS CloudWatch and sent via AWS SNS.
 - Get operational data and actionable insights to monitor Mattermost in order to observe and respond to system-wide changes in performance.
 - Source code + docs: https://github.com/mattermost/mattermost-plugin-aws-SNS

Nagios
~~~~~~~

 - Send notifications from a Nagios monitoring instance to any Mattermost channel for troubleshooting, developed by NDrive.
 - Can be used for other compatible software such as Icinga.
 - Source code + docs: https://github.com/NDrive/nagios-mattermost

Splunk
~~~~~~

 - Monitor a Mattermost environment.
 - Send application performance insights to any Mattermost channel for better troubleshooting and monitoring, and to increase system uptime.
 - Docs: http://datatomix.com/?p=433, written by Christian Johannsen.

PagerDuty
~~~~~~~~~

 - Get automatic information regarding the state of an incident to Mattermost, developed by PagerDuty.
 - Send incident updates for any PagerDuty Service to any Mattermost channel to optimize incident resolution time and process.
 - Docs: https://www.pagerduty.com/docs/guides/mattermost-integration-guide/

Opsgenie
~~~~~~~~~

 - Two-way integration between Opsgenie and Mattermost, developed by Opsgenie.
 - Send alert notifications from your Opsgenie incident boards to Mattermost channels.
 - Use slash commands to take quick actions such as acknowledging, assigning, creating and closing alerts in the Mattermost user interface.
 - Docs: https://docs.opsgenie.com/docs/mattermost-integration 

Prometheus Alertmanager
~~~~~~~~~~~~~~~~~~~~~~~~

 - Two-way integration between Alertmanager and Mattermost, developed by Carlos Tadeu Panato Junior.
 - Handle alerts sent by client applications such as the Prometheus server and route them to the correct receiver integrations such as email, PagerDuty, or Opsgenie.
 - Source code + docs: https://github.com/cpanato/mattermost-plugin-alertmanager

Have a proposal for an incident response and monitoring integration? `Let us know in the feature proposal forum <https://mattermost.uservoice.com/forums/306457-general?category_id=202591>`_.

Have built an integration? `Let us know <https://integrations.mattermost.com/submit-an-integration/>`_ and we'll share in our `Integrations Directory <https://integrations.mattermost.com>`_.

source/archive/how-to-run-a-hackathon.rst METASEP
:nosearch:

How to run a Hackathon
=========================

This page has moved to the `Mattermost Handbook <https://handbook.mattermost.com/contributors/contributors/how-to-run-a-hackathon>`__.

source/archive/help.png METASEP

source/archive/help-wanted.rst METASEP
:nosearch:

Help Wanted Tickets
==========================

This page has moved to the `Mattermost Handbook <https://handbook.mattermost.com/contributors/contributors/help-wanted>`__. 

source/archive/handbook.rst METASEP
:nosearch:

=====================
About Mattermost
=====================

This page has moved to the `Mattermost Handbook <https://handbook.mattermost.com/company/about-mattermost>`__.

source/archive/ha.rst METASEP
:nosearch:

This document has moved to: https://github.com/mattermost/docs/edit/master/source/deployment/cluster.rst

source/archive/guest-article.rst METASEP
:nosearch:

Guest Blog Posts for Mattermost Apps and Services
===============================================================

Guest blog post process has been moved to the `Mattermost Handbook <https://handbook.mattermost.com/operations/messaging-and-math/how-to-guides-for-m-and-m/how-to-write-guest-blog-posts-for-mattermost-apps-and-services>`_.


Mattermost Recipes
--------------------------------------------------------

Mattermost recipes process has been moved to the `Mattermost Handbook <https://handbook.mattermost.com/operations/messaging-and-math/how-to-guides-for-m-and-m/how-to-write-mattermost-recipes>`_.

source/archive/gitlab-process.rst METASEP
:nosearch:

GitLab Process
============================

This document outlines the processes for supporting the Mattermost package in GitLab Omnibus.

.. contents::
    :backlinks: top

Merge Requests
-----------------

To submit a merge request (MR) to GitLab for taking the next Mattermost version, follow these steps. The MR must be merged by the 7th of the month to be included in a GitLab release.

1. Check out the latest version of GitLab Omnibus and make a branch with the following changes:

    - Changes to Mattermost version number (`default_version <https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/config/software/mattermost.rb#L20>`__) and md5 sum of the final TE build (`source md5 <https://gitlab.com/jasonblais/omnibus-gitlab/blob/master/config/software/mattermost.rb#L23>`__) in  `config/software/mattermost.rb <https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/config/software/mattermost.rb>`__
    - Update to the `GitLab changelog <https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/CHANGELOG.md>`__ by using ``/scripts/changelog`` script to create a changelog entry
    - Config.json updates to `gitlab.rb <https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/files/gitlab-config-template/gitlab.rb.template>`__, `attributes default.rb <https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/files/gitlab-cookbooks/mattermost/attributes/default.rb>`__ and `config.json.erb <https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/files/gitlab-cookbooks/mattermost/templates/default/config.json.erb>`__ with new TE config settings (`see example <https://gitlab.com/gitlab-org/omnibus-gitlab/merge_requests/1855>`__)
    - Update to `GitLab Mattermost documentation <https://docs.gitlab.com/omnibus/gitlab-mattermost/README.html>`__

2. Build GitLab and test it locally `following these steps <https://docs.mattermost.com/developer/developer-flow.html#testing-with-gitlab-omnibus>`__.
3. Submit a MR to the `master branch of Gitlab <https://gitlab.com/gitlab-org/omnibus-gitlab>`__, including a summary of updates in Team Edition that are relevant to GitLab
4. Post a link to the MR in the Release Discussion channel.
5. Check daily for updates until the MR is merged, ensuring it gets merged by the 7th of the month.
6. Once the MR is merged and included in an RC, `test upgrade following these steps <https://docs.google.com/document/d/1mbeu2XXwCpbz3qz7y_6yDIYBToyY2nW0NFZq9Gdei1E/edit#heading=h.ncq9ltn04isg>`__.

If the release contains a security update, PM owner emails @marin and @briann in GitLab with a link to the MR, and all subsequent backports.

Testing
----------------

The following steps are taken to test the Mattermost package before each merge request to GitLab Omnibus:

1. Pull the latest master build of GitLab Omnibus, using the `nightly Omnibus packages <https://packages.gitlab.com/gitlab/nightly-builds>`_.
2. Update ``default_version`` and ``md5`` variables for the new Mattermost version in `config/softwater/mattermost.rb`.

.. code-block:: none

  name 'mattermost'
  default_version '5.19.0-rc2'

  source url: "https://releases.mattermost.com/#{version}/mattermost-team-#{version}-linux-amd64.tar.gz",
  md5: 'fe49d764324334480b296fc6c500b706'

3. Update the list of Mattermost versions associated with each GitLab release `in the GitLab documentation <https://docs.gitlab.com/omnibus/gitlab-mattermost/#upgrading-gitlab-mattermost>`_, and add a changelog entry.
4. Build GitLab Omnibus `using these instructions <https://gist.github.com/hmhealey/b6d3e42a88563ca43f03152e8b86592b#gitlab-omnibus>`_.
5. Install the generated ``.deb`` file on a local test server.

The Mattermost team then tests the upgrade process and validates the packaging code and OAuth setup which have historically been the main source of issues. Other test areas include:

- Pre-provisioning OAuth configuration automatically on the Omnibus package.
- Mattermost ChatOps slash command integration.
- OAuth team creation option in GitLab Omnibus.

Upgrade Process
~~~~~~~~~~~~~~~~~~

Follow these steps to test the upgrade process for Mattermost in GitLab Omnibus.

The current test servers are located at:

 - `http://gitlab-rc-testing.spinmint.com <http://gitlab-rc-testing.spinmint.com>`__ - The GitLab instance itself
 - `http://gitlab-rc-testing2.spinmint.com <http://gitlab-rc-testing2.spinmint.com>`__ - GitLab Mattermost

The root admin account for them has username `root` and password `Password1`.

1. Connect to the previously configured instance using the key you used to set it up. The host name is ``ubuntu@gitlab-rc-testing.spinmint.com``.
2. Make sure your package manager is configured to allow for Gitlab RCs:

 - Go to `https://packages.gitlab.com/gitlab/unstable <https://packages.gitlab.com/gitlab/unstable>`__.
 - Click on the newest release candidate that’s marked CE and is for Ubuntu/Trusty.
 - Run the first command listed on that page on your server. It looks something like:

   .. code-block:: text

     curl -s https://packages.gitlab.com/install/repositories/gitlab/unstable/script.deb.sh | sudo bash

3. Update the package manager

  .. code-block:: text

    sudo apt-get update

4. Update GitLab by running the second command listed on the page you opened on step 2. It looks something like:

   .. code-block:: text

     sudo apt-get install gitlab-ce=8.10.0-rc13.ce.0

5. Reconfigure GitLab:

  .. code-block:: text

   sudo gitlab-ctl reconfigure

6. Restart GitLab:

  .. code-block:: text

   sudo gitlab-ctl restart

7. To confirm the upgrade was successful:

 - Go to `http://gitlab-rc-testing2.spinmint.com  <http://gitlab-rc-testing2.spinmint.com >`__.
 - Create an account and log in.
 - Confirm the correct version number in **Main Menu** > **About Mattermost**.

To help with debugging, including a list of useful commands, see the `support handbook <https://docs.mattermost.com/process/support.html#gitlab-issues>`_.

Service-Level Agreement (SLA)
-------------------------------

Mattermost has created a ``mattermost-support`` account in GitLab for support issues, and has subscribed to the ``mattermost`` label in the following projects:

 - `omnibus-gitlab <https://gitlab.com/gitlab-org/omnibus-gitlab>`__
 - `gitlab-ce <https://gitlab.com/gitlab-org/gitlab-ce>`__
 - `gitlab-ee <https://gitlab.com/gitlab-org/gitlab-ee>`__

When a `mattermost` label is applied, an email notification is sent to the technical support team who answers the question within two business days using the ``mattermost-support`` account.

GitLab Premier Support Issues
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

GitLab has a `4-hour support window for their premier support customers <https://about.gitlab.com/features/premium-support/>`__ and Mattermost has set up a process to support this window.

When a premier support issue requires escalation to the Mattermost support team, GitLab assigns the issue to the ``mattermost-support`` account. This assignment sends an email notification, which is automatically escalated to the critical level technical support who answers the question within 4 hours using the ``mattermost-support`` account.

Monthly Meetings
-------------------

Changes and features affecting GitLab Omnibus are communicated via `GitLab issues <https://gitlab.com/gitlab-org/gitlab-ce/issues>`__ and `GitLab Slack channel <https://gitlab.slack.com>`__.

Moreover, a recurring monthly meeting between a product manager at GitLab and Mattermost is organized to cover

 - concerns/issues from GitLab Omnibus team,
 - new upcoming changes or features in Mattermost affecting GitLab Omnibus, and
 - other miscellaneous queued items.

Optionally, an engineer from both GitLab and Mattermost teams also joins the meeting.

Templates
--------------

GitLab announcement proposal
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: none

  Proposed update for new version of [Mattermost](https://gitlab.com/gitlab-org/omnibus-gitlab/issues/1241).

  ### GitLab Mattermost 4.7

  GitLab 10.6 includes [Mattermost 4.7](https://mattermost.com/blog/mattermost-4-7-enhanced-image-preview/), an [open source Slack-alternative](https://mattermost.com/) whose newest release includes enhanced image preview and thumbnails, faster load times, upgraded desktop app, plus much more.

  This version also includes [security updates](https://mattermost.com/security-updates/) and upgrading is recommended.

GitLab forum responses
~~~~~~~~~~~~~~~~~~~~~~~

See `sample forum responses listed here <https://handbook.mattermost.com/contributors/contributors/guidelines/community-playbook>`__.

source/archive/fx-guidelines.rst METASEP
:nosearch:

User Experience Guidelines
==========================

The purpose of the Mattermost User Experience Guidelines ("UX Guidelines") is to deliver a level of usability and consistency that turns users of Mattermost software into fans of the Mattermost experience.

If you're interested in contributing to design discussions, please join the `Mattermost UX Design channel to discuss <https://community.mattermost.com/core/channels/ux-design>`__.

.. contents::
   :local:
   :depth: 2

-----

Design Principles
*****************

These principles define the standard we’re setting for the Mattermost experience.

1) Fast, Obvious, Forgiving
--------------------------------

**Fast**

Fast has two parts: being "responsive" and being "quick".

*Responsive* means when a user clicks, taps, types or otherwise enters input we give immediate feedback that the input is received and something is happening. It could be a spinner animation, or just some text saying “Loading”, but something always responds to the user.

*Quick* means things happen as soon as they can. Loading pages, sending messages, receiving notifications and other vital actions should be automatically benchmarked for performance. Bugs should be opened on performance regressions.

**Obvious**

There is no such thing as "user error"--it’s always our fault as product designers. We prevent problems of incorrect usage by making users aware of correct usage. Fixes could be through user interface improvements, adjustments to help text or helping users recover when things go wrong–for example, adding undelete, undo and rolling back.

When our product is correct, users are never confused. Everything we do--features, interface layout, labeling, help text and documentation--needs to make sense in the mind of the user, even if it means occasionally oversimplifying how things technically work.

If a user doesn’t understand how to use a feature, all the underlying effort and code is wasted. The “Obvious” design principle also flows through to our `Documentation Guidelines <https://mattermost.org/documentation-guidelines/>`__.

Given `Hick’s Law <https://en.wikipedia.org/wiki/Hick%27s_law>`__, core functionality should be apparent, and advanced functionality should be possible via sub-menus and be well documented and tested. Functionality that is not fundamental to the product purpose should be ruthlessly omitted.

Use design patterns familiar to our audience--general non-technical users for the core messaging experience, IT administrators for configuration experience, developers for the developer experience. Mattermost UX should be drawn from patterns and derivations of other experiences in a mix of familiar approaches. Remember: Software is an invention--there's nothing "intuitive" about it, there is only what is familiar.

**Forgiving**

There will be unavoidable product failures, whether through technical issues like loss of connectivity or through our inability to make the user aware of correct usage. Being forgiving means reducing the negative impact users encounter during failures--not losing their data, not deleting, updating or sending something they didn't intend to send, and so forth.

Features like confirmation dialogs on critical actions or temporarily saving user input in case of disconnect are examples of forgiveness.

That said, forgiving does not mean allowing the product to be used incorrectly by breaking the "Obvious" principle. As an analogy, if someone kicks a football and misses the goal, being forgiving means giving them a chance to kick again, it does not mean counting the miss as a goal.

2) International, Compatible, Priority-focused
-------------------------------------------------

**International** - Design with an international, multi-lingual audience in mind. Use patterns and language without US, Western or culture-specific references when possible.

**Compatible** - When aligned with our other design principles, we should deploy UX and integration patterns from the other products for which we support the import of teams and users.

**Priority-focused** - Communication is a starting point towards the end goal of helping users within an enterprise achieve their highest priorities through modern communication. We prefer the term "messaging" to convey the sending of thoughtful communications that moves ideas forward, to the term "chat", which doesn't imply progress.

-----

Technical Guidelines
********************

Plugins
-----------------

By default, every new feature should be a plugin. Why?

 - Isolates complexity.
 - Disabled by default and must be turned on by a System Admin.
 - Grows the plugin ecosystem with better support for external plugins.

Reasons you might not want to write a plugin:

 - The feature requires high performance access.
 - The feature would be used or extended by a plugin (e.g. bot accounts or Account Settings modal).
 - The feature would be used by every Mattermost instance (e.g. flagged messages, replies).

Reasons to write a plugin:

 - To customize the Mattermost user interface.
 - To extend Mattermost functionality to meet a specific, complex requirement.
 - To build integrations that are managed by your Mattermost server.
 - To prototype a new feature with a plugin.

Bootstrap Classes
-----------------

Since we’re using `bootstrap <http://getbootstrap.com/>`__, try to utilize `bootstrap classes <http://getbootstrap.com/css/>`__ as much as possible rather than creating new styles or using inline styles.

Custom Styles
-------------

We’re using `BEM methodology <https://en.bem.info/method/>`__  and would advise everyone to do so when creating new classes or ids. There are many places in our app that currently don’t follow BEM, but we’re trying to improve the codebase. `Here <http://csswizardry.com/2013/01/mindbemding-getting-your-head-round-bem-syntax/>`__ is a brief overview of the BEM syntax.

-----

Screen and Content Dimensions
*****************************

Web/Desktop App
-------------------

The webapp supports two main modes of displaying the app: desktop view and mobile/tablet view. The app is primarily used in desktop view, but when the screen is 768 pixels or less wide, it switches to mobile view. The mobile view is also used in mobile browsers and the Classic App.

For desktop view:

 - The target screen sizes are 1280 x 800 or 1920 x 1080. Note that the space available for content will be smaller than this due to the the frame of the window and system-specific components like the taskbar on Windows. For example, the desktop app on Windows 10 only has a usable height of 717 pixels when the tab bar is visible at 1280 x 800 resolution.
 - The minimum content size is 769 x 600. When the width is 768 or less, the app switches to mobile view. When the height is below 600, UI elements may become misplaced.

For mobile view:

 - The minimum and target content size is 320 x 460, matching the available space when the app is opened in Safari on an iPhone 5.

Mobile App
----------

At this time, the mobile app only supports an equivalent of mobile view. In that view:

 - The minimum and target content size is 320 x 568, matching the screen size of an iPhone 5. Note that you'll still need to leave space for system-specific components like the status bar or soft buttons on iOS, but much more of the screen is usable.

-----

UX Feedback Guidelines
****************************

User experience design is a discipline drawing from ergonomics, ethnography, human factors research and cognitive psychology. It's evaluated qualitatively with tools like heuristic evaluation and cognitive walkthroughs, and quantitatively through telemetry, anonymous usage data and other automated diagnostics.

As with any design process, iteration, prototyping, informed critique and evaluation is vital to doing our best work. Developing the skill of informed critique in our community increases the quality of our designs and of our product.

This guide outlines the levels of UX feedback in the order of positive impact in order to guide contributors towards the behaviors that best advance a fast-moving, asychronously-developed open source product.

**Entry-level UX feedback:** Authentic questions or suggestions for design changes, presented with good intentions, coming from personal preferences with less than 2 minutes spent thinking about the pros and cons of the changes the feedback suggests.

Example 1: Well intentioned suggestion that does not consider pros and cons.

   Why not change channel length from 22 characters to 50 characters?



Example 2: Attempt to help provide "input" in a design discussion, but instead of using objective criteria such as audience, community, customers, examples, research or principles, expresses a political "vote" that may bias or confuse a design discussion.

   +1, that is my personal preference!

While it's important to welcome people sharing entry-level feedback, and to extract from it useful ideas where possible, if entry-level feedback begins to unintentionally shut out more constructive feedback, a private note might be sent to the contributor with something like: "Highly appreciate your good intentions to share UX feedback. May I ask your help to review Mattermost's UX Feedback Guidelines (link)?"

**Intermediate UX feedback:** - Comments, critique or questions about design with thoughtful consideration--including trade-offs--of the goal and principles of a design, along with UX principles of the project, and patterns from other products.

Feedback speaks for itself, with relevant references to principles, audience, research and other objective criteria. May include descriptions of experience using the feature or similar features that can be generalized to the intended audience:

Example: Thoughtful suggestion listing trade-offs that reference principles.

   What if we used a reply icon, similar to replies in email, for the comment function? Screenshots below. Pros: a) More familiar to email users. b) More distinct than the word balloon icon typically used for "Comment", which is too easily confused for "Message".  Cons: i) We use the symbol of "Reply" for "Comment" (the UI has an "Add Comment" button in the UI), which could be confusing. ii) When we add a "Forward" icon later to move a message to a different channel, the "Reply" and "Forward" metaphors may get muddled".

UX feedback at intermediate level or higher is highly appreciated. It should be encouraged and recognized as a substantial contribution to the design process.

**Advanced UX feedback:** - Constructive feedback that enlightens a design discussion, shares fact-based heuristics, helps clear blindspots and inconsistencies, and significantly improves a design, and potentially design guidelines. Analysis naturally considers variations needed across web, PC and mobile experiences.

Example: Noticing a design issue and influencing a change in UX guidelines to correct things system-wide.

   A menu with 10 items without groupings seems too long. Both Apple (link) and Windows (link) user interface guidelines suggest fewer than 7 options before grouping. I'd propose we use fewer than 5. There's research showing 5 items as a number most people can comfortably store mentally (link), and looking through other products I don't see situations where we wouldn't be able to group by 5. Also, fewer menu items, perhaps through sub-menus, should also help mobile experience, where ungrouped 10-item menus just look messy. I've added a PR on UX guidelines where we can discuss this as well.

-----

Design Guidelines
*****************

Display: Alignment
------------------

**Elements should feature margins horizontally and vertically, evenly spaced.**

Create space between elements, such as buttons, text, line separators, headers and backgrounds, by leaving even space around them (either equal space or at most 1 pixel difference).

    **Examples:**

        Button positioned in the middle of the header.
            ..  image:: ../images/align1.jpg
                :alt: Button positioning
                :width: 500 px

        Error message does not extend beyond the horizontal line separator.
            ..  image:: ../images/align2.png
                :alt: Confined messages with respect to width
                :width: 500 px

**Horizontally align multi-line elements along a vertical line.**

    **Example:**

        Roles right-justified with respect to the text and irrespective of the icon.
            ..  image:: ../images/align3.jpg
                :alt: Vertically justified
                :width: 500 px

---------------------------

Display: Button Placement
-------------------------

**Button in the footer of the dialog should either be “Close”, or “Cancel” and [ACTION_BUTTON].**

If there’s one button on the bottom right, it should be “Close”. If there are two, the one on the left should be “Cancel” and the one on the right should be an [ACTION_BUTTON], like “Save” or “Send Invitations”.

**Example:**

    Correct:
        Single button at the bottom right should be “Close”.

        ..  image:: ../images/buttonPlacement1.png
            :alt: Button Placement 1
            :width: 500 px

    Correct:
        When there are two buttons on bottom right, left button should be “Cancel” and the button on the right should be the [ACTION_BUTTON], in this case “Send Invitations”.

        ..  image:: ../images/buttonPlacement2.png
            :alt: Button Placement 2
            :width: 500 px

    Incorrect:
        When there are two buttons at the bottom right, left button should not be “Close”, as it’s not clear if closing will or won’t execute the [ACTION_BUTTON].

        ..  image:: ../images/buttonPlacement3.png
            :alt: Button Placement 3
            :width: 500 px

-----

Display: Button States
---------------------------

All buttons should have a visually distinct appearance for the following states (if applicable):

- default
- on_hover / on_hover (w tooltip)
- active
- disabled (greyed out or hidden)

The color of the on_hover state should be the same as in active state, with opacity = 0.7.

**Example:**

    ..  image:: ../images/buttonDesign.png
        :alt: Button design

---------------------------

Display: Icons
--------------

1. When to use icons
    a. When there’s not enough space for the label and an icon can easily represent the label.
    b. When an icon can help the user more quickly understand a feature.

2. When not to use icons
    a. When the term/phrase is too specific or complicated.

3. Icons should vary across different options
    a. When using icons, different options in the same section should have different icons.

4. Testing
    a. File a bug if the icon is difficult to understand or has cosmetic defects (size, blur, etc.).
    b. File a bug when an icon doesn’t obviously indicate the underlying feature.

---------------------------


Display: Instructions
---------------------

**Instructions should be sentences, one-line links should be fragments.**

Instructions, such as “A password reset link has been sent to ``you@email.com`` for your account. Please check your inbox.”, should be displayed as sentences ending in periods. One-line links, such as “Find it here”, should not end in periods or commas, but question marks are okay.

Instructions that contain a link to an external resource (e.g.: a blog article or docs.mattermost.com), should link to a redirect page and not be hard-coded. Redirect pages should be formatted as ``https://mattermost.com/default-[SUBJECT]``. If the page you're linking to doesn't exist, a new mattermost.com page can be requested from the Product team at Mattermost.

    **Example:**

        Correct:
            Instruction “Please check your inbox”, ending with a period.

            ..  image:: ../images/align5.jpg
                :alt: Period added
                :width: 300 px

        Incorrect:
            Instruction “Please check your inbox”, ending without a period.

            ..  image:: ../images/align4.png
                :alt: Period Missing
                :width: 300 px


---------------------------

Display: Tooltips
---------------------------

Tooltip text may be title case or sentence case depending on its context.

- Tooltips should be title case if the tooltip is a noun, e.g. "Pinned Posts", or "Flagged Posts".
- Tooltips should be sentence case if they are declaring an action, e.g. "Flag for follow up", or "Create new private channel".

---------------------------

Display: Username display
---------------------------

Usernames should be preceded by the @ icon in all places except for the Direct Messages list in the left-hand sidebar, and for any post or comment made by the user.

Examples of where an @ icon should precede the username are as follows:

- User list in the system console.
- Autocomplete.
- Members list for the current channel.

---------------------------

Display: Number of Choices
--------------------------

To simplify decisions, when practical, limit the number of choices to 3 or 4, and add separators or headings between logical groups. See `Hick’s Law <https://en.wikipedia.org/wiki/Hick%27s_law>`__ for background on why this helps.

Example:

    Incorrect:
        No clear separation between distinct options.

        ..  image:: ../images/choices1.png
            :alt: No separation
            :width: 500 px

    Correct:
        A clear separation between distinct options.

        ..  image:: ../images/choices2.png
            :alt: Clear separation
            :width: 500 px

-----

Feedback: Error Messages
------------------------

On occasion, Mattermost users may encounter a problem that prevents them or the Mattermost system from successfully completing a task. The unexpected user behavior or system response should be communicated to the user through an error message, and should follow the design principles of forgiving and obvious.

Error messages should:

- State the encountered problem with the component in the title (e.g. "Team URL Not Found").
- Describe very briefly why the error happened under the title.
- When possible, have a link to direct users to help complete their original task or return to the previous state.
- Give recommendations/solution(s) for the next course of action.
- Be consistent with the Mattermost voice and professional look.
- Be avoided when possible (by avoiding the error condition).

Error messages should not:

- Be in red or in capital letters.
- Say or have the term “Error”.
- Be lengthy.
- Be generic.
- End in an exclamation point.

**Examples:**

    Incorrect:
        This is an example of a bad error message:

    ..  image:: ../images/error2.png
        :alt: Bad Error Message

    Correct:
        This is an example of a good error message:

    ..  image:: ../images/error1.png
        :alt: Good Error Message

-----

Feedback: System Notice
------------------------

On occasion, Mattermost users may encounter a system notice generated by Mattermost as part of a recent release. The system notice should be communicated to the user via a pop-over message in the bottom right of the screen, and should follow the design principles of `Fast, Obvious, Forgiving <https://docs.mattermost.com/developer/fx-guidelines.html#fast-obvious-forgiving>`__.

Notice messages should:

- State that the notice is from Mattermost.
- Describe very briefly and in an unintimidating tone the reason of the notice.
- When possible, include a link that directs users to help documentation related to the notice description.
- Be clear who can see the message.
- Give three action options: a link that can be clicked, "remind me later" button or "don't show again" button.
- Be consistent with the Mattermost voice and professional look.
- Be used very selectively to highlight significant change(s) within the current release.

Notice messages should not:

- Be in colored text or in capital letters.
- Exclude who can see the message.
- Be lengthy.
- Be generic.
- End in an exclamation point.

**Examples:**

    Incorrect:
        This is an example of a bad system notice:

    ..  image:: ../images/systemnotice2.png
        :alt: Bad System Notice


    Correct:
        This is an example of a good system notice:

    ..  image:: ../images/systemnotice1.png
        :alt: Good System Notice

-----

Input: Fields
-------------

Users should enter information into fields without much thinking. Enter button on last input field should trigger default dialog button.

**Example 1:**

    If focus is on the last input field in dialog (“Miller”), hitting Enter triggers the default dialog button (“Send Invitations”)

    ..  image:: ../images/inputField1.png
        :alt: Input Field Enter
        :width: 500 px

**Example 2:**

    Having radio buttons for input options.
    **NOTE**: We should use radio buttons/checkboxes for input options rather than custom bootstrap on/off switches.

    ..  image:: ../images/inputField2.png
        :alt: Radio Buttons
        :width: 500 px

---------------------------

Input: Hints
------------

Mattermost voice for documentation and help text follows this simple guideline: explain something to a user with basic computer skills in simple terms without jargon or complexity.

**Fieldname:**

    The labels on input fields should be clear and concise for the intended user. Consider the surrounding UI for consistent naming of input fields with similar actions.

    Correct:
        Channel URL: The web address used to reach your channel.

    Incorrect:
        Handle: The name of the subdirectory used to navigate to a channel using the site URL appended with the handle name. Must use only valid URL inputs.

    The fieldname of a setting should explicitly describe what a setting affects.

    Correct:
        Automatically expand link previews.

    Incorrect:
        Link previews

**Help text:**

    Text below an input field should clearly and concisely describe the purpose of the input in an active voice.

    In general, avoid describing the technical requirements of the field in Help Text, and use Placeholder input text, field validation and error messages to convey requirements. The exception to this guideline is if requirements are non-obvious, such as passwords needing different numbers of characters, symbols, etc.

    For a setting involving a CONDITION and an ACTION, the help text should be written as "ACTION when/for CONDITION".

    Correct:
        Flash the taskbar icon when a new message is received.

    Incorrect:
        When a new message is received, flash the taskbar icon.

    Ensure plural interpretations work when applicable and test help text with machine translation to reduce non-obvious, English-specific jargon:

    Correct:
        You can adjust a few configuration settings when setting up your instance of Mattermost.

    Incorrect:
        There are a few configuration settings you might want to fiddle with when setting up your instance of Mattermost.

    Note: The incorrect string above machine-translated into German and then back into English becomes: "There are some configuration settings you could know if your instance Matter Most violin".

**Placeholder input text:**

    Show examples of valid input, such as ``name@example.com`` for email addresses, as well as examples of functionality that is not obviously supported. For example, for a channel name field the placeholder input text could be ``Example: Marketing, John’s Room, 中国业务``.

**Field validation:**

    Use field validation to help prevent or correct any mistakes a user might make.

        For **textfields**, restrict users from making entries that are too long by limiting characters via the ``maxlength`` attribute.

        For **textareas**, show a character counter and then a helpful message if the user exceeds the maximum number of characters.

        **Example 1:**

            ..  image:: ../images/valid1.png
                :alt: Character count
                :width: 500 px

            ..  image:: ../images/valid2.png
                :alt: Character count
                :width: 500 px

        **Example 2:**

            If a user enters invalid uppercase letters and spaces for a URL, show an error message and also offer a correction, substituting dashes for spaces and lower case letters for uppercase letters, so that the user can resubmit immediately with valid input.

-----

Input: Input Patterns
---------------------

All inputs such as textareas should behave consistently. If the default behavior is to perform an action on "Enter", then all inputs of that type should be consistent and perform an action on "Enter".

**Example 1:**
    If pressing "Enter" posts a message in the center channel post input...

    ..  image:: ../images/inputBehaviour1.png
        :alt: Center channel post area

**Example 2:**
    ...then pressing "Enter" in the comment thread textarea should also post a comment...

    ..  image:: ../images/inputBehaviour2.png
        :alt: Comment thread textarea

**Example 3:**
    ...and other textareas or inputs should also perform their primary action when "Enter" is pressed. Here's an example of the "Edit Header" modal:

    ..  image:: ../images/inputBehaviour3.png
        :alt: Edit header modal
        :width: 500 px

-----

Input: Validation
-----------------

**Feedback on action:**

User should be notified about the action they perform along with any implications associated with them.

  Example 1:
    "Settings are saved but will be applied after a server restart."

      ..  image:: ../images/confirm2.jpg
          :alt: Settings saved

  Example 2:
    "Link copied to clipboard."

      ..  image:: ../images/confirm1.jpg
          :alt: Confirmation message

**Save prompt:**

A prompt should appear if a user makes changes to a setting and attempts to navigate away without saving them.

  Example:
    "You have unsaved changes, are you sure you want to discard them?"

      ..  image:: ../images/save1.png
          :alt: Save prompt

---------------------------

Menu items
----------

Items in a menu should be grouped together based on the category they belong to. Items per category however should not exceed five, with the exception of seven for the System Console.

**Example:**

    ..  image:: ../images/group.png
        :alt: Center channel post area

-----

Notifications: Header Bar
-------------------------

The header bar appears as a dropdown bar from the top of the screen. The header bar:

1. May include an "x" button to dismiss.
2. Is limited to 60 characters.
3. May include a time-out.
4. Appears over the rest of the UI instead of pushing the UI down.

Multiple headers can appear, with the earliest notification at the top and more recent notifications appearing underneath.

**Desktop**

    ..  figure:: ../images/header1.png
        :alt: Header Notification Desktop

**Mobile**

    ..  image:: ../images/header2.png
        :alt: Header Notification Mobile

There are several modes for this element:

    **System-wide header notification:**

        - Triggered on login.
        - Includes “x” button to dismiss.
        - No timeout.
        - Removed when system admin cancels.

        | Examples:
        | “Try our new Windows App. Click here to download.”,
        | “Scheduled maintenance 2:00am to 2:30am starts in 20 minutes, 3 seconds.”

    **Action required header notification:**

        - Triggered on login.
        - No “x” button to dismiss.
        - No timeout.
        - Dismissed when action completed.

        | Examples:
        | “We’re evolving. Please review and accept our new terms of service.”

    **Persistent issue header notification:**

        - Triggered on issue.
        - No “x” button to dismiss.
        - Dismissed when issue no longer persists.

        | Examples:
        | “You are not connected to the internet.”

-----

Markdown Rendering
---------------------

Markdown rendering in Mattermost is designed to be a fast, obvious and forgiving formatting standard for a messaging application. To achieve this goal, it has variations from markdown in GitHub (the most wildly used implementation), including:

- Bullets directly below a line of text render as a bullet, not as a continued line of text
- {Other variations to be concisely listed here, one line each}

While we intend to eventually document all the variations from GitHub markdown, until that is complete we consider any variation in rendering from the current release of Mattermost to be a regression that should either be fixed prior to the next release, or documented here.

Currently the `/test tool <https://github.com/mattermost/mattermost-server/tree/master/tests>`__ can be used for testing Mattermost markdown versus GitHub markdown.

-----

Organization: Reduce Obvious Steps
----------------------------------

If the action a user needs to perform is obvious, we should make conscious decisions to reduce some of the steps involved in that process.

    **Example 1:**
        Clicking on the search icon on mobile should focus the search bar when it slides in.

        ..  image:: ../images/reduce1.png
            :alt: Search mobile

    **Example 2:**
        Clicking on the reply icon should move the focus to the comment box in the right-hand sidebar.

        ..  image:: ../images/reduce2.png
            :alt: Reply icon

    **Example 3:**
        Switching channels should move the focus to the post box in the center channel.

        ..  image:: ../images/reduce3.png
            :alt: Switching channels

-----

Testing Checklist
-----------------

In addition to above guidelines, the below provides a concrete checklist of mistakes to watch for when reviewing proposed product changes.

User Experience Checklist
~~~~~~~~~~~~~~~~~~~~~~~~~

**1\) Is the WHITESPACE next to icons SUFFICIENTLY SPACED?**

    Example of not enough space next to FLAG icon on RIGHT:

    ..  image:: ../images/fx-guidelines-sufficient-whitespace.png

**2\) Is the WHITESPACE next to icons EVENLY SPACED?**

    Example of uneven icon spacing:

    ..  image:: ../images/fx-guidelines-even-whitespace.png

**3\) Are there visual GAPS?**

    Example of gaps in a visual design:

    ..  image:: ../images/fx-guidelines-visual-gaps.png

**4\) Read all help text OUT LOUD--is it helpful to a new user?**

    Example of help text that doesn't communicate enough information to a user (no information included on how to use flagged posts):

    ..  image:: ../images/fx-guidelines-read-outloud.png

**5\) Does the UI work with a dark theme?**

    Sometimes bugs are found with theme colors, so it is important to test on both light and dark themes.

source/archive/formatting-text.rst METASEP
:nosearch:

Formatting Text
===============

|all-plans| |cloud| |self-hosted|

.. |all-plans| image:: ../images/all-plans-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in Mattermost Free and Starter subscription plans.

.. |cloud| image:: ../images/cloud-badge.png
  :scale: 30
  :target: https://mattermost.com/download
  :alt: Available for Mattermost Cloud deployments.

.. |self-hosted| image:: ../images/self-hosted-badge.png
  :scale: 30
  :target: https://mattermost.com/deploy
  :alt: Available for Mattermost Self-Hosted deployments.

Markdown makes it easy to format messages. Type a message as you normally would, then use these the following formatting syntax to render the message a specific way. For a guide to using Markdown in Mattermost, `see this blog post <https://mattermost.com/blog/laymans-guide-to-markdown-on-mattermost/>`_.

Text Style
----------

You can use either ``_`` or ``*`` around a word or phrase to make it italic, or ``__`` or ``**`` around a word or phrase to make it bold. You can also use common keyboard shortcuts, including CTRL/CMD+B to bold, and CTRL/CMD+I to italicize text. 

* ``*italics*`` (or ``_italics_``) renders as *italics*
* ``**bold**`` renders as **bold**
* ``***bold-italic***`` renders as |bold_italics|
* ``~~strikethrough~~`` renders as |strikethrough|

.. |bold_italics| image:: ../images/bold_italics.png
  :width: 100px
  :alt: Bold Italics
.. |strikethrough| image:: ../images/strikethrough.png
  :width: 100px
  :alt: Strike Through

Links
-----

Create labeled links by putting the desired text in square brackets ``[ ]`` and the associated link in round brackets ``( )``.

``[Check out Mattermost!](https://mattermost.com/)``

Renders as: `Check out Mattermost! <https://mattermost.com/>`__

Headings
--------

Make a heading by typing ``#`` and a space before your title. For smaller headings, use more ``#``'s.

.. code-block:: none

  ## Large Heading
  ### Smaller Heading
  #### Even Smaller Heading

Renders as:

.. image:: ../images/Headings1.png
   :alt: Large Heading

Alternatively, you can underline the text using equal signs ``===`` or hyphens ``---`` to create headings.

.. code-block:: none

  Large Heading
  -------------

Renders as:

.. image:: ../images/Headings2.png
   :alt: Smaller Heading

Lists
-----

Create a list by using asterisks ``*``, hyphens ``-``, and/or plus signs ``+`` interchangeably as bullets. Indent bullet points by adding two spaces in front each one.

.. code-block:: none

  * item one
  - item two
    + item two sub-point

Renders as:

* item one
* item two

  * item two sub-point

Make an ordered list by using numbers instead:

.. code-block:: none

  1. Item one
  2. Item two
  3. item three

Renders as:

#. Item one
#. Item two
#. Item three

You can also start a list at any number:

.. code-block:: none

  4. The first list number is 4.
  1. The second list number is 5.
  1. The third list number is 6.

Renders as:

4. The first list number is 4.
5. The second list number is 5.
6. The third list number is 6.

Make a task list by including square brackets ``[ ]``. Mark a task as complete by adding an ``x``.

.. code-block:: none

  - [ ] Item one
  - [ ] Item two
  - [x] Completed item

Renders as:

.. image:: ../images/checklist.png
   :alt: List

Code Block
----------

Creating a fixed-width code block is recommended for pasting multi-line blocks of code or other text output because it's easier to read with fixed-width font alignment. Examples include block text snippets, ASCII tables, and log files.

This can be accomplished by placing three backticks ``````` on the line directly above and directly below your code:

.. code-block:: none

  ```
  this is my
  code block
  ```

.. tip::

  Type three backticks ```````, press SHIFT+ENTER, ``<type_your_code>``, press SHIFT+ENTER again, then type three more backticks ```````.


Or by indenting each line by four spaces:

.. code-block:: none

      this is my
      code block

  ^^^^ 4x spaces


**Syntax highlighting**

To add syntax highlighting, type the language to be highlighted after the ``````` at the beginning of the code block. Mattermost also offers four different code themes (GitHub, Solarized Dark, Solarized Light, and Monokai) that can be changed in **Settings > Display > Theme > Custom Theme > Center Channel Styles**.

Supported languages and their aliases include:

.. include:: syntax-highlighting.rst

Example:

.. code-block:: none

  ``` go
  package main
  import "fmt"
  func main() {
      fmt.Println("Hello, 世界")
  }
  ```
Renders as:

**GitHub Theme**

.. image:: ../images/syntax-highlighting-github.png
   :alt: Syntax Highlighting in GitHub

**Solarized Dark Theme**

.. image:: ../images/syntax-highlighting-sol-dark.png
   :alt: Syntax Highlighting Dark

**Solarized Light Theme**

.. image:: ../images/syntax-highlighting-sol-light.png
   :alt: Syntax Highlighting Light

**Monokai Theme**

.. image:: ../images/syntax-highlighting-monokai.png
   :alt: Syntax Highlighting Monokai

In-line Code
------------

Create in-line monospaced code text by surrounding it with backticks `````. Don't use single quotes ``'``.

.. code-block:: none

  `monospace`

Renders as: ``monospace``.

In-line Images
--------------

In-line images are images added within lines of text. From Mattermost Server v5.35 and in Mattermost Cloud, you can control whether all in-line images over 100px in height are automatically collapsed or expanded in messages by setting a `user preference <https://docs.mattermost.com/messaging/managing-account-settings.html#website-link-previews>`__, or by using the ``/collapse`` and ``/expand`` slash commands.

To add in-line images to text, use an exclamation mark ``!`` followed by the ``alt text`` in square brackets ``[ ]``, then the ``image URL`` in round brackets ``( )``. You can add hover text after the link by placing the text in quotes ``" "``.

Example:

.. code-block:: none

  ![alt text](URL of image "Hover text")

If the height of the original image is more than 500 pixels, Mattermost sets the image height at 500 pixels and adjusts the width to maintain the original aspect ratio.

You can set the width and height of the displayed image after the URL of the image by using an equals sign ``=`` followed by values for both width and height ``##x##``. If you set only the width, Mattermost adjusts the height to maintain the original aspect ratio.

.. warning::
  The native apps do not support fixed width and height and will display the full-size image.

Examples:

.. code-block:: none

  .. |mattermost-icon-76x76| image:: ../images/icon-76x76.png
  .. |mattermost-icon-50x76| image:: ../images/icon-50x76.png

In-line image with hover text
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: none

  ![Mattermost](../images/icon-76x76.png "Mattermost Icon")

Renders as:

  .. image:: ../images/icon-76x76.png
    :alt: Mattermost

In-line image with link
~~~~~~~~~~~~~~~~~~~~~~~

.. note::
  An extra set of square brackets ``[ ]`` is required around the alt text, and round brackets ``( )`` are required around the image link.

.. code-block:: none

  [![Mattermost](../images/icon-76x76.png)](https://github.com/mattermost/mattermost-server)

Renders as:

  .. image:: ../images/icon-76x76.png
    :target: https://github.com/mattermost/mattermost-server
   
In-line image displayed with fixed width and height
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Example: An in-line image that's 50 pixels wide and 76 pixels high.

.. code-block:: none

  ![Mattermost](../images/icon-76x76.png =50x76 "Mattermost Icon")

Renders as:

  .. image:: ../images/icon-50x76.png
    :alt: Mattermost
    :name: Mattermost Icon 

In-line image displayed with fixed width
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Example: An in-line image that's 50 pixels wide where the system adjusts the height to maintain the original aspect ratio.

.. code-block:: none

  ![Mattermost](../images/icon-76x76.png =50 "Mattermost Icon")

Renders as:

  .. image:: ../images/icon-76x76.png
    :alt: Mattermost
    :width: 50
 
Lines
-----

Create a line by using three ``*``, ``_``, or ``-``.

``***``

Renders as:

---------------------------------------------------------------------------

Block quotes
------------

Create block quotes using ``>``.

``> block quotes`` renders as:

.. image:: ../images/blockQuotes.png

Tables
------

Create a table by placing a dashed line ``---`` under the header row, then separating each column with using pipes ``|``. The columns don’t need to line up exactly. Choose how to align table columns by including colons ``:`` within the header row.

.. code-block:: none

  | Left-Aligned  | Center Aligned  | Right Aligned |
  | :------------ |:---------------:| -----:|
  | Left column 1 | this text       |  $100 |
  | Left column 2 | is              |   $10 |
  | Left column 3 | centered        |    $1 |

Renders as:

.. image:: ../images/markdownTable1.png
   :alt: Markdown Table Sample

Math Formulas
-------------

.. tabs::

  .. tab:: Using Inline LaTeX

    From Mattermost v6.1, you can create formulas that display inline using LaTeX. Use the dollar sign ($) symbol at the beginning and end of each formula.

    .. note::

      This feature is `disabled by default <https://docs.mattermost.com/configure/configuration-settings.html#enable-inline-latex-rendering>`__. Contact your System Admin to enable this setting in **System Console > Site Configuration > Posts** to use this feature.

    .. code-block:: none

      $X_k = \sum_{n=0}^{2N-1} x_n \cos \left[\frac{\pi}{N} \left(n+\frac{1}{2}+\frac{N}{2}\right) \left(k+\frac{1}{2}\right) \right]$
  
    Renders as:

    .. image:: ../images/latex-inline.png
      :alt: An inline LaTeX math equation sample.
      
  .. tab:: Using LaTeX in Code Blocks

    Create formulas as code blocks by using LaTeX in a ``latex`` `Code Block`_. 

    .. note::

      This feature is `disabled by default <https://docs.mattermost.com/configure/configuration-settings.html#enable-latex-code-block-rendering>`__. Contact your System Admin to enable this setting in **System Console > Site Configuration > Posts** to use this feature.

    .. code-block:: none

      ```latex
      X_k = \sum_{n=0}^{2N-1} x_n \cos \left[\frac{\pi}{N} \left(n+\frac{1}{2}+\frac{N}{2}\right) \left(k+\frac{1}{2}\right) \right]
      ```

    Renders as:

    .. image:: ../images/latex-codeblock.png
      :alt: A LaTeX code block math equation sample.

  

source/archive/field.png METASEP

source/archive/feature-release.rst METASEP
:nosearch:

Feature Release Process
==========================

This page has moved to the `Mattermost Handbook <https://handbook.mattermost.com/operations/research-and-development/product/release-process/feature-release>`__.

source/archive/extending-channels-with-integrations.rst METASEP
:nosearch:

Extending Channels with Integrations
====================================

Access settings for integrations from the **Product menu**. Select **Integrations** to open a page where you can view and configure incoming webhooks, outgoing webhooks, and slash commands for your team. If you can't see an **Integrations** option, then your System Admin may limit access to System Admins only.

`Visit our Marketplace <https://mattermost.com/marketplace/>`__ for dozens of open source integrations to common tools like Jira, Jenkins, GitLab, Trac, Redmine, and Bitbucket, along with interactive bot applications (Hubot, mattermost-bot), and other communication tools (Email, IRC, XMPP, Threema) that are freely available for use and customization.

Microsoft integrations
-----------------------

There are several ways to connect your Microsoft tools to Mattermost. Take a look at the tools recommended below, or visit our `Mattermost Marketplace <https://mattermost.com/marketplace/>`__ to find more.

Office 365 Calendar 
~~~~~~~~~~~~~~~~~~~

|enterprise| |professional| |cloud| |self-hosted|

.. |all-plans| image:: ../images/all-plans-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in Mattermost Free and Starter subscription plans.

.. |enterprise| image:: ../images/enterprise-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in the Mattermost Enterprise subscription plan.

.. |professional| image:: ../images/professional-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in the Mattermost Enterprise subscription plan.

.. |cloud| image:: ../images/cloud-badge.png
  :scale: 30
  :target: https://mattermost.com/download
  :alt: Available for Mattermost Cloud deployments.

.. |self-hosted| image:: ../images/self-hosted-badge.png
  :scale: 30
  :target: https://mattermost.com/deploy
  :alt: Available for Mattermost Self-Hosted deployments.

The Microsoft Office 355 Calendar integration enables two-way integration between Mattermost and Office 365 Calendar, and was developed by Mattermost. This integration enables you to:

- Receive a daily summary of calendar events, and accept or decline new events.
- Reflect user status as "Do Not Disturb" when in a meeting scheduled via Outlook Calendar.

Visit the `Mattermost Marketplace <https://mattermost.com/marketplace/>`__ to install, configure, and use this integration.

Skype for Business
~~~~~~~~~~~~~~~~~~

|all-plans| |cloud| |self-hosted|

The Skype for Business integration supports a vendor-hosted cloud solution, and enables you to:

- Start and join voice calls, video calls, and use screen-sharing with your team members. Developed by kosgrz and maintained by Mattermost.
- Select a video icon in a Mattermost channel to invite team members to join a Skype for Business call, hosted using the credentials of the user who initiated the call.

Visit the `Mattermost Marketplace <https://mattermost.com/marketplace/>`__ to install, configure, and use this integration. See the `source code <https://github.com/mattermost/mattermost-plugin-skype4business>`__ for more information.

Office 365 SSO
~~~~~~~~~~~~~~

|enterprise| |professional| |cloud| |self-hosted|

The Office 365 SSO integration Supports Microsoft Active Directory Tenants for team creation, account creation, and Single Sign-On (SSO). This integration enables you to:

- Configure Mattermost to use your Office 365 credentials and Azure Active Directory account as a single sign-on (SSO) service, developed by Mattermost.
- Receive a daily summary of calendar events, and accept or decline new events.

Visit the `Mattermost Marketplace <https://mattermost.com/marketplace/>`__ to install, configure, and use this integration.

CI/CD integrations
-------------------

There are several ways to connect your CI/CD tools to Mattermost. Take a look at the tools recommended below, or visit the `Mattermost Marketplace <https://mattermost.com/marketplace/>`__ to find more.

GitHub 
~~~~~~

|all-plans| |cloud| |self-hosted|

The GitHub integration supports GitHub Enterprise, and works with Saas and Enterprise versions of GitHub. This integration enables two-way integration between Mattermost and GitHub, and was developed by Mattermost. This integration enables you to:

- Get reminders on issues and pull requests that need your attention.
- Get notifications in Mattermost about mentions, review requests, and comments.

Visit the `Mattermost Marketplace <https://mattermost.com/marketplace/>`__ to install, configure, and use this integration. Please see the `source code <https://github.com/mattermost/mattermost-plugin-github>`__ for more information.

GitLab
~~~~~~

|all-plans| |cloud| |self-hosted|

The GitLab integration supports SaaS and on-prem versions of GitLab. This integration enables two-way integration between Mattermost and GitLab,  was developed by Romain Maneschi, and is supported by Mattermost. This integration enables you to:

- Get reminders on issues and merge requests that need your attention.
- Get notifications in Mattermost about mentions, review requests, and comments.

Visit the `Mattermost Marketplace <https://mattermost.com/marketplace/>`__ to install, configure, and use this integration. Please see the `source code <https://github.com/mattermost/mattermost-plugin-gitlab>`__ for more information.

Atlassian integrations
-----------------------

There are several ways to connect Atlassian tools to Mattermost. Take a look at the tools recommended below, or visit the `Mattermost Marketplace <https://mattermost.com/marketplace/>`__ to find more.

Confluence
~~~~~~~~~~

|all-plans| |cloud| |self-hosted|

The Confluence integration supports Confluence Cloud, Server, and Data Center platforms. This integration is an Atlassian Marketplace application for Confluence and Mattermost, and was developed by codefortynine. This integration enables you to:

- Send notifications about page, blogpost, question, or comment updates from your Confluence spaces to Mattermost channels.
- Configure notifications for a specific space, and also user notifications for tasks and mentions.

Download and review the documentation from the `Atlassian Marketplace <https://marketplace.atlassian.com/apps/1222417/mattermost-connector-for-confluence>`__.

Jira
~~~~

|all-plans| |cloud| |self-hosted|

The Jira integration supports Jira Core and Jira Software products for Cloud, Server, and Data Center platforms. This plugin enables two-way integration between Mattermost and Jira, and was developed by Mattermost. This integration enables you to:

- Send event notifications from your Jira projects to Mattermost channels, with full JQL filtering support.
- Create and transition Jira issues, and attach Mattermost messages to Jira in the Mattermost user interface.

Please see the `source code and documentation <https://github.com/mattermost/mattermost-plugin-jira>`__ for more information.

Productivity integrations
--------------------------

There are several ways to connect your productivity tools to Mattermost. Take a look at the tools recommended below, or visit the `Mattermost Marketplace <https://mattermost.com/marketplace/>`__ to find more.

Google Calendar
~~~~~~~~~~~~~~~

|all-plans| |cloud| |self-hosted|

The Google Calendar integration is a time management tool developed by Wasim Thabraze. This integration enables you to get reminders about appointments and meetings from a configured Google Calendar in any Mattermost channel.

Please see `source code and documentation <https://github.com/waseem18/mattermost-plugin-google-calendar>`__ for more information.

Remind
~~~~~~

|all-plans| |cloud| |self-hosted|

The Remind integration sets one-time or recurring events, tasks, and reminders for users in any Mattermost channel, and was developed by Scott Lee Davis.

Please see the `source code and documentation <https://github.com/scottleedavis/mattermost-plugin-remind>`__ for more information.

Voice, video, and screensharing integrations
--------------------------------------------

There are several ways to work with voice, video, and screensharing in Mattermost. Take a look at the tools recommended below, or visit the `Mattermost Marketplace <https://mattermost.com/marketplace/>`__ to find more.

Zoom
~~~~~

|all-plans| |cloud| |self-hosted|

The Zoom integration was developed by Mattermost, and requires one paid `Zoom Pro, Business, Education, or API plan <https://zoom.us/pricing>`__ to generate an API key and secret. It supports a self-hosted cloud solution and a vendor-hosted cloud solution. This integration enables you to:

- Start and join voice calls, video calls, and use screensharing with your team members.
- Select a video icon in a Mattermost channel to invite team members to join a Zoom call, hosted using the credentials of the user who initiated the call.
 
Please see the `documentation <https://mattermost.gitbook.io/plugin-zoom/>`__ and the `source code <https://github.com/mattermost/mattermost-plugin-zoom>`__ for more information.

Microsoft Teams Meetings
~~~~~~~~~~~~~~~~~~~~~~~~

|enterprise| |professional| |cloud| |self-hosted|

The Microsoft Teams Meetings integration was developed by Mattermost, and requires a Microsoft Teams account. This integration enables you to:

- Start and join voice calls, video calls, and use screensharing with your team members.
- Select a video icon in a Mattermost channel to invite team members to join a Microsoft Teams Meeting, hosted using the credentials of the user who initiated the call.

Please see the `source code and documentation <https://github.com/mattermost/mattermost-plugin-msteams-meetings>`__ for more information.

Bot integrations
-----------------

There are several ways to connect bots with Mattermost. Take a look at the tools recommended below, or visit the `Mattermost Marketplace <https://mattermost.com/marketplace/>`__ to find more.

WelcomeBot
~~~~~~~~~~

|all-plans| |cloud| |self-hosted|

The WelcomeBot integration welcomes users to your Mattermost instance, and was developed by Mattermost. This integration enables you to add a Welcome Bot that helps add new team members to channels to improves onboarding and HR processes.

Please see the `source code and documentation <https://github.com/mattermost/mattermost-plugin-welcomebot>`__ for more information. 

Sample Golang bot
~~~~~~~~~~~~~~~~~~

|all-plans| |cloud| |self-hosted|

The Sample Goland Bot integration is a sample bot for Go driver, and was developed by Mattermost. This integration enables you to:

- Learn how to use the Mattermost Go driver to interact with a Mattermost server, listen to events, and respond to messages.
- Use the API for simple tasks, such as logging in to your server, creating a channel, and posting a message.

Please see the `source code and documentation <https://github.com/mattermost/mattermost-bot-sample-golang>`__ for more information.

Hubot adapter
~~~~~~~~~~~~~

|all-plans| |cloud| |self-hosted|

The Hubot Adapter integration for Mattermost was written in JavaScript, uses Web API and Websockets, and was developed by Andy Lo-A-Foe. This integration enables you to:

- Use the bot to listen for commands and to execute actions based on your requests.
- Invite your bot to any Mattermost channel just like a regular user.

Please see the `source code and documentation <https://github.com/loafoe/hubot-matteruser>`__ for more information. 

Incoming webhooks
-----------------

|all-plans| |cloud| |self-hosted|

Incoming webhooks from external integrations can post messages to Mattermost in Public and Private channels. Learn more about setting up incoming webhooks in our `developer documentation  <https://developers.mattermost.com/integrate/admin-guide/admin-webhooks-incoming/>`__.

Outgoing webhooks
-----------------

|all-plans| |cloud| |self-hosted|

Outgoing webhooks use trigger words to fire new message events to external integrations. For security reasons, outgoing webhooks are only available in Public channels. Learn more about setting up outgoing webhooks in our `developer documentation <https://developers.mattermost.com/integrate/other-integrations/outgoing-webhooks/>`__.

Slash commands
---------------

|all-plans| |cloud| |self-hosted|

Slash commands allow users to interact with external applications by typing ``/`` followed by a command. See the `Executing Slash Commands <https://docs.mattermost.com/messaging/executing-slash-commands.html>`__ product documentation for a list of built-in commands. 

Learn more about setting up custom slash commands in our `developer documentation <https://developers.mattermost.com/integrate/other-integrations/slash-commands/>`__.
source/archive/executing-slash-commands.rst METASEP
:nosearch:

Executing Slash Commands
========================

|all-plans| |cloud| |self-hosted|

.. |all-plans| image:: ../images/all-plans-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in Mattermost Free and Starter subscription plans.

.. |cloud| image:: ../images/cloud-badge.png
  :scale: 30
  :target: https://mattermost.com/download
  :alt: Available for Mattermost Cloud deployments.

.. |self-hosted| image:: ../images/self-hosted-badge.png
  :scale: 30
  :target: https://mattermost.com/deploy
  :alt: Available for Mattermost Self-Hosted deployments.

Slash commands perform operations in Mattermost by typing into the text input box. Enter a ``/`` followed by a command and some arguments to perform actions.

Built-in slash commands come with all Mattermost installations and custom slash commands are configurable to interact with external applications. Learn about configuring custom slash commands on the `developer slash command documentation page <https://developers.mattermost.com/integrate/other-integrations/slash-commands/>`__.

Built-in Commands
-----------------

The following slash commands are available on all Mattermost installations:

.. csv-table::
    :header: "Command", "Description", "Example"

    "/away", "Set your availability to away", "/away"
    "/offline", "Set your availability to offline", "/offline"
    "/online", "Set your availability to online", "/online"
    "/dnd", "Set your availability to Do Not Disturb", "/dnd"
    "/code *{text}*", "Display text as a code block", "/code File bugs"
    "/collapse", "Turn on auto-collapsing of image previews, image attachments, as well as `in-line images <https://docs.mattermost.com/help/messaging/formatting-text.html#in-line-images>`__ over 100px in height", "/collapse"
    "/expand", "Turn off auto-collapsing of image previews, image attachments, as well as `in-line images <https://docs.mattermost.com/help/messaging/formatting-text.html#in-line-images>`__ over 100px in height", "/expand"
    "/echo *{message}* *{delay in seconds}*", "Echo back text from your account", "/echo Hello World 5"
    "/header *{text}*", "Edit the channel header", "/header File bugs here"
    "/invite *@{user}* *~{channel-name}*", "Invite user to the channel","/invite @john ~sampleChannel"
    "/purpose *{text}*", "Edit the channel purpose", "/purpose A channel to discuss bugs"
    "/rename *{text}*", "Rename the channel", "/rename Developers"
    "/help", "Open the Mattermost help page", "/help"
    "/invite_people *{name@domain.com ...}*", "Send an email invite to your Mattermost team","/invite_people john@example.com"
    "/kick *{@username}*", "Remove a member from a public or private channel", "/kick @alice"
    "/remove *{@username}*", "Remove a member from a public or private channel", "/remove @alice"
    "/join *{channel-name}*", "Join the open channel", "/join off-topic"
    "/open *{channel-name}*", "Join the open channel", "/open off-topic"
    "/leave", "Leave the current channel", "/leave"
    "/mute", "Turns off desktop, email and push notifications for the current channel or the [channel] specified", "/mute ~[channel]"
    "/logout", "Log out of Mattermost", "/logout"
    "/me *{message}*", "Do an action", "/me Hello World"
    "/msg *{@username}* *{message}*", "Send a Direct Message to a user", "/msg @alice hello"
    "/groupmsg *{@username1, @username2, ...}* *{message}*", "Sends a Group Message to the specified users", "/groupmsg @alice, @bob hello"
    "/search *{text}*", "Search text in messages", "/search meeting"
    "/settings", "Open the Settings dialog", "/settings"
    "/shortcuts", "Display a list of keyboard shortcuts", "/shortcuts"
    "/shrug *{message}*", "Add ``¯\_(ツ)_/¯`` to your message", "/shrug oh well"
    "/status *{emoji_name}* *{descriptive status_message}* *", Set a custom status that includes an optional emoji and a descriptive status message, "/status sick Feeling unwell and taking time off to recover" 
    "/status clear * ", Clear the current status, "/status clear" 

Begin by typing `/` and a list of slash command options appears above the text input box. The autocomplete suggestions help by providing a format example in black text and a short description of the slash command in grey text.

.. image:: ../images/slash-commands.gif
    :alt: Enter slash commands in the message field.

.. note::
  Custom status slash commands marked with an asterisk (*) in the table above will be available in the Mattermost Mobile App in a future release.

Custom Commands
---------------

Custom slash commands integrate with external applications. For example, a team might configure a custom slash command to check internal health records with `/patient joe smith` or check the weekly weather forecast in a city with `/weather toronto week`. Check with your System Admin or open the autocomplete list by typing `/` to determine if your team configured any custom slash commands.

Custom slash commands are disabled by default and can be enabled by the System Admin by going to **System Console** > **Integrations** > **Integration Management**. Learn about configuring custom slash commands on the `developer slash command documentation page <https://developers.mattermost.com/integrate/other-integrations/slash-commands/>`__.

source/archive/enterprise-deployment-guide.rst METASEP
:nosearch:

Enterprise Deployment Guide
===========================

About This Guide
----------------

Audience: IT Leaders, System Administrators, and/or Project Managers

.. note::
    Some features described in this guide are only available to Enterprise Edition E10 and/or E20. We will highlight specific licenses needed whenever applicable.

Learning Objectives
-------------------

This guide provides foundational information necessary when developing a plan for a proof of concept and/or production-level enterprise deployment of Mattermost.

It will not dive into the technical implementation, but will reference any relevant documentation.

By the end of this guide you should have an understanding of the high-level requirements for a successful Mattermost Enterprise deployment.

This includes:

- Choosing how to deploy the Mattermost Server application.
- Migrating from other ChatOps platforms.
- Integrating Mattermost with existing Single sign-on (SSO) providers.
- First steps/best practices for onboarding users.

Support
-------

If at any point you need additional help, we are ready to assist, just reach out using any of these methods:

- `Community <https://community.mattermost.com/>`_ - Our entire organization uses Mattermost, plus you’ll have the support of one of the best open source communities around.
- Documentation - We link to many parts of our `Administrator documentation <https://docs.mattermost.com/guides/administrator.html>`_ in this guide but encourage you to take a look at `all our documentation <https://docs.mattermost.com>`_.
- Enterprise Support  - If you are an Enterprise Edition subscriber, you may open a support ticket in the Enterprise Edition Support portal.

.. Recommendation::
    Visit the `Mattermost Community server <https://community.mattermost.com/>`_ and create an account. Join channel `Ask Anything <https://community.mattermost.com/core/channels/ask-anything>`_ to not only experience Mattermost right away but also for support if you get stuck at any point in this guide.

Before You Begin Your Deployment
--------------------------------

What Makes Mattermost Different?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost is a high-trust messaging platform for enterprise use. As enterprises come in all shapes and sizes, Mattermost has been built to provide an optimal experience for all customers.

The emergence of `ChatOps <https://mattermost.com/chatops>`_ means Mattermost is no longer a tool predominantly used by developers. In fact, it has the ability to enhance communication for many kinds of teams through a multitude of `integrations <https://integrations.mattermost.com>`_, extensions, and customization.

Here is a sample of the types of integrations our customers are deploying:

- Confluence
- Docker
- GitHub/GitLab
- Jira
- Outlook
- Trello

Taking this further, because Mattermost is an open source application, it can be customized, in many ways, to suit your organizational needs.

Mattermost Scaling
------------------

Growing your Mattermost installation from supporting a team to supporting an enterprise requires two types of `scaling <https://docs.mattermost.com/scale/scaling-for-enterprise.html>`_.

**Technical Scaling:** Whether used for teams or enterprises, the Mattermost server is designed to support tens of thousands of users on a single server with appropriate hardware. We officially support running Mattermost Server on multiple `Linux distributions and on-premises cloud solutions <https://docs.mattermost.com/guides/deployment.html>`_.

**Functional Scaling:** Scaling from a team to an enterprise is like going from a "virtual office" to a "virtual campus". Advanced features like enterprise authentication, granular permissions, compliance and auditing, and advanced reporting become increasingly important as organizations grow beyond teams.

Mattermost Licensing
--------------------

Mattermost Enterprise Edition comes with two licensing options: Enterprise E10 and Enterprise E20.

The E10 license suits smaller organizations with less need for automation and compliance, while the E20 license offers features like AD/LDAP, SAML 2.0, automated compliance export, and team-specific permissions. You can find a full comparison `here <https://mattermost.com/pricing-feature-comparison>`_.

Once you have installed and deployed Mattermost, activate your Enterprise E20 trial license via **Main Menu > System Console > Edition and License** and select **Start trial**.

.. Note::
    You can purchase and manage your Mattermost Enterprise subscriptions with our `Customer Portal <https://customers.mattermost.com/login>`_ or reach out to our Sales team by contacting sales@mattermost.com.

Client Usage
------------

Depending on your environment and your users, you have several options when deploying Mattermost: web browser, `desktop <https://docs.mattermost.com/install/desktop.html>`_, `mobile <https://docs.mattermost.com/mobile/mobile-overview.html>`_, or all three. We `provide binaries <https://mattermost.com/download/#mattermostApps>`_ for MS Windows, macOS, Linux, iOS, and Android. However, depending on your organization policies deployment on these platforms can vary.

Deployment First Steps
----------------------

Deploying Mattermost with an enterprise environment is not a small project. Depending on your use case multiple physical machines have to be set up with Mattermost server, a proxy, and a database while thousands of users need to be imported through AD/LDAP. While we strive to make this as easy as possible it will take time and iteration.

Determine Your Use Case
~~~~~~~~~~~~~~~~~~~~~~~

As mentioned above it is essential for a successful deployment to know your specific use case. To get started try answering the following questions:

- How many users will use Mattermost on initial deployment and is this number going to increase dramatically in the near future?
- What clients will be in use?
- Are you migrating from an existing ChatOps or different communications platform?
- Are you using an identity provider for Single sign-on and if yes which one?
- What compliance requirements do you need to meet?
- What are your organization's security requirements?

Planning Your Deployment
------------------------

Technical Requirements
~~~~~~~~~~~~~~~~~~~~~~

The hardware requirements for the Mattermost server and database `grow based on the number of users <https://docs.mattermost.com/install/requirements.html>`_.

Depending on which clients your users will work with additional reading can be necessary:
- You are going to use the web app - no further reading required.
- You are going to use the desktop app - please also read `Desktop Application Install Guides <https://docs.mattermost.com/install/desktop.html>`_.
- You are going to use the mobile app - please also read `Mobile App Deployment Guide <https://docs.mattermost.com/deploy/mobile-overview.html>`_.

Migration
---------

When migrating from an existing solution it is important to plan ahead. We recommend starting with a small dataset - limited users and content - to reduce the time spent debugging and ensuring all fields are imported correctly, before taking on a major import.

We provide our customers with easy to use migration solutions for many scenarios:

- Mattermost - Migrating from Mattermost Team Edition is common and only requires you to `upgrade to the most recent Enterprise Edition <https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html#upgrading-team-edition-to-enterprise-edition>`_ and add your license key.
- Slack - There is support for two methods of importing data from Slack.
    - For small datasets with few users and without post attachments the `Mattermost web app can be used <https://docs.mattermost.com/onboard/migrating-to-mattermost.html>`_.
    - If at all possible we recommend the use of `Mattermost CLI for the migration process <https://docs.mattermost.com/onboard/migrating-to-mattermost.html#migrating-from-slack-using-the-mattermost-cli>`_.
- HipChat - We recommend using `Group Export Dashboard <https://docs.mattermost.com/onboard/migrating-from-hipchat-to-mattermost.html>`_ to export your data in combination with the `Mattermost Bulk Load Tool <https://docs.mattermost.com/onboard/bulk-loading-data.html>`_.
- Jabber - You can use `BrightScout’s Extract, Transform and Load (ETL) <https://github.com/Brightscout/mattermost-etl>`_ tool to migrate from Jabber.
- Bespoke Messaging Solutions - Mattermost is designed to replace bespoke messaging solutions and provide additional `security features <https://docs.mattermost.com/about/security.html>`_, but migrating from bespoke messengers can prove to be challenging, because the data format of such tools is unpredictable. Nonetheless we provide `multiple tools <https://docs.mattermost.com/onboard/migrating-to-mattermost.html#migrating-from-bespoke-messaging-solutions-to-mattermost>`_ to attempt migration and have had many successful migrations with our customers.

.. Note::
    If your data in the bespoke messenger is not vital we recommend a hard switch after a period of running both systems in parallel.

Single Sign-On
--------------

Mattermost can act as a `SAML 2.0 <https://docs.mattermost.com/onboard/sso-saml.html>`_ provider so setting up Single sign-on is a straightforward matter.

We support these SSO services:

- `OneLogin <https://docs.mattermost.com/onboard/sso-saml-onelogin.html>`_
- `Okta <https://docs.mattermost.com/onboard/sso-saml-okta.html>`_
- `GitLab <https://docs.mattermost.com/onboard/sso-gitlab.html>`_
- `Google People API <https://docs.mattermost.com/onboard/sso-google.html>`_
- `AD/LDAP <https://docs.mattermost.com/onboard/ad-ldap.html>`_
- `Azure Active Directory and Office 365 <https://docs.mattermost.com/onboard/sso-office.html>`_
- `Microsoft ADFS <https://docs.mattermost.com/onboard/sso-saml-adfs-msws2016.html>`_

Compliance
----------

When you have to meet compliance requirements - especially when working with proxies - make sure to plan ahead to avoid infrastructure redesign while deploying Mattermost. Here is how Mattermost supports your compliance needs:

- Outbound Proxy - In some scenarios, like monitoring outbound traffic or controlling which websites can appear in link previews, you may wish to `use Mattermost behind a proxy <https://docs.mattermost.com/install/outbound-proxy.html>`_.
- Electronic Discovery - Electronic Discovery (eDiscovery) is the process of searching electronic data to be used as evidence in a legal case. We have put together the `eDiscovery documentation <https://docs.mattermost.com/comply/electronic-discovery.html>`_ to help.
- Compliance Export - This feature enables `Compliance Exports <https://docs.mattermost.com/comply/compliance-export.html>`_ to be produced from the System Console, containing all messages.
- Data Retention - By default, Mattermost provides unlimited search history storing all messages without an expiration date. These defaults can be `changed by setting Message Retention and File Retention <https://docs.mattermost.com/comply/data-retention-policy.html>`_ to a specific duration in the System Console.
- Custom Terms of Service - If your organization requires the use of `custom ToS <https://docs.mattermost.com/comply/custom-terms-of-service.html>`_, this can be done in the System Console.

Security
--------

Security is a major concern with regard to selecting the right tools. Mattermost software is continually reviewed for security by developers, IT administrators, and security researchers. In contrast to SaaS solutions Mattermost can be deployed on-premises in your private cloud giving you full control of not only the software but the hardware side as well. Here is a non-exhaustive list of our security features:

- Private cloud deployment
- Secure mobile apps
- Transmission security
- Integrity and audit controls
- Authentication safeguards
- Access Control Policy
- More details on this topic are available at the `Mattermost security <https://docs.mattermost.com/overview/security.html>`_ section in our documentation.
- HIPAA und FINRA - Mattermost can be deployed `Health Insurance Portability and Accountability Act - HIPAA <https://docs.mattermost.com/overview/security.html#hipaa-compliance>`_ and `Financial Industry Regulatory Authority - FINRA <https://docs.mattermost.com/overview/security.html#finra-compliance>`_ compliant.
- Certificate-Based Authentication - `Certificate-Based Authentication <https://docs.mattermost.com/onboard/certificate-based-authentication.html>`_ is available as an experimental feature.
- Multi-factor Authentication - Mattermost supports `multi factor authentication <https://docs.mattermost.com/onboard/multi-factor-authentication.html>`_.

User Onboarding and Adoption
----------------------------

Integrations and Plugins
~~~~~~~~~~~~~~~~~~~~~~~~

On the first look considering `integrations <https://mattermost.com/marketplace/>`_ and `plugins <https://developers.mattermost.com/integrate/admin-guide/admin-plugins-beta/>`_ as part of the deployment might seem counterintuitive. But they are essential parts of the adoption process, empowering your organization to better understand the tools used by each department.

When choosing integrations and plugins for your deployment, focus on those bringing value to the organization. For example, if your organization is mostly working remotely the Zoom plugin might be essential, whereas a single office organization might not need it but heavily relies on Outlook integration.

Notifications
~~~~~~~~~~~~~

Notifications have gained importance in our daily lives. Modern operating systems all have a way to point the user's attention towards important events from specific apps. There are three different types of notifications in Mattermost: desktop, email, and mobile push notifications. Mattermost will notify you of messages with any of these characteristics:

- Direct Messages.
- Your username or first name is mentioned in a channel.
- A channel you’re in is notified with @channel, @here, or @all.
- Any of `your configured keywords <https://docs.mattermost.com/help/settings/account-settings.html#words-that-trigger-mentions>`_ are used.

.. note::
    
    All notification behavior can be controlled globally or individually by channel. Desktop, email, and mobile push notifications have separate settings.

source/archive/end-user-documentation.rst METASEP
:nosearch:

Creating and Editing Mattermost User’s Guide
=============================================

This page has moved to the `Mattermost Handbook <https://handbook.mattermost.com/operations/operations/company-processes/publishing/publishing-guidelines/voice-tone-and-writing-style-guidelines/documentation-style-guide#document-structure>`_.

source/archive/embedding.rst METASEP
:nosearch:

Embedding Mattermost in other applications
==========================================

This guide discusses how to embed Mattermost into other applications in different ways.

.. contents::
    :backlinks: top

Launching Mattermost from a button click
----------------------------------------

The most common way of integrating Mattermost into another application is via a link or a button that brings up Mattermost in a new browser window or tab, with a link to a specific Mattermost channel to begin discussion.

Optionally, Single Sign-On can be added to make the experience seamless.

Mattermost launch button example in HTML 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Save the below HTML code in a file called ``mattermost-button-example.html`` then open the file in a browser as an example.

.. code-block:: html

  <script>
      var myWindow = null;

      function openMMWindow() {
          myWindow = window.open("https://community.mattermost.com/core/channels/developer", "Mattermost", "top=0,left=0,width=400,height=600,status=no,toolbar=no,location=no,menubar=no,titlebar=no");
      }

      function closeMMWindow() {
          if (myWindow) {
              myWindow.close();
          }
      }
  </script>

  <html>
      <br/>
      <br/>
      <button onclick="openMMWindow()">Open Developer Channel</button>
      <br/>
      <br/>
      <button onclick="closeMMWindow()">Close Developer Channel</button>
      <br/>
      <br/>
  </html>

Embedding Mattermost in web applications using an iframe
---------------------------------------------------------

Any web application embedded into another using an iframe is at risk of security exploits, since the outer application intercepts all user input into the embedded application, an exploit known as `Click-Jacking <https://en.wikipedia.org/wiki/Clickjacking>`__. By default, Mattermost disables embedding. If you choose to embed Mattermost we highly recommend it is done only on a private network that you control.

See `this recipe <https://forum.mattermost.com/t/recipe-embedding-mattermost-in-web-applications-using-an-iframe-unsupported-recipe/10233>`__ for details.

Embedding Mattermost in mobile applications
--------------------------------------------

The open source mobile applications can serve as a guide or starter code to embed Mattermost in mobile applications. The Mattermost Javascript Driver is used to connect with the Mattermost server and product the interactivity for these applications.

The mobile applications also provide full source code for push notifications.

Mobile applications offering Mattermost as a web view 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- https://github.com/mattermost/ios
- https://github.com/mattermost/android

Mobile applications offering Mattermost with React Native components 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

https://github.com/mattermost/mattermost-mobile

source/archive/ee-prod-ubuntu.rst METASEP
:nosearch:

Please see :doc:`install-ubuntu-1404`.

source/archive/ee-prod-ubuntu-1804.rst METASEP
:nosearch:

Please see :doc:`../install/install-ubuntu-1604`.

source/archive/ee-prod-ubuntu-1604.rst METASEP
:nosearch:

Please see :doc:`install-ubuntu-1604`.

source/archive/ee-prod-rhel-8.rst METASEP
:nosearch:

Please see :doc:`install-rhel-8`.

source/archive/ee-prod-rhel-7.rst METASEP
:nosearch:

Please see :doc:`install-rhel-7`.

source/archive/ee-prod-rhel-6.rst METASEP
:nosearch:

Please see :doc:`install-rhel-6`.

source/archive/ee-prod-debian.rst METASEP
:nosearch:

Please see :doc:`install-debian`.

source/archive/ee-prod-debian-88.rst METASEP
:nosearch:

Please see :doc:`install-debian`.

source/archive/education.rst METASEP
:nosearch:

Training and Education
=======================

Training and educational material to help you get the most out of your Mattermost deployment.

   - `System Admin courses <https://academy.mattermost.com/>`_ to help administrators set up, configure, and extend Mattermost.
   - `User training videos <https://www.youtube.com/channel/UCNR05H72hi692y01bWaFXNA/videos>`_ for System Admins and users to get the most value out of Mattermost.
   - `Developer talks <https://www.youtube.com/channel/UCNR05H72hi692y01bWaFXNA/search?query=dev>`_ about the architecture, design principles, and tools used for the open source Mattermost project.

source/archive/downloading-support-packet.rst METASEP
:nosearch:

Downloading a support packet
============================

.. include:: common-support-packet.rst
source/archive/dot-release.rst METASEP
:nosearch:

Dot Release Process
==========================

This page has moved to the `Mattermost Handbook <https://handbook.mattermost.com/operations/research-and-development/product/release-process/dot-release>`__.

source/archive/documentation-guidelines.rst METASEP
:nosearch:

========================
Documentation Guidelines
========================

The Mattermost Style Guide is in the process of being migrated to the `Mattermost Handbook <https://handbook.mattermost.com/operations/operations/publishing/publishing-guidelines/voice-tone-and-writing-style-guidelines/documentation-style-guide>`_. It acts as a reference for writers and editors to ensure that the Mattermost documentation is consistent and clear.

.. Note::
  This guide is not intended to slow down or otherwise impede contributions, which are always welcome. No contribution will be rejected due to non-conforming style, although it might be edited.

.. contents::
  :backlinks: top
  :local:

.. include:: sg_general-guidelines.rst
.. include:: sg_document-structure.rst
.. include:: sg_grammar-spelling-mechanics.rst
.. include:: sg_rest_markup.rst

source/archive/documentation-UItext-guidelines.rst METASEP
:nosearch:

User Interface Text Guidelines
===============================

This page has moved to the `Mattermost handbook <https://handbook.mattermost.com/operations/research-and-development/product/development-process/user-interface-text-guidelines>`_.

source/archive/devops-command-center.rst METASEP
:nosearch:

Mattermost Incident Collaboration
=================================

*Available in Mattermost Enterprise Edition E20, Mattermost Cloud Professional, and Mattermost Cloud Enterprise.*

Incidents are situations which require an immediate response, and incidents benefit from a clearly defined process that guides toward resolution. Mattermost Incident Collaboration equips your team to coordinate, manage, and resolve incidents from within Mattermost:

* Starting an incident automatically creates a dedicated incident channel to coordinate discussion. 
  
  - Use custom categories in the channel sidebar to streamline access to ongoing incidents.

* Playbooks define the tasks toward resolution as your team manages the incident.
  
  - Define your playbooks in advance with automated actions such as creating a Jira ticket, starting a Zoom call, or finding out who is on-call in Opsgenie.

* Reviewing the timeline and conversation helps refine the process for future such incidents.
  
  - Export the incident channel conversation to conduct a post-mortem review.

Delivering more reliable services requires an efficient resolution process. Use Mattermost Incident Collaboration not only to resolve incidents more efficiently, but also to learn from past incidents and refine the process your team relies upon for success.

.. contents::
  :depth: 1
  :local:
  :backlinks: entry
  
Installing Mattermost Incident Collaboration
--------------------------------------------

*For Cloud deployments*

Mattermost Incident Collaboration is included in the Mattermost Cloud workspace, enabled by default, and upgraded automatically.

*For self-managed deployments*

Mattermost Incident Collaboration is available in the Plugin Marketplace:

1. As a System Admin, go to **Main Menu > Plugin Marketplace**.
2. Search for **Incident Collaboration**.
3. Select **Install** if not yet installed, then select **Configure** to enable.
4. From the plugin configuration page, set **Enable Plugin** to **true**.
5. Select **Save** to enable the plugin.

Getting Started with Mattermost Incident Collaboration
------------------------------------------------------

Mattermost Incident Collaboration has the following components:

* **Incidents** are situations that require an immediate response. Every reported incident results in a newly-created, public or private incident channel exposing a custom user interface for collaboration and resolution.
* **Playbooks** define the process to guide an incident toward resolution. Playbooks are created in advance by defining the tasks, checklists, and other configuration used during an incident.
* **Tasks** are the discrete actions to be taken when resolving an incident. As the necessary work is completed, the team should mark the tasks as complete. During an incident, tasks may be assigned to a member of the incident channel to communicate ownership.
* The **Commander** is a defined role during the incident. This person is responsible for ensuring forward momentum on resolving the incident. By default, the reporter of the incident starts as the commander, but the commander may be changed at any time to another member of the incident channel.
* **Slash commands** may be assigned to tasks defined in the playbook to help to streamline common actions.

To access Mattermost Incident Collaboration:

* From the Main Menu, select **Incident Collaboration** to view stats, review incidents of which you are a member, and configure playbooks. System Admins have unrestricted access.
* From the channel header, select the **Incidents** icon to open the right-hand sidebar. From there, create a new incident or collaborate on active incidents of which you are a member.

Playbooks and Incidents
-----------------------

Playbooks and incidents are associated with teams in Mattermost. Starting an incident prompts for a playbook and incident name. The selected playbook defines the process, communication options, channel permissions, and automation. You can read more about `channel permissions (Public and Private channels) <https://docs.mattermost.com/help/getting-started/organizing-conversations.html>`_.

System Admins can configure Incident Collaboration access permissions in the System Console. This allows for specific teams to better manage who can create playbooks, start incidents, and access potentially sensitive information.

.. image:: ../images/IC-access-control.gif
  :alt: Access control in the System Console.

Playbooks are always private by default. Membership in the playbook is required to configure the playbook or start an incident using that playbook. Once an incident is started, any member of the team may be added to the incident channel. Users who are not members of the team are unable to access playbooks or incidents belonging to that team.

While the commander of an incident has a dedicated, named role, all members of an incident channel have unrestricted access to modify the current state of the incident. This permissive access model ensures the incident is never blocked on any one individual. Use Private channels and channel membership to restrict access, or configure the playbook as public if everyone on the team is trusted with access to the incident.

During an ongoing incident, use the channel to communicate status updates which are visible to stakeholders via the Overview page without requiring their membership in the incident channel. Providing regular status updates increases visibility and helps ensure continued momentum toward resolution.

Stakeholders can view updates on the Overview page.

.. image:: ../images/incident-overview.png
  :alt: Incident Collaboration overview page.
  
Any member of the channel can write a status update, post that update to the channel, and optionally start a reminder timer to prompt for a subsequent update. Also, if configured in the playbook, status updates may also be broadcast to another channel.

Once an incident is ended, schedule a post-mortem meeting to iterate on the design of your playbook. Automatic posts can help expose a timeline of events for review, such as when a task is marked as complete or when the commander changes. You can export the messages from the incident channel and use them to build a post-mortem document. Identify bottlenecks by explaining gaps between task completion, and suggest changes to the playbook for the next incident.

Playbooks
^^^^^^^^^

.. contents::
  :backlinks: top
  :local:

Creating a playbook
~~~~~~~~~~~~~~~~~~~

A playbook must be defined before starting an incident.

1. Go to **Main Menu > Incident Collaboration**.
2. Select **Playbooks**.
3. Start a **Blank Playbook**, or use the built-in **Incident Collaboration Playbook** as a template.
4. Name your playbook and provide a description.
5. Select the **Tasks** tab.
6. Within the **Tasks** tab, customize the checklists and tasks:
  * Create and name new tasks to capture actions your team should take to resolve the incident.
  * Create new checklists to group tasks meant to be completed together.
  * Drag and drop to reorganize checklists and tasks.
  * Optionally add task descriptions to give additional context to members of the incident channel. Descriptions support a limited form of Markdown, including text styling and hyperlinks.
  * Optionally add a slash command to the task that can be executed by members of the incident channel as needed.
7. Select the **Preferences** tab.
8. Within the **Preferences** tab, customize how status updates are communicated:
  * Optionally configure a broadcast channel to which status updates will be copied. If you are not a member of the configured broadcast channel, **Unknown Channel** is displayed instead of the channel name.
  * Optionally configure the default reminder timer used to prompt for regular updates. The reminder timer may be changed when a status update is written.
  * Create an incident overview template which will be periodically updated throughout the incident. 
  * Create an incident update template. You can use the default structure or customize it to suit your use case.
9. Select the **Automation** tab.
10. Within the **Automation** tab, customize automatically triggered tasks:
  * Optionally enable the **Invite members** toggle and select a set of members. This set of members are automatically invited to the incident channel when the incident starts.
  * Optionally enable the **Assign commander** toggle and select a member. This member is automatically assigned as commander of the incident when the incident starts.
  * Optionally enable the **Announce it in another channel** toggle and select a channel. When the incident is started, an announcement is made in the selected channel.
  * Optionally enable the **Send a webhook** toggle and enter the webhook you want to use.
  * Optionally enable the **Send a welcome message** toggle so new members are greeted with a welcome message. You can use the default text or delete it and add your own.
11. Select the **Permissions** tab.
  * Decide whether the automatically-created incident channel should be Public or Private within the team.
  * Share this playbook with other members of the team to allow them to use the playbook to start an incident, as well as edit the playbook.

Configuring a playbook
~~~~~~~~~~~~~~~~~~~~~~

You can change a playbook's configuration at any time, but changes will only be applied to future incidents. Ongoing or ended incidents previously started from that playbook remain unchanged.

1. Go to **Main Menu > Incident Collaboration**.
2. Select **Playbooks**.
3. Find the playbook to be edited.
 * Only playbooks of which you are a member are listed. System Admins have unrestricted access to all playbooks on the team.
4. Select the name of the playbook, or select the **Actions** menu next to the playbook name, then select **Edit**.
5. Configure the playbook the same way a playbook is created or edited.

Deleting a playbook
~~~~~~~~~~~~~~~~~~~

You can delete a playbook at any time. Ongoing or ended incidents previously started from that playbook remain unchanged.

1. Go to **Main Menu > Incident Collaboration**.
2. Select **Playbooks**.
3. Find the playbook to be edited.
 * Only playbooks of which you are a member are listed. System Admins have unrestricted access to all playbooks on the team.
4. Select the **Actions** menu next to the playbook name, then select **Edit**.
5. Confirm that you want to **Delete Playbook**.

Incidents
^^^^^^^^^

.. contents::
  :backlinks: top
  :local:

Starting an incident
~~~~~~~~~~~~~~~~~~~~

To start an incident you can run the ``/incident start`` slash command from any channel. You can also use the desktop or browser to:

 * Select the **Incidents** icon in the channel header, and select **Start Incident** from the right-hand sidebar.
 * Use the context menu of a post and select **Start incident**.

Starting an incident opens an interactive dialog. Provide an incident name and select a playbook to be used with the incident. Optionally provide a description to offer immediate context into the newly started incident. Only playbooks of which you are a member are listed in the **Playbook** drop-down menu.

The creator of an incident is automatically added as the first member and becomes the commander.

When the incident is created, it is announced in the configured channel. If that channel is archived or deleted, the bot posts a notification in the incident channel.

Joining an incident
~~~~~~~~~~~~~~~~~~~

Join an incident by joining the incident channel. If the incident channel is public, you may join the channel without permission. Search for and join the channel via **Browse Channels**.

If the incident channel is private, an existing member of the incident channel must invite you. System Admins may join private incident channels without permission.

Working with tasks
~~~~~~~~~~~~~~~~~~

Tasks can be part of pre-configured task templates in playbooks, and they can also be added, edited, and removed as needed during an active incident. Any member of the incident channel can work with tasks.

.. note::
  Tasks added during an active incident (ad-hoc tasks) are not saved to the playbook. They only apply to that incident and incident channel.

* To mark a task as completed, select the unchecked checkbox next to the task. To undo this, clear the checkbox.
* To assign a task to a member of the incident channel, select **No Assignee** (or the existing assignee's username), then select a user.
* To view any description associated with a task, select the information icon to the right of the task name.
* To execute a slash command associated with a task, select **Run** next to the listed slash command. Configured slash commands may be run as often as necessary.
* To add an ad-hoc task, select **+ Add new task**.

.. image:: ../images/IC-ad-hoc-tasks.gif

.. image:: ../images/IC-ad-hoc-tasks.gif

Changing commanders
~~~~~~~~~~~~~~~~~~~

To change commanders you can run the ``/incident commander @username`` slash command from the incident channel. You can also use the desktop or browser to:

1. Select the **Incidents** icon in the channel header to open the right-hand sidebar.
2. Select the **Summary** tab.
3. Within the **Summary** tab, select the current commander's name in the right-hand sidebar, then select the new commander.
  * To change the commander to a user who is not in the channel, first add the user to the channel.

Providing a status update
~~~~~~~~~~~~~~~~~~~~~~~~~

Incident status updates ensure that stakeholders remain informed about the progress toward incident resolution. To post a status update:

1. Select the **Incidents** icon in the channel header to open the right-hand sidebar.
2. Find the incident you're looking for and select **Go to Incident Channel**.
3. Select the **Summary** tab.
4. Within the **Summary** tab, select **Update Status**.
5. Add a Markdown-formatted message.
 * If this is the first status update and the playbook has a defined template, that template will be pre-populated here.
 * If this is a subsequent status update, the message from the last status update will be pre-populated here.
6. Optionally set a reminder to prompt for the next status update.
 * If this is the first status update and the playbook has a defined default reminder timer, that timer will be pre-selected here.
 * If this is a subsequent status update, the last reminder timer will be pre-populated here.
7. Select **Update Status** to post your status update.
 * Status updates are posted to the incident channel as a message from the user providing the status update.
 * If the playbook has a defined broadcast channel, status updates are copied to the broadcast channel as a message from the incident bot.

The most recent status post will also appear in the right-hand sidebar of the incident channel. To correct or remove a status post, edit or delete the post as needed. Status updates that are broadcast to another channel will not be edited or deleted.

Ending an incident
~~~~~~~~~~~~~~~~~~~

Incident members can end an incident using the ``/incident end`` slash command. Incidents can also be ended from the desktop or browser:

1. Select the **Incidents** icon in the channel header to open the right-hand sidebar.
2. Find the incident you're looking for and select **Go to Incident Channel**.
3. Select **Update Status**.
4. From the **Status** drop-down menu, select **Resolved**.
5. Enter a message with additional details.
6. Select **Update Status**.

Ending an incident signals to all members of the channel that the incident is no longer ongoing. Members of the team can continue to post in the channel, mark tasks as complete, and change the commander if needed.

Restarting an incident
~~~~~~~~~~~~~~~~~~~~~~

If an incident was ended prematurely, it can be restarted within the incident channel using the ``/incident restart`` slash command. Incidents can also be restarted from the desktop or browser:

1. Select the **Incidents** icon in the channel header to open the RHS.
2. Find the incident you're looking for and select **Go to Incident Channel**.
3. Select **Update Status**.
4. From the **Status** drop-down menu, select **Active**.
5. Enter a message with additional details.
6. Select **Update Status**.

Reviewing past incidents
~~~~~~~~~~~~~~~~~~~~~~~~

To view past incidents of which you are a member, from the desktop or browser:

1. Navigate to **Main Menu > Incident Collaboration**.
2. Select the **Incidents** tab.
3. Within the **Incidents** tab, find the incident to be reviewed, then select the name of the incident.
4. Review the incident details:
 * The duration, total number of members ever involved, and messages sent in the channel are listed.
 * A graphical timeline shows how much time elapsed between completed checklist items.
5. Optionally export the contents of the incident channel to review during a post-mortem.

Built-in slash commands
-----------------------

The ``/incident`` slash command allows interaction with incidents via the post textbox on desktop, browser, and mobile for:

- ``/incident start`` - Start a new incident.
- ``/incident end`` - End an ongoing incident.
- ``/incident update`` - Update the current incident's status.
- ``/incident restart`` - Restart an ended incident.
- ``/incident check [checklist item]`` - Check/uncheck the specified task.
- ``/incident announce ~[channels]`` - Announce the current incident in other channels.
- ``/incident list`` - List all your incidents.
- ``/incident commander [@username]`` - Show or change the current commander.
- ``/incident info`` - Show a summary of the current incident.

Channel Export
--------------

Exporting the contents of an incident channel requires the channel export plugin. See the `Channel Export plugin documentation <https://mattermost.gitbook.io/channel-export-plugin>`_ for more information.

API Documentation
-----------------

To interact with the incidents data model programmatically, consult the `REST API specification <https://github.com/mattermost/mattermost-plugin-incident-collaboration/blob/master/server/api/api.yaml>`_.

source/archive/developer_copy.rst METASEP
:nosearch:

====================================
Staff Developers
====================================

As a core committer at Mattermost, you are responsible for one of the world's largest and most popular open source projects. Your work impacts thousands of organizations who depend on Mattermost for daily operations, from high tech (Intel, Samsung, Micron), to healthcare (Medtronic, Epic, Bristol-Myers Squibb), to public sector (U.S. Department of Defense, U.S. Department of Energy), to education (University of California, National University of Singapore), and consumer brands (Urban Outfitters, Wargaming.net). 

Working in open source means your work is publicly visible. Your code will receive both credit and critique from the community and with the right mindset and support that can lead to you making the best engineering decisions of your career.

Core committers include volunteer developers from the community, staff by organizations deploying and investing in Mattermost, as well as staff paid by Mattermost, Inc.

This document summarizes the responsibilities and requirements of core committers employed by Mattermost, Inc., skill level requirements, and hiring process. Staff developers work closely with Mattermost product management to envision, design, plan, develop, coordinate, review, and merge improvements per our `contribution guidelines <../developer/contribution-guide.html>`__ on a regular basis.

Ideally, developers are "full stack", and comfortable moving across backend and frontend projects. As part of our `learn, master, teach <training.html#learn-master-teach>`__ mindset, our environment has people consistently cross-training, becoming experts, and passing on knowledge to new team members rotating into new areas of responsibility. That said, we also welcome engineers who prefer to specialize in backend and frontend, since there's ample projects to find in both areas.  

Responsibilities
-------------------------

- Develop features from proposal to polished end result.
- Support and collaborate with our community service engineers to find the root cause of issues, find, deliver, and document effective solutions. 
- Engage with the core team and the open source community to collaborate on improving Mattermost.
- Propose, coordinate, manage, review, and merge code contributed by the rest of the community and work with them to get it ready for production.
- Work with our `documentation team <documentation-guidelines.html>`__ to create and maintain technical information around features, configuration, and troubleshooting.
- Take initiative in improving the software in small or large ways to address pain points in your own experience as a developer.
- Keep code easy to maintain. Keep it easy for others to contribute code.
- Help identify, vet, and recruit other developers to join our community and, when appropriate, as staff developers. 

Requirements
-------------------------

- You can effectively reason and discuss software, algorithms, and performance at a high level.
- You have a passion for creating open source software.
- You have previously played a vital role in production-level applications.
- You have strong written communication skills.
- You're self-motivated with strong organizational skills.
- You share our values, and work in accordance with those values.
- You're proficient in Golang, React and/or React Native, or are able to ramp quickly into those languages.
- You've either made substantial contributions to the Mattermost open source project or are open to completing an `Audition`_ to assess your comfort in working in open source.
- Ideal, but not required: Experience working in online communities, having made at least one `Help Wanted <https://mattermost.com/pl/help-wanted>`__ pull request to a Mattermost repository, working on other Golang, React or React Native apps.

Levels
-------------------------

The level descriptions below are used to categorize core committers based on their capabilities. Regardless of level, all core committers are expected to fulfill the following:

- Deliver high quality code that represents the best thinking of the open source project and is ready to be scrutinized by hundreds of community members, including commercial customers.
- Write complete code that meets all specifications and criteria, has thorough unit tests and typically no defects.
- Work collaboratively in a high trust, asynchronous environment with strong written communication skills and comfort working with fellow developers, product managers, designers, testers, technical writers, support engineers, and other product and business staff. 

Software Design Engineer I
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Influences and executes defined tasks and features across engineering and test automation. Works effectively in teams to align priorities and manage execution. Learns new skills and establishes goals and context quickly by asking precise questions. Engages, guides and enables open source contributors to deliver high quality pull requests.

Software Design Engineer II
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Capabilities of SDE I plus: Designs, leads and delivers high impact features and changes across the product stack and test automation infrastructure. Sets thoughtful, technical vision for areas of ownership, balancing functional and technical trade-offs, while working effectively with PM and UX. Drops fluidly into different projects, ramps quickly and leads features to successful outcomes. Inspires, organizes and enables groups of open source community members to contribute to development campaigns in building significant new functionality.

Senior Software Design Engineer
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Capabilities of SDE II plus: Sets and delivers architectural vision for high impact features and changes across multiple products, working in sync with PM, UX, and customer teams. Highly respected by colleagues and community as technical authority, influencing discussions and behavior with input and suggestions. Drops fluidly into customer and community discussions, aligns efforts, and develops superior solutions through discussion and analysis. Attracts, motivates, and trains open source community members to lead the coordination and management of development campaigns to create new features and products. 

Architect / Principal Software Design Engineer
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Capabilities of Senior SDE plus: Sets and delivers architectural vision for entire products and systems spanning multiple products. Engages with peers in customer and partner organizations to shape joint development plans. Works fluidly with PM, UX, and sales leadership to set organizational objectives and direction. Sought out as a technical authority in industry in developing, disseminating, reviewing, evaluating key patterns and reference architectures. Influences, shapes and can redirect customer and community technical discussions, rapidly understanding disparate viewpoints and leading discussions that align thinking and efforts to influence the direction of large scale technical projects. 

Hiring Process
-------------------------

Candidates for developer roles on the Mattermost staff can expect the hiring process to follow the order below. Please keep in mind that applicants can be declined from the position at any stage of the process.

Both declined and accepted candidates will be invited to share feedback on their hiring experience so we can continually improve our process.

- **Application** - In `your application <https://jobs.lever.co/mattermost/>`__ we welcome you to include links to any public open source work you've done, including GitHub, GitLab or BitBucket profiles. If you'd like to share privately we can send you our ID for GitHub, GitLab or BitBucket, or we can review code you send in via email. If you really want to impress us, `make a contribution to our open source project by completing a Help Wanted ticket. <../developer/contribution-guide.html>`__
- **Email - Follow-up questions** - If your application looks good, we'll email you some questions specific to the role.
- **Video call - Screening interview** - Selected candidates will be invited for a 25-minute screening call with a recruiter.
- **Video call - Technical discussion** - Candidates will be invited to schedule a 60-minute interview with a core committer to discuss their technical experience and suitability for the role.
- **Video call - Soft-skills discussion** - Next, candidates will be invited to schedule a 60-minute interview with a core committer to assess soft skills, and for the candidate to learn more about the role.
- **Audition** - Candidates who appear technically strong and culturally fit may be offered a real-world “try out” project with Mattermost team members to simulate what it would be like to work on a major open source project.
- **Video call - Discussion of Audition and Soft Skills** - On completion of the Audition, candidates will be invited to schedule a 60-minute interview with a core committer to discuss the experience and outcomes of participating in the audition and further assess soft skills.
- **Video call - CTO interview** - Candidates are invited to a 45-minute interview with our CTO and co-creator of the Mattermost open source project. The interview may include technical questions along with a discussion of either past work or results of the audition, the candidate's interests, their career aspirations, and how being a core committer at Mattermost could align with those interests and aspirations.
- **Email - Offer** - Successful candidates will receive an offer via email. Mattermost offers compensation competitive with a candidate's local market opportunities.

Notes:

- Staff developers in Canada are typically offered full-time employment through a Canadian co-employer, with local payroll via ADP, benefits and T4 tax reporting.
- Staff developers in the US are typically offered full-time employment through a U.S. co-employer, with local payroll via TriNet, benefits and W2 tax reporting.
- Staff developers outside the U.S. and Canada are offered full-time consulting paperwork very similar to the click-sign agreement for the paid simulation.

Audition
-------------------------------

For the benefit of candidates and the company, Mattermost offers real-world “try out” projects with Mattermost team members to simulate what it would be like to work at the company prior to hiring. The practice of auditions in open source companies was pioneered by Automattic (creators of WordPress) and detailed by `Harvard Business Review in 2014 <https://hbr.org/2014/04/the-ceo-of-automattic-on-holding-auditions-to-build-a-strong-team>`__. This practice has been a vital part of Mattermost culture.

Candidates who show strong potential for technical and cultural fit are invited to work on tasks that are part of their desired position, complete a project designed by their potential manager, or select from open `Help Wanted tickets <https://mattermost.com/pl/help-wanted>`__ to be completed per the `Mattermost contribution guidelines <https://developers.mattermost.com/contribute/getting-started/>`__. Your work will become a permanent part of the open source project that you can reference for the rest of your career. You’re also eligible to receive a `Mattermost Mug <https://twitter.com/search?q=%23mattermug&src=typd>`__ in appreciation of your first contribution. Here’s an example of `a successful project completed during a tryout <https://www.movetoiceland.com/mattermost-recipe-1-preview-videos/#.Wz2kb9hKjUK>`__.

While you’re working with us, you can join the Mattermost community site `here <https://community.mattermost.com/core/>`__.

Once signed-in, the following channels are recommended for observing how the core committers work with the community to ship new releases:

* `Developers <https://community.mattermost.com/core/channels/developers>`__
* `Bugs <https://community.mattermost.com/core/channels/bugs>`__
* `Release Checklist <https://community.mattermost.com/core/channels/release-checklist>`__
* `Release Discussion <https://community.mattermost.com/core/channels/release-discussion>`__
* `Peer-to-Peer Help <https://community.mattermost.com/core/channels/peer-to-peer-help>`__

Observing these public channels as you work will give you a good sense of what it is like to work at Mattermost in a full time capacity to ensure joining the company aligns to your interests and desired career direction.

During the tryout, candidates will submit invoices for up to 40 hours of work (example `here <https://docs.google.com/spreadsheets/d/1Lx1f3nX64pJTJOttW_QoJwrfRekh0ISjmIwZ7_ePG1g/edit#gid=1>`__). All candidates will be paid $25/hour, regardless of position. Mattermost uses a `standard consulting agreement template <https://docs.google.com/document/d/1G4wFLq_wHHEDJ-hrv5Kmu022mFJgh3rJ4-glM0W6riI/edit?usp=sharing>`__ and provides instructions for invoicing at the start of the tryout. Note that the hourly rate is not necessarily representative of the final offer that would be extended to a successful candidate.

Frequently Asked Questions
--------------------------------------------------

Do you have internships?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

While we no longer offer internships for developers, if you get a couple of `Help Wanted <https://mattermost.com/pl/help-wanted>`__ pull requests accepted, we'll interview you for one. This will be a remote internship without supervision; you'll only get feedback on your merge requests. If you want to work on open source and qualify, `please submit an application <https://jobs.lever.co/mattermost/>`__. In the cover letter field, please note that you want an internship and link to the accepted pull requests. The pull requests should be of significant value and difficulty, which is at the discretion of the hiring manager. For example, fixing 10 typos isn't as valuable as shipping 2 new features.

source/archive/developer.rst METASEP
:nosearch:

:orphan:

Mattermost Developer's Guide
============================

Detailed developer documentation is available at `https://developers.mattermost.com <https://developers.mattermost.com>`__.

source/archive/developer-setup.md METASEP
Developer Machine Setup
=======================

This file has been replaced by [Developer Machine Setup](https://developers.mattermost.com/contribute/server/developer-setup/). Please update your links to point to the new location.

source/archive/developer-flow.md METASEP
Developer Flow
-----------------------------

See [developers.mattermost.com](https://developers.mattermost.com/) for the developer flow of the following repositories:
 - [mattermost-server](https://developers.mattermost.com/contribute/server/developer-setup/)
 - [mattermost-webapp](https://developers.mattermost.com/contribute/webapp/developer-setup/)
 - [mattermost-redux](https://developers.mattermost.com/contribute/redux/developer-setup/)
 - [mattermost-mobile](https://developers.mattermost.com/contribute/mobile/developer-setup/)
 - [desktop](https://developers.mattermost.com/contribute/desktop/developer-setup/)

source/archive/dev-setup.rst METASEP
:nosearch:

.. _dev-setup:

Developer Setup
=================

See developer machine set up for macOS, Ubuntu 16.04, Windows, Archlinux, and CentOS 7 at `developers.mattermost.com <https://developers.mattermost.com/contribute/server/developer-setup/>`__.

source/archive/dev-setup-windows.rst METASEP
:nosearch:

.. _dev-setup-windows:

See developer machine set up for Mac OS X, Ubuntu 16.04, Windows, Archlinux and CENT OS 7 at `developers.mattermost.com <https://developers.mattermost.com/contribute/server/developer-setup/>`__.

source/archive/dev-setup-ubuntu-1604.rst METASEP
:nosearch:

.. _dev-setup-ubuntu-1604:

See developer machine set up for Mac OS X, Ubuntu 16.04, Windows, Archlinux and CENT OS 7 at `developers.mattermost.com <https://developers.mattermost.com/contribute/server/developer-setup/>`__.

source/archive/dev-setup-troubleshooting.rst METASEP
:nosearch:

.. _dev-setup-troubleshooting:

Troubleshooting Setup and Build
===============================

Build Errors
------------

macOS: I get the following error when running ``make run``: "Cannot connect to the Docker daemon"
  If you have Docker Tools installed (as opposed to Docker for Mac), make sure docker-machine is running.

  ``docker-machine start dev``

macOS: I get the following error or something similar when running ``make run``: "Module build failed: Error: dyld: Library not loaded: /usr/local/opt/libpng/lib/libpng16.16.dylib"
  libpng needs to be updated because it is used by one of our dependencies. If you do not have libpng installed through Homebrew, run

  ``brew install libpng``

  If you already have libpng installed through Homebrew, you can update it using the following command:

  ``brew update && brew upgrade libpng``

I get the following error when running ``make run``: "Failed to ping db err:dial tcp 192.168.99.100:3306: getsockopt: connection refused"
  It appears that your MySQL database isn't running. If you run ``docker ps``, you should see a line like

  .. code-block:: text

    ecb17c10973d    mysql:5.7  "/entrypoint.sh mysql"   2 weeks ago    Up 24 hours  0.0.0.0:3306->3306/tcp     mattermost-mysql

  If not, running ``make clean-docker`` will remove all existing Docker containers so that they'll be recreated next time you call ``make run``.

I get the following error when running ``make run``: "Error starting server, err:listen tcp :8065: bind: address already in use"
  There's likely another Mattermost instance already running. You can use ``make stop`` to stop it before running ``make run`` again.

  If there isn't another copy of Mattermost running and you need to change the port that Mattermost is running on, you can do so by changing the ``ListenAddress`` setting in the *ServiceSettings* section of ``config/config.json``.

macOS: I get the following error or something similar when running ``make run``: [ERROR] Failed to ping DB retrying in 10 seconds err=Error 1045: Access denied for user ‘mmuser’@’localhost’ (using password: YES)
  It appears that 'mmuser' is not created as a user in your MySQL database. Hence create the new user by using the following command:
  ``CREATE USER 'mmuser'@'localhost' IDENTIFIED BY 'mostest';``

  Grant all the permissions to the user using the command:

  ``GRANT ALL PRIVILEGES ON * . * TO '
  mmuser
  '@'localhost';``

  Reload the privileges, so that the changes can be reflected: 
  ``FLUSH PRIVILEGES;``

Testing Errors
--------------

I get the following error when running ``make test``: t.Run undefined (type \*testing.T has no field or method Run)
  You need to upgrade to Go 1.9. We don't support earlier versions than that.

Other Errors
------------

I don't see any error messages, but I can't access http://localhost:8065
  It's possible that the server reported an error, but it was missed because of all of the output from the JavaScript compiler. Try running ``make run-server`` by itself to see its output. If you still don't see any error messages, continue to the next section.

I don't see anything logged to the console when Mattermost is running
  You can enable console logging in the *LogSettings* section of your ``config/config.json`` by setting *EnableConsole* to ``true``.

I can't log into Mattermost because I don't have an account
  You can create an account using the following command:

  ``go build -o mattermost && ./mattermost user create --email user@example.com --username test1 --password mypassword``

  Optionally, you can make that account a System Admin with the following command:

  ``go build -o mattermost && ./mattermost user create --email user@example.com --username test1 --password mypassword --system_admin``

source/archive/dev-setup-osx.rst METASEP
:nosearch:

.. _dev-setup-osx:

See developer machine set up for macOS, Ubuntu 16.04, Windows, Archlinux, and CentOS 7 at `developers.mattermost.com <https://developers.mattermost.com/contribute/server/developer-setup/>`__.

source/archive/dev-setup-compiling.rst METASEP
:nosearch:

.. _dev-compiling:

See `developers.mattermost.com <https://developers.mattermost.com/contribute/getting-started/>`__ for new Developer Documentation, including how to compile Mattermost.

source/archive/dev-setup-centos-7.rst METASEP
:nosearch:

.. _dev-setup-centos-7:

See developer machine set up for macOS, Ubuntu 16.04, Windows, Archlinux, and CentOS 7 at `developers.mattermost.com <https://developers.mattermost.com/contribute/server/developer-setup/>`__.

source/archive/dev-setup-archlinux.rst METASEP
:nosearch:

.. _dev-setup-archlinux:

See developer machine set up for Mac OS X, Ubuntu 16.04, Windows, Archlinux and CENT OS 7 at `developers.mattermost.com <https://developers.mattermost.com/contribute/server/developer-setup/>`__.

source/archive/desktop-mvp.rst METASEP
:nosearch:

Desktop MVP
===========

**The following awards have been given for significant contributions to the Mattermost Desktop App:**

Mattermost Desktop Top Contributor: **Jonas Schwabe** (`jnugh <https://github.com/jnugh>`__) - v3.4 - September 22, 2016

Mattermost Desktop Top Contributor: **Kolja Lampe** (`Razzeee <https://github.com/Razzeee>`__) - v1.3 - July 18, 2016

Mattermost Desktop Quality Champion : **Michael Bisbjerg** (`LordMike <https://github.com/LordMike>`__) - v1.3 - July 18, 2016

Mattermost Desktop Quality Champion: **Steve MacQuiddy** - v1.3 - July 18, 2016

Mattermost Desktop Quality Champion: **David Lu** (`DavidLu1997 <https://github.com/DavidLu1997>`__) - v1.3 - July 18, 2016

source/archive/design-process.rst METASEP
:nosearch:

Design Process
===================

Goal
----

The goal of this design process is to increase Mattermost popularity by improving overall product quality, through a consistent design process that ensures we are designing the right features at the highest quality level possible. 

Principles
----------
1. Every feature should have a convincing reason for why it should be built
2. Every design should start with a story
3. Make time for exploration - it's okay to explore a design that doesn't work and throw it away, as long as we learn from it

Process
-------

1. **Define the "Why"**

    - Research customer/user requirements
    - Write the user stories (potentially for different personas) based on the requirements
    - Write the goal statement
    - Justify why the feature should be built
      
      - Link back to customer and user data / feedback
      - Link back to company objectives 
      - Explain why it is important and the expected impact
      
    - Before continuing with design work, queue a discussion with Product Managers to review the feature proposal and evaluate whether the feature should be added to the roadmap
       
    - *Questions this stage should address:* 
    
      - Who is this for? What do we know about them?
      - What are we trying to build? 
      - Why are we building it? 
      - Should we build this, or should we not? 
      
2. **Brainstorm**
    
    - Research a variety of existing solutions
    - Brainstorm different design concepts
    
      - Consider pair brainstorm
      - Do not go into depth on any one design, the goal is to identify various approaches to evaluate later
      
    - *Questions this stage should address:* 
    
      - What are the design options for the given scenarios?
     
3. **Evaluate options**

    - Identify the most promising design concepts
    
      - Wireframe/develop concepts as needed
      
    - List pros/cons for each option
    - Evaluate each option based on:
    
      - How well each design addresses user stories
      - Principles for this plan
      - Mattermost design principles
      
    - Have pair or group discussions as needed
    
      - Invite developers into the discussion early
      - Set the context for meetings, so people understand this is exploratory design
      
    - *Questions this stage should address:*
    
        - Is this design concept the right approach to the problem? 
        - How well does this design work for the given scenarios? 
        - What are the constraints we need to consider? 
        - How does this design compare to existing solutions? 
    
4. **Develop prototype**

    - Summarize context for the design (preferably in Google Slides), including: 
    
      - Goal/“Why"
      - User Stories
      - Success Metrics
      
        - Define how the success of the feature will be measured
        
      - Designs Considered
      
        - Link back to the various designs considered, and the evaluation 
        
      - Out of Scope
      
        - List things that are purposefully left out, to be addressed at another time
        
    - Work on prototype/mockups for the selected design
    
      - Consider pair design
      - Use mockups (preferably in slideshow or prototyping software), with text that supports the design
      - Include flow of screens, so transitions are clear
      - Make sure to think about: 
      
        - Mobile apps (mobile view and tablet view)
        - Notifications (desktop, email, and push)
        - Both single and multiple team cases
        - Potential performance issues
        
    - Add Questions
    
      - List out any questions about the design that still need to be answered
      
    - *Questions this stage should address:*
    
      - How is the information structured? What is important to see, and when? 
      - What is the layout like? 
      - What does the text say? 
      - What does the UI look like? 
      
5. **Review, test, and iterate**

    - Pair review with someone
    - Share with team
    
      - Post draft with @channel in Spec Review channel, asking to review and add comments
      - Set the context for what stage the design is at, and what they should be reviewing
      
    - Share with interested customers and users
    - Test the prototype/mockups
    
      - If possible, find someone to test the design on
      - Give tasks based on the already defined user stories
      - Observe and have them think aloud
      
    - Iterate based on feedback
   
   - *Questions this stage should answer:*
    
      - Are there any potential issues with the design? 
      
6. **Final review**

    - Identify people who should sign off on the design before implementation (include UX Design, PM, Dev, and Test)
    - Hold a meeting to review the design
    
      - Set the context that this is a final review, and people should look for any potential issues
      - Ask people to review the design and add comments/questions beforehand
      - Define example areas that should be covered (different people may focus on different things):
      
        - How well does the design address the listed scenarios?
        - Are there any technical concerns? 
        - Potential usability issues? 
        - Is the product text clear?
        - Does the design follow UX guidelines? 
        - Is it consistent with the rest of the product? 
        - How could this design be used in the future?
        - Are all corner cases addressed? Check for: 
        
          - Mobile apps (mobile view and tablet view)
          - Notifications (desktop, email, and push)
          - Both single and multiple team cases
          - Potential performance issues
          
    - Update design based on feedback until everyone signs off
    
    - *Questions this stage should answer:*
    
      - Is this design ready to be implemented? 
    
7. **Break into tickets**

    - Dev breaks the spec into tickets, and reviews with PM so everyone is on the same page about the plan

source/archive/deprecated-features.rst METASEP
:nosearch:

Deprecation Policy
===============================

This page has moved to the `Mattermost Handbook <https://handbook.mattermost.com/operations/research-and-development/product/development-process/deprecated-features>`__.

source/archive/definitions.rst METASEP
:nosearch:

.. _definitions:

Feature Quality Levels
=======================

See our FAQ on :ref:`feature-quality-levels`

source/archive/creating-teams.rst METASEP
:nosearch:

Creating Teams
==============

|all-plans| |cloud| |self-hosted|

.. |all-plans| image:: ../images/all-plans-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in Mattermost Free and Starter subscription plans.

.. |cloud| image:: ../images/cloud-badge.png
  :scale: 30
  :target: https://mattermost.com/download
  :alt: Available for Mattermost Cloud deployments.

.. |self-hosted| image:: ../images/self-hosted-badge.png
  :scale: 30
  :target: https://mattermost.com/deploy
  :alt: Available for Mattermost Self-Hosted deployments.

A team is a digital workspace where you and your teammates can collaborate in Mattermost. Depending on how Mattermost is set up in your organization, you can belong to one team or multiple teams.

New teams can be created if the System Admin sets **Enable Team Creation** to **true** in the System Console.

Methods to Create a Team
------------------------

If team creation is enabled by the System Admin, teams can be created from the team sidebar or the channel sidebar. The person who creates a team will automatically be assigned the Team Admin role for that team.

Team sidebar
~~~~~~~~~~~~

If you belong to more than one team, a team sidebar will appear to the left of your channel list. You can drag teams to reorder them in the sidebar. You can also use `keyboard shortcuts <https://docs.mattermost.com/messaging/keyboard-shortcuts.html>`_ to navigate between teams.

.. image:: ../images/team-sidebar.gif

If you have appropriate permissions, select the "+" icon at the top of the team sidebar, then select **Create a New Team** on the team selection page, which guides you through the rest of the team creation steps. If this option is not visible on the web page, then the System Admin has disabled team creation.

If you have no other teams to join, selecting the "+" icon brings you directly to the team creation page if team creation is enabled.

Team menu
~~~~~~~~~

From your current Mattermost team, select your team name and then select **Create a Team**. If this option is not visible in the menu, then the System Admin has disabled team creation.

Team name and URL selection
---------------------------

There are a few details and restrictions to consider when selecting a team name and team URL.

Team name
~~~~~~~~~

This is the display name of your team that appears in menus and headings.

-  It can contain any letters, numbers or symbols.
-  It's case sensitive.
-  It must be 2–64 characters in length.

Team URL
~~~~~~~~

The team URL is part of the web address that navigates to your team on the system domain, ``https://domain.com/teamurl/``.

-  Teams may contain only lowercase letters, numbers and dashes.
-  Teams must start with a letter and cannot end in a dash.
-  Teams must be 2–64 characters in length.
-  Team names cannot start with the following restricted words: ``admin``, ``api``, ``channel``, ``claim``, ``error``, ``files``, ``help``, ``landing``, ``login``, ``mfa``, ``oauth``, ``plug``, ``plugins``, ``post``, ``signup``, ``playbooks``, or ``boards``.
   
Best practices for using a single team vs. multiple teams
---------------------------------------------------------

Mattermost can be deployed both to a single team and to multiple teams.

Currently, we recommend deploying to a single team for the following reasons:

* Single team deployments promote communication across the organization. When you add multiple teams, groups can become isolated. 
* We don’t yet support search or channels across teams, which can impact the cross-team user experience. This includes general searches, saved posts, and recent mentions.
* Integrations (e.g., webhooks and slash commands) are only persistent across single team deployments.

However, some Mattermost customers prefer multiple team deployments for the following reasons:

* Teams are useful when there is a purpose for each of them. For example, one team is used for staff members and another team for external users.
* Performance is better when users are scattered across multiple teams instead of all in the same one. With multiple teams, there is less content to load per team or channel switch and database queries are faster.
* Creating a shared team for all users, and using `advanced permissions <https://docs.mattermost.com/onboard/advanced-permissions.html#recipes>`__ to control who can create channels and add members to the shared team, improves cross-team collaboration when using multiple teams. Additionally, an `annoucement banner <https://docs.mattermost.com/manage/announcement-banner.html>`__ can be used to provide system-wide announcements.

source/archive/core.rst METASEP
:nosearch:

Core Team Handbook
==================

This handbook is a guide to serving on the core team of the Mattermost open source project, which includes making contributions both as a volunteer contributor from the community and as a paid staff member of Mattermost, Inc. 

Please consider this handbook - along with all our documentation - as a work-in-progress and constantly updating to best achieve our shared mission. 

Development Process
-------------------

This section has moved to the `Mattermost Handbook <https://handbook.mattermost.com/operations/research-and-development/product/development-process>`__.
   
Release Process
-------------------

This section has moved to the `Mattermost Handbook <https://handbook.mattermost.com/operations/research-and-development/product/release-process>`__.

Community Process
-------------------

This section has moved to the `Mattermost Handbook <https://handbook.mattermost.com/contributors/contributors/community-playbook>`__.

Product Management Handbook
------------------------------

This section has moved to the `Mattermost Handbook <https://handbook.mattermost.com/operations/research-and-development/product/product-management-team-handbook>`__.

Core Developer Handbook
-----------------------

.. toctree::
   :maxdepth: 2
   :glob:

   /process/support*
   /process/engineer-expectations*

Documentation Style Guide
-------------------------

This section has moved to the `Mattermost Handbook Documentation Style Guide <https://handbook.mattermost.com/operations/operations/company-processes/publishing/publishing-guidelines/voice-tone-and-writing-style-guidelines/documentation-style-guide>`__ and the `Mattermost Handbook User Interface Text Guidelines <https://handbook.mattermost.com/operations/research-and-development/product/development-process/user-interface-text-guidelines>`__.

Joining the Team 
----------------

This section has moved to the `Mattermost Handbook Join Us Guide <https://handbook.mattermost.com/contributors/join-us>`__ and the `Mattermost Handbook Workplace Guide <https://handbook.mattermost.com/operations/workplace>`__.

.. toctree::
   :maxdepth: 2
   :glob:

   /process/handbook*
   /process/working-at-mattermost*
   /process/security*
   /process/security-release*
   /process/training*
   /process/people-ops*
   /process/developer*

Marketing  
---------

This section has moved to the `Mattermost Handbook <https://handbook.mattermost.com/operations/messaging-and-math>`__.

   
Partners
--------

.. toctree::
   :maxdepth: 2
   :glob:

   /process/partner-programs*


**Credits:** Our culture and process draws from the fantastic work of `Wordpress <https://wordpress.org/about/philosophy/>`__, `GitLab <https://gitlab.com/gitlab-com/www-gitlab-com/tree/master/source/handbook>`__, `Pixar <https://www.amazon.com/Creativity-Inc-Overcoming-Unseen-Inspiration/dp/0812993012>`__ and `Intel <https://www.amazon.com/High-Output-Management-Andrew-Grove/dp/0679762884/ref=sr_1_1?s=books&ie=UTF8&qid=1481613210&sr=1-1&keywords=high+output+management>`__ in different ways. 

source/archive/core-developer-handbook.md METASEP
:nosearch:

Core developer handbook has moved to [developers.mattermost.com/internal](https://developers.mattermost.com/internal/).

For a list of current core committers, see [this link](https://developers.mattermost.com/contribute/getting-started/core-committers).

For release cutting process, see [this link](https://developers.mattermost.com/internal/release-process).

source/archive/contribution-guide.md METASEP
:nosearch:

See contribution guidelines at [developers.mattermost.com](https://developers.mattermost.com/contribute/getting-started/).
source/archive/configuring-notifications.rst METASEP
:nosearch:

Configuring Notifications
=========================

|all-plans| |cloud| |self-hosted|

.. |all-plans| image:: ../images/all-plans-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in Mattermost Free and Starter subscription plans.

.. |cloud| image:: ../images/cloud-badge.png
  :scale: 30
  :target: https://mattermost.com/download
  :alt: Available for Mattermost Cloud deployments.

.. |self-hosted| image:: ../images/self-hosted-badge.png
  :scale: 30
  :target: https://mattermost.com/deploy
  :alt: Available for Mattermost Self-Hosted deployments.

.. |gear-icon| image:: ../images/settings-outline_F08BB.svg
  :alt: Select the Gear icon to access your user preferences.

Notifications in Mattermost alert you to unread messages and mentions. Desktop, email, and mobile push notifications notify you of activity in Mattermost. 

You can configure your Mattermost account for how and when you want to be notified of Mattermost activity. When you join a team, Mattermost will notify you of messages directed at you, including when someone:

- Mentions you specifically with ``@username``
- Sends you a Direct Message
- Mentions your username or first name in a channel
- Notifies a channel you're in using ``@channel``, ``@all``, or ``@here``
- Responds to a thread you're following
- Uses any `keywords you've configured <https://docs.mattermost.com/messaging/managing-account-settings.html#words-that-trigger-mentions>`__ 

.. tip::

  Not getting a notification? See our `FAQ to view the notification flow chart <https://docs.mattermost.com/about/faq-notifications.html>`__ to see what other factors can influence whether a notification gets triggered.

Desktop notifications
----------------------

Desktop notifications are pop-ups that appear in the corner of your main monitor when using Chrome, Edge, Firefox, and Safari, or the `Mattermost Desktop Apps <https://mattermost.com/download/#mattermostApps>`__. You can change the default preference to trigger desktop notifications for all messages sent in channels you're a member of, or turn them off entirely. You can also choose what sound plays when a desktop notification is triggered on supported browsers and the Mattermost Desktop App.

.. image:: ../images/desktop_notification.png

.. tabs::

  .. tab:: Mattermost v6.0 onwards

    From Mattermost v6.0, **Desktop Notifications** have moved. Access **Notifications** by selecting the **Gear** |gear-icon| icon in the Global Header.
      
    Configure desktop notifications in **Settings > Notifications > Desktop Notifications**. 
    
    +---------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | **Notification option**   | **You'll receive...**                                                                                                                                                                                                                            |
    +===========================+==================================================================================================================================================================================================================================================+
    | **For all activity**      | Desktop notifications for all channel activity.                                                                                                                                                                                                  |
    +---------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | **Only for mentions**     | - Desktop notifications for @mentions and Direct Messages/Group Messages only.                                                                                                                                                                   |
    |                           | - When you've `enabled Collapsed Reply Threads <https://docs.mattermost.com/messaging/manage-channels-settings.html#collapsed-reply-threads-beta>`__, receive reply thread notifications by enabling **Notify me about threads I'm following**.  |
    |                           | - Choose your notification sound preference.                                                                                                                                                                                                     |
    +---------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | **Never**                 | No desktop notifications.                                                                                                                                                                                                                        |
    +---------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

    By default, this setting becomes your global setting applied to all channels you're a member of.

  .. tab:: Mattermost v5.39 and earlier

    In Mattermost versions up to 5.39, access **Account Settings** from the **Main Menu** by selecting the three horizontal lines (also known as a hambuger menu) at the top of the channel sidebar.
      
    - Configure desktop notifications in **Account Settings > Notifications > Desktop Notifications > Send desktop notifications**, then choose your sound preference.
    - By default, all channels use the global setting configured in **Account Settings**.
  
    Configure desktop notifications in specific channels in the channel menu via **Notification Preferences > Send desktop notifications**.

Email notifications
-------------------

By default, you'll get email notifications if you're not actively using Mattermost. You can turn off email notifications.

.. image:: ../images/email_notification.png

Open messages from email notifications in the Mattermost Desktop App, Mobile App, or in your browser.

.. image:: ../images/deep_linking.png

.. tabs::

  .. tab:: Mattermost v6.0 onwards

    From Mattermost v6.0, **Email Notifications** have moved. Access **Notifications** by selecting the **Gear** |gear-icon| icon in the global header.
      
    Configure email notifications in **Settings > Notifications > Email Notifications**.

    +---------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | **Notification Option**   | **You'll receive...**                                                                                                                                                                                                                           |
    +===========================+=================================================================================================================================================================================================================================================+
    | **Immediately**           | - Email notifications for @mentions and direct messages/group messages when you're                                                                                                                                                              |
    |                           |   offline or away for more than five minutes.                                                                                                                                                                                                   |
    |                           | - When you've `enabled Collapsed Reply Threads <https://docs.mattermost.com/messaging/manage-channels-settings.html#collapsed-reply-threads-beta>`__, receive reply thread notifications by enabling **Notify me about threads I'm following**. |
    +---------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | **Never**                 | No email notifications.                                                                                                                                                                                                                         |
    +---------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

    This setting becomes your global setting applied to all channels you're a member of.

  .. tab:: Mattermost v5.39 and earlier

    In Mattermost versions up to 5.39: 
      
    -  Configure email notifications in **Account Settings > Notifications > Email notifications**.
    -  Configure the email address where notifications are sent in **Account Settings > General > Email**.

Mobile push notifications
-------------------------

Mobile push notifications appear on the lock screen of your mobile device if the Mattermost Android or iOS app is installed. By default, these notifications are triggered when you're not actively using Mattermost, but this is configurable. You can also change the default preference to trigger push notifications for all messages sent in channels you're a member of, or turn them off entirely.

.. image:: ../images/push_notification.png

.. tabs::

  .. tab:: Mattermost v6.0 onwards

      From Mattermost v6.0, **Mobile Push Notifications** have moved. Access **Notifications** by selecting the **Gear** |gear-icon| icon in the Global Header.
      
      Configure the activities that trigger mobile push notifications in **Settings > Notifications > Mobile Push Notifications > Send mobile push notifications**.

      +----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
      | **Notification option**                | **You'll receive...**                                                                                                                                                                                                                            |
      +========================================+==================================================================================================================================================================================================================================================+
      | **For all activity**                   | - Mobile notifications for all activity.                                                                                                                                                                                                         |
      +----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
      | **For mentions and Direct Messages**   | - Mobile notifications for @mentions and Direct Messages/Group Messages only.                                                                                                                                                                    |
      |                                        | - When you've `enabled Collapsed Reply Threads <https://docs.mattermost.com/messaging/manage-channels-settings.html#collapsed-reply-threads-beta>`__, receive reply thread notifications by enabling **Notify me about threads I'm following**.  |
      +----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
      | **Never**                              | No mobile notifications.                                                                                                                                                                                                                         |
      +----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

      Configure when mobile push notifications are triggered in **Settings > Notifications > Mobile Push Notifications > Trigger push notifications when**.

      +---------------------------------+-----------------------------------------------------------------------------------+
      | **Notification option**         | **You'll receive...**                                                             |
      +=================================+===================================================================================+
      | **Online, away or offline**     | Mobile notifications at all times, regardless of your current Mattermost status.  |
      +---------------------------------+-----------------------------------------------------------------------------------+
      | **Away or offline**             | Mobile notifications when you're away or offline only.                            |
      +---------------------------------+-----------------------------------------------------------------------------------+
      | **Offline**                     | No mobile notifications.                                                          |
      +---------------------------------+-----------------------------------------------------------------------------------+
      
  .. tab:: Mattermost v5.39 and earlier

      In Mattermost versions up to 5.39: 
      
      -  Configure push notifications in **Account Settings > Notifications > Mobile Push Notifications > Send mobile push notifications**.
      -  Configure when push notifications are sent depending on your availability in **Account Settings > Notifications > Mobile push notifications > Trigger push notifications when**.
  
.. tip::

  Learn more about how Mattermost detects your `availability <https://docs.mattermost.com/help/getting-started/setting-your-status-availability.html>`__ as **Online**, **Away** or **Offline**.

Browser tab notifications
-------------------------

If Mattermost is open in a browser tab, the favicon updates to notify you of unread messages (\*) and a count of mentions or Direct Messages. Browser tab notifications are available on Chrome, Edge, Firefox, and Safari.

.. image:: ../images/browser_notification.png

Muting a channel
----------------

Channels in the sidebar appear **bolded** when there are unread messages in the channel and include a badge count if you are mentioned specifically. 

When you mute a channel, you do not receive any notifications (desktop, email, or push) for any mentions (whether they are channel-wide or directed at you). However, if you are mentioned while the channel is muted, the mention badge will be displayed in the sidebar with the channel displaying at reduced opacity.

To mute a channel, select the channel name and select **Mute Channel**. To unmute it, select the channel name and select **Unmute Channel**.

.. tip:: 

  Mentions are triggered by `selected keywords <https://docs.mattermost.com/help/settings/account-settings.html#words-that-trigger-mentions>`__. Learn more about `mentioning teammates <https://docs.mattermost.com/help/messaging/mentioning-teammates.html>`__.

Ignoring mentions
-----------------

To turn off notifications for channel-wide mentions for @channel, @here, and @all, navigate to:

**Notification Preferences > Ignore mentions for @channel, @here and @all**. Choose **Edit**, select **On**, and then select **Save**. 

When this setting is on you will still receive notifications for direct mentions. 

.. note::
  
  If you've muted a channel and enabled **Ignore mentions for @channel, @here and @all**, then you won't receive notifications (whether they're direct or channel-wide). However, if you're directly mentioned in the muted channel, a badge counter is displayed in the sidebar.

source/archive/configuring-apache2.rst METASEP
:orphan:

Configuring Apache2 (unofficial)
================================

.. This page is intentionally NOT accessible from the LHS, and is no longer maintained in this repository. Unofficial content has moved to the User Forum.

Unofficial, community-maintained guides for configuring Apache as a proxy instead of NGINX.

.. include:: config-proxy-apache2.rst
    :start-after: :nosearch:

.. include:: config-ssl-http2-apache2.rst
    :start-after: :nosearch:
source/archive/community.rst METASEP
:nosearch:

Community Engagement Guidelines 
=======================================

Below is a list of guidelines for maintainers, key contributors and Mattermost, Inc. staff to use when engaging with the broader community in forums, GitHub issues, Twitter, our Mattermost servers and other places of online conversation. 

Best Practices 
--------------

1. Don't offer advice on database modification without a clear warning
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Never give DB advice without a warning similar to: 

``Manual database modification bypasses checks in the code and could make a system unrecoverable. It's not recommended and if you do make a change, make sure to back up your DB, and verify changes carefully.``

2. Answer with docs
~~~~~~~~~~~~~~~~~~~~

When answering a common question, always include a link to the docs so the person asking--along with people in future who read your response--has a reference. If no doc exists, do one of two things: 

1. Add the documentation, then answer the question with a link to the information, or 
2. Answer the question and open a ticket for the missing information to be added to docs.

During the triage process, if the information missed should have obviously been included, assign the ticket to the last approver for the doc PR, otherwise assign to doc PR author. 

3. Avoid speculation 
~~~~~~~~~~~~~~~~~~~~~

Circumstances change frequently. Don't set expectations for something that you're not 100% sure will happen. If it doesn't happen, people will be more upset than if you didn't say anything. 

For example, if you haven't seen a feature merged into a specific product in a specific edition, don't tell people the feature will be in until you see it merged. 

Speaking in the Voice of Mattermost 
-----------------------------------

Mattermost serves a global audience, who might not use English as their first language.

To keep Mattermost “obvious” to users, please keep community discussion, documentation and on-screen help simple, effective and ready-to-translate.

**Simple** 

- Aim for the reading ability of an 11-year old. Use short sentences. Avoid large words.

**Effective**

- Start with what’s important, and leave less important details to the end, or omit them.
- Focus on achieving understanding in the reader, over total correctness or completeness.

**Ready-to-translate**

- Avoid slang.
- Avoid Western-centric, or culture-centric examples (example: instead of “fiddle with settings”, say “adjust settings”).

If you’re not sure, try using machine translation to turn your content into a foreign language then back into English.

Machine-Translation Example:
------------------------------------------------

Here’s an example of culture-specific content with the word “fiddle” (meaning “to adjust repeatedly”):

  There are a few configuration settings you might want to fiddle with when setting up your instance of Mattermost.

That documentation machine-translated into German and then back into English looks like this:

  There are some configuration settings you could know if your instance Matter Most violin.

The sentence would be more ready-to-translate to say “There are a few configuration settings you can adjust when setting up your instance of Mattermost.”

Testing our documentation:
------------------------------------------------

One technique to use to review content is to ask: “How would Agent Coulson explain this concept to Thor?” [1]

Agent Coulson takes complex ideas and explains them simply and effectively. Thor isn’t from earth, so we have to filter out ideas that are culturally specific-–fiddles, baseball, wedding rings, etc.--and that makes things easy-to-translate.

As a communications company, clarity matters. If you see content that doesn't speak in the "Voice of Mattermost", we’d gladly accept issue reports and pull requests.

[1] This example relies on knowledge of the 2012 movie "Avengers", which we consider a "global" reference, not a culture-specific reference, since it achieved `record-breaking sales <https://en.wikipedia.org/wiki/The_Avengers_(2012_film)>`__ around the world--in the United States, Mexico, Brazil, Ecuador, Bolivia, Taiwan, the Philippines, Hong Kong, the United Arab Emirates, Argentina, Peru and Central America, among other regions. 



source/archive/community-process.rst METASEP
:nosearch:

Community Monitoring Process
============================

This document outlines the process for monitoring and responding to community questions in various channels.

Community Manager
-----------------

When responding to issues:

1. Identify what type of post it is:

  - Troubleshooting
  - Feature Proposal
  - Bug
  - Developer/Product Question

2. Ask questions to narrow down or understand the issue better:

  - Try to understand the issue yourself as much as possible first
  - If appropriate, ask a developer for assistance on technical questions

3. Respond:

  - Include a link to related documentation in your response (e.g. Jira ticket, feature proposal, etc.)
  - If there is no related documentation, write the documentation and include the link in your response:

    - For reproducible bugs, create a Jira ticket
    - For product questions or troubleshooting, update docs.mattermost.com if appropriate
    - For feature proposals, ask them to `create a feature proposal <https://mattermost.org/feature-ideas/>`__ and post the link back

  - If appropriate, ask if the community member would be interested in contributing the feature / bug fix


Community channels
------------------

The various community channels are outlined below. On a daily basis, the Community Manager helps with notifying team members about issues in need of a response and, if necessary, asks for help from a developer.

1. `Peer-to-peer Help Channel <https://community.mattermost.com/core/channels/peer-to-peer-help>`__: Forum Issues / GitLab / Stack Overflow

  - Description:

    - Community Manager reviews new `GitHub mattermost/mattermost-server <https://github.com/mattermost/mattermost-server>`__ and `GitHub mattermost/mattermost-mobile <https://github.com/mattermost/mattermost-mobile/issues>`__ issues daily, and responds to all new issues:

        - Bug Report: Try to reproduce, or ask another team member to reproduce
        - Troubleshooting: Request to move to forums
        - Feature Proposal: Request to move to feature idea forums

    - Community Manager posts "[Help Wanted] #forum #github @here @[dev on rotation] These forum posts are open to everyone in the community. If you find something you think you know the answer to or can help with, please help post a response and be part of creating a vibrant Mattermost community!" with a list that includes:

      - Forum and `GitHub mattermost/mattermost-server <https://github.com/mattermost/mattermost-server>`__ posts that are >=2 days old (this gives community members a chance to respond first)
      - New forum posts referencing Enterprise features or upgrade issues after a release
      - Forum posts with a new reply to questions asked by the core team

    - Everyone from the team/community can step in and answer forum posts

  - Community Manager Responsibility:

    - Review the list for posts that haven’t been answered, and either reply (with help from dev if needed) or route to the appropriate person, following up to make sure a response is posted
    
2. `Peer-to-peer Help Channel <https://community.mattermost.com/core/channels/peer-to-peer-help>`__: UserVoice Issues

  - Description:

    - Ops Team @mentions the Community PM with a list that includes issues:

      - where status requires updating
      
        - Under Review: After a ticket is created but the spec is not yet complete
        - Planned: Jira ticket with a plan on how to build the feature
        - Started: When a developer has begun to work on the Jira ticket (the ticket shows that it is in progress)
        - Help Wanted: Ticket that is open to any contributor wanting to work on the issue
        - Completed: When ticket is resolved
        - Declined: When the suggestion does not fit with the `product vision <https://mattermost.org/manifesto/>`__
        
      - where a PM might want to ask a question for clarification or ideas on how to design something
      - where the requester specifies they want to work on the feature
      
    - Community PM Responsibility - Team Edition:
    
      - The PM who is release manager for the current release cycle will update the issues after release date.

        - Thank you [NAME] for nominating the feature! It is now available in Mattermost [X.Y]. Would anyone like to help re-tweet the announcement? [LINK TO TWEET]
        
        - Updates a `spreadsheet <https://docs.google.com/spreadsheets/d/1nljd4cFh-9MXF4DxlUnC8b6bdqijkvi8KHquOmK8M6E/edit#gid=0>`__ that tracks UserVoice issues announced in upcoming releases.

    - Sales Responsibility - Enterprise Edition:
    
      - Responds to the issues and closes them after release date.
      
        - Thank you [NAME] for nominating the feature! It is now available in Mattermost [X.Y].
        
      - Updates `Spreadsheet <https://docs.google.com/spreadsheets/d/1nljd4cFh-9MXF4DxlUnC8b6bdqijkvi8KHquOmK8M6E/edit#gid=0>`__ to track UserVoice issues to be announced in upcoming releases.

3. Weekly, usually Wednesdays, `Peer-to-peer Help Channel <https://community.mattermost.com/core/channels/peer-to-peer-help>`__: GitHub , GitLab and StackOverflow issues with Activity Older than 7 days (that have not been created by Mattermost staff)

  - Description:

    - The Community Manager reviews “GitHub, GitLab and StackOverflow issues with activity older than 7 days” from the following repos and adds a list of issues to the daily Peer-to-peer Help channel post:

      - https://github.com/mattermost/mattermost-server/issues
      - https://github.com/mattermost/docs/issues
      - https://github.com/mattermost/mattermost-api-reference/issues
      - https://github.com/mattermost/mattermost-bot-sample-golang/issues 
      - https://github.com/mattermost/mattermost-load-test/issues
      - https://github.com/mattermost/mattermost-push-proxy
      - [a month or older - reviews are monthly] https://github.com/mattermost/android/pulls
      - [a month or older - reviews are monthly] https://github.com/mattermost/ios/pulls
      - https://stackoverflow.com/questions/tagged/mattermost?sort=newest&pageSize=15 
      - https://gitlab.com/search?utf8=%E2%9C%93&search=mattermost&group_id=&project_id=20699&scope=issues&repository_ref= 
      - https://gitlab.com/gitlab-org/gitlab-mattermost/issues 
      - https://gitlab.com/gitlab-org/omnibus-gitlab/issues?label_name=Mattermost
      - https://gitlab.com/gitlab-org/gitlab-ce/issues?label_name=mattermost

4. Help Wanted GitHub Issues:

 - Description:

   - New GitHub Help Wanted issues are automatically created from JIRA tickets and are open for community contributions.  The Community Manager can disregard these issues as they do not need to be posted to the Peer-to-peer Help channel.

source/archive/community-overview.rst METASEP
:nosearch:

Mattermost Community
============================================================

This page has moved to the `Mattermost Handbook <https://handbook.mattermost.com/contributors/contributors/community>`__.

source/archive/community-guidelines.rst METASEP
:nosearch:

============================================================
Community Playbook
============================================================

This page has been moved to the `Mattermost Handbook <https://handbook.mattermost.com/contributors/contributors/community-playbook/>`_.

source/archive/common-navigating-mattermost-products.rst METASEP
:nosearch:

:orphan:

In Mattermost v6.0, we’ve introduced changes in how to navigate Mattermost with the introduction of the Global Header. Whether you're new to Mattermost, or a long-time user, this document will help you start using these new Global Header features as well as introduce you to some new ways of navigating the product.

The Global Header introduces a new way of navigating and using Mattermost, and offers shared functionality available across the Mattermost platform in a single place. If you’ve recently installed or upgraded to v6.0, you’ll notice that Account Settings options have been split up, the Search bar is now front and center, and we’ve introduced a Product Menu button for easy navigation between Channels, Boards, and Playbooks. You'll notice that going forward, when you open Playbooks and Boards, they display as tabs in the window header for easier access.

We've also changed how you access multiple servers. Previously, multiple servers were displayed in tabs across the top of Mattermost. They're now folded into a single menu which supports drag and drop for reordering. Notifications across servers work the same way as before, so you won't miss any important conversations.

.. image:: ../images/server-menu.png
  :alt: Mattermost server list

Where is everything?
--------------------

While Channels, Boards, and Playbooks feature unique functionality within the Global Header, the following features are shared across all three products:

* Your user profile
* Your status and availability
* Product menu

In addition to this documentation, take a look at the Mattermost onboarding tips/tutorials available immediately after installation/upgrade. Note that once the tips/tutorials are dismissed, you won't be able to access them again.

Account Settings
----------------

The Account Settings menu has been split into **Profile** and **Settings**.

Your **Profile** and **Security** settings can be found in **Profile**. Select your avatar in the top-right corner of Mattermost, then choose **Profile**.

Channel-specific options for **Notifications**, **Display**, **Sidebar**, and **Advanced** settings are found in **Settings**. In Channels, select the |gear-icon| in the Global Header, to the left of your avatar, to access Channels settings. 

.. |gear-icon| image:: ../images/settings-outline_F08BB.svg
  :alt: Select the Gear icon to access Channel settings.

Status and availability
-----------------------

Let your team know your online status using `custom status and availability settings <https://docs.mattermost.com/messaging/setting-your-status-availability.html#>`_, which include emojis. Select your avatar in the top-right corner to change your status and availability.

Product menu
------------

In the top-left corner of the Global Header, select the Product menu button to navigate to Channels, Playbooks, and Boards.

Depending on permissions set for your Mattermost, this is also where you would also find Mattermost Integrations, System Console, and Marketplace menu links. You’ll always be able to view the version information of your Mattermost workspace in this menu.

History arrows
--------------

Use the arrows to the right of the Product menu to show the last channel/next channel.

Server list
-----------

If you're using multiple servers (e.g., you're running community, community-release, and a Cloud test server) the Mattermost menu is where your servers are located. To change servers, select the menu and then select the server you want to use.

What else has changed?
----------------------

Some other menu items have moved around. For example:

* Plugins are listed in the Product menu, in the top-left corner of Mattermost.
* System Console is listed in the Product menu, in the top-left corner of Mattermost.
* Managing Custom Emojis can be done from the emoji picker now.

source/archive/cluster-310.rst METASEP
:nosearch:

High Availability Cluster (v3.10 and earlier)
=============================================

*Available in Enterprise Edition E20.*

.. note::

  This document applies to Mattermost Server version 3.10 and earlier. For the latest version, see :doc:`cluster`.

A high availability cluster enables a Mattermost system to maintain service during outages and hardware failures through the use of redundant infrastructure.

High availability in Mattermost consists of running redundant Mattermost application servers, redundant database servers, and redundant load balancers. The failure of any one of these components does not interrupt operation of the system.

.. contents::
  :backlinks: top
  :local:

Requirements for Continuous Operation
-------------------------------------

To enable continuous operation at all times, including during server updates and server upgrades, you must make sure that the redundant components are properly sized and that you follow the correct sequence for updating each of the system's components.

Redundancy at anticipated scale
  Upon failure of one component, the remaining application servers, database servers, and load balancers must be sized and configured to carry the full load of the system. If this requirement is not met, an outage of one component can result in an overload of the remaining components, causing a complete system outage.

Update sequence for continuous operation
  You can apply most configuration changes and dot release security updates without interrupting service, provided that you update the system components in the correct sequence. See the `Upgrade Guide`_ for instructions on how to do this.

  **Exception:** Changes to configuration settings that require a server restart, and server version upgrades that involve a change to the database schema require a short period of downtime. Downtime for a server restart is around 5 seconds, and for a database schema update, downtime can be up to 30 seconds.

Deployment Guide
----------------

Deployment guide to set up and maintain high availability on your Mattermost servers.

Initial Setup Guide for High Availability
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

To ensure your instance and configuration are compatible with high availability, please review the `Configuration and Compatibility`_  section.

.. note::
  Backup your Mattermost database and file storage locations before configuring high availability. For more information about backing up, see :doc:`../administration/backup`.

1. Follow our :doc:`../administration/upgrade` to upgrade your Mattermost server to v3.3 or later.
2. Set up a new Mattermost server with v3.3 or later following one of our **Install Guides**. This server must use an identical copy of the configuration file, ``config.json``. Verify the servers are functioning by hitting each independent server through its private IP address.
3. Modify the ``config.json`` files on both servers to add the ``ClusterSettings`` as described in :ref:`high-availability`.
4. Verify the configuration files are identical on both servers then restart each machine in the cluster.
5. Modify your NGINX setup so that it proxies to both servers. For more information about this, see `Proxy Server Configuration`_.
6. Open **System Console > Advanced > High Availability** in prior versions or **System Console** > **Environment** > **High Availability** in versions after 5.12 to verify all the machines in the cluster are communicating as expected with green status indicators. If not, investigate the log files for any extra information.

Adding a Server to the Cluster
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Backup your Mattermost database and the file storage location. For more information about backing up, see :doc:`../administration/backup`.
2. Set up a new Mattermost server. This server must use an identical copy of the configuration file, ``config.json``. Verify the server is functioning by hitting the private IP address.
3. Modify the ``config.json`` files on all servers with the ``ClusterSettings`` as described in :ref:`high-availability`. Be sure to add the new server URL to ``InterNodeUrls``.
4. Verify that the configuration files are identical on all servers, then restart each machine in the cluster in sequence with 10 or more seconds between each restart.
5. Modify your NGINX setup to add the new server. For information about this, see `Proxy Server Configuration`_.
6. Open the **System Console > Advanced > High Availability** in prior versions or **System Console** > **Environment** > **High Availability** in versions after 5.12 to verify that all the machines in the cluster are communicating as expected with green status indicators. If not, investigate the log files for any extra information.

Removing a Server from the Cluster
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Backup your Mattermost database and the file storage location. For more information about backing up, see :doc:`../administration/backup`.
2. Modify your NGINX setup to remove the server. For information about this, see `Proxy Server Configuration`_.
3. On all servers staying active in the cluster, modify the ``ClusterSettings`` in ``config.json`` to remove the server from ``InterNodeUrls``
4. Verify that the configuration files are identical on all servers, then restart each machine in the cluster in sequence with 10 or more seconds between each restart.
5. Open the **System Console > Advanced > High Availability** in prior versions or **System Console** > **Environment** > **High Availability** in versions after 5.12 to verify that all the machines in the cluster are communicating as expected with green status indicators. If not, investigate the log files for any extra information.

Configuration and Compatibility
-------------------------------
Details on configuring your system for high availability.

Mattermost Server Configuration
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Configuration Settings
^^^^^^^^^^^^^^^^^^^^^^

High availability is configured in the ``ClusterSettings`` section of ``config.json`` and the settings are viewable in the System Console. When high availability is enabled, the System Console is set to read-only mode to ensure all the ``config.json`` files on the Mattermost servers are identical.

.. code-block:: none

  "ClusterSettings": {
        "Enable": false,
        "InterNodeListenAddress": ":8075",
        "InterNodeUrls": []
  }

For more details on these settings, see :ref:`high-availability`.

State
^^^^^

The Mattermost Server is designed to have very little state to allow for horizontal scaling. The items in state considered for scaling Mattermost are listed below:

- In memory session cache for quick validation and channel access,
- In memory online/offline cache for quick response,
- System configuration file that is loaded and stored in memory,
- WebSocket connections from clients used to send messages.

When the Mattermost Server is configured for high availability, the servers  use an inter-node communication protocol on a different listening address to keep the state in sync. When a state changes it is written back to the database and an inter-node message is sent to notify the other servers of the state change. The true state of the items can always be read from the database. Mattermost also uses inter-node communication to forward WebSocket messages to the other servers in the cluster for real-time messages such as  “[User X] is typing.”


Proxy Server Configuration
^^^^^^^^^^^^^^^^^^^^^^^^^^

The proxy server exposes the cluster of Mattermost servers to the outside world. The Mattermost servers are designed for use with a proxy server such as NGINX, a hardware load balancer, or a cloud service like Amazon Elastic Load Balancer.

If you want to monitor the server with a health check you can use ``http://10.10.10.2/api/v3/general/ping`` and check the response for ``Status 200``, indicating success. Use this health check route to mark the server *in-service* or *out-of-service*.

A sample configuration for NGINX is provided below. It assumes that you have two Mattermost servers running on private IP addresses of ``10.10.10.2`` and ``10.10.10.4``.


.. code-block:: none

    upstream backend {
            server 10.10.10.2:8065;
            server 10.10.10.4:8065;
      }

      server {
          server_name mattermost.example.com;

          location ~ /api/v[0-9]+/(users/)?websocket$ {
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
                client_max_body_size 50M;
                proxy_set_header Host $http_host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header X-Frame-Options SAMEORIGIN;
                proxy_buffers 256 16k;
                proxy_buffer_size 16k;
                proxy_read_timeout 600s;
                proxy_pass http://backend;
          }

          location / {
                client_max_body_size 50M;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
                proxy_set_header Host $http_host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header X-Frame-Options SAMEORIGIN;
                proxy_pass http://backend;
          }
    }


You can use multiple proxy servers to limit a single point of failure, but that is beyond the scope of this documentation.

File Storage Configuration
^^^^^^^^^^^^^^^^^^^^^^^^^^

.. note::
  1. File storage is assumed to be shared between all the machines that are using services such as NAS or Amazon S3.
  2. If ``"DriverName": "local"`` is used then the directory at ``"FileSettings":`` ``"Directory": "./data/"`` is expected to be a NAS location mapped as a local directory, otherwise high availability will not function correctly and may corrupt your file storage.
  3. If you’re using Amazon S3 or Minio for file storage then no other configuration is required.

If you’re using the Compliance Reports feature in Enterprise Edition E20, you need to configure the  ``"ComplianceSettings":`` ``"Directory": "./data/",`` to share between all machines or the reports will only be available from the System Console on the local Mattermost server.

Migrating to NAS or S3 from local storage is beyond the scope of this document.

Database Configuration
^^^^^^^^^^^^^^^^^^^^^^

Use the read replica feature to scale the database. The Mattermost server can be set up to use one "master" database and multiple read replica databases. Mattermost distributes read requests across all databases, and sends write requests to the master database, and those changes are then sent to update the read replicas.

On large deployments, consider using the search replica feature to isolate search queries onto one or more database servers. A search replica is similar to a read replica, but is used only for handling search queries.

Sizing Databases
````````````````

For information about sizing database servers, see :ref:`hardware-sizing-for-enterprise`.

In a master/slave environment, make sure to size the slave machine to take 100% of the load in the event that the master machine goes down and you need to fail over.

Deploying a Multi-database Configuration
````````````````````````````````````````

To configure a multi-database Mattermost server:

1. Update the ``DataSource`` setting in ``config.json`` with a connection string to your master database server. The connection string is based on the database type set in ``DriverName``, either ``postgres`` or ``mysql``.
2. Update the ``DataSourceReplicas`` setting in ``config.json`` with a series of connection strings to your database read replica servers in the format ``["readreplica1", "readreplica2"]``. Each connection should also be compatible with the ``DriverName`` setting.

The new settings can be applied by either stopping and starting the server, or by loading the configuration settings as described in the next section.

Once loaded, database write requests are sent to the master database and read requests are distributed among the other databases in the list.

Loading a Multi-database Configuration onto an Active Server
````````````````````````````````````````````````````````````

After a multi-database configuration has been defined in ``config.json``, the following procedure can be used to apply the settings without shutting down the Mattermost server:

1. Go to **System Console > Configuration** and click **Reload Configuration from Disk** to reload configuration settings for the Mattermost server from ``config.json``.
2. Go to **System Console > Database** and click **Recycle Database Connections** to take down existing database connections and set up new connections in the multi-database configuration.

While the connection settings are changing, there might be a brief moment when writes to the master database are unsuccessful. The process waits for all existing connections to finish and starts serving new requests with the new connections. End users attempting to send messages while the switch is happening will have an experience similar to losing connection to the Mattermost server.

Manual Failover for Master Database
```````````````````````````````````

If the need arises to switch from the current master database--for example, if it is running out of disk space, or requires maintenance updates, or for other reasons--you can switch Mattermost server to use one of its read replicas as a master database by updating ``DataSource`` in ``config.json``.

To apply the settings without shutting down the Mattermost server:

1. Go to **System Console > Configuration** in prior versions or **System Console** > **Environment** > **Web Server** in versions after 5.12 and click **Reload Configuration from Disk** to reload configuration settings for the Mattermost server from ``config.json``.
2. Go to **System Console > Database** in prior versions or **System Console** > **Environment** > **Database** in versions after 5.12 and click **Recycle Database Connections** to take down existing database connections and set up new connections in the multi-database configuration.

While the connection settings are changing, there might be a brief moment when writes to the master database are unsuccessful. The process waits for all existing connections to finish and starts serving new requests with the new connections. End users attempting to send messages while the switch is happening can have an experience similar to losing connection to the Mattermost server.

Transparent Failover
````````````````````

The database can be configured for high availability and transparent failover use the existing database technologies. We recommend MySQL Clustering, Postgres Clustering, or Amazon Aurora. Database transparent failover is beyond the scope of this documentation.

Upgrade Guide
-------------

An update is an incremental change to Mattermost server that fixes bugs or performance issues. An upgrade adds new or improved functionality to the server.

Updating Configuration Changes While Operating Continuously
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

A service interruption is not required for most configuration updates. See `Server Upgrades Requiring Service Interruption`_ for a list of configuration updates that require a service interruption.

You can apply updates during a period of low load, but if your HA cluster is sized correctly, you can do it at any time. The system downtime is brief, and depends on the number of Mattermost servers in your cluster. Note that you are not restarting the machines, only the Mattermost server applications. A Mattermost server restart generally takes about 5 seconds.

1. Make a backup of your existing ``config.json`` file.
2. For one of the Mattermost servers, make the configuration changes to ``config.json`` and save the file. Do not reload the file yet.
3. Copy the ``config.json`` file to the other servers.
4. Shut down Mattermost on all but one server.
5. Reload the configuration file on the server that is still running. Go to **System Console > Configuration** in prior versions or **System Console** > **Environment** > **Web Server** in versions after 5.12 and click **Reload Configuration from Disk**
6. Start the other servers.

Updating Server Version While Operating Continuously
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

A service interruption is not required for security patch dot releases of the Mattermost server.

You can apply updates during a period when the anticipated load is small enough that one server can carry the full load of the system during the update.

Note that you are not restarting the machines, only the Mattermost server applications. A Mattermost server restart generally takes about 5 seconds.

1. Review the upgrade procedure in the *Upgrade Enterprise Edition* section of :doc:`../administration/upgrade`.
2. Make a backup of your existing ``config.json`` file.
3. Set your proxy to move all new requests to a single server. If you are using NGINX and it's configured with an upstream backend section in ``/etc/nginx/sites-available/mattermost`` then comment out all but the one server that you intend to update first, and reload NGINX.
4. Shut down Mattermost on each server except the one that you are updating first.
5. Update each Mattermost instance that is shut down.
6. On each server, replace the new ``config.json`` file with your backed-up copy.
7. Start the Mattermost servers.
8. Repeat the update procedure for the server that was left running.

Server Upgrades Requiring Service Interruption
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

A service interruption is required when the upgrade includes a change to the database schema or when a change to ``config.json`` requires a server restart, such as when making the following changes:

  * Default Server Language
  * Rate Limiting
  * Webserver Mode
  * Database
  * High Availability

If the upgrade includes a change to the database schema, the database is upgraded by the first server that starts.

Apply upgrades during a period of low load. The system downtime is brief, and depends on the number of Mattermost servers in your cluster. Note that you are not restarting the machines, only the Mattermost server applications.

1. Review the upgrade procedure in the *Upgrade Enterprise Edition* section of :doc:`../administration/upgrade`.
2. Make a backup of your existing ``config.json`` file.
3. Stop NGINX.
4. Upgrade each Mattermost instance.
5. On each server, replace the new ``config.json`` file with your backed-up copy.
6. Start one of the Mattermost servers.
7. When the server is running, start the other servers.
8. Restart NGINX.

Troubleshooting
---------------

Red Server Status
~~~~~~~~~~~~~~~~~

When high availability is enabled, the System Console displays the server status as red or green, indicating if the servers are communicating correctly with the cluster. The servers use inter-node communication to ping the other machines in the cluster, and once a ping is established the servers exchange information, such as server version and configuration files.

A server status of red can occur for the following reasons:

- **Configuration file mismatch**: Mattermost will still attempt the inter-node communication, but the System Console will show a red status for the server since the high availability feature assumes the same configuration file to function properly.
- **Server version mismatch**: Mattermost will still attempt the inter-node communication, but the System Console will show a red status for the server since the high availability feature assumes the same version of Mattermost is installed on each server in the cluster. It is recommended to use the `latest version of Mattermost <https://mattermost.org/download/>`__ on all servers. Follow the upgrade procedure in :doc:`../administration/upgrade` for any server that needs to be upgraded.
- **Server is down**: If an inter-node communication fails to send a message it makes another attempt in 15 seconds. If the second attempt fails, the server is assumed to be down. An error message is written to the logs and the System Console shows a status of red for that server. The inter-node communication continues to ping the down server in 15 second intervals. When the server comes back up, any new messages are sent to it.

WebSocket Disconnect
~~~~~~~~~~~~~~~~~~~~

When a client WebSocket receives a disconnect it will automatically attempt to re-establish a connection every three seconds with a backoff. After the connection is established, the client attempts to receive any messages that were sent while it was disconnected.

source/archive/cloud-webhook.rst METASEP
:nosearch:

Using Mattermost with webhook
==============================

`Webhook <https://github.com/adnanh/webhook>`__ is a Golang application for setting up webhooks on a server with minimal configuration. It provides a simple way to trigger events on a server while keeping it separate from your web server.

Mattermost's outgoing webhooks feature  can be used with this fairly easily as long as you take a few things into account.

Sending information from Mattermost
------------------------------------

Mattermost's :doc:`interactive message buttons <../developer/interactive-messages>` send information using a parameter called "context." The easiest way to get all the information from Mattermost is to use the following configuration, which will pass the entire payload to your script as a string:

.. code-block:: json

  {
  	"source": "entire-payload"
  }

Responding to the request
-------------------------

If you don't respond to the request you'll see an error in your Mattermost logs that looks like ``Action integration error [details: err=EOF]``.

To solve this, use the ``response-message`` configuration property to send back a response to prevent this. This response is sent immediately after receiving the webhook. 

If your script doesn't take very long to run you can use the ``include-command-output-in-response`` property to send that output to the Mattermost server.

Authenticating requests
-----------------------

Mattermost can be configured to send a token with an outgoing webhook to make sure that your webhook only responds to authorized requests. To enable this, use the following in your webhook configuration:

.. code-block:: json

  "trigger-rule":
  {
    "match":
    {
      "type": "value",
      "value": "<Outgoing webhook token>",
      "parameter":
      {
        "source": "request",
        "name": "token"
      }
    }
  }

source/archive/cloud-user-satisfaction-surveys.rst METASEP
:nosearch:

User satisfaction surveys
==========================

|all-plans| |cloud|

.. |all-plans| image:: ../images/all-plans-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in Mattermost Free and Starter subscription plans.

.. |cloud| image:: ../images/cloud-badge.png
  :scale: 30
  :target: https://mattermost.com/download
  :alt: Available for Mattermost Cloud deployments.

Mattermost provides in-product feedback surveys. Feedback is used to measure user satisfaction and improve product quality by hearing directly from users. Please refer to our `privacy policy <https://github.com/mattermost/mattermost-server/blob/master/build/PRIVACY_POLICY.md>`_ for more information on the collection and use of information received through our services.

.. contents::
  :depth: 2
  :local:
  :backlinks: entry

Administration
--------------

Is the survey enabled by default?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The user satisfaction survey is a pre-packaged plugin, and surveys are enabled by default. However, the plugin will not be activated on any workspaces that have `Error and Diagnostic Reporting <https://docs.mattermost.com/manage/telemetry.html>`__ disabled, meaning no surveys or data collection occurs.

How can surveys be disabled?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Disabling the **User Satisfaction Surveys** plugin from **System Console > Plugins > Plugin Management** will disable surveys and all data collection by the plugin. If surveys have been disabled from the plugin configuration in **System Console > Plugins > User Satisfaction Surveys** but the plugin itself is still enabled, surveys will not be scheduled but users can still send written feedback by messaging Surveybot.

If the plugin or surveys in the plugin configuration are disabled, they will remain disabled.

When is the survey scheduled?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Users will receive a survey every 90 days, assuming the following conditions are true:

- User Satisfaction Surveys plugin is enabled in **System Console > Plugins > Plugin Management**
- Surveys are enabled in the plugin configuration in **System Console > Plugins > User Satisfaction Surveys**
- User account is greater than 21 days old
- User has not completed a survey in the last 90 days

How will I be notified a survey is scheduled?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

System Admins will receive an email notification and in-product Direct Message from "Surveybot" mentioning the scheduled date the survey will be triggered.

.. image:: ../images/nps-admin.png

Survey Data
-----------

How is the survey received?
~~~~~~~~~~~~~~~~~~~~~~~~~~~

Once the survey is triggered on the workspace, all users will receive an in-product Direct Messages from "Surveybot" on their next login or page refresh in Mattermost.

Users can optionally select a 0-10 score on how likely they are to recommend Mattermost and then provide written feedback about their experience. Selecting a score and providing feedback are optional, and the survey can be ignored without interrupting usage of Mattermost.

.. image:: ../images/nps-survey.png

What data is collected?
~~~~~~~~~~~~~~~~~~~~~~~

Data is only collected when a user selects a score or provides written feedback in response to survey questions. Please refer to our `privacy policy <https://mattermost.com/privacy-policy/>`__ for more information on the collection and use of information received through our services. The following **non-personally identifiable information** is collected:

- Survey information:
   - Score (0-10) submitted by the user
   - Written feedback submitted by the user (if applicable)
   - Timestamp of the survey submission
- User information:
   - User role (System Admin, Team Admin, or member)
   - Account creation timestamp
   - User ID of the surveyed user


source/archive/cloud-user-management.rst METASEP
:nosearch:

Managing Members
================

Inviting Team Members
---------------------

If you have the required permissions, you can add people to your team via a direct invite, a public team invite link, or if they already have an account on the server, you can add them to the team yourself.

You can also `enable guest access <https://docs.mattermost.com/deployment/guest-accounts.html>`__. A guest is a special role that is restricted to only the channels they have been invited to. When this is enabled, you can invite guests or users external to the organization such as vendors or customers.

Sending Direct Invites
~~~~~~~~~~~~~~~~~~~~~~

Direct invites are invitation emails sent from your team's server directly to the invited person's email address. A link within the invitation directs them to an account creation page. Invitation links sent by email expire after 48 hours and can only be used once. A System Admin can invalidate all active invitation links via **System Console > Authentication > Signup > Invalidate pending email invites**.

**To send a direct invite**

1. Click your username at the top of the Navigation Panel.
2. Click **Invite People**.
3. If there is an option to invite members and guests, choose **Invite Members**.
4. In the **Invite People** field enter the email address of the person you want to add.
5. Click **Invite Members**.

**To send an invite to a guest**

1. Click your username at the top of the Navigation Panel.
2. Click **Invite People**.
3. If there is an option to invite members and guests, choose **Invite Guests**.
4. In the **Invite People** field enter the email address of guest you want to add. You can add multiple email addresses to invite more than one guest.
5. Specify the channels the guest will be able to access.
6. [Optional] Add a custom message to be included in the invitation to the guest.
7. Click **Invite Guests**.

.. note::

   If you aren't able to see the **Invite Guests** option, confirm with your System Admin that you have the correct permissions.
   
.. note::
  
   If you don't see the **Send Email Invite** option, confirm with your System Admin that **System Console > Authentication > Signup > Enable Email Invitations**.

Sending Team Invite Links
~~~~~~~~~~~~~~~~~~~~~~~~~

The team invite link is a unique URL that directs people to an account creation page for a team. A team invite link can be used by anyone and does not change unless it is re-generated by a System Admin or Team Admin via **Team Settings > General > Invite Code**. For example, the team invite link can be included in a company-wide email to invite all employees to join a Mattermost team.

**To get a team invite link**

1. Click your username at the top of the Navigation Panel.
2. Click **Invite People**.
3. If there is an option to invite members and guests, choose **Invite Members**.
4. Click the **Copy Link** button to save the URL to your clipboard and share it with those you want to invite to the team.

Adding Someone to Your Team
~~~~~~~~~~~~~~~~~~~~~~~~~~~

If someone you want to add to your team already has an account on the server, you can add them to your team without sending an invitation.

**To add someone to your team**

1. Click your username, at the top of the Navigation Panel.
2. Click **Invite People**.
3. If there is an option to invite members and guests, choose **Invite Members**.
4. In the **Invite People** menu search for the person you want to add. If the people you want to add are not on the list, then they do not have an account on your server.
5. Click **Invite Members**.

**To add existing guests to your team**

1. Click your username, at the top of the Navigation Panel.
2. Click **Invite People**.
3. If there is an option to invite members and guests, choose **Invite Guests**.
4. In the **Invite People** menu search for the guest you want to add. If the people you want to add are not on the list, then they do not have an account on your server.
5. Specify the channels the guest will have access to.
6. Click **Invite Guests**.

.. note:: 
   
   If you aren't able to see the **Invite Guests** option, confirm with your System Admin that you have the correct permissions.

.. note::
  
  System Admins can view and add team membership to individual users on the user profile page (**System Console > Users > User Profile**) by clicking **Add Team**.

About User Roles
----------------

There are six types of user roles with different permission levels in Mattermost: System Admins, Team Admins, Channel Admins, Members, Guests, and Inactive accounts. To view a list of users on the team and what their roles are, Team Admins can go to the three dot **Main Menu** and select **Manage Members**.

System Admin
~~~~~~~~~~~~

The first user added to a newly-installed Mattermost system is assigned the System Admin role.

The System Admin is typically a member of the IT staff and has all the privileges of a Team Admin, along with the following additional privileges:

- Access to the System Console from the main menu in any team site.
- Ability to change any setting on the Mattermost server available in the System Console.
- Ability to promote and demote other users from Member role to System Admin role (and vice versa).
- Ability to promote and demote other users to and from Guest role.
- Ability to deactivate user accounts and to reactivate them.
- Access to private channels, but only if given the link to the private channel.

A System Admin can view and manage users in **System Console > Users**. They can search users by name, filter users by teams, and filter to view other System Admins as well as inactive users.

Team Admin
~~~~~~~~~~

When a team is first created, the person who set it up is made a Team Admin. It is a team-specific role, meaning that someone can be a Team Admin for one team but only a Member on another team. Team Admins have the following privileges:

- Access to the **Team Settings** menu from the team site main menu.
- Ability to change the team name and import data from Slack export files.
- Access to the **Manage Members** menu, where they can control whether team members are a **Member** or a **Team Admin**.

Channel Admin
~~~~~~~~~~~~~

The person who creates a channel is assigned the Channel Admin role for that channel. People with the Channel Admin role have the following privileges:

- Ability to assign the Channel Admin role to other members of the channel.
- Ability to remove the Channel Admin role from other holders of the Channel Admin role.
- Ability to remove members from the channel.

Depending on your system configuration, Channel Admins can be granted special permissions by the System Admin to rename and delete channels.

Member
~~~~~~

This is the default role given to users when they join a team. Members have basic permissions on the Mattermost team.

Guest
~~~~~~~

Guest is a role with restricted permissions, which allow organizations to collaborate with users outside of their organization, and control what channels they are in and who they can collaborate with.

Guests can: 

- Pin messages to channels.
- Use slash commands (with the exception of those used to invite members).
- Favorite channels.
- Mute channels.
- Update their profile.

Guests cannot:

- Discover public channels.
- Join open teams.
- Create direct messages or group messages with members who aren’t within the same channel.

User With Personal Access Token Permission
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

A System Admin can enable `personal access tokens <https://docs.mattermost.com/developer/personal-access-tokens.html>`__ and give permissions for that account to create personal access tokens in **System Console > Users**.

In addition, the System Admin can optionally set the following permissions for the account, useful for integrations and bot accounts:

- **post:all**: Allows the account to post to all Mattermost channels including direct messages.
- **post:channels**: Allows the account to post to all Mattermost public channels.

Deactivating Users
~~~~~~~~~~~~~~~~~~

A System Admin can deactivate user accounts via **System Console > Users** for a list of all users on the server. The list can be searched and filtered to make finding users easier. Click the user's role and in the menu that opens, click **Deactivate**.

When **Deactivate** is selected, the user is logged out of the system, and receives an error message if they try to log back in. The user no longer appears in channel member lists, and they are removed from the team members list. A deactivated account can also be reactivated from the System Console, in which case the user rejoins channels and teams that they previously belonged to.

Direct Message channels with deactivated users are hidden in users' sidebars, but can be reopened using the **More...** button or the Channel Switcher (CMD/CTRL + K).

Mattermost is designed as a system-of-record, so there isn't an option to delete users from the Mattermost system, as such an operation could compromise the integrity of message archives.

Note that AD/LDAP user accounts cannot be deactivated from Mattermost; they must be deactivated from your Active Directory.

Removing a User from a Team or Leaving a Team
---------------------------------------------

Remove User from Team
~~~~~~~~~~~~~~~~~~~~~

A Team Admin can remove a user from a team via **Main Menu > Manage Members**, and selecting **Remove From Team** in the dropdown menu beside a user entry.

When a user is removed from a team, the team will no longer show up in their team sidebar. If they currently have the team open, they are redirected to the first team that appears on their team sidebar. If they didn't belong to any other teams, the user is sent to the team selection page.

Removing a user from the team does not deactivate the account. The user will still be able to sign in to the site, and join other teams. They will also be able to rejoin the team they were removed from if they receive another invite, or if the team is set to `"Allow any user with an account on this server to join this team" <https://docs.mattermost.com/help/settings/team-settings.html#allow-anyone-to-join-this-team>`__. If the user does rejoin the team, they will no longer belong to the channels they were previously a part of, and they will lose all Admin privileges if they had them previously.

A System Admin can also remove users from teams via **System Console > Users**, and selecting the dropdown beside a user entry and clicking **Manage Teams**. The list of teams an individual user belongs to can be viewed on the user's profile page via **System Console > Users** and selecting the member's name from the list provided in the **User Configuration** screen.

Leaving a Team
~~~~~~~~~~~~~~

Users can also choose to remove themselves from a team, from **Main Menu > Leave Team**. This will remove the user from the team, and from all public channels and private channels on the team.

They will only be able to rejoin the team if it is set to `"Allow any user with an account on this server to join this team" <https://docs.mattermost.com/help/settings/team-settings.html#allow-anyone-to-join-this-team>`__ team, or if they receive a new invite. If they do rejoin, they will no longer be a part of their old channels.

Obtaining User ID
~~~~~~~~~~~~~~~~~

A unique user ID is sometimes required for configuring certain plugins and other administrative tasks that require identifying specific users. This identifier can be found in both the user list (**System Console > Users**) as well as the individual profile page for each user (**System Console > Users**).

About System Roles (Beta)
-------------------------

System Admins can use the System Console to manage additional System Admin roles and privileges.

- **System Manager:** The System Manager has read/write permissions for management areas of the System Console, such as user management and integrations. This role has read only access to authentication, reporting, and plugins.
- **User Manager:** The User Manager role is able to read/write to all the user management areas. The authentication interface is read only.
- **Viewer:** This role is able to access all pages of the System Console but has no write access to any pages.

When a user is assigned a system role, they have access the System Console. As each role has a different set of default permissions the items that they can view depend on the role they've been assigned.

**System Manager**

  - Read/Write
      - User Management
      - Integrations
  - Read Only
     - Reporting
     - Authentication
     - Plugins

**User Manager**

  - Read/Write
      - User Management 
         - Groups
         - Teams
         - Channels       
  - Read Only
      - Authentication

**Viewer**

  - Read Only
     - All pages within the System Console
     
Assigning System Roles
-----------------------

**To grant the System Manager role to a single user called Bob Smith:**

1. Go to **System Console > User Management > System Roles (Beta)** then select the **System Manager** role.

2. Under **Assigned People**, choose **Add People**.

3. Search for and select **Bob Smith**, then select **Add** to grant the System Manager role to that user.

**To grant the User Manager role to two users, Bob Smith and Sue Clark:**

1. Go to **System Console > User Management > System Roles (Beta)** then select the **User Manager** role.

2. Under **Assigned People**, choose **Add People**.

3. Search for and select **Bob Smith** and **Sue Clark**, then select **Add** to grant the User Manager role to those users.

**To grant the Viewer role to two users, Bob Smith and Sue Clark:**

1. Go to **System Console > User Management > System Roles (Beta)** then select the **Viewer** role.

2. Under **Assigned People**, select **Add People**.

3. Search for and select **Bob Smith** and **Sue Clark**, then select **Add** to grant the Viewer role to those users.

**To remove the System Manager role from a single user called Bob Smith:**

1. Go to **System Console > User Management > System Roles (Beta)** then select the **Viewer** role.

2. Under **Assigned People** search for **Bob Smith**, then select **Remove**.

Editing Privileges of System Roles
----------------------------------

Each of the system roles have defined, default privileges as outlined above. 

System Admins can grant read and write access to other areas of the System Console, as well as remove read and write access (including default access), for each role. This is completed using the System Console.

1. Go to **System Console > User Management > System Roles (Beta)** then select the **System Manager**, **User Manager**, or **Viewer** role.

2. For each set of privileges, select the access level as **Can edit**, **Read only**, or **No access**.

**Note:** If you set privilege subsections to different access levels then the privilege access level displays as **Mixed Access**.

**To grant write access to the Authentication section of the System Console for all users with the User Manager role:**

1. Go to **System Console > User Management > System Roles (Beta)** then select the **User Manager** role.

2. Under **Privileges > Authentication** select **Can edit**, then select **Save**.

**To grant read only access to the Authentication section of the System Console for all users with the User Manager role:**

1. Go to **System Console > User Management > System Roles (Beta)** then select the **User Manager** role.

2. Under **Privileges > Authentication** select **Read only**, then select **Save**.

**To remove write access to the Authentication section of the System Console for all users with the User Manager role:**
  
1. Go to **System Console > User Management > System Roles (Beta)** then select the **User Manager** role.

2. Under **Privileges > Authentication** select **No access**, then choose **Save**.

source/archive/cloud-troubleshooting-mobile.rst METASEP
:nosearch:

Troubleshooting Mobile Applications
===================================

Login with ADFS/Office365 is not working
----------------------------------------

In line with Microsoft guidance we recommend `configuring intranet forms-based authentication for devices that do not support WIA <https://docs.microsoft.com/en-us/windows-server/identity/ad-fs/operations/configure-intranet-forms-based-authentication-for-devices-that-do-not-support-wia>`_.

I have a different problem!
----------------------------

For more troubleshooting help, `open a new topic in our forums <https://forum.mattermost.com/c/trouble-shoot>`__ with steps to reproduce your issue. If you're a Cloud subscriber, you may reach our Support team via our `Contact Us page <https://customers.mattermost.com/cloud/contact-us>`_.

To help us narrow down whether it’s a server configuration issue, device specific issue, or an issue with the app please try the following steps and include the results in your support request:

**Connect to our community workspace**

1. Create an account at https://community.mattermost.com.
2. Delete your mobile application and reinstall it.
3. In your mobile app, enter the server URL https://community.mattermost.com and then your login credentials to see if the connection is working.

**Connect with another device**

- If you have another mobile device available, try connecting with that to see if your issue still reproduces.
- If you don’t have another device available, check with other teammates to see if they are having the same issue.

source/archive/cloud-team-and-channel.rst METASEP
:nosearch:

Managing team and channel members
=================================

System Admins can manage channel configuration in the System Console.

- **Management:** Manage sync, moderation, and membership settings.
- **Promoting/demoting Team and Channel Admins:** Team and Channel Admins can be demoted via the System Console.
- **View channel members:** System Admins can view members of a channel without having to join the channel.
- **Member count:** Total member count in a team or channel.
- **Archive channels:** System Admins can archive channels without having to join the channel.

Teams
------

|all-plans| |cloud| |self-hosted|

.. |all-plans| image:: ../images/all-plans-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in Mattermost Free and Starter subscription plans.

.. |enterprise| image:: ../images/enterprise-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in the Mattermost Enterprise subscription plan.

.. |professional| image:: ../images/professional-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in the Mattermost Professional subscription plan.

.. |cloud| image:: ../images/cloud-badge.png
  :scale: 30
  :target: https://mattermost.com/download
  :alt: Available for Mattermost Cloud deployments.

.. |self-hosted| image:: ../images/self-hosted-badge.png
  :scale: 30
  :target: https://mattermost.com/deploy
  :alt: Available for Mattermost Self-Hosted deployments.

To view and manage team information, navigate to **System Console > Teams**. Teams can be managed by **Group Sync** or **Invite Only**. The type of management in use may affect the management options available for that team.

Select a team to view its configuration options.

Team profile
~~~~~~~~~~~~

|all-plans| |cloud| |self-hosted|

The name and description of the team.

System Admins can archive or unarchive the team from within **User Management > Teams > Team Management**. Archiving a team makes its contents inaccessible for all users. All related information is archived, including posts from the database. Before archiving a team, we recommend that you perform a database backup.

Archiving a team
^^^^^^^^^^^^^^^^

|all-plans| |cloud| |self-hosted|

Select **Archive Team**, then select **Save**. Select **Archive** when prompted to confirm the team archive.

Alternatively, System Admins can use the mmctl ``mmctl team archive`` to archive teams. See the `mmctl product documentation <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-team-archive>`__ for details.

Unarchiving a team
^^^^^^^^^^^^^^^^^^

|all-plans| |cloud| |self-hosted|

Select **Unarchive Team**, then select **Save**.

Alternatively, System Admins can use the mmctl ``mmctl team restore`` to unarchive teams. See the `mmctl product documentation <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-team-restore>`__ for details.

Team management
~~~~~~~~~~~~~~~

|enterprise| |cloud| |self-hosted|

- When **Sync Group Members** is enabled, the **Synced Groups** list is visible and additional groups can be added.
- When **Sync Group Members** is not enabled, invitation limitations can be selected.

Groups
~~~~~~~

|enterprise| |cloud| |self-hosted|

You can add and remove groups, as well as promote or demote group members to Team Admin/Member roles.

Members
~~~~~~~~

|all-plans| |cloud| |self-hosted|

A list of all members in a channel is visible to System Admins. Members can be added and removed from the team members and be promoted or demoted to a Team Admin/Member role. Use the role **Filter** to refine your search results. You can use one filter, or combine filters to search by multiple roles:

- Guest
- Member
- Team Admin
- System Admin

Channels
--------

|all-plans| |cloud| |self-hosted|

To view and manage channel information, navigate to **System Console > Channels**. Channels can be managed by **Group Sync** or **Manual Invites**. The type of management in use may affect the management options available for that channel. Use the **Filter** to refine your search results. You can use one filter, or combine filters to search by channel and management type:

- Public channels
- Private channels
- Archived channels
- Channels that are synchronized to an AD/LDAP Group
- Channels with users who were invited manually (not synced from LDAP)

Select a channel to view its configuration options.

Profile
~~~~~~~

|all-plans| |cloud| |self-hosted|

The name and description of the channel. To archive the channel, select **Archive Channel > Save**. The channel is still searchable in the **Channels** list. To unarchive the channel, select **Unarchive Channel** and **Save**.

Channel management
~~~~~~~~~~~~~~~~~~

|enterprise| |cloud| |self-hosted|

- When **Sync Group Members** is enabled, the **Synced Groups** list is visible and additional groups can be added.
- When **Sync Group Members** is not enabled, you can select whether the channel is **Private** or **Public**.

Channel moderation
~~~~~~~~~~~~~~~~~~~

|enterprise| |professional| |cloud| |self-hosted|

Channel moderation settings allow Admins to restrict actions within specific channels. These actions include:

- **Make channel read-only:** The ability for Admins to turn off posting in specified channels.
- **Restrict reactions:** Turn off the ability for members and guests to post reactions.
- **Restrict channel mentions:** Turn off the ability for users to post channel wide mentions (@all/channel/here) in specified channels.
- **Channel member management:** Only Admins have the ability to add and remove channel members in the specified channels.

These settings are modified in **System Console > User Management > Channels**.

.. note:: 
   
   These settings are applicable only to Guests and Members. System, Team, and Channel Admins are not affected. If you wish to grant posting ability to a specific member, you must first promote that member to Channel Admin.

The availability of channel moderation settings can also be affected by existing system and team permissions configurations. If there are existing configurations that override the channel settings you would like to apply, it will be indicated in the user interface. These settings can then be adjusted in the relevant panel in the **Permissions** section of the System Console.

**Configure a channel so that members can post/reply/react but guests can only read and react.**

1. Navigate to **System Console > User Management > Channels**.
2. Select **Edit** next to the name of the channel you want to configure.
3. In the **Create Posts** panel, uncheck **Guests**.
4. In the **Post Reactions** panel, uncheck **Guests** if required.
5. Select **Save**.

The channel is available for all members and guests to access, but guests can only read messages and react to them.

**Create an anouncement channel where only Channel Admins are able to post (read-only).**

1. Create a new channel (either Public or Private).
2. Navigate to **System Console > User Management > Channels**.
3. Select **Edit** next to the name of the channel you just created (you may need to search for it).
4. In the **Create Posts** panel, uncheck **Guests** and **Members**.
5. In the **Post Reactions** panel, uncheck **Guests** and **Members**.
6. Select **Save**.

The channel is available for all members and guests to access but only Admins can post.

Groups
~~~~~~

|enterprise| |cloud| |self-hosted|

You can add and remove groups, as well as promote or demote group members to Team Admin/Member roles.

Members
~~~~~~~

|all-plans| |cloud| |self-hosted|

A list of all members in a channel is visible to System Admins. Members can be added and removed from the team members and be promoted or demoted to a Team Admin/Member role. Use the role **Filter** to refine your search results. You can use one filter, or combine filters to search by multiple roles:

- Guest
- Member
- Channel Admin
- System Admin

source/archive/cloud-sso-saml.rst METASEP
:nosearch:

SAML Single Sign-On
====================

|enterprise| |professional| |cloud|

.. |enterprise| image:: ../images/enterprise-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in the Mattermost Enterprise subscription plan.

.. |professional| image:: ../images/professional-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in the Mattermost Professional subscription plan.

.. |cloud| image:: ../images/cloud-badge.png
  :scale: 30
  :target: https://mattermost.com/download
  :alt: Available for Mattermost Cloud deployments.

Single sign-on (SSO) is a way for users to log into multiple applications with a single user ID and password without having to re-enter their credentials. The SAML standard allows identity providers to pass credentials to service providers. Mattermost can be configured to act as a SAML 2.0 Service Provider. 

Mattermost can be configured to act as a SAML 2.0 Service Provider. The SAML Single sign-on integration offers the following benefits:

- **Single sign-on.** Users can sign-in to Mattermost with their SAML credentials.
- **Centralized identity management.** Mattermost accounts automatically pull user attributes from SAML upon login, such as full name, email, and username.
- **Automatic account provisioning.** Mattermost user accounts are automatically created the first time a user signs in with their SAML credentials on the Mattermost workspace.
- **Sync groups to predefined roles in Mattermost.** Assign team and channel roles to groups via LDAP Group Sync.
- **Compliance alignment with administrator management.** Manage Administrator access to Mattermost in the System Console using SAML attributes.

SAML Single sign-on itself does not support periodic updates of user attributes nor automatic deprovisioning. However, SAML with AD/LDAP sync can be configured to support these use cases.

For more information about SAML, see `this article from Varonis <https://www.varonis.com/blog/what-is-saml/>`_, and `this conceptual example from DUO <https://duo.com/blog/the-beer-drinkers-guide-to-saml>`_.

Mattermost officially supports Okta, OneLogin, and Microsoft ADFS as the identity providers (IDPs), please see links below for more details on how to configure SAML with these providers.

 - `Okta SAML Configuration <https://docs.mattermost.com/onboard/sso-saml-okta.html>`_
 - `OneLogin SAML Configuration <https://docs.mattermost.com/onboard/sso-saml-onelogin.html>`_
 - `Microsoft ADFS SAML Configuration for Windows Server 2012 <https://docs.mattermost.com/onboard/sso-saml-adfs.html#configure-saml-with-microsoft-adfs-for-windows-server-2012>`_
 - `Microsoft ADFS SAML Configuration for Windows Server 2016 <https://docs.mattermost.com/onboard/sso-saml-adfs-msws2016.html#configure-saml-with-microsoft-adfs-using-microsoft-windows-server-2016>`_

In addition to the officially supported identity providers, you can also configure SAML for a custom IdP. For instance, customers have successfully set up Azure AD, DUO, PingFederate, Keycloak, and SimpleSAMLphp as a custom IdPs. Because we do not test against these identity providers, it is important that you test new versions of Mattermost in a staging environment to confirm it will work with your identity provider. You can also set up MFA on top of your SAML provider for additional security.

Using SAML attributes to apply roles
------------------------------------

You can use attributes to assign roles to specified users on login. To access the SAML attribute settings navigate to **System Console > Authentication > SAML 2.0**.

Username attribute
~~~~~~~~~~~~~~~~~~

(Optional) Enter a SAML assertion filter to use when searching for users.

1. Go to **System Console > Authentication > SAML 2.0**.
2. Complete the **Username Attribute** field.
3. Select **Save**.

When the user accesses the Mattermost URL, they log in with same username and password that they use for organizational logins.

Guest attribute
~~~~~~~~~~~~~~~

When enabled, the guest attribute in Mattermost identifies external users whose SAML assertion is guest and who are invited to join your Mattermost workspace. These users will have the Guest role applied immediately upon first sign-in instead of the default member user role. This eliminates having to manually assign the role in the System Console.

If a Mattermost Guest user has the guest role removed in the SAML system, the synchronization processes will not automatically promote them to a member user role. This is done manually via **System Console > User Management**. If a member user has the Guest Attribute added, the synchronization processes will automatically demote the member user to the guest role.

**Enable Guest Access**

1. Go to **System Console > Authentication > SAML 2.0**.
2. Complete the Guest Attribute field.
3. Select **Save**.

When a guest logs in for the first time they are presented with a default landing page until they are added to channels.

See the `Guest Accounts documentation <https://docs.mattermost.com/onboard/guest-accounts.html>`_ for more information about this feature.

Admin attribute
~~~~~~~~~~~~~~~

(Optional) The attribute in the SAML Assertion for designating System Admins. The users selected by the query will have access to your Mattermost workspace as System Admins. By default, System Admins have complete access to the Mattermost System Console.

Existing members that are identified by this attribute will be promoted from member to System Admin upon next login. The next login is based upon Session lengths set in **System Console > Session Lengths**. It is recommended that users are manually demoted to members in **System Console > User Management** to ensure access is restricted immediately.

1. Go to **System Console > Authentication > SAML 2.0**.
2. Set **Enable Admin Attribute** to **true**.
3. Complete the **Admin Attribute** field.
4. Select **Save**.

**Note:** If the Admin Attribute is set to ``false`` the member's role as System Admin is retained. However, if the attribute is removed/changed, System Admins that were promoted via the attribute will be demoted to members and will not retain access to the System Console. When this attribute is not in use, System Admins can be manually promoted/demoted in **System Console > User Management**.

Configuration assistance
-------------------------

We're open to providing assistance when configuring your custom IdP by answering Mattermost technical configuration questions and working with your IdP provider in support of resolving issues as they relate to Mattermost SAML configuration settings. However, we can't guarantee your connection will work with Mattermost.

To assist with the process of getting a user file for your custom IdP, see this `documentation <https://github.com/icelander/mattermost_generate_user_file>`_.

For technical documentation on SAML, see `SAML Single-Sign-On: Technical Documentation <https://docs.mattermost.com/onboard/cloud-sso-saml-technical.html>`_.

Please note that we may not be able to guarantee that your connection will work with Mattermost, however we will consider improvements to our feature as we are able. You can see more information on getting support `here <https://mattermost.com/support/>`_ and submit requests for official support of a particular provider on our `feature idea forum <https://mattermost.uservoice.com>`_.

source/archive/cloud-sso-saml-technical.rst METASEP
:nosearch:

SAML Single-Sign-On: technical documentation
============================================

Security Assertion Markup Language (SAML) is an open standard that allows identity providers (IdP), like OneLogin, to pass authorization credentials to service providers (SP), like Mattermost.

In simpler terms, it means you can use one set of credentials to log in to many different sites. With a SAML identity provider account, you can log in to Mattermost and other sites securely with the same account. The main benefit is that it helps administrators centralize user management by controlling which sites users have access to with their SAML identity provider credentials.

Mattermost supports using a single metadata URL to retrieve configuration information for the Identity Provider using your Single Sign-on URL to generate an IdP metadata URL. The IdP metadata XML file contains the IdP certificate, the entity ID, the redirect URL, and the logout URL. 

Using this URL populates the SAML SSO URL and the Identity Provider Issuer URL fields in the configuration process automatically and the Identity Provider Public Certificate is also downloaded from the server and set locally.

.. contents::
  :backlinks: top
  :local:

SAML providers
--------------

**Identity Providers (IdP):** An identity provider performs the authentication. When a user clicks to log in, the identity provider confirms who the user is, and sends data to the service provider with the proper authorization to access the site.

*Examples*: OneLogin, Okta, Microsoft Active Directory (ADFS) or Azure.

**Service Providers (SP):** A service provider gets authentication and authorization information from an IdP. Once received, it gives the user access to the system and logs the user in.

*Examples*: Mattermost, Zendesk, Zoom, Salesforce.

SAML request (AuthNRequest)
---------------------------

When Mattermost initiates an SP-initiated SAML request flow, it generates a **HTTP-Redirect** binding request to the IdP that contains an XML payload as a base64 string:

.. code-block:: none

 bM441nuRIzAjKeMM8RhegMFjZ4L4xPBHhAfHYqgnYDQnSxC++Qn5IocWuzuBGz7JQmT9C57nxjxgbFIatiqUCQN17aYrLn/mWE09C5mJMYlcV68ibEkbR/JKUQ+2u/N+mSD4/C/QvFvuB6BcJaXaz0h7NwGhHROUte6MoGJKMPE=

AuthNRequests can also be signed by Mattermost in which case the XML payload is similar to:

.. code-block:: XML

  <samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" xmlns:samlsig="https://www.w3.org/2000/09/xmldsig#" ID="_u5mpjadp1fdozfih4cj8ap4brh" Version="2.0" ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" AssertionConsumerServiceURL="http://localhost:8065/login/sso/saml" IssueInstant="2019-06-08T16:00:31Z">
      <saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">https://www.okta.com/exkoxukx1D8OIfY03356</saml:Issuer>
      <samlsig:Signature Id="Signature1">
          <samlsig:SignedInfo>
              <samlsig:CanonicalizationMethod Algorithm="https://www.w3.org/2001/10/xml-exc-c14n#"></samlsig:CanonicalizationMethod>
              <samlsig:SignatureMethod Algorithm="https://www.w3.org/2000/09/xmldsig#rsa-sha1"></samlsig:SignatureMethod>
              <samlsig:Reference URI="#_u5mpjadp1fdozfih4cj8ap4brh">
                  <samlsig:Transforms>
                      <samlsig:Transform Algorithm="https://www.w3.org/2000/09/xmldsig#enveloped-signature"></samlsig:Transform>
                  </samlsig:Transforms>
                  <samlsig:DigestMethod Algorithm="https://www.w3.org/2000/09/xmldsig#sha1"></samlsig:DigestMethod>
                  <samlsig:DigestValue></samlsig:DigestValue>
              </samlsig:Reference>
          </samlsig:SignedInfo>
          <samlsig:SignatureValue></samlsig:SignatureValue>
          <samlsig:KeyInfo>
              <samlsig:X509Data>
                  <samlsig:X509Certificate>MIIFmzCCA4OgAwIBAgIJAIusvV3gZIwiMA0GCSqGSIb3DQEBCwUAMGIxCzAJBgNVBAYTAlVTMRIwEAYDVQQHDAlQYWxvIEFsdG8xEzARBgNVBAoMCk1hdHRlcm1vc3QxDzANBgNVBAsMBkRldk9wczEZMBcGA1UEAwwQYmFzZS5leGFtcGxlLmNvbTAeFw0xOTA2MDcxMjQ0MTdaFw0yOTA2MDQxMjQ0MTdaMGIxCzAJBgNVBAYTAlVTMRIwEAYDVQQHDAlQYWxvIEFsdG8xEzARBgNVBAoMCk1hdHRlcm1vc3QxDzANBgNVBAsMBkRldk9wczEZMBcGA1UEAwwQYmFzZS5leGFtcGxlLmNvbTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALAfDj+RyByszTOPRL4b+cilNF/3PB1I0CG3TNzgllgy5CwRGHLKn5/t8rPsJoWLKOUGenzVdXWuoVi3jyl5FZ1N60CBbXfmSWk20dSIkcYCcYEgs1BTBqKKYFw2dV4M0oppzNtlq7A0Glpg/gpaR/2TXEPAhOsUfORC2qAdJt9ev0AQjp5V0TkIKMZz8oo33Coi38TG5r/LG+ihRbpWzO7j9Rc2S5I6bczvG4wOg7nVKG+B5XBvuU9PjSqgxpd/F/fYf+ggAEru58E+VM4veCRV8vSPbBqDG4FMPV6DiA+tH/70n6zuPCS3soxX00kjKtP80QD6UgzvM2NN7PHiNlf0Zj6VCU3VdjEnypg7dzlHJuyyaAaTD5nSfkecamEoJpq7kaUB7uTmBHELRUhOOy24f54HnP72vnxicZL8cWsOkJwQAqIGzBxQ7J0uX4Os71WrV2YIur8QVk6KN6MBPxfiCh3xO/R+cycgx0aMrWZoyzOzP7NCTM5MNE41C48xeGviyCtUID4xiBow+xo6IDUaiCoUVJhz579ore8ic70a19DD0qHy4SpBvrUwCO54kvkgn6HjYlLC/k8nFM9F9W9wVAQD/QwIjd7EtLZLGgbU61Jv3q4kZxxq270hogCRY0lmI3RxkedGHhetF7kaizrikW5zJQEeido/ir37HhX5AgMBAAGjVDBSMBIGA1UdEwEB/wQIMAYBAf8CAQAwPAYDVR0RBDUwM4IQbG9ncy5leGFtcGxlLmNvbYITbWV0cmljcy5leGFtcGxlLmNvbYcEwKgAAYcEfwAAATANBgkqhkiG9w0BAQsFAAOCAgEAH1O91BABHXZjrU7v1OwG+GbU/4TYZqBXXNxax++OFSRCkEEoNKGg49R6J7lY4lrm12zBlw+oGSyjIOerzi39/dcxDkKpzyhGvEN4mExbDlybmdCVrHPeWgZl7uwqn4Bj1xiu97M6eMthgxJE7KVNDGDHthGL0/fTlONIh3qS7Far33hLHJJKy3+lC1MDB8cNltV3mf/ctHCx5Wa0bfZId0MJgd/seP0WU1HCf3kIxhnhsnOYs32xu7EGiM4/lgnquVd/q/f99ueSaDSHrep373/w2ce9iF3U0qcLd2iP8ayF/daGeW1dVPL9R10Oe4BpRjMkjlLwhZdjJeKSg9GBa2GXUEn1Ru9vpSw/C10no3Qx/6ZHweYbSmJ6hBg4T0nDBp6iVS1eQULNXxDuDWb26U0ESOO5jK8ATywuc45o0bqdvD1XOrGYGfGnofx7ofRWwKHWfltvxurnbsyo2vH6nM6K41K2DpVdyQOKAGvKe/oCWfdi+WyBQJGWcIp2OTC1XyWHv7JsY3lo04+islkHEcqJyd8Rf8GWmRHdXz0WzGiZbxWzAuvRRWnzM31VAws8kQBHTBwIJlJoGX4AXfEvPi+NTxkntf8cQdJucK9ZZbP4ycXHULO4LneyJoJ9Q7nxX11xWv7BDWxxclOXy6tyUkg9Fjb7pQ/HCVvGhRzilVU=</samlsig:X509Certificate>
              </samlsig:X509Data>
          </samlsig:KeyInfo>
      </samlsig:Signature>
  </samlp:AuthnRequest>

SAML responses
--------------

There are different types of SAML responses sent by the IdP to the SP. The response contains the Assertion with the NameID and attributes of a user. Below is a table of the different types of responses. Each response type is fully supported except when the SAML assertion is signed while the SAML response itself is not:

.. csv-table::
    :header: "Signed SAML Response", "Signed SAML Assertion", "Encrypted SAML Assertion", "Supported by Mattermost"

    "Yes", "Yes", "Yes", "Yes"
    "Yes", "Yes", "No", "Yes"
    "Yes", "No", "Yes", "Yes"
    "Yes", "No", "No", "Yes"
    "No", "Yes", "Yes", "Partially, validation of assertion signature not supported"
    "No", "Yes", "No", "Partially, validation of assertion signature not supported"
    "No", "No", "Yes", "Yes"
    "No", "No", "No", "Yes"

For example XML responses for each type, see the `OneLogin SAML response examples <https://www.samltool.com/generic_sso_res.php>`_.

Technical description of SAML synchronization with AD/LDAP
----------------------------------------------------------

When enabled, SAML synchronization with AD/LDAP occurs in phases:

1. Get all the current LDAP users from the Mattermost database who have ``Users.AuthService`` set to ``ldap``. This is a SQL query issued against the Mattermost database: ``SELECT * FROM Users WHERE AuthService = 'ldap'``.
2. Get all the current SAML users from the Mattermost database who have ``Users.AuthService`` set to ``saml``. This is a SQL query issued against the Mattermost database: ``SELECT * FROM Users WHERE AuthService = 'saml'``.
3. Get all the current LDAP users from the LDAP server as defined by ``LdapSettings.UserFilter``. This is an `LDAP query <https://github.com/mattermost/mattermost-server/blob/master/scripts/ldap-check.sh>`__ issued against the LDAP server. Users are retrieved in batches as defined by ``LdapSettings.MaxPageSize``.
4. Update LDAP attributes. For each existing Mattermost user retrieved in step 1, attempt to find a match against the list of LDAP users from step 3. To find matches, ``Users.AuthData`` field of the Mattermost user is compared against the ``LdapSettings.IdAttribute`` LDAP setting.

 - If any attribute of the user has changed, that attribute is copied from the LDAP server and the user is marked as updated.
 - If the corresponding ``LdapSettings.IdAttribute`` is not found, the user is assumed to be deleted from the LDAP server, and deactivated from Mattermost by setting the ``Users.DeleteAt`` field to a valid timestamp.

5. Update SAML attributes. For each existing Mattermost user retrieved in step 2, attempt to find a match against the list of LDAP users from step 3. To find matches, ``SamlSettings.Email`` is compared against the ``LdapSettings.EmailAttribute`` LDAP setting.

 - If any attribute of the user has changed, that attribute is copied from the LDAP server and the user is marked as updated.
 - If the corresponding ``LdapSettings.EmailAttribute`` is not found, the user is assumed to be deleted from the LDAP server, and deactivated from Mattermost by setting the ``Users.DeleteAt`` field to a valid timestamp.

Frequently Asked Questions
--------------------------

How can I obtain a SAML metadata XML file consumed by Mattermost?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

You can obtain the XML file by calling the Mattermost RESTful API endpoint at ``/api/v4/saml/metadata``. For other useful SAML API calls, see the `API reference <https://api.mattermost.com/#tag/SAML>`_.

Can I update user attributes using the API?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

No. When Mattermost is configured to use SAML for user authentication, the following user attribute changes can't be made through the API:  first name, last name, position, nickname, email, profile image, or username. SAML must be the authoritative source for these user attributes.

source/archive/cloud-sso-openid-connect.rst METASEP
:nosearch:

OpenID Connect Single Sign-On
=============================

.. include:: common-sso-openidconnect.rst
    :start-after: :nosearch:

source/archive/cloud-slash-commands.rst METASEP
:nosearch:

Slash commands
==============

.. note::

  This is the admin documentation for slash commands. If you're a developer looking to build an integration, see `our developer documentation <https://developers.mattermost.com/integrate/getting-started/>`__.

Mattermost supports slash commands to easily integrate external applications into the workspace. They function similarly to `outgoing webhooks <https://docs.mattermost.com/integrations/cloud-outgoing-webhooks.html>`_, except they can be used in any channel - including Private channels and direct messages.

Messages that begin with ``/`` are interpreted as slash commands. The commands will send an HTTP POST request to a web service, and process a response back to Mattermost. Mattermost supports both `built-in <https://docs.mattermost.com/integrations/cloud-slash-commands.html#built-in-commands>`__ and `custom slash commands <https://docs.mattermost.com/integrations/cloud-slash-commands.html#custom-slash-command>`__.

.. note::
  
  To prevent malicious users from trying to perform `phishing attacks <https://en.wikipedia.org/wiki/Phishing>`__, a *BOT* indicator appears next to posts coming from webhooks regardless of what username is specified.

.. toctree::
   :maxdepth: 2

Built-in commands
-----------------

Each Mattermost installation comes with some built-in slash commands that are ready to use:

.. csv-table::
    :header: "Command", "Description", "Example"

    "/away", "Set your status away", "/away"
    "/offline", "Set your status offline", "/offline"
    "/online", "Set your status online", "/online"
    "/dnd", "Set your status to Do Not Disturb", "/dnd"
    "/code *{text}*", "Display text as a code block", "/code File bugs"
    "/collapse", "Turn on auto-collapsing of image link previews, image attachments, as well as `in-line images <https://docs.mattermost.com/help/messaging/formatting-text.html#in-line-images>`__ over 100px in height", "/collapse"
    "/expand", "Turn off auto-collapsing of image previews, image attachments, as well as `in-line images <https://docs.mattermost.com/help/messaging/formatting-text.html#in-line-images>`__ over 100px in height", "/expand"
    "/echo *{message}* *{delay in seconds}*", "Echo back text from your account", "/echo Hello World 5"
    "/header *{text}*", "Edit the channel header", "/header File bugs here"
    "/invite *@{user}* *~{channel-name}*", "Invite user to the channel","/invite @john ~sampleChannel"
    "/purpose *{text}*", "Edit the channel purpose", "/purpose A channel to discuss bugs"
    "/rename *{text}*", "Rename the channel", "/rename Developers"
    "/help", "Open the Mattermost help page", "/help"
    "/invite *@{user}* *~{channel-name}*", "Invite user to the channel","/invite @john ~sampleChannel"
    "/invite_people *{name@domain.com ...}*", "Send an email invite to your Mattermost team","/invite_people john@example.com"
    "/kick (or /remove) *{@username}*", "Remove a member from a public or private channel", "/kick @alice"
    "/join (or /open) *{channel-name}*", "Join the given channel", "/join off-topic"
    "/leave", "Leave the current channel", "/leave"
    "/mute", "Turns off desktop, email and push notifications for the current channel or the [channel] specified", "/mute ~[channel]"
    "/logout", "Log out of Mattermost", "/logout"
    "/me *{message}*", "Do an action", "/me Hello World"
    "/msg *{@username}* *{message}*", "Send a Direct Message to a user", "/msg @alice hello"
    "/groupmsg *{@username1, @username2, ...}* *{message}*", "Sends a Group Message to the specified users", "/groupmsg @alice, @bob hello"
    "/search *{text}*", "Search text in messages", "/search meeting"
    "/settings", "Open the Settings dialog", "/settings"
    "/shortcuts", "Display a list of keyboard shortcuts", "/shortcuts"
    "/shrug *{message}*", "Add ``¯\_(ツ)_/¯`` to your message", "/shrug oh well"

Custom slash command
--------------------

Suppose you want to write an external application that is able to check the weather for certain cities. By creating a custom slash command, and setting up the application to handle the HTTP POST or GET from the command, you can let your users check the weather in their city using your command, say ``/weather toronto week``.

You can follow these general guidelines to set up a custom Mattermost slash command for your application.

1. Open **Main Menu > Integrations > Slash Commands**. If you don't have the **Integrations** option in your Main Menu, slash commands may not be enabled or may be disabled for non-admins. Enable them from **System Console > Integrations > Integration Management** or ask your Mattermost System Admin to do so.
2. Select **Add Slash Command**, then add a name and description for the command.
3. Set the **Command Trigger Word**. The trigger word must be unique and cannot begin with a slash or contain any spaces. It also cannot be one of the `built-in commands <https://docs.mattermost.com/cloud/cloud-integrations/cloud-slash-commands.html#built-in-commands>`__.
4. Set the **Request URL** and **Request Method**. The request URL is the endpoint that Mattermost hits to reach your application, and the request method is either POST or GET and specifies the type of request sent to the request URL.
5. (Optional) Set the response username and icon the command will post messages as in Mattermost. If not set, the command will use your username and profile picture.

.. note::
  
    `Enable integrations to override usernames <https://docs.mattermost.com/configure/configuration-settings.html#enable-integrations-to-override-usernames>`__ must be set to ``true`` in ``config.json`` to override usernames, and `similarly for profile picture icons <https://docs.mattermost.com/configure/configuration-settings.html#enable-integrations-to-override-profile-picture-icons>`__. Enable them from **System Console > Integrations > Integration Management** or ask your Mattermost System Admin.

6. (Optional) Include the slash command in the command autocomplete list, displayed when typing ``/`` in an empty input box. Use it to make your command easier to discover by your teammates. You can also provide a hint listing the arguments of your command and a short description displayed in the autocomplete list.
7. Select **Save**. On the next page, copy the **Token** value. This will be used in a later step.

.. image:: ../images/slash_commands_token.png
  :width: 500 px

8. Next, write your external application. Include a function which receives HTTP POST or HTTP GET requests from Mattermost. The request will look something like this:

.. code-block:: text

  POST /slash-command HTTP/1.1
  Host: example.com
  User-Agent: Go-http-client/1.1
  Content-Length: 313
  Accept: application/json
  Authorization: Token okwexkjpe7ygb8eq1ww58t483w
  Content-Type: application/x-www-form-urlencoded
  Accept-Encoding: gzip

  channel_id=jux16pkewjrkfj3ehep1psxyxc&
  channel_name=town-square&
  command=%2Ftest&
  response_url=http%3A%2F%2Flocalhost%3A8065%2Fhooks%2Fcommands%2Fxbrkb8p393gjpq5cawei7npije&
  team_domain=test&
  team_id=carya1qs77bemjup96ff538snh&
  text=asd&
  token=okwexkjpe7ygb8eq1ww58t483w&
  user_id=aoa1agao6t8fmx3ikt1j9w5ybw&
  user_name=somename
  channel_mentions=["saepe-5", "aut-8"]
  channel_mentions_ids=["r3j6sby343fpfdxcbwqg95rfsa", "ehjj46yk7ifptr5bpfb966s6mc"]
  user_mentions=["aaron.peterson", "aaron.medina"]
  user_mentions_ids=["q5s3b7xzgprp5eid8h66j9epsy", "czwmumrmw7dfxecww7qibkkoor"]

If your integration sends back a JSON response, make sure it returns the ``application/json`` content-type.

9. Add a configurable *MATTERMOST_TOKEN* variable to your application and set it to the **Token** value from step 7. This value will be used by your application to confirm the HTTP POST or GET request came from Mattermost.
10. To have your application post a message back to ``town-square``, it can respond to the HTTP POST request with a JSON response such as:

.. code-block:: text

   {"response_type": "in_channel", "text": "
   ---
   #### Weather in Toronto, Ontario for the Week of February 16th, 2016

   | Day                 | Description                      | High   | Low    |
   |:--------------------|:---------------------------------|:-------|:-------|
   | Monday, Feb. 15     | Cloudy with a chance of flurries | 3 °C   | -12 °C |
   | Tuesday, Feb. 16    | Sunny                            | 4 °C   | -8 °C  |
   | Wednesday, Feb. 17  | Partly cloudly                   | 4 °C   | -14 °C |
   | Thursday, Feb. 18   | Cloudy with a chance of rain     | 2 °C   | -13 °C |
   | Friday, Feb. 19     | Overcast                         | 5 °C   | -7 °C  |
   | Saturday, Feb. 20   | Sunny with cloudy patches        | 7 °C   | -4 °C  |
   | Sunday, Feb. 21     | Partly cloudy                    | 6 °C   | -9 °C  |
   ---
   "}

which would render in Mattermost as:

.. image:: ../images/weatherBot.png
  
11. You're all set! See `developer documentation <https://developers.mattermost.com/integrate/slash-commands>`__ for details on what parameters are supported by slash commands. For instance, you can override the username and profile picture the messages post as, or specify a custom post type when sending a webhook message for use by `plugins <https://developers.mattermost.com/integrate/admin-guide/admin-plugins-beta/>`__.

Messages with advanced formatting can be created by including an `attachment array <https://developers.mattermost.com/integrate/admin-guide/admin-message-attachments/>`_ and `interactive message buttons <https://developers.mattermost.com/integrate/admin-guide/admin-interactive-messages/>`_ in the JSON payload.

.. note::
  
  `Enable integrations to override usernames <https://docs.mattermost.com/configure/configuration-settings.html#enable-integrations-to-override-usernames>`__ must be set to ``true`` in ``config.json`` to override usernames. Enable them from **System Console > Integrations > Integration Management** or ask your Mattermost System Admin. If not enabled, the username is set to ``webhook``.
  
  Similarly, `Enable integrations to override profile picture icons <https://docs.mattermost.com/configure/configuration-settings.html#enable-integrations-to-override-profile-picture-icons>`__ must be set to ``true`` in ``config.json`` to override usernames. Enable them from **System Console > Integrations > Integration Management** or ask your Mattermost System Admin. If not enabled, the icon of the creator of the webhook URL is used to post messages.

Tips and best practices
------------------------

1. Slash commands are designed to easily allow you to post messages. For other actions such as channel creation, you must also use the `Mattermost APIs <https://api.mattermost.com>`__.
2. You can restrict who can create slash commands in `System Console > Integrations > Integration Management <https://docs.mattermost.com/configure/configuration-settings.html#restrict-managing-integrations-to-admins>`__.
3. Mattermost outgoing webhooks are Slack-compatible. You can copy-and-paste code used for a Slack outgoing webhook to create Mattermost integrations. Mattermost `automatically translates Slack's JSON format <https://docs.mattermost.com/integrations/cloud-slash-commands.html#translate-slack-s-data-format-to-mattermost>`__.
4. The external application may be written in any programming language. It needs to provide a URL which receives the request sent by your Mattermost workspace and responds with in the required JSON format.

Share your integration
----------------------

If you've built an integration for Mattermost, please consider `sharing your work <https://apps.mattermost.com/submit-an-integration/>`__ in our `app directory <https://mattermost.com/marketplace/>`__.

The `app directory <https://mattermost.com/marketplace/>`__ lists open source integrations developed by the Mattermost community and are available for download, customization and deployment to your private cloud or self-managed infrastructure.

Slack compatibility
-------------------

Mattermost makes it easy to migrate integrations written for Slack to Mattermost.

Translate Slack's data format to Mattermost
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost automatically translates the data coming from Slack:

1. JSON responses written for Slack, that contain the following, are translated to Mattermost Markdown and rendered equivalently to Slack:
   
   - ``<>`` to denote a URL link, such as ``{"text": "<https://mattermost.com/>"}``
   - ``|`` within a ``<>`` to define linked text, such as ``{"text": "Click <https://mattermost.com/|here> for a link."}``
   - ``<userid>``  to trigger a mention to a user, such as ``{"text": "<5fb5f7iw8tfrfcwssd1xmx3j7y> this is a notification."}``
   - ``<!channel>``, ``<!here>`` or ``<!all>`` to trigger a mention to a channel, such as ``{"text": "<!channel> this is a notification."}``

2. Both the HTTP POST and GET request bodies sent to a web service are formatted the same as Slack's. This means your Slack integration's receiving function does not need change to be compatible with Mattermost.
  
Known Slack compatibility issues
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Using ``icon_emoji`` to override the username is not supported.
2. Referencing  channels using ``<#CHANNEL_ID>`` does not link to the channel.
3. ``<!everyone>`` and ``<!group>`` are not supported.
4. Parameters "mrkdwn", "parse", and "link_names" are not supported (Mattermost always converts markdown and automatically links @mentions).
5. Bold formatting supplied as ``*bold*`` is not supported (must be done as ``**bold**``).
6. Slack assumes default values for some fields if they are not specified by the integration, while Mattermost does not.

Troubleshooting
---------------

See `developer documentation <https://developers.mattermost.com/integrate/slash-commands>`__ for troubleshooting, or `join the Mattermost user community for help <https://mattermost.com/pl/default-ask-mattermost-community/>`_.

source/archive/cloud-site-configuration.rst METASEP
:nosearch:

Site configuration
==================

|all-plans| |cloud|

.. |all-plans| image:: ../images/all-plans-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in Mattermost Free and Starter subscription plans.

.. |cloud| image:: ../images/cloud-badge.png
  :scale: 30
  :target: https://mattermost.com/download
  :alt: Available for Mattermost Cloud deployments.

Announcement banner
-------------------

You can display an announcement banner notification that's visible to all users on the system.

.. image:: ../images/announcement-banner-1106x272.png
  :width: 1106
  :height: 272
  :alt: Shows the announcement banner at the top of the user's screen.

By default, users can dismiss the banner until they log in again or until you update the banner.

- Update the banner by either changing the text of the banner, or by re-enabling the banner after it's been disabled.
- You can also control the text color, the background color, and allow or prevent users from dismissing the banner.

To enable the banner:

1. Go to **System Console > Site Configuration > Announcement Banner**.
2. Set **Enable Announcement Banner** to **true**.
3. In the **Banner Text** field, enter the text of the announcement that you want to make.
4. Set banner background and text colors.
5. To prevent users from dismissing the banner, set **Allow Banner Dismissal** section to **false**.
6. Select **Save**.

Emoji
-----

Control custom emoji usage through the following three settings:

Under **System Console > Site Configuration > Emoji**:

- **Enable Emoji Picker:** An emoji picker allows users to select emojis to use with messages and as reactions. Enabling the emoji picker with a large number of custom emojis may slow down performance.
- **Enable Custom Emoji:** Control whether the **Custom Emoji** option is available from the **Main Menu** to manage customized emoji.

Select **Save** to apply your changes.

Under **System Console > Permissions > Edit Scheme**:

- Restrict management of custom emoji to specific roles, such as System Admins, Channel Admins, or Team Admins, or allow all users to create and/or delete their own custom emoji. 
- The **Create Custom Emoji** and **Delete Own Custom Emoji** permissions are grouped under **Integrations & Customizations**, and can be set for all members or specific roles. 

Select **Save** to apply your changes.

In-product notices
------------------

Mattermost in-product notices keep users and administrators informed of the newest product improvements, features, and releases. Notices are used to raise awareness of new features as part of our monthly release cadence. 

Users will only receive notices that specifically apply to them. For example, if a user is already running the latest Desktop App version, they will not receive an upgrade notice.

.. image:: ../images/notices.png
  :alt: Shows in-product notices for users and administrators.

Administrator notices
^^^^^^^^^^^^^^^^^^^^^

System Admins may receive notices about recommended configuration options to optimize the user experience of their workspace. Disable admin notices by going to  **System Console > Site Configuration > Notices**, setting **Enable Admin Notices** to **false**, then selecting **Save**.

End user notices
^^^^^^^^^^^^^^^^

End user notices are used to inform users and System Admins of new feature enhancements and when new desktop versions are available. Disable end user notices by going to **System Console > Site Configuration > Notices**, setting **Enable End User Notices** to **false**, then selecting **Save**.

Are notices enabled by default?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Notices are enabled by default for all Mattermost users. System Admins may choose to disable administrator or end user notices.

How often will users receive notices?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Notices are used to raise awareness of new features as part of Mattermost's release cadence. Users will only receive notices that specifically apply to them. For example, if a user is already running the latest Desktop App version, they will not receive an upgrade notice.

File sharing and downloads
--------------------------

Control file sharing and downloads in your workspace and on mobile devices using the following three settings under **System Console > Site Configuration > File Sharing and Downloads**:

- **Allow File Sharing:** When configuration is set to **false**, file sharing is disabled. All file and image uploads on messages are forbidden across clients and devices, including mobile.
- **Allow File Uploads on Mobile:** When configuration is set to **false**, disables file uploads on mobile apps. All file and image uploads on messages are forbidden across clients and devices, including mobile.
- **Allow File Downloads on Mobile:** When configuration is set to **false**, disables file downloads on mobile apps. Users can still download files from a mobile web browser.

Select **Save** to apply your changes.

Localization
------------

Mattermost is translated into 20 languages. Users can set their default language by going to **Settings > Display > Language**, then selecting **Save**.

New languages are added automatically by default. Users can add new languages using the dropdown menu manually as they become available. When manually adding new languages, the Default Client Language must be added before saving the setting.

Notifications
-------------

Control notifications using the following six settings under **System Console > Site Configuration > Notifications**: 

- **Show @channel and @all and group mention confirmation dialog:** Users will be prompted to confirm when posting @channel, @all, and group mentions in channels with over five members.
- **Email Notification Contents:** You can specify the content shown in email notifications. 

  - **Send full message contents** will include Sender name and channel in email notifications. 
  - **Send generic description with only sender name** will include the team name and name of the person who sent the message. No information about channel name or message contents, is included in email notifications. This is typically used for compliance reasons if Mattermost contains confidential information and policy dictates it cannot be stored in email.
- **Notification Display Name:** Set the name displayed on the email account used when sending notification emails from Mattermost.
- **Notification Reply-To Address:** Set the email address used in the Reply-To header when sending notification emails from Mattermost.
- **Notification Footer Mailing Address:** Set the name and mailing address displayed in the footer of email notifications from Mattermost, such as *ABC Corporation, 565 Knight Way, Palo Alto, California, 94305, USA*. If the field is left empty, the organization name and mailing address will not be displayed.
- **Push Notification Contents:** You can configure what information is provided in push notifications. 

  - **Generic description with only sender name** will include only the name of the person who sent the message but no information about channel name or message text. 
  - **Generic description with sender and channel names** will include names of users and channels but no specific details from the message text. 
  - **Full message content sent in the notification payload** will include the message contents in the push notification payload that is relayed through Apple's Push Notification Service (APNS) or Google's Firebase Cloud Messaging (FCM). It is highly recommended this option only be used with an "https" protocol to encrypt the connection and protect confidential information sent in messages.  
  - **Full message content fetched from the server on receipt** means the notification payload relayed through APNS or FCM contains no message content. Instead it contains a unique message ID used to fetch message content from the server when a push notification is received by a device. If the server cannot be reached, a generic notification will be displayed.

Select **Save** to apply your changes.

Posts
-----

Control content in posts using the following four settings under **System Console > Site Configuration > Posts**:

- **Enable Link Previews:** Link previews are previews of linked website content, image links, and YouTube videos that are displayed below posts when available.

  - System Admins can disable all website link previews, image link previews, and YouTube previews by changing this setting to **false**. System Admins can also disable link previews from specific domains.
  - When link previews are enabled, users can choose to show or hide website link previews from **Settings > Display > Website Link Previews**. 
- **Enable SVGs:** Controls whether users have the ability to see previews of SVG file attachments and SVG image links.
- **Enable LaTeX Rendering:** Controls users' ability to render LaTeX code in a ``latex`` code block.
- **Enable Inline LaTeX Rendering:** Controls users' ability to render inline LaTeX code.
- **Custom URL Schemes:** A list of URL schemes that are used for autolinking in message text. HTTP, HTTPS, FTP, tel, and mailto always create links.

You can also control whether all `in-line images <https://docs.mattermost.com/help/messaging/formatting-text.html#in-line-images>`__ over 100px in height are automatically collapsed or expanded in messages by setting a `Channels setting <https://docs.mattermost.com/messaging/manage-channels-settings.html#website-link-previews>`__, or by using the ``/collapse`` and ``/expand`` `slash commands <https://docs.mattermost.com/messaging/executing-slash-commands.html>`__. 

Select **Save** to apply your changes.

Users and teams
---------------

Control the following users and teams settings under **System Console > Site Configuration > Users and Teams**:

- **Max Users Per Team:** Specify the size of the *team site* which is a workspace a *team of people* inhabits. 

  - A team of people is considered a small organization where people work closely together towards a specific shared goal and share the same etiquette. 
  - In the physical world, a team of people could typically be seated around a single table to have a meal and discuss their project. 
  - The default maximum of 1000 people is at the extreme high end of a single team of people where organizations are more often 'multiple teams of people'. Investments in explicitly defining etiquette, such as channel organization or turning on policy features in Enterprise Edition, are often used to scale the high levels of productivity found in a team of people using Mattermost to multiple teams of people.
- **Max Channels Per Team:** Set the maximum number of channels per team, including both active and deleted channels.
- **Enable users to open Direct Message channels with:** Configure whether users can message any user on the Mattermost workspace or only users in the same team as them.

  - This setting adjusts the users returned in the Direct Messages **More** menu. Pressing CTRL/CMD+K only lists users on the current team. 
  - This setting only affects the user interface, not permissions on the server. For instance, a Direct Message channel can be created with anyone on the server regardless of this setting.
- **Teammate Name Display:** Specify how names are displayed in the user interface by default. Please note that users can override this setting in **Settings > Display > Teammate Name Display**.

  - **Show username** displays the user's username. 
  - **Show nickname** if one exists displays the user's nickname. If the user does not have a nickname, their full name is displayed. If the user does not have a full name, their username is displayed. 
  - **Show first and last name:** displays the user's full name. If the user doesn't have a full name, their username is displayed. Recommended when using SAML or LDAP if first name and last name attributes are configured.
- **Lock Teammate Name Display for all users:** Specifies whether users can change settings under **Settings > Display > Teammate Name Display**.
- **Show Email Address:** When set to **false**, this setting hides a user's email address from other users, including Team Admins. This is designed for managing teams where users choose to keep their contact information private. System Admins will still be able to see email addresses in the user interface.
- **Show Full Name:** When set to **false**, this setting hides full name of users from other users including Team Admins. This is designed for managing teams where users choose to keep their contact information private. System Admins will still be able to see full names in the user interface.
- **Enable Custom Statuses:** Sets whether users can set descriptive status messages and emoji visible to all users.

Select **Save** to apply your changes.

source/archive/cloud-reporting.rst METASEP
:nosearch:

Statistics
==========

Statistics on users, posts, and channels are tracked for each system and team. 

Site statistics
---------------

|all-plans| |cloud|

.. |all-plans| image:: ../images/all-plans-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in Mattermost Free and Starter subscription plans.

.. |cloud| image:: ../images/cloud-badge.png
  :scale: 30
  :target: https://mattermost.com/download
  :alt: Available for Mattermost Cloud deployments.

System statistics are viewable under **System Console > Reporting > Site Statistics**. The data shown here is a cumulative sum across all teams on the system.

Total Users
    The total number of active accounts created on your system. Excludes deactivated accounts.

Total Teams
    The total number of teams created on your system.

Total Channels
    The total number of public channels and private channels created in all the teams on your system, including deleted channels. Doesn't include direct message channels.

Total Posts
    The total number of posts made in all the teams on your system, including deleted posts and posts made using automation.

Daily Active Users
  The total number of users who viewed the Mattermost site in the last 24 hours. Excludes bot users.

Monthly Active Users
  The total number of users who viewed the Mattermost site in the last 30 days. Excludes bot users.

Total Posts (graph)
    The total number of posts made on a certain day in all the teams on your system, including deleted posts and posts made using automation.

Total Posts from Bots (graph)
    The total number of posts made by a `bot account <https://developers.mattermost.com/integrate/admin-guide/admin-bot-accounts/>`_ on a certain day in all the teams on your system, including deleted posts and posts made using automation.

Active Users with Posts (graph)
    Users who made a post on a certain day in all the teams on your system, including system messages posted from the user's account.

Team statistics
---------------

|all-plans| |cloud|

Team Statistics are viewable under **System Console > Reporting > Team Statistics**. The data shown here is a cumulative sum across this team only, and excludes posts made in direct message channels, which are not tied to a team.

Total Users
    The total number of active accounts on this team. Excludes deactivated accounts.

Public Channels
    The number of public channels created in this team. Excludes deleted channels.

Private Channels
    The number of private channels created in this team. Excludes deleted channels.

Total Posts
    The total number of posts made in this team, including deleted posts and posts made using automation. Excludes posts made in direct message channels, which are not tied to a team.

Total Posts (graph)
    The total number of posts made on a certain day in this team, including deleted posts and posts made using automation.

Active Users with Posts (graph)
    Users who made a post on a certain day in this team, including system messages posted from the user's account.

Recent Active Users
    Twenty most recent users who have logged in and had recent browser activity in Mattermost.

Newly Created Users
    Most recent users who have joined the team.

Troubleshooting/FAQ
-------------------

I see an error: "Not enough data for a meaningful representation"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

If the statistics page is loading endlessly and you get an error message saying "Not enough data for a meaningful representation", check whether you're using an ad blocker. An ad blocker can prevent this page from loading data. To test this, temporarily disable your ad blocker, or view the page in a browser without an ad blocker installed.

Can Team Admins review their own team's statistics?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

System Admins can designate the **Viewer** `System Admin Role <https://docs.mattermost.com/onboard/system-admin-roles.html>`__ to enable Team Admin to see team statistics.

Once Team Admins are assigned to the **Viewer** role, they can access all statistics for all teams.

System Admins must then `edit the privileges <https://docs.mattermost.com/onboard/system-admin-roles.html#editing-privileges-of-admin-roles-advanced>`__ of the **Viewer** role. Only the **Reporting** privileges need to be enabled to allow Team Admins to see statistics for their teams.

Once the **Viewer** role is set up for reporting access only, System Admins can then `assign <https://docs.mattermost.com/onboard/system-admin-roles.html#assigning-admin-roles>`__ the **Viewer** role to Team Admins.

.. note::
  - System Admins must manually add or remove members from the **Viewer** role to address Team Admin changes, such as promotions or demotions.
  - Team Admins using the **Viewer** role will also have access to system level statistics in addition to statistics for their teams.

source/archive/cloud-plugins.rst METASEP
:nosearch:
source/archive/cloud-personal-access-tokens.rst METASEP
:nosearch:

Personal access tokens
======================

Personal access tokens function similar to session tokens and can be used by integrations to `authenticate against the REST API <https://api.mattermost.com/#tag/authentication>`__. It is the most commonly used type of token for integrations.

.. contents::
  :backlinks: top
  :depth: 1
  :local:

Creating a personal access token
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Enable personal access tokens in **System Console > Integrations > Integration Management**.
2. Identify the account you want to create a personal access token with. You may optionally create a new user account for your integration, such as for a bot account. By default, only System Admins have permissions to create a personal access token. 
3. To create an access token with a non-admin account, you must first give it the appropriate permissions. Go to **System Console > User Management > Users**, search for the user account, then select **Manage Roles** from the dropdown.

.. image:: ../images/access_token_manage_roles.png
  :width: 500 px

4. Select **Allow this account to generate personal access tokens.**

.. image:: ../images/access_tokens_additional_roles.png
  :width: 500 px

You may optionally allow the account to post to any channel in your Mattermost workspace, including direct messages by choosing the **post:all** role. **post:channels** role allows the account to post to any public channel in the Mattermost workspace.

5. Select **Save**.

6. Sign in to the user account to create a personal access token.

7. Go to **Account Settings > Security > Personal Access Tokens**, then select **Create New Token**.

8. Enter a description for the token, so you remember what it's used for. 

9. Select **Save**.

.. note::
  
  If you create a personal access token for a System Admin account, be extra careful who you share it with. The token enables a user to have full access to the account, including System Admin privileges. It is recommended to create a personal access token for non-admin accounts.
  
10. Copy the access token now for your integration and store it in a secure location. You won't be able to see it again!

11. You're all set! You can now use the personal access token for integrations to interact with your Mattermost workspace and `authenticate against the Mattermost REST API <https://api.mattermost.com/#tag/authentication>`__.

.. image:: ../images/access_token_settings.png
  :width: 500 px

Revoking a personal access token
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

A personal access token can be revoked by deleting the token from either the user's account settings or from the System Console. Once deleted, all sessions using the token are deleted, and any attempts to use the token to interact with the Mattermost workspace are blocked.

Tokens can also be temporarily deactivated from the user's account settings. Once deactivated, all sessions using the token are deleted, and any attempts to use the token to interact with the Mattermost workspace are blocked. However, the token can be reactivated at any time. 

Account Settings
.................

1. Sign in to the user account and go to **Account Settings > Security > Personal Access Tokens**. 
2. Identify the access token you want to revoke, then select **Delete**. 
3. Confirm the deletion.

System Console
.................

1. Go to **System Console > User Management > Users**, search for the user account which the token belongs to, then select **Manage Tokens** from the dropdown.
2. Identify the access token you want to revoke, then select **Delete**. 
3. Confirm the deletion.

Frequently asked questions 
~~~~~~~~~~~~~~~~~~~~~~~~~~

How do personal access tokens differ from regular session tokens?
..................................................................

- Personal access tokens do not expire. As a result, you can more easily integrate with Mattermost, bypassing the `session length limits set in the System Console <https://docs.mattermost.com/configure/configuration-settings.html#sessions>`__.
- Personal access tokens can be used to authenticate against the API more easily, including with AD/LDAP and SAML accounts.
- You can optionally assign additional roles for the account creating personal access tokens. This lets the account post to any channel in Mattermost, including Direct Messages.

Additionally, personal access tokens are exactly the same as regular session tokens. They are cryptic random IDs and are not different from a user's regular session token created after logging in to Mattermost.

Can I set personal access tokens to expire?
............................................

Not in Mattermost, but you can automate your integration to cycle its token `through the REST API <https://api.mattermost.com/#tag/users%2Fpaths%2F~1users~1%7Buser_id%7D~1tokens%2Fpost>`__.

How do I identify a badly behaving personal access token?
..........................................................

The best option is to go to **System Console > Logs** and finding error messages relating to a particular token ID. Once identified, you can search which user account the token ID belongs to in **System Console > User Management > Users** and revoke it through the **Manage Tokens** dropdown option.

Do personal access tokens continue to work if the user is deactivated?
........................................................................

No. The session used by the personal access token is revoked immediately after a user is deactivated, and a new session won't be created. The tokens are preserved and continue to function if the user account is re-activated. This is useful when a bot account is temporarily deactivated for troubleshooting, for instance.

source/archive/cloud-outgoing-webhooks.rst METASEP
:nosearch:

Outgoing webhooks
=================

.. note::
  This is the admin documentation for outgoing webhooks. If you're a developer looking to build an integration, see `our developer documentation <https://developers.mattermost.com/integrate/getting-started/>`__.

Mattermost supports webhooks to easily integrate external applications into Mattermost.

Use outgoing webhooks to post automated responses to posts made by your users. Outgoing webhooks will send an HTTP POST request to a web service and process a response back to Mattermost when a message matches one or both of the following conditions:

 - It is posted in a specified channel
 - The first word matches or starts with one of the defined trigger words, such as ``gif``

Outgoing webhooks are supported in public channels only. If you need a trigger that works in a private channel or a direct message, consider using a `slash command <https://docs.mattermost.com/developer/slash-commands.html>`__ instead.

.. note::
  To prevent malicious users from trying to perform `phishing attacks <https://en.wikipedia.org/wiki/Phishing>`__ a *BOT* indicator appears next to posts coming from webhooks regardless of what username is specified.

.. toctree::
   :maxdepth: 2

Create an outgoing webhook
--------------------------

Suppose you want to write an external application, which executes software tests after someone posts a message starting with the word ``#build`` in the ``town-square`` channel.

You can follow these general guidelines to set up a Mattermost outgoing webhook for your application.

1. First, go to **Main Menu > Integrations > Outgoing Webhooks**. If you don't have the **Integrations** option in your Main Menu, outgoing webhooks may not be enabled on your Mattermost server or may be disabled for non-admins. Enable them from **System Console > Integrations > Integration Management**.
2. Select **Add Outgoing Webhook** and add a title and description for the webhook. The description can be up to 500 characters. 
3. Choose the content type by which the request will be sent.

 - If ``application/x-www-form-urlencoded`` is chosen, the server will encode the parameters in a URL format in the request body.
 - If ``application/json`` is chosen, the server will format the request body as JSON.

4. Choose the public channel to receive webhook responses, or specify one or more trigger words that send an HTTP POST request to your application. You may configure either the channel or the trigger words for the outgoing webhook, or both. If both are specified, then the message must match both values.

In our example, we would set the channel to ``town-square`` and specify ``#build`` as the trigger word.

  .. note::
    If you leave the channel field blank, the webhook will respond to trigger words in all public channels of your team.
    
    Similarly, if you don't specify trigger words, then the webhook will respond to all messages in the selected public channel.

5. If you specified one or more trigger words on the previous step, choose when to trigger the outgoing webhook.

 - If the first word of a message matches one of the trigger words exactly, or
 - If the first word of a message starts with one of the trigger words.

6. Finally, set one or more callback URLs that HTTP POST requests will be sent to, and select **Save**. If the URL is private, add it as a `trusted internal connection <https://docs.mattermost.com/configure/configuration-settings.html#allow-untrusted-internal-connections-to>`__.
7. On the next page, copy the **Token** value. This will be used in a later step.

.. image:: ../images/outgoing_webhooks_token.png
  :width: 500 px

8. Next, write your external application. Include a function, which receives HTTP POST requests from Mattermost. The function should look something like this:

    .. code-block:: text

      Content-Length: 244
      User-Agent: Go 1.1 package http
      Host: localhost:5000
      Accept: application/json
      Content-Type: application/x-www-form-urlencoded

      channel_id=hawos4dqtby53pd64o4a4cmeoo&
      channel_name=town-square&
      team_domain=someteam&
      team_id=kwoknj9nwpypzgzy78wkw516qe&
      post_id=axdygg1957njfe5pu38saikdho&
      text=some+text+here&
      timestamp=1445532266&
      token=zmigewsanbbsdf59xnmduzypjc&
      trigger_word=some&
      user_id=rnina9994bde8mua79zqcg5hmo&
      user_name=somename

If your integration sends back a JSON response, make sure it returns the ``application/json`` content-type.

9. Add a configurable *MATTERMOST_TOKEN* variable to your application and set it to the **Token** value from step 7. This value will be used by your application to confirm the HTTP POST request came from Mattermost.
10. To have your application post a message back to ``town-square``, it can respond to the HTTP POST request with a JSON response such as:

.. code-block:: text

  {"text": "
  | Component  | Tests Run   | Tests Failed                                   |
  |:-----------|:------------|:-----------------------------------------------|
  | Server     | 948         | :white_check_mark: 0                           |
  | Web Client | 123         | :warning: [2 (see details)](http://linktologs) |
  | iOS Client | 78          | :warning: [3 (see details)](http://linktologs) |
  "}

which would render in Mattermost as:

.. image:: ../images/webhooksTable.png

11. You're all set! See `developer documentation <https://developers.mattermost.com/integrate/outgoing-webhooks/>`__ for details on what parameters are supported by outgoing webhooks. For instance, you can override the username and profile picture the messages post as, or specify a custom post type when sending a webhook message for use by `plugins <https://developers.mattermost.com/integrate/admin-guide/admin-plugins-beta/>`__.

Messages with advanced formatting can be created by including an `attachment array <https://developers.mattermost.com/integrate/admin-guide/admin-message-attachments/>`_ and `interactive message buttons <https://developers.mattermost.com/integrate/admin-guide/admin-interactive-messages/>`_ in the JSON payload.

.. note::
  `Enable integrations to override usernames <https://docs.mattermost.com/configure/configuration-settings.html#enable-integrations-to-override-usernames>`__ must be set to ``true`` in ``config.json`` to override usernames. Enable them from **System Console > Integrations > Integration Management** or ask your System Admin to do so. If not enabled, the username is set to ``webhook``.

  Similarly, `Enable integrations to override profile picture icons <https://docs.mattermost.com/configure/configuration-settings.html#enable-integrations-to-override-profile-picture-icons>`__ must be set to ``true`` in ``config.json`` to override usernames. Enable them from **System Console > Integrations > Integration Management** or ask your System Admin to do so. If not enabled, the icon of the creator of the webhook URL is used to post messages.

Tips and best practices
-----------------------

1. Webhooks are designed to easily allow you to post messages. For other actions such as channel creation, you must also use the `Mattermost APIs <https://api.mattermost.com>`__.
2. If the text in the JSON response is longer than the allowable character limit per post, the message is split into multiple consecutive posts, each within the character limit. Posts up to 16383 characters are supported. 
3. Outgoing webhooks are supported in public channels only. If you need a trigger that works in a private channel or a direct message, consider using a `slash command <https://docs.mattermost.com/developer/slash-commands.html>`__ instead.
4. You can restrict who can create outgoing webhooks in `System Console > Integrations > Integration Management <https://docs.mattermost.com/configure/configuration-settings.html#restrict-managing-integrations-to-admins>`__.
5. Mattermost outgoing webhooks are Slack-compatible. You can copy-and-paste code used for a Slack outgoing webhook to create Mattermost integrations. Mattermost `automatically translates Slack's proprietary JSON response format <https://docs.mattermost.com/integrations/cloud-incoming-webhooks.html#translate-slack-s-data-format-to-mattermost>`__.
6. The external application may be written in any programming language. It needs to provide a URL that reacts to the request sent by your Mattermost server and send an HTTP POST in the required JSON format as a response.
 
Share your integration
-----------------------

If you've built an integration for Mattermost, please consider `sharing your work <https://mattermost.org/share-your-mattermost-projects/>`__ in our `app directory <https://integrations.mattermost.com/>`__.

The `app directory <https://integrations.mattermost.com/>`__ lists open source integrations developed by the Mattermost community and are available for download, customization, and deployment to your private cloud or self-managed infrastructure.

Slack Compatibility
-------------------

Mattermost makes it easy to migrate integrations written for Slack to Mattermost. 

Translate Slack's data format to Mattermost
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost automatically translates the data coming from Slack:

1. JSON responses written for Slack, that contain the following, are translated to Mattermost markdown and rendered equivalently to Slack:
   
   - ``<>`` to denote a URL link, such as ``{"text": "<https://mattermost.com/>"}``
   - ``|`` within a ``<>`` to define linked text, such as ``{"text": "Click <https://mattermost.com/|here> for a link."}``
   - ``<userid>``  to trigger a mention to a user, such as ``{"text": "<5fb5f7iw8tfrfcwssd1xmx3j7y> this is a notification."}``
   - ``<!channel>``, ``<!here>`` or ``<!all>`` to trigger a mention to a channel, such as ``{"text": "<!channel> this is a notification."}``

2. The HTTP POST request body sent to a web service is formatted the same as Slack's. This means your Slack integration's receiving function does not need change to be compatible with Mattermost.
3. Slack attachments are supported with Slack-compatible outgoing webhooks. They also add support for mentions with `<@userid>` and announcement tokens (eg. `<!here>`) in the outgoing webhook responses.
  
Known Slack compatibility issues
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Using ``icon_emoji`` to override the username is not supported.
2. Referencing channels using ``<#CHANNEL_ID>`` does not link to the channel.
3. ``<!everyone>`` and ``<!group>`` are not supported.
4. Parameters "mrkdwn", "parse", and "link_names" are not supported (Mattermost always converts markdown and automatically links @mentions).
5. Bold formatting supplied as ``*bold*`` is not supported (must be done as ``**bold**``).
6. Advanced formatting using `message attachments <https://docs.mattermost.com/developer/message-attachments.html>`_ is not yet supported.

Troubleshooting
---------------

For assistance, review the `Troubleshooting forum <https://forum.mattermost.org/c/trouble-shoot>`__ for previously reported errors, or `join the Mattermost user community for troubleshooting help <https://mattermost.com/pl/default-ask-mattermost-community/>`_.

My integration prints the JSON data in a Mattermost channel
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost handles multiple content types for integrations, including plain text content type. If your integration prints the JSON data instead of rendering the generated message, make sure your integration is returning the ``application/json`` content-type.

source/archive/cloud-oauth-2-0-applications.rst METASEP
:nosearch:

OAuth 2.0 applications
======================

OAuth 2.0 is a protocol that allows Mattermost to authorize API requests from external applications. The authorization allows 

 - users with an account on a Mattermost server to sign in to third-party applications. You can find a `sample OAuth2 Client Application for Mattermost here <https://github.com/enahum/mattermost-oauth2-client-sample>`__ to test the functionality.

 - a Mattermost server to authenticate requests to a third-party API. One popular application is Zapier integration which allows you to integrate more than 700 applications with Mattermost through OAuth 2.0. See our `Zapier documentation <https://docs.mattermost.com/integrations/zapier.html>`__ to learn more.

This documentation includes the following details:

 - `Register your application in Mattermost <https://docs.mattermost.com/developer/oauth-2-0-applications.html#id1>`__
 - `Granting permissions to your application <https://docs.mattermost.com/developer/oauth-2-0-applications.html#id3>`__

Register your application in Mattermost
---------------------------------------

You must register your application in Mattermost to generate OAuth 2.0 credentials (client ID and secret), which your application can use to authenticate API calls to Mattermost, and which Mattermost uses to authorize API requests from the application.

If you would like to set up a Zapier integration with OAuth 2.0, see our `Zapier documentation <https://docs.mattermost.com/integrations/zapier.html>`__ to learn more.

Enable OAuth 2.0 applications
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

OAuth 2.0 applications are off by default and can be enabled by the System Administrator as follows:

1. Log in to your Mattermost server as the System Administrator.

2. Go to **Main Menu > System Console > Integrations > Custom Integrations** in prior versions or **System Console > Integrations > Integration Management** in versions after 5.12.

3. Set `Enable OAuth 2.0 Service Provider <https://docs.mattermost.com/administration/config-settings.html#enable-oauth-2-0-service-provider>`__ to **True**.

4. (Optional) If you would like to allow external applications to post with customizable usernames and profile pictures, then set `Enable integrations to override usernames <https://docs.mattermost.com/administration/config-settings.html#enable-webhooks-and-slash-commands-to-override-usernames>`__ and `Enable integrations to override profile picture icons <https://docs.mattermost.com/administration/config-settings.html#enable-webhooks-and-slash-commands-to-override-profile-picture-iconss>`__ to **True**.

5. (Optional) If you would like to allow users on your system who are not System Admins to create OAuth 2.0 applications, then set `Restrict managing integrations to Admins <https://docs.mattermost.com/administration/config-settings.html#restrict-managing-integrations-to-admins>`__ to **False**.

Register an OAuth 2.0 application
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Go to **Main Menu** > **Integrations**

2. Select **OAuth 2.0 Applications**, then click **Add OAuth 2.0 Application**

3. Set **Is Trusted**: When set to **Yes**, your application is considered trusted by Mattermost. This means Mattermost doesn't require users to accept authorization when signing to third-party applications. When set to **No**, users will be provided with the following page to accept or deny authorization when authenticating for the first time.

.. image:: ../images/oauth2_authorization_screen.png

Only System Admins can set OAuth 2.0 applications as trusted.

4. Specify the **Display Name**: Enter a name for your application made of up to 64 characters. This is the name users will see when granting access to the application, when viewing a list of authorized applications in **Account Settings > Security > OAuth 2.0 Applications** and when viewing a list of OAuth 2.0 applications in **Main Menu** > **Integrations**.

5. Add **Description**: This is a short description of your application that users will see when viewing a list of authorized applications in **Account Settings > Security > OAuth 2.0 Applications**.

6. Specify the **Homepage**: This is the homepage of the OAuth 2.0 application and lets users visit the app page to learn more what it does. The URL must be a valid URL and start with ``http://`` or ``https://`` depending on your server configuration.

7. (Optional) Add **Icon URL**: The image users will see when viewing a list of authorized applications in **Account Settings > Security > OAuth 2.0 Applications** and when viewing a list of OAuth 2.0 applications in **Main Menu** > **Integrations**. Must be a valid URL and start with ``http://`` or ``https://``.

8. Add **Callback URLs**: These are the URL(s) to which Mattermost will redirect users after accepting or denying authorization of your application, and which will be the only URL(s) that handle authorization codes or access tokens. If more than one URL is specified, users will be redirected to the URL used for the initial authorization of the app. Each URL must be on a separate line and start with ``http://`` or ``https://``.

9. Click **Save** to create the application. 

.. image:: ../images/oauth2_app_screen.png

10 - You will be provided with a **Client ID**, **Client Secret** and the authorized redirect URLs. Save these values and use them in your application to connect it to Mattermost.

.. image:: ../images/oauth2_confirmation_screen.png

Note: **Client Secret** can be regenerated by the application creator or System Administrator. Tokens created with the old secret will remain valid and authorization of existing users will continue to work; however, new authorizations and requests for new tokens will fail until the client secret has been updated in your app configuration.

.. image:: ../images/oauth2_regenerate_secret.png

Granting permissions to your application 
----------------------------------------

Once you have created an OAuth 2.0 application, all users on the Mattermost server are automatically given access to it. 

The application does not automatically have permissions based on the user who registers the app - the permissions are based on which users go through the OAuth flow, which could be the user who registers the app or anyone else on the system.

If the application was registered as a trusted OAuth 2.0 app on the Mattermost server, authorization from users is not required. Otherwise, the following page will be provided to accept or deny authorization when authenticating the app for the first time.

.. image:: ../images/oauth2_authorization_screen.png

Once authorized, the application receives an access token to perform requests on behalf of that user. The application can then perform any action for which the user has permission.

Users can view a list of authorized apps from **Account Settings > Security > OAuth 2.0 Applications**, and revoke authorization from this setting.

.. image:: ../images/oauth2_deauthorize_app.png

Deleting your application 
-------------------------

Deleting the application will revoke access from all users.

Only the user who created the application or a System Administrator can delete the app.

source/archive/cloud-mobile-apps.rst METASEP
:nosearch:

Mobile Applications Guide
=========================

There are three main options for deploying the Mattermost Mobile Apps.

Install from Apple App Store and Google Play
--------------------------------------------

For quick and easy deployment, you can download the Mattermost mobile apps directly from the Apple App Store and Google Play. Please see our guide on :doc:`installing from the Apple App Store and Google Play Store <mobile-appstore-install>` for more details. 

This option is recommended for:

1. Testing out the mobile applications
2. Team Edition servers using no push notifications, or push notifications from Mattermost's :ref:`TPNS <tpns>` (Test Push Notification Service)
3. Enterprise Edition servers using push notifications from Mattermost's :doc:`HPNS <mobile-hpns>` (Hosted Push Notification Service)

Build the apps yourself
------------------------

To customize the mobile apps, you can fork the open source repository and :doc:`compile your own versions <mobile-compile-yourself>` of the Mattermost mobile applications and Mattermost push proxy server. 

This option is recommended for:

1. Organizations that want to customize the mobile apps
2. Team Edition and Enterprise Edition servers that prefer to host their own push proxy server instead of using one of Mattermost's hosted versions

Use an EMM provider with Managed App Configuration
---------------------------------------------------

To meet other security and compliance policies, you can :doc:`deploy the Mattermost apps with any EMM provider <mobile-appconfig>` that supports `AppConfig <https://www.appconfig.org/members/>`__, such as MobileIron, Blackberry UEM, or Airwatch. You will still need to choose either the App Store/Google Play versions or apps compiled yourself to use in conjunction with the EMM provider.

This option is recommended for organizations that typically use EMM solutions to deploy mobile apps to meet security and compliance policies.

.. note::
    App wrapping via an EMM provider is untested, and not supported by Mattermost. Instead, we recommend using an EMM provider that supports Managed App Configuration.  

    Many app wrapping toolkits, for example `Citrix MDX <https://docs.citrix.com/en-us/mdx-toolkit/about-mdx-toolkit.html>`_, also provide `Managed App Configuration options <https://docs.citrix.com/en-us/xenmobile/server/policies/app-configuration-policy.html>`_. We recommend contacting your provider for more information on what deployment options are available.

source/archive/cloud-mobile-apps-faq.rst METASEP
:nosearch:

Mobile Apps FAQ
===============

Can I connect to multiple Mattermost workspaces using the mobile apps?
----------------------------------------------------------------------

At the moment, we only support connecting to one workspace at a time; however, we are aware that this is one of the `top feature requests <https://mattermost.uservoice.com/forums/306457-general/suggestions/10975938-ios-and-android-apps-should-allow-multiple-server>`__ for the mobile app. We are currently investigating some technical challenges, such as how to handle push notifications coming from multiple workspaces. To follow our progress on this feature, you can join the `RN: Multi-Server <https://community.mattermost.com/core/channels/rn-multi-server-suppot>`_ channel on our community server.

As a workaround, you can install the released Mattermost mobile app and sign up to be a `tester <https://github.com/mattermost/mattermost-mobile/blob/master/README.md#testing>`__ for the Mattermost Beta mobile app. This allows you to connect and log in to a different workspace from each app.

Is there a tablet version of the mobile apps?
---------------------------------------------

Mattermost Classic mobile apps support tablets. Our second generation mobile apps (Mattermost) have beta support for tablets.

Can the permanent sidebar on tablet devices be disabled?
--------------------------------------------------------

The permanent sidebar is on by default for tablet-sized devices, but can be disabled from **Settings > Display > Sidebar > Permanent Sidebar**. When disabled, the sidebar behaves similarly to mobile devices where the user must open it using the button in the top-left corner of the screen.

How is data handled on mobile devices after a user account is deactivated?
--------------------------------------------------------------------------

App data is wiped from the device when a user logs out of the app. If the user is logged in when the account is deactivated, then within one minute of deactivation the system logs the user out. Thereafter all app data is wiped from the device.

What post metadata is sent in mobile push notifications?
--------------------------------------------------------

The following post metadata is sent in all push notifications:

- ``Team ID``
- ``Channel ID``
- ``Post ID``
- ``User ID`` (post author)
- ``Username`` (post author or webhook override username)
- ``Root ID`` (only if the post is in a thread)
- ``Type`` (create or clear push notification)
- ``Category`` (iOS only, determines if the notifications can be replied to)
- ``Badge number`` (what the notification badge on the app icon should be set to when the notification is received)

Additional metadata may be sent depending on the System Console setting for `Push Notification Contents <https://docs.mattermost.com/administration/config-settings.html#push-notification-contents>`__:

- **Generic description with sender and channel names:** ``Channel name`` metadata will be included.
- **Full message content sent in the notification payload:** ``Post content`` and ``Channel name`` metadata will be included.
- **Full message content fetched from the server on receipt:** ``Post content`` and ``Channel name`` are not included in the notification payload. Instead the ``Post ID`` is used to fetch ``Post content`` and ``Channel name`` from the workspace after the push notification is received on the device.

How can I use ID-Only push notifications to protect notification content from being exposed to third-party services?
--------------------------------------------------------------------------------------------------------------------

When it comes to mobile data privacy, many organizations prioritize secure handling of messaging data, particularly when it may contain mission-critical or proprietary information. These organizations may have concerns about using mobile notifications because data must pass through third-party entities like Apple Push Notification Service (APNS) or Google Firebase Cloud Messaging (FCM) before it reaches a device. This poses a potential risk for organizations that operate under strict compliance requirements and cannot expose message data to external entities.

To solve this, we offer an option for greater protection for Mattermost push notification message data by only sending a unique message ID in the notification payload rather than the full message data. Once the device receives the ID, it then fetches the message content directly from Mattermost and displays the notification per usual. External entities, such as APNS and FCM, handle only the ID and are unable to read any part of the message itself.

If your organization has strict privacy or compliance needs, the `ID-Only Push Notification <https://docs.mattermost.com/administration/config-settings.html#push-notification-contents>`_ setting offers a high level of privacy while still allowing your team members to benefit from mobile push notifications.

What are my options for securing the mobile apps?
-------------------------------------------------

The following options for secure mobile app deployments are available:

1. Securing network connection to mobile apps
  - Use HTTPS and WSS network connections to encrypt transport.
  - Use of a mobile VPN client on mobile devices to establish a secure connection to Mattermost within a private network.

2. Use multifactor authentication options
  - If a VPN client with multifactor authentication is not in use, it's highly recommended that MFA is required on authenticating into Mattermost, either within Mattermost itself or via your SSO provider.

Why do I sometimes see a delay in receiving a push notification?
----------------------------------------------------------------

`Apple Push Notification Service (APNS) <https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/APNSOverview.html#//apple_ref/doc/uid/TP40008194-CH8-SW1>`_ and `Google Fire Cloud Messaging (FCM) <https://firebase.google.com/docs/cloud-messaging>`_ determine when your device receives a push notification from Mattermost. Thus, a delay is usually as a result of those services.

The technical flow for the device to receive a push notification is as follows:

1. User posts a message in Mattermost.
2. Mattermost identifies whether a notification needs to be sent.
3. If yes, Mattermost sends a payload containing the push notification to the push proxy.
4. The push proxy parses the notification and relays it to APNS and FCM.
5. APNS and FCM informs the relevant devices that there is a push notification for Mattermost. This usually happens almost immediately, but may be delayed by a couple of minutes.
6. Mattermost processes the notification and displays it on the user's device.

How do I deploy Mattermost with Enterprise Mobility Management (EMM) providers?
-------------------------------------------------------------------------------

Mattermost enables customers with high privacy and custom security requirements to deploy mobile app and push notification services using keys that they alone control.

`Learn more about using AppConfig for EMM providers <https://docs.mattermost.com/cloud/cloud-mobile/cloud-app-config.html>`__.

How can I get Google SSO to work with the Mattermost mobile app?
----------------------------------------------------------------

The apps on the Apple App Store and Google Play Store cannot support Google SSO out of the box. This is because Google requires a unique Google API key that's specific to each organization.

If you need Google SSO support, you can create a custom version of the app for your own organization. Fork the `mattermost-mobile <https://github.com/mattermost/mattermost-mobile>`__  repository and add support for Google SSO before compiling the app yourself. If this is something you’re interested in, please `file an issue in GitHub <https://github.com/mattermost/mattermost-mobile/issues>`__ to start the discussion.

source/archive/cloud-integrations.rst METASEP
:nosearch:

Incoming Webhooks
=================

.. note::
   
   This is the admin documentation for incoming webhooks. If you're a developer looking to build an integration, see `our developer documentation <https://developers.mattermost.com/integrate/getting-started/>`__.

Mattermost supports webhooks to easily integrate external applications into the server.

Use incoming webhooks to post messages to Mattermost public channels, private channels and direct messages. Messages are sent via an HTTP POST request to a Mattermost URL generated for each application and contain a specifically formatted JSON payload in the request body.

.. image:: ../images/incoming_webhooks_sample.png
  :width: 500 px
*An example of a GitHub integration that posts updates to a Developers channel*

Use `curl <https://curl.haxx.se/>`__, a simple command line tool for sending HTTP requests in the examples that follow.

.. note::
  To prevent malicious users from trying to perform `phishing attacks <https://en.wikipedia.org/wiki/Phishing>`__, a *BOT* indicator appears next to posts coming from webhooks regardless of what username is specified.

.. toctree::
   :maxdepth: 2

Simple Incoming Webhook
-----------------------

Let's learn how to create a simple incoming webhook that posts the following message to Mattermost.

.. image:: ../images/incoming_webhooks_create_simple.png
  :width: 400 px
  
1. Go to **Main Menu > Integrations > Incoming Webhook**. If you don't have the **Integrations** option in your Main Menu, incoming webhooks may not be enabled on your Mattermost server or may be disabled for non-admins. Enable them by going to **System Console > Integrations > Integration Management**, or ask your System Admin to do so.
2. Select **Add Incoming Webhook** and add name and description for the webhook. The description can be up to 500 characters. 
3. Select the channel to receive webhook payloads, then click **Add** to create the webhook.
4. Use a curl command from your terminal or commandline to send the following JSON payload in a HTTP POST request:

.. code-block:: text

  curl -i -X POST -H 'Content-Type: application/json' -d '{"text": "Hello, this is some text\nThis is more text. :tada:"}' http://{your-mattermost-site}/hooks/xxx-generatedkey-xxx
  # or
  curl -i -X POST --data-urlencode 'payload={"text": "Hello, this is some text\nThis is more text. :tada:"}' http://{your-mattermost-site}/hooks/xxx-generatedkey-xxx

If you're running `cURL on Windows <https://curl.haxx.se/windows/>`__, ensure inner double quotes are escaped with a backslash. Here's an example payload on Windows:

.. code-block:: text

  curl -i -X POST -H "Content-Type: application/json" -d "{\"text\": \"Hello, this is some text\nThis is more text. :tada:\"}" http://{your-mattermost-site}/hooks/xxx-generatedkey-xxx

See `developer documentation <https://developers.mattermost.com/integrate/incoming-webhooks/>`__ for details on what parameters are supported by incoming webhooks. For instance, you can override the username and profile picture the messages post as, or specify a custom post type when sending a webhook message for use by `plugins <https://developers.mattermost.com/integrate/admin-guide/admin-plugins-beta/>`__. The following payload gives an example webhook that uses additional parameters and formatting options:

.. code-block:: text

  payload={
    "channel": "town-square",
    "username": "test-automation",
    "icon_url": "https://mattermost.com/wp-content/uploads/2022/02/icon.png",
    "text": "#### Test results for July 27th, 2017\n<!channel> please review failed tests.\n
    | Component  | Tests Run   | Tests Failed                                   |
    |:-----------|:-----------:|:-----------------------------------------------|
    | Server     | 948         | :white_check_mark: 0                           |
    | Web Client | 123         | :warning: 2 [(see details)](http://linktologs) |
    | iOS Client | 78          | :warning: 3 [(see details)](http://linktologs) |
    "
    }

This content will be displayed in the Town Square channel.

.. image:: ../images/incoming_webhooks_full_example.png
  :width: 500 px

Messages with advanced formatting can be created by including an :doc:`attachment array <message-attachments>` and :doc:`interactive message buttons <interactive-messages>` in the JSON payload.

.. note::
  `Enable integrations to override usernames <https://docs.mattermost.com/administration/config-settings.html#enable-integrations-to-override-usernames>`__ must be set to `true` in `config.json` to override usernames. Enable them by going to **System Console > Integrations > Integration Management**, or ask your System Admin to do so. If not enabled, the username is set to `webhook`.
  
  Similarly, `Enable integrations to override profile picture icons <https://docs.mattermost.com/administration/config-settings.html#enable-integrations-to-override-profile-picture-icons>`__ must be set to `true` in `config.json` to override profile picture icons. Enable them by going to **System Console > Integrations > Integration Management**, or ask your System Admin to do so. If not enabled, the icon of the creator of the webhook URL is used to post messages.

Tips and Best Practices
------------------------

1. Webhooks are designed to easily allow you to post messages. For other actions such as channel creation, you must also use the `Mattermost APIs <https://api.mattermost.com>`__.

2. If the text is longer than the allowable character limit per post, the message is split into multiple consecutive posts, each within the character limit. Servers running Mattermost Server v5.0 or later `can support posts up to 16383 characters <https://docs.mattermost.com/administration/important-upgrade-notes.html>`__.

3. You can restrict who can create incoming webhooks in `System Console > Integrations > Integration Management <https://docs.mattermost.com/administration/config-settings.html#restrict-managing-integrations-to-admins>`__.

4. Mattermost incoming webhooks are Slack-compatible. You can copy-and-paste code used for a Slack incoming webhook to create Mattermost integrations. Mattermost `automatically translates the Slack's proprietary JSON payload format <https://docs.mattermost.com/developer/webhooks-incoming.html?highlight=translate%20slack%20data%20format%20mattermost#translate-slack-s-data-format-to-mattermost>`__.

5. The external application may be written in any programming language as long as it supports sending an HTTP POST request in the required JSON format to a specified Mattermost URL.

6. For the HTTP request body, if `Content-Type` is specified as ``application/json`` in the header of the HTTP request, then the body can be direct JSON. For example,

.. code-block:: text

  {"text": "Hello, this is some text."}

7. When using the ``icon_emoji`` parameter - the user profile image is replaced by the emoji provided. This will also override the ``icon_url`` parameter if both are provided. 

Share Your Integration
-----------------------

If you've built an integration for Mattermost, please consider `sharing your work <https://apps.mattermost.com/submit-an-integration/>`__ in our `app directory <https://mattermost.com/marketplace/>`__.

The `app directory <https://mattermost.com/marketplace/>`__ lists open source integrations developed by the Mattermost community and are available for download, customization and deployment to your private cloud or self-managed infrastructure.

Slack Compatibility
-------------------

Mattermost makes it easy to migrate integrations written for Slack to Mattermost. 

Using the Slack ``icon_emoji`` parameter overrides the profile icon and the icon_url parameter and is supported as of v5.14.

Translate Slack's data format to Mattermost
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost automatically translates the data coming from Slack:

1. JSON payloads written for Slack, that contain the following, are translated to Mattermost markdown and rendered equivalently to Slack:
   
   - ``<>`` to denote a URL link, such as ``{"text": "<https://mattermost.com/>"}``
   - ``|`` within a ``<>`` to define linked text, such as ``{"text": "Click <https://mattermost.com/|here> for a link."}``
   - ``<userid>``  to trigger a mention to a user, such as ``{"text": "<5fb5f7iw8tfrfcwssd1xmx3j7y> this is a notification."}``
   - ``<!channel>``, ``<!here>`` or ``<!all>`` to trigger a mention to a channel, such as ``{"text": "<!channel> this is a notification."}``

2. You can override the channel name with a *@username*, such as ```payload={"text": "Hi", channel: "@jim"}`` to send a direct message like in Slack.
3. You can prepend a channel name with *#* and the message will still be sent to the correct channel like in Slack.

Mattermost webhooks in GitLab using Slack UI
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

GitLab is the leading open-source alternative to GitHub and offers built-in integrations with Slack. You can use the Slack interface in GitLab to add Mattermost webhooks directly without changing code:

1. In GitLab, go to **Settings > Services** and select **Slack**.
2. Paste the incoming webhook URL provided by Mattermost from **Main Menu > Integrations > Incoming Webhooks**.
3. Optionally set the **Username** you'd like displayed when the notification is made. Leave the **Channel** field blank.
4. Click **Save** then test the settings to confirm messages are sent successfully to Mattermost.

Known Slack compatibility issues
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Referencing  channels using <#CHANNEL_ID> does not link to the channel.
2. ``<!everyone>`` and ``<!group>`` are not supported.
3. Parameters "mrkdwn", "parse", and "link_names" are not supported. Mattermost converts Markdown by default and automatically links @mentions.
4. Bold formatting as ``*bold*`` is not supported (must be done as ``**bold**``).
5. Webhooks cannot direct message the user who created the webhook.

Troubleshooting
---------------

To debug incoming webhooks in **System Console > Logs**, set **System Console > Logging > Enable Webhook Debugging** to ``true`` and set **System Console > Logging > Console Log Level** to ``DEBUG``.

Some common error messages include:

1. ``Couldn't find the channel``: Indicates that the channel doesn't exist or is invalid. Please modify the ``channel`` parameter before sending another request.
2. ``Couldn't find the user``: Indicates that the user doesn't exist or is invalid. Please modify the ``channel`` parameter before sending another request.
3. ``Unable to parse incoming data``: Indicates that the request received is malformed. Try reviewing that the JSON payload is in a correct format and doesn't have typos such as extra `"`.
4. ``curl: (3) [globbing] unmatched close brace/bracket in column N``: Typically an error when using cURL on Windows, when:
  1. You have space around JSON separator colons, ``payload={"Hello" : "test"}`` or  
  2. You are using single quotes to wrap the ``-d`` data, ``-d 'payload={"Hello":"test"}'``

If your integration prints the JSON payload data instead of rendering the generated message, make sure your integration is returning the ``application/json`` content-type.

For further assistance, review the `Troubleshooting forum <https://forum.mattermost.com/c/trouble-shoot>`__ for previously reported errors, or `join the Mattermost user community for troubleshooting help <https://mattermost.com/pl/default-ask-mattermost-community/>`_.

Frequently Asked Questions
----------------------------

How do I send a webhook post to a direct message channel?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

To send a message to a direct message channel, add an "@" symbol followed by the username to the channel parameter. You can add your own username to send the webhook posts to a direct message channel with yourself.

.. code-block:: text

  payload={"channel": "@username", "text": "Hello, this is some text\nThis is more text. :tada:"}

This will send a message from the account that has set up the incoming webhook to the username after the "@" symbol. For example, if you create a webhook with the user ``alice`` and send a direct message to ``bob`` using a webhook, it will show up as a direct message from ``alice`` to ``bob`` regardless of other settings such as username.

To send a message to a different direct message channel between two other users, you can specify the channel with the user IDs for the users separated with two underscore (_) symbols. To find the user ID you can `use the ``mattermost`` command - see details `here <https://docs.mattermost.com/administration/command-line-tools.html#mattermost-user-search>`__.

.. code-block:: text

  payload={"channel": "6w41z1q367dujfaxr1nrykr5oc__94dzjnkd8igafdraw66syi1cde", "text": "Hello, this is some text\nThis is more text. :tada:"}

source/archive/cloud-integrations-faq.md METASEP
# Integrations FAQ

Come [join our Contributors community channel](https://community.mattermost.com/core/channels/tickets) on our daily build server, where you can discuss questions with community members and the Mattermost core team. Join our [Developers channel](https://community.mattermost.com/core/channels/developers) for technical discussions and our [Integrations channel](https://community.mattermost.com/core/channels/integrations) for all integrations and plugins discussions.

## What's the difference between incoming and outgoing webhooks?

A webhook is a way for one app to send real-time data to another app.

In Mattermost, incoming webhooks receive data from external applications and make a post in a specified channel. They're great for setting up notifications when something happens in an external application.

Outgoing webhooks take data from Mattermost, and send it to an external application. Then the outgoing webhook can post a response back in Mattermost. They're great for listening in on channels, and then notifying external applications when a trigger word is used.

## What's a slash command?

A slash command is similar to an outgoing webhook, but instead of listening to a channel it is used as a command tool. If you type in a slash command, that content won't be posted to a channel, whereas an outgoing webhook is only triggered by posted messages.

## What does Slack-compatible mean?

Slack-compatible means that Mattermost accepts integrations that have a payload in the same format as Slack.  

If you have a Slack integration, you should be able to set it up in Mattermost without changing the format.   

## What if I have a webhook from somewhere other than Slack?

If you have an integration that outputs a payload in a different format, you need to write an intermediate application to act as a translation layer to change it to the format Mattermost uses. Since there’s currently no general standard for webhook formatting, this is unavoidable and just a part of how webhooks work.

If there's no translation layer, Mattermost won't understand the data you're sending.

## What are attachments?

When "attachments" are mentioned in the Mattermost integrations documentation, it refers to Slack's Message Attachments. These "attachments" can be optionally added as an array in the data sent by an integration, and are used to customize the formatting of the message.

We currently don't support the ability to attach files to a post made by an integration.

## Where can I find existing integrations?

[Visit our app directory](https://mattermost.com/marketplace/) for dozens of open source integrations to common tools like Jira, Jenkins, GitLab, Trac, Redmine, and Bitbucket, along with interactive bot applications (Hubot, mattermost-bot), and other communication tools (Email, IRC, XMPP, Threema) that are freely available for use and customization.

## Where should I install my integrations? 

You can set up a separate server for integrations, or add them to the server on which the external application is hosted - for example, if you're self-hosting a Jira server you could deploy a Jira integration on the Jira server itself.

When self-hosting restrictions are less strict, AWS, Heroku, and other public cloud options could also be used.

## How do I create a bot account with personal access tokens?

See [bot accounts documentation](https://docs.mattermost.com/developer/bot-accounts.html) to learn more about how to create and manage bot accounts in Mattermost.

## How do I create a bot account without personal access tokens or webhooks?

Deployments that cannot create bot accounts via webhooks due to security reasons and do not want to use [personal access tokens](https://developers.mattermost.com/integrate/admin-guide/admin-personal-access-token/) with no expiry time, can use the following approach:

1. Create a bot account using a secure email and strong password.
2. Manually add the account to all teams and channels it needs access to. If your deployment has a lot of teams or channels, you may create a script to automate the process.
   - In a testing environment, you may also make the bot account a System Admin, giving the bot permissions to post to any channel. This is not recommended in production due to potential security vulnerabilities.
3. Provide the email and password to your integration, and store it in a secure location with restricted access.
4. Have your integration use the email and password with an [`/api/v4/login`](https://api.mattermost.com/v4/#tag/authentication) endpoint to retrieve a session token. The session token is used to authenticate to the Mattermost system.
   - Set up your bot to make an HTTP POST to `your-mattermost-url.com/api/v4/users/login` with a JSON body, including the bot account's email and password.
  
     ```
     POST /api/v4/users/login HTTP/1.1
     Host: your-mattermost-url.com
     Content-Length: 66
     Content-Type: application/json
     
     {"login_id":"someone@nowhere.com","password":"thisisabadpassword"}
     ```
  
     where we assume there is a Mattermost instance running at http://localhost:8065.
   - If successful, the response will contain a `Token` header and a user object in the body:
   
     ```
     HTTP/1.1 200 OK
     Set-Cookie: MMSID=hyr5dmb1mbb49c44qmx4whniso; Path=/; Max-Age=2592000; HttpOnly
     Token: hyr5dmb1mbb49c44qmx4whniso
     X-Ratelimit-Limit: 10
     X-Ratelimit-Remaining: 9
     X-Ratelimit-Reset: 1
     X-Request-Id: smda55ckcfy89b6tia58shk5fh
     X-Version-Id: developer
     Date: Fri, 11 Sep 2015 13:21:14 GMT
     Content-Length: 657
     Content-Type: application/json; charset=utf-8
     
     {{user object as json}}
     ```
     
     The bot should retrieve the session token from the `Token` header and store it in memory for use with future requests.
   
   **Note:** Each session token has an expiry time, set depending on configuration. If the session token your bot is using expires, it will receive a `401 Unauthorized` response from requests using that token. When your bot receives this response, it should reapply the login logic (using the above steps) to get another session token. Then it should resend the request that received the `401` status code.
5. Include the `Token` as part of the `Authorization` header on API requests from your integration.
   - To confirm the token works, you can have your bot make a simple `GET` request to `/api/v4/users/me` with `Authorization: bearer <yourtokenhere>` in the header. If it returns a `200` with the bot's user object in the response, the API request was made successfully.
     ```
     GET /api/v4/users/me HTTP/1.1
     Authorization: bearer <yourtokenhere>
     Host: your-mattermost-url.com
     ```

**Note:** The Mattermost development team is also working on an [API developer token](https://docs.google.com/document/d/1ey4eNQmwK410pNTvlnmMWTa1fqtj8MV4d9XkCumI384), which allows you to authenticate the bot account via the API token rather than retrieving a session token from a user account.

source/archive/cloud-incoming-webhooks.rst METASEP
:nosearch:

Incoming webhooks
=================

.. note::
  This is the admin documentation for incoming webhooks. If you're a developer looking to build an integration, see `our developer documentation <https://developers.mattermost.com/integrate/getting-started/>`__.

Mattermost supports webhooks to easily integrate external applications into the cloud workspace.

Use incoming webhooks to post messages to Mattermost public channels, private channels and direct messages. Messages are sent via an HTTP POST request to a Mattermost URL generated for each application and contain a specifically formatted JSON payload in the request body.

.. image:: ../images/incoming_webhooks_sample.png
  :width: 500 px

*An example of a GitHub integration that posts updates to a Developers channel*

Use `curl <https://curl.haxx.se/>`__, a simple command line tool for sending HTTP requests in the examples that follow.

.. note::
  To prevent malicious users from trying to perform `phishing attacks <https://en.wikipedia.org/wiki/Phishing>`__, a *BOT* indicator appears next to posts coming from webhooks regardless of what username is specified.

.. toctree::
   :maxdepth: 2

Simple incoming webhook
-----------------------

Let's learn how to create a simple incoming webhook that posts the following message to Mattermost.

.. image:: ../images/incoming_webhooks_create_simple.png
  :width: 400 px
  
1. Go to **Main Menu > Integrations > Incoming Webhooks**. If you don't have the **Integrations** option in your Main Menu, incoming webhooks may not be enabled or may be disabled for non-admins. Enable them from **System Console > Integrations > Integration Management** or ask your System Admin to do so.
2. Select **Add Incoming Webhook** and add a title and description for the webhook. The description can be up to 500 characters. 
3. Choose the channel to receive webhook payloads, then select **Save** to create the webhook.
4. Use a curl command from terminal or command prompt to send the following JSON payload in a HTTP POST request:

.. code-block:: text

  curl -i -X POST -H 'Content-Type: application/json' -d '{"text": "Hello, this is some text\nThis is more text. :tada:"}' http://{your-mattermost-site}/hooks/xxx-generatedkey-xxx
  # or
  curl -i -X POST --data-urlencode 'payload={"text": "Hello, this is some text\nThis is more text. :tada:"}' http://{your-mattermost-site}/hooks/xxx-generatedkey-xxx

If you're running `cURL on Windows <https://curl.haxx.se/windows/>`__, ensure inner double quotes are escaped with a backslash. Here's an example payload on Windows:

.. code-block:: text

  curl -i -X POST -H "Content-Type: application/json" -d "{\"text\": \"Hello, this is some text\nThis is more text. :tada:\"}" http://{your-mattermost-site}/hooks/xxx-generatedkey-xxx

See `developer documentation <https://developers.mattermost.com/integrate/incoming-webhooks/>`__ for details on what parameters are supported by incoming webhooks. For instance, you can override the username and profile picture the messages post as, or specify a custom post type when sending a webhook message for use by `plugins <https://developers.mattermost.com/integrate/admin-guide/admin-plugins-beta/>`__. The following payload gives an example webhook that uses additional parameters and formatting options:

.. code-block:: text

  payload={
    "channel": "town-square",
    "username": "test-automation",
    "icon_url": "https://mattermost.org/wp-content/uploads/2016/04/icon.png",
    "text": "#### Test results for July 27th, 2017\n<!channel> please review failed tests.\n
    | Component  | Tests Run   | Tests Failed                                   |
    |:-----------|:-----------:|:-----------------------------------------------|
    | Server     | 948         | :white_check_mark: 0                           |
    | Web Client | 123         | :warning: 2 [(see details)](http://linktologs) |
    | iOS Client | 78          | :warning: 3 [(see details)](http://linktologs) |
    "
    }

This content will be displayed in the Town Square channel.

.. image:: ../images/incoming_webhooks_full_example.png
  :width: 500 px

Messages with advanced formatting can be created by including an :doc:`attachment array <message-attachments>` and :doc:`interactive message buttons <interactive-messages>` in the JSON payload.

.. note::

  `Enable integrations to override usernames <https://docs.mattermost.com/configure/configuration-settings.html#enable-integrations-to-override-usernames>`__ must be set to ``true`` in ``config.json`` to override usernames. Enable them from **System Console > Integrations > Integration Management** or ask your System Admin to do so. If not enabled, the username is set to ``webhook``.
  
  Similarly, `Enable integrations to override profile picture icons <https://docs.mattermost.com/configure/configuration-settings.html#enable-integrations-to-override-profile-picture-icons>`__ must be set to ``true`` in ``config.json`` to override profile picture icons. Enable them from **System Console > Integrations > Integration Management** or ask your System Admin to do so. If not enabled, the icon of the creator of the webhook URL is used to post messages.

Tips and best practices
------------------------

1. Webhooks are designed to easily allow you to post messages. For other actions such as channel creation, you must also use the `Mattermost APIs <https://api.mattermost.com>`__.

2. If the text is longer than the allowable character limit per post, the message is split into multiple consecutive posts, each within the character limit. Posts up to 16383 characters are supported.

3. You can restrict who can create incoming webhooks in `System Console > Integrations > Integration Management <https://docs.mattermost.com/configure/configuration-settings#restrict-managing-integrations-to-admins>`__.

4. Mattermost incoming webhooks are Slack-compatible. You can copy and paste code used for a Slack incoming webhook to create Mattermost integrations. Mattermost `automatically translates the Slack's proprietary JSON payload format <https://docs.mattermost.com/developer/webhooks-incoming.html?highlight=translate%20slack%20data%20format%20mattermost#translate-slack-s-data-format-to-mattermost>`__.

5. The external application may be written in any programming language as long as it supports sending an HTTP POST request in the required JSON format to a specified Mattermost URL.

6. For the HTTP request body, if ``Content-Type`` is specified as ``application/json`` in the header of the HTTP request, then the body can be direct JSON. For example,

.. code-block:: text

  {"text": "Hello, this is some text."}

7. When using the ``icon_emoji`` parameter - the user profile image is replaced by the emoji provided. This will also override the ``icon_url`` parameter if both are provided. 

Share your integration
-----------------------

If you've built an integration for Mattermost, please consider `sharing your work <https://apps.mattermost.com/submit-an-integration/>`__ in our `app directory <https://apps.mattermost.com/submit-an-integration/>`__.

The `app directory <https://apps.mattermost.com/submit-an-integration/>`__ lists open source integrations developed by the Mattermost community and are available for download, customization, and deployment to your private cloud or self-managed infrastructure.

Slack compatibility
-------------------

Mattermost makes it easy to migrate integrations written for Slack to Mattermost. 

Using the Slack ``icon_emoji`` parameter overrides the profile icon and the icon_url parameter. 

Translate Slack's data format to Mattermost
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost automatically translates the data coming from Slack:

1. JSON payloads written for Slack, that contain the following, are translated to Mattermost markdown and rendered equivalently to Slack:
   
   - ``<>`` to denote a URL link, such as ``{"text": "<https://mattermost.com/>"}``
   - ``|`` within a ``<>`` to define linked text, such as ``{"text": "Click <https://mattermost.com/|here> for a link."}``
   - ``<userid>``  to trigger a mention to a user, such as ``{"text": "<5fb5f7iw8tfrfcwssd1xmx3j7y> this is a notification."}``
   - ``<!channel>``, ``<!here>`` or ``<!all>`` to trigger a mention to a channel, such as ``{"text": "<!channel> this is a notification."}``

2. You can override the channel name with a *@username*, such as ```payload={"text": "Hi", channel: "@jim"}`` to send a direct message like in Slack.
3. You can prepend a channel name with *#* and the message will still be sent to the correct channel like in Slack.

Mattermost webhooks in GitLab using Slack UI
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

GitLab is the leading open-source alternative to GitHub and offers built-in integrations with Slack. You can use the Slack interface in GitLab to add Mattermost webhooks directly without changing code:

1. In GitLab, go to **Settings > Services** and select **Slack**.
2. Paste the incoming webhook URL provided by Mattermost from **Main Menu > Integrations > Incoming Webhooks**.
3. Optionally set the **Username** you'd like displayed when the notification is made. Leave the **Channel** field blank.
4. Select **Save** then test the settings to confirm messages are sent successfully to Mattermost.

Known Slack compatibility issues
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Referencing  channels using <#CHANNEL_ID> does not link to the channel.
2. ``<!everyone>`` and ``<!group>`` are not supported.
3. Parameters "mrkdwn", "parse", and "link_names" are not supported. Mattermost converts Markdown by default and automatically links @mentions.
4. Bold formatting as ``*bold*`` is not supported (must be done as ``**bold**``).
5. Webhooks cannot direct message the user who created the webhook.

Troubleshooting
---------------

To debug incoming webhooks in **System Console > Logs**, set **System Console > Logging > Enable Webhook Debugging** to ``true`` and set **System Console > Logging > Console Log Level** to ``DEBUG``.

Some common error messages include:

1. ``Couldn't find the channel``: Indicates that the channel doesn't exist or is invalid. Please modify the ``channel`` parameter before sending another request.
2. ``Couldn't find the user``: Indicates that the user doesn't exist or is invalid. Please modify the ``channel`` parameter before sending another request.
3. ``Unable to parse incoming data``: Indicates that the request received is malformed. Try reviewing that the JSON payload is in a correct format and doesn't have typos such as extra `"`.
4. ``curl: (3) [globbing] unmatched close brace/bracket in column N``: Typically an error when using cURL on Windows, when:

  1. You have space around JSON separator colons, ``payload={"Hello" : "test"}`` or  
  2. You are using single quotes to wrap the ``-d`` data, ``-d 'payload={"Hello":"test"}'``

If your integration prints the JSON payload data instead of rendering the generated message, make sure your integration is returning the ``application/json`` content-type.

For further assistance, review the `Troubleshooting forum <https://forum.mattermost.org/c/trouble-shoot>`__ for previously reported errors, or `join the Mattermost user community for troubleshooting help <https://mattermost.com/pl/default-ask-mattermost-community/>`_.

Frequently asked questions
--------------------------

How do I send a webhook post to a direct message channel?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

To send a message to a direct message channel, add an "@" symbol followed by the username to the channel parameter. You can add your own username to send the webhook posts to a direct message channel with yourself.

.. code-block:: text

  payload={"channel": "@username", "text": "Hello, this is some text\nThis is more text. :tada:"}

This will send a message from the account that has set up the incoming webhook to the username after the "@" symbol. For example, if you create a webhook with the user ``alice`` and send a direct message to ``bob`` using a webhook, it will show up as a direct message from ``alice`` to ``bob`` regardless of other settings such as username.

To send a message to a different direct message channel between two other users, you can specify the channel with the user IDs for the users separated with two underscore (_) symbols. To find the user ID you can `use the ``mattermost`` command - see details `here <https://docs.mattermost.com/administration/command-line-tools.html#mattermost-user-search>`__.

.. code-block:: text

  payload={"channel": "6w41z1q367dujfaxr1nrykr5oc__94dzjnkd8igafdraw66syi1cde", "text": "Hello, this is some text\nThis is more text. :tada:"}

source/archive/cloud-guest-accounts.rst METASEP
:nosearch:

Guest Accounts (Beta)
=====================

Guest Accounts are a way to collaborate with individuals (such as vendors and contractors) outside of your organization by controlling their access to channels and team members. For example, Guest Accounts can be used to collaborate with customers on a support issue or work on a website project with resources from an external design firm.

Guests can:

- Pin messages to channels
- Use slash commands (excluding restricted commands such as invite members, rename channels, change headers, etc)
- Favorite channels
- Mute channels
- Update their account settings

Guests cannot:

- Discover public channels
- Join open teams
- Create direct messages or group messages with members who aren’t within the same channel
- Invite people

Additionally, guests are not automatically added to the default ``Town-square`` and ``Off-topic`` channels upon logging in and need to be invited/added to them manually.

Enabling Guest Accounts
------------------------

1. Navigate to **System Console > Authentication > Guest Access**.
2. Set **Enable Guest Access** to **true**.
3. (Optional) **Whitelist domains that are acceptable for Guest Access**.

 - This allows the System Administrators to set a list of approved guest domains. If you have team domain restrictions, you will also need to add your guest domain to **Team Settings > Allow only users with a specific email domain to join this team**.

4. (Optional) **Enforce Multi-Factor Authentication (MFA) for your Guests**.

 - If you are enforcing MFA for your users, you can optionally choose to enforce MFA for your guest users.

Guest Authentication
---------------------

Guests can access the Mattermost workspace via email invitation, and be authenticated using AD/LDAP or SAML 2.0.

Before you proceed, ensure that the authentication method you wish to use is correctly configured on your workspace and enabled in Mattermost. For configuration steps and technical documentation, see `Active Directory/LDAP Setup <https://docs.mattermost.com/deployment/sso-ldap.html>`_ and `SAML Single-Sign-On <https://docs.mattermost.com/deployment/sso-saml.html>`_.

Converting a member user to a guest will not change the channels they are in. However, they will be restricted from discovering additional channels and are unable to Direct Message/Group Message users outside of the channels they are in. They can be added to channels by System Admins and other roles that have the correct permissions to invite guests.

Inviting Guests to the Mattermost Workspace via Email
------------------------------------------------------

Guests can be invited into one or more Mattermost channels within a team by System Admins and other roles that have the correct permission to invite guests. A guest can be invited into channels on multiple teams.

**Note:** Guest invitations are revoked after 48 hours per the member email invitation process. If your guest has not accepted the invitation within that period, please follow the steps below to resend an invitation to the guest.

To invite guests into one or more Mattermost channels:

1. Enable email invites from **System Console > Signup > Enable Email Invitations**.
2. Navigate to **Main Menu > Invite People**. This is a new invitation option that combines inviting guests and members and consolidates **Send Email**, **Get Team Invite Link**, and **Add Members to the Team**.
3. Select **Invite Guests**.
4. Enter the guest’s email address.
5. Select the channels the guest can join (excluding managed teams).
6. (Optional) Enter a custom message.

.. image:: ../images/Guest_Invite_Screen.png

Configuring AD/LDAP Authentication
----------------------------------

When enabled, the **Guest Filter** in Mattermost identifies external users whose AD/LDAP role is ``guest`` and who are invited to join your Mattermost workspace. These users will have the ``guest`` role applied immediately upon first sign-in instead of the default member user role. This eliminates having to manually assign the role in the System Console.

1. Enable Guest Access via **System Console > Authentication > Guest Access (Beta)**.
2. Go to **System Console > Authentication > AD/LDAP**.
3. Complete the **Guest Filter** field.
4. Select **Save**.

If a Mattermost guest user has the ``guest`` role removed in the AD/LDAP system, the synchronization process will not automatically promote them to a member user role. This is done manually via **System Console > User Management**. If a member user has the **Guest Attribute** added, the synchronization processes will automatically demote the member user to the guest role.

When a guest logs in without having any channels assigned to their account, they're advised to contact an administrator. 

Configuring SAML 2.0 Authentication
------------------------------------

When enabled, the **Guest Attribute** in Mattermost identifies external users whose SAML assertion is guest and who are invited to join your Mattermost workspace. These users will have the ``guest`` role applied immediately upon first sign-in instead of the default member user role. This eliminates having to manually assign the role in the System Console.

If a Mattermost guest user has the guest role removed in the SAML system, the synchronization processes will not automatically promote them to a member user role. This is done manually via **System Console > User Management**. If a member user has the **Guest Attribute** added, the synchronization processes will automatically demote the member user to the guest role.

1. Enable Guest Access via **System Console > Guest Access (Beta)**.
2. Go to **System Console > Authentication > SAML 2.0**.
3. Complete the **Guest Attribute** field.
4. Select **Save**.

When a guest logs in without having any channels assigned to their account, they're advised to contact an administrator.

Guest Permission Settings
-------------------------

By default, only the System Admins can invite guests. There are `additional permissions <https://docs.mattermost.com/cloud/cloud-user-management/advanced-permissions.html>`__ that can be adjusted under **System Console > Advanced Permissions > System Scheme** to control a guest’s ability to:

- Edit posts
- Delete posts
- Post reactions
- Create private channels with members they are allowed to collaborate with

Guest Identification
---------------------

Guests are identified with a **Guest** badge. This badge is visible in various places on the interface and mobile apps such as on a guest’s profile and next to their name on user lists, including @mentions and quick switcher lists. When guests are added to a channel, a system message informs other channel members that the added user is a guest.

Channels containing guests will have their header automatically updated with a message stating: *This channel has guests*.

.. image:: ../images/Guest_Badges.png

Managing Guests
---------------

Adding Guests to Additional Channels
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Users with the permissions to invite guests can **Invite Guests** to additional channels. A system message will be posted in the channels to let other members know a guest user has been added.

Removing Guests from Channels and Teams
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Guests can be removed from a channel through **Manage members**, or by using the ``/kick`` or ``/remove`` commands.

When a guest has been removed from all channels within a team, and if they belong to other teams, they will default into the last channel on the last team they have accessed. If they are removed from all channels on all teams, they'll be taken to a screen letting them know they have no channels assigned.

Promoting and Demoting User Roles
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

System Admins can demote a member to a guest by updating their role in **System Console > User Management > Users**. Select the member, then select **Demote to Guest**. The demoted user retains their existing channel and team memberships, but will be restricted from discovering public channels and collaborating with users outside of the channels they are in. This is useful if you are already collaborating with external contractors, and want to restrict their abilities within Mattermost.

System Admins can also promote a guest to a member by updating their role in **System Console > User Management > Users**. Select the guest, then select **Promote to Member**.

**Note:** You can filter the list in **System Console >  User Management > Users** to view all guests in the system.

Disabling Guest Accounts
------------------------

To disable the Guest Accounts feature, go to **System Console > Authentication > Guest Access (Beta) > Enable Guest Access** and select ``False``. Current Guest Accounts will remain active until guest users are manually marked ``inactive`` in **System Console > User Management > Users**.

If you're using AD/LDAP and the Guest Access setting is disabled, the Guest Filter and existing guest users in System Console are deactivated. Additionally, no new guests can be invited or added using the filter as an authentication method. If a previous guest's credentials match the user filter (the only filter which is active when Guest Access is disabled), they will be reactivated and promoted to a member user upon their next login.

To disable the Guest Accounts feature, go to **System Console > Authentication > Guest Access (Beta) > Enable Guest Access** and select ``False``. Current Guest Accounts will remain active until guest users are manually marked ``inactive`` in **System Console > User Management > Users**.

Similarly, for SAML, when the Guest Access setting is disabled, the Guest Attribute and existing guest users in System Console are deactivated. Additionally, no new guests can be invited or added using the attribute as an authentication method. If a previous guest's credentials match the user attribute (the only attribute which is active when Guest Access is disabled), they will be reactivated and promoted to a member user upon their next login.

You can disable individual guest accounts in **System Console > User Management** via **Manage Members**. When a single Guest Account is disabled or the feature is disabled, the guest will be marked as ``inactive``, be logged out of Mattermost, and all their sessions will be revoked.

Reinstating Guest Accounts
--------------------------

When Guest Access is re-enabled for AD/LDAP, the Guest Filter is reinstated. 

New users matching the Guest Filter will be authenticated as new guest users on login.

Previous guest users will be activated with the next synchronization. If their credentials still match the Guest Filter, they will retain their guest status. If they no longer match the Guest Filter but do match the User Filter, they will be not be promoted to member user automatically on login - this must be done manually. If a previous guest was reactivated as a member user when Guest Access was disabled, and now are identified by the Guest Filter once again, they will automatically be demoted to Guest upon their login.

Similarly, for SAML, when Guest Access is re-enabled, the SAML Guest Attribute is reinstated. New users matching the Guest Attribute will be authenticated as new guest users on login.

Previous guest users will be activated with the next synchronization.  If their credentials still match the Guest Attribute, they will retain their guest status. If they no longer match the Guest Attribute but do match the User Filter, they will be not be promoted to member user automatically on login - this must be done manually. If a previous guest was reactivated as a member user when Guest Access was disabled, and now are identified by the Guest Attribute once again, they will automatically be demoted to Guest upon their login.

Frequently Asked Questions
---------------------------

How am I charged for Guest Accounts?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Guests are charged as a user seat.

Why doesn’t Mattermost have single-channel guests?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

We wanted to support collaboration with external guests for the broadest use cases without limiting guests' access to channels. In the future, we may consider adding single-channel guests.

Can I set an expiration date for guests?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Currently, you cannot. This feature may be added at a later stage.

Can MFA be applied selectively?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

If MFA is enforced for your users, it can be applied to Guest Accounts. Guests can configure MFA in **Account Settings > Security**. If MFA is not enforced for your users, it can't be applied to Guest Accounts.

Why is the Guest Account feature in Beta?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The Guest Account feature is in beta while we address feedback from our customers on the feature.

Has the Guest Accounts feature been reviewed by an external security firm?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The Guest Account feature was reviewed by the Mattermost security team. We do not have an external firm review scheduled but will include this feature in future reviews.

How can I validate my guests' identity?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Guests can be authenticated via SAML and/or AD/LDAP to ensure that only the named guest can sign in. Alternatively, you can whitelist domains via **System Console > Guest Access > Whitelisted Guest Domains**.

Can I restrict guests' ability to upload content?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

It is not currently possible to selectively disable upload/download functionality as it is a system-wide configuration.

source/archive/cloud-groups.rst METASEP
AD/LDAP groups
==============

|enterprise| |cloud|

.. |enterprise| image:: ../images/enterprise-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in the Mattermost Enterprise subscription plan.

.. |cloud| image:: ../images/cloud-badge.png
  :scale: 30
  :target: https://mattermost.com/download
  :alt: Available for Mattermost Cloud deployments.

Overview
---------

The groups feature is useful for organizations that have many new users to onboard or that onboard users frequently and want to ensure users are added to default teams and channels that are pertinent to them. The group feature currently supports:

- Creating groups by synchronization with your AD/LDAP system groups.
- Syncing groups to pre-defined roles in Mattermost.
- AD/LDAP nested groups.
- Using synchronized groups to manage `membership of teams and private channels <https://docs.mattermost.com/onboard/cloud-groups.html>`__.

Pre-installation notes
----------------------

If you have enabled synchronization with AD/LDAP, all groups matching the default filter ``(|(objectClass=group)(objectClass=groupOfNames)(objectClass=groupOfUniqueNames))`` will be available to be linked in the groups list view at **System Console > User Management > Groups**.

The group filter is an optional configuration setting available under **System Console > AD/LDAP** which allows you to specify the groups that should have access in Mattermost. The **Group** filter is independent of the **User** filter; however, it does leverage the Base DN attribute. You may need to adjust your Base DN to ensure group objects can be searched in your AD/LDAP tree.

The synchronization of groups happens with the synchronization of users, during which Mattermost queries AD/LDAP for updated account information. Please see the `Active Directory/LDAP Set up documentation <https://docs.mattermost.com/onboard/ad-ldap.html>`__. for more information. The group feature has no effect on users' authentication to Mattermost.

Enabling AD/LDAP group synchronization
--------------------------------------

To enable this feature, go to **System Console > Groups**.

Using AD/LDAP group synchronization
-----------------------------------

To synchronize specific AD/LDAP groups to Mattermost, specify the ``Group ID Attribute`` and the ``Group Display Name Attribute`` (e.g., "cn" for Common Name) under **System Console > Authentication > AD/LDAP**.

Additionally, you can specify the **Group** filter used to retrieve groups. If the **Group** filter configuration is left blank, then all groups matching the default filter ``(|(objectClass=group)(objectClass=groupOfNames)(objectClass=groupOfUniqueNames))`` are returned.

.. note::
   Attribute values for **Group ID** and **Group Display Name** are case-sensitive.

Group synchronization occurs after user synchronization and results for group synchronization are available on the synchonization status table (located at the bottom of the **AD/LDAP** configuration page).

After the AD/LDAP groups have been synchronized, go to **System Console > User Management > Groups** to link and configure Mattermost groups.

.. image:: ../images/Group_filter.png

.. note::
   
   The sync process does not create Mattermost groups. Mattermost groups are created when you “link” the AD/LDAP group as outlined in the next section **Linking AD/LDAP groups to Mattermost groups**. Existing AD/LDAP users are added to the Mattermost groups on the next synchronization and new users are added on their first login.

On subsequent synchronizations and once groups are linked:

- Users that have been added to an AD/LDAP group will be added to the linked Mattermost group and to teams and channels configured for that group.
- Mattermost groups that are linked to AD/LDAP groups no longer included in your filter are deleted.
- Users removed from an AD/LDAP group are removed from the linked Mattermost group, but their channel and team membership is only revoked when the channel or team is synchronized to an AD/LDAP group.

.. image:: ../images/Group_Group_Member_Sync.png

Linking AD/LDAP groups to Mattermost groups
--------------------------------------------

Groups that have been returned from the default filter or your AD/LDAP group filter will be available in a list view on the Groups page. The link action will create Mattermost groups corresponding to the AD/LDAP group. AD/LDAP groups that have been linked to a Mattermost group will display the **Linked** icon. AD/LDAP groups that have not been linked to a Mattermost group will display the **Not Linked** icon. An AD/LDAP group that is not linked does not create a Mattermost group.

.. image:: ../images/Groups_listing.png

Groups can be linked individually by the inline **Linked** button. You can also use the checkbox next the group name to select multiple groups and choosing **Link Selected Groups**. When selecting multiple groups with a mix of **Linked** and **Not Linked** states, the bulk action of the button will be **Link Selected Groups** until all selected are marked **Linked**. Using the bulk action speeds the process of creating Mattermost groups from your AD/LDAP Groups.

If you see a **Link Failed** message, either click on the message or check the box alongside the group name to expose the inline link message and try again.

.. image:: ../images/LinkFailed.png

Configuring the group
---------------------

AD/LDAP groups that have been linked to Mattermost groups can be configured to add team and channels. To configure the group, select **Configure > Group Configuration** and view the group profile which includes the group name. This name is automatically mapped from the AD/LDAP group common name attribute and is read only.

Adding default teams or channels for the group
-----------------------------------------------

To add the teams and channels that you want the group members to default in, select either **Add Team** or **Add Channel** from the **Add Team or Channel** button.

.. image:: ../images/Group_Configuration.png

Channels are nested below the team they belong to in the team and channel list.

Teams that are open for anyone to join are indicated by:

.. image:: ../images/open_team.png

Teams that are not open for anyone to join are indicated by:

.. image:: ../images/private_team.png

Public channels are indicated by:

.. image:: ../images/public_channel.png

Private channels are indicated by:

.. image:: ../images/private_channel.png

When a team is added, the ``Town Square``, ``Off-Topic`` channels will also be added as default, as well as any default channels set in the `ExperimentalDefaultChannels config setting <https://docs.mattermost.com/administration/config-settings.html?highlight=configuration%20settings#default-channels-experimental>`__.

When a channel is added without setting the team explicitly, the team will be shown in the **Team and Channel Membership** listing, but it will not be added to the group specifically. Because of this dependency, when the channel is removed, the team will also be removed. Teams are listed in parentheses after the channel name in the channel selector.

You can assign roles to group members using the options provided in the **Assigned Roles** column. Roles are updated on the next scheduled AD/LDAP synchronization. 

Synchronizing teams and channels
--------------------------------

For new users, default teams and channels will be added when they log in for the first time. For existing users, default teams and channels will be added after the next scheduled AD/LDAP sychronization.

It may take a few seconds to load all team and channel memberships for a user depending on the number of teams and channels the group is defaulted to. In our testing, it took six seconds for an organization with 200,000 users and 30,000 linked groups.

.. note::
   Users are not removed from the team or channel on subsequent synchronizations of the AD/LDAP groups. Users will need to be manually removed from the team or channel per the existing functionality. They will not be re-added if they were manually removed or removed themselves. To manage a team or private channel membership with synchronized groups, please see `this documentation <https://docs.mattermost.com/onboard/cloud-groups.html>`_.

.. image:: ../images/Team_Channel_Membership_Sync.png

Removing configured teams and channels from a group
---------------------------------------------------

To remove a team or channel configured for a group, select **Remove** to the right of the team or channel name. Users already part of the team and channel will not be removed from that channel by this action.

Viewing users belonging to the group
------------------------------------

Users who have logged in and accessed Mattermost will be visible in the members list on the group object. Members are read-only at this time and new members can be added through management in your AD/LDAP system.

.. image:: ../images/Group_Members.png

Users can be removed from the Mattermost group on subsequent synchronizations. However, they will not be removed from teams and channels unless the team or channel is group-synced.

.. note::
   When a member removes themselves manually from a channel, that action is tracked in the **Channel Member History** table. If a System Admin manually forces all members in a specific LDAP group to join the teams and channels synchronized to that group, members can potentially be re-added to channels from which they were previously removed.

Disabling and reactivating AD/LDAP users
-----------------------------------------

If a member is removed from an AD/LDAP group, deactivated in AD/LDAP, or filtered from the AD/LDAP user filter, that member loses access to Mattermost.

If that member is later re-added, reactivated, or included in the user filter, they aren't automatically re-added to Mattermost groups. A System Admin must re-add that member manually to Mattermost teams and channels.

Using the Mattermost API, System Admins can manually re-add all group members back into synchronized teams or channels by forcing members in an LDAP group to join the teams and channels synchronized to that group, even if members left on their own, were removed, were filtered out, or were deactivated. See our `Mattermost API documentation <https://api.mattermost.com/#operation/SyncLdap>`__ for details on synchronizing user attribute changes in the configured AD/LDAP server with Mattermost.

Managing groups
---------------

Once a group has been configured, the default teams and channels can be changed via the **Edit** option on the group list view.

Deleting groups
---------------

Mattermost groups can be deleted by adjusting your AD/LDAP group filter to remove the group or by unlinking the group on the groups listing page. If you add the group back by re-adjusting the AD/LDAP group filter and link the group again on the group configuration page, the previous team and channel configurations will be available.

Using AD/LDAP synchronized groups to manage team or private channel membership
-------------------------------------------------------------------------------

Mattermost groups created with `synchronized AD/LDAP groups <https://docs.mattermost.com/onboard/ad-ldap.html>`_ can be used to manage the membership of private teams and private channels. When a team or private channel is managed by synchronized groups, users will be added and removed based on their membership to the synchronized AD/LDAP group.

For instance, you may have a AD/LDAP group that contains your development team that you want to synchronize to a developer team. By using this feature, new developers will get added to the team when they are added to the synchronized AD/LDAP group and they will be removed from the team when removed from the AD/LDAP group.

Similarly, you may have a AD/LDAP group that contains your leadership team that you want to synchronize to a private channel for coordination and updates. This feature will help control the membership of the channel so that users outside of the synchronized group are prevented from being added to the channel mistakenly.

On teams that are managed by synchronized groups, users outside of the group are restricted from:

- Invitation through a team invite link
- Invitation through an email invite

Similarly on private channels that are managed by synchronized groups, users outside of the group are restricted from:

- Invitation through a mention
- Invitation through the ``/invite`` slash command
- Being added to the channel with “add members”

Users can remove themselves from teams and private channels managed by synchronized groups.

Managing membership of a team or channel with synchronized groups
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

To manage membership of a private team with synchronized groups:

1. Go to **System Console > User Management > Teams**.
2. Select the team you want to manage with group synchronization.
3. Under **Team Management**, enable **Sync Group Members**. If **Anyone can join this team** is enabled, or if specific email domains are set, they will be disabled by the Sync Group Members feature.
4. Add one or more groups to the team. If there are existing groups associated with default users in the team, they will already be present.
5. Review the notice in the footer of the screen for any users that are not part of groups who will be removed from the team on the next synchronization.
6. Select **Save**. Members will be updated on the next scheduled AD/LDAP synchronization.

To manage membership of a private channel with synchronized groups:

1. Go to **System Console > User Management > Channels**.
2. Select the channel you want to manage with group synchronization.
3. Under **Channel Management**, enable **Sync Group Members**. Please ensure the channel is set to ``private``.
4. Add one or more groups to the channel. If there are existing groups associated with default users in the channel, they will already be present.
5. Review the notice in the footer of the screen for any users that are not part of groups, and who will be removed from the channel on the next synchronization.
6. Select **Save**. Members will be updated on the next scheduled AD/LDAP synchronization.

Assigning roles to group members
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Group members can be assigned predefined roles by System Admins, which are applied across the group during the scheduled sychronization. The roles are:

- Member (default)
- Team Admin (in teams)
- Channel Admin (in channels)

The permissions for each role can be viewed and modified in **System Console > Permissions**.

**To set the Team Admin role in a synced group**

1. Go to **System Console > User Management > Teams**.
2. Select **Edit** next to the team you want to configure.
3. Ensure that **Sync Group Members** is enabled.
4. Select **Add Group** to add one or more groups to the team. If there are groups already associated to default users into the team, they will already be present.
5. Select the arrow next to the current role in the **Roles** column to display and select the **Team Admin** option.
6. Repeat as needed for any other synced groups you have added.
7. Select **Save**.

Roles are updated on the next scheduled AD/LDAP synchronization.

**To set the Channel Admin role in a synced group**

1. Go to **System Console > User Management > Channels**.
2. Select **Edit** next to the team you want to configure.
3. Ensure that **Sync Group Members** is enabled.
4. Select **Add Group** to add one or more groups to the team. If there are groups already associated to default users into the team, they will already be present.
5. Select the arrow next to the current role in the **Roles** column to display and select the **Channel Admin** option.
6. Repeat as needed for any other synced groups you have added.
7. Select **Save**.

Roles are updated on the next scheduled AD/LDAP synchronization.

.. note::
  Members who have been synced as part of a group cannot have their role changed via **View Members** in Mattermost.

Adding or removing groups from teams
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Once teams are managed by synchronized groups, a Team or System Admin can add additional groups from **Main Menu > Add Groups to Team**. This will add users on the next AD/LDAP synchronization, and any new users to the group will be added to the team on subsequent synchronizations. Team Admins can be prevented from changing the team to public by enabling **Team Settings > Allow any user with an account on this server to join this team**.

Team or System Admins can also remove groups from a team from **Main Menu > Manage Groups**. This will disassociate the group from the team. Users are removed on the next AD/LDAP synchronization.

The System Admin can also remove groups from  **System Console > User Management > Teams > Team Configuration > Synced Groups**.

Adding or removing groups from private channels
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Once channels are managed by synchronized groups, a Team or System Admin can add additional groups from **Channel Menu > Add Groups to Channel**. This will add users on the next AD/LDAP synchronization and any new users to the group will be added to the channel on subsequent synchronizations.

Team or System Admins can also remove groups from a team from **Main Menu > Manage Groups**. This will disassociate the group from the team. Users are removed on the next AD/LDAP synchronization.

The System Admin can also remove groups from **System Console > User Management > Channels > Channel Configuration > Synced Groups**.

Managing members
^^^^^^^^^^^^^^^^^

Users are automatically removed from the team or private channel when removed from a synchronized AD/LDAP group that is managing the membership of that team or channel.  Additionally, users who are not in the synchronized groups are prevented from being added through the ``/invite`` and mention flows within a channel.

A user can remove themselves from the team or from the private channel when it is managed by synchronized groups.  They can be added back by users who have permission to manage members for a team or private channel by using the ``/invite`` slash command or by mentioning the user in a channel.

If the user is removed from a synchronized group and later re-added to the group, they can be manually added back to the team or Private channel as noted above.

.. note:: 
  Users will not be automatically added back by the AD/LDAP synchronization once they remove themselves or are removed by the LDAP synchronized group.

Disabling group synchronized management of teams and private channels
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

To remove the management of members by synchronized groups in a team, disable **Sync Group Members** under **System Console > User Management > Teams > Team Management**.

To remove the management of members by synchronized groups in a channel, disable **Sync Group Members** under **System Console > User Management > Channels > Channel Management**.

Frequently Asked Questions
--------------------------

Why do my LDAP users and groups exist in Mattermost, but my groups have no members?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

In order for Mattermost to detect group membership correctly, and to automatically add users to the group configured in the **System Console**, you must use one of the following AD/LDAP attributes to represent group members in Mattermost: ``member`` or ``uniqueMember``. These attributes use a ``Distinguished Name`` as the value on groups.

.. note::

  LDAP installations that use ``memberUid`` to indicate group membership are not supported because ``memberUid`` is an attribute of an object class ``posixGroup`` that does not use ``Distinguished Names`` as the value on groups.

Why can't my existing users see the teams and channels they've been synced to?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Existing Mattermost users that are members of linked Mattermost groups will be added to teams and channels on the next scheduled synchronization job that is run after teams and channels are added to the Mattermost group. You can manually initiate a synchronization from **System Console > Authentication > AD/LDAP > AD/LDAP Synchronize Now**.

How do nested groups work with AD/LDAP group sync?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Users within nested groups are included as members of parent groups. The group filter that you specify can include any type of AD/LDAP group on your system. The ``member`` AD/LDAP attribute is used to determine nested groups that belong to a parent group.

How do I manage a team or private channel membership with synchronized groups?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

You can do so by setting the team or channel management to synced groups instead defaulting a group to a team or channel. See `this documentation <https://docs.mattermost.com/deployment/ldap-group-constrained-team-channel.html>`__ to learn more.

How do I use AD/LDAP group sync with SAML?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

You can use AD/LDAP group sync with SAML by enabling `SAML Synchronization with AD/LDAP <https://docs.mattermost.com/onboard/sso-saml-okta.html#configure-saml-synchronization-with-ad-ldap>`__. You do not need to enable LDAP sign-in for this feature to work.

However, it's critical that the unique Mattermost ID identifier that you've chosen as your attribute in your directory service (AD/LDAP) is the same for both the SAML and AD/LDAP configurations.

For instance, if ``ObjectGUID`` has been chosen as the Mattermost ID in your AD/LDAP configuration, then an attribute that has the same value should also be mapped to the ID attribute in your SAML assertion. We also recommend that the ID attribute you select is unique and unchanging (such as a ``GUID``).

Why aren’t public channels supported with synchronized groups?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Public channels are available to all members to discover and join. Managing membership with synchronized groups removes the ability for Public channels to be accessible to users on the team. Private channels typically require a more controlled membership management, which is why this feature applies to Private channels. Groups can be assigned to public teams and Public channels as described in `this documentation <https://docs.mattermost.com/onboard/ad-ldap-groups-synchronization.html#adding-default-teams-or-channels-for-the-group>`__.

Does a team with its membership managed by groups have any effect on public channel access?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Only users that are members of groups synchronized to team are able to discover and join public channels. Private channels can also be managed by synchronized groups when a team is managed by synchronized groups.

Why don't users get readded to teams or channels once they have been removed from and then later re-added to the LDAP group?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The implementation of group removals does not currently differentiate between users who have removed themselves or have been removed by the LDAP synchronization process. Our design optimizes for users who have removed themselves from a team or channel. In the future, we may add the ability for Admins to re-add users who have been removed, and even prevent users from leaving, a team or channel.

Additionally, LDAP users who are not accessible to Mattermost based on filters will be removed from the groups and from group synced teams and channels. If they were removed from teams and channels then they will not be re-added to those teams and channels upon becoming subsequently reaccessible to Mattermost.

Why aren’t public channels supported with AD/LDAP synchronized groups?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Public channels are available to all members to discover and join. Managing membership with synchronized groups removes the ability for public channels to be accessible to users on the team. Private channels typically require a more controlled membership management, which is why this feature applies to private channels. Groups can be assigned to public teams and Public channels as described in `this documentation <https://docs.mattermost.com/onboard/ad-ldap-groups-synchronization.html#adding-default-teams-or-channels-for-the-group>`__.

Does a team with its membership managed by groups have any effect on public channel access?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Only users that are members of groups synchronized to a team are able to discover and join public channels. Private channels can also be managed by synchronized groups when a team is managed by synchronized groups.

Why aren't users readded to teams or channels after being removed from, then later re-added to, the LDAP group?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The implementation of group removals does not currently differentiate between users who have removed themselves or have been removed by the LDAP synchronization process. Our design optimizes for users who have removed themselves from a team or channel. In the future, we may add the ability for admins to re-add users who have been removed, and even prevent users from leaving a team or channel.

Additionally, LDAP users who are not accessible to Mattermost based on filters will be removed from the groups and from group-synced teams and channels. If they were removed from teams and channels then they will not be re-added to those teams and channels upon becoming subsequently re-accessible to Mattermost.

source/archive/cloud-embedding.rst METASEP
:nosearch:

Embedding Mattermost in other applications
==========================================

This guide discusses how to embed Mattermost into other applications.

Launching Mattermost from a button click
-----------------------------------------

The most common way of integrating Mattermost into another application is via a link or a button that brings up Mattermost in a new browser window or tab, with a link to a specific Mattermost channel to begin discussion.

Optionally, single-sign-on can be added to make the experience seamless.

Mattermost launch button example in HTML 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Save the below HTML code in a file called ``mattermost-button-example.html`` then open the file in a browser as an example.

.. code-block:: html

  <script>
      var myWindow = null;

      function openMMWindow() {
          myWindow = window.open("https://community.mattermost.com/core/channels/developer", "Mattermost", "top=0,left=0,width=400,height=600,status=no,toolbar=no,location=no,menubar=no,titlebar=no");
      }

      function closeMMWindow() {
          if (myWindow) {
              myWindow.close();
          }
      }
  </script>

  <html>
      <br/>
      <br/>
      <button onclick="openMMWindow()">Open Developer Channel</button>
      <br/>
      <br/>
      <button onclick="closeMMWindow()">Close Developer Channel</button>
      <br/>
      <br/>
  </html>

Embedding Mattermost in web applications using an iframe
----------------------------------------------------------

Any web application embedded into another using an iframe is at risk of security exploits, since the outer application intercepts all user input into the embedded application, an exploit known as `Click-Jacking <https://en.wikipedia.org/wiki/Clickjacking>`__. By default, Mattermost disables embedding. If you choose to embed Mattermost we highly recommend it is done only on a private network that you control.

See `this recipe <https://forum.mattermost.com/t/recipe-embedding-mattermost-in-web-applications-using-an-iframe-unsupported-recipe/10233>`__ for details.

source/archive/cloud-data-retention-policy.rst METASEP
:nosearch:

Data retention policy
=====================

|enterprise| |cloud|

.. |enterprise| image:: ../images/enterprise-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in the Mattermost Enterprise subscription plan.

.. |cloud| image:: ../images/cloud-badge.png
  :scale: 30
  :target: https://mattermost.com/deploy
  :alt: Available for Mattermost Cloud deployments.

By default, Mattermost stores all message history providing an unlimited search history to admins and end users.

With a data retention policy, you can set a custom policy to manage how long messages and file uploads are kept in Mattermost channels and direct messages.

.. warning:: Once a message or a file is deleted, the action is irreversible. Please be careful when setting up a custom data retention policy.

.. toctree::
    :maxdepth: 2

Configuring a data retention policy
-----------------------------------

To set a custom data retention policy:

1. Go to **System Console > Compliance > Data Retention Policy**.
2. Select a **Message Retention** option. When a time is specified, messages, including file attachments, older than the duration you set will be deleted at the specified time. The minimum retention period is one day.
3. Select a **File Retention** option. When a time is specified uploaded files which are older than the duration you set will be deleted will be deleted at the specified time. The minimum retention period is one day.
4. Set the start time of the daily scheduled data retention job. Choose a time when fewer people are using your system. Must be a 24-hour time stamp in the form HH:MM.

Save the settings. Messages and files older than the duration you set will be deleted at the specified server time, if applicable.

You can also run the deletion job manually at any time by selecting **Run Deletion Job Now** in **System Console > Compliance > Data Retention Policy**.

Frequently Asked Questions (FAQs)
---------------------------------

What happens when a message is deleted?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The message is removed from the Mattermost user interface and permanently deleted from the database. The message is no longer searchable and cannot be retrieved in pinned posts or saved posts lists.

Replies that did not exceed the message duration are still displayed in the user interface. However, further replies are no longer possible.

What happens when a file is deleted?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The file attachment is removed from the Mattermost user interface and permanently deleted.

Why didn't an old file get deleted after running the deletion job?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

First, check the data deletion was successful in the deletion job table in **System Console > Compliance > Data Retention Policy**.

Why do I see ``Pending`` in the deletion job table with no details?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This usually means another data retention job is in progress. You can verify this in the deletion job table in  **System Console > Compliance > Data Retention Policy**.

If no jobs are in progress and the job has stayed ``Pending`` for more than an hour, please contact support

How do I set a custom policy per team or channel?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Setting custom policies for each team and channel are in the roadmap but not yet supported.

If you are interested in this feature, consider upvoting the `existing feature proposal <https://mattermost.uservoice.com/forums/306457-general/suggestions/31731844-ee-data-retention-policy-for-individual-teams-and>`__ and share your feedback in the comments.

How is data retention handled in the mobile apps?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

When messages or files are deleted, they are no longer searchable in the Mattermost mobile apps.

How do I know if a data retention job fails?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost provides the status of each data retention job in **System Console** > **Compliance** > **Data Retention Policy**. Here, you can see if the job succeeded or failed, including the details of the error.

What happens when the data retention period is changed?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Data retention runs once a day at the time specified in the settings. Changing the retention period does not automatically schedule any additional run of the data retention job - it only updates how long data is kept in Mattermost.

Does the System Administrator get any notification when the data retention period is changed?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

No, the setting is updated, but the System Admin does not receive any feedback on what the effects will be (e.g. reporting of how many messages are to be deleted).

Does the data retention job include archived channels? 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Posts and attachments in archived channels are affected by the data retention job. If a post exceeds the age configured for the data retention job it will be deleted from the database.

How long does it take to run a deletion query and does it affect server performance?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Data retention runs the actual deletion query in batches, deleting data in blocks of 1,000 records per query. This is so the database won’t be locked up for extended periods of time with long-running queries. Keeping to this limit keeps the query down to a few milliseconds' execution time on the database itself.

Each batch of data is deleted based on indexes - making the queries quick to execute on small batches. This helps the server remain fully responsive while the process is running.

source/archive/cloud-custom-terms-of-service.rst METASEP
:nosearch:

Custom Terms of Service (Beta)
==============================

You can outline custom Terms of Service for your team members to accept before they can access Mattermost on web, desktop, or mobile.

Configuring Terms of Service
----------------------------

To enable custom terms of service:

1. Go to **System Console > Compliance > Custom Terms of Service**.
2. Set **Enable Custom Terms of Service** to **true**.
3. Set **Custom Terms of Service Text** which contains your terms. Note that Markdown-formatting, including lists, headings and bolding, is supported.
4. Set **Re-Acceptance Period**, which sets the number of days before Terms of Service acceptance expires, and the terms must be re-accepted. Set to 0 if you don't want your terms to expire.
5. Select **Save**.

Once saved, all users must accept the terms of service by selecting **I Agree** next time they log in, or on the next page refresh. If they do not accept, they will be logged out.

.. note::

 If you make an update to your Terms of Service, make sure to update your terms of service link at **System Console > Site Configuration > Customization**.
 
 This link is presented to all users on each log in, and is easily accessible to end users after accepting the terms.

Frequently Asked Questions
----------------------------

What happens if I update my terms of service text?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

There will be no impact to your end users. Users will simply be required to accept the new terms on next login or page refresh.

What happens if a user does not accept the terms of service?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

A user will not be able to log in if they do not accept the terms of service. 

Why are custom terms of service beta?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This feature is labeled as beta while we verify the quality of the feature in various scenarios. Known issues include:

- Login fails when custom terms of service is enabled and MFA is enforced.
- Terms of service text disappears in the System Console on save until next refresh.
- Terms of service loads immediately following an update to terms, instead of after login or a page refresh.

source/archive/cloud-converting-oauth-2.0-to-openid-connect.rst METASEP
:nosearch:

Converting OAuth 2.0 to OpenID Connect
=======================================

.. include:: common-converting-oauth-to-openidconnect.rst
    :start-after: :nosearch:

Configuring OpenID Connect Single Sign-On
-----------------------------------------

For details on configuring Mattermost to use a service provider as a Single Sign-on (SSO) service for team creation, account creation, and user sign-in OpenID Connect, refer to the following documentation:

- `OpenID Connect Single Sign-On <https://docs.mattermost.com/cloud/cloud-administration/sso-openid-connect.html>`_
- `GitLab Single Sign-On <https://docs.mattermost.com/cloud/cloud-administration/sso-gitlab.html>`__
- `Google Apps Single Sign-On <https://docs.mattermost.com/cloud/cloud-administration/sso-google.html>`__
- `Office 365 Single Sign-On <https://docs.mattermost.com/cloud/cloud-administration/sso-office.html>`__

source/archive/cloud-compliance-export.rst METASEP
:nosearch:

Compliance Export Beta
======================

This feature enables compliance exports to be produced from the System Console, containing all messages including:

- Those made in direct message channels
- File uploads
- Posts from plugins
- Posts from bots/webhooks

The exports include information on channel member history at the time the message was posted.

Entries for deleted messages and files are included in CSV and Actiance reports. The deleted content is included in the compliance export. Global Relay reports include file deletion entries but message deletion entries are excluded.

By default, Mattermost stores all message history providing an unlimited search history to admins and end users. You may set a `custom data retention policy <https://docs.mattermost.com/comply/data-retention-policy.html>`__ for how long messages and file uploads are kept in Mattermost channels and direct messages.

Enterprise deployments with a requirement to archive history beyond the data retention period can enable this add-on to export compliance reports to third-party systems. Integration with Actiance Vantage and Global Relay are currently supported, with integrations with other systems in the roadmap.

.. toctree::
    :maxdepth: 2

Set Up Guide
------------

Use the following guides to configure exports for CSV, Actiance XML, or Global Relay EML. 

.. note::
  The compliance exports do not contain posts sent before the feature was enabled.

CSV
~~~

1. Go to **System Console > Compliance > Compliance Export (Beta)**.
2. Set **Enable Compliance Exports** to **true**.
3. Set the **Compliance Export time**. This is the start time of the daily scheduled compliance export job and must be a 24-hour time stamp in the form HH:MM. Choose a time when fewer people are using your system.
4. Set the export file format to **CSV**.
5. Choose **Save**.

The daily compliance export job creates a zip file with a unique job identifier of all messages posted in the last 24 hours. You can unzip the file to easily transform the default CSV format into a desired format for your third-party archive system.

For a sample CSV output, `download a CSV export file here <https://github.com/mattermost/docs/blob/master/source/samples/csv_export.zip>`__.

Actiance XML
~~~~~~~~~~~~

1. Go to **System Console > Compliance > Compliance Export (Beta)**.
2. Set **Enable Compliance Exports** to **true**.
3. Set the **Compliance Export time**. This is the start time of the daily scheduled compliance export job and must be a 24-hour time stamp in the form HH:MM. Choose a time when fewer people are using your system.
4. Set the export file format to **Actiance XML**.
5. Choose **Save**.

The daily compliance export job creates a zip file with a unique job identifier of all messages posted in the last 24 hours. Once you’ve selected Actiance XML as your file format, you can set up an integration with the Actiance Vantage archive system. For more information, see `their homepage <https://www.actianceworks.com/Vantage.asp>`__. 

For a sample Actiance output, `download an Actiance XML export file here <https://github.com/mattermost/docs/blob/master/source/samples/actiance_export.xml>`__.

.. note::
  In Actiance XML exports, channel type is prepended to the channel names.

Global Relay EML
~~~~~~~~~~~~~~~~

1. Go to **System Console > Compliance > Compliance Export (Beta)**.
2. Set **Enable Compliance Exports** to **true**.
3. Set the **Compliance Export time**. This is the start time of the daily scheduled compliance export job and must be a 24-hour time stamp in the form HH:MM. Choose a time when fewer people are using your system.
4. Set the export file format to **GlobalRelay EML**.
5. Select `A9/Type 9` or `A10/Type 10` for the **Global Relay Customer Account**. This is the type of Global Relay customer account your organization has.
6. Set the **Global Relay SMTP username**, **Global Relay SMTP password**, and **Global Relay SMTP email address**, as provided by Global Relay.
7. Choose **Save**.

Once you have selected Global Relay EML as your file format, you can set up an integration with Global Relay archive system. For more information, see `Global Relay Archive <https://www.globalrelay.com/gr-services/archive>`__.

.. note::
  Messages larger than 250 MB will have their attachments removed because they are too large to send to Global Relay. An error is added to the server logs with id ``global_relay_attachments_removed``. It includes the post ID the attachments were removed from, as well as the attachment IDs. A `ticket is queued to better handle large messages <https://mattermost.atlassian.net/browse/MM-10038>`__.

For more information on Global Relay archive system, see `their homepage <https://www.globalrelay.com/>`__.

Frequently Asked Questions (FAQ)
---------------------------------

How do I export past history?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Run the ``export`` :doc:`command line tool <../manage/command-line-tools>`. You can specify an `exportFrom` option to export data from a specified timestamp. All posts that were made after this timestamp will be exported.

What happens if I export data manually?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

If the compliance export job is run automatically, manually via the System Console, it exports all posts that were made since the last post that the previous execution of the job exported. If this is the first time that the job has ever run, all posts that were made since the feature was enabled will be exported.

When run manually via the System Console, CSV and Actiance XML files are written to the `exports` subdirectory of the configured `Local Storage Directory <https://docs.mattermost.com/configure/configuration-settings.html#local-storage-directory>`__. Files will be written to a folder with names based on an epoch time range. Global Relay EML export format will be mailed to the configured email address when run manually.

Is there a maximum row limit for CSV files?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

No. There's no limit to the number of rows within Compliance Monitoring CSV files.

Why are compliance exports beta?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This feature is labeled as beta for the following reasons:

1. The job to carry out a compliance export has not been tested on a system with 10,000s of concurrent active users.
2. Exports do not yet include messages with special types, namely system messages, webhook message attachments, and custom plugin messages.
3. There isn't yet a way to distinguish who edited or deleted a message, nor which message is a reply or an edit of another message.
4. The QA process is still in progress.

How do I know if a compliance export job fails?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost provides the status of each compliance export job in **System Console > Compliance > Compliance Export (Beta)**. Here, you can see if the job succeeded or failed, including the number of messages and files exported.

source/archive/cloud-compliance-and-oversight.rst METASEP
:nosearch:

Compliance reporting and oversight
==================================

.. This page is intentionally NOT accessible from the LHS.

|cloud|

.. |cloud| image:: ../images/cloud-badge.png
  :scale: 30
  :target: https://mattermost.com/deploy
  :alt: Available for Mattermost Cloud deployments.

.. important::
   
   This feature has been replaced by a new :doc:`Compliance Export feature <compliance-export>`, and has been removed from Mattermost Cloud. We recommend migrating to the new system. For a sample CSV output of the new compliance export system, `download a CSV export file here <https://github.com/mattermost/docs/blob/master/source/samples/csv_export.zip>`__.

This feature enables compliance exports to be produced from the System Console, with all query and download actions logged in an audit history to enable oversight and prevent unauthorized queries.

Compliance exports can be filtered to date range, user account, and keyword list. Requests from queries can be downloaded from the user interface in ``.csv`` format, with a ``.json`` metafile documenting the query, as well as placed in a directory set by the System Admin.

Daily compliance reports may also be generated, supporting integration with compliance solutions like `Global Relay <#global-relay-support>`__.

By default, all Mattermost Editions retain all messages, including edits and deletes, along with all files uploaded.

.. important::

   This feature has bee replaced by a new :doc:`Compliance Export feature <compliance-export>`, and has been removed. We recommend migrating to the new system. For a sample CSV output of the new compliance export system, `download a CSV export file here <https://github.com/mattermost/docs/blob/master/source/samples/csv_export.zip>`__.
   
Enabling compliance reporting
-----------------------------

1. Go to **System Console > Compliance > Compliance Monitoring** and set the **Enable Compliance Reporting** value to **true**.
2. (Optional) In **Compliance Report Directory** specify the directory in which to place completed compliance reports. Defaults to ``./data/`` if left blank.
3. Select **Save**.

This will enable the option to generate Daily Compliance Reports.

Turn on daily compliance reports
--------------------------------

After enabling compliance reporting:

Go to **System Console > Compliance > Compliance Monitoring**, set the **Enable Daily Report** value to **true** and select **Save**.

Your system will now export all new messages posted within a 24-hour period as a ``.csv`` file to the location specified in **Compliance Report Directory**. This feature can be used in conjunction with centralized compliance reporting systems that move.

Run compliance reports
----------------------

Compliance Reports are exports of all messages in Mattermost that match the report criteria. To run a report:

1. Go to **System Console > Compliance > Compliance Monitoring**.
2. Fill in the following criteria:

     - **Job Name:** Name the compliance report you are about to run (e.g. "HR Audit 455").
     - **From:** Start Date for search in YYYY-MM-DD format (e.g. "2016-03-11").
     - **To:** End Date of search in YYYY-MM-DD format (e.g. "2016-05-11").
     - **Emails:** Comma-separated list of email addresses of users whose posted messages you want to search (e.g. ``bill@example.com, bob@example.com``).
     - **Keywords:** Indicate the words that would be contained in a message for it to be included in the Compliance Report results.
3. Select **Run Compliance Report**.

The report will be queued in the display below the fields described above. The properties of each compliance report run is explained as follows:

- **Timestamp:** Time at which the report was requested.
- **Status:** ``running`` indicates the report is being run; ``finished`` indicates the report is complete and ready for download.
- **Records:** Shows the number of search results.
- **Type:** ``adhoc`` indicates the report was requested by completing query fields; ``daily`` indicates the report is a daily export.
- **Description:** Job Name indicated in request.
- **Requested by:** Email of person requesting the report.
- **Params:** Parameters of the compliance report request.

Each compliance report includes a **Download** link which downloads a compressed file named ``adhoc-[UNIQUE_ID].zip``. Inside the file is ``meta.json``, which includes the parameters of the search executed and ``posts.csv`` which includes the contents of messages found by the request.

Compliance query definition stored in ``meta.json`` file
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

``meta.json`` contains the following information about the compliance query:

+---------------------+---------------------------------------------------------------+-----------------------------------+
| Field               | Description                                                   | Example                           |
+=====================+===============================================================+===================================+
| id                  | Unique identifier for compliance query                        | ja8z8egap7nq9kqetz3rt98khe        |
+---------------------+---------------------------------------------------------------+-----------------------------------+
| create_at           | Timestamp at which compliance query was executed              | 1463637842478                     |
+---------------------+---------------------------------------------------------------+-----------------------------------+
| user_id             | Mattermost User ID for person creating query                  | 3bq1shta93yztg3i6aiu1tzi5h        |
+---------------------+---------------------------------------------------------------+-----------------------------------+
| status              | Status of query: *finished* or *failed*                       | "finished"                        |
+---------------------+---------------------------------------------------------------+-----------------------------------+
| count               | Count of messages found matching keyword                      | 36                                |
+---------------------+---------------------------------------------------------------+-----------------------------------+
| desc                | User entered description of compliance query                  | Example Compliance Report         | 
+---------------------+---------------------------------------------------------------+-----------------------------------+
| type                | Type of compliance query: *adhoc* or *daily*                  | "adhoc"                           | 
+---------------------+---------------------------------------------------------------+-----------------------------------+
| start_at            | Timestamp at which query began to run                         | 1451606400000                     | 
+---------------------+---------------------------------------------------------------+-----------------------------------+
| end_at              | Timestamp at which query ended                                | 1463529600000                     | 
+---------------------+---------------------------------------------------------------+-----------------------------------+
| keywords            | Comma-separated, case insensitive keywords to match in query  | "drinking"                        | 
+---------------------+---------------------------------------------------------------+-----------------------------------+
| emails              | Comma-separated emails of users to search. Blank returns all  | ``frank.yu@ha.ca, mary.li@hi.co`` |  
+---------------------+---------------------------------------------------------------+-----------------------------------+

Compliance query results stored in ``posts.csv`` file
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

``posts.csv`` contains the following information about the compliance query results, one search result per row:

+---------------------+---------------------------------------------------------------+-------------------------------+
| Field               | Description                                                   | Example                       |
+=====================+===============================================================+===============================+
| TeamName            | URL name of team                                              | contosi                       |
+---------------------+---------------------------------------------------------------+-------------------------------+
| TeamDisplayName     | Display name of team                                          | Contosi Corporation           | 
+---------------------+---------------------------------------------------------------+-------------------------------+
| ChannelDisplayName  | Display name of channel where keyword was found               | Community Heartbeat           | 
+---------------------+---------------------------------------------------------------+-------------------------------+
| ChannelName         | URL name of channel                                           | community-heartbeat           | 
+---------------------+---------------------------------------------------------------+-------------------------------+
| UserUsername        | Username of user posting the message containing keyword       | frank.yu                      |
+---------------------+---------------------------------------------------------------+-------------------------------+
| UserEmail           | Email of user posting the message containing keyword          | "frank.yu@contosi.com"        | 
+---------------------+---------------------------------------------------------------+-------------------------------+
| UserNickname        | Nickname of user posting the message containing keyword       | fan du                        | 
+---------------------+---------------------------------------------------------------+-------------------------------+
| PostId              | Unique ID of message post containing keyword                  | xt9anyx6x3fx9y84aehgakdpze    | 
+---------------------+---------------------------------------------------------------+-------------------------------+
| PostCreateAt        | Timestamp at which post was created                           | 2016-03-02T16:01:59Z          | 
+---------------------+---------------------------------------------------------------+-------------------------------+
| PostDeletedAt       | Timestamp at which post was deleted (if applicable)           | 2016-03-02T16:01:59Z          | 
+---------------------+---------------------------------------------------------------+-------------------------------+
| PostUpdatedAt       | Timestamp at which post was last edited (if applicable)       | 2016-03-02T16:01:59Z          | 
+---------------------+---------------------------------------------------------------+-------------------------------+
| PostParentId        | Unique ID of parent post if post is a comment                 | xt9anyx6x3fx9y84aehgakdpze    | 
+---------------------+---------------------------------------------------------------+-------------------------------+
| PostOriginalId      | Unique ID of post if deleted or edited                        | xt9anyx6x3fx9y84aehgakdpze    | 
+---------------------+---------------------------------------------------------------+-------------------------------+
| PostMessage         | Message containing keyword                                    | Drinking from the fire hose   | 
+---------------------+---------------------------------------------------------------+-------------------------------+
| PostFilenames       | Comma separated list of filesnames attached to post           | ["/f../ho.png","/f../hi.png"] |
+---------------------+---------------------------------------------------------------+-------------------------------+

Global Relay support
--------------------

Mattermost daily compliance reports are compatible with Global Relay compliance solutions through the conversion of Mattermost ``.CSV`` exports into Global Relay ``EML`` files.

- This conversion can be done by in-house developers who have previously written scripts to convert other communication systems into Global Relay format based on your organization's specific needs.
- You can also contact your Global Relay account manager about a services project to establish this conversion.

We recommend using the new `Compliance Export feature <https://docs.mattermost.com/cloud/cloud-administration/compliance-export.html>`_ for Global Relay exports.

source/archive/cloud-bot-accounts.rst METASEP
:nosearch:

Bot accounts
=============

Use bot accounts to integrate with Mattermost through `plugins <https://developers.mattermost.com/extend/plugins/>`_ or the `Mattermost RESTful API <https://api.mattermost.com>`_. Bot accounts access the RESTful API on behalf of a bot through the use of the `personal access tokens feature <https://developers.mattermost.com/integrate/admin-guide/admin-personal-access-token/>`_.

Bot accounts are just like user accounts, except they:

  - Cannot be logged into.
  - Cannot be used to create other bot accounts.
  - Do not count as a registered user and therefore do not count towards your subscription.

Additional benefits include:

  - Bot accounts can be enabled to post to any channel in the system by System Administrators, including private teams, Private Channels, or Direct Messages.
  - Integrations created by a user and tied to a bot account no longer break if the user leaves the company.
  - Once created, bot accounts behave just like regular user accounts and can be added to teams and channels similar to users.
  - Bot accounts are a safe way to integrate with Mattermost through the RESTful API and Plugin API because there is no need to manage shared logins with these accounts.
  - A ``BOT`` tag is used everywhere in the user interface where bot accounts are referenced, including Direct Messages and user lists.

Note that currently:

  - Bot accounts can only be created or managed by plugins or System Administrators.
  - Bot accounts cannot be assigned to webhooks or slash commands. These must still be created by a user account.
  - Service accounts without an email address pulled from LDAP or SAML systems are not yet supported.

If you would like to see improvements to bot accounts, `let us know in the Feature Proposal Forum <https://mattermost.uservoice.com/forums/306457-general>`_.

.. contents::
  :backlinks: top
  :depth: 1
  :local:

Configuration settings
----------------------

By default, plugins can create and manage bot accounts. To enable bot account creation through the user interface or the RESTful API:

1. Go to **System Console > Integrations > Bot Accounts**.
2. Set **Enable Bot Account Creation** to **true**.

Once set, System Administrators can create bot accounts for integrations using the **Integrations > Bot Accounts** link in the description provided.

Bot account creation
--------------------

Below are different ways to create bot accounts. After the bot account is created, make sure to:

1. Copy the generated bot access token for your integration.
2. Add the bot account to teams and channels you want it to interact in.

User interface (UI)
~~~~~~~~~~~~~~~~~~~

1. Go to **Main Menu > Integrations > Bot Accounts**.
2. Select **Add Bot Account**.
3. Set the **Username** of the bot. The username must begin with a letter, and contain between 3 and 22 lowercase characters made up of numbers, letters, and the symbols ".", "-", and "_".
4. (Optional) Upload an image for the **Bot Icon**. This will be used as the profile image of the bot throughout the Mattermost user interface.
5. (Optional) Set a **Display Name** and **Description**.
6. (Optional) Choose what role the bot should have. Defaults to **Member**. If you assign **System Admin**, the bot will have access to write in and read any public channels, private channels and direct messages.
7. (Optional) Select additional permissions for the account. Enable the bot to post to all Mattermost channels or all Mattermost Public channels.

RESTful API
~~~~~~~~~~~

Use the RESTful API ``POST /bots`` to create a bot. Must have permissions to create bots.

See our `API documentation <https://api.mattermost.com/#tag/bots>`_ to learn more about creating and managing bots through the API.

To authorize your bot via RESTful API use ``curl -i -H 'authorization: Bearer <Access Token>' http://localhost:8065/api/v4/users/me``. **Access Token** is not the ``Token ID`` and won't be visible again once created.

Plugins
~~~~~~~

Plugins can create bot accounts through an ``EnsureBot`` helper function. For an example, see `the Demo Plugin <https://github.com/mattermost/mattermost-plugin-demo/blob/master/server/configuration.go#L210-L217>`_.

Bots created by a plugin use the plugin's ID as the creator unless otherwise specified by the plugin.

Frequently Asked Questions
-----------------------------

Should I migrate all my integrations to use bot accounts?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

For your integrations using RESTful API and plugins, yes. To do so, you can either convert an existing account to a bot, or create a new bot account using the steps outlined above.

Once you create a bot account, use the generated token to access the RESTful API on behalf of a bot and interact in Mattermost.

For your webhook and slash command integrations, you cannot migrate them to use bot accounts, as they require a user account at this time. However, an option is to migrate the webhooks or slash commands to a plugin, which in turn can use bot accounts.

What happens if a plugin is using a bot account that already exists as a user account?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

For a concrete example, suppose you enable the `Mattermost GitHub plugin <https://github.com/mattermost/mattermost-plugin-github>`_, which uses a ``github`` bot account, while an existing ``github`` user account was created for webhook integrations.

Once the plugin is enabled, the plugin posts as the ``github`` account but without a `BOT` tag. A System Administrator can convert the ``github`` user to a bot account by using ``mmctl``:

.. code-block:: text

  mmctl user convert (--bot [emails] [usernames] [userIds] | --user <username> --password PASSWORD [--email EMAIL]) [flags]

If the user is an existing user account you want to preserve, change its username. The plugin will create a bot account with the name ``github``.

.. note::

   A bot account and a user account cannot share the same username in the same Mattermost instance.

How can I quickly test if my bot account is working?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Add the bot to a team and channel you belong to, then use the following curl command to post with the bot:

.. code-block:: text

  curl -i -X POST -H 'Content-Type: application/json' -d '{"channel_id":"<channel-id>", "message":"This is a message from a bot", "props":{"attachments": [{"pretext": "Look some text","text": "This is text"}]}}' -H 'Authorization: Bearer <bot-access-token>' <mattermost-url>/api/v4/posts

replacing the following parameters:

- ``<channel-id>`` with the channel you added the bot to
- ``<bot-access-token>`` with the bot access token generated when you created the bot account
- ``<mattermost-url>`` with your Mattermost domain, e.g. ``https://example.mattermost.com``

Do bot access tokens expire?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

No, but you can automate your integration to cycle its token `through the REST API <https://api.mattermost.com/#tag/users%2Fpaths%2F~1users~1%7Buser_id%7D~1tokens%2Fpost>`_.

For more information about access tokens, see `the personal access tokens documentation <https://developers.mattermost.com/integrate/admin-guide/admin-personal-access-token/>`_.

Do bot accounts make it easier to impersonate someone else such as the CEO or an HR coordinator?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Possibly yes. Currently, a System Admin can disable overriding the profile picture and the username from integrations to help prevent impersonation, but this is not the case for bot accounts.

Mitigations:

- ``BOT`` tag is used everywhere in the UI where bot accounts are referenced, including messages and user lists.
- For Direct Message channels, the channel header distinguishes the bot from a regular user account with a ``BOT`` tag.

What happens when a user who owns bot accounts is disabled?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

By default, bot accounts managed by the deactivated user are disabled for enhanced security. Those with permissions to manage bot accounts can re-enable them in **Main Menu > Integrations > Bot Accounts**. We strongly recommend creating new tokens for the bot to ensure the user who was deactivated no longer has access to read or write data in the system via the bot access token.

If you prefer to have bot accounts remain enabled after user deactivation, set ``DisableBotsWhenOwnerIsDeactivated`` to ``false`` in your ``config.json`` file.

Can bot accounts edit messages through the RESTful API?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Yes. By default, bot accounts can update their own posts.

If you find yourself unable to edit posts as a bot, check the following:
1. Instead of using a slash command to respond directly, use an API call for the initial interaction with a user to enable message edits.
2. If your system is using `advanced permissions <https://docs.mattermost.com/onboard/advanced-permissions.html>`_, then post edits could be disabled for users.

You also have the option to choose what role the bot account has. If the **System Admin** role is chosen, they can update any posts in the system and other System Admin permissions. Note that giving the **System Admin** role to a bot account enables them with other System Admin privileges, so this should be done with care.


If AD/LDAP or SAML sync is enabled, do bot accounts need to have an associated email address in AD/LDAP or SAML?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

When AD/LDAP or SAML sync is enabled, you can create bot accounts using the steps outlined above. These bot accounts won't require an email address.

If you need to sync service accounts from AD/LDAP or SAML to Mattermost and use them as bot accounts, `please reach out to us <https://mattermost.com/contact-us>`_ to discuss in detail. You may not need to sync service accounts and use them as bot accounts to meet your use case.

How are bot accounts identified in compliance exports?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

A field named ``UserType`` is added to Compliance Exports, including Global Relay, Actiance, and CSV. The field identifies whether a message was posted by a ``user`` or by a ``bot`` account.

source/archive/cloud-app-config.rst METASEP
:nosearch:

Config for EMM Solutions with Mattermost Mobile Apps
=====================================================

What is AppConfig?
------------------

AppConfig is a standard approach for app configuration and management introduced by the AppConfig Community, a group of leading EMM providers and app developers who have come together to make it easier for developers and customers to drive mobility in business. The community’s mission is to streamline the adoption and deployment of mobile enterprise applications by providing a standard approach to app configuration and management, building upon the extensive app security and configuration frameworks available in the OS. 

AppConfig provides an easy way to configure enterprise mobile applications with any of the EMM providers listed on the `AppConfig website <https://www.appconfig.org/members/>`__.

Mattermost mobile apps can be configured in your EMM solution using AppConfig with the `pre-built apps available on the public app stores (including Google Play and Apple App Store) <https://docs.mattermost.com/mobile/use-prebuilt-mobile-apps.html>`__, or as an `in-house app you compile yourself <https://docs.mattermost.com/mobile/build-custom-mobile-apps.html>`_.

.. _appconfig-table:

Mattermost AppConfig Values
---------------------------

The following table shows all the configuration options that can be sent from the EMM provider of your choice to the Mattermost mobile apps. You can also :download:`download an XML template <mattermost-specfile.xml>` of the configuration file for use with your EMM provider.

+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+---------------+------------------+-------------+--------------------------+
| Key                    | Description                                                                                                                                                                                                     | Type   | Default Value | Valid Values     | iOS Support | Android for Work Support |
+========================+=================================================================================================================================================================================================================+========+===============+==================+=============+==========================+
| inAppPinCode           | Require users to authenticate as the owner of the phone before using the app. Prompts for fingerprint or passcode when the app first opens and when the app has been in the background for more than 5 minutes. | String | ``false``     | ``true | false`` | Yes         | Yes                      |
+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+---------------+------------------+-------------+--------------------------+
| blurApplicationScreen  | Blur the app when it’s set to background to protect any confidential on-screen information. On Android, it also prevents taking screenshots of the app.                                                         | String | ``false``     | ``true | false`` | Yes         | Yes                      |
+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+---------------+------------------+-------------+--------------------------+
| jailbreakDetection     | Disable app launch on jailbroken or rooted devices.                                                                                                                                                             | String | ``false``     | ``true | false`` | Yes         | Yes                      |
+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+---------------+------------------+-------------+--------------------------+
| copyAndPasteProtection | Disable the ability to copy from or paste into any text inputs in the app.                                                                                                                                      | String | ``false``     | ``true | false`` | Yes         | Yes (since v1.24.0)      |
+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+---------------+------------------+-------------+--------------------------+
| serverUrl              | Set a default Mattermost workspace URL.                                                                                                                                                                         | String |               | URL              | Yes         | Yes                      |
+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+---------------+------------------+-------------+--------------------------+
| allowOtherServers      | Allow the user to change the above workspace URL.                                                                                                                                                               | String | ``true``      | ``true | false`` | Yes         | Yes                      |
+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+---------------+------------------+-------------+--------------------------+
| username               | Set the username or email address to use to authenticate against the Mattermost workspace.                                                                                                                      | String |               |                  | Yes         | Yes                      |
+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+---------------+------------------+-------------+--------------------------+
| useVPN                 | Enable connection to the Mattermost workspace to use a per-app VPN or VPN on-demand.                                                                                                                            | String | ``false``     | ``true | false`` | Yes         | No                       |
+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+---------------+------------------+-------------+--------------------------+
| timeoutVPN             | Set how long the request waits (in seconds) for an initial VPN connection to establish before timeout.                                                                                                          | String | 30            |                  | Yes         | No                       |
+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+---------------+------------------+-------------+--------------------------+
| vendor                 | Name of the EMM vendor or company deploying the app. Used in help text when prompting for passcodes so users are aware why the app is being protected.                                                          | String | Mattermost    |                  | Yes         | Yes                      |
+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+---------------+------------------+-------------+--------------------------+


Other AppConfig Settings
------------------------

As part of AppConfig, EMM administrators can set the following additional configuration options for the Mattermost mobile apps:

1. **App Tunnel:** Leverage the "Per-app VPN" capabilities in most commercial VPN solutions.
2. **Prevent App Backup:** Prevent users from backing up app data.
3. **Enforce App Encryption:** Set security policies such as requiring encryption.
4. **Remotely Wipe App:** Use the EMM tool to distribute the app to devices as a managed application so it can be remotely wiped. If the app was previously installed, mark it so the EMM converts the app to a managed app.

Other configurations may be available depending on your EMM provider.

source/archive/cloud-advanced-permissions.rst METASEP
:nosearch:

Advanced permissions
====================

Mattermost System Admins can use Advanced Permissions to customize which users can perform specific actions, such as creating teams, managing channels, and configuring webhooks. The Mattermost permission system is based on a modified RBAC (role-based access control) architecture, using roles to determine which users have the ability to perform various actions.

Two permission schemes are provided in Mattermost: 

* System Scheme: Applies permissions universally across all teams and channels.
* Team Override Schemes: Allow admins to customize permissions for each team.

This document describes the types of permissions that can be given to users of Mattermost using schemes as well as channel settings and roles. The `permissions backend documentation <https://docs.mattermost.com/deployment/permissions-backend.html>`_ provides additional technical details around permissions.


.. contents::
  :backlinks: top
  :local:
  
Permissions structure
----------------------

The Mattermost System Console provides a number of elements for Admins to control the permissions in their system. 

System scheme 
^^^^^^^^^^^^^

You can set the default permissions granted to System Admins, Team Admins, Channel Admins, Guests (if enabled), and All Members. The permissions granted in the System Scheme apply system-wide, meaning:

- **Guests:** If Guest Accounts are enabled, permissions apply to guest users in all channels, in all teams.
- **All Members:** Permissions apply to all members, including Admins, in all channels, in all teams.
- **Channel Administrators:** Permissions apply to all Channel Admins in all channels, in all teams.
- **Team Administrators:** Permissions apply to all Team Admins, in all teams.

To override the System Scheme default permissions in a specific team, you must set up a Team Override Scheme.

You can access the System Scheme interface in **System Console > User Management > Permissions > System Scheme**.

.. image:: ../images/system-scheme.png

Team override schemes 
^^^^^^^^^^^^^^^^^^^^^

On systems with multiple `Mattermost teams <https://docs.mattermost.com/help/getting-started/creating-teams.html>`_, each team may operate and collaborate in a unique way. Team Override Schemes give Admins the flexibility to tailor permissions to the needs of each team.

When you use this permission scheme:

- The permissions granted in a Team Override Scheme apply only in the teams which are assigned to the scheme.
- The System Scheme does not apply to teams that are added to a Team Override Scheme.
- Teams can only belong to one Team Override Scheme.

You can access the Team Override Scheme interface in **System Console > User Management > Permissions > Team Override Schemes**.

.. image:: ../images/team-scheme.png

Channel permissions 
--------------------

The channel permissions interface is accessed in **System Console > User Management > Channels**.

Supplementary roles
^^^^^^^^^^^^^^^^^^^

*Available in a future release.*

Allows Admins to grant additional permissions to specific users or to a group of users based on AD/LDAP group membership. Permissions can be granted within the scope of channels, teams, or system level.

Recipes
--------

This section provides some examples of common permissions use cases for team management, channel management, and overall permissions. 

Team management
^^^^^^^^^^^^^^^

**Only allow Admins, in specific team, to add members**

Example: In Team A, only allow Team and System Admins to add new team members. As the default for all other teams, allow all users to add and invite new members.

1. Go to **System Console > User Management > Permissions**.
2. Select **Edit Scheme**.
3. In the **All Members > Teams** panel, check the box for **Add Team Members**. This sets the system default for all teams.
4. Select **Save**.
5. Select the back arrow to return to the **Permission Schemes** menu.
6. Select **New Team Override Scheme**.

  a. Name and describe the scheme. For example, ``Authorized Personnel Only`` with description ``Restrict adding team members to Team and System Admins.``
  b. Select **Add Teams** to add Team B to the **Select teams to override permissions** list, locate Team B, and choose **Add**.
  c. In the **All Members** panel, uncheck the box for **Add Team Members**.
  d. In the **Team Administrators** panel, check the box for **Add Team Members**.
  
7. Select **Save**. 
8. Select the back arrow to return to the **Permission Schemes** menu. 

Public and private channel management
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**Restrict who can rename channels and edit channel header and purposes**

Example: As the default for the entire system, restrict renaming channels and editing headers and purposes to Admins only.

1. Navigate to **System Console > User Management > Permissions**.
2. Select **Edit Scheme**.
3. In the **All Members** panel, uncheck the box for **Manage Public Channels > Manage Channel Settings**.

The **Manage Channel Settings** option is now only available to **Channel Administrators**, **Team Administrators**, and **System Administrators**.

.. note::

  Permissions for channel renaming, editing channel header, and editing channel purpose are currently grouped in a single permission. These will be split into separate permissions in a future release.

**Restrict who can create channels, in specific teams**

Example: In Team C, restrict public channel creation to Admins. As the default for all other teams, allow everyone to create public channels.

1. Go to **System Console > User Management > Permissions**.
2. Select **Edit Scheme**.
3. In the **All Members** panel, in the **Manage Public Channels** menu, check the box for **Create Channels**. This sets the system default to allow creation of public channels on all teams.
4. Select **Save**.
5. Select the arrow to return to the **Permission Schemes** interface.
6. Select **New Team Override Scheme**.

  a. Name and describe the scheme. For example, ``Contractor Scheme`` with description ``Restrict public channel creation to Admins only``.
  b. Select **Add Teams** to add Team B to the **Select teams to override permissions** list, locate Team B, and choose **Add**.
  c. In the **All Members** panel, in the **Manage Public Channels** section, uncheck the box for **Create Channels**.
  d. In the **Team Administrators** panel, in the **Manage Public Channels** section, check the box for **Create Channels**.

Convert public channels to private channels
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**Allow all members to convert public channels to private channels**

Example: Set the default setting to allow all members, Team Admins, and Channel Admins to convert public channels to private.

1. Navigate to **System Console > User Management > Permissions**.
2. Select **Edit Scheme**.
3. In the **All Members** panel, uncheck the box for **Manage Public Channels > Convert Channels**.

This permission is applied to all other roles (excluding the Guest role). When this permission is not enabled for All Members, it must be manually applied to Team Admins and Channel Admins if required.

Read only channels
^^^^^^^^^^^^^^^^^^

**Configure a channel so that members can post/reply/react but guests can only read and react.**

1. Navigate to **System Console > User Management > Channels**.
2. Select **Edit** next to the name of the channel you want to configure.
3. In the **Create Posts** panel, uncheck **Guests**.
4. In the **Post Reactions** panel, uncheck **Guests** if required.
5. Select **Save**.

The channel is available for all members and guests to access, but guests can only read messages and react to them.

**Create an announcement channel where only channel admins are able to post.**

1. Create a new channel (either Public or Private).
2. Navigate to **System Console > User Management > Channels**.
3. Select **Edit** next to the name of the channel you just created (you may need to search for it).
4. In the **Create Posts** panel, uncheck **Guests** and **Members**.
5. In the **Post Reactions** panel, uncheck **Guests** and **Members**.
6. Select **Save**.

The channel is available for all members and guests to access but only admins can post.

Post management
^^^^^^^^^^^^^^^

**Restrict who can delete posts**

Example: As the default for the entire system, restrict deleting posts to only Team and System Admins.

1. Navigate to **System Console > User Management > Permissions**.
2. Select **Edit Scheme**.
3. In the **All Members** and **Channel Admininistrators** panels, in the **Delete Posts** section, uncheck the boxes for **Delete Own Posts** and **Delete Others' Posts**.
4. In the **Channel Administrators** and **Team Administrators** panels, in the **Delete Posts** section, check the boxes for **Delete Own Posts** and **Delete Others' Posts**.

**Restrict who can edit posts**

Example: As the default for the entire system, only allow users to edit their own posts for five minutes after posting.

1. Navigate to **System Console > User Management > Permissions**.
2. Select **Edit Scheme**.
3. In the **All Members**, **Channel Administrators**, and **Team Administrators** panels, in the **Manage Posts** section, check the box for **Edit Posts**.
4. From any panel, select the gear button to set the global time limit to ``300`` seconds.

.. note::

  The post edit time limit is a `global config variable <https://docs.mattermost.com/administration/config-settings.html#post-edit-time-limit>`__ ``PostEditTimeLimit``, so setting a post edit time limit applies system-wide to all teams and roles.

Integration management
^^^^^^^^^^^^^^^^^^^^^^

**Restrict managing webhooks and slash commands**

Example: As the default for the entire system, only allow System Admins to create, edit, and delete integrations.

1. Go to **System Console > User Management > Permissions**.
2. Select **Edit Scheme**.
3. In the **All Members** and **Team Administrators** panels, in the **Integrations & Customizations** section, uncheck the boxes for **Manage Incoming Webhooks**, **Manage Outgoing Webhooks**, and **Manage Slash Commands**.

.. note::

  Permissions for creating, editing, and deleting integrations are currently grouped for each integration type. These will be split into separate permissions in a future release.

Glossary
--------

- **Permission:** The ability to execute certain actions. Permissions are granted to roles.
- **Roles:** A set of permissions. Users or groups are assigned to roles.
- **Group:** A set of users, usually synced from AD/LDAP. Groups are assigned to roles in the context of teams, channels, or system-wide.
- **Default Roles:** All Members, Guests (if enabled), Channel Admins, Team Admins, System Admins.
- **System Scheme:** A set of default roles that apply system-wide.
- **Team Override Scheme:** A set of default roles that apply only in the team specified. Permissions granted to roles in a team scheme override roles in the system scheme.
- **System-wide:** Applies across the entire system, including all teams of which the user is a member.
- **Team-wide:** Applies in a specific team only.

source/archive/cloud-admin-guide.rst METASEP
:nosearch:

Cloud Administrator's Guide
============================

In-depth documentation on deployment and administration of Mattermost Cloud workspaces. To manage Mattermost Cloud using the System Console, you must be assigned the *System Admin* role, or be promoted by a System Admin. Access the System Console from the **Main Menu** (next to your avatar) by selecting **System Console**.
  
System Administration 
---------------------

.. toctree::
   :maxdepth: 2
   :glob:

   /cloud/cloud-billing/cloud-billing.rst
   /cloud/cloud-reporting.rst
   /cloud/cloud-administration/create-new-workspace.rst
   /cloud/cloud-administration/cloud-changelog*
   /cloud/cloud-administration/downloading-support-packet.rst
   
User Management
---------------

.. toctree::
   :maxdepth: 1
   :glob:

   /cloud/cloud-user-management/user-management.rst
   /cloud/cloud-user-management/cloud-groups.rst
   /cloud/cloud-user-management/cloud-team-and-channel.rst
   /cloud/cloud-guest-accounts.rst
   /cloud/cloud-user-management/advanced-permissions.rst
   /cloud/cloud-user-management/user-satisfaction-surveys.rst

Configuration
-------------

.. toctree::
   :maxdepth: 2
   :glob:

   /cloud/cloud-administration/site-configuration.rst

Authentication
--------------

.. toctree::
   :maxdepth: 1
   :glob:

   /cloud/cloud-administration/authentication.rst
   /cloud/cloud-administration/sso-saml.rst
   /cloud/cloud-administration/saml-technical.rst
   /cloud/cloud-administration/sso-ldap.md
   /cloud/cloud-administration/converting-oauth-2.0-to-openid-connect.rst
   /cloud/cloud-administration/sso-openid-connect.rst
   /cloud/cloud-administration/sso-gitlab.rst
   /cloud/cloud-administration/sso-google.md
   /cloud/cloud-administration/sso-office.md

Integrations
------------

.. toctree::
   :maxdepth: 1
   :glob:

   /cloud/cloud-integrations/cloud-incoming-webhooks.rst
   /cloud/cloud-integrations/cloud-outgoing-webhooks.rst
   /cloud/cloud-integrations/cloud-slash-commands.rst
   /cloud/cloud-integrations/cloud-bot-accounts.rst
   /cloud/cloud-integrations/cloud-personal-access-tokens.rst
   /cloud/cloud-integrations/cloud-oauth-2-0-application.rst
   /cloud/cloud-integrations/integrations-faq.md
   /cloud/cloud-integrations/embedding.rst
   /cloud/cloud-integrations/webhook.rst

Compliance
----------

.. toctree::
   :maxdepth: 1
   :glob:

   /cloud/cloud-administration/cloud-compliance.rst
   /cloud/cloud-administration/compliance-export.rst
   /cloud/cloud-administration/data-retention-policy.rst
   /cloud/cloud-administration/custom-terms-of-service.rst

Mobile
------

.. toctree::
   :maxdepth: 1
   :glob:

   /cloud/cloud-mobile/cloud-mobile-apps.rst
   /cloud/cloud-mobile/cloud-app-config.rst
   /cloud/cloud-mobile/mobile-apps-faq.rst
   /cloud/cloud-mobile/troubleshooting-mobile.rst
   
Incident Management
-------------------

.. toctree::
   :maxdepth: 1
   :glob:
 
   /administration/devops-command-center.rst
 

source/archive/ci-cd-tools.rst METASEP
:nosearch:

CI/CD Tools
============

Our `Integrations Directory <https://integrations.mattermost.com>`_ has several integrations to connect CI/CD tools in Mattermost.

Here are some popular options below, including self-hosted on-prem or self-hosted private cloud solutions, and vendor-hosted SaaS solutions.

GitHub
~~~~~~~

 - Two-way integration between Mattermost and GitHub, developed by Mattermost.
 - Get reminders on issues and pull requests that need your attention.
 - Get notifications in Mattermost about mentions, review requests, and comments.
 - Supports GitHub Enterprise, works with SaaS and Enterprise versions of GitHub.
 - Source code + docs: https://github.com/mattermost/mattermost-plugin-github 

GitLab
~~~~~~~

 - Two-way integration between Mattermost and GitLab, developed by Romain Maneschi, supported by Mattermost.
 - Get reminders on issues and merge requests that need your attention.
 - Get notifications in Mattermost about mentions, review requests, and comments.
 - Supports SaaS and on-prem versions of GitLab.
 - Source code + docs: https://github.com/mattermost/mattermost-plugin-gitlab

Jenkins Plugin
~~~~~~~~~~~~~~~

 - Two-way integration between Mattermost and Jenkins, developed by Wasim Thabraze, supported by Mattermost.
 - Enables interacting with jobs and builds via slash commands in Mattermost.
 - Abort builds, enable and disable jobs, get test results, and build logs.
 - Source code + docs: https://github.com/mattermost/mattermost-plugin-jenkins

Jenkins
~~~~~~~~~

 - Connect your Jenkins account to Mattermost, developed by Jenkins.
 - Send webhook notifications from Jenkins to Mattermost channels.
 - Source code + docs: https://github.com/jenkinsci/mattermost-plugin

Bitbucket
~~~~~~~~~~

 - Atlassian Marketplace application for Bitbucket and Mattermost, developed by Herzum.
 - Send notifications about repository and pull request events from your Bitbucket projects to Mattermost channels.
 - Supports Bitbucket Server platform.
 - Marketplace download + docs: https://marketplace.atlassian.com/apps/1220418/amplifier-for-mattermost-bitbucket?hosting=server&tab=overview

Have a proposal for a CI/CD tool? `Let us know in the feature proposal forum <https://mattermost.uservoice.com/forums/306457-general?category_id=202591>`_.

Have built an integration? `Let us know <https://integrations.mattermost.com/submit-an-integration/>`_ and we'll share in our `Integrations Directory <https://integrations.mattermost.com>`_.

source/archive/cheatsheet.png METASEP

source/archive/channels-basics.rst METASEP
:nosearch:

Channels Basics
================

|all-plans| |cloud| |self-hosted|

.. |all-plans| image:: ../images/all-plans-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in Mattermost Free and Starter subscription plans.

.. |cloud| image:: ../images/cloud-badge.png
  :scale: 30
  :target: https://mattermost.com/download
  :alt: Available for Mattermost Cloud deployments.

.. |self-hosted| image:: ../images/self-hosted-badge.png
  :scale: 30
  :target: https://mattermost.com/deploy
  :alt: Available for Mattermost Self-Hosted deployments.

Write messages
--------------

Write messages using the text input box at the bottom of Mattermost. Press :kbd:`Enter` to send a message. Press :kbd:`Shift` :kbd:`Enter` on Windows or Linux, or press :kbd:`⇧` :kbd:`↵` on Mac, to create a new line without sending a message. 

.. tabs::

  .. tab:: Mattermost v6.0 onwards

      You can press :kbd:`Enter` to insert new lines, and press :kbd:`Ctrl` :kbd:`Enter` on Windows or Linux, or :kbd:`⌘` :kbd:`↵` on Mac, to send messages instead. Select the |gear-icon| to go to **Settings**, then select **Advanced > Send messages on CTRL+ENTER**.

      .. |gear-icon| image:: ../images/settings-outline_F08BB.svg
        :alt: Select the Gear icon to open the Settings dialog.

  .. tab:: Mattermost v5.39 and earlier

      In Mattermost versions up to v5.39, you can press :kbd:`Enter` to insert new lines, and :kbd:`Ctrl` :kbd:`Enter` on Windows or Linux, or :kbd:`⌘` :kbd:`↵` on Mac, to send messages instead. Select the three horizontal lines at the top of the channel sidebar (also known as a hamburger menu) to go to **Account Settings**, then select **Advanced > Send messages on CTRL+ENTER**.
      
Reply to messages
------------------

Reply to messages by selecting the |reply-arrow| icon next to the message text.

.. |reply-arrow| image:: ../images/reply-arrow.png
  :alt: Reply icon.

Notify teammates
----------------

Let teammates know when they're needed by typing ``@username``.

Link to channels
----------------

Create a link to a Public Channel in a message by typing ``~`` followed by the channel name (e.g. ``~roadmap``). From Mattermost v6.2, channel members also see Private Channel names returned.

Format your messages
--------------------

Format your messages using Markdown that supports text styling, headings, links, emojis, code blocks, block quotes, tables, lists, and in-line images.

You can use either ``_`` or ``*`` for italics and bold text. 

.. image:: ../images/messagesTable1.png
   :alt: Formatting markdown controls the look and feel of text messages.

See our `Formatting Text <https://docs.mattermost.com/messaging/formatting-text.html>`__ documentation for more details and examples.

React to messages
-----------------

React to messages quickly by selecting the |smile-icon| icon inside the Mattermost message input box to open the Emoji Picker.

.. |smile-icon| image:: ../images/smile-icon.png
  :alt: Smile icon.

Or, react to messages by typing ":" followed by two characters, which will open an emoji autocomplete. If the existing emojis don't cover what you want to express, you can also create your own `Custom Emoji <https://docs.mattermost.com/messaging/using-emoji.html#creating-custom-emojis>`__.

Share files
-----------

Share files by dragging and dropping them into Channels, or by selecting the |attachment-icon| icon within the message input box.

.. |attachment-icon| image:: ../images/attachment-icon.png
  :alt: Attachment icon.

Save messages for follow up
---------------------------

Save messages for later follow up by selecting the |save-icon| icon next to the message.

.. |save-icon| image:: ../images/save-icon.png
  :alt: Save icon.

.. image:: ../images/save-message.png
   :alt: Save messages for later follow up.

Learn more about:

* `Composing Messages and Replies <https://docs.mattermost.com/messaging/sending-receiving-messages.html>`__
* `Mentioning Teammates <https://docs.mattermost.com/messaging/mentioning-teammates.html>`__
* `Formatting Messages using Markdown <https://docs.mattermost.com/messaging/formatting-text.html>`__
* `Sharing Files <https://docs.mattermost.com/messaging/sharing-files.html>`__
* `Executing Commands <https://docs.mattermost.com/messaging/executing-slash-commands.html>`__

source/archive/channel-preferences.rst METASEP
:nosearch:

Set Channel Preferences
=======================

|all-plans| |cloud| |self-hosted|

.. |all-plans| image:: ../images/all-plans-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in Mattermost Free and Starter subscription plans.

.. |cloud| image:: ../images/cloud-badge.png
  :scale: 30
  :target: https://mattermost.com/download
  :alt: Available for Mattermost Cloud deployments.

.. |self-hosted| image:: ../images/self-hosted-badge.png
  :scale: 30
  :target: https://mattermost.com/deploy
  :alt: Available for Mattermost Self-Hosted deployments.

For each channel you belong to, you can set notification preferences as well as the channel's header, purpose, and name. Select the channel name at the top of the screen to access channel-specific settings.

.. image:: ../images/channel-preferences.png
        :alt: Select the channel name at the top of the screen to set preferences for each channel you belong to.

Channel notification preferences
--------------------------------

Change the following channel notification settings by selecting **Notification Preferences**.

Mute channel
~~~~~~~~~~~~~

Muting turns off desktop, email, and push notifications for a channel, and the channel will only be marked as unread in the channel sidebar if you're mentioned. To mute the current channel and disable notifications, select **Mute Channel** from the channel name at the top of the screen. By default, all channels are unmuted.

.. tip::

  Quickly mute or unmute any channel any time by selecting **Mute Channel** or **Unmute Channel** from the channel name at the top of the screen, or by selecting **More Options** for a channel in the Channel Sidebar.

Ignore mentions for @channel, @here and @all
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

By default, you'll receive mention notifications every time someone on your team `mentions an entire channel <https://docs.mattermost.com/messaging/mentioning-teammates.html>`__ using ``@channel``, ``@all``, or ``@here``. 

To stop receiving mention notifications, enable the **Ignore mentions for @channel, @here and @all** option, then select **Save**. When enabled, mention notifications for channel-wide mentions are ignored, but the channel is marked as unread unless the channel is muted. 

Send desktop notifications
~~~~~~~~~~~~~~~~~~~~~~~~~~

By default, your `desktop notification preferences <https://docs.mattermost.com/messaging/manage-channels-settings.html#desktop-notifications>`__ configured in **Settings** apply to all channels. Desktop notifications are available on Edge, Firefox, Safari, Chrome, and `Mattermost Desktop Apps <https://mattermost.com/download/#mattermostApps>`__.

To customize desktop notifications per channel, edit **Send desktop notifications**, choose one of the following options, then select **Save**:

+---------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **Notification option**   | **You'll receive...**                                                                                                                                                                                                                            |
+===========================+==================================================================================================================================================================================================================================================+
| **Global default (None)** | Desktop notifications based on your `Settings <https://docs.mattermost.com/messaging/manage-channels-settings.html>`__ configuration.                                                                                                            |
+---------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **For all activity**      | Desktop notifications for every new message.                                                                                                                                                                                                     |
+---------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **Only for mentions**     | - Desktop notifications for @mentions only.                                                                                                                                                                                                      |
|                           | - When you've `enabled Collapsed Reply Threads <https://docs.mattermost.com/messaging/manage-channels-settings.html#collapsed-reply-threads-beta>`__, receive reply thread notifications by enabling **Notify me about threads I'm following**.  |
+---------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **Never**                 | No desktop notifications.                                                                                                                                                                                                                        |
+---------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Send mobile push notifications
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost push notifications `must be enabled <https://docs.mattermost.com/configure/configuration-settings.html#enable-push-notifications>`__ by a System Admin. Once enabled, your `mobile push notification preferences <https://docs.mattermost.com/messaging/manage-channels-settings.html#mobile-push-notifications>`__ configured in **Settings** apply to all channels by default.

To customize mobile push notifications per channel, edit **Send mobile push notifications**, choose one of the following options, then select **Save**:

+------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **Notification option**      | **You'll receive...**                                                                                                                                                                                                                            |
+==============================+==================================================================================================================================================================================================================================================+
| **Global default (Mention)** | Mobile notifications based on your `Settings <https://docs.mattermost.com/messaging/manage-channels-settings.html>`__ configuration.                                                                                                             |
+------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **For all activity**         | Mobile notifications for every new message.                                                                                                                                                                                                      |
+------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **Only for mentions**        | - Mobile notifications for @mentions only.                                                                                                                                                                                                       |
|                              | - When you've `enabled Collapsed Reply Threads <https://docs.mattermost.com/messaging/manage-channels-settings.html#collapsed-reply-threads-beta>`__, receive reply thread notifications by enabling **Notify me about threads I'm following**.  |
+------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **Never**                    | No desktop notifications.                                                                                                                                                                                                                        |
+------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Channel header
--------------

A channel header refers to text that displays under a channel name at the top of the screen. A channel header can be up to 1024 characters in length and is often used to summarize the channel's focus or to provide links to frequently accessed documents, tools, or websites. 

Change the channel header by selecting **Edit Channel Header**. You can use Markdown to `format channel header text <https://docs.mattermost.com/messaging/formatting-text.html>`__ using the same Markdown for messages. Any channel member can change a channel header, unless the System Admin has `restricted permissions to do so <https://docs.mattermost.com/configure/configuration-settings.html#enable-public-channel-renaming-for>`__.

.. image:: ../images/channel-header.png
        :alt: Channel headers can include links to documents, tools, or websites.

Channel purpose
---------------

A channel purpose refers to text that displays when users select **View Info** for a channel. A channel purpose can be up to 250 characters in length and is often used to help users decide whether to join the channel. 

Change the channel purpose by selecting **Edit Channel Purpose**. Any channel member can change a channel purpose, unless the System Admin has `restricted permissions to do so <https://docs.mattermost.com/configure/configuration-settings.html#enable-public-channel-renaming-for>`__.

.. image:: ../images/channel-purpose.png
        :alt: Channel purpose helps users decide if they want to join the channel based on its scope or focus.

Channel name
------------

A channel name must be at least two characters, and can be up to 64 characters in length. `Some unicode characters <https://www.w3.org/TR/unicode-xml/#Charlist>`_ aren't supported.

Change the channel name by selecting **Rename Channel**. Changing the name of the channel also changes the channel URL. Any channel member can change a channel name, unless the System Admin has `restricted permissions to do so <https://docs.mattermost.com/configure/configuration-settings.html#enable-public-channel-renaming-for>`__.
source/archive/casestudy.rst METASEP
:nosearch:

=====================
Case Studies
=====================

Case Studies process has been moved to the `Mattermost Handbook <https://handbook.mattermost.com/operations/messaging-and-math/how-to-guides-for-m-and-m/how-to-write-mattermost-case-studies>`_.

source/archive/bug-severity-guidelines.rst METASEP
:nosearch:

Severity levels for bug tickets
================================================

This page has moved to the `Mattermost Handbook <https://handbook.mattermost.com/operations/research-and-development/product/development-process/bug-severity-guidelines>`__.

source/archive/bug-fix-release.rst METASEP
:nosearch:

Quality Release Process
==========================

This page has moved to the `Mattermost Handbook <https://handbook.mattermost.com/operations/research-and-development/product/release-process/bug-fix-release>`__.

source/archive/branding.rst METASEP
:nosearch:

Mattermost Branding and Naming Guidelines
============================================

The Mattermost branding and naming guidelines are intended to help keep users safe and to support the development of community integrations through a set of consistent guidelines for use of the Mattermost name and brand.

Overview

.. contents::
  :backlinks: top
  :local:

Mattermost Visual Design Guidelines
--------------------------------------

Mattermost Logo
-------------------------------

For details on Mattermost logo usage guidelines please visit: https://handbook.mattermost.com/operations/operations/publishing/publishing-guidelines/brand-and-visual-design-guidelines

Mattermost User Experience
-------------------------------

For details on the visual design of the Mattermost user experience, please see: https://docs.mattermost.com/developer/fx-guidelines.html.

Naming Usage Guidelines
-------------------------------

Using the Mattermost name is generally fine so long as it’s used in a non-commercial way and does not imply endorsement by Mattermost, Inc.

Naming Integrations
-------------------------------

The following guidelines are intended to help developers of Mattermost integrations offer clear, consistent naming across the broader community.

- IMPORTANT: Please do not start with or use the name "Mattermost" for your integration as this may confuse  users on where to find support.

Community projects may be named using “for Mattermost”, for example:

- `GitLab Integration Service for Mattermost <https://github.com/NotSqrt/mattermost-integration-gitlab>`__
- `Giphy Integration Service for Mattermost <https://github.com/numberly/mattermost-integration-giphy>`__

Alternatively, community projects may concatenate names containing Mattermost, for example:

- `Matterbridge <https://github.com/42wim/matterbridge>`__ – is a Mattermost bridge connecting with IRC
- `Mattersend <https://github.com/mtorromeo/mattersend>`__ – is a Mattermost integration for sending webhook events

Exception: Please don’t use the name “matterbot”, as that is an internal service under development.

When there are multiple open source projects for similar Mattermost integrations we ask our community to include the owner of the repo, for example:

- `Hubot Adapter for Mattermost by Heitor Lessa <https://github.com/renanvicente/hubot-mattermost>`__
- `Hubot Adapter for Mattermost by Andy Lo-A-Foe <https://github.com/loafoe/hubot-matteruser>`__

Product Description
-------------------------------

Below are optional product descriptions that can be used when referring to Mattermost from other open source projects or commercial 3rd party integrations.

General Mattermost Description
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

When developing a Mattermost integration, the following description can be used to describe Mattermost:

  Mattermost is an open source Slack-alternative built for enterprise. Thousands of companies use Mattermost for secure, compliant workplace messaging across web, PC and phones with archiving, search, corporate SSO, and integration with hundreds of third-party applications. Available under MIT license in 16 languages, Mattermost offers peace-of-mind, value, control, and freedom from lock-in for organizations around the world. Learn more at https://mattermost.com/.

Mattermost Team Edition Description
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

When redistributing the open source Mattermost Team Edition binary, the following description may be used:

  Mattermost Team Edition is an open source, self-hosted alternative to proprietary SaaS messaging. Mattermost brings all your team communication into one place, making it searchable and accessible anywhere. Deploys as single Linux binary on MySQL or PostgreSQL under an MIT license from `mattermost.com/download <https://mattermost.com/deploy/>`__.

Mattermost Enterprise Edition Description
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

When redistributing the commercial Mattermost Enterprise Edition binary, the following description may be used:

  Mattermost Enterprise Edition is a secure, configurable, highly scalable enterprise messaging for private clouds offering corporate directory integration, advanced access control, performance monitoring, multi-factor authentication, compliance and auditing support, and sophisticated configurations for horizontal scaling and high availability deployments.

  Mattermost Enterprise Edition is free to use in "team mode" and is functionally equivalent to the open source Mattermost Team Edition, with the added benefit of being able to enable advanced enterprise features with purchase of an annual subscription.

Mattermost Trademark Policy
-------------------------------

Please see our full trademark policy at: https://mattermost.org/trademark-standards-of-use/

source/archive/bots.rst METASEP
:nosearch:

Bots
====

Our `Integrations Directory <https://integrations.mattermost.com>`_ has several integrations to connect bots in Mattermost.

Here are some popular options below, including self-hosted on-prem or self-hosted private cloud solutions, and vendor-hosted SaaS solutions.

WelcomeBot
~~~~~~~~~~

 - Welcome users to your Mattermost instance, developed by Mattermost.
 - Add a Welcome Bot that helps add new team members to channels to improve onboarding and HR processes.
 - Source code + docs: https://github.com/mattermost/mattermost-plugin-welcomebot

BotKube
~~~~~~~

 - Monitor and debug Kubernetes resources, developed by InfraCloud Technologies.
 - Monitor your Kubernetes cluster, debug critical deployments and get recommendations for standard practices.
 - Source code + docs: https://github.com/infracloudio/botkube

Sample Golang bot
~~~~~~~~~~~~~~~~~

 - Sample bot for Go driver, developed by Mattermost.
 - Learn how to use the Mattermost Go driver to interact with a Mattermost server, listen to events and respond to messages.
 - Use API for simple tasks such as logging in to your server, creating a channel and posting a message.
 - Source code + docs: https://github.com/mattermost/mattermost-bot-sample-golang

Hubot Adapter
~~~~~~~~~~~~~

 - Hubot adapter for Mattermost written in JavaScript that uses Web API and Websockets, developed by Andy Lo-A-Foe.
 - Use the bot to listen for commands and to execute actions based on your requests.
 - Invite your bot to any Mattermost channel just like a regular user.
 - Source code + docs: https://github.com/loafoe/hubot-matteruser

Python Chatbot
~~~~~~~~~~~~~~

 - A python based chat bot for Mattermost, developed by Alex Tzonkov.
 - Allows the creation of listeners, messages and replies to conversations in particular channels.
 - Create and setup a bot to listen to a channel for particular prompts and respond appropriately.
 - Source code + docs: https://github.com/attzonko/mmpy_bot

Have a proposal for a bot? `Let us know in the feature proposal forum <https://mattermost.uservoice.com/forums/306457-general?category_id=202591>`_.

Have built an integration? `Let us know <https://integrations.mattermost.com/submit-an-integration/>`_ and we'll share in our `Integrations Directory <https://integrations.mattermost.com>`_.

source/archive/bot-accounts.rst METASEP
:nosearch:

.. _bot-accounts:

Bot Accounts
=================

Use Bot accounts to integrate with Mattermost through `plugins <https://developers.mattermost.com/extend/plugins/>`_ or the `Mattermost RESTful API <https://api.mattermost.com>`_. Bot accounts access the RESTful API on behalf of a bot through the use of the :doc:`personal access tokens feature <personal-access-tokens>`.

Bot accounts are just like user accounts, except they:

- Can't be logged into.
- Can't be used to create other bot accounts.
- Don't count as a registered user and therefore don't count towards the total number of users for an Enterprise Edition license.

Additional benefits include:

- System Admins can enable Bot accounts to post to any channel in the system, including private teams, private channels, or Direct Message channels.
- Integrations created by a user and tied to a bot account no longer break if the user leaves the company.
- Once created, bot accounts behave just like regular user accounts and can be added to teams and channels similar to users.
- Bot accounts are a safer way to integrate with Mattermost through the RESTful API and Plugin API because there is no need to manage shared logins with these accounts.
- A ``BOT`` tag is used throughout Mattermost where bot accounts are referenced, including messages and user lists.

Note that currently:

- Only System Admins or plugins can create or manage bot accounts.
- Only user accounts can create and configure webhooks and slash commands.
- In Mattermost Enterprise Edition, service accounts without an email address pulled from LDAP or SAML systems are not yet supported.

If you would like to see improvements to bot accounts, `let us know in the Feature Proposal Forum <https://mattermost.uservoice.com>`_.

.. contents::
  :backlinks: top
  :depth: 1
  :local:

Configuration Settings
----------------------

By default, plugins can create and manage bot accounts. To enable bot account creation through the user interface or the RESTful API:

1. Go to **System Console > Integrations > Bot Accounts**.
2. Set **Enable Bot Account Creation** to ``true``.

Once set, System Admin can create bot accounts for integrations using the **Integrations > Bot Accounts** link in the description provided.

Bot Account Creation
--------------------

Below are different ways to create bot accounts. After the bot account is created, make sure to:

1. Copy the generated bot access token for your integration.
2. Add the bot account to teams and channels you want it to interact in.

User Interface (UI)
^^^^^^^^^^^^^^^^^^^

1. Go to **Main Menu > Integrations > Bot Accounts**.
2. Select **Add Bot Account**.
3. Set the **Username** of the bot. The username must begin with a letter, and contain between 3 and 22 lowercase characters made up of numbers, letters, and symbols including ".", "-", or "_".
4. (Optional) Upload an image for the **Bot Icon**. This will be used as the profile image of the bot throughout Mattermost.
5. (Optional) Set a **Display Name** and **Description**.
6. (Optional) Choose what role the bot should have. Defaults to **Member**. If you assign **System Admin**, the bot will have read and write access for any Public channels, Private channels, and Direct Messages.
7. (Optional) Select additional permissions for the account. Enable the bot to post to all Mattermost channels, or post to all Mattermost Public channels.

RESTful API
^^^^^^^^^^^

Use the RESTful API ``POST /bots`` to create a bot. You must have permissions to create bots.

See our `API documentation <https://api.mattermost.com/#tag/bots>`_ to learn more about creating and managing bots through the API.

To authorize your bot via RESTful API use ``curl -i -H 'authorization: Bearer <Access Token>' http://localhost:8065/api/v4/users/me``. **Access Token** is not the ``Token ID`` and won't be visible again once created.

Command Line Interface (CLI)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

You can use the following CLI command to convert an existing user account to a bot:

.. code-block:: text

  user convert user@example.com --bot

In addition to email, you may identify the user by its username or user ID.

Bot accounts which were converted from user accounts will have their authentication data cleared if they were email/password accounts. Those synchronized from LDAP/SAML will not have their authentication data cleared so that LDAP/SAML synchronization performs correctly.

Plugins
^^^^^^^^

Plugins can create bot accounts through an ``EnsureBot`` helper function. For an example, see `the Demo Plugin <https://github.com/mattermost/mattermost-plugin-demo/blob/master/server/configuration.go#L210-L217>`_.

Bots created by a plugin use the plugin's ID as the creator, unless otherwise specified by the plugin.

Technical Notes
---------------

Data Model
^^^^^^^^^^^

Each bot account has a row in the **Users** table and the **Bots** table. The entries are tied together by ``User.Id = Bot.UserId``.

The Bots table schema is described as follows:

.. csv-table::
    :header: "Field", "Description", "Type", "Required"

    "UserId", "User ID of the bot user", "string", "Y"
    "Username", "Username of the bot account", "string", "Y"
    "DisplayName", "Display name of the bot account", "string", "N"
    "Description", "Description of the bot account", "string", "N"    
    "OwnerId", "User ID of the owner of the bot", "string", "Y"
    "CreateAt", "Unix timestamp of creation time", "int64", "Y"
    "UpdateAt", "Unix timestamp of update time", "int64", "Y"
    "DeleteAt", "Unix timestamp of deletion time", "int64", "Y"

Frequently Asked Questions
--------------------------

Should I migrate all my integrations to use bot accounts?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

For your integrations using RESTful API and plugins, yes. To do so, you can either convert an existing account to a bot, or create a new bot account using the steps outlined above.

Once you create a bot account, use the generated token to access the RESTful API on behalf of a bot and interact in the Mattermost server.

For your webhook and slash command integrations, you cannot migrate them to use bot accounts, as they require a user account at this time. However, an option is to migrate the webhooks or slash commands to a plugin, which in turn can use bot accounts.

What happens if a plugin is using a bot account that already exists as a user account?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

For a concrete example, suppose you enable the `Mattermost GitHub plugin <https://github.com/mattermost/mattermost-plugin-github>`_, which uses a ``github`` bot account, while an existing ``github`` user account was created for webhook integrations.

Once the plugin is enabled, the plugin posts as the ``github`` account but without a `BOT` tag. An error message is logged to the server logs recommending the System Admin to convert the ``github`` user to a bot account by running ``mattermost user convert <username> --bot`` in the CLI.

If the user is an existing user account you want to preserve, change its username and restart the Mattermost server, after which the plugin will create a bot account with the name ``github``.

How do I convert an existing account to a bot account?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

You can use the `mmctl command line tool <https://docs.mattermost.com/manage/mmctl-command-line-tool.html>`_ to convert a user to a bot, with the following command:

.. code-block:: text

  mmctl user convert user@example.com --bot

In addition to an email address, users can be identified by their Mattermost username or user ID.

Bot accounts which were converted from user accounts will have their authentication data cleared if they were email/password accounts. Those synchronized from LDAP/SAML will not have their authentication data cleared so that LDAP/SAML synchronization performs correctly.

How can I quickly test if my bot account is working?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Add the bot to a team and channel you belong to, then use the following curl command to post with the bot:

.. code-block:: text

  curl -i -X POST -H 'Content-Type: application/json' -d '{"channel_id":"<channel-id>", "message":"This is a message from a bot", "props":{"attachments": [{"pretext": "Look some text","text": "This is text"}]}}' -H 'Authorization: Bearer <bot-access-token>' <mattermost-url>/api/v4/posts

Replace the following parameters:

- ``<channel-id>`` with the channel you added the bot to
- ``<bot-access-token>`` with the bot access token generated when you created the bot account
- ``<mattermost-url>`` with your Mattermost domain, e.g. ``https://example.mattermost.com``

Do bot access tokens expire?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

No, but you can automate your integration to cycle its token `through the REST API <https://api.mattermost.com/#tag/users%2Fpaths%2F~1users~1%7Buser_id%7D~1tokens%2Fpost>`_.

For more information about access tokens, see :doc:`the personal access tokens documentation <personal-access-tokens>`.

Do bot accounts make it easier to impersonate someone else such as the CEO or an HR coordinator?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Possibly yes. Currently a System Admin can disable overriding the profile picture and the username from integrations to help prevent impersonation, but this is not the case for bot accounts.

Mitigations:

- ``BOT`` tag is used everywhere in the UI where bot accounts are referenced, including messages and user lists.
- For Direct Message channels, the channel header distinguishes the bot from a regular user account with a ``BOT`` tag.

What happens when a user who owns bot accounts is disabled?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

By default, bot accounts managed by the deactivated user are disabled for enhanced security. Those with permissions to manage bot accounts can re-enable them in **Main Menu > Integrations > Bot Accounts**.

We strongly recommend creating new tokens for the bot, to ensure the user who was deactivated no longer has access to read or write data in the system via the bot access token.

If you prefer to have bot accounts remain enabled after user deactivation, set ``DisableBotsWhenOwnerIsDeactivated`` to ``false`` in your ``config.json`` file.

Can bot accounts edit messages through the RESTful API?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Yes. By default, bot accounts can update their own posts.

If you find yourself unable to edit posts as a bot, check the following:

1. Instead of using a slash command to respond directly, use an an API call for the initial interaction with a user to enable message edits.
2. If your system is using `advanced permissions <https://docs.mattermost.com/deployment/advanced-permissions.html>`_, then post edits could be disabled for users.

If neither of the above help resolve your issue, you also have the option to choose what role the bot account has. If System Admin is chosen, then the bot can update any posts in the system. Note that giving the System Admin role to a bot account enables the bot with other System Admin privileges so this should be done with care.

If AD/LDAP or SAML synchronization is enabled, do bot accounts need to have an associated email address in AD/LDAP or SAML?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

When AD/LDAP or SAML synchronization is enabled, you can create bot accounts using the steps outlined above. These bot accounts won't require an email address.

If you need to sync service accounts from AD/LDAP or SAML to Mattermost and use them as bot accounts, `please reach out to us <https://mattermost.com/contact-us>`_ to discuss in detail. You may not need to sync service accounts and use them as bot accounts to meet your use case.

How are bot accounts identified in compliance exports?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

As of v5.14, a field named ``UserType`` is added to Compliance Exports, including Global Relay, Actiance, and CSV. The field identifies whether a message was posted by a ``user`` or by a ``bot`` account.  

source/archive/benefits-us.rst METASEP
:nosearch:

Benefits for US-based employees
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

US-based employees' payroll and benefits are arranged through TriNet. The most up to date information is available through the TriNet HRPassport portal and contact forms and numbers listed there. 

This overview is a quick reference guide and does not replace the documentation in TriNet, please contact your TriNet representative for questions. 

**Basic Life Insurance and AD&D** - TriNet offers company paid basic life and accidental death and dismemberment (AD&D) plans. The Company pays for basic life insurance coverage valued at $20,000, which includes an equal amount of AD&D coverage.

**Medical** - TriNet partners with leading carriers, like Aetna, Florida Blue, Blue Shield of California and Kaiser, to offer a broad range of medical plans, including high deductible health plans, PPOs and HMOs. Medical plan options vary by state, and may also include regional carriers.

**Dental** - TriNet's four dental carriers - Delta Dental, Aetna, Guardian Dental, and MetLife - offer a high and a low national dental PPO plan. Aetna and Delta Dental also will make available a DMO plan in many states.

**Vision** - TriNet also offers a high and a low vision plan nationally through two different carriers: Aetna and Vision Service Plan (VSP). These plan options ensure that you can choose the best plan and carrier for your individual vision needs.

The Company covers health insurance up the following contribution caps: 

**Insurance and Company Contribution Cap**

- Medical Employee Only: $362.00
- Medical Employee + Spouse: $797.00
- Medical Employee + Child(ren):	$544.50
- Medical Employee + Spouse + Child(ren):	$724.50
 
- Group Dental Employee Only: $38.50
- Group Dental Employee + Spouse: $78.82
- Group Dental Employee + Child(ren): $58.64
- Group Dental Employee + Spouse + Child(ren): $78.82

- Group Vision Employee Only: $5.94
- Group Vision Employee + Spouse: $11.86
- Group Vision Employee + Child(ren): $9.31
- Group Vision Employee + Spouse + Child(ren): $13.13

Employees are responsible for the remainder of the premium cost, if any. A summary of plan options showing remainder of premium costs after employer contribution will be provided with your offer. 

We're working on setting up a 401K plan for US employees.

source/archive/benefits-canada.rst METASEP
:nosearch:

:orphan:

Benefits specific to Canada-based employees
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Canada-based employees are employed through a Canadian co-employer, who offers payroll with direct deposit to Canadian accounts, T4 tax forms, and for full time employees, additional benefits through Sun Life Financial, including: 

- Extended Health Care
- Dental Care
- Vision Care
- Life Insurance 
- Long Term Disability 
- Accidental Death and Dismemberment 
- Emergency Travel Assistance 

For full benefits information, please see `mysunlife.ca portal <https://www.sunnet.sunlife.com/signin/mysunlife/home.wca?>`__ and contact forms and numbers listed there. 

source/archive/authentication.rst METASEP
:nosearch:

Multi-Factor Authentication
---------------------------

Multi-factor authentication (MFA) is a secondary layer of user authentication applied to your Mattermost server.

With MFA enabled, users need to provide a secure one-time code in addition to their username and password in order to log in to Mattermost. MFA is useful in organizations that have specific security and compliance policies. It can also be used in organizations where Mattermost is not behind a firewall and doesn't have access to existing MFA infrastructure.

Mattermost offers a smartphone-based MFA check in addition to email-password or Active Directory/LDAP authentication to sign in to the Mattermost server.

Supported smartphones include iOS, Android, Blackberry, and Windows Phone devices that are able to install `Google Authenticator <https://support.google.com/accounts/answer/1066447?hl=en>`__. Other than requiring internet access to download and install Google Authenticator, the phone used for Mattermost MFA does not require internet access.

.. note::
  
  As the MFA implementation relies on Time-based One-time passwords (TOTP) ensure that your server system time is accurate. If there is a discrepancy, users may not be able to log in successfully.

Enabling MFA
~~~~~~~~~~~~

This option is enabled by the System Admin by going to **System Console > Authentication > MFA**, then setting **Enable Multi-factor Authentication** to **true**. 

Once enabled, users can opt to use MFA on their account in the `Account Settings <https://docs.mattermost.com/help/settings/account-settings.html#multi-factor-authentication>`__ menu under **Security > Multi-factor Authentication**.

.. include:: common-disable-mfa.rst
  :start-after: :nosearch: 

Enforcing MFA
~~~~~~~~~~~~~

This option can be enabled by the System Admin by going to **System Console > Authentication > MFA**, then setting **Enforce Multi-factor Authentication** to **true**.

When MFA enforcement is set to **true**, users with email or LDAP authentication who don't have MFA set up will be directed to the MFA setup page when they log in to Mattermost. They will not be able to access the site until MFA setup is complete. Any new users will be required to set up MFA during the sign up process.

Users will not be able to remove MFA from their account while enforcement is on.

.. note::

   Turning on MFA enforcement prevents users from accessing the site until set up is complete. It is recommended that you turn on enforcement during non-peak hours when people are less likely to be using Mattermost.

source/archive/atlassian-integrations.rst METASEP
:nosearch:

Atlassian Tools
================

Our `Integrations Directory <https://integrations.mattermost.com>`_ has several integrations to connect Atlassian tools in Mattermost.

Here are some popular options below, including self-hosted on-prem or self-hosted private cloud solutions, and vendor-hosted SaaS solutions.

Jira Plugin
~~~~~~~~~~~~

- Two-way integration between Mattermost and Jira, developed by Mattermost.
- Send event notifications from your Jira projects to Mattermost channels, with full JQL filtering support.
- Create and transition Jira issues, and attach Mattermost messages to Jira in the Mattermost user interface.
- Supports Jira Core and Jira Software products, for Cloud, Server and Data Center platforms.
- Source code + docs: https://github.com/mattermost/mattermost-plugin-jira

Jira Atlassian App
~~~~~~~~~~~~~~~~~~~

- Two-way Atlassian Marketplace application for Jira and Mattermost, developed by Herzum.
- Send event notifications and messages from your Jira projects to Mattermost channels, and create channels in Jira.
- Create and view Jira issues in the Mattermost user interface.
- Supports Jira Core and Jira Software products, for Server platform.
- Marketplace download + docs: https://marketplace.atlassian.com/apps/1220414/amplifier-for-mattermost-jira

Bitbucket
~~~~~~~~~

- Atlassian Marketplace application for Bitbucket and Mattermost, developed by Herzum.
- Send notifications about repository and pull request events from your Bitbucket projects to Mattermost channels.
- Supports Bitbucket Server platform.
- Marketplace download + docs: https://marketplace.atlassian.com/apps/1220418/amplifier-for-mattermost-bitbucket

Confluence
~~~~~~~~~~

- Atlassian Marketplace application for Confluence and Mattermost, developed by codefortynine.
- Send notifications about page, blogpost, question or comment updates from your Confluence spaces to Mattermost channels.
- Configure notifications for a specific space, and also user notifications for tasks and mentions.
- Supports Confluence Cloud, Server and Data Center platforms.
- Marketplace download + docs: https://marketplace.atlassian.com/apps/1215055/slack-for-confluence

Opsgenie
~~~~~~~~

- Two-way integration between Opsgenie and Mattermost, developed by Opsgenie.
- Send alert notifications from your Opsgenie incident boards to Mattermost channels.
- Use slash commands to take quick actions such as acknowledging, assigning, creating and closing alerts in the Mattermost user interface.
- Docs: https://docs.opsgenie.com/docs/mattermost-integration

Statuspage
~~~~~~~~~~

- Send notifications about system outages and partially degraded services from Statuspage to Mattermost, developed by Carlos Tadeu Panato Junior.
- Install and configure as a Mattermost plugin within minutes.
- Source code + docs: https://github.com/cpanato/mattermost-plugin-statuspage

Trello
~~~~~~~

- Send notifications from Trello projects to Mattermost channels, developed by Lujeni.
- Deploy via Heroku, Linux Web Server or Docker.
- Source code + docs: https://github.com/Lujeni/matterllo

Have a proposal for an Atlassian integration? `Let us know in the feature proposal forum <https://mattermost.uservoice.com/forums/306457-general?category_id=202591>`_.

Have built an integration? `Let us know <https://integrations.mattermost.com/submit-an-integration/>`_ and we'll share in our `Integrations Directory <https://integrations.mattermost.com>`_.

source/archive/asset-guidelines.rst METASEP
:nosearch:

Mattermost Asset Guidelines
============================================================

.. note::
  This page is largely out-of-date and is stored for record-keeping purposes. For latest marketing processes and guidelines, see the `Mattermost Handbook <https://handbook.mattermost.com/operations/messaging-and-math>`_.

The following guidelines are intended to help queue and prepare marketing assets for community projects by the Mattermost core committers and the Mattermost community.

.. contents::
    :backlinks: top

Queuing Assets for New Community Projects
------------------------------------------

Follow these steps to queue an asset for a new community project:

Integrations and Installers
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

If you find a new integration or installer in the `Mattermost Facebook page <https://www.facebook.com/Mattermost-2300985916642531/>`__, `Mattermost Twitter page <https://twitter.com/mattermost>`__, `GitHub <https://github.com/search?utf8=%E2%9C%93&q=mattermost>`__ or elsewhere you feel Mattermost should promote:

1. Post a request to the `Contributors team "Integrations and Apps" channel <https://community.mattermost.com/core/channels/integrations>`__ with:

  - mention to @jason
  - link to suggested integration
  - link to creator's GitHub profile, if applicable

    Example:

    .. code-block:: none

      @jason Here is [Matterbridge](https://github.com/42wim/matterbridge) from [42wim](https://github.com/42wim), which is a sample bridge between Mattermost, IRC, XMPP, Gitter and Slack.
      
      Is this something Mattermost would like to promote?

2. If the proposal is accepted, Ops reaches out to the integration creator by opening a GitHub issue with the following text:

    .. code-block:: none

      Title: 

      Share your work with Mattermost community?

      Body: 

      Hi @{GitHub_username}, 

      We came across your work and we'd love to help share it with the Mattermost community.

      If this interests you, we wondered if you'd help complete a form to tell us more about your work so we can promote it? 
      
      Here's the form: https://spinpunch.wufoo.com/forms/mattermost-integrations-and-installers/
      
      We'd also like to welcome you to join our public integrations community channel on our nightly build server: https://community.mattermost.com/core/channels/integrations

      Thanks for being a valued member of the Mattermost Community!

      - The Mattermost Team

3. When a contributor submits an integration via the `Wufoo form <https://spinpunch.wufoo.com/forms/mattermost-integrations-and-installers/>`__, a Zapier webhook posts relevant information into the `Integrations and Apps channel <https://community.mattermost.com/core/channels/integrations>`__.

4. Ops replies to each new Wufoo post with a numbered project title and project status. Example:

    .. code-block:: none

      #### 64) Cloud Foundry Integration (work queued)

Media Articles
^^^^^^^^^^^^^^^

When a relevant article on Mattermost is found in the news, add a new entry into `this Google document <https://docs.google.com/document/d/1kwCmn6JYeORdLV0noIk4iaxZx0iqR6OWUuzw5cZl6rA/edit>`__ and follow the process specified there.

Step-by-Step Asset Creation Guide for Artists
----------------------------------------------

Follow these steps to create an asset for integration or feature promotion or for guest blog posts.

You can find sample templates `in this Google drive <https://drive.google.com/open?id=0Bx-9w8QDFlfcbUh2bGdkRElJaWs>`__.

Integration or Feature Promotion
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

1. Use this `template (dark background) <https://www.dropbox.com/s/a8tbqxiik1m9i8u/20170717_template_dark.tif?dl=0>`__ or this `template (light background) <https://www.dropbox.com/s/codoct7np20fx3l/20170717_template_light.tif?dl=0>`__ as a starting point.
2. Update the title following the guidelines in `Feature Title`_.
3. Update the footer and the creator name following the guidelines in `Feature Footer`_ and in `Feature Creator`_.
4. Update representative art following the guidelines in `Feature Representative Art`_.
5. Update representative logo(s) following the guidelines in `Mattermost and Representative Logos`_.
6. Add a 1 pixel grey stroke border around the rectangular boundary of the banner.
7. Save the finished asset draft in both .TIF and .png format, and upload to your "Dropbox Share" folder.

Guest Blog Posts
^^^^^^^^^^^^^^^^^

1. Use this `template <https://drive.google.com/file/d/0Bx-9w8QDFlfcQURoRnF1YllZWWc/view?usp=sharing>`__ as a starting point.
2. Update the title following the guidelines in `Feature Title`_.
3. Update representative logo following the guidelines in `Mattermost and Representative Logos`_.
4. Obtain a photo of the guest company member and apply a gray-scale effect. You can also consider applying a `Puppet Module effect <https://mattermost.org/puppet-module-for-mattermost/>`__.
5. Add a 1 pixel grey stroke border around the rectangular boundary of the banner.
6. Save the finished asset draft in both .TIF and .png format, and upload to your "Dropbox Share" folder.

Asset Elements
---------------

The following include guidelines for specific elements of an asset.

Feature Title
^^^^^^^^^^^^^^

1. Appears in the top left corner of the asset.
2. Title should "communicate the benefit" of the work, while referencing its name.
  
  - Sometimes the title is a straightforward description of an app that can now connect to Mattermost, e.g. "New Update for Desktop App".
  - Sometimes the title needs to be non-standard, e.g. "Gitter integration for Mattermost via Matterbridge".

3. Aim to fit title on two lines. If title is too long, move Feature Representative Art more to the right of the banner to ensure that there is still at least 64px of width between Feature Title and Feature Representative Art.
4. Title should always be in title case.
5. Short titles are better than longer titles.

Feature Footer
^^^^^^^^^^^^^^^^

1. When the background of the banner is blue, the footer should be black. When the background is white, the footer should be blue.
2. Displays who created the integration (Twitter or GitHub account of the creator). See the next section for further instructions.
3. If the text doesn’t blend well with left pane representative art, adjust the outer glow effect.

Feature Creator
^^^^^^^^^^^^^^^^

1. Appears in the bottom right corner of the asset footer.
2. Text in footer should use GitHub username in lowercase, or company/person name in capital case i.e. ``by matterhorn-chat`` or ``by Galois, Inc.``.

Feature Representative Art
^^^^^^^^^^^^^^^^^^^^^^^^^^^

1. Representative art appears in the right side of the asset.
2. Screenshot of a feature in action is most preferred (see guidelines for `Feature Screenshot`_ and `Screenshot Development of Mattermost User Interface`_.
3. If no feature screenshot is available, take a screenshot of a well-formatted "README" file or of feature code with the word "Mattermost". If using a "README" file, ensure the screenshot doesn't highlight spelling or capitalization errors.
4. Change the color of the background based on the color of the screenshot. If the screenshot is light, use a dark background. If the screenshot is dark, use a light background.
5. Screenshot should not take up more than 40% of the banner width.
6. Follow these guidelines on spacing:

  - Ensure there is around 31px of “white space” between the contents of the screenshot and the edge of the screengrab. (This can be adjusted by resizing the rectangle layer below the screengrab in Photoshop).
  - Ensure there is at least 64px of width between the copy title and the edge of the screengrab.
  - There should be around 60px of space between the top edge of the screengrab and top edge of the banner. (Give or take 10px considering the diagonal of the screengrab).

6. Leave equal whitespace between all like objects.
7. Avoid wavy lines when rotating an image. To avoid them, increase the size of the original layer, rotate it, then reduce the size of the image.
8. Adjacent areas of light and dark should always have a separator, or have a shading so that the areas don't bleed into the background.
9. Add a 1px grey border and a drop shadow around the screenshot.

Mattermost and Representative Logos
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

1. Mattermost logo appears in the bottom left corner of the asset.
2. Use white Mattermost logo on dark backgrounds and black Mattermost logo on light backgrounds.
3. Representative logo appears on the left side of the asset below the feature title.
4. For representative logos, always confirm you are using the official version of the company’s logo. If you’re unsure, ask.
5. The space between the feature title and the representative logo should be 35px.
6. When the background color is dark, use the white/inverted version of representative logo. When the background color is light, use the dark/primary version of representative logo.
7. If the color of the representative logo is the same as the color of the title, make sure to make them distinctive from each other by slightly reducing the size of the logo.

Feature Screenshot Development
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

When taking a screenshot of a feature, use this checklist to guide your work:

1. **Profiles**: Profile pictures and real people’s names should be filled out throughout the screenshot. For the profile picture, use either normal-looking Avatars or stock photography.
2. **Content**: Show the feature in action. If you are highlighting a specific feature, try to have that screenshot focused on it rather than displaying the whole app. For example, if you are highlighting 1-1 direct message conversations, only include that conversation in your screenshot. Finally, ensure that the contents of the screenshot shows the Mattermost product in the best light - give whoever is viewing it a positive emotion.
3. **Use Cases**: Model a real world interaction. When possible, highlight DevOps use cases since they are familiar to the majority of our users.
4. **Clarity**: Avoid truncating the channel header text, or cutting off messages due to the scroll position in the center pane. All text should be fully visible.
5. **Size**: Provide screenshots that are double in size than needed - this ensures the screenshot does not rasterize on retina displays. The definite size per screenshot can vary - however, a standard will be established per type/category of the screenshot. For example, screenshots of the center pane should be 750px in size (with the shadows).
6. **Spacing**: Add additional spacing to a screenshot if necessary to highlight a feature.
7. **Calibration**: Make sure that the zoom level is at default level, and that the screenshot is not pixelated. Add a box shadow with the screenshot (0 2px 50 0 rgba(black, 0.1)), as well as a grey outline so that it looks good on both dark and light backgrounds.

Screenshot Development of Mattermost User Interface
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Screenshot development guidelines have been moved to the `Mattermost Handbook <https://handbook.mattermost.com/operations/messaging-and-math/how-to-guides-for-m-and-m/how-to-create-screenshots-and-gifs>`_.

Animated GIFs
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Animated GIFs with two images that look very similar should not be created since visually it looks like a mistake.

Step-by-Step Asset Review Guide for Ops
----------------------------------------

1. Upload the artists "work in progress" files to the `Archive Dropbox sub-folder <https://www.dropbox.com/home/marketing/Twitter/archive>`__ in `Twitter Marketing <https://www.dropbox.com/sh/13h55hakbvm7iva/AAARooC0rV8JCKBI_8VUj_tga?dl=0>`__
2. In the `Contributors team <https://community.mattermost.com/core/channels/integrations>`__, find the appropriate conversation thread for the queued project, and add a comment mentioning @jason with the following:

  - Link to the image in Dropbox
  - Proposed tweet text with a note to specify whether or not the mention in the text is the Twitter handle of the user. 

    - `@username is the Twitter account of the GitHub user` if the text uses a Twitter username, or
    - `@username is NOT the Twitter account of GitHub user` if the text doesn't use a Twitter username

  - Proposed scheduled tweet date

    - Never schedule a tweet for the 16th or 22nd of any given month as these days are reserved for Mattermost and GitLab release announcements, respectively

  - .png version of the file for a quick preview

source/archive/api4.rst METASEP
:nosearch:

Please see :doc:`updated APIv4 developer documentation <api-development-version4>`.

source/archive/api.rst METASEP
:nosearch:

.. _api:

API
=================

See the `API documentation <https://api.mattermost.com>`__.

source/archive/api-development-version4.rst METASEP
:nosearch:

APIv4 Development Process
==========================

See our complete REST API guide at `https://developers.mattermost.com/contribute/server/rest-api/ <https://developers.mattermost.com/contribute/server/rest-api/>`__. 

source/archive/android.rst METASEP
:nosearch:

Android
=======

The Mattermost Android app lets you connect to your Mattermost server and switch among teams. You can also receive push notifications on mentions in Mattermost when your mobile app is closed or running in the background. 

Getting Started 
---------------

1. Download the `Mattermost Android app from Google Play. <https://play.google.com/store/apps/details?id=com.mattermost.mattermost&hl=en>`__
2. Open the app and enter the web address of your server (for example: https://mattermost.company.com).
3. When you see the login page, log in as you would on your desktop.
4. Select a team to enter, join a team, or create a new team.

The above instructions are for Mattermost 3.0 and later. If you're running on Mattermost 2.x, you can `download the Android 2.x application file <https://releases.mattermost.com/client-android/mattermost-android-2.1.0.apk>`__ to install manually until your server is upgraded to 3.0. 

source/archive/administrator.rst METASEP
:nosearch:

Self-Managed Administrator's Guide
==================================

In-depth documentation on installation, deployment, and administration of Mattermost.

.. toctree::
   :maxdepth: 2
   :glob:
   
   /overview/architecture*
   /deployment/deployment*
      /deployment/enterprise-deployment-guide*
      /deployment/mobile-app-deployment*

Getting Started
----------------

Use the following materials as a template to help you plan and document the implementation of Mattermost at your organization.

.. toctree::
   :maxdepth: 2
   :glob:

   /help/getting-started/light-install.rst
   /getting-started/enterprise-roll-out-checklist.rst
   /deployment/on-boarding.rst
   /getting-started/implementation_plan.rst
   /getting-started/welcome_email.rst

Installing Mattermost
---------------------

Learn how to get Mattermost running on your environment.

.. toctree::
   :maxdepth: 1
   :glob:

   /install/requirements.rst
   Installing on Ubuntu 20.04 LTS </install/install-ubuntu-2004.rst>
   Installing on Ubuntu 18.04 LTS </install/install-ubuntu-1804.rst>
   Installing Mattermost Omnibus </install/mattermost-omnibus.rst>
   Installing on Kubernetes </install/install-kubernetes.rst>
   Installing on Debian Buster </install/install-debian.rst>
   Installing on RHEL 7 </install/install-rhel-7.rst>
   Installing on RHEL 8 </install/install-rhel-8.rst>
   Installing on CentOS, Oracle Linux, and Scientific Linux </install/install-centos-oracle-scientific.rst>
   Instructions On Setting Up a Socket-based Mattermost Database </install/sockets-db.rst>
   /install/ee-install*
   /install/transport-encryption/config.rst
   /install/deploy-bitnami*
   /install/docker-local*
   /install/docker-ebs*
   Installing Mattermost Team Edition in GitLab Helm Chart </install/install-mmte-helm-gitlab-helm.rst>
   /install/desktop*
   /install/desktop-managed-resources*
   /install/desktop-msi-gpo*
 
Deployment
-----------

Learn how to host Mattermost to meet your networking requirements.

.. toctree::
   :maxdepth: 2
   :glob:

   /deployment/deployment.md
   /deployment/desktop-app-deployment*
   /mobile/mobile-appconfig.rst
   /administration/image-proxy*
   /administration/encryption*
   /deployment/client-side-data.rst
   /administration/backup*
   /deployment/bleve*

Configure Mattermost
---------------------

Learn how to configure settings to meet your unique requirements.

.. toctree::
   :maxdepth: 2
   :glob:

   /administration/config-settings.rst
   /administration/config-in-database.rst
   /administration/prev-config-settings.rst
   /deployment/customize-mattermost.rst
   /deployment/customize-email.rst
   /administration/branding.rst
   /install/smtp*
   /install/config-cloudfront*
   /install/outbound-proxy.rst
   /install/i18n*
   /install/config-apache2.rst
   
Incident Collaboration
----------------------

.. toctree::
   :maxdepth: 1
   :glob:

   /administration/devops-command-center.rst

Mobile Apps
-----------

Learn how to configure and administer Mattermost apps.

.. toctree::
   :maxdepth: 2
   :glob:

   /mobile/mobile-overview.rst
   /mobile/use-prebuilt-mobile-apps.rst
   /mobile/build-custom-mobile-apps.rst
   /mobile/deploy-mobile-apps-using-emm-provider.rst
   /mobile/consider-mobile-vpn-options.rst
   /mobile/mobile-appconfig.rst
   /mobile/mobile-hpns.rst
   /mobile/mobile-faq.rst
   /mobile/mobile-troubleshoot.rst

Onboard Users
--------------

Learn how to get your users into and comfortable using Mattermost.

.. toctree::
   :maxdepth: 2
   :glob:

   /deployment/bulk-loading.rst
   /administration/migrating.md
   /administration/hipchat-migration-guidelines*
   /administration/migration-announcement-email-template*
   /administration/user-provisioning*
   /deployment/admin-roles*
   /deployment/sso-ldap.md
   /deployment/auth*
   /deployment/ldap-group-sync.rst
   /deployment/ldap-group-constrained-team-channel.rst
   /deployment/sso-saml.rst
   /deployment/sso-saml-technical*
   /deployment/sso-openidconnect.rst
   /deployment/sso-gitlab.rst
   /deployment/sso-google.rst
   /deployment/sso-office.rst
   /deployment/converting-oauth20-service-providers-to-openidconnect.rst
   /deployment/ssl-client-certificate*
   /deployment/certificate-based-authentication*
   /deployment/team-channel-management*
   /deployment/advanced*
   /deployment/permissions-backend*
   /deployment/guest-accounts*

Administration
--------------

Learn how to maintain your Mattermost system.

.. toctree::
   :maxdepth: 2
   :glob:

   /administration/command*
   /administration/mmctl-cli-tool.rst
   /administration/scripts*
   /administration/statistics.md
   /integrations/net-promoter-score*
   /administration/notices* 
   /administration/health-check*
   /administration/announcement-banner.rst
   /administration/bulk-export.rst
   /administration/generating-support-packet.rst

Troubleshooting
----------------

Understand potential issues and how to address them.

.. toctree::
   :maxdepth: 1
   :glob:

   /install/troubleshooting.rst
   /install/trouble_mysql.rst
 
Upgrade Mattermost
------------------

Learn how to keep Mattermost current with fixes and new features.

.. toctree::
   :maxdepth: 2
   :glob:
   
   /administration/upgrade.rst
   /administration/important-upgrade-notes*
   /administration/changelog*
   /help/apps/desktop-changelog*
   /administration/mobile-changelog*
   /administration/version-archive*
   /administration/extended-support-release*
   /administration/release-lifecycle*
   /administration/downgrade.rst
   /administration/open-source-components*
   /administration/release-definitions*

Mattermost Integrations
-----------------------

Learn how to extend Mattermost by integrating your workflows.

.. toctree::
   :maxdepth: 2
   :glob:

   /developer/toolkit*
   /deployment/atlassian-integrations*
   /deployment/microsoft-integrations*
   /deployment/ci-cd-tools*
   /deployment/incident-response-and-monitoring*
   /deployment/bots*
   /deployment/video-and-audio-calling*
   /deployment/productivity-tools*

Mattermost Compliance
---------------------

Learn how to adhere to your security and regulations.

.. toctree::
   :maxdepth: 2
   :glob:

   /administration/ediscovery*
   /administration/compliance*
   /administration/audit-log*
   /administration/compliance-export*
   /administration/data-retention*
   /administration/custom-terms-of-service*

Scaling Mattermost
------------------

Learn how to support growth within Mattermost.

.. toctree::
   :maxdepth: 2
   :glob:
   
   /deployment/scaling*
   /deployment/cluster*
   /deployment/elastic*
   /deployment/metrics*
   /administration/performance-alerting-guide*

Community-Managed Documentation
-------------------------------

Documentation on unofficial functionality is available on the `Mattermost Discussion Forums <https://forum.mattermost.com/c/docs/37>`__.
source/archive/action.png METASEP

source/archive/accepting-pull-request.rst METASEP
:nosearch:

This page has moved to the `Mattermost Handbook <https://handbook.mattermost.com/contributors/contributors/help-wanted>`__. 

source/archive/about-teams-channels-messages.rst METASEP
:nosearch:

About Teams, Channels, and Messages
===================================

|all-plans| |cloud| |self-hosted|

.. |all-plans| image:: ../images/all-plans-badge.png
  :scale: 30
  :target: https://mattermost.com/pricing
  :alt: Available in Mattermost Free and Starter subscription plans.

.. |cloud| image:: ../images/cloud-badge.png
  :scale: 30
  :target: https://mattermost.com/download
  :alt: Available for Mattermost Cloud deployments.

.. |self-hosted| image:: ../images/self-hosted-badge.png
  :scale: 30
  :target: https://mattermost.com/deploy
  :alt: Available for Mattermost Self-Hosted deployments.

This is a what a typical Mattermost Channels workspace looks like: 

.. image:: ../images/ui2.png
   :alt: Mattermost Channels workspace example.

Channels consists of three main components:

- Teams
- Channels
- Messages

Teams
-----

A team is a digital workspace where you and your teammates can collaborate together. Depending on how Mattermost is set up in your organization, you can belong to one team or multiple teams.

You have the ability to navigate between teams on the Team Sidebar, located on the upper left side of the app.

.. image:: ../images/teams.gif
   :alt: ui_teams

Channels
--------

Channels are used to organize conversations across different topics. Find available channels in the left-hand panel. 

There are three types of channels: Public Channels, Private Channels, and Direct Messages.

Public Channels
~~~~~~~~~~~~~~~

Public Channels are open to everyone on a team and are identified with a |globe-icon| icon. New team members are automatically added to two Public Channels when they sign up: Town Square and Off-Topic.

.. |globe-icon| image:: ../images/globe-icon.png
   :alt: A globe icon indicates a public channel.

Select the **+** button and select **Browse Channels** at the top of the channel sidebar to explore more channels to join!

Private Channels
~~~~~~~~~~~~~~~~

Private Channels are for sensitive topics and are only visible to selected team members. Any member of a Private Channel can add additional members. Channel members can choose to leave at any time, and any member of a Private Channel can remove other members from the channel. 

Private Channels are identified with a |lock-icon| icon.

.. |lock-icon| image:: ../images/lock-icon.png
   :alt: A lock icon indicates a private channel.

Direct and Group Messages
~~~~~~~~~~~~~~~~~~~~~~~~~

Direct Messages (DMs) are for conversations between two people. Group Messages (GMs) are Direct Messages that have conversations among three or more people. Both are visible only to the people involved.

See our `Managing Channels documentation <https://docs.mattermost.com/messaging/managing-channels.html>`__ for more information on Channels and how to manage them. 

Messages
--------

Sending messages and replying to messages are important ways to keep conversations active with your team. You can edit and delete messages after you have sent them. You can also use Channels to share links to any messages with other users.

In this example, a release manager is notifying teams about an upcoming release and confirming outstanding tasks:

.. image:: ../images/ui_messages.png
   :alt: Mattermost Messages

Since messaging is at the core of Mattermost Channels, here are more examples of what you can do:

- `Mention teammates so they get notified <https://docs.mattermost.com/messaging/mentioning-teammates.html>`__
- `Formatting text (styling, emojis, code, and so on) <https://docs.mattermost.com/messaging/formatting-text.html>`__
- `Share files <https://docs.mattermost.com/messaging/sharing-files.html>`__
- `Execute commands <https://docs.mattermost.com/messaging/executing-slash-commands.html>`__
- `Save <https://docs.mattermost.com/messaging/saving-messages.html>`__ and `pin <https://docs.mattermost.com/messaging/pinning-messages.html>`__ messages
- `Keyboard shortcuts <https://docs.mattermost.com/messaging/keyboard-shortcuts.html>`__

source/archive/README.md METASEP
Folder to store the embedded images for docs

source/archive/BEFORE-YOU-GET-STARTED.md METASEP
:nosearch:

# Deprecated content

The files in this folder have, for the most part, been moved to other parts of the Documentation site - or to developers.mattermost.com. However, you can still contribute to the content! Visit [developers.mattermost.com](https://developers.mattermost.com/integrate/getting-started/) to find the relevant document and submit a PR. If you can't find the **Edit on GitHub** option on the page, please note that this is a bug that's being attended to by Gitbook. In the meantime, you can edit pages directly in the repo, which you can find at [https://github.com/mattermost/mattermost-developer-documentation](https://github.com/mattermost/mattermost-developer-documentation).

Questions? Issues? Get hold of the Documentation Team in the [DWG channel](https://community.mattermost.com/core/channels/dwg-documentation-working-group).

Thank you!

source/about/vpat.rst METASEP
:orphan:

Voluntary Product Accessibility Template (VPAT) 
===============================================

.. This page is intentionally not accessible via the LHS navigation pane.

The following Voluntary Product Accessibility Template for 508 Compliance is completed per `online guidelines from the United States Department of State <https://www.section508.gov/sell/vpat/>`__.

- **Product Name**: Mattermost Enterprise Edition (including E10, E20 and all variants) 
- **Product Version Number**: Assessment applies to release 3.7 and later 
- **Vendor Company Name**: Mattermost, Inc. 
- **Vendor Contact Name**: Steve Green
- **Vendor Contact Telephone**: Please `contact Mattermost, Inc. <https://mattermost.com/contact-us/>`__ for telephone access. 

.. contents::
    :backlinks: top

Summary 
-------

A summary of Mattermost's support of 508 compliance standards is as follows:

Section 1194.21 Software Applications and Operating Systems                     

- **Level of Support and Supporting Features**: SUPPORTS for 10 criteria, NOT APPLICABLE for one criteria, SUPPORTS THROUGH EQUIVALENT FACILITATION for one criteria.  

- **Remarks and Explanations**: NOT APPLICABLE criteria references requirements for animations, which are not used in the product. SUPPORTS THROUGH EQUIVALENT FACILITATION references the use of a user's contrast and color settings at as an equivalent Mattermost can reproduce contrast and color settings in its web interface, though--like any web application--it does not draw them from a user's PC settings. 

Section 1194.22 Web-based Intranet and Internet information and Applications 

- **Level of Support and Supporting Features**: SUPPORTS for five criteria, NOT APPLICABLE for nine criteria, SUPPORTS WITH EXCEPTION for one criteria, DOES NOT SUPPORT for one criteria. 

- **Remarks and Explanations**: SUPPORTS WITH EXCEPTION refers to having 80-90% coverage of text equivalents for every non-text element, with plans to increase coverage in 2018 release. DOES NOT SUPPORT refers to readability without associated style sheet with plan to address this issue in 2018 release. 

Section 1194.23 Telecommunications Products 

- **Level of Support and Supporting Features**: NOT APPLICABLE for 14 criteria.

- **Remarks and Explanations**: Mattermost is not a telecommunications product. 

Section 1194.24 Video and Multi-media Products 

- **Level of Support and Supporting Features**: NOT APPLICABLE for five criteria.

- **Remarks and Explanations**: Mattermost is not a video or multi-media product. 

Section 1194.25 Self-Contained, Closed Products 

- **Level of Support and Supporting Features**: NOT APPLICABLE for 14 criteria.

- **Remarks and Explanations**: Mattermost is not a closed product. 

Section 1194.26 Desktop and Portable Computers 

- **Level of Support and Supporting Features**: NOT APPLICABLE for four criteria.

- **Remarks and Explanations**: Mattermost is not a desktop or portable computer. 

Section 1194.31 Functional Performance Criteria 

- **Level of Support and Supporting Features**: SUPPORTS for four criteria, NOT APPLICABLE for two criteria.

- **Remarks and Explanations**: NOT APPLICABLE due to no audio-entry for Mattermost.

Section 1194.41 Information, Documentation and Support 

- **Level of Support and Supporting Features**: SUPPORTS for three criteria.

- **Remarks and Explanations**: No additional comments. 

Section 1194.21 Software Applications and Operating Systems - Detail 
--------------------------------------------------------------------

(a) When software is designed to run on a system that has a keyboard, product functions shall be executable from a keyboard where the function itself or the result of performing a function can be discerned textually.

- **Level of Support and Supporting Features**: SUPPORTS 

- **Remarks and Explanations**: Web-based application has extensive keyboard shortcut controls along with support for tabbed interface allowing operating using keyboard only. `Definitions of keyboard shortcuts are available in product documentation <https://docs.mattermost.com/channels/keyboard-shortcuts-for-channels.html>`__. Keyboard functionality is under continuous review for opportunities for improvement. 

(b) Applications shall not disrupt or disable activated features of other products that are identified as accessibility features, where those features are developed and documented according to industry standards. Applications also shall not disrupt or disable activated features of any operating system that are identified as accessibility features where the application programming interface for those accessibility features has been documented by the manufacturer of the operating system and is available to the product developer.

- **Level of Support and Supporting Features**: SUPPORTS 

- **Remarks and Explanations**: Nothing to add. 

(c) A well-defined on-screen indication of the current focus shall be provided that moves among interactive interface elements as the input focus changes. The focus shall be programmatically exposed so that Assistive Technology can track focus and focus changes.

- **Level of Support and Supporting Features**: SUPPORTS 

- **Remarks and Explanations**: Nothing to add. 

(d) Sufficient information about a user interface element including the identity, operation and state of the element shall be available to Assistive Technology. When an image represents a program element, the information conveyed by the image must also be available in text.

- **Level of Support and Supporting Features**: SUPPORTS 

- **Remarks and Explanations**: Nothing to add. 

(e) When bitmap images are used to identify controls, status indicators, or other programmatic elements, the meaning assigned to those images shall be consistent throughout an application's performance.

- **Level of Support and Supporting Features**: SUPPORTS 

- **Remarks and Explanations**: Nothing to add. 

(f) Textual information shall be provided through operating system functions for displaying text. The minimum information that shall be made available is text content, text input caret location, and text attributes.

- **Level of Support and Supporting Features**: SUPPORTS 

- **Remarks and Explanations**: Nothing to add. 

(g) Applications shall not override user selected contrast and color selections and other individual display attributes.

- **Level of Support and Supporting Features**: SUPPORTS THROUGH EQUIVALENT FACILITATION

- **Remarks and Explanations**: Mattermost web application can be used in high contrast mode with support for use selected colors and contrast options. 

(h) When animation is displayed, the information shall be displayable in at least one non-animated presentation mode at the option of the user.

- **Level of Support and Supporting Features**: NOT APPLICABLE  

- **Remarks and Explanations**: No core functionality in the product relies on animations. While some loading indicators are animated, failure to load is documented in text with error messages. 

(i) Color coding shall not be used as the only means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.

- **Level of Support and Supporting Features**: SUPPORTS

- **Remarks and Explanations**: No indicators rely on color alone. 

(j) When a product permits a user to adjust color and contrast settings, a variety of color selections capable of producing a range of contrast levels shall be provided.

- **Level of Support and Supporting Features**: SUPPORTS

- **Remarks and Explanations**: See `full documentation <https://docs.mattermost.com/help/settings/theme-colors.html>`__.

(k) Software shall not use flashing or blinking text, objects, or other elements having a flash or blink frequency greater than 2 Hz and lower than 55 Hz.

- **Level of Support and Supporting Features**: SUPPORTS 

- **Remarks and Explanations**: Nothing to add. 

(l) When electronic forms are used, the form shall allow people using Assistive Technology to access the information, field elements, and functionality required for completion and submission of the form, including all directions and cues.

- **Level of Support and Supporting Features**: SUPPORTS 

- **Remarks and Explanations**: Nothing to add. 

Section 1194.22 Web-based Intranet and Internet information and Applications - Detail 
-------------------------------------------------------------------------------------

(a) A text equivalent for every non-text element shall be provided (e.g., via "alt", "longdesc", or in element content).

- **Level of Support and Supporting Features**: SUPPORTS WITH EXCEPTION  

- **Remarks and Explanations**: 80-90% supported, full supported expected in 2018 release. 

(b) Equivalent alternatives for any multimedia presentation shall be synchronized with the presentation.

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product. 

(c) Web pages shall be designed so that all information conveyed with color is also available without color, for example from context or markup.

- **Level of Support and Supporting Features**: SUPPORTS 

- **Remarks and Explanations**: Nothing to add. 

(d) Documents shall be organized so they are readable without requiring an associated style sheet.

- **Level of Support and Supporting Features**: DOES NOT SUPPORT 

- **Remarks and Explanations**: This functionality is planned for 2018 release. 

(e) Redundant text links shall be provided for each active region of a server-side image map.

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product. 

(f) Client-side image maps shall be provided instead of server-side image maps except where the regions cannot be defined with an available geometric shape.

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product. 

(g) Row and column headers shall be identified for data tables.

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product. 

(h) Markup shall be used to associate data cells and header cells for data tables that have two or more logical levels of row or column headers.

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product. 

(i) Frames shall be titled with text that facilitates frame identification and navigation

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product. 

(j) Pages shall be designed to avoid causing the screen to flicker with a frequency greater than 2 Hz and lower than 55 Hz.

- **Level of Support and Supporting Features**: SUPPORTS 

- **Remarks and Explanations**: Nothing to add. 

(k) A text-only page, with equivalent information or functionality, shall be provided to make a web site comply with the provisions of this part, when compliance cannot be accomplished in any other way. The content of the text-only page shall be updated whenever the primary page changes.

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Compliance criteria is supported, therefore text-only page is not provided. 

(l) When pages utilize scripting languages to display content, or to create interface elements, the information provided by the script shall be identified with functional text that can be read by Assistive Technology.

- **Level of Support and Supporting Features**: SUPPORTS 

- **Remarks and Explanations**: Nothing to add. 

(m) When a web page requires that an applet, plug-in, or other application be present on the client system to interpret page content, the page must provide a link to a plug-in or applet that complies with 1194.21(a) through (l).

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product. 

(n) When electronic forms are designed to be completed on-line, the form shall allow people using Assistive Technology to access the information, field elements, and functionality required for completion and submission of the form, including all directions and cues.

- **Level of Support and Supporting Features**: SUPPORTS 

- **Remarks and Explanations**: Nothing to add. 

(o) A method shall be provided that permits users to skip repetitive navigation links.

- **Level of Support and Supporting Features**: SUPPORTS

- **Remarks and Explanations**: Keyboard shortcuts can skip repetitive navigation links.

(p) When a timed response is required, the user shall be alerted and given sufficient time to indicate more time is required.

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product. There are no timed responses used in the system. 

Section 1194.23 Telecommunications Products - Detail
----------------------------------------------------

(a) Telecommunications products or systems which provide a function allowing voice communication and which do not themselves provide a TTY functionality shall provide a standard non-acoustic connection point for TTYs. Microphones shall be capable of being turned on and off to allow the user to intermix speech with TTY use.

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product.

(b) Telecommunications products which include voice communication functionality shall support all commonly used cross-manufacturer non-proprietary standard TTY signal protocols.

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product.

(c) Voice mail, auto-attendant, and interactive voice response telecommunications systems shall be usable by TTY users with their TTYs.

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product.

(d) Voice mail, messaging, auto-attendant, and interactive voice response telecommunications systems that require a response from a user within a time interval, shall give an alert when the time interval is about to run out, and shall provide sufficient time for the user to indicate more time is required.

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product.

(e) Where provided, caller identification and similar telecommunications functions shall also be available for users of TTYs, and for users who cannot see displays.

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product.

(f) For transmitted voice signals, telecommunications products shall provide a gain adjustable up to a minimum of 20 dB. For incremental volume control, at least one intermediate step of 12 dB of gain shall be provided.

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product.

(g) If the telecommunications product allows a user to adjust the receive volume, a function shall be provided to automatically reset the volume to the default level after every use.

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product.

(h) Where a telecommunications product delivers output by an audio transducer which is normally held up to the ear, a means for effective magnetic wireless coupling to hearing technologies shall be provided.

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product.

(i) Interference to hearing technologies (including hearing aids, cochlear implants, and assistive listening devices) shall be reduced to the lowest possible level that allows a user of hearing technologies to utilize the telecommunications product.

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product.

(j) Products that transmit or conduct information or communication, shall pass through cross-manufacturer, non-proprietary, industry-standard codes, translation protocols, formats, or other information necessary to provide the information or communication in a usable format. Technologies which use encoding, signal compression, format transformation, or similar techniques shall not remove information needed for access or shall restore it upon delivery.

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product.

(k)(1) Products which have mechanically operated controls or keys shall comply with the following: Controls and Keys shall be tactilely discernible without activating the controls or keys.

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product.

(k)(2) Products which have mechanically operated controls or keys shall comply with the following: Controls and Keys shall be operable with one hand and shall not require tight grasping, pinching, twisting of the wrist. The force required to activate controls and keys shall be five lbs. (22.2N) maximum.

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product.

(k)(3) Products which have mechanically operated controls or keys shall comply with the following: If key repeat is supported, the delay before repeat shall be adjustable to at least two seconds. Key repeat rate shall be adjustable to two seconds per character.

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product.

(k)(4) Products which have mechanically operated controls or keys shall comply with the following: The status of all locking or toggle controls or keys shall be visually discernible, and discernible either through touch or sound.

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product.

Section 1194.24 Video and Multi-media Products - Detail  
-------------------------------------------------------

a) All analog television displays 13 inches and larger, and computer equipment that includes analog television receiver or display circuitry, shall be equipped with caption decoder circuitry which appropriately receives, decodes, and displays closed captions from broadcast, cable, videotape, and DVD signals. As soon as practicable, but not later than July 1, 2002, widescreen digital television (DTV) displays measuring at least 7.8 inches vertically, DTV sets with conventional displays measuring at least 13 inches vertically, and stand-alone DTV tuners, whether or not they are marketed with display screens, and computer equipment that includes DTV receiver or display circuitry, shall be equipped with caption decoder circuitry which appropriately receives, decodes, and displays closed captions from broadcast, cable, videotape, and DVD signals.

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product.

(b) Television tuners, including tuner cards for use in computers, shall be equipped with secondary audio program playback circuitry.

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product.

(c) All training and informational video and multimedia productions which support the agency's mission, regardless of format, that contain speech or other audio information necessary for the comprehension of the content, shall be open or closed captioned.

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product.

(d) All training and informational video and multimedia productions which support the agency's mission, regardless of format, that contain visual information necessary for the comprehension of the content, shall be audio described.

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product.

(e) Display or presentation of alternate text presentation or audio descriptions shall be user-selectable unless permanent.

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product.

Section 1194.25 Self-Contained, Closed Products - Detail 
--------------------------------------------------------

(a) Self-contained products shall be usable by people with disabilities without requiring an end-user to attach Assistive Technology to the product. Personal headsets for private listening are not Assistive Technology.

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product.

(b) When a timed response is required, the user shall be alerted and given sufficient time to indicate more time is required.

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product.

(c) Where a product utilizes touchscreens or contact-sensitive controls, an input method shall be provided that complies with 1194.23 

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product.

(d) When biometric forms of user identification or control are used, an alternative form of identification or activation, which does not require the user to possess particular biological characteristics, shall also be provided.

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product.

(e) When products provide auditory output, the audio signal shall be provided at a standard signal level through an industry standard connector that will allow for private listening. The product must provide the ability to interrupt, pause, and restart the audio at any time.

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product.

(f) When products deliver voice output in a public area, incremental volume control shall be provided with output amplification up to a level of at least 65 dB. Where the ambient noise level of the environment is above 45 dB, a volume gain of at least 20 dB above the ambient level shall be user selectable. A function shall be provided to automatically reset the volume to the default level after every use.

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product.

(g) Color coding shall not be used as the only means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product.

(h) When a product permits a user to adjust color and contrast settings, a range of color selections capable of producing a variety of contrast levels shall be provided.

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product.

(i) Products shall be designed to avoid causing the screen to flicker with a frequency greater than 2 Hz and lower than 55 Hz.

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product.

(j) (1) Products which are freestanding, non-portable, and intended to be used in one location and which have operable controls shall comply with the following: The position of any operable control shall be determined with respect to a vertical plane, which is 48 inches in length, centered on the operable control, and at the maximum protrusion of the product within the 48 inch length on products which are freestanding, non-portable, and intended to be used in one location and which have operable controls.

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product.

(j)(2) Products which are freestanding, non-portable, and intended to be used in one location and which have operable controls shall comply with the following: Where any operable control is 10 inches or less behind the reference plane, the height shall be 54 inches maximum and 15 inches minimum above the floor.

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product.

(j)(3) Products which are freestanding, non-portable, and intended to be used in one location and which have operable controls shall comply with the following: Where any operable control is more than 10 inches and not more than 24 inches behind the reference plane, the height shall be 46 inches maximum and 15 inches minimum above the floor.

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product.

(j)(4) Products which are freestanding, non-portable, and intended to be used in one location and which have operable controls shall comply with the following: Operable controls shall not be more than 24 inches behind the reference plane.

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product.

Section 1194.26 Desktop and Portable Computers - Detail 
-------------------------------------------------------

(a) All mechanically operated controls and keys shall comply with 1194.23 (k) (1) through (4).

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product.

(b) If a product utilizes touchscreens or touch-operated controls, an input method shall be provided that complies with 1194.23 (k) (1) through (4).

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product.

(c) When biometric forms of user identification or control are used, an alternative form of identification or activation, which does not require the user to possess particular biological characteristics, shall also be provided.

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product.

(d) Where provided, at least one of each type of expansion slots, ports and connectors shall comply with publicly available industry standards

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: Functionality described in this requirement is not included in the product.

Section 1194.31 Functional Performance Criteria – Detail
--------------------------------------------------------

(a) At least one mode of operation and information retrieval that does not require user vision shall be provided, or support for Assistive Technology used by people who are blind or visually impaired shall be provided.

- **Level of Support and Supporting Features**: SUPPORTS

- **Remarks and Explanations**: Made available via browser.

(b) At least one mode of operation and information retrieval that does not require visual acuity greater than 20/70 shall be provided in audio and enlarged print output working together or independently, or support for Assistive Technology used by people who are visually impaired shall be provided.

- **Level of Support and Supporting Features**: SUPPORTS 

- **Remarks and Explanations**: Increasing Zoom level in Mattermost web app can be used to fulfill this requirement. 

(c) At least one mode of operation and information retrieval that does not require user hearing shall be provided, or support for Assistive Technology used by people who are deaf or hard of hearing shall be provided

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: There is no functionality relying on audio only. 

(d) Where audio information is important for the use of a product, at least one mode of operation and information retrieval shall be provided in an enhanced auditory fashion, or support for assistive hearing devices shall be provided.

- **Level of Support and Supporting Features**: NOT APPLICABLE 

- **Remarks and Explanations**: There is no functionality relying on audio only. 

(e) At least one mode of operation and information retrieval that does not require user speech shall be provided, or support for Assistive Technology used by people with disabilities shall be provided.

- **Level of Support and Supporting Features**: SUPPORTS 

- **Remarks and Explanations**: No speech-only interfaces in Mattermost. 

(f) At least one mode of operation and information retrieval that does not require fine motor control or simultaneous actions and that is operable with limited reach and strength shall be provided.

- **Level of Support and Supporting Features**: SUPPORTS 

- **Remarks and Explanations**: System can be operated with computer keyboard only, which can meet stated requirements when in accessibility mode. 

Section 1194.41 Information, Documentation and Support – Detail
---------------------------------------------------------------

(a) Product support documentation provided to end-users shall be made available in alternate formats upon request, at no additional charge

- **Level of Support and Supporting Features**: SUPPORTS 

- **Remarks and Explanations**: Full documentation publicly available at https://docs.mattermost.com 

(b) End-users shall have access to a description of the accessibility and compatibility features of products in alternate formats or alternate methods upon request, at no additional charge.

- **Level of Support and Supporting Features**: SUPPORTS 

- **Remarks and Explanations**: This documentation include links to all relevant accessibility and compatibility options, including theme colors and keyboard shortcuts. 

(c) Support services for products shall accommodate the communication needs of end-users with disabilities.

- **Level of Support and Supporting Features**: SUPPORTS

- **Remarks and Explanations**: Mattermost Enterprise Edition support available via email. 

source/about/subscription.rst METASEP
Subscription overview
=====================

Mattermost offers features through `Mattermost Professional and Mattermost Enterprise subscription plans <https://www.mattermost.com/pricing>`__. Your plan subscription determines what features you have access to. When choosing a subscription, you can choose the deployment type as self-hosted or Cloud. 

Mattermost self-hosted deployments require a license subscription key to be applied to access features in the Professional or Enterprise plans. Mattermost offers a `secure self-service Customer Portal <https://customers.mattermost.com>`__ where you can purchase and manage your Mattermost self-hosted subscription. When you complete the purchase process, a license key is generated. Please see :doc:`Self-hosted subscriptions </about/self-hosted-subscriptions>` for more details.

Mattermost Cloud is a software-as-a-service product. You can sign up for free, forever, with Mattermost Starter. Then, start a free 30-day Mattermost Enterprise trial, to explore paid features. Please see :doc:`Cloud subscriptions </about/cloud-subscriptions>` for more details.

Mattermost Nonprofit License program
--------------------------------------

The Mattermost Nonprofit License enables eligible charities, open source projects, and nonprofit organizations to apply the benefits of the self-hosted Mattermost Professional offering towards advancing their missions with special nonprofit pricing.

What's included?
~~~~~~~~~~~~~~~~~

A three-year subscription to our Mattermost Professional self-hosted offering for up to 1,000 users with a subscription fee of $250 USD. Upon acceptance of these terms, Mattermost has the right to place the name and logo of the nonprofit or charitable institution on our website and in our marketing materials.

Following the three-year free subscription, the institution can renew the license every three years for an additional $250 USD subscription fee.

Who's eligible?
~~~~~~~~~~~~~~~~

To be eligible, an organization needs to be an official nonprofit or charity; as well as non-government, non-academic, and non-commercial in nature, with no religious affiliation; and that would otherwise be unable to afford the commercial version of Mattermost software. If your organization doesn’t fit this description, we suggest that you purchase a `commercial license <https://mattermost.com/pricing/>`__ instead.

How to apply?
~~~~~~~~~~~~~

To apply for the Mattermost Nonprofit License, `please complete this form <https://docs.google.com/forms/d/e/1FAIpQLSe2OUQGOQAni74FBXgAOooYsUTGbLn_VXFYEKUthg9Wmmiebg/viewform>`__.

Mattermost educational license program
---------------------------------------

For academic licensing, please see: https://mattermost.com/education/

Frequently asked questions
--------------------------

Are my credit card details safe?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

We use `Stripe <https://stripe.com/payments>`__ and `Solupay <https://www.solupay.com/>`__ to process credit card transactions. We do not store any credit card details at any stage. Payments made by credit card are authenticated using `3D Secure <https://www.sc.com/bn/ways-to-bank/3d-secure-faq/>`__, which is PCI-DSS compliant.

Should you wish to make payment using another method, please contact our `Billing team <mailto:AR@mattermost.com>`__.

Why do I need to provide my name and physical address when purchasing a subscription?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost is a U.S. corporation and, therefore, all business we do is governed by the laws of the United States, in addition to the local laws wherever we are doing business. 

The United States has a number of export control regulations implemented to protect national security interests and to promote its foreign policy objectives. Based on these regulations, U.S. companies are prohibited from doing business with specific countries which have been embargoed by the U.S. government. They are also prohibited from exporting certain items to certain countries that have been sanctioned by the U.S. government. In addition, U.S. companies are prohibited from doing business with specific people and/or companies that have been named and listed by the U.S. government. 

In order to comply with these requirements, Mattermost must collect the name and physical address of all individuals and companies it does business with so that it can comply with the U.S. export controls regulations.

What does Mattermost do with this information?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The information you provide is used for a screening process. There are two different purposes for screening: 

- One screening is to ensure against exports of certain restricted goods to countries that are embargoed. In our case, goods refer to our software that has encryption in it.
- The other screening is against people and companies. There are certain people and companies that the government has put on a list (the Denied Party List) that US companies are prohibited from doing any business with for various reasons. They could be terrorists, be on a terrorist watch list, could be helping finance terrorists, could be participating in human rights violations, etc. If they are on the Denied Party List, we are not able to do any business with them.

Who are the sanctioned people, companies, and entities?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The Office of Foreign Assets Control (OFAC) maintains a list of sanctioned entities. Some examples include:

- Terrorists
- Banks or other financial institutions that are involved in financing terrorism
- Companies or people that have been involved in human or drug trafficking
- Organizations that have been sanctioned for human rights violations

This will also include people in violation of government contracts because of our business with the U.S. government. Individuals and Companies do not end up on the Denied Party List based on the country they live in but by their actions and conduct.

What does “physical address” mean for software that will be used in many places?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

In this case, the "physical address" is the location where the individual, who will be receiving the license key, is physically located and will be able to access the software for installation.

How is a user defined for subscriptions?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

For the purpose of billing, a “user” is any account created in Mattermost that has not been deactivated by the System Administrator. You can see your user count for billing purposes from the System Console on the **Site Statistics** page under “Total Active Users”. Guests are also defined as users. 

Do I need to pay for deactivated users?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

No. If you deactivate a user, that user is not counted as an active user during your annual renewal process. You can deactivate users manually via the System Console, and also via Active Directory/LDAP synchronization, the mmctl tool, and the server APIs.

If you choose to pull SQL reports from the database to monitor individual activity to make deactivation decisions, and you are running under high user load, we recommend the reports are pulled from a read replica of the database.

Which features are affected when my subscription expires?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The affected features include, but are not limited to, the following:

.. csv-table::
    :header: "Feature", "How it's affected", "What steps do I need to take?"

    "Elasticsearch", "Elasticsearch is automatically disabled and will start using the default database for indexing posts.", "None needed."
    "AD/LDAP, SAML SSO, Office 365 SSO, and Google SSO", "Login options are no longer provided on the sign-in page. Users who previously signed in with one of these methods are no longer able to.
    
    Users who were already signed in can continue to use Mattermost until their session expires or until they log out.", "Users must be migrated to email authentication via **System Console > Users**. Select the drop-down menu for the relevant member, choose **Switch to Email/Password**, enter a new password, and choose **Reset**."
    "AD/LDAP", "Groups in the database are retained but cannot be used. Memberships are frozen in state for group synced teams/channels.
    
    Mentions for AD/LDAP groups are not shown in the autocomplete menu.
    
    Group mentions are no longer highlighted in text and do not trigger new notifications.", "Use `mmctl <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-group>`__ to modify group sync settings for the team/channel."
    "High Availability", "High Availability is disabled. If all nodes in a cluster continue running, the nodes will stop communicating and caches will get out of sync. This is likely to cause delays in messages, notifications, etc.", "None needed."
    "Performance monitoring", "Monitoring is disabled and Grafana will no longer update with new data.", "None needed."
    "Compliance exports", "Jobs are no longer scheduled in the job server. Data is not exported.", "None needed."
    "Data retention", "Jobs are no longer scheduled in the job server. Data is not deleted.", "None needed."
    "Custom terms", "Custom terms no longer displayed to end users on login. Data is retained in the Terms of Service database table.", "None needed."
    "Custom announcement banners", "No longer visible and is replaced by the default announcement banner.", "None needed."
    "Multi-factor authentication (MFA)", "MFA is no longer enforced/required for new accounts but remains enabled for those who configured it.", "None needed."
    "Permissions", "Permissions are retained in the database in a frozen state and cannot be modified in the System Console.", "Use `mmctl <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-permissions>`__ to reset permissions to default."
    "Guest accounts", "Guests that are not actively logged in are prevented from logging in. Guests who are actively logged in are able to use Mattermost until their session expires or they log out.", "None needed."
    
Is there a maximum number of users per subscription?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

No, there is no limit to the subscription value or number of users you can purchase per plan.

What happens if my department buys a Mattermost subscription and then central IT buys a high volume subscription that also covers my department?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost subscriptions and support benefits are per production instance.

When the subscription for your department's production instance expires, you can either discontinue your department's production instance and move to the instance hosted by central IT (which can optionally provision one or more teams for your department to control), or you can renew your subscription to maintain control of your department's instance (e.g., to configure or customize the system in a manner highly specific to your line-of-business) in addition to using the instance from central IT.

source/about/self-hosted-subscriptions.rst METASEP
Self-hosted subscriptions
=========================

Buy a subscription
------------------

You can buy a Mattermost subscription via the `Customer Portal page <https://customers.mattermost.com>`__. If you haven't created an account yet, follow the steps provided. Otherwise, you can log in with your existing credentials. When you buy a Mattermost subscription for a self-hosted deployment, you'll receive an activation license.

Once you're logged in:

1. Choose a subscription, and enter the number of users in the **Order summary** field. This indicates the number of users you can have on this subscription's instance. For more information about how users are defined, see our `FAQ <https://mattermost.com/pricing-self-managed/#faq>`__.
2. (Optional for Enterprise subscriptions) You can add `Premier Support <https://mattermost.com/support/>`__. This is an additional cost and is automatically added to your order total.
3. Select **Next Step**.
4. Enter your billing and payment information.
5. Accept the **Terms**.
6. Select **Complete**.
7. Choose **Download the license key**.

.. note::
   If you experience any problems with your transaction, please contact our Support Team via the Customer Portal. If possible, keep the error message/number that you received on hand as it may help with their investigation.

Once downloaded, your Mattermost license is ready to use and be applied via the Mattermost System Console.

.. image:: ../images/mattermost_enterprise_license.png
	:alt: Apply the Mattermost Enterprise license using the System Console.

System Admin access is required in order to apply the license. If you're not a Mattermost System Admin, contact your organization's Mattermost System Admin for assistance.

**If you already have Mattermost installed**

On the Customer Portal **Subscriptions** page, select **Download License** to download the license key for your subscription. In Mattermost, follow the steps provided in **System Console > About > Edition and License** to apply your license key.

You can also use the `mmctl <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-license>`__ to apply the license.

**If you don't have Mattermost installed**

If you haven't yet installed and deployed a Mattermost instance, visit the `Deployment Guide <https://docs.mattermost.com/deploy/deployment-overview.html>`__ to get started. For information on creating a System Admin account, visit our `Administrator Tasks <https://docs.mattermost.com/getting-started/admin-onboarding-tasks.html>`__ documentation.

View subscription information
-----------------------------

Self-hosted subscriptions purchased via the `Customer Portal <https://customers.mattermost.com>`__ are stored and listed in the Customer Portal.

Here you can view license details, including their start date, end date and licensed number of users, and have full access to your billing history, making it easier to manage purchases and renewal dates.

You can access your Customer Portal account to view information about your:

- Subscription purchases
- Licenses
- Customer Portal account password
- Organization information
- Payment methods
- Renewals
- Active users (available in a future release)

Subscription and licenses not purchased via the Customer Portal won't be listed.

Add more users to a subscription
--------------------------------

To add more users to your existing subscription, `contact us <https://mattermost.com/contact-us/>`__.

When you subscribe to an annual plan with Mattermost, you agree to provide quarterly reports of the actual number of registered users within your system if you're above the amount you subscribed in your purchase order. A registered user is a user who has an account in a workspace and does not show as *Inactive* in **System Console > User Management > Users**.

We'll send you an email notice around the end of the quarter reminding you to send us your report. To send this report, take a screenshot of **System Console > Site Statistics** and send in a reply email back to us. Please ensure your screenshot is taken from the top of the page and includes the **Total Active Users** metric.

.. image:: ../images/Site_Statistics.png
	:alt: Take a screenshot from the System Console > Site Statistics page.

If you have more total active users than you purchased in your annual subscription, we'll provide you with an invoice and an amendment to your purchase order for the new users added. The additional invoice will be pro-rated based on the number of months left in your subscription term, including the months for the calendar quarter for the time you pull the report. We will not provide downward adjustments. Mattermost will invoice based on Mattermost’s `current list prices <https://mattermost.com/pricing/>`__.

Renew a subscription
--------------------

From Mattermost Server v5.32 and later, you can renew your self-hosted Mattermost subscription with a credit card if you have a standard Mattermost contract. When you renew your license, you can also increase the number of active users.

If you haven't upgraded to v5.32, you can contact Mattermost Support at support@mattermost.com to renew your license.

If you're a reseller, have a non-standard contract, or want to adjust the number of active users on your license during the license period, please contact Mattermost Sales at sales@mattermost.com.

System Admins will be alerted 60 days prior to license expiry via a banner in Mattermost. Select **Renew license now** to start the renewal process in the Customer Portal. You can also dismiss the banner and renew your license at a later date via **System Console > Edition and License**.

When you select **Renew license now**, you're taken to the renewal page in the Customer Portal, which lists your license information and account details. This is pre-populated based on the email address associated with your existing license subscription.

**To process your license renewal**

1. Enter your **Account Details**, **Additional Contact**, and **Payment Details**.
2. Confirm the `Mattermost Edition <https://mattermost.com/pricing-self-managed>`_.

  * You can upgrade within the Customer Portal, but it's not possible to downgrade.

3. Confirm the listed number of active users is correct. 

 * You can increase the number of licensed users, but you can't decrease it.

4. Select **Complete purchase**. 

An email with the new license key and information on how to upload the license in the System Console will be sent to the email address provided.

You can watch a video overview of the renewal process on `YouTube <https://www.youtube.com/watch?v=Sz_1nhVufHY>`__.

.. raw:: html
  
   <iframe width="560" height="315" src="https://www.youtube.com/embed/Sz_1nhVufHY" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>

Frequently asked questions
~~~~~~~~~~~~~~~~~~~~~~~~~~

How do I renew my subscription if I don't have internet access?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

If you don't have access to the internet, please email support@mattermost.com for assistance.

Can I use the same license key on multiple self-hosted servers?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

License keys for unlocking the advanced features in Mattermost can only be applied to a single deployment. A deployment consists of either a single Mattermost server or multiple linked Mattermost servers in a High Availability configuration with access to a single database.

Customers who are eligible to purchase the `Premier Support add-on <https://mattermost.com/support/>`__ are licensed to run with a single deployment of Mattermost license key in production and up to four non-production deployments of Mattermost (for example: development, staging, user acceptance testing, etc.)

Is my license key available immediately?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Yes, once your payment is successfully processed your license is available to download immediately.

How will I know when to renew my subscription?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

You'll be notified 60 days prior to your subscription expiry, via a blue banner displayed at the top of your Mattermost window. This banner is only visible to System Admins.

You can select **Renew license now** to begin the renewal process. You can also select the **x** to dismiss the notification. The notification is reactivated when your browser is refreshed or you reload the Mattermost Desktop App.

How long does it take to renew a subscription?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Once you’ve started the renewal process, we'll be in contact with you to confirm your order and send you the order form. There may be additional paperwork required. Once we have the signed order form and (if applicable) the necessary paperwork from you, we're able to process the renewal and issue your license key within 24 hours.

What happens to my subscription if I don't renew in time?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

If you don't renew within the 60-day renewal period, a 10-day grace period is provided. During this period your Mattermost installation runs as normal, with full access to commercial features. During the grace period, the notification banner is not dismissable.

When the grace period expires, your Professional or Enterprise plan is downgraded to the Starter plan and other plan features are disabled.
 
What happens when my subscription expires?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

If you don't renew within the 10-day grace period, your Mattermost version is automatically downgraded to Starter plan so you can still access and use Mattermost. However, subscription features will no longer be available, and if you are currently using them, the functionality will no longer be accessible.

When you renew, the subscription features will become available with the previous configuration (provided no action such as user migration has been taken).

Why can't I dismiss the expiry notification banner?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

If there's a red expiry announcement banner stating: "Enterprise license is expired and some features may be disabled. Please contact your System Administrator for details." it means your grace period has expired. This announcement banner persists until the license is renewed, and is visible to all users.

Once a new license is applied, the banner will no longer be visible.

If you don't plan to renew your subscription, revoke the expired license in **System Console > Edition and License**.

Can other members of my organization use the Customer Portal account to manage our subscription?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

We currently support a single account/user per organization. The ability to add multiple users per organization will be available in a future release.

Where can I find the license agreement for Mattermost Enterprise Edition?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Mattermost Enterprise Edition is the name for the binary of the Mattermost self-hosted Professional and Enterprise editions. This edition can be used for free without a license key as commercial software functionally equivalent to the open source Mattermost Team Edition licensed under MIT. When a license key is purchased and applied to Mattermost Enterprise Edition, additional features unlock. The license agreement for Mattermost Enterprise Edition is included in the software and also available `here <https://mattermost.com/enterprise-edition-license/>`__.

How do I delete my Customer Portal account?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Please contact Mattermost Support for assistance with deleting your Customer Portal account.

What happens to my subscription when I delete my account?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

When an account is deleted, the license key remains valid. When the subscription is close to expiring, you'll need to create a new profile in order to renew it.

source/about/security.rst METASEP
Security overview
==================

Security in Mattermost software is continually reviewed by developers, IT administrators, and security researchers accountable for deploying the software in their organizations.

Multiple rounds of penetration testing and security analysis, in addition to internal reviews, have produced a long list of safeguards, processes, policies, and compliance features:

.. contents::
    :backlinks: top

To expand on each:

Security features
------------------

Mattermost offers a host of features to help keep your private cloud communications secure.

Private Cloud deployment with secure mobile apps
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- Mattermost can run entirely behind your firewall as a single Linux binary, as a Docker container, or on your Kubernetes cluster with MySQL or PostgreSQL as database. Remote access can be enabled through the use of `VPN clients on PC and mobile devices <https://docs.mattermost.com/deploy/deployment-overview.html#behind-a-vpn>`__ so that Mattermost can be used outside your private network.
- Mattermost mobile apps can be deployed to an `internal Enterprise App Store <https://docs.mattermost.com/deploy/deploy-mobile-apps-using-emm-provider.html>`__ by using source code available for Mattermost mobile apps and push notification service. 
- Optionally, the provided Mattermost Mobile Apps can be used when the Mattermost server is reachable through the internet on port 443. In this configuration, you have the option of using compiled `iOS and Android applications in iTunes and Google Play provided by Mattermost, Inc. <https://docs.mattermost.com/deploy/mobile-hpns.html>`__ (Mattermost Enterprise and Mattermost Professional).
- User sessions across web, PC, and mobile can be `remotely revoked through profile settings <https://docs.mattermost.com/messaging/manage-profile-settings.html#view-and-logout-of-active-sessions>`__, or via the System Console by deactivating accounts.
- Mattermost apps can be packaged into leading Enterprise Mobility Management solutions including AirWatch and Blackberry through `AppDome <https://www.appdome.com/>`__.

Centralized security and administration
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- Manage users, teams, access control, and system settings in a web-based `System Console user interface <https://docs.mattermost.com/configure/configuration-settings.html>`__.
- Centralized authentication through AD/LDAP and SAML (Mattermost Enterprise and Mattermost Professional).
- Synchronize users and groups through the built-in `AD/LDAP integration <https://docs.mattermost.com/onboard/ad-ldap.html>`_ (Mattermost Enterprise).

Transmission security
~~~~~~~~~~~~~~~~~~~~~~

- Mattermost supports TLS encryption using AES-256 with 2048-bit RSA on all data transmissions between Mattermost client applications and the Mattermost server across both LAN and internet.
- Connections to Active Directory/LDAP can be optionally secured with TLS or stunnel (Mattermost Enterprise and Mattermost Professional).
- Encryption-at-rest is available for messages via hardware and software disk encryption solutions applied to the Mattermost database, which resides on its own server within your infrastructure. To enable end user search and compliance reporting of message histories, Mattermost does not offer encryption within the database.
- Encryption-at-rest is available for files stored via hardware and software disk encryption solutions applied to the server used for local storage or storage via MinIO.
- Encryption-at-rest is available for files stored in Amazon's proprietary S3 system using server-side encryption with `Amazon S3-managed keys <https://docs.mattermost.com/configure/configuration-settings.html#enable-server-side-encryption-for-amazon-s3>`__ (Mattermost Enterprise) when users choose not to use open source options.
- Option to `exclude message contents from push notifications <https://docs.mattermost.com/configure/configuration-settings.html#push-notification-contents>`__ to comply with strict compliance policies, such as US HIPAA standards.
- Ability to exclude or include the `contents of messages in push notifications <https://docs.mattermost.com/configure/configuration-settings.html#push-notification-contents>`__ to avoid disclosure on locked mobile screens, and via relay servers from Apple and Google when sending notifications to iOS or Android mobile apps (relevant to compliance standards such as HIPAA).

Integrity and audit controls
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- By default, Mattermost stores a complete history of messages, including edits and deletes, along with all files uploaded. User interface actions for "deleting" messages and channels remove the data only from the user interface; the data is retained within your database. If your compliance guidelines require it, you can turn off users' ability to edit and delete their messages after they are posted.
- Use an `antivirus plugin <https://github.com/mattermost/mattermost-plugin-antivirus>`__ to scan for viruses before uploading a file to Mattermost. Supports `ClamAV anti-virus software <https://www.clamav.net/>`__ across browser, Desktop App, and Mobile Apps.
- Custom `data retention policies on messages and file uploads <https://docs.mattermost.com/comply/data-retention-policy.html>`__ is available (Mattermost Enterprise). A daily data deletion job can be scheduled that deletes messages from the database and user interface, and file uploads from local file storage or Amazon S3, which exceed the specified retention period.
- The `output and archives of server logs <https://docs.mattermost.com/configure/configuration-settings.html#file-log-directory>`__ can be saved to a directory of your choice. Mattermost server logs plus logs from your web proxy can provide an end-to-end history of system usage.
- `Ad hoc compliance reports of messaging by user, date range, and keyword, including edited and deleted messages <https://docs.mattermost.com/comply/compliance-reporting-oversight.html>`__ are available (Mattermost Enterprise). To protect against unauthorized use, all ad hoc report requests are logged.
- Daily compliance reports compatible with third-party compliance solutions such as `Global Relay and Actiance <https://docs.mattermost.com/comply/compliance-export.html>`__ are also available (Mattermost Enterprise).

Authentication safeguards
~~~~~~~~~~~~~~~~~~~~~~~~~~

- To protect against brute force attacks, you can set `rate limiting on APIs <https://docs.mattermost.com/configure/configuration-settings.html#rate-limiting>`__, varied by query frequency, memory store size, remote address, and headers.
- Session length, session cache, and idle timeout can be `configured according to your internal policies <https://docs.mattermost.com/configure/configuration-settings.html#session-lengths>`__, automatically forcing a user to re-login after a specified period of time.
- Remotely `revoke user sessions <https://docs.mattermost.com/messaging/managing-account-settings.html#view-and-logout-of-active-sessions>`__ across web, mobile devices, and native desktop apps. User sessions can also be revoked remotely by a System Admin in **System Console > Users**.
- Session fixation, where an attacker can trick the user to authenticate with a known session cookie, does not affect Mattermost users as a new session cookie is set at each login.
- Remotely reset user passwords via the System Console or via the `command line <https://docs.mattermost.com/manage/command-line-tools.html#mattermost-user-password>`__.
- Mattermost supports integrated authentication with `Active Directory and LDAP <https://docs.mattermost.com/onboard/ad-ldap.html>`__ (Mattermost Enterprise and Mattermost Professional) as well as `SAML 2.0 SSO integration <https://docs.mattermost.com/onboard/sso-saml.html>`__ with providers including `Active Directory Federation Services <https://docs.mattermost.com/onboard/ad-ldap.html#configure-ad-ldap-deployments-with-multiple-domains>`__,  `Okta <https://docs.mattermost.com/onboard/sso-saml-okta.html>`__, among others (Mattermost Enterprise and Mattermost Professional).
- The ability to require `multi-factor authentication <https://docs.mattermost.com/onboard/multi-factor-authentication.html>`__ is also available (Mattermost Enterprise and Mattermost Professional).

Access control policy
~~~~~~~~~~~~~~~~~~~~~~

To prevent account enumeration, if a user logs in and enters incorrect login details a generic error is presented.

Security is a top concern for organizations who deploy Mattermost in a private network. While running under existing policies and auth protocols of the private network, we prioritize a better user experience (telling a user what went wrong on login) ahead of preventing users on the private network from enumerating accounts.

Mattermost is optimized to be deployed in a highly secure environment. However, admins are given a choice as to the deployment environment.

When Mattermost is deployed outside a firewall, Admins must be aware that their system is exposed to issues inherent in public cloud deployments. In this case, we generally follow the standards of leading online services. For example, Gmail offers APIs that not only confirm whether an email account exists, but also displays the user's profile picture by default.

Mattermost undergoes extensive penetration testing, security reviews, and `security updates <https://mattermost.com/security-updates/>`__. You can find further details and previous discussion `in our GitHub thread <https://github.com/mattermost/platform/issues/4321#issuecomment-258832013>`__. In addition, the following policies are provided:

- Limit communications to specific users, private channels, or team-wide public channels.
- Increase system security `by restricting email-based account creation to email addresses from a list of specific domains, <https://docs.mattermost.com/configure/configuration-settings.html#restrict-account-creation-to-specified-email-domains>`__ e.g. "corp.mattermost.com", "mattermost.com", etc."
- Choose whether to restrict or enable `cross-origin requests <https://docs.mattermost.com/configure/configuration-settings.html#enable-cross-origin-requests-from>`__.
- If sharing of public links for account creation or sharing of files and images are enabled, links can be invalidated via the System Console by `regenerating salts <https://docs.mattermost.com/configure/configuration-settings.html#public-link-salt>`__.
- Optionally add `advanced passwords requirements <https://docs.mattermost.com/configure/configuration-settings.html#password-requirements>`__ with minimum numbers of symbols, numbers, lower, and uppercase letters.
- Optionally restrict `creation, renaming, archiving of channels, Private channels, and integrations to Team Admins, System Admins, or end users <https://docs.mattermost.com/administration/config-settings.html#policy-enterprise>`__ (Mattermost Enterprise and Mattermost Professional).

Security updates
-----------------

Security updates address newly discovered attacks reported to Mattermost, Inc. by the security research community. Disclosures are made confidentially, under the Mattermost responsible disclosure policy, allowing for Mattermost, Inc. to provide security updates to the community prior to public disclosure.

For more information, please see:

- `Mattermost Security Updates Disclosures <https://mattermost.com/security-updates/>`__
   - A summary of security updates made based on past and on-going security analysis and penetration testing.

- `Mattermost Responsible Disclosure Policy <https://mattermost.com/security-vulnerability-report/>`__
   - An overview of how security issues are confidentially reported to and addressed by Mattermost, Inc.

Security policies
-----------------

For information on internal security policies, development guidelines, business continuity plans, and common security-related questions from enterprises, please see our `Security Policies <https://handbook.mattermost.com/operations/operations/company-policies/security-policies>`__ documentation.

Moreover, Mattermost performs a penetration test on the software no less than once per twelve (12) month period. Customers may request a copy of any penetration test results upon five (5) days' written notice at any time, but no more than once per twelve (12) month period.

HIPAA compliance*
-----------------

Deploying Mattermost as part of a HIPAA-compliant IT infrastructure requires a deployment team trained on `HIPAA-compliance requirements and standards <http://www.hhs.gov/hipaa/for-professionals/security/laws-regulations/>`__.

- Mattermost offers HIPAA-relevant **Technical Safeguards** including:

   - `Integrity Controls <https://docs.mattermost.com/about/security.html#integrity-and-audit-controls>`__
   - `Access Control <https://docs.mattermost.com/about/security.html#access-control-policy>`__
   - `Transmission Security <https://docs.mattermost.com/about/security.html#transmission-security>`__
   - `Audit Controls <https://docs.mattermost.com/about/security.html#integrity-and-audit-controls>`__

- HIPAA-compliant deployments commonly consider the following:

   - Omitting the contents of messages from mobile push and email notifications:

      - If your `Push Notifications Contents <https://docs.mattermost.com/configure/configuration-settings.html#push-notification-contents>`__ option is set to ``Send full message snippet`` there is a chance Personal Health Information (PHI) contained in messages could be displayed on a user's locked phone as a notification. To avoid this, set the option to ``Send generic description with user and channel names`` or ``Send generic description with only sender name``.
      - Similarly, setting `Email Notifications Contents <https://docs.mattermost.com/configure/configuration-settings.html#email-notification-contents>`__ to ``Send generic description with only sender name`` will only send the team name and name of the person who sent the message, with no information about channel name or message contents included in email notifications.

- Beyond Technical Safeguards, HIPAA compliance deployments also require:

   - Administrative Safeguards
   - Physical Safeguards
   - Organizational requirements and other standards.

To learn more, please review `HIPAA requirements from the US Department of Health and Human Services <http://www.hhs.gov/hipaa/for-professionals/security/laws-regulations/>`__.

FINRA compliance*
------------------

Mattermost Enterprise features help users to meet the `cybersecurity requirements of the United States Financial Industry Regulatory Authority (FINRA) <http://www.finra.org/industry/cybersecurity>`__ as part of a customer's existing operational systems, including technology governance, system change management, risk assessments, technical controls, incident response, vendor management, data loss prevention, and staff training.

FINRA reviews a firm’s ability to protect the confidentiality, integrity, and availability of sensitive customer information. This includes reviewing each firm’s compliance with SEC regulations, including:

- Regulation `S-P (17 CFR §248.30) <https://www.ecfr.gov/cgi-bin/text-idx?SID=226b4b62d8bf25d29cc88df5039cddde&mc=true&node=se17.4.248_130&rgn=div8>`__, which requires firms to adopt written policies and procedures to protect customer information against cyber-attacks and other forms of unauthorized access.

- Regulation `S-ID (17 CFR §248.201-202) <https://www.ecfr.gov/cgi-bin/text-idx?SID=5621786ec1a831400e4b64f3e92198bd&mc=true&node=pt17.4.248&rgn=div5#sp17.4.248.c>`__, which outlines a firm's duties regarding the detection, prevention, and mitigation of identity theft.

- The `Securities Exchange Act of 1934 (17 CFR §240.17a-4(f)) <https://www.ecfr.gov/cgi-bin/text-idx?SID=b6b7a79d18d000a733725e88d333ddb5&mc=true&node=pt17.4.240&rgn=div5#se17.4.240_117a_64>`__, which requires firms to preserve electronically stored records in a non-rewriteable, non-erasable format.

Mattermost supports FINRA compliance as part of a customer's integrated operations in the following ways:

- **Continuous archiving:** Configuration as a non-rewriteable, non-erasable system of record for all messages and files entered into the system. Moreover, automated compliance exports and integration support for Smarsh/Actiance and Global Relay provide third-party eDiscovery options.
- **Secure deployment:** Deployment within private, public, and on-premises networks with existing FINRA-compliant safeguards and infrastructure to protect customer information from cyber attack.
- **Support for intrusion detection:** Ability to support multi-layered intrusion detection from authentication systems to application servers to database access, including configuration of proxy, application, and database logging to deeply audit system interactions.
- **Multi-layered disaster recovery:** High Availability configuration, automated data back up, and enterprise information archiving integration to prevent data loss and recover from disaster.

***DISCLAIMER:** MATTERMOST DOES NOT POSITION ITS PRODUCTS AS “GUARANTEED COMPLIANCE SOLUTIONS”. WE MAKE NO GUARANTEE THAT YOU WILL ACHIEVE REGULATORY COMPLIANCE USING MATTERMOST PRODUCTS. YOUR LEVEL OF SUCCESS IN ACHIEVING REGULATORY COMPLIANCE DEPENDS ON YOUR INTERPRETATION OF THE APPLICABLE REGULATION, AND THE ACTIONS YOU TAKE TO COMPLY WITH THEIR REQUIREMENTS. SINCE THESE FACTORS DIFFER ACCORDING TO INDIVIDUALS AND BUSINESSES, WE CANNOT GUARANTEE YOUR SUCCESS, NOR ARE WE RESPONSIBLE FOR ANY OF YOUR ACTIONS. NO GUARANTEES ARE MADE THAT YOU WILL ACHIEVE ANY SPECIFIC COMPLIANCE RESULTS FROM THE USE OF MATTERMOST OR FROM ANY RECOMMENDATIONS CONTAINED ON OUR WEBSITES, AND AS SUCH, THIS SHOULD NOT BE A SUBSTITUTE TO CONSULTING WITH YOUR OWN LEGAL AND COMPLIANCE REPRESENTATIVES ON THESE MATTERS.

source/about/product.rst METASEP
Mattermost overview
===================

**Mattermost** is an open source platform for secure communication, collaboration, and orchestration of work across teams and tools.

Mattermost is built specifically for software development and engineering use cases and integrates deeply with a rich ecosystem of third-party developer tools. Mattermost gives companies full control over their data; with self-hosted and private cloud deployment options and access to the source code, developers can contribute directly to a shared, flexible, and extensible platform built just for them.

We support key developer collaboration use cases:

- **Agile software development** for developers who build and operate software to provide higher productivity. Technical features and deep integrations with the tools developers use support all phases of agile software development including planning, building, releasing, and operating.

- **Developer workflow orchestration** for senior technical roles and Engineering/IT management in companies that consider software development mission-critical. We make their digital enterprise operations successful with advanced developer workflows and integration with mission-critical applications at scale.

- **Incident resolution** for developer teams responding to time-critical incidents that provide faster time-to-resolution and less error-prone incident response with continuous process improvement.

- **Secure collaboration** for InfoSec and CIO/CISO in companies that require the highest levels of security, privacy, compliance, and data control. We provide an on-premise, self-hosted collaboration solution that is fully secured, highly customizable, and managed internally with strict access controls, and integrates easily with in-house security/compliance frameworks that can’t be achieved with SaaS. 

The Mattermost platform
------------------------

Mattermost is an integrated platform of productivity tools that provides workflow orchestration and eliminates context switching between. Mattermost offers solutions incorporating channel-based communication, structured workflow execution, and project workflows. The platform provides a single secure deployment, shared user management, and a common user experience with a comprehensive toolset enabling enterprise-grade collaboration.

The platform is fully extensible by design, supporting a rich ecosystem of third-party applications and integrations. Mattermost is easily enhanced and customized using open APIs, developer frameworks, open source customizations, and community-driven enhancements. Mattermost also supports 20 languages to meet the needs of global teams.

Collaboration workflows addressed by Mattermost
-----------------------------------------------

The Mattermost platform integrates three primary tools that cover a wide range of collaboration use cases. Each tool focuses on a primary workflow and can be used seamlessly in combination for real-time collaboration and for processes and projects with durations ranging from days to months.

Use Channels to stay connected and support your communication workflows
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Channel-based communication workflows require real-time information sharing, flexibility, and ad hoc activities where the life cycle of communication workflows is typically measured in seconds to hours.

`Channels <https://docs.mattermost.com/guides/channels.html>`__ enable you to organize your team’s real-time 1:1 and group communications with an unlimited and fully searchable message history. Share materials such as files, images, links; share sentiments with emojis and GIFs; and express ideas with rich markdown formatting, code syntax highlighting, and multi-language support. Facilitate face-to-face connections with integrated voice/video conferencing. Channels are ideal for bug triage, daily standups, posting announcements, and team conversations.

.. image:: ../images/Channels_Hero.png
   :alt: An example of the Mattermost Channels screen that includes teams, the channel sidebar, an active conversation in the center pane, reply threads in the right-hand pane.

Use Playbooks to support your prescribed workflows and trust the process
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Structured workflows are specific scenarios and use cases that require a reliable and repeatable process. These use cases lend themselves well to shared checklists, automation, and retrospectives where the life cycle is measured in hours to weeks. Some examples include incident collaboration and software releases.

`Playbooks <https://docs.mattermost.com/guides/playbooks.html>`__ streamline complex, recurring processes that enable teams to achieve a specific and predictable outcome. Orchestrate prescribed workflows with built-in checklists, triggers, automation, tool integrations, and retrospectives. Increase stakeholder visibility with status updates and cumulative statistics. Customize a playbook to align with organizational practices, and adjust on the fly to respond quickly in highly dynamic situations. Playbooks are critical in incident collaboration to avoid and minimize costly business disruptions, and in software release processes to ship high-quality software on time. 

.. image:: ../images/Playbooks_Hero.png
   :alt: An example of the Mattermost Playbooks screen that includes active run details in the right-hand pane.
   
Use Boards to hit your milestones and support your project workflows
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Project workflows include use cases driving milestone achievement such as project planning, execution, and task management where teams require alignment on a shared set of tasks, milestones, and goals. Typical life cycles for project workflows are measured in weeks to months. Project workflows can include various scopes, from introducing a new product or feature to planning a team offsite.

`Boards <https://docs.mattermost.com/guides/boards.html>`__ is a deliverable and task management solution to help teams achieve project milestones using a familiar kanban board structure. Align work across the organization, and invest time and effort into what matters most. Stay on schedule with clearly defined tasks, owners, checklists, and deadlines. Increase transparency and keep all resources available including documents, images, and links. Additionally, boards are perfect for tracking tasks for sprints and features in roadmap planning.

.. image:: ../images/Boards_Hero.png
   :alt: An example of the Mattermost Boards screen that includes a project status board and cards organized by status.

About the Mattermost open source project
-----------------------------------------

At its core, Mattermost is an open source alternative to proprietary SaaS collaboration for teams. The software, developed in partnership with thousands of contributors from around the world, is designed to increase the agility, efficiency, and innovation in high trust organizations while keeping data and operations under IT control.

Core committers, including both community contributors and paid staff at Mattermost, Inc., determine the project roadmap. For enterprises with needs beyond the scope of the open-source project, commercial plans are available from Mattermost, Inc. Partnership with our core committer community, along with revenue from our commercial plans, which ensures the continued improvement of all editions.

source/about/orchestration.rst METASEP
:orphan:

Deployment solution programs 
============================

.. This page is intentionally not accessible via the LHS navigation pane.

Mattermost's **Deployment Solutions Programs** help IT administrators understand how Mattermost is being offered in third-party deployment solutions, including other open source projects as well as in commercial solutions.

This is an optional program for third-party developers to increase awareness about their work and to enable Mattermost to refer its communities to different solutions.

Any person or any company interested in discussing deployment solutions with Mattermost can join the `Deployment Solutions discussion channel <https://community.mattermost.com/core/channels/installers-and-images>`__ on the Mattermost community server to speak to peers and Mattermost community managers.

Deployment solutions are recognized by Mattermost at three-levels:

- **Community Deployment Solutions** - Basic orchestration solutions for Mattermost, typically from the open source community or hosting companies who let us know about their work. The work of partners is included in blog posts and on social media as a benefit to the user and customer communities.

   Examples:

   - `Puppet deployment solution for Mattermost <https://forge.puppet.com/liger1978/mattermost>`__ by Richard Grainger
   - `Heroku deployment solution for Mattermost <https://chrisdecairos.ca/deploying-mattermost-to-heroku/>`__ by Christopher De Cairos

- **Registered Deployment Solutions** - Orchestration solutions that follow detailed Mattermost guidelines on keeping up-to-date with the latest Mattermost version and security updates (typically a one-line change), linking to official documentation, supporting branding guidelines, and maintaining a changelog. This level of engagement allows Mattermost to more prominently promote the work, knowing that it's committed to meeting explicit standards.

- **Certified Deployment Solutions** - These solutions meet all the requirements of Registered Deployment Solutions, with the addition that they'll automate the version upgrade and security update processes (typically a one-line change). There is the added benefit that when Mattermost announces new versions and security updates, we can also announce the availability of updates to Certified Deployment Solutions.

To summarize the commitment level of different solutions:

==================================  ========= =========== ===========
Deployment Solution Requirement     Community Registered  Certified 
==================================  ========= =========== ===========
Installation                        Yes       Yes         Yes
----------------------------------  --------- ----------- -----------
Minimum Documentation               Yes       Yes         Yes 
----------------------------------  --------- ----------- -----------
Security Updates                              Yes         Yes 
----------------------------------  --------- ----------- -----------
Branding                                      Yes         Yes
----------------------------------  --------- ----------- -----------
Upgrade                                                   Yes
==================================  ========= =========== ===========

Requirement details are outline below:

Deployment solution program requirements 
----------------------------------------

Installation 
~~~~~~~~~~~~

1. **Installation is designed for officially supported operating systems and platforms**. EXCEPTION: RHEL equivalents (CentOS, Amazon Linux, Oracle Linux, Scientific Linux) are acceptable as long as the exception is noted in README or equivalent with ``This deployment uses [OPERATING_SYSTEM] as an equivalent to the officially supported version of Red Hat Enterprise Linux.``

2. **Automated installation passes basic testing**. After installation run the following manual tests:

  1) Create a new user account and use that account to create a new team and post to Town Square channel.
  2) Create a second user account and join the newly created team and reply to first user's post in Town Square.
  3) Go back to first user account and post reply with an image attached.
  4) Confirm there are no errors and no blue bar at the top of the screen with "Mattermost unreachable error" (which would indicate websocket configuration error).

Documentation 
~~~~~~~~~~~~~

1. **Include link to official Mattermost documentation**. README or equivalent contains statement ``Please see https://docs.mattermost.com for official documentation.``

  Include the following information in text, markdown, HTML or other format. Square brackets [] indicate optional statements depending on the configuration of your solution:
 
      This deployment solution installs [and upgrades] a Mattermost server to provide secure, private cloud messaging for teams and enterprises. More information is available at: https://mattermost.com
 
      Following automated deployment, the following steps are required to make your system production-ready:
      
      - [Configure SSL for Mattermost](https://docs.mattermost.com/install/config-ssl-http2-nginx.html)
      - [Configure SMTP email for Mattermost](https://docs.mattermost.com/configure/smtp-email.html)

2. **Unofficial deployment options should be documented**. Unofficial deployment configurations, such as use of Linux operating systems that are not officially supported, should be documented in the README.

Security updates 
~~~~~~~~~~~~~~~~

1. **Document commitment to providing security updates.** README or equivalent states `We highly recommend users subscribe to the Mattermost security updates email list. When notified of a security update, the maintainers of this deployment solution will make an effort to update to the secure version within 10 days.`

2. **Commit to making an effort for your deployment to provide the latest security update within 10 days of announcement**. This is typically a one-line change.

Branding 
~~~~~~~~

1. **Support Mattermost branding and naming guidelines**. To ensure naming is clear across deployment solutions, README or equivalent should contain ``The name for this deployment solution in the context of [Mattermost branding guidelines](https://handbook.mattermost.com/operations/operations/publishing/publishing-guidelines/brand-and-visual-design-guidelines) is `[NAME] for Mattermost by [CREATOR]`.`` For example, ``Multi-node Docker deployment solution for Mattermost by John Doe``. This is the name that will be used to refer to your work in Mattermost community materials.

Upgrade 
~~~~~~~

1. **Support upgrade of Mattermost**. Enable user interface or command line upgrade of a Mattermost deployment to latest version based on `upgrade procedure when Mattermost is embedded <https://docs.mattermost.com/developer/integration-faq.html#how-should-i-automate-the-install-and-upgrade-of-mattermost-when-included-in-another-application>`__

source/about/integrations.rst METASEP
Integrations overview
=====================

Mattermost provides a variety of methods to add functionality and customize the end-user experience to suit your organization’s needs, whether you want to add new user capabilities with slash commands, build an advanced chatbot, or completely change the functionality of your server.

A wide array of open source integrations are available and ready to use from Mattermost and our community. To see a list of open source integrations please see the `Mattermost Integrations Directory <https://mattermost.com/marketplace/>`__.

For self-hosted deployments in small setups, you might host integrations on the same server on which Mattermost is installed. For larger deployments, you can set up a separate server for integrations, or add them to the server on which the external application is hosted. For example, if you’re self-hosting a Jira server, you could deploy a Jira integration on the Jira server itself. When self-hosting restrictions are less strict, AWS, Heroku, and other public cloud options can also be used.

You can customize Mattermost with the following capabilities and frameworks.

Custom Apps
-----------

Apps are lightweight, interactive add-ons that can be written in any language and run on any HTTP-compatible hosting service. They enable you to connect with external services and build interactions that users can easily follow and work across the Mattermost web app, desktop app, and mobile app.   

Prebuilt apps are available on the `Mattermost Marketplace <https://mattermost.com/marketplace/>`__, or you can `build your own custom app <https://developers.mattermost.com/integrate/apps/>`_.

API 
----

Mattermost provides complete access to `server APIs <https://api.mattermost.com/>`__, along with language-specific drivers to integrate into your own applications.  Interact with users, channels, and everything else that happens on your Mattermost server via a REST API that meets the OpenAPI specification. The API is for developers who want to build bots and other interactions that don’t rely on customizing the Mattermost user experience.

`View the Mattermost API Reference <https://api.mattermost.com/>`__.

Plugins 
-------

Plugins are the most comprehensive way to add new features and customization to self-hosted Mattermost deployments. These powerful integrations are written in Go and React and they’re ideal for customers wanting to change the behavior of the Mattermost server, desktop, and web apps without forking the core codebase to suit their organization’s needs.

Prebuilt plugins are available on the `Mattermost Marketplace <https://mattermost.com/marketplace/>`__, or you can `build your own plugin <https://developers.mattermost.com/integrate/plugins/>`__.

.. note::
    Custom Mattermost plugins aren't available in Mattermost Cloud deployments - you are limited to the plugins that are available in the Cloud Marketplace.

Bots
-----

You can deploy interactive bots to help users with processes and tasks with Mattermost by  issuing messages to users they can respond to using buttons and dropdown menus. Bots can be used together with apps and plugins. The Hubot open source project, created by GitHub, Inc., is among the most popular of the bot options.

Prebuilt bots are available on the `Mattermost Marketplace <https://mattermost.com/marketplace/>`__, or you can `configure your own bots <https://developers.mattermost.com/integrate/admin-guide/admin-bot-accounts/>`__.

Learn about `Mattermost Hubot integration (hubot-matteruser on npm) <https://www.npmjs.com/package/hubot-matteruser>`__ and `other open source community bots available <https://integrations.mattermost.com/>`__ or you can `build your own <https://docs.mattermost.com/integrations/cloud-bot-accounts.html>`_.

Custom slash commands
---------------------

A `slash commands <https://docs.mattermost.com/channels/run-slash-commands.html>`__ is similar to an `outgoing webhooks <https://developers.mattermost.com/integrate/admin-guide/admin-webhooks-outgoing/>`__, but instead of listening to a channel, it's used as a command tool in a channel.

Slash commands enable users to trigger custom actions, such as creating Jira tickets or GitHub pull requests within Mattermost channels. See the `built-in slash commands <https://developers.mattermost.com/integrate/admin-guide/admin-slash-commands/#built-in-commands>`__ and the `custom slash command <https://developers.mattermost.com/integrate/admin-guide/admin-slash-commands/#custom-slash-command>`__ developer documentation to learn more.

.. tip::
    The Mattermost slash command format is compatible with Slack's format, so you can easily port commands from Slack. 

Learn about `Mattermost slash commands <https://docs.mattermost.com/messaging/extending-messaging-with-integrations.html#slash-commands>`__.

Webhooks
--------

A webhook is a way for one app to send real-time data to another app. In Mattermost, `incoming webhooks <https://developers.mattermost.com/integrate/admin-guide/admin-webhooks-incoming/>`__ receive data from external applications and make a post in a specified channel. They’re great for setting up notifications when something happens in an external application.

`Outgoing webhooks <https://developers.mattermost.com/integrate/admin-guide/admin-webhooks-outgoing/>`__ take data from Mattermost, and send it to an external application. Then the outgoing webhook can post a response back in Mattermost. They’re great for listening in on channels, and then notifying external applications when a trigger word is used.

.. tip::

    Mattermost webhooks are "Slack-compatible”. This means that Mattermost accepts integrations that have a payload in the same format as Slack. In an application that already supports Slack webhooks, you can replace the Slack webhook URL with a Mattermost webhook URL and the integration will “just work”. 
    
    If you have an integration that outputs a payload in a different format, you need to write an intermediate application to act as a translation layer to change it to the format Mattermost uses. Since there’s currently no general standard for webhook formatting, this is unavoidable and just a part of how webhooks work.

Source code customizations
--------------------------
As an open source project, we support your ability to modify the source code for the server or web app to make changes and customizations to meet your specific needs. 

Learn about `forking our open source repositories <https://developers.mattermost.com/integrate/other-integrations/customization/>`__.
source/about/frequently-asked-questions.rst METASEP
Frequently asked questions (FAQ)
=================================

.. toctree::
    :maxdepth: 2
    :hidden:

    faq-general.rst
    Community questions <faq-community>
    Notifications <faq-notifications>
    Video, audio, and screen sharing <faq-video-audio-screensharing>
    Enterprise questions <faq-enterprise>
    License questions <faq-license>
    Integrations <faq-integrations>
    Use cases <faq-use-cases>
    Product questions <faq-product>
    High trust questions <faq-high-trust>
    Design decisions <faq-design-decisions>
    Business questions <faq-business>
    Illicit use <faq-illicit-use>

The following pages will answer many of your frequently asked questions about Mattermost:

* :doc:`General questions <faq-general>` - Learn more about Mattermost, its largest deployment, and answers to commonly asked questions.
* :doc:`Community questions <faq-community>` - Learn about contributing to Mattermost and about adding yourself to the Mattermost page on Linked In.
* :doc:`Notifications <faq-notifications>` - What determines whether notifications are triggered?
* :doc:`Video, audio, and screen sharing <faq-video-audio-screensharing>` - What's available for video and audio calling and screen sharing?
* :doc:`Enterprise questions <faq-enterprise>` - Learn about Mattermost Enterprise Edition.
* :doc:`License questions <faq-license>` - Learn more about Mattermost licenses.
* :doc:`Integrations <faq-integrations>` - Can messaging functionality be added to a propietary SaaS service? 
* :doc:`Use cases <faq-use-cases>` - Learn how Mattermost supports various use cases.
* :doc:`Product questions <faq-product>` - Which features are available on different Mattermost clients?
* :doc:`High trust questions <faq-high-trust>` - Learn about Mattermost trust benefits and the challenges of Massive, Multi-Tenant Applications.
* :doc:`Design decisions <faq-design-decisions>` - Learn why Mattermost discloses whether or not an account exists when users enter an incorrect password.
* :doc:`Business questions <faq-business>` - Can you create an open source derivative work of Mattermost?
* :doc:`Illicit use <faq-illicit-use>` - Learn how to report illicit use of Mattermost software.

source/about/faq-video-audio-screensharing.rst METASEP
Video, audio, and screen sharing questions
==========================================

What support is available for video and audio calling and screen sharing?
-------------------------------------------------------------------------

Our `Marketplace <https://mattermost.com/marketplace/>`__ has several integrations to connect by voice or video call, or to share your screen with team members in Mattermost.

You can learn more about the most popular options, including self-hosted on-prem, self-hosted private cloud solutions, and vendor-hosted SaaS solutions (e.g. SIP PBX, Zoom, and Skype for Business), also in our Marketplace.

Note that you can also neatly link video, audio and screensharing solutions, like Zoom and Skype for Business, to channels by using markdown formatting in the channel header. Example: ``[Click for video call](https://link_to_solution)``.
source/about/faq-use-cases.rst METASEP
Use case questions
==================

Does Mattermost support external guests?
----------------------------------------

Yes, the Guest Account feature allows organizations to collaborate with external users within a controlled environment. See the `Guest Accounts documentation <https://docs.mattermost.com/onboard/guest-accounts.html>`__ for more information.

Can I use Mattermost for customer service?
-------------------------------------------

You are welcome to use the open source Mattermost Team Edition and its extensive API library to build your own solution.

Mattermost Enterprise Edition is designed for self-hosted, enterprise-grade communication. It's not recommended for primarily providing customer service or customer support, and does not currently offer a licensing model nor technical advice for this use case.

If you'd like to create an open source derivative version of Mattermost using the ``/mattermost-server`` source code to support your use case, please see below.

Does Mattermost have an official website-based plugin to offer anonymous chat to visitors?
------------------------------------------------------------------------------------------

Not yet. You can `upvote the feature proposal online <https://mattermost.uservoice.com/forums/306457-general/suggestions/8810731-implement-a-site-chat-feature>`__ to add your support. If you create such a plugin, we would love to see it open sourced and made available to the community.
source/about/faq-product.rst METASEP
Product questions
=================

What features are available on different Mattermost clients?
------------------------------------------------------------

The following chart highlights the end user features of Mattermost and their support across Web, Desktop, and Mobile applications (iOS and Android).

**Legend:**

* X - Full Support
* O - Partial support

.. csv-table::
    :header: "Feature", "Web", "Desktop", "Mobile"

    **MESSAGES**
    "Threaded messages", "X", "X", "X"
    "Markdown", "X", "X", "O"
    "Emojis", "X", "X", "X"
    "Emoji reactions", "X", "X", "X"
    "Viewing emoji reactions", "X", "X", "X"
    "File sharing", "X", "X", "X"
    "@ mentions", "X", "X", "X"
    "Hashtags", "X", "X", "X"
    "Search (with in:, from:, before:, on: and after:)", "X", "X", "X"
    "Search highlighting", "X", "X"
    "View/marking pinned or saved posts", "X", "X", "X"
    "Image link previews", "X", "X", "X"
    "Website previews", "X", "X", "X"
    "Notifications", "X", "X", "X"
    "**CHANNELS**"
    "Create a new channel", "X", "X", "X"
    "Join a channel", "X", "X", "X"
    "Leave a channel", "X", "X", "X"
    "Favorite a channel", "X", "X", "X"
    "Mute a channel", "X", "X", "X"
    "Manage members", "X", "X", "X"
    "Add members", "X", "X", "X"
    "Edit channel", "X", "X", "X"
    "Archive members", "X", "X", "X"
    **TEAMS**
    "Multi-team support for notifications", "X", "X", "X"
    "Team switching", "X", "X", "X"
    "Team-based theming", "X", "X", "X"
    "Team settings", "X", "X"
    "Join existing team", "X", "X", "X"
    "Create a new team", "X", "X"
    "Get team invite link", "X", "X",
    "Add members to team", "X", "X",
    "Manage team members", "X", "X",
    "Leave team", "X", "X"
    **FOCALBOARD**
    "Boards, cards, and views", "X", "O"
    **INTEGRATIONS**
    "Slash commands", "X", "X", "O"
    "Server-side plugins", "X", "X", "X"
    "User interface plugins", "X", "X",
    "Oauth applications", "X", "X", "X"
    "Incoming webhooks", "X", "X", "X"
    "Outgoing webhooks", "X", "X", "X"
    "Message attachments", "X", "X", "X"
    "Message buttons", "X", "X", "X"
    "Message menus", "X", "X", "X"
    **AUTHENTICATION**
    "Email-password login", "X", "X", "X"
    "AD/LDAP", "X", "X", "X"
    "SAML SSO", "X", "X", "X"
    "GitLab SSO", "X", "X", "X"
    "Office 365 SSO", "X", "X", "X"
    "Google SSO", "X", "X",
    **OTHER**
    "Localization for 16 languages", "X", "X", "X"
    "Custom user interface themes", "X", "X", "X"
    "User profile settings", "X", "X", "X"
    "Channel settings", "X", "X", "X"

..  _feature-quality-levels:

What feature quality levels does Mattermost have?
--------------------------------------------------

We strive to release viable features. This means that we put in a significant amount of effort to ensure we solve a use case with a high bar for quality. A feature that's viable and meets our criteria for our production quality levels will be released to production.

However, when working on large and complex features or new products, we may need to test them with a high volume of customers and users. For these scenarios, we'll release them as experimental or beta and implement feature flags and/or A/B testing to validate the effectiveness of features prior to production-level release.

We dogfood our features on our community server and provide many configuration options that ensure customers can opt-in when trying experimental or beta features.

This list describes the quality levels of Mattermost features, and what can be expected at each level.

Production Level Quality
- Recommended for use in production environments
- Eligible for commercial support by `Mattermost, Inc. <https://mattermost.com/support/>`__
- Detailed documentation is available
- Tested on several platforms

Beta Level Quality
- Support best-effort only. `Premier Support <https://mattermost.com/support/>`__ is recommended for use in production environments
- Core functionality is stable, but iteration based on feedback is ongoing
- Detailed documentation may not be available yet
- Data schema may not be complete, and may require manual migrations to future versions

Experimental Level Quality
- Not recommended for use in production
- Unknown level of stability
- Feature set covers a small or specific set of use cases. Additional use and edge cases will be added over time
- Data loss can occur as data schemas and configurations may change
- Minimal documentation is available
source/about/faq-notifications.rst METASEP
Notifications questions
=======================

What determines if a desktop notification should be triggered?
--------------------------------------------------------------

Desktop notifications are triggered under to following conditions. Click to expand the flow chart.

.. image:: ../images/desktop_notification_chart.png
  :alt: A flow diagram shows how Mattermost Desktop App notifications are triggered when a message is posted.
  :width: 239px
  :height: 232px

What determines if an email notification should be triggered?
-------------------------------------------------------------

Email notifications are triggered under to following conditions. Click to expand the flow chart.

.. image:: ../images/email_notification_chart.png
  :alt: A flow diagram shows how Mattermost email notifications are triggered when a message is posted.
  :width: 239px
  :height: 232px

What determines if a mobile push notification should be triggered?
-------------------------------------------------------------------

Mobile push notifications are triggered under to following conditions. Click to expand the flow chart.

.. image:: ../images/push_notification_chart.png
  :alt: A flow diagram shows how Mattermost mobile push notifications are triggered when a message is posted.
  :width: 239px
  :height: 232px

.. _tpns:

Are mobile push notifications free?
-----------------------------------

Yes, push notifications are free if you compile your own `push-proxy service <https://github.com/mattermost/mattermost-push-proxy>`__. Push notifications are also free if you use the hosted Test Push Notification Service (TPNS) provided by Mattermost, Inc.

TPNS, hosted at `https://push-test.mattermost.com <https://push-test.mattermost.com>`__, offers transport-level encryption, but not production-level service level agreements (SLAs).

If you need production-level SLAs for push notifications, you can either compile your own push-proxy service, with your own key, or you can use a paid option and become a Mattermost Professional subscriber `agreeing to our Conditions of Use <https://mattermost.com/terms-of-use/>`__, which enables you to use a production-level Hosted Push Notification Service (HPNS) at ``https://push.mattermost.com``.

Learn more about `our mobile apps and push notification service <https://docs.mattermost.com/deploy/mobile-hpns.html>`__.

source/about/faq-integrations.rst METASEP
Integration questions
=====================

Can I use Mattermost to add messaging functionality to my proprietary SaaS service?
------------------------------------------------------------------------------------

Mattermost is an open source, self-hosted alternative to proprietary SaaS services that lock in the data of users and customers.

While you're welcome to use the Mattermost source code under its open source license, Mattermost, Inc. does not offer support or technical advice for proprietary SaaS projects that result in customers potentially being paywalled from their data should they stop paying SaaS fees.

To learn more about why we strongly believe that users and customers should always have access to their data, please read `why we created Mattermost <https://mattermost.com/about-us/>`__.

What's the difference between incoming and outgoing webhooks?
-------------------------------------------------------------

A webhook is a way for one app to send real-time data to another app.

In Mattermost, incoming webhooks receive data from external applications and make a post in a specified channel. They're great for setting up notifications that are sent into a Mattermost channel when something happens in an external application.

Outgoing webhooks are triggered based on a rule in Mattermost and takes data (the message, and some contextual info) from Mattermost and send it to an external application. The receiving server of the outgoing webhook can then post a response back in Mattermost. They're great for listening for a specific word, and then notifying external applications when a trigger word is used.

What's a slash command?
-----------------------

A slash command is similar to an outgoing webhook, but instead of listening to a channel it is used as a command tool. This means if you type in a slash command it will not be posted to a channel, whereas an outgoing webhook is only triggered by posted messages.

What does Slack-compatible mean?
--------------------------------

Slack compatible means that Mattermost accepts integrations that have a payload in the same format as Slack's legacy "Message Attachment" payload. If you have a Slack integration, you should be able to set it up in Mattermost without changing the format of the message being sent over.   

What if I have a webhook from somewhere other than Slack?
---------------------------------------------------------

If you have an integration that outputs a payload in a different format, you need to write an intermediate application, such as N8N.io, Zapier, or Integromat, to act as a translation layer to change it to the format Mattermost uses. Since there’s currently no general standard for webhook formatting, this is unavoidable and just a part of how webhooks work.

If there's no translation layer, Mattermost won't understand the data you're sending.

What are attachments?
---------------------

When "attachments" are mentioned in Mattermost integrations documentation, it refers to Slack's message attachments functionality. These "attachments" can be optionally added as an array in the data sent by an integration, and are used to customize the formatting of the message.

Mattermost doesn't currently support the ability to attach files to a post made via webhook. You can use the API to attach files to a message if needed. 

Where can I find existing integrations?
---------------------------------------

[Visit the Mattermost Marketplace](https://mattermost.com/marketplace) to access open source integrations to common tools like Jira, Jenkins, and GitLab, along with interactive bot applications, and other communication tools that are freely available for use and customization. 

Alternatively, within Mattermost, when logged in as an Administrator, you can click on the "Marketplace" option in the main menu and easily install plugins or apps from there. 

Where should I install my integrations?
---------------------------------------

For self-hosted deployments in small setups, you might host integrations on the same server on which Mattermost is installed. For larger deployments, you can set up a separate server for integrations, or add them to the server on which the external application is hosted. For example, if you're self-hosting a Jira server you could deploy a Jira integration on the Jira server itself. When self-hosting restrictions are less strict, AWS, Heroku, and other public cloud options could also be used.

Where can I get more information about integrations?
----------------------------------------------------

Come `join our Contributors community channel <https://community.mattermost.com/core/channels/tickets>`__ on our daily build server, where you can discuss questions with community members and the Mattermost core team. 

Join our `Developers channel <https://community.mattermost.com/core/channels/developers>`__ for technical discussions, and visit our `Integrations channel <https://community.mattermost.com/core/channels/integrations>`__ for all integrations and plugins discussions.
source/about/faq-illicit-use.rst METASEP
Illicit use questions
=====================

How do I report illicit use of Mattermost software? 
---------------------------------------------------

Illicit use of Mattermost software to harm others, infringe on their rights, break laws or policies is explicitly against our `Terms of Use <https://mattermost.com/terms-of-use/>`__.

If the illicit use is happening on a web address ending in ``“mattermost.com”``, it means the suspected perpetrators are using Mattermost software controlled by our company, Mattermost, Inc. In this case, please get in touch with us at ``support@mattermost.com`` to report the issue for us to investigate.

If the illicit use is happening on a different web address, then it means the suspected perpetrators may be using Mattermost software controlled by a person or company other than Mattermost, Inc. In this case, you need to contact the person or company who controls the web address by using a lookup service such as https://www.whois.net/ to find the contact email to report abuse. You can use a link to this FAQ as a reference to our `Terms of Use <https://mattermost.com/terms-of-use/>`__ policy for Mattermost software.
source/about/faq-high-trust.rst METASEP
High trust questions
====================

What are the trust benefits of Mattermost compared to third-party SaaS systems that let customers manage their own encryption keys?
-----------------------------------------------------------------------------------------------------------------------------------

**Encryption doesn't mean a third-party SaaS vendor can't read your data.** A third-party vendor who provides encryption keys to the database that stores a customer's data at rest may still be able to read a customer's data while its in transit.

For example, performing a search on message histories requires access to unencrypted messages in order to match the search term to words in your unencrypted message history.

As another example, a customer's data encryption key is unlikely to be deployed to the mobile devices of end users; therefore, when a third-party system sends a push notification to an end user's mobile device, the unencrypted text is available to the third party.

In contrast, Mattermost is hosted by the customer. Not only can data be encrypted at rest and in-transit with keys generated by the customer (which no vendors ever touch), unencrypted data for search and mobile notifications is handled by systems under your IT team's control.

If it’s unclear from the vendor’s documentation whether or not your data can be read, ask them directly.

**Moreover, high trust enterprises need more than encryption - they need privacy, total data ownership, auditability, and control of their infrastructure.**

*Privacy* means a third-party service cannot monitor the identity, IP address, location, or access patterns of your employees, nor their activity on your system, nor provide that information either intentionally through a court order (which you may never be informed about) or unintentionally through a data breach.

*Total data ownership* means a third party cannot prevent you from accessing your data at any time. It means no third party can read your data, analyze it or monetize it. It means that should you end your commercial relationship, you maintain your records with any backups. It also means you can delete your data at any time and verify that no additional copies remain.

*Audibility* means being able to fully observe, monitor, and trace the operations of your systems.

*Control of infrastructure* means being able to operate and customize your system to the specific needs of your business, including the ability to run on public and private networks, as well as on-prem, and interoperate with critical legacy systems with full observability and transparency down to reading the source code.

As an open source self-hosted system, Mattermost provides privacy, total data ownership, and control of infrastructure required by high trust teams.

What are the fundamental security challenges with Massive, Multi-Tenant Applications (MMTA)?
--------------------------------------------------------------------------------------------

The key risk of allowing confidential data to enter a Massively Multi-Tenant Applications (MMTA) is having the system breached, never knowing your data has been compromised, and having stolen data used to breach your other systems.

Marketers from MMTA vendors pay highly credentialed security professionals to offer "Death Star Logic" to gain a customer’s trust: "MMTA's SaaS offering is the most secure system in the galaxy because it outspends its customers on security investments, therefore the MMTA is more secure than a customer's self-hosted infrastructure."

The problem with Death Star Logic is that it omits the fact that hosting confidential data from thousands of enterprise customers makes it the prime target for cyber attacks, which increases risk to customers for four key reasons:

**1) Over time, MMTA vendors become Nation State Targets**

The effort behind a cyber attack is proportional to the value of breaching the system. As the value of the data held by an MMTA vendor increases, so does the scale of its cyber threats.

Vendors become "Nation State Targets" when the value of the breaching their system is so high it attracts the attention of the cyberwarfare branches of hostile nations. From there, even the smallest errors in system security can result in a significant breach.

**2) MMTA systems can't protect customers from unknown vulnerabilities**

A single bug in an MMTA system can put all customers at risk. For example, `Slack reported a bug that exposed message histories and files for nearly four million users <https://www.wired.com/2017/03/hack-brief-slack-bug-everyones-worst-office-nightmare/>`__ (2017), and `a bug left 400 million Microsoft accounts exposed to account takeover <https://www.hackread.com/critical-bug-in-microsoft-left-400m-accounts-exposed/>`__ (2018).

For multi-tenant systems, bugs in infrastructure can present vulnerabilities as well. For example, in 2018 researchers discovered that chip-level exploits like `Meltdown and Spectre <https://www.wired.com/story/intel-meltdown-spectre-storm/>`__, which had been around for decades, could make it possible for malicious code run by one tenant to affect the operations of another tenant that shared the same CPU.

Keeping MMTA systems secure depends on the ability of internal and external security researches to continually stay ahead of cyber-attackers.

**3) Customers don't know when breaches occur**

When an MMTA is breached, it is most likely from an unknown bug or an unknown vulnerability. Because of this, it may not be clear that a system has been breached, and customers may not be notified. Moreover, following a breach, there's often no way for the customer's security team to audit the MMTA vendor and understand how their confidential data may have been accessed or stolen.

The end result is confidential information passing through an MMTA may be used to exploit other systems the customer operates, with no way to trace the root of the breach to mitigate it in future.

As an example, when `OneLogin reported a security breach that allowed the attacker to decrypt encrypted data impacting 2000 customers and 70 SaaS apps <https://krebsonsecurity.com/2017/06/onelogin-breach-exposed-ability-to-decrypt-data/>`__ (2017), details were vague and there was little customers could do to analyze their risk or reduce risk in future.

In contrast, an open source, self-hosted collaboration solution remains within the layers of physical security and network security enterprises use to protect their most valuable assets, with full access to logging and system histories to know when, where and how an attack might have occurred.

Moreover, as a single-tenant solution, the strength of cyberattacks is typically limited to the breach value of just your confidential data and not the aggregate breach value of all customer data held by an MMTA. Plus, the sum of security investments your company makes to protect systems in its private networks accrues to your collaboration system - and for banks, this could be hundreds of millions of dollars a year.

**4) MMTA systems risk cross-bleeding your data**

MMTA also runs the risk of bugs or misconfigurations in a vendor’s multi-tenant system bleeding your data into another customer’s space, or vice versa. Bleeds can occur via logging systems, in application logic, middleware, and data layer errors. In 2019, `Facebook admitted to accidentally storing hundreds of millions of user passwords in clear text for years due to a configuration oversight <https://krebsonsecurity.com/2019/03/facebook-stored-hundreds-of-millions-of-user-passwords-in-plain-text-for-years/>`__.


source/about/faq-general.rst METASEP
General Mattermost questions
============================

Why was Mattermost created?
---------------------------

Mattermost was created to offer an alternative to proprietary SaaS services. For more information, please see the article `Why we built Mattermost <https://mattermost.com/about-us/>`__.

Why does the open source repository contain code specific to the commercial version of Mattermost?
---------------------------------------------------------------------------------------------------

The commercial version of Mattermost is designed to never lock-in your data. Portions of the commercial version are shared with the open source version to ensure upgrade and downgrade across editions happens without data loss.

Does Mattermost support 508 Compliance?
---------------------------------------

Yes, please see our `VPAT <https://docs.mattermost.com/about/vpat.html>`__ form for details. Mattermost Enterprise Edition has been purchased by multiple US public sector organizations, including US federal agencies and the Department of Defense.

What's the largest Mattermost deployment you have?
--------------------------------------------------

Our largest contractual obligation is for over a quarter of a million registered users. Our most typical large enterprise deployment size is between 10,000 and 40,000 users in Dev and Ops organizations who use Mattermost for DevOps workflows, remote work, mission-critical and rapid response, and to address email overload.

We have done performance testing of 60,000 concurrent users and 60 million posts in the database, with a peak concurrent utilization safety factor of between 10 to 1 and 3 to 1, depending on the distribution of an organization across time zones. Peak concurrent usage in a single timezone is generally around the start of the day, probably 9am, and lunchtime when people are messaging to meet for a meal. Our monthly releases are tested at 20 million posts in the database.

Mattermost provides an open source, well-documented `load test simulator <https://github.com/mattermost/mattermost-load-test>`_ to verify that your Mattermost deployment can achieve the stated scale benchmarks ahead of production deployment.

How do I deploy the open source Mattermost Team Edition under an MIT license?
-----------------------------------------------------------------------------

The open source Mattermost Team Edition is functionally identical to the commercial Mattermost Enterprise Edition in its free “team mode”, but there is no ability to unlock enterprise features. It deploys as a single Linux binary with MySQL or PostgreSQL under an MIT license.

We generally recommend installing Enterprise Edition, even if you don't currently need a license. This provides the flexibility to unlock Enterprise features seamlessly should you need them. However, if you only want to install software with a fully open source code base, then Team Edition is the best choice for you.

To deploy the Team Edition, download the `Mattermost Team Edition binary <https://docs.mattermost.com/upgrade/version-archive.html#mattermost-team-edition>`_, and follow our standard install guides. The same applies to server upgrades.

What are the limitations for embargoed countries?
-------------------------------------------------

We greatly appreciate your interest in Mattermost. Due to recent sanctions from the United States government, we must pause interactions with your organization until the sanctions are lifted.

This includes:

- We must pause on selling, issuing, or renewing a Mattermost license key to your organization. If you have a Mattermost license key, or a trial key, we ask that you do not use it.
- We are not permitted to provide you technical support for our software. Moreover, we cannot answer questions about our software.
- We are not permitted to provide our software, including any updates, upgrades or cloud-hosted versions to your organization. We must ask that you do not use any software or online services provided by Mattermost, Inc., including any versions that have been provided online to the general public.

We deeply apologize for the inconvenience. We must abide by United States laws. We hope after sanctions are lifted that we can support your interest once again. Please reach out to compliance@mattermost.com for any questions around current export limitations.

source/about/faq-enterprise.rst METASEP
Enterprise Edition questions
============================

What is Mattermost Enterprise Edition?
--------------------------------------

Mattermost Enterprise Edition is a commercial workplace messaging solution for large organizations operating under compliance and security requirements built on top of the open source Mattermost Team Edition.

How can I be assured that my data will not be locked in to commercial software?
-------------------------------------------------------------------------------

Users of Mattermost Enterprise Edition can downgrade to the open source version without losing any data. Moreover, you always have control over your server and database, where the entirety of your Mattermost deployment is stored.

How does Mattermost scale from teams to enterprises?
----------------------------------------------------

Growing your Mattermost installation from supporting a team to supporting an enterprise requires two types of scaling:

1. Technical scaling: Maintaining system responsiveness as large quantities of new users are added.
2. Functional scaling: Adding advanced features to support the increased complexity of large organizations.

**Technical Scaling:** Whether used for teams or enterprises, the Mattermost server is designed to support tens of thousands of users on a single server with appropriate hardware. The server is built using Golang, the language developed by Google to create internet-scale applications, and supports highly scalable databases like MySQL, which is `used extensively by Facebook <https://www.facebook.com/notes/facebook-engineering/mysql-and-database-engineering-mark-callaghan/10150599729938920/>`__. Beyond tens of thousands of users, Mattermost Enterprise Edition can offer high availability/horizontal scaling configurations using multiple servers to support even larger organizations.

**Functional Scaling:** Scaling from a team to an enterprise is like going from a "virtual office" to a "virtual campus". Advanced features like enterprise authentication, granular permissions, compliance and auditing, and advanced reporting become increasingly important as organizations grow beyond teams. Organizations needing this flexibility can easily upgrade from Mattermost Team Edition to Mattermost Enterprise Edition as well as downgrade without data loss, should their needs change.

For more information on how Mattermost scales, technically, and functionally, please `contact the Enterprise team <https://mattermost.com/contact-us/>`__ and `read about scaling for Enterprise <https://docs.mattermost.com/scale/scaling-for-enterprise.html>`__.

What does it take to manage a Mattermost deployment?
----------------------------------------------------

For a small deployment of Mattermost up to a few hundred users, we'd recommend a part-time, mid-level IT admin with a senior IT admin for supervision and as a backup resource. They should have the ability to administer a basic Linux server, a MySQL or PostgreSQL database, and web proxy configuration with web sockets.

For a medium deployment of 500 to 2000 users, we'd recommend a senior IT administrator who has the capability to configure Mattermost in a High Availability cluster with redundant database and application servers. They should also be able to activate performance monitoring and health check features in Prometheus and Grafana.

How do you manage multiple messaging solutions in an enterprise?
----------------------------------------------------------------

Our customers address multiple collaboration solutions in different ways depending on whether the organization is more top down or bottom up.

**For top-down, customers want to simplify and leverage investments in a central, flexible, innovative solution that can scale.** There's generally a lot of pain with different teams and departments running their own messaging tools, creating silos, redundancy, and significant productivity loss. They'll roll out Mattermost as an official solution and centralize communication there. For an example of this, see our `Uber case study <https://mattermost.com/customers/>`__.

**For bottom-up, customers want to supplement for strategic advantage.** We've seen teams flock to Mattermost because of its productivity benefits for DevOps, remote work, rapid response, and scaling large teams where people are overloaded with email. Those organizations, which can have hundreds to thousands of users, will use Mattermost in parallel with general-purpose messaging that doesn't meet their specific needs.

One example is Wargaming, one of the world's largest real-time online video game operators, with over 150 million players on their system. They've moved their DevOps, design, analytics and support teams to Mattermost to supplement Skype for Business. This is their company-wide, general-purpose messenger that isn't optimized for large DevOps organizations and the degree of integration and flexibility they need - specifically for DevOps. People want support for Linux and Mac desktops, lots of APIs and hooks to integrate. They also need help for plugins to embed certain types of reports and interactive controls into messages, friendly keyboard shortcuts, and dozens of other enhancements that provide a distinct advantage to their counterparts at other companies.

What are the options to purchase a subscription to Mattermost Enterprise Edition?
---------------------------------------------------------------------------------

To simplify procurement and to keep prices low, Mattermost offers the following options to purchase:

1. **Purchase a subscription online via credit card** (https://mattermost.com/pricing-self-managed/) under standard Mattermost terms (https://mattermost.com/enterprise-edition-terms/) used by hundreds of other Enterprise Edition customers.

2. **Purchasing via a Mattermost reseller** (https://mattermost.com/partners/) under terms agreed between the customer and reseller, and then agreeing to **Mattermost Enterprise Edition Subscription Terms for Purchase by Resale** (https://mattermost.com/terms-of-use/) prior to being provided a license key for the purchase by Mattermost, Inc.

3. **Purchase via a purchase order referencing a Mattermost quotation number**, and where the quotation is valid, unexpired and references the **Mattermost Enterprise Edition Subscription Terms** (https://mattermost.com/enterprise-edition-terms/):

   If the PO references any special terms and conditions, it cannot be accepted by Mattermost, Inc. without the following special note: ``This Purchase Order is governed solely by the terms and conditions of the Mattermost Enterprise Edition Subscription Terms at https://mattermost.com/enterprise-edition-terms/. Despite anything to the contrary, no other terms and conditions printed on, or incorporated into or referenced by, shall apply.``

4. **Purchase via a purchase order referencing a Master Services Agreement** or similar agreement executed by Mattermost and the customer for subscription purchases over $100,000 USD.

   If the PO references any special terms and conditions, it cannot be accepted by Mattermost, Inc. without the following clause included in the prior signed agreement: ``THE PARTIES AGREE THAT ANY ADDITIONAL OR DIFFERENT TERMS AND CONDITIONS CONTAINED ON OR INCORPORATED INTO YOUR PURCHASE ORDER ARE EXPRESSLY REJECTED AND SHALL NOT BE CONSIDERED AN AMENDMENT TO THIS AGREEMENT.`` If the agreement does not include such a clause the following purchase order note is required: ``This purchase order is governed solely by the terms and conditions of the [AGREEMENT_TITLE] dated [AGREEMENT_DATE] between [CUSTOMER_NAME] and Mattermost, Inc..  All other terms and conditions contained on or referenced by this purchase order shall not apply.``
  
What happens when the Enterprise Edition subscription expires?
--------------------------------------------------------------

Sixty days prior to expiry, System Administrators receive notifications that the Enterprise Edition license key will expire on the anniversary of its purchase. After expiry, there is a 10-day grace period to upload a new license key. After the grace period, Enterprise features will be disabled. At any time, Enterprise Edition can be downgraded to the free Team Edition without data loss by switching off any Enterprise features enabled and then removing the license key.

How does the licensing key work?
--------------------------------

See our `frequently asked questions about licensing <https://docs.mattermost.com/about/licensing-and-subscription.html#frequently-asked-questions>`__.

Do you have a program for official non-profits and charities?
-------------------------------------------------------------

See our `frequently asked questions about licensing <https://docs.mattermost.com/about/licensing-and-subscription.html#frequently-asked-questions>`__.

Do you have discounted licenses for academic institutions?
----------------------------------------------------------

See our `frequently asked questions about licensing <https://docs.mattermost.com/about/licensing-and-subscription.html#frequently-asked-questions>`__.

source/about/faq-design-decisions.rst METASEP
Design decision questions
=========================

Why does Mattermost disclose whether or not an account exists when a user enters an incorrect password?
-------------------------------------------------------------------------------------------------------

Mattermost's core design principle is to be "fast, obvious, forgiving" and, telling users that they made a mistake in entering their password, is in service of our principle of prioritizing user interests.

When using username-password authentication, especially with AD/LDAP, there's the possibility of usernames being email addresses, Mattermost username, AD/LDAP username, AD/LDAP ID, or other AD/LDAP attributes and our design principle intends to help end users understand whether their login error came from having the wrong password or the wrong email/username.

We believe this design increases productivity, speeds up user adoption, and reduces help desk tickets and support costs - and that these benefits outweigh the trade-offs.

The trade-off with this design is that if physical security is not in effect, network security is not in effect (i.e., no VPN or a malicious user within the private network), and username-password authentication is used, an attacker may be able to enumerate email addresses or usernames by sending HTTP requests to the system, up to the maximum number of requests per second defined in Mattermost's `API rate limiting settings <https://docs.mattermost.com/configure/configuration-settings.html#rate-limiting>`__.

For organizations who choose to deploy in such a configuration, please consider the following mitigations:

1. Instead of username-password, use a Single Sign-On (SSO) provider in Mattermost Enterprise Edition like OneLogin, Okta, or ADFS, or use the open source GitLab SSO option available with Mattermost Team Edition.
2. Per the recommended install instructions, use a VPN client to apply network security to your deployment.
3. Enable monitoring and alerting from your proxy server to detect and isolate malicious behavior reaching your deployment.

Above all, make sure to subscribe to the `Mattermost Security Bulletin <https://mattermost.com/security-updates/#sign-up>`__ and apply security patches as recommended.
source/about/faq-community.rst METASEP
Mattermost community questions
==============================

How can I contribute to Mattermost?
-----------------------------------

You can get involved and contribute to Mattermost in the following ways:

- Contribute code
- Find "Help Wanted" projects
- Join the `Developers <https://community.mattermost.com/core/channels/developers>`__ channel on the Mattermost Community server
- File bugs
- Test new features
- Share feature ideas
- Get troubleshooting help
- Help translate Mattermost

See the `Get Involved <https://github.com/mattermost/mattermost-server#get-involved>`__ section of the Mattermost GitHub ``README.md`` for more information.

Can contributors add themselves to the Mattermost company page on LinkedIn?
---------------------------------------------------------------------------

Yes! If you have contributed to the Mattermost project we think you should be recognized for it professionally beyond GitHub.

To add yourself to the `Mattermost page on LinkedIn <https://www.linkedin.com/company/mattermost/>`__, do the following:

1. Log in to `LinkedIn <https://www.linkedin.com/>`__ or create an account.
2. Go to **Me > View profile**.
3. Under **Experience**, select the **plus** symbol and specify the following:

  - **Title**:
     - Enter **Developer** if you contributed code to the open source project or created a plugin, integration, or other enhancement.
     - Enter **Contributor** if you've contributed without writing code (e.g., filed bug report, updated documentation, supported troubleshooting questions, proposed a feature, etc.).
     - Enter **Translator** if you've `helped translate <https://translate.mattermost.com>`__ Mattermost products.
  
  - **Company**: Find **Mattermost** (you’ll see the Mattermost logo).
  - **Location**: Enter where you live.
  - **From**: Date of first contribution or perhaps month you cloned `github.com/mattermost`.
  - Select **I currently work here**.
  - **Update my industry**: Leave unchecked.
  - **Update my headline**: Leave unchecked.
  - **Description**: Leave blank or write a sentence about what you have contributed.
source/about/faq-business.rst METASEP
:orphan:

Business questions
==================

How do I fork Mattermost?
-------------------------

If you wish to create a forked version of the Mattermost source code, you must comply with the applicable licenses under which the source code is made available. Historically, this was made clear via this link: https://docs.mattermost.com/about/faq-business.html#copyright-and-licensing-of-mattermost-server-open-source-code.
 
For example, the Mattermost server source code is and always has been made available under the AGPLv2 license. Therefore, all third-party open source forks of the Mattermost server source code must comply with the AGPLv2 license in both source code and compiled versions. If you encounter a third-party fork of the publicly available source code of Mattermost server that claims to be licensed under an alternate license, it is incorrect.

For clarity, this license information regarding forking the source specifically refers to the use (and compilation) of the Mattermost source code by third parties. Third parties are obligated to comply with the open source licenses referenced above in connection with their derivative works. Compiled versions and derivative works of Mattermost prepared by third parties may not be made available under any license other than those under which the applicable source code is made available.

In contrast, Mattermost, as the copyright holder to the collection of the Mattermost source code, has exercised its exclusive right to make compiled versions of the Mattermost source code available under various other licenses (such as the MIT license and the Mattermost Commercial Enterprise License, as more specifically made clear in the table here: https://docs.mattermost.com/about/faq-enterprise.html#what-are-mattermost-s-policies-around-licensing-terms-of-use-and-privacy).

How can I create an open source derivative work of Mattermost?
--------------------------------------------------------------

If you're looking to customize the look and feel of Mattermost, see `documentation on customization <https://github.com/mattermost/docs/issues/1006>`__. For advanced customization, the system's user experience is available in different repositories for web, mobile apps, and desktop apps and custom experiences can be developed and integrated with either Mattermost Team Edition or Mattermost Enterprise Edition via the system APIs and drivers.

If, instead of using Mattermost Team Edition or Mattermost Enterprise Edition, you choose to compile your own version of the system using the open source code from ``/mattermost-server``, there are a number of factors to consider:

Security
~~~~~~~~

- If you run a fork of the Mattermost server, we highly recommend you only deploy the system securely behind a firewall and to pay close attention to `Mattermost security updates <https://mattermost.com/security-updates/>`__. Mattermost Team Edition and Mattermost Enterprise Edition release security update patches when reports of new attacks are received and verified. Mattermost waits until 14 days after a security patch is released before publicly detailing its nature so that users and customers can upgrade before the security vulnerability is widely known. A malicious user can potentially make use of Mattermost security disclosures to exploit a fork of Mattermost if the security upgrade is not promptly incorporated into the forked version.

Rebranding
~~~~~~~~~~

- When you create a derivative version of Mattermost and share it with others as a product, you need to replace the Mattermost name and logo from the system, among other requirements, per the `Mattermost trademark policy <https://mattermost.com/trademark-standards-of-use/>`__.
- You can rebrand your system using convenience tools for `custom branding <https://docs.mattermost.com/configure/configuration-settings.html#customization>`__.
- For advanced whitelabelling, and to whitelabel in Team Edition under MIT license without Enterprise Edition branding tools, you can manually update files on the Mattermost server `per product documentation. <https://github.com/mattermost/docs/issues/1006>`__ This can also be done without forking.

Copyright and Licensing of ``/mattermost-server`` open source code
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- Compiling and distributing your own version of the open source Mattermost ``/mattermost-server`` repo requires a) compliance with licenses in the repo, including `NOTICE.txt <https://github.com/mattermost/mattermost-server/blob/master/NOTICE.txt>`__, and b) the compiled version of the ``/mattermost-server`` source code should have the same open source license as the source code, `per our licensing policy <https://docs.mattermost.com/about/subscription.html/>`__.

Other considerations
~~~~~~~~~~~~~~~~~~~~

- Mattermost has a default `Terms of Use <https://docs.mattermost.com/configure/configuration-settings.html#terms-of-use-link>`__ agreement for the Terms of Use link at the bottom of login screen that should be incorporated into any additional Terms of Use you may add.

- The Mattermost copyright notices on the user interface should remain.
- There may be additional legal and regulatory issues to consider and we recommend you employ legal counsel to fully understand what's involved in creating and selling a derivative work.

Will Mattermost complete questionnaires requiring confidential data without an NDA?
-----------------------------------------------------------------------------------

No, Mattermost will not complete questionnaires requiring confidential data without a non-disclosure agreement. You can find `Mattermost's standard mutual non-disclosure agreement online <https://docs.google.com/document/d/10Qc2kxxZGYNzp9b19oEhItRM01OPyrWRISJ2rbm1gvc/edit>`__.

Why does Mattermost have a discount for certain kinds of non-profits but not for others?
----------------------------------------------------------------------------------------

While we welcome anyone to use the open source version of Mattermost Team Edition free of charge, Mattermost, Inc., like any software company, has specific discounting programs for its commercial Mattermost Enterprise Edition based on business objectives. Objectives of the discounting programs include the suitability of potential case studies, references, word-of-mouth promotion and public promotion of solutions, among many other factors.

See our `License and Subscription <https://docs.mattermost.com/about/license-and-subscription.html#do-you-have-a-program-for-official-non-profits-open-source-projects-and-charities>`__ documentation for details.

Can I create a derivative work of the Mattermost /mattermost-server repository that is not open source?
-------------------------------------------------------------------------------------------------------

The Mattermost open source project was created by `a group of developers who had their data paywalled by a proprietary online messaging service <https://mattermost.com/about-us/>`__ and felt it was unfair.

Because of this, the Mattermost /mattermost-server repository uses an open source license that requires derivative works to use the same open source license. This prevents the creation of derivative works that are not open source, and the situation where end users would not have access to the source code of the systems they use, and hence be at risk of "lock in".

For companies purchasing Enterprise Edition subscriptions for use by internal staff, who need to modify /mattermost-server, and who also have legal departments that won't allow their staff to work under an open source software license, a special "Advanced Licensing Option" can be purchased to modify /mattermost-server for internal use under a commercial software license. This option is not available for companies that would offer a modified, non-open source version of Mattermost to external parties.

Will Mattermost, Inc. offer the ability to resell Mattermost software without a reseller agreement?
----------------------------------------------------------------------------------------------------

No.

If there is a case where the reseller agreement is under review and a customer urgently needs an order, Mattermost may, with internal approvals, accept a reseller purchase order with the following language:

"Any statements, clauses, or conditions included on or referenced by buyer's purchase order forms, which forms modify, add to, or are inconsistent with Mattermost’s standard terms and conditions are expressly rejected. Such orders will only be accepted by Mattermost upon the condition and with the express understanding that despite any such statements, clauses, or conditions contained in any order forms of the buyer are void and have no effect.

EXCEPT AS OTHERWISE EXPRESSLY AGREED BY THE PARTIES IN WRITING, MATTERMOST MAKES NO WARRANTIES OR REPRESENTATIONS WITH RESPECT TO ANY MATTERMOST PRODUCTS, DOCUMENTATION OR SUPPORT, AND HEREBY DISCLAIMS ALL OTHER EXPRESS AND ALL IMPLIED WARRANTIES, INCLUDING BUT NOT LIMITED TO IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT."

Does Mattermost answer questions about open source licenses authored by other organizations?
---------------------------------------------------------------------------------------------

No, if you have questions about an open source license, please consult the original author, or FAQs they offer.

source/about/editions-and-offerings.rst METASEP
Mattermost editions and plans 
=============================

Mattermost is an open core platform. 

This means we develop both an open source, self-hosted edition of our software provided free to our community, as well as a commercial edition that extends and enhances our open source software with paid, subscription-based offerings available both in self-hosted and cloud deployment modes.

You can choose between one of two compiled code bases, either open source (Team Edition) or commercial (Enterprise Edition).

We offer a range of plans, which are sets of features and entitlements available either free or as a paid subscription service. Mattermost sells subscriptions for both self-hosted and cloud deployments.

Self-hosted editions
--------------------

Self-hosted editions support deploying Mattermost within IT-controlled private environments in public clouds, including AWS, Azure, GCP and Oracle Cloud, as well as on-premises in private clouds and virtual or physical servers. When you're using a self-hosted deployment, a license file is provided and needs to be uploaded to activate your subscription.

Mattermost Team Edition
~~~~~~~~~~~~~~~~~~~~~~~

Team Edition is a free-to-use, open source, self-hosted collaboration platform offering all the core productivity benefits of competing SaaS solutions. It deploys as a single Linux binary with MySQL or PostgreSQL under an MIT license.

Mattermost Team Edition is also bundled inside of the free Mattermost Enterprise Edition code base, which provides the same functionality as Mattermost Team Edition, with the additional benefit of being able to trial as well as upgrade into an expanded set of features available with paid subscription, including Mattermost Professional and Mattermost Enterprise. 

Because of the benefits of Mattermost Enterprise Edition, we recommend installing it instead of Mattermost Team Edition, even if you don’t currently need a subscription, so you'll have the flexibility to trial or enable additional features should you need them. However, if you only want to install software with a fully open source license, then Mattermost Team Edition is the best choice.

Mattermost Enterprise Edition 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Our commercial, self-hosted software is called Mattermost Enterprise Edition, and it's available as a Linux binary that deploys identically to our open source version - including upgrading in an identical fashion - with two key differences: It contains code for advanced commercial features and it's offered under a commercial license (https://mattermost.com/enterprise-edition-license/). The commercial license prohibits reverse engineering and tampering with our license key mechanism unlocking paid features so that we can run a compliant and fair commercial business.

Once you’ve downloaded and installed Mattermost Enterprise Edition within your preferred environment, you have the option to use it as-is in a "free" mode, or you can access Mattermost's commercial features by starting a trial or by purchasing a subscription. You can start a 30-day free Enterprise trial via **System Console > Edition and License > Start trial**, or request a trial online at https://mattermost.com/trial/.

Mattermost plans
----------------

Mattermost plans consist of features and entitlements available either free or as a paid subscription service. 

We have three primary plans available to our self-hosted and cloud users: 

* **Mattermost Starter** - This a free version of our collaboration suite designed for single teams.
* **Mattermost Professional** - This is a paid subscription service providing advance access controls and user management for managers leading teams of teams.
* **Mattermost Enterprise** - This is a paid subscription service for large and sophisticated enterprise-scale deployments of the Mattermost suite.

For customers using our service in a self-hosted deployment, the Mattermost Starter offering is available in both our open source and commercial code bases (called Mattermost Team Edition and Mattermost Enterprise Edition, respectively). 

The Mattermost Professional and Mattermost Enterprise editions are only available after deploying our Mattermost Enterprise Edition code base, and then applying a valid license key that comes with a subscription purchase, or by starting a 30-day free trial that can be activated either in-product (**System Console > Edition and License > Start trial**) or online at https://mattermost.com/trial/.

Mattermost Starter
-------------------

Mattermost Starter is a set of collaboration features for accelerating your technical team’s productivity, shipping software faster with higher quality, and improving alignment among team members.

* *Self-hosted deployments* - **Mattermost Starter** is available to our self-hosted community through both our open source Mattermost Team Edition offering, and in our commercial Mattermost Enterprise Edition offering (when no subscription license key is active). See deployment options at: https://mattermost.com/deploy/.
* *Cloud deployments* - **Mattermost Starter** is also available in Cloud. It provides the functionality of Mattermost Starter to unlimited users for free, with a `few workspace limits <https://docs.mattermost.com/onboard/mattermost-limits.html>`_. Get started today via https://mattermost.com/sign-up/.

Features include:

- Unlimited teams and channels for one-to-one and group messaging, file sharing, and unlimited search history with threaded messaging, emoji, and Custom Emoji.
- One customizable playbook for unlimited participants, ad hoc add/remove tasks, automated triggers, and stakeholders dashboard.
- Unlimited boards, with table, gallery, list views, a single workspace per channel, shareable read-only boards, and data import.
- Native apps for iOS, Android, Windows, Mac, and Linux.
- Pre-packaged integrations with most common developer tools, including Jira, Confluence, GitHub, GitLab, CircleCI, Zoom, Jitsi, and more.
- Tools for `custom branding <https://docs.mattermost.com/configure/custom-branding-tools.html>`__ and `themes <https://docs.mattermost.com/messaging/customizing-theme-colors.html>`__.
- `Multi-factor authentication <https://docs.mattermost.com/onboard/multi-factor-authentication.html>`__.
- `Single Sign-on with GitLab <https://docs.mattermost.com/onboard/sso-gitlab.html>`__ (Self-hosted only).
- `Granular system permissions <https://docs.mattermost.com/onboard/advanced-permissions.html>`__.
- Highly customizable `third-party bots, integrations <https://mattermost.com/marketplace/#publicApps>`__, and `command line tools <https://docs.mattermost.com/manage/mmctl-command-line-tool.html>`__.
- Extensive integration support via `webhooks, APIs, drivers <https://developers.mattermost.com/integrate/other-integrations/>`__, and `third-party extensions <https://mattermost.com/marketplace/>`__.
- Multiple languages including English (Australian, US), Bulgarian, Chinese (Simplified and Traditional), Dutch, French, German, Italian, Japanese, Korean, Persian, Polish, Portuguese (Brazil), Romanian, Russian, Spanish, Swedish, Turkish, and Ukrainian.
- `SOC2 Type1 certification <https://mattermost.com/security/>`__ (Cloud only).
- `Community support <https://mattermost.com/support/>`__.

See a complete list of features `here <https://mattermost.com/pricing>`__.

Mattermost Professional 
-----------------------

Mattermost Professional is the set of collaboration features that enables you to build and scale your sophisticated developer workflows across multiple cross-functional teams to deliver mission-critical software.

* *Self-hosted deployments* - **Mattermost Professional** is available to our self-hosted community who either run, or upgrade to, our self-hosted commercial Mattermost Enterprise Edition (see `deployment guides <https://docs.mattermost.com/guides/deployment.html#install-guides>`__), who purchase the appropriate subscription license key either through `online purchase <https://docs.mattermost.com/about/self-hosted-subscriptions.html>`__, through a `channel reseller <https://mattermost.com/partners/#resellers>`__ or by contacting `the Mattermost sales organization <https://mattermost.com/contact-sales/>`__, and who then install the license key onto their Mattermost server. A 30-day free trial to preview the features in this subscription can be activated either in-product (**System Console > Edition and License > Start trial**) or via an online request at https://mattermost.com/trial/.
* *Cloud deployments* - For our cloud community, the Mattermost Professional feature set is available through `online purchase <https://docs.mattermost.com/about/self-hosted-subscriptions.html>`__. Some `workspace limits <https://docs.mattermost.com/onboard/mattermost-limits.html>`_ may apply.

This offering includes all the features of Mattermost Starter, plus: 

- `Guest access <https://docs.mattermost.com/onboard/guest-accounts.html>`__.
- Unlimited playbooks, retrospective reports, and timelines.
- `Active Directory/LDAP Single Sign-on and user synchronization <https://docs.mattermost.com/onboard/ad-ldap.html>`__.
- Single Sign-on with SAML, `Google <https://docs.mattermost.com/onboard/sso-google.html>`__, `Office365 <https://docs.mattermost.com/onboard/sso-office.html>`__ or `OpenID Connect <https://docs.mattermost.com/onboard/sso-openidconnect.html>`__.
- `MFA enforcement <https://docs.mattermost.com/onboard/multi-factor-authentication.html#enforcing-mfa-e10>`__.
- `Advanced team permissions <https://docs.mattermost.com/onboard/advanced-permissions.html#team-override-schemes-e20>`__.
- `Read-only announcement channels <https://docs.mattermost.com/manage/team-channel-members.html#channel-moderation-e20>`__.
- `System-wide announcement banners <https://docs.mattermost.com/manage/announcement-banner.html>`__.
- O365 integration with `Microsoft Teams Calling <https://mattermost.com/marketplace/microsoft-teams-meetings/>`_ and `Jira multi-server <https://mattermost.com/marketplace/jira-plugin/>`_.
- `Next business day support via online ticketing system <https://mattermost.com/support/>`__.

See a complete list of features `here <https://mattermost.com/pricing>`__.

Mattermost Enterprise 
---------------------

Mattermost Enterprise is an enterprise-grade collaboration system that supports and helps you scale your mission-critical enterprise workflows, meet strict enterprise security, compliance, and privacy requirements, as well as provide executive reporting, dashboards, and productivity metrics.

* *Self-hosted deployments* - **Mattermost Enterprise** is available to our self-hosted community who either run, or upgrade to, our self-hosted commercial Mattermost Enterprise Edition, who purchase by `contacting the Mattermost sales organization <https://mattermost.com/contact-sales/>`__, and who then install the license key onto their Mattermost server. A 30-day free trial to preview the features in this subscription can be activated either in-product (**System Console > Edition and License > Start trial**) or via an online request at https://mattermost.com/trial/.
* *Cloud deployments* - For our cloud community, the Mattermost Enterprise can be purchased by `contacting the Mattermost sales organization <https://mattermost.com/contact-sales/>`__.

This offering includes all the features of Mattermost Professional, plus: 

- `Enterprise-scale search with dedicated indexing and usage resourcing via cluster support <https://docs.mattermost.com/scale/elasticsearch.html>`__.
- `Sychronization of access controls, channels, and teams with AD/LDAP Groups <https://docs.mattermost.com/onboard/ad-ldap-groups-synchronization.html>`__.
- `eDiscovery and compliance export automation <https://docs.mattermost.com/comply/compliance-export.html>`__.
- `Enterprise mobile device management with custom EMM support via AppConfig <https://docs.mattermost.com/deploy/mobile-appconfig.html>`__.
- `Advanced legal controls with customizable end-user terms of service and re-acceptance duration <https://docs.mattermost.com/comply/custom-terms-of-service.html>`__.
- `Private mobility with ID-only push notifications <https://docs.mattermost.com/configure/configuration-settings.html#push-notification-contents>`__.
- `Enhanced compliance with global and custom retention policies for messages and files <https://docs.mattermost.com/comply/data-retention-policy.html>`__.
- `Granular administrative control with custom system admin roles <https://docs.mattermost.com/onboard/system-admin-roles.html>`__.
- `Advanced configuration of playbook permissions, analytics dashboards, and channel exports <https://docs.mattermost.com/playbooks/setting-up-playbooks.html>`__.
- `Enhanced compliance controls and granular audit logs with data export <https://docs.mattermost.com/comply/audit-log.html>`__.
- `Advanced collaboration with shared channels across Mattermost instances <https://docs.mattermost.com/onboard/shared-channels.html>`__.
- `High availability support with multi-node database deployment <https://docs.mattermost.com/scale/high-availability-cluster.html>`__.
- `Horizontal scaling through cluster-based deployment <https://docs.mattermost.com/scale/scaling-for-enterprise.html#cluster-based-deployment>`__.
- `Advanced performance monitoring <https://docs.mattermost.com/scale/performance-monitoring.html>`__.
- `Eligibility for Premier Support add-on <https://mattermost.com/support/>`__.
- 99% uptime SLA guarantee (Cloud only, via dedicated virtual secure Cloud add-on option).

Limits
------

Some Mattermost plans have limits applied to functionality and features. Visit `our documentation <https://docs.mattermost.com/onboard/mattermost-limits.html>`_ for more information. These limits apply to Cloud environments only.

Other Mattermost plans
----------------------

Mattermost introduced a new pricing and packaging structure on October 13, 2021. The plans listed below will reach end-of-life on October 31, 2023. We're no longer selling these products to new customers. For existing customers, we highly recommend working with your Mattermost Account team to plan for a migration to our new plans, but we will honor existing pricing and features for renewals and expansions of E10/20 until October 31, 2022. Please contact our `Sales team <https://mattermost.com/contact-us/>`__ with questions.

Mattermost Enterprise Edition E10
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost E10 was offered as a commercial enterprise messaging solution for teams, groups, and departments working on multiple projects scaling from hundreds to thousands of users. Many E10 features are now offered in Mattermost Professional. Features include: Active Directory/LDAP Single Sign-on; OAuth 2.0 authentication for team creation, account creation, and user login; encrypted push notifications with service level agreements (SLAs) via HPNS; advanced access control policy; next business day support via online ticketing system; scale to handle hundreds of users per team.

Mattermost Enterprise Edition E20
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost Enterprise E20 was offered as a commercial enterprise-grade messaging system that scales from hundreds to tens of thousands of users. Enterprise Edition E20 authentication features are now offered in Mattermost Professional and High Availability and compliance features are offered in Mattermost Enterprise.

Features include: Advanced SAML 2.0 authentication with Okta, OneLogin, and Active Directory Federation Services; Active Directory/LDAP group synchronization; OpenID Connect authentication for team creation, account creation, and user login; compliance exports of message histories with oversight protection; custom retention policies for messages and files; high availability support with multi-node database deployment; horizontal scaling through cluster-based deployment; Elasticsearch support for highly efficient database searches in a cluster environment; advanced performance monitoring; eligibility for Premier Support add-on.

Product decisions
-----------------

As the platform matures and new features are added, they're evaluated to be included in the plan that best aligns with the organizational use cases outlined by the editions above. Multiple factors are considered in determining the appropriate plan to include a feature including mission-critical impact, relative value to a single team, cross-functional teams, and the enterprise, as well as security, compliance, and scalability.

We recognize there aren't any features that are only useful to managers, directors, and executives. Individual practitioners may want certain features; however, we think that other buyers are relatively more likely to care about it. We also recognize that there may be some features that are put into an edition to find later there is much demand for it by individuals or a singular team; we will not hesitate to move that feature. We value feedback from our community and iterate based on that feedback. Simultaneously, we also need to offer commercial products that hold value and do our best to find the right balance. We believe the more of Mattermost that you use, the more likely it is that you benefit from the advanced editions we offer.

You can provide us with feedback via `our forum <https://mattermost.uservoice.com/>`__, where ideas and input influences the future of the platform.

source/about/corporate-directory-integration.rst METASEP
Corporate directory integration 
================================

Mattermost offers advanced security and authentication options for integrating with corporate directories. This guide outlines the options available.

Basic authentication 
---------------------

By default, Mattermost offers authentication via email and password, which offers basic features including:

- Account sign up using email and password.
- Password reset via email.
- Ability to use the same credentials to log into web, desktop, and mobile app experiences.
- Ability to use a username and password in place of email and password.

Security features for authentication 
------------------------------------

A core set of features is available with all authentication options to help increase security:

- Ability to `set session length <https://docs.mattermost.com/configure/configuration-settings.html#session-lengths>`__ to define how long a user can use Mattermost before needing to re-enter credentials.
- Ability for users to remotely sign out of devices.
- Ability for IT admin to force sign out of a user from devices.
- Ability to set rate limits on authentication API calls to deter password-guessing attacks.
- Ability to require multi-factor authentication on log in.
- For advanced deployments, password requirements for length and special characters can be added.

Active Directory/LDAP authentication
------------------------------------

`AD/LDAP <https://docs.mattermost.com/onboard/ad-ldap.html>`__ is the most popular corporate directory integration option for deploying Mattermost behind a corporate firewall. Features include:

- Account creation using AD/LDAP credentials.
- AD/LDAP user filters to define which users get access to Mattermost in the form of a query.
- Ability to use a low-privileged AD/LDAP account to run queries over a secure TLS or STARTTLS connection.
- Attribute mapping to place First Name, Last Name, Nickname, and other attributes from AD/LDAP into Mattermost.
- Customization of login screen to specify whether users are logging in with email, username, or other attribute.
- Synchronization with AD/LDAP to disable, enable, and update Mattermost users based on AD/LDAP.

.. note:: 
   - New user accounts are created when new users log in with their AD/LDAP credentials. You can optionally pre-create user accounts using the `bulk loading <https://docs.mattermost.com/onboard/bulk-loading-data.html>`__ tool.
   - If you're using email or username and password authentication `users can switch to AD/LDAP manually <https://docs.mattermost.com/onboard/ad-ldap.html#getting-started>`__, and the `conversion to AD/LDAP can also be done using the command line interface <https://docs.mattermost.com/manage/command-line-tools.html#mattermost-user-migrate-auth>`__ by an IT admin.

For very large AD/LDAP instances you can also configure max page size to divide a Mattermost AD/LDAP query into several pieces to not overtax the authentication server when synchronizing.

Authentication options outside of a private network
---------------------------------------------------

When deploying Mattermost to a DMZ location outside the security of a private network, additional authentication options include:

- `Okta integration via SAML <https://docs.mattermost.com/onboard/sso-saml-okta.html>`__
- `OneLogin integration via SAML <https://docs.mattermost.com/onboard/sso-saml-onelogin.html>`__
- `Active Directory Federation Services via SAML <https://docs.mattermost.com/onboard/sso-saml-adfs.html>`__
- `SAML 2.0 authentication <https://docs.mattermost.com/onboard/sso-saml.html>`__
- `Google Apps <https://docs.mattermost.com/onboard/sso-google.html>`__
- `Office 365 <https://docs.mattermost.com/onboard/sso-office.html>`__
- `OpenID Connect <https://docs.mattermost.com/onboard/sso-openidconnect.html>`__

Generic OAuth is not currently supported.

Future authentication methods
-----------------------------

Mattermost releases new improvements monthly. Several additional authentication methods are planned, but not yet scheduled. If you're an enterprise interested in deploying with an option not yet provided in our documentation, please contact sales@mattermost.com to start a discussion.

source/about/cloud-subscriptions.rst METASEP
Cloud subscriptions
===================

Purchase a Cloud subscription
------------------------------

Mattermost Cloud can be used free forever with Mattermost Starter.

You can also start a free, 30-day trial of Mattermost Enterprise to explore additional features. When you're near the end of your trial, a banner within Mattermost will notify you to upgrade to a subscription plan:

1. Select **Subscribe now** from the banner.
2. Provide your credit card details.
  - Your credit card will be verified and you'll be charged at the end of the billing period. If you'd prefer an annual Cloud subscription, please contact our Sales team for a quote.
3. Provide your billing address.
4. (Optional) Select a subscription plan.
5. Select **Subscribe**.

Alternatively, if you'd like to continue with Mattermost Enterprise, please contact our `Sales team <mailto:sales@mattermost.com>`_. 

If you choose not to upgrade at the end of your 30-day trial, your subscription will revert to Mattermost Starter.

View subscription details
-------------------------

The subscription screen outlines the details of your Mattermost Cloud account, including the cost per user per month and the number of users currently registered in your workspace. You can also find a summary of your last invoice in the same page, and any `workspace limits <https://docs.mattermost.com/onboard/mattermost-limits.html>`__ set for your subscription.

Billing period
--------------

After you begin your Mattermost Cloud paid subscription, your first charge is applied at the end of the calendar month. Subsequent billing periods begin at 12 AM UTC on the first day of each calendar month and end at 11:59 PM UTC on the final day of the same calendar month. Per-user pricing for each billing period will be based on the number of registered users.

Invoices appear immediately after the billing period ends.

It may take up to a day for our billing systems to calculate, charge your credit card, and issue your invoice. Once charges are completed, the invoice will show as *Paid*. The invoice is a downloadable PDF file.

If there's a payment failure, your invoice will show *Payment Failed*. Please review the accuracy of your credit card information in **Payment Information**. Unresolved failed payments may result in a delinquency and an interruption to your subscription.

Adding and removing users in the middle of a billing period
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

If you add new users in the middle of a billing cycle, you'll only be charged for the days that the user is registered.

Here's an example:

Your organization has a Mattermost Cloud workspace, and you're on a monthly subscription at the rate of $10 USD per user per month. You add a new user on the 11th day of a 30-day billing period, and that user remains registered for the remainder of the billing period.

The prorated subscription cost for this user is determined by multiplying the monthly amount ($10 USD) by the number of days they are actively registered in the billing period (20) and dividing by the number of days in the month (30).

The prorated subscription cost for the user added on day 11 is $6.67 USD.

Similarly, if you make a registered user inactive in the middle of a billing cycle, we will calculate the prorated amount using the formula above to determine the prorated charge.

Failed or late payments
~~~~~~~~~~~~~~~~~~~~~~~

You'll be notified immediately of failed payments both in-product, with a banner, and via email. The notifications provide directions on how to update payment information. Once payment information is updated, you'll be charged right away for the amount owing from the previous billing period.

Suspended workspaces can be reactivated by contacting Mattermost Customer Support at `https://customers.mattermost.com/cloud/contactus <https://customers.mattermost.com/cloud/contactus>`_.

Once a workspace has been deleted, contents can not be reinstated. You'll need to create a new workspace at that time from https://mattermost.com/get-started/.

Payment information
~~~~~~~~~~~~~~~~~~~

Mattermost uses a third-party payments processor, Stripe, to safely collect and store your credit card information. 

Credit cards are the only form of payment for customers on a monthly billing cycle. All major credit cards are accepted. You can only store information for one credit card in your account.

We offer pricing and billing only in U.S. Dollars (USD) at this time. Payment will be made in USD converted using the exchange rate at the time of the transaction.

Sales tax and VAT
~~~~~~~~~~~~~~~~~

Mattermost reserves the right to assess applicable taxes as required by local law. Depending on location, you may be charged transaction taxes when purchasing our product. Prices on our website are exclusive of sales tax or VAT.

Add more users to your subscription
-----------------------------------

If you're on a monthly Cloud subscription, you can add more users to your instance which will be reflected on your monthly invoice. If you add new users in the middle of a billing cycle, you’ll only be charged for the days that the user is registered.

When you subscribe to an annual plan with Mattermost, you may incur retroactive charges on a quarterly basis for the actual number of registered users within your system if you are above the amount you subscribed in your purchase order. A registered user is a user who has an account in a workspace and does not show as *Inactive* in **System Console > User Management > Users**.

If you have more total active users than the number purchased in your annual subscription, we'll provide you with an invoice and an amendment to your purchase order for the new users added. The additional invoice will be pro-rated based on the number of months left in your subscription term, including the months for the calendar quarter at the time we review your user counts. We will not provide downward adjustments. Mattermost will invoice based on Mattermost’s `current list prices <www.mattermost.com/pricing>`__.

Renew your subscription
-----------------------

Monthly Cloud subscriptions renew automatically.

Frequently asked questions
---------------------------

What happens when my 30-day Mattermost Enterprise trial period ends?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

At the end of the 30-day trial, you can opt to purchase a monthly subscription to Mattermost Professional via the prompts provided in Mattermost. 

If you choose not to continue, your subscription will revert to Mattermost Starter and you will not be billed. In this case, Mattermost Enterprise features will no longer be available to use. Any data you may have that exceeds the `data limits <https://docs.mattermost.com/mattermost-limits.html>`_ for Mattermost Starter will be auto-archived.

How am I billed for my Cloud monthly subscription?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Your first Cloud subscription charge is at the end of the calendar month, and all monthly charges are billed in arrears on the first day of each month, e.g., June billing will be done on 7/1 for the period 6/1 - 6/30. 

After your first month, the billing period begins at 12 AM UTC on the first day of each calendar month and ends at 11:59 PM UTC on the final day of the same calendar month. Per-user pricing for each billing period will be based on the number of registered users.

- If you begin your subscription in the middle of a billing period, charges will be prorated. For example, if you signed up 6/15, we'll charge you on 7/1 for the period 6/15 - 6/30.
- Similarly, if you end your subscription in the middle of a billing period, charges will be prorated. For example, if you cancel your account on 6/15, we'll charge you on 7/1 for the period 6/1 - 6/15.
- If you upgrade in the middle of a billing period, charges will also be prorated. For example, if you upgrade from Professional to Enterprise on 6/15, we'll charge you 7/1. This will be a single charge for Professional for the period 6/1 - 6/14, then a separate charge for Enterprise for the period 6/15 - 6/30.

What happens if I decide to purchase a subscription to Mattermost Enterprise during my trial?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Your plan immediately changes to the plan you've upgraded to. Your trial will continue and on day 31 billing will commence. You won't incur any charges of your new plan until the trial period is over. Depending on what day of the month this is, you'll be billed pro-rata. You'll receive your bill at the end of the calendar month for this month and going forward.

How do I change my subscription from Mattermost Enterprise to Mattermost Professional?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

To downgrade, please contact our `Support team <mailto:support@mattermost.com>`_.

Can I purchase an annual Mattermost Cloud subscription?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Yes. Contact sales@mattermost.com to learn more about annual Cloud subscription options.

If you upgrade during a monthly billing cycle, charges will be prorated. For example, if you upgrade from monthly Professional to an annual term of Mattermost Enterprise on 6/15, we'll charge you on 7/1 for Professional for the period 6/1 - 6/14. A separate invoice will be provided for the annual Mattermost Enterprise subscription period starting 6/15.

How do I cancel my subscription? 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

To cancel your subscription, please `contact us <https://customers.mattermost.com/cloud/contact-us>`__.

I'm no longer being billed for my Cloud Starter ($149 / year) plan. Why is that?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Cloud Starter ($149 / year) plans created before June 15, 2022 are now free with no data limits. You have the option to `upgrade to Professional or Enterprise <https://mattermost.com/pricing/>`__, or continue using your Cloud Starter plan for free.

Free Cloud Starter workspaces created on or after June 15, 2022 are free forever with certain `workspace limits <https://docs.mattermost.com/onboard/mattermost-limits.html#workspace-limits>`__ such as message and file history.

When will support for other regions be available?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost Cloud Enterprise will support data residency based on feedback from our customers.

If you require your data to reside in an area outside of the United States, please contact the product team via `feedback-cloud@mattermost.com <feedback-cloud@mattermost.com>`_, or consider `deploying one of our Self-Hosted options <https://mattermost.com/deploy>`_ that provides full control of your data. You may also work with `one of our European partners <https://mattermost.com/partners>`_ for deploying and hosting your Mattermost server.

How is Mattermost Cloud secured?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost Cloud has encryption at-rest and in-transit. We're SOC2 Type 1 certified and working towards SOC2 Type 2.

Mattermost Cloud Enterprise is available to be deployed in a secure, private environment within a dedicated Cloud offering to a single customer. This architecture provides the isolation and security of an on-premises deployment while ensuring consistent performance and uptime of your Mattermost workspace. `Please contact Mattermost Sales for more information on this option <https://mattermost.com/contact-sales/>`_.

What are the alternatives, and why should I choose Mattermost Cloud?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Other SaaS offerings are closed-source and focus on a very broad use case. Mattermost Cloud is built on our open source core offering, allowing customers to view our source code and have a high degree of transparency into Mattermost development processes. Mattermost provides a DevOps-centric offering and has deep integrations and workflows that help builders and operators be more effective.

Mattermost Cloud Enterprise is available to be deployed in a private environment within an AWS VPC dedicated to a single customer. Other SaaS offerings are multi-tenant, meaning customers share resources. Please contact sales for more inforamtion on this option.

Is Mattermost Cloud Enterprise a dedicated instance run on AWS systems?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost Cloud Enterprise can be deployed as a dedicated Mattermost environment running with separate infrastructure for your requirements (e.g., separate database, separate VMs, separate Kubernetes cluster). Please contact Mattermost Sales for more information on this option.

How is customer data in Mattermost Cloud Enterprise encrypted?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost uses AWS-provided functionality to enable encryption-at-rest for both databases and file stores. See `Encrypting Amazon RDS resources - Amazon Relational Database Service <https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Overview.Encryption.html>`__ and `Protecting data using server-side encryption - Amazon Simple Storage Service <https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html>`__ for details.

Whether customer data should be stored in Mattermost Cloud depends heavily on the nature of the data and compliance requirements. We recommend that customers set up their own internal policies or controls around what can and cannot be put into Mattermost.

Are S3-managed keys used for server-side encryption? 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Yes. Customer-provided keys may be considered for a future release. 

Do you provide cross-region failover in the event of an outage in AWS us-east-1 region?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost Cloud is hosted in AWS `us-east-1` region. Cross-region failover is planned, but not yet in the roadmap. If you have feedback or require cross-region failover, please reach out to our product team via feedback-cloud[at]mattermost.com.

What environments and rings are Cloud offerings deployed with?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost Cloud provides `three offerings <https://mattermost.com/pricing/>`_: Starter, Professional, Enterprise, with a virtual private Cloud add-on available for Enterprise.

These offerings are deployed in the following ways:

 - **Freemium**: Single application layer, shared infrastructure, shared network, starter group ring.
 - **Professional**: Single application layer, shared infrastructure, shared network, professional group ring.
 - **Enterprise**: Single application layer, shared infrastructure, shared network, enterprise group ring.
 - **Enterprise plus dedicated add-on**: Single application layer, dedicated network via VPC (Virtual Private Cloud), dedicated infrastructure, enterprise group ring.

source/about/certifications-and-compliance.rst METASEP
Certifications and compliance overview
========================================

This overview summarizes how Mattermost can help users in support of their internal compliance initiatives, including:

- GDPR Compliance
- U.S. Export Compliance

GDPR compliance
----------------

The following overview summarizes how Mattermost software can be used to assist in compliance programs covering the European Union's General Data Protection Regulation, also known as Regulation (EU): 2016/679 (`See full text <https://eur-lex.europa.eu/legal-content/EN/TXT/PDF/?uri=CELEX:32016R0679&from=EN>`__) and how Mattermost, Inc., itself, adheres to regulatory requirements.

Continual commitment to the principles of GDPR
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost is a collaboration hub for highly-trusted organizations and is committed to supporting the principles of GDPR to protect the data of people in the European Union. Mattermost adheres to this mission through the use of:

- **Security Infrastructure:** Continual investment in security, privacy and compliance capabilities.
- **Contractual Obligations:** Appropriate contractual obligations through our terms of service, including the `Data Processing Addendum <https://mattermost.com/data-processing-addendum/>`__ in our standard `Terms of Service <https://mattermost.com/terms-of-service/>`__.
- **Privacy Measures:** Privacy measures are outlined in our `Privacy Policy <https://mattermost.com/privacy-policy/>`__.
- **Product Features:** To ensure data management and data portability.

To stay up to date with our efforts, please subscribe to `our regular newsletter <https://mattermost.com/newsletter/>`__.

Security infrastructure
~~~~~~~~~~~~~~~~~~~~~~~~

Mattermost enables organizations to protect their information, and the information of their users and customers, through self-hosted communication infrastructure that has been developed with a high standard of security. The features of this security infrastructure include:

- **Security Features** in Mattermost open source and commercial offerings that enable deployment of your organization’s own infrastructure.
- **Responsible Disclosure Policy** for security researchers around the world to confidentially report suspected vulnerabilities, which can be addressed in updates to Mattermost software.
- **Security Reviews** conducted by both our own internal security review team and external security researchers.
- **ISO 27001 Standards** which are met to achieve alignment with international security guidelines.

Contractual obligations
~~~~~~~~~~~~~~~~~~~~~~~

Mattermost adheres to contractual obligations for ensuring the proper management of data through:

- **GDPR-Compliant Data Processing Addendum** included with Mattermost’s standard terms.
- **Mattermost Privacy Policy** sharing how data is handled on the online infrastructure controlled by Mattermost, Inc.

Privacy measures
~~~~~~~~~~~~~~~~~

Mattermost outlines security measures to maintain the safety of personal data submitted by our customers and partners in our `Privacy Policy <https://mattermost.com/privacy-policy/>`__.

Product features
~~~~~~~~~~~~~~~~

Mattermost supports features that ensure data management and data portability.

Data management
^^^^^^^^^^^^^^^^

- **Data Retention:** Use `data retention <https://docs.mattermost.com/comply/data-retention-policy.html>`__ to automatically erase data after a set period of time, a feature that meets the Right to Erasure principle. In Team Edition, you can use database scripts to achieve the same result.
- **Profile Deletion:** Delete a user’s personal information via `mmctl user delete <https://docs.mattermost.com/manage/mmctl-command-line-tool.html#mmctl-user-delete>`__, or via `the CLI <https://docs.mattermost.com/manage/command-line-tools.html#mattermost-user-delete>`__. Both the mmctl and the CLI command permanently deletes all user information including messages created by the user.
- **Self-Hosted Push Notification Service:** Self-host your own push notification service, or deploy mobile apps with any EMM provider that supports `AppConfig <https://www.appconfig.org/members/>`__ to meet security and compliance policies. See `our Mobile App deployment documentation <https://docs.mattermost.com/deploy/mobile-overview.html>`__ to learn more.

Data portability
^^^^^^^^^^^^^^^^^

- **Data Import:** Use the `bulk loading tool <https://docs.mattermost.com/onboard/bulk-loading-data.html>`__ to migrate data from an existing messaging system, or for pre-populating a new installation with data. `Review this guide <https://docs.mattermost.com/onboard/migrating-from-hipchat-to-mattermost.html>`__ which summarizes the different approaches and meets the `Right to Data Portability <https://gdpr-info.eu/art-20-gdpr/>`__ principle.
- **Data Export:** Use `compliance exports <https://docs.mattermost.com/comply/compliance-export.html>`__ to export conversations from public, private and direct message channels in XML or EML format. Those in Team Edition can export conversations directly from the database, both `in MySQL <https://www.itworld.com/article/2833078/it-management/3-ways-to-import-and-export-a-mysql-database.html>`__ and `in PostgreSQL <https://www.a2hosting.com/kb/developer-corner/postgresql/import-and-export-a-postgresql-database>`__.

Accessibility compliance
-------------------------

Adherence with accessibility standards is assisted in the following ways:

- **508 Compliance:** For U.S. public sector organizations seeking to confirm 508 compliance, Mattermost publicly shares its `Voluntary Product Accessibility Template (VPAT) online <https://docs.mattermost.com/about/vpat.html>`__.
- **WCAG 2.0L:** For meeting Web Contact Accessibility Guidelines 2.0 (WCAG), Mattermost has received a third-party "A" rating and is working towards an "AA" rating.
- **ADA:** Mattermost compliance with the Americans with Disabilities Act (ADA) is achieved by offering the accessibility support detailed in the VPAT and WCAG 2.0 guidelines with Mattermost's online experience as the interface to accessibility tools.
- **Remediation:** Any technical issue in a current or future product release that would prevent compliance with accessibility ratings stated in product documentation would be considered a product defect and Mattermost would welcome the `public filing of an issue report against the defect <https://handbook.mattermost.com/contributors/contributors/ways-to-contribute>`__ so that it may be resolved.

U.S. trade compliance 
---------------------

Mattermost, Inc. implements a number of controls and processes to comply with U.S. trade compliance laws. 

1. **IP blocking:** We use IP blocking to deny access from certain countries to our commercial systems, such as signing up for our commercial and proprietary offerings. 

2. **Automated compliance scanning:** We use an automated export compliance tool called Descartes. In Salesforce account records there is a prominent **Descartes** box in the top right indicating safety levels. Accounts that are flagged need to be signed-off by Tim Quock, VP Finance, who is connected with our `export compliance counsel <https://docs.google.com/document/d/14KzrhszTlaibtM4APezTS8CFb1vaHxRsnkV9ZFef-Uc/edit>`_.

3. **Manual compliance review:** At times announcements about changes to sanctions regulations happen faster than our export compliance tool can adapt. In the cases where sanctions have been announced, we can proactively review our business and make changes to enforce sanctions ahead of the automated solution being updated.

4. **Legal restrictions:** Our commercial software contains legal terms that apply to both administrators and end users prohibiting use that would violate U.S. sanctions law. 

U.S. trade laws referenced here can be found online at: https://www.bis.doc.gov/index.php/policy-guidance/lists-of-parties-of-concern/entity-list 

If you feel your organization is miscategorized under U.S. sanctions, please email compliance@mattermost.com. 

What is the process to end a customer relationship due to new U.S. sanctions?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The customer is contacted via email with either manually or through an automated process with compliance@mattermost.com cc'd and the communication is written back into SFDC for record keeping.


U.S. export compliance overview
-------------------------------

Summary Table
~~~~~~~~~~~~~

+-----------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------+
| Mattermost Product                            | Export Control Classification Number (ECCN)                                                                                                     |
+===============================================+=================================================================================================================================================+
| Mattermost Enterprise Edition E10             | `ECCN 5D002 <https://www.bis.doc.gov/index.php/documents/regulations-docs/federal-register-notices/federal-register-2014/951-ccl5-pt2/file>`__  |
|                                               | with a License Exception available of `ENC <https://www.bis.doc.gov/index.php/documents/regulation-docs/415-part-740-license-exceptions/file>`__|
+-----------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------+
| Mattermost Enterprise Edition E20             | `ECCN 5D002 <https://www.bis.doc.gov/index.php/documents/regulations-docs/federal-register-notices/federal-register-2014/951-ccl5-pt2/file>`__  |
|                                               | with a License Exception available of `ENC <https://www.bis.doc.gov/index.php/documents/regulation-docs/415-part-740-license-exceptions/file>`__|
+-----------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------+
| Mattermost Team Edition                       | Not subject to the U.S. Export Administration Regulations (EAR) given software is publicly available                                            |
|                                               | and fully available to compile from publicly available source code at https://github.com/mattermost/                                            |
+-----------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------+

Overview
~~~~~~~~~

The U.S. government regulates the transfer of information, commodities, technology and software considered
to be strategically important to the U.S. in the interest of national security, economic and/or foreign policy
concerns. Many countries outside of the U.S. have similar controls on exports for the same reasons.

There is a complex network of U.S. agencies and inter-related regulations that govern exports collectively referred
to as “Export Controls."

It is the policy of Mattermost to comply with all export compliance laws in all countries in which it transacts
business. Because Mattermost is a U.S.-based global company, our products, collectively referred to as “Commodities,"
which include our software as well as our equipment, materials and services, are subject to the export laws and regulations
of every country in which we conduct business. Non-compliance with export control regulations can subject Mattermost
and its affiliates, including its customers, employees and business partners to criminal and civil penalties, the seizure
of assets, the denial of export privileges, and suspension or debarment from Government Contracts.

For these reasons, please take the time to familiarize yourself with applicable export (and import) controls in the
jurisdictions in which you operate. Although Mattermost cannot provide advice on export matters, this web page provides the information needed in order export Mattermost products.

This overview is specific to the `U.S. Export Administration Regulations <https://www.bis.doc.gov/index.php/regulations/export-administration-regulations-ear>`__ (EAR), however, business operations may subject you to other regulations such as the `International Traffic in Arms Regulations <https://www.pmddtc.state.gov/regulations_laws?id=ddtc_kb_article_page&sys_id=24d528fddbfc930044f9ff621f961987>`__.

General information
~~~~~~~~~~~~~~~~~~~~

Start by taking a look at the `U.S. Bureau of Industry and Security <https://www.bis.doc.gov/>`__ website. Then, navigate to `Part 730 <https://www.bis.doc.gov/index.php/documents/regulation-docs/410-part-730-general-information/file>`__ of the U.S. Export Administration Regulations to understand what the regulations cover and what is “Subject to
the EAR” under `734.2 <https://www.bis.doc.gov/index.php/documents/regulation-docs/412-part-734-scope-of-the-export-administration-regulations/file>`__ (“export controlled”).

Export classification and licensing
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Although what is subject to the Export Administration Regulations is quite broad, that does not mean an export license
is required for every transaction. The foundation of understanding export controls related to hardware, software and
technology can be found within the `Commerce Control List <https://www.bis.doc.gov/index.php/regulations/commerce-control-list-ccl>`__ (CCL), which has 10 categories, 0-9, and is set up as a positive list. The first step is determining if the item to be exported is subject to the EAR.

At Mattermost, our Team Edition software is `outside the scope of the EAR <https://www.bis.doc.gov/index.php/policy-guidance/encryption/1-encryption-items-not-subject-to-the-ear>`__, as it is derived from publicly available encryption source code and the complete software package for both the source code (https://github.com/mattermost/) and binary versions are publicly available. Mattermost enterprise software is found in `Category 5, Part 2 <https://www.bis.doc.gov/index.php/documents/regulations-docs/federal-register-notices/federal-register-2014/951-ccl5-pt2/file>`__ of the CCL as Telecommunications and Information Security items (hardware, software and technology). Most items in this category have encryption.

Often a license exception under `Part 740 <https://www.bis.doc.gov/index.php/documents/regulation-docs/415-part-740-license-exceptions/file>`__ is available where a Commerce Control List item lists the available license exception(s) specific to an Export Control Classification Number (ECCN), based on a combination of factors.

Mattermost Enterprise Edition software is found under `ECCN 5D002 <https://www.bis.doc.gov/index.php/documents/regulations-docs/federal-register-notices/federal-register-2014/951-ccl5-pt2/file>`__, with a license exception available from `“ENC” <https://www.bis.doc.gov/index.php/documents/regulation-docs/415-part-740-license-exceptions/file>`__ for our Enterprise and Professional software, with encryption features derived from open-source software. Encryption products, under the export regulations, have multiple levels of controls and requirements. BIS has a separate section of their website that has an overview, and many links, covering encryption under `Policy Guidelines <https://www.bis.doc.gov/index.php/policy-guidance/encryption>`__ that you may want to review. These guidelines include helpful flow charts for determining if an item is subject to encryption controls, tables and other details.

The other key areas to be aware of for an export of Mattermost software or technology are:

**Sanctions**: There are comprehensive sanctions to Cuba, Iran, North Korea, Syria, and other countries/territories.
with specific prohibitions, such as Venezuela. Details can be
located at `BIS <https://www.bis.doc.gov/index.php/forms-documents/regulations-docs/federal-register-notices/federal-register-2014/1063-746-1/file>`__ and `OFAC <https://www.treasury.gov/resource-center/sanctions/Pages/default.aspx>`__. The countries and their sanctions are subject to change.

**WMD (Weapons of Mass Destruction)**: Mattermost, its customers and its business partners may not export to parties involved
in `proliferation <https://www.bis.doc.gov/index.php/documents/regulation-docs/413-part-736-general-prohibitions/file>`__ of weapons of mass destruction, along with other prohibited end-uses under the U.S. Export Administration Regulations (“EAR”).

**General Prohibitions**: Information on General Prohibitions under the EAR is located `here <https://www.bis.doc.gov/index.php/documents/regulations-docs/413-part-736-general-prohibitions/file>`__. Application of the applicability of these General Prohibitions is based on a combination of factors. These include: classification of the commodity, destination, end-user, end-use and conduct.

**Restricted Parties**: You may not export to parties listed on the US government's `restricted parties lists <https://www.bis.doc.gov/index.php/policy-guidance/lists-of-parties-of-concern>`__, and should be screening against these prior to export. There is a `consolidated screening list <https://www.trade.gov/consolidated-screening-list>`__ provided by the U.S. government at export.gov at no charge that can be used for screening.

**Deemed Exports**:  Release of controlled technology to foreign persons in the U.S. is "deemed" to be an export to the
person’s country or countries of nationality and is found in `734.2(b) <https://www.bis.doc.gov/index.php/documents/regulation-docs/412-part-734-scope-of-the-export-administration-regulations/file>`__ of the EAR, which you can read about under the Export Administration Regulations on the BIS website.

**Know Your Customer**: By reviewing the BIS website, you will notice that it is very important to “know your customers," and to be aware of “Red Flags”. Be sure to screen business partners and customers to ensure compliance.

Disclaimer
~~~~~~~~~~

Mattermost makes this data available for informational purposes only. It may not reflect the most current legal
developments, and Mattermost does not represent, warrant or guarantee that it is complete, accurate or up to date.
This information is subject to change without notice. The materials on this site are not intended to constitute legal
advice or to be used as a substitute for specific legal advice. You should not act (or refrain from acting) based upon
information on this site without obtaining professional advice regarding particular facts and circumstances.

Frequently asked questions
--------------------------

To be compliant with GDPR, do I need to remove message contents of email notifications?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Based on our interpretation of GDPR, it is not required to hide message contents in email notifications to remain compliant for the following reasons:

1. Every user has the ability to disable email notifications in **Settings**. Therefore, every user has the ultimate control over whether or not they want information sent via email. This option aligns with most other products, but we will follow updates on interpretations of GDPR closely to see if we need to make changes in this area.
2. Mattermost offers `TLS encryption <https://docs.mattermost.com/configure/environment-configuration-settings.html#web-server-connection-security>`__ to protect communication between the Mattermost server and the SMTP email server.
3. If you're uncertain whether the first two points cover GDPR compliance, you can `disable notifications completely <https://docs.mattermost.com/configure/configuration-settings.html#enable-email-notifications>`__ on your Mattermost server. To use Mattermost in production with no email notifications, you also need to `disable a "preview mode" notice banner <https://docs.mattermost.com/configure/configuration-settings.html#enable-preview-mode-banner>`__.

What information is shared when I select **Contact us** on a Mattermost Admin Advisor notification?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Selecting **Contact us** in the Mattermost Admin Advisor will send some information to us. This may include the email address and name associated with your Mattermost account as well as the number of registered users on your system, the site URL, and a Mattermost diagnostic server ID number. This information is used to contact you as requested and to help us better understand your needs.

.. note::
    `Mattermost Admin Advisor notices are disabled <https://docs.mattermost.com/manage/in-product-notices.html#admin-advisor-notices>`__ in v5.35 and later.

Are the server access logs containing IP addresses a GDPR compliance issue?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Based on our interpretation of `article 49 of GDPR <https://eur-lex.europa.eu/legal-content/EN/TXT/PDF/?uri=CELEX:32016R0679&from=EN>`_, processing personal data for the purpose of ensuring network and information security is acceptable. Moreover:

- You can control access to the logs via restricted access to the System Console and the server.
- As a self-hosted software, you have full control and ownership of the logs, with the ability to set up a purge schedule to meet your needs.
- You can use a reverse proxy to provide obfuscation to IP addresses.

Do you have Fed or Department of Defense (DOD) Certification?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

We are in the process of acquiring Authority to Operate (ATO) and Certificate of Networthiness (CON) certifications.

How do you ensure personal data stays within European Union?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

When the customer’s installation of Mattermost is self-hosted, Mattermost does not process any personal data under the jurisdiction of the data privacy laws governing within the European Union. The Mattermost support team leverages Zendesk customer service software, which hosts Mattermost information within the United States. For more information on Zendesk, please see their `Privacy and Data Protection <https://www.zendesk.com/company/privacy-and-data-protection/#gdpr-sub>`__ page.

Zendesk privacy and data protection safeguards notwithstanding, the provision of support services is part of the contractual obligations between Mattermost and its customers. In order for Mattermost to provide such support, a customer must be able to identify as a licensed user, therefore requiring the user to provide personal data to the support agent. Regardless of where the support agent is located, the personal data will indeed be hosted outside of the EU.

However, pursuant to Section (b) of Article 49 of GDPR, transfers of personal data which are "necessary for the performance of a contract between the data subject and the controller" may be transferred to a third country or international organization. Accordingly these transfers would be done in alignment with the requirements of GDPR. For more information, see our `Mattermost Privacy Policy <https://mattermost.com/privacy-policy/>`__ page.

***DISCLAIMER:** MATTERMOST DOES NOT POSITION ITS PRODUCTS AS “GUARANTEED COMPLIANCE SOLUTIONS”. WE MAKE NO GUARANTEE THAT YOU WILL ACHIEVE REGULATORY COMPLIANCE USING MATTERMOST PRODUCTS. YOUR LEVEL OF SUCCESS IN ACHIEVING REGULATORY COMPLIANCE DEPENDS ON YOUR INTERPRETATION OF THE APPLICABLE REGULATION, AND THE ACTIONS YOU TAKE TO COMPLY WITH THEIR REQUIREMENTS. SINCE THESE FACTORS DIFFER ACCORDING TO INDIVIDUALS AND BUSINESSES, WE CANNOT GUARANTEE YOUR SUCCESS, NOR ARE WE RESPONSIBLE FOR ANY OF YOUR ACTIONS. NO GUARANTEES ARE MADE THAT YOU WILL ACHIEVE ANY SPECIFIC COMPLIANCE RESULTS FROM THE USE OF MATTERMOST OR FROM ANY RECOMMENDATIONS CONTAINED ON OUR WEBSITES, AND AS SUCH, THIS SHOULD NOT BE A SUBSTITUTE TO CONSULTING WITH YOUR OWN LEGAL AND COMPLIANCE REPRESENTATIVES ON THESE MATTERS.

source/_static/searchtools.js METASEP
/*
 * searchtools.js
 * ~~~~~~~~~~~~~~~~
 *
 * Sphinx JavaScript utilities for the full-text search.
 *
 * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS.
 * :license: BSD, see LICENSE for details.
 *
 */

/*
NOTE:
This file is specific to Sphinx v4.4.0. If the version of Sphinx used to build
these docs changes, this file will need to be re-written based on that version.
Search may not work correctly if this is not done.
 */

/**
 * @typedef ScorerObject
 * @type {object}
 * @property {function(string[]): number} [score]
 * @property {number} objNameMatch
 * @property {number} objPartialMatch
 * @property {Record<String,Number>} objPrio
 * @property {number} objPrioDefault
 * @property {number} title
 * @property {number} partialTitle
 * @property {number} term
 * @property {number} partialTerm
 */

if (!Scorer) {
    /**
     * Simple result scoring code.
     * @type {ScorerObject}
     */
    var Scorer = {
        // Implement the following function to further tweak the score for each result
        // The function takes a result array [filename, title, anchor, descr, score]
        // and returns the new score.
        /*
        score: function(result) {
          return result[4];
        },
        */

        // query matches the full name of an object
        objNameMatch: 11,
        // or matches in the last dotted part of the object name
        objPartialMatch: 6,
        // Additive scores depending on the priority of the object
        objPrio: {0:  15,   // used to be importantResults
            1:  5,   // used to be objectResults
            2: -5},  // used to be unimportantResults
        //  Used when the priority is not in the mapping.
        objPrioDefault: 0,

        // query found in title
        title: 15,
        partialTitle: 7,
        // query found in terms
        term: 5,
        partialTerm: 2
    };
}

/* Define the splitQuery function if it has not been defined */
if (!splitQuery) {
    /**
     * Splits a query string into words
     * @param query {String} The query string to split
     * @returns {String[]} The array of split query tokens
     */
    function splitQuery(query) {
        return query.split(/\s+/);
    }
}

/* JSDoc type definition for search index */
/**
 * @typedef SearchIndex
 * @type {object|null}
 * @property {Array<String>} docnames
 * @property {Record<String,Number>} envversion
 * @property {Array<String>} filenames
 * @property {Record<String, Array<Array<String>>>} objects
 * @property {Record<String,Array<String>>} objnames
 * @property {Record<String,Array<String>>} objtypes
 * @property {Record<String,Array<Number>>} terms
 * @property {Array<String>} titles
 * @property {Record<String,Array<Number>>} titleterms
 */

/**
 * Search Module
 */
var Search = {
    /**
     * The length of text to use for the summary of each search result. If the summary text
     * is longer than this length, an ellipsis (...) will be appended.
     * The Sphinx default value is 240.
     */
    _summaryTextLength : 300,
    /**
     * Use the default Sphinx search summary generator instead of using the first x characters
     * of the summary text.
     */
    _useDefaultSearchSummary : false,

    /** @type {SearchIndex|null} */
    _index : null,
    /** @type {String|null} */
    _queued_query : null,
    /** @type {Number} */
    _pulse_status : -1,

    /**
     * Convert the supplied HTML string into text
     * @param {String} htmlString
     * @returns {string|*}
     */
    htmlToText : function(htmlString) {
        /** @type {Document} */
        var virtualDocument = document.implementation.createHTMLDocument('virtual');
        /** @type {jQuery} */
        var htmlElement = $(htmlString, virtualDocument);
        htmlElement.find('.headerlink').remove();
        const docContent = htmlElement.find('[role=main]')[0];
        if (docContent === undefined) {
            console.warn("Content block not found. Sphinx search tries to obtain it " +
                "via '[role=main]'. Could you check your theme or template.");
            return "";
        }
        return docContent.textContent || docContent.innerText;
    },

    init : function() {
        var params = $.getQueryParameters();
        if (params.q) {
            var query = params.q[0];
            $('input[name="q"]')[0].value = query;
            this.performSearch(query);
        }
    },

    /**
     * Load the search index data from the specified URL
     * @param url {String} The URL to load search index data from
     */
    loadIndex : function(url) {
        $.ajax({type: "GET", url: url, data: null,
            dataType: "script", cache: true,
            complete: function(jqxhr, textstatus) {
                if (textstatus !== "success") {
                    document.getElementById("searchindexloader").src = url;
                }
            }});
    },

    /**
     * Set search index data and perform a search if a queued query exists
     * @param index {SearchIndex}
     */
    setIndex : function(index) {
        /** @type {String} */
        var q;
        this._index = index;
        if ((q = this._queued_query) !== null) {
            this._queued_query = null;
            Search.query(q);
        }
    },

    hasIndex : function() {
        return this._index !== null;
    },

    /**
     * Queue a query to run at a later time
     * @param query {String} The query to queue
     */
    deferQuery : function(query) {
        this._queued_query = query;
    },

    stopPulse : function() {
        this._pulse_status = 0;
    },

    startPulse : function() {
        if (this._pulse_status >= 0)
            return;
        function pulse() {
            var i;
            Search._pulse_status = (Search._pulse_status + 1) % 4;
            var dotString = '';
            for (i = 0; i < Search._pulse_status; i++)
                dotString += '.';
            Search.dots.text(dotString);
            if (Search._pulse_status > -1)
                window.setTimeout(pulse, 500);
        }
        pulse();
    },

    /**
     * perform a search for something (or wait until index is loaded)
     * @param query {String} The search query to perform
     */
    performSearch : function(query) {
        // create the required interface elements
        this.out = $('#search-results');
        this.title = $('<h2>' + _('Searching') + '</h2>').appendTo(this.out);
        this.dots = $('<span></span>').appendTo(this.title);
        this.status = $('<p class="search-summary">&nbsp;</p>').appendTo(this.out);
        this.output = $('<ul class="search"/>').appendTo(this.out);

        $('#search-progress').text(_('Preparing search...'));
        this.startPulse();

        // index already loaded, the browser was quick!
        if (this.hasIndex())
            this.query(query);
        else
            this.deferQuery(query);
    },

    /**
     * execute search (requires search index to be loaded)
     * @param query {String} The search query to perform
     */
    query : function(query) {
        /** @type {Number} */
        var i;

        // stem the searchterms and add them to the correct list
        var stemmer = new Stemmer();
        /** @type {String[]} */
        var searchterms = [];
        /** @type {String[]} */
        var excluded = [];
        /** @type {String[]} */
        var hlterms = [];
        var tmp = splitQuery(query);
        /** @type {String[]} */
        var objectterms = [];
        for (i = 0; i < tmp.length; i++) {
            if (tmp[i] !== "") {
                objectterms.push(tmp[i].toLowerCase());
            }

            if ($u.indexOf(stopwords, tmp[i].toLowerCase()) !== -1 || tmp[i] === "") {
                // skip this "word"
                continue;
            }
            // stem the word
            /** @type {String} */
            var word = stemmer.stemWord(tmp[i].toLowerCase());
            // prevent stemmer from cutting word smaller than two chars
            if (word.length < 3 && tmp[i].length >= 3) {
                word = tmp[i];
            }
            /** @type {String[]} */
            var toAppend;
            // select the correct list
            if (word[0] === '-') {
                toAppend = excluded;
                word = word.substr(1);
            }
            else {
                toAppend = searchterms;
                // Effectively disable highlighting by not collecting any highlight terms
                // Comment the line below to disable highlighting
                hlterms.push(tmp[i].toLowerCase());
            }
            // only add if not already in the list
            if (!$u.contains(toAppend, word))
                toAppend.push(word);
        }

        // Uncomment the line below to enable highlighting
        // var highlightstring = '?highlight=' + $.urlencode(hlterms.join(" "));

        // console.debug('SEARCH: searching for:');
        // console.info('required: ', searchterms);
        // console.info('excluded: ', excluded);

        // prepare search
        var terms = this._index.terms;
        var titleterms = this._index.titleterms;

        // array of [filename, title, anchor, descr, score]
        /** @type {Array<Array<String|Number>>} */
        var results = [];
        $('#search-progress').empty();

        // lookup as object
        for (i = 0; i < objectterms.length; i++) {
            /** @type {String[]} */
            var others = [].concat(objectterms.slice(0, i),
                objectterms.slice(i+1, objectterms.length));
            results = results.concat(this.performObjectSearch(objectterms[i], others));
        }

        // lookup as search terms in fulltext
        results = results.concat(this.performTermsSearch(searchterms, excluded, terms, titleterms));

        // let the scorer override scores with a custom scoring function
        if (Scorer.score) {
            for (i = 0; i < results.length; i++)
                results[i][4] = Scorer.score(results[i]);
        }

        // now sort the results by score (in opposite order of appearance, since the
        // display function below uses pop() to retrieve items) and then
        // alphabetically
        results.sort(function(a, b) {
            /** @type {String|Number} */
            var left = a[4];
            /** @type {String|Number} */
            var right = b[4];
            if (left > right) {
                return 1;
            } else if (left < right) {
                return -1;
            } else {
                // same score: sort alphabetically
                left = a[1].toLowerCase();
                right = b[1].toLowerCase();
                return (left > right) ? -1 : ((left < right) ? 1 : 0);
            }
        });

        // for debugging
        //Search.lastresults = results.slice();  // a copy
        //console.info('search results:', Search.lastresults);

        // print the results
        var resultCount = results.length;
        function displayNextItem() {
            // results left, load the summary and display it
            if (results.length) {
                var item = results.pop();
                var listItem = $('<li></li>');
                /** @type {String} */
                var requestUrl;
                /** @type {String} */
                var linkUrl;
                if (DOCUMENTATION_OPTIONS.BUILDER === 'dirhtml') {
                    // dirhtml builder
                    var dirname = item[0] + '/';
                    if (dirname.match(/\/index\/$/)) {
                        dirname = dirname.substring(0, dirname.length-6);
                    } else if (dirname === 'index/') {
                        dirname = '';
                    }
                    requestUrl = DOCUMENTATION_OPTIONS.URL_ROOT + dirname;
                    linkUrl = requestUrl;
                } else {
                    // normal html builders
                    requestUrl = DOCUMENTATION_OPTIONS.URL_ROOT + item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX;
                    linkUrl = item[0] + DOCUMENTATION_OPTIONS.LINK_SUFFIX;
                }

                // Uncomment the 'highlightstring' text below to enable highlighting on the linked page
                listItem.append($('<a/>').attr('href',
                    linkUrl +
                    /* highlightstring + */ item[2]).html(item[1]));

                if (item[3]) {
                    listItem.append($('<span> (' + item[3] + ')</span>'));
                    Search.output.append(listItem);
                    setTimeout(function() {
                        displayNextItem();
                    }, 5);
                } else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) {
                    $.ajax({url: requestUrl,
                        dataType: "text",
                        complete: function(jqxhr, textstatus) {
                            var data = jqxhr.responseText;
                            if (data !== '' && data !== undefined) {
                                var summary = Search.makeSearchSummary(data, searchterms, hlterms);
                                if (summary) {
                                    listItem.append(summary);
                                }
                            }
                            Search.output.append(listItem);
                            setTimeout(function() {
                                displayNextItem();
                            }, 5);
                        }});
                } else {
                    // no source available, just display title
                    Search.output.append(listItem);
                    setTimeout(function() {
                        displayNextItem();
                    }, 5);
                }
            }
            // search finished, update title and status message
            else {
                Search.stopPulse();
                Search.title.text(_('Search Results'));
                if (!resultCount)
                    Search.status.text(_('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.'));
                else
                    Search.status.text(_('Search finished, found %s page(s) matching the search query.').replace('%s', resultCount));
                Search.status.fadeIn(500);
            }
        }
        displayNextItem();
    },

    /**
     * search for object names
     * @param object {String}
     * @param otherterms {String[]}
     * @returns {Array<Array<String|Number>>}
     */
    performObjectSearch : function(object, otherterms) {
        var filenames = this._index.filenames;
        var docnames = this._index.docnames;
        var objects = this._index.objects;
        var objnames = this._index.objnames;
        var titles = this._index.titles;

        /** @type {Number} */
        var i;
        /** @type {Array<Array<String|Number>>} */
        var results = [];

        for (var prefix in objects) {
            for (var iMatch = 0; iMatch !== objects[prefix].length; ++iMatch) {
                var match = objects[prefix][iMatch];
                var name = match[4];
                var fullname = (prefix ? prefix + '.' : '') + name;
                var fullnameLower = fullname.toLowerCase()
                if (fullnameLower.indexOf(object) > -1) {
                    var score = 0;
                    var parts = fullnameLower.split('.');
                    // check for different match types: exact matches of full name or
                    // "last name" (i.e. last dotted part)
                    if (fullnameLower === object || parts[parts.length - 1] === object) {
                        score += Scorer.objNameMatch;
                        // matches in last name
                    } else if (parts[parts.length - 1].indexOf(object) > -1) {
                        score += Scorer.objPartialMatch;
                    }
                    var objname = objnames[match[1]][2];
                    var title = titles[match[0]];
                    // If more than one term searched for, we require other words to be
                    // found in the name/title/description
                    if (otherterms.length > 0) {
                        var haystack = (prefix + ' ' + name + ' ' +
                            objname + ' ' + title).toLowerCase();
                        var allfound = true;
                        for (i = 0; i < otherterms.length; i++) {
                            if (haystack.indexOf(otherterms[i]) === -1) {
                                allfound = false;
                                break;
                            }
                        }
                        if (!allfound) {
                            continue;
                        }
                    }
                    var descr = objname + _(', in ') + title;

                    var anchor = match[3];
                    if (anchor === '')
                        anchor = fullname;
                    else if (anchor === '-')
                        anchor = objnames[match[1]][1] + '-' + fullname;
                    // add custom score for some objects according to scorer
                    if (Scorer.objPrio.hasOwnProperty(match[2])) {
                        score += Scorer.objPrio[match[2]];
                    } else {
                        score += Scorer.objPrioDefault;
                    }
                    results.push([
                        docnames[match[0]],
                        fullname,
                        '#'+anchor,
                        descr,
                        score,
                        filenames[match[0]]
                    ]);
                }
            }
        }

        return results;
    },

    /**
     * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions
     * @param {String} string
     */
    escapeRegExp : function(string) {
        return string.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
    },

    /**
     * search for full-text terms in the index
     * @param {Array<String>} searchterms
     * @param {Array<String>} excluded
     * @param {Record<String,Array<Number>>} terms
     * @param {Record<String,Array<Number>>} titleterms
     * @returns {Array<Array<(String|Number|null)>>}
     */
    performTermsSearch : function(searchterms, excluded, terms, titleterms) {
        var docnames = this._index.docnames;
        var filenames = this._index.filenames;
        var titles = this._index.titles;

        /** @type {Number} */
        var i, j;
        /** @type {(String|Array<String>)} */
        var file;
        /** @type {Record<String,Array<String>>} */
        var fileMap = {};
        /** @type {Record<String,Record<String,Number>>} */
        var scoreMap = {};
        /** @type {Array<Array<(String|Number|null)>>} */
        var results = [];

        // perform the search on the required terms
        for (i = 0; i < searchterms.length; i++) {
            var word = searchterms[i];
            /** @type {Array<Array<String>>} */
            var files = [];
            /** @type {Array<{files: Array<Number>, score: Number}>} */
            var _o = [
                {files: terms[word], score: Scorer.term},
                {files: titleterms[word], score: Scorer.title}
            ];
            // add support for partial matches
            if (word.length > 2) {
                var word_regex = this.escapeRegExp(word);
                for (const w in terms) {
                    if (w.match(word_regex) && !terms[word]) {
                        _o.push({files: terms[w], score: Scorer.partialTerm})
                    }
                }
                for (const w in titleterms) {
                    if (w.match(word_regex) && !titleterms[word]) {
                        _o.push({files: titleterms[w], score: Scorer.partialTitle})
                    }
                }
            }

            // no match but word was a required one
            if ($u.every(_o, function(o){return o.files === undefined;})) {
                break;
            }
            // found search word in contents
            $u.each(_o, function(o) {
                /** @type {Array<(String|Array<String>)>} */
                var _files = o.files;
                if (_files === undefined)
                    return

                if (_files.length === undefined)
                    _files = [_files];
                files = files.concat(_files);

                // set score for the word in each file to Scorer.term
                for (j = 0; j < _files.length; j++) {
                    file = _files[j];
                    if (!(file in scoreMap))
                        scoreMap[file] = {};
                    scoreMap[file][word] = o.score;
                }
            });

            // create the mapping
            for (j = 0; j < files.length; j++) {
                file = files[j];
                if (file in fileMap && fileMap[file].indexOf(word) === -1)
                    fileMap[file].push(word);
                else
                    fileMap[file] = [word];
            }
        }

        // now check if the files don't contain excluded terms
        for (file in fileMap) {
            var valid = true;

            // check if all requirements are matched
            var filteredTermCount = // as search terms with length < 3 are discarded: ignore
                searchterms.filter(function(term){return term.length > 2}).length
            if (
                fileMap[file].length !== searchterms.length &&
                fileMap[file].length !== filteredTermCount
            ) continue;

            // ensure that none of the excluded terms is in the search result
            for (i = 0; i < excluded.length; i++) {
                if (terms[excluded[i]] === file ||
                    titleterms[excluded[i]] === file ||
                    $u.contains(terms[excluded[i]] || [], file) ||
                    $u.contains(titleterms[excluded[i]] || [], file)) {
                    valid = false;
                    break;
                }
            }

            // if we have still a valid result we can add it to the result list
            if (valid) {
                // select one (max) score for the file.
                // for better ranking, we should calculate ranking by using words statistics like basic tf-idf...
                /** @type {Number} */
                var score = $u.max($u.map(fileMap[file], function(w){return scoreMap[file][w]}));
                results.push([docnames[file], titles[file], '', null, score, filenames[file]]);
            }
        }
        return results;
    },

    /**
     * helper function to return a node containing the search summary for a given text.
     *
     * @param {String} htmlText The text to summarize
     * @param {Array<String>} keywords a list of stemmed words; used to find occurrence of the word in the summary
     * @param {Array<String>} hlwords the list of normal, unstemmed words; used to highlight the stemmed word
     * @returns {(jQuery|null)}
     */
    makeSearchSummary : function(htmlText, keywords, hlwords) {
        var text = Search.htmlToText(htmlText);
        if (text === "") {
            return null;
        }
        /** @type {String} */
        var excerpt;
        if (this._useDefaultSearchSummary) {
            /*
             * Default Sphinx search result summary
             */
            var textLower = text.toLowerCase();
            var start = 0;
            $.each(keywords, function() {
                var i = textLower.indexOf(this.toLowerCase());
                if (i > -1)
                    start = i;
            });
            const halfLength = this._summaryTextLength / 2;
            start = Math.max(start - halfLength, 0);
            excerpt = ((start > 0) ? '...' : '') +
                $.trim(text.substr(start, this._summaryTextLength)) +
                ((start + this._summaryTextLength - text.length) ? '...' : '');
        } else {
            /*
             * Search result summary using the first x number of characters
             */
            excerpt = $.trim(text.substr(0, this._summaryTextLength)) +
                (text.length > this._summaryTextLength ? '...' : '');
        }
        // build the search summary node
        var rv = $('<p class="context"></p>').text(excerpt);
        $.each(hlwords, function() {
            rv = rv.highlightText(this, 'highlighted');
        });
        return rv;
    }
};

$(document).ready(function() {
    Search.init();
});

source/_static/robots.txt METASEP
User-Agent: *
Disallow: /cgi-bin/
Disallow: /&utm_source
Disallow: /&utm_medium
Disallow: /&utm_campaign
Disallow: /?utm_

Sitemap: https://docs.mattermost.com/sitemap.xml

source/_static/mytheme.css METASEP
/* Redesign 2021 - Fonts */
@import url("https://use.typekit.net/hzs0pdc.css");
@import url('https://fonts.googleapis.com/css2?family=Fira+Mono:wght@400;700&family=Noto+Sans:ital,wght@0,400;0,700;1,400;1,700&display=swap');
/* Pygment CSS transfer to reduce CSS assets */
pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight { background: #eeffcc; }
.highlight .c { color: #408090; font-style: italic } /* Comment */
.highlight .err { border: 1px solid #FF0000 } /* Error */
.highlight .k { color: #007020; font-weight: bold } /* Keyword */
.highlight .o { color: #666666 } /* Operator */
.highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */
.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */
.highlight .cp { color: #007020 } /* Comment.Preproc */
.highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */
.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */
.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #A00000 } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #FF0000 } /* Generic.Error */
.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
.highlight .gi { color: #00A000 } /* Generic.Inserted */
.highlight .go { color: #333333 } /* Generic.Output */
.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
.highlight .gt { color: #0044DD } /* Generic.Traceback */
.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #007020 } /* Keyword.Pseudo */
.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #902000 } /* Keyword.Type */
.highlight .m { color: #208050 } /* Literal.Number */
.highlight .s { color: #4070a0 } /* Literal.String */
.highlight .na { color: #4070a0 } /* Name.Attribute */
.highlight .nb { color: #007020 } /* Name.Builtin */
.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */
.highlight .no { color: #60add5 } /* Name.Constant */
.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */
.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */
.highlight .ne { color: #007020 } /* Name.Exception */
.highlight .nf { color: #06287e } /* Name.Function */
.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */
.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */
.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #bb60d5 } /* Name.Variable */
.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #208050 } /* Literal.Number.Bin */
.highlight .mf { color: #208050 } /* Literal.Number.Float */
.highlight .mh { color: #208050 } /* Literal.Number.Hex */
.highlight .mi { color: #208050 } /* Literal.Number.Integer */
.highlight .mo { color: #208050 } /* Literal.Number.Oct */
.highlight .sa { color: #4070a0 } /* Literal.String.Affix */
.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */
.highlight .sc { color: #4070a0 } /* Literal.String.Char */
.highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */
.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */
.highlight .s2 { color: #4070a0 } /* Literal.String.Double */
.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */
.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */
.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */
.highlight .sx { color: #c65d09 } /* Literal.String.Other */
.highlight .sr { color: #235388 } /* Literal.String.Regex */
.highlight .s1 { color: #4070a0 } /* Literal.String.Single */
.highlight .ss { color: #517918 } /* Literal.String.Symbol */
.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #06287e } /* Name.Function.Magic */
.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */
.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */
.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */
.highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */
.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */
/* End Pygment */

@media screen and (min-width: 1400px) {
	.wy-nav-content {
		height: auto;
		max-width: 100%;
	}
}

html, body {
	height: 100%;
	overflow: hidden;
}

.pointer-events-none {
	pointer-events: none;
}

/* Thermometer */
:root {
	--center-channel-text-64: rgba(61, 60, 64, 0.64);
	--center-channel-text: rgba(61, 60, 64, 1);
}

.c-thermometer {
	padding: 2rem 0 0;
    display: block;
    width: 270px;
    text-align: center;
    position: absolute;
    right: -2rem;
    top: 0;
    border-radius: 20px;
	font-size: 14px;
}
.c-thermometer__trigger:hover {
	filter: grayscale(0);
}
.c-thermometer__popup p {
	margin: 0 2rem;
}

.c-thermometer .c-thermometer__paragraph {
	margin-bottom: 1rem;
	color: var(--center-channel-text-64);
}

.c-thermometer__close {
    cursor: pointer;
    position: absolute;
    width: 2rem;
    height: 2rem;
    display: flex;
    align-items: center;
    justify-content: center;
    color: #999;
    font-size: 1.4rem;
    right: 0.4rem;
    top: 0.4rem;
}

.c-thermometer__close:hover {
	color: #444;
}

.c-thermometer__emojis {
	position: relative;
	display: flex;
	align-items: center;
	justify-content: space-between;
}
.c-thermometer__emojis p {
	margin: 0;
	font-size: inherit;
	color: var(--center-channel-text-64);
}
.c-thermometer__emoji {
	font-size: 28px;
}
.c-thermometer__emojis a {
	z-index: 2;
	position: relative;
	color: inherit;
	text-decoration: none;
	transition: all 0.2s ease;
	-moz-transition: all 0.2s ease;
	-webkit-transition: all 0.2s ease;
	filter: grayscale(100%);
	flex: 1;
}
.c-thermometer__emojis a:hover, .c-thermometer__emojis a.selected {
	color: inherit;
	filter: grayscale(0);
}
/* Thermometer ends */

/* Thermometer Modal */

.c-thermometer-modal__container {
	display: none;
	position: fixed;
    left: 0;
    top: 0;
    width: 100%;
    height: 100%;
    z-index: 9999;
    background: rgb(0 0 0 / 50%);
}

.c-thermometer-modal__container > div {
	display: flex;
	align-items: center;
    justify-content: center;
	position: fixed;
    left: 0;
    top: 0;
    width: 100%;
    height: 100%;
	padding: 0 24px;
}

.c-thermometer-modal__content {
    background: #fff;
    border-radius: 10px;
    padding: 24px;
    max-width: 368px;
    width: 100%;
}

.c-thermometer-modal__content h3 {
	color: var(--center-channel-text);
	margin-bottom: 12px;
}

.c-thermometer-modal__textarea-footer {
	display: flex;
	justify-content: space-between;
	font-size: 12px;
	line-height: 24px;
}

.c-thermometer-modal__textarea__error {
	color: #FD5960;
	display: none;
}

.c-thermometer-modal__counter {
	color: var(--center-channel-text-64);
	text-align: right;
}

.c-thermometer-modal__content p {
	font-size: 14px;
	line-height: 17px;
	margin-bottom: 1rem;
	color: var(--center-channel-text-64);
}

.c-thermometer-modal__content textarea {
	border-radius: 4px;
	height: 142px;
	padding: 14px;
	font-size: 16px;
	resize: none;
	border: 1px solid rgba(61, 60, 64, 0.16);
	box-shadow: none;
}


.c-thermometer-modal__content textarea:focus {
	border-color:#166DE0;
}

.c-thermometer-modal__footer {
	display: flex;
    justify-content: center;
    padding-top: 20px;
}

.c-thermometer-modal__footer .btn {
	border-radius: 4px;
	height: 40px;
	padding: 0 20px;
	display: flex;
	justify-content: center;
	align-items: center;
	font-weight: 600;
	font-size: 14px;
	border: none;
}

.c-thermometer-modal__footer .btn-primary {
	background: #166DE0;
}

.c-thermometer-modal__footer .btn-primary:hover, .c-thermometer-modal__footer .btn-primary:focus, .c-thermometer-modal__footer .btn-primary:active {
	background: rgb(19, 93, 190);
}

/* Thermometer Modal Ends */

/* Thermometer Confirmation Popup */

.c-thermometer-popup {
	border-radius: 8px;
	border: 1px solid rgba(61, 60, 64, 0.08);
	box-shadow: 0px 4px 6px rgba(0, 0, 0, 0.12);
	padding: 16px 40px 24px;
	display: none;
	text-align: center;
	max-width: 210px;
	position: absolute;
    right: 0;
    top: -120px;
    background: white;
	z-index: 9;
}

.c-thermometer-popup h5 {
	font-size: 14px;
	margin: 8px 0;
	color: var(--center-channel-text);
}

.c-thermometer-popup p {
	font-size: 12px;
    line-height: 1.5;
    text-align: center;
	margin: 0;
}

.c-thermometer-popup__close {
	position: absolute;
	width: 24px;
	height: 24px;
	color: rgba(61, 60, 64, 0.72);
	display: flex;
	align-items: center;
	justify-content: center;
	border-radius: 4px;
	right: 8px;
    top: 8px;
    font-size: 22px;
    cursor: pointer;
    font-family: sans-serif;
    font-weight: 300;
}

.c-thermometer-popup__close:hover {
	color: var(--center-channel-text);
}

/* Thermometer Confirmation Popup Ends */

footer:not(.site-footer) {
	position: relative;
    border-top: 1px solid #dedede;
    margin-top: 24px;
	padding: 24px 0 40px;
	line-height: 150%;
    font-size: 14px;
}

footer:not(.site-footer) p {
	line-height: 150%;
    font-size: 14px;
}

.rst-footer-buttons {
	padding-bottom: 16px;
	width: 100%;
    display: flex;
    justify-content: flex-end;
    flex-direction: row-reverse;
    flex-wrap: wrap;
}

.rst-footer-buttons a:last-child {
	margin-right: 16px;
}

footer hr {
	display: none;
}

@media (max-width: 1024px) {
	footer {
		padding: 160px 0 20px;
	}

	.c-thermometer {
		width: 100%;
		left: 0;
		display: flex;
		justify-content: center;
		position: relative;
	}

	.c-thermometer__trigger {
		width: 270px;
	}

	.c-thermometer-popup {
		max-width: 100%;
		width: 100%;
		top: 20px;
	}
}



.features__table {
	margin-bottom: 50px;
}

.features__table td {
	padding: 10px 20px;
	width: 50%;
}

.features__table img {
	width: 100%;
}

.features__table p {
	font-size: 15px;
	line-height: 1.5;
	margin-top: 10px;
	opacity: .7;
}

.features__table h4 {
	margin-bottom: 10px;
	font-size: 17px;
	color: #555;
}

.rst-versions .rst-other-versions {
	color: rgba(255, 255, 255, 0.6);
	display: none;
	font-size: 90%;
	padding: 12px;
}

.rst-versions .rst-current-version {
	background-color: rgba(255, 255, 255, 0.1);
	color: #fff;
	text-transform: uppercase;
}

.rst-versions {
	background: #404040 none repeat scroll 0 0;
	border-style: none; /* removes the underlying theme's top border */
}

.rst-versions .rst-current-version .fa-cog {
	float: left;
}

.rst-versions.shift-up .rst-current-version .fa.fa-angle-up:before {
	/* converts to angle-down when the .shift-up class is applied (e.g. the options pane is visible) */
	content: "\f107";
}

.rst-content tt.literal, .rst-content tt.literal, .rst-content code.literal {
	color: #151515;
	background: #EEEEEE;
}

.rst-content .heading-link h4 {
	font-size: 105%;
}

.rst-content li > *:not(.first).admonition {
	margin-top: 12px;
	margin-bottom: 12px;
}

.rst-content li > img:not(.first) {
	margin-bottom: 12px;
}

.wy-grid-for-nav {
	padding-top: 70px;
}

.rst-versions {
	width: 350px;
}

.wy-nav-content {
	height: auto;
	width: 100%;
    max-width: 100%;
	padding-top: 26px;
}

.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a {
	padding-left: 4rem;
	border: none;
}

.wy-table td, .rst-content table.docutils td, .rst-content table.field-list td {
	vertical-align: top;
}

.wy-nav-content .document {
	max-width: 1000px;
}

.wy-menu-vertical > ul.current {
	display: block;
}

.wy-menu-vertical li.toctree-l2.current li.toctree-l3.current >a {
    background: #E0E0E0;
}

.wy-menu-vertical li.toctree-l3.current li.toctree-l4.current > a {
	background: #cacaca;
}
.wy-menu-vertical li.toctree-l3.current li.toctree-l4 > a {
	font-weight: bold;
    font-size: 0.95em;
}

.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a {
	background: transparent;
	padding-right: 1em;
	overflow: hidden;
	text-overflow: ellipsis;
}

.wy-menu-vertical li.toctree-l3.current li.toctree-l4> a code {
	font-size: 1em;
    font-family: "Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;
}

.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a {
	background: transparent;
	border: none;
	font-size: 1em;
}

.wy-menu-vertical li.toctree-l2.current>a {
	background: #E0E0E0;
	border-color: #ddd;
	border-top: none;
}

.wy-menu-vertical li a {
	white-space: nowrap;
}

.wy-menu-vertical li.on a, .wy-menu-vertical li.current>a {
	border-bottom: 1px solid #ddd;
}

.wy-menu-vertical p.caption {
	color: #555;
	font-weight: bold;
	margin: 4px 0;
	height: 33px;
	background: #CACACA;
	cursor:pointer;
}

.wy-menu-vertical p.caption:first-child {
	margin-top: -6px;
	border-top: 0;
}

.rst-content tt, .rst-content tt, .rst-content code {
	white-space: normal;
}

.rst-content .line-block {
	margin-left: 0;
	line-height: 24px;
}

.rst-content .highlight>pre {
	line-height: 1.5;
}

.rst-content dl dt {
	margin-bottom: 5px;
	line-height: 24px;
}

.wy-nav-content-wrap {
	margin-left: 350px;
	height: 100%;
	overflow: auto;
}

h1, h2, .rst-content .toctree-wrapper p.caption, h3, h4, h5, h6, legend {
	font-family: "Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;
}

.wy-menu-vertical a {
	color: #888;
	font-size: 15px;
}

.wy-menu-vertical li.current a {
	font-size: 14.5px;
	padding-left: 2em;
}

.wy-menu-vertical li.toctree-l2.current>a {
	padding-left: 2.4em;
}

.wy-menu-vertical li.toctree-l2 a {
	padding-left: 2.4em;
}

.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a {
	padding-left: 3.3em;
}

.wy-menu-vertical li.current {
	background: #ececec;
}

.wy-menu-vertical a:hover {
	background-color: #E7EFF5;
}

.wy-side-scroll {
	width: 100%;
}

.wy-menu-vertical {
	width: 100%;
	top: 130px;
	position: relative;
}

.wy-nav-side {
	width: 350px;
	border-right: 1px solid #ddd;
	background: #f9f9f9;
}

.wy-side-nav-search {
	width: 350px;
	margin-top: 70px;
	border-right: 1px solid #ddd;
}

.wy-side-nav-search .icon, .wy-side-nav-search .version {
	display: none;
}

.wy-body-for-nav {
	position: relative;
	width: 100%;
	height: 100%;
	background: transparent;
}

.wy-side-nav-search input[type=text] {
	border: 1px solid #ddd;
}

.wy-side-nav-search {
	background: #f9f9f9;
	position: fixed;
	padding-bottom: 10px;
	border-bottom: 1px solid #ddd;
}

/* header .links__icon {
	cursor: pointer;
	display: none;
	float: right;
	font-size: 20px;
	padding: 0 20px;
	position: relative;
} */

.search__icon {
	cursor: pointer;
	display: inline-block;
	font-size: 16px;
	padding: 0 20px;
	color: #1C58D9;
	position: relative;
}

@media screen and (min-width: 770px) {
	.search__icon {
		display: none;
	}
}

.search__icon span {
	font-family: "trade-gothic-next","Lato","Helvetica Neue","Arial",sans-serif;
	font-size: 16px;
}

.search__icon:hover {
	color: #1E325C;
}

.wy-nav-top {
	background: #F5F5F5;
	padding: 0 10px;
	color: #222;
	border-bottom: 1px solid #ccc;
}

.wy-nav-top a {
	color: inherit;
}

.wy-nav-top i {
	color: #999;
	font-size: 20px;
	top: 14px;
	left: 5px;
	position: relative;
}

/* header {
	height: 60px;
	line-height: 60px;
	z-index: 999;
	position: fixed;
	top: 0;
	width: 100%;
}

header .header__container {
	background: #fff;
	border-bottom: 1px solid #ddd;
	color: #444;
	height: 70px;
	line-height: 67px;
}

header .header__logo img {
	top: -1px;
	position: relative;
}

header .header__logo {
	margin-left: 15px;
	float: left;
}

header .header__links {
	float: right;
	padding: 0 5px 0 0;
}

header .header__links li {
	float: left;
	display: block;
}

header .header__links li a.active {
	color: #2e97e2;
	border-color: #2e97e2;
}

header .header__links li a {
	font-size: 15px;
	padding: 0 1em;
	color: inherit;
	display: block;
	border-top: 3px solid transparent;
}
*/

header .header__searchbar {
	display: none;
	float: left;
	padding: 0 5px 0 0;
} 

@media (max-width: 768px){
	.wy-nav-side {
		left: -350px;
	}

	header .links__icon {
		display: block;
	}
	.wy-nav-top {
		display: none;
	}
	.wy-side-nav-search {
		position: relative;
	}
	.wy-menu-vertical {
		top: 0;
	}
	.wy-nav-content-wrap {
		margin-left: 0;
		overflow-y: scroll;
		-webkit-overflow-scrolling: touch;
	}
	.wy-nav-content-wrap.shift {
		top: 70px;
	}
	header .search__icon {
		display: block;
		position: absolute;
		left: -5px;
		top: 0px;
		z-index: 10;
		padding: 20px;
	}
	/* header .header__container {
		text-align:center;
	}
	header .links__icon {
		display: block;
	}
	header .header__logo {
		position: relative;
		margin-left: auto;
		margin-right: auto;
		float:none;
	}
	header .header__logo img {
		width: 176px;
	}
	header .header__links {
		border-bottom: 1px solid #ccc;
		display: none;
		background: #fff;
		line-height: 40px;
		padding: 0 15px 5px;
		width: 100%;
	}
	header .header__links li {
		float: none;
	}
	header .header__links li a {
		display: block;
		padding-left: 0;
	} */
	header .header__searchbar {
		border-bottom: 1px solid #ccc;
		display: none;
		background: #fff;
		line-height: 40px;
		padding: 15px;
		width: 100%;
	}
	header .header__searchbar input[type="text"] {
		width: 100%;
		border-radius: 50px;
		border: 1px solid #ddd;
		padding: 6px 12px;
	}
	header .header__searchbar input:focus {
		outline: none;
	}
	img {
		max-width: 100%;
		width: auto;
	}
}

@media screen and (min-width: 1400px) {
	.wy-nav-content-wrap {
    	background: #fcfcfc; /* gets rid of the wony gray bottom of the page when viewed on a wide screen */
	}
}


/* override table width restrictions */
@media screen and (min-width: 767px) {

   .wy-table-responsive table td {
      /* !important prevents the common CSS stylesheets from overriding
         this as on RTD they are loaded after this stylesheet */
      white-space: normal !important;
   }

   .wy-table-responsive {
      overflow: visible !important;
   }
}

@media print {
	body,
	div.wy-grid-for-nav,
	section.wy-nav-content-wrap {
		height: auto;
	}

	body {
		overflow: visible;
	}

	section.wy-nav-content-wrap {
		margin-left: 0px;
	}

	header {
		position: absolute;
	}

	.header__container > :not(.header__logo) {
		display: none;
	}

	div.c-thermometer__trigger {
		display: none;
	}
}

/* Notification Banner */

.notification-bar {
	color: #1B1D22;
    text-align: center;
    display: none;
    width: 100%;
    align-items: center;
    justify-content: center;
    height: 45px;
	background-color: #FFBC1F;
    position: fixed;
    z-index: 9999;
}

@media (max-width: 770px) {
    .notification-bar {
        text-align: left;
        /* TEMP FOR LONG COPY */
        height: 70px;
    }
}


.notification-bar.closed {
    display: none;
}

.notification-bar__content {
    /* padding: 0.5rem 1rem; */
	font-family: "trade-gothic-next","Lato","Helvetica Neue","Arial",sans-serif;
	font-weight: 700;
    font-size: 15px;
	line-height: 1.2;
    width: 100%;
    /* TEMP FOR LONG COPY */
    padding: 0.5rem 3rem 0.5rem 1rem;
}

.notification-bar__content > div {
	overflow: hidden;
    text-overflow: ellipsis;
	display: flex;
	align-items: center;
	justify-content: center;
}

.notification-bar__content > div img {
	display: none;
}

.notification-bar a {
    color: #1B1D22;
}

.notification-bar__close {
    font-size: 36px;
    font-weight: 300;
    position: absolute;
    cursor: pointer;
    right: -5px;
    opacity: .3;
    top: 0;
    width: 64px;
    line-height: 35px;
}

@media (max-width: 770px) {
    .notification-bar__close {
        /* TEMP FOR LONG COPY */
        right: -25px;
        top: 10px;
    }
}

.notification-bar-hide:hover {
    opacity: .5;
}

.with-notification .wy-side-scroll {
	padding-top: 62px;
}

.with-notification .notification-bar {
	display: flex;
}

.with-notification header {
	top: 46px;
}

@media (max-width: 770px) {
    .with-notification header  {
         /* TEMP FOR LONG COPY */
        top: 70px;
    }
}

.with-notification .wy-grid-for-nav {
	padding-top: 114px;
}

/* Redesign 2021 - BASE */
body {
	font-family: 'Noto Sans','Helvetica Neue',Arial,sans-serif;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	color: #363A45;
}

h1,h2,h3,h4,h5,h6 {
	font-family: 'trade-gothic-next',sans-serif;
	font-weight: 800;
}

.document p {
	line-height: 150%;
}

a,
.rst-content a:visited {
	color: #1C58D9;
}

a:hover {
	color: #1E325C;
}

pre {
	font-family: 'Fira Mono','Courier New',Courier,monospace;
}

/* Redesign 2021 - NAV */

.header__logo img {
	height: 40px !important;
	width: auto !important;
}

/* Redesign 2021 - SIDE MENU */

.wy-menu,
.wy-breadcrumbs,
.header__links {
	font-family: 'trade-gothic-next',sans-serif;
}

.wy-breadcrumbs li.wy-breadcrumbs-aside {
	display: block;
	float: none;
}

@media (max-width: 770px) {
	.wy-breadcrumbs li.wy-breadcrumbs-aside {
		margin-top: 20px;
	}
	.wy-breadcrumbs li.wy-breadcrumbs-aside .search__icon {
		padding: 0 20px 0 0;
	}
}

@media (min-width: 770px) {
	.wy-breadcrumbs li.wy-breadcrumbs-aside {
		float: right;
	}
}


.wy-menu-vertical a {
	color: #888;
}

.wy-menu > ul > li.current >a {
	font-weight: 800;
	font-size: 16px;
	line-height: 152.7%;
}

/* Redesign 2021 - CONTENT */
.document ul,
.document ol {
	padding-left: 10px;
}
.document ul li,
.document ol li {
	margin-bottom: 5px;
}

/* Redesign 2021 - CODE BLOCKS */

.highlight {
	background-color: #eff4ff;
	/* background-color: #C5D2EC; */
}

/* Redesign 2021 - NOTE BLOCKS */
.document .admonition-title {
	background-color: #1E325C !important;
}

.document .admonition.note,
.document .admonition.tip {
	background-color: #EBEBEF !important;
}

.document .admonition.note p:not(.admonition-title ) {
	padding-left: 15px;
	padding-right: 15px;
}

/* Redesign 2021 - HEADER */
*,
:after,
:before {
    box-sizing: border-box;
}
.nav-container {
    width: 100%;
    max-width: 1100px;
    margin-right: auto;
    margin-left: auto;
}
.site-header--not-home .nav-container {
    max-width: 1900px;
}
@media (max-width: 1199.98px) {
    .nav-container {
        padding: 0 40px;
    }
}
@media (max-width: 991.98px) {
    .nav-container {
        padding: 0 32px;
    }
}
@media (max-width: 767.98px) {
    .nav-container {
        padding: 0 24px ;
    }
	div:not(.site-header--not-home) .nav-container .site-header__col--logo {
		padding-left: 50px;
	}
}
@media (min-width: 991.98px) {
    .notification-bar__content > div img {
		display: inline-block;
		margin-right: 10px;
	}
	.site-header--not-home .nav-container {
		padding-left: 50px;
		padding-right: 50px;
	}
}
@media (min-width: 1400px) {
	.site-header--not-home .nav-container {
		padding-right: 20vw;
	}
}
.row {
    display: flex;
    flex-wrap: wrap;
    margin-right: -24px;
    margin-left: -24px;
}
@media (max-width: 767.98px) {
    .row {
        margin-left: -24px;
        margin-right: -24px;
    }
}
.col,
.col-3,
.col-9,
.col-12,
.col-lg-2,
.col-lg-10,
.col-md-3,
.col-md-9 {
    position: relative;
    width: 100%;
    padding-right: 24px;
    padding-left: 24px;
}
.col {
    flex-basis: 0;
    flex-grow: 1;
    max-width: 100%;
}
.col-3 {
    flex: 0 0 25%;
    max-width: 25%;
}
.col-9 {
    flex: 0 0 75%;
    max-width: 75%;
}
.col-12 {
    flex: 0 0 100%;
    max-width: 100%;
}
@media (min-width: 768px) {
    .col-md-3 {
        flex: 0 0 25%;
        max-width: 25%;
    }
    .col-md-9 {
        flex: 0 0 75%;
        max-width: 75%;
    }
}
@media (min-width: 992px) {
    .col-lg-2 {
        flex: 0 0 16.666667%;
        max-width: 16.666667%;
    }
    .col-lg-10 {
        flex: 0 0 83.333333%;
        max-width: 83.333333%;
    }
}
@media (max-width: 991.98px) {
    .nav-open header {
        position: fixed;
        height: 100vh;
        overflow-x: hidden;
    }
    .nav-open .site-header {
        bottom: 0;
        overflow-x: hidden;
    }
    .nav-open .site-header__col--menu {
        height: calc(100vh - 75px);
        overflow-y: scroll;
        overflow-x: hidden;
        padding-bottom: 100px;
    }
}
.site-header {
	font-family: 'trade-gothic-next',sans-serif;
    background: #fff;
    box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
    position: sticky;
    top: 0;
    width: 100%;
    z-index: 1000;
}
.site-header__col--logo {
    display: flex;
    align-items: center;
    padding-left: 10px;
}
@media (max-width: 991.98px) {
    .site-header__col--logo {
        padding-top: 15px;
        padding-bottom: 15px;
    }
}
.site-header__col--logo img {
    width: 190px;
    max-width: none;
}
.site-header__col--menu .site-nav {
    display: none;
    list-style-type: none;
    margin: 0;
    padding-left: 0;
}
@media (max-width: 991.98px) {
    .site-header__col--menu .site-nav:before {
        content: "";
        position: absolute;
        left: -10px;
        overflow: hidden;
        top: 0;
        height: 2px;
        background-color: #ffbc1f;
        width: calc(100% + 20px);
    }
}
@media (min-width: 992px) {
    .site-header__col--menu .site-nav {
        display: flex;
    }
}
@media (min-width: 992px) {
    .site-header__col--menu .site-nav__hassubnav .sub-menu {
        opacity: 0;
        position: absolute;
    }
}
@media (max-width: 991.98px) {
    .site-header__col--menu .site-nav__toplink {
        border-bottom: 1px solid #babec9;
    }
}
.site-header__col--menu .site-nav__toplink > a {
    color: #1b1d22;
    display: block;
    font-size: 18px;
    line-height: 1;
    padding: 40px 0;
    text-decoration: none;
    transition: color 0.3s ease-in-out;
}
@media (min-width: 992px) {
    .site-header__col--menu .site-nav__toplink > a {
        line-height: 150%;
        padding: 26px 5px;
        font-size: 14px;
    }
}
@media (min-width: 1200px) {
    .site-header__col--menu .site-nav__toplink > a {
        padding: 26px 10px;
    }
}
@media (min-width: 1400px) {
    .site-header__col--menu .site-nav__toplink > a {
        padding: 26px 10px;
        font-size: 15px;
    }
}
@media (max-width: 991.98px) {
    .site-header__col--menu .site-nav__toplink > a span {
        float: right;
    }
    .site-header__col--menu .site-nav__toplink > a span svg {
        height: 18px;
        transform: rotate(-90deg);
        width: 26px;
    }
    .site-header__col--menu .site-nav__toplink > a span svg path {
        stroke: #1c58d9;
    }
}
.site-header__col--menu .site-nav__toplink > a span svg path {
    transition: stroke 0.3s ease-in-out;
}
.site-header__col--menu .site-nav__toplink > a:focus,
.site-header__col--menu .site-nav__toplink > a:hover {
    color: #1c58d9;
}
.site-header__col--menu .site-nav__toplink > a:focus span svg path,
.site-header__col--menu .site-nav__toplink > a:hover span svg path {
    stroke: #1c58d9;
}
.site-header__col--menu .site-nav__button {
    border-bottom: none;
    margin: 0 auto;
    max-width: 200px;
    padding-top: 12px;
}
.site-header__col--menu .site-nav__button a {
    font-size: 18px;
    padding: 12px 25px;
    font-weight: 400;
}
@media (min-width: 992px) {
    .site-header__col--menu .site-nav__button a {
        font-size: 14px;
        padding: 5px 20px;
        margin-top: 9px;
    }
}
.site-header__col--menu .site-nav__button a:focus,
.site-header__col--menu .site-nav__button a:hover {
    color: #fff;
}
@media (max-width: 991.98px) {
    .site-header__col--menu .site-nav__button {
        padding-bottom: 0px;
    }
}
@media (min-width: 992px) {
    .site-header__col--menu .site-nav__button {
        padding-left: 15px;
    }
}
@media (max-width: 991.98px) {
    .site-header__col--menu .site-nav__login {
        border-bottom: none;
        text-align: center;
    }
    .site-header__col--menu .site-nav__login a {
        padding-bottom: 20px;
        padding-top: 55px;
    }
}
@media (min-width: 992px) {
    .site-header__col--menu {
        display: flex;
        justify-content: flex-end;
    }
}
.site-header__mobile-menu {
    padding-top: 25px;
    text-align: right;
}
@media (min-width: 992px) {
    .site-header__mobile-menu {
        display: none;
    }
}
.site-header__mobile-menu .hamburger-close,
.site-header__mobile-menu.is-active .hamburger-open {
    display: none;
}
.site-header__mobile-menu.is-active .hamburger-close {
    display: inline;
}
.site-header__col--menu .site-nav.active {
    display: block;
}
@media (max-width: 991.98px) {
    .site-header__col--menu .site-nav__hassubnav:not(.is-active) .sub-menu {
        display: none !important;
    }
    .site-header__col--menu .site-nav__hassubnav.is-active > a svg {
        transform: rotate(0);
    }
}
.site-header__col--menu .site-nav__hassubnav .sub-menu {
    background-color: #fff;
    display: flex;
    flex-direction: column;
    padding-bottom: 45px;
    pointer-events: none;
    z-index: 2;
}
@media (min-width: 992px) {
    .site-header__col--menu .site-nav__hassubnav .sub-menu {
        border-top: 2px solid #ffbc1f;
        box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
        flex-direction: row;
        padding: 71px 40px;
        right: 0;
        top: 74px;
        transition: opacity 0.15s ease-in-out;
    }
}
.site-header__col--menu .site-nav__hassubnav .sub-menu__block {
    margin-bottom: 10px;
}
@media (min-width: 992px) {
    .site-header__col--menu .site-nav__hassubnav .sub-menu__block {
        margin-bottom: 0;
        padding: 0 11px;
    }
}
.site-header__col--menu .site-nav__hassubnav .sub-menu__block a {
    align-items: center;
    background-color: #ebebef;
    display: flex;
    flex-direction: row;
    padding: 21px 28px;
    text-decoration: none;
}
@media (min-width: 992px) {
    .site-header__col--menu .site-nav__hassubnav .sub-menu__block a {
        flex-direction: column;
        padding: 21px;
        min-width: 161px;
        transition: box-shadow 0.2s ease, background-color 0.2s ease;
    }
    .site-header__col--menu .site-nav__hassubnav .sub-menu__block a:focus,
    .site-header__col--menu .site-nav__hassubnav .sub-menu__block a:hover {
        background-color: #e8edf8;
    }
}
.site-header__col--menu .site-nav__hassubnav .sub-menu__block--wrapper {
    display: flex;
    flex-direction: row;
}
.site-header__col--menu .site-nav__hassubnav .sub-menu__block--icon {
    align-items: center;
    display: flex;
    height: 64px;
}
.site-header__col--menu .site-nav__hassubnav .sub-menu__block--text {
    display: flex;
    flex-direction: column;
}
@media (max-width: 991.98px) {
    .site-header__col--menu .site-nav__hassubnav .sub-menu__block--text {
        margin-left: 30px;
    }
}
@media (min-width: 992px) {
    .site-header__col--menu .site-nav__hassubnav .sub-menu__block--text {
        text-align: center;
    }
}
.site-header__col--menu .site-nav__hassubnav .sub-menu__block--text_title {
    color: #1b1d22;
    font-weight: 700;
    font-size: 18px;
    line-height: 150%;
}
.site-header__col--menu .site-nav__hassubnav .sub-menu__block--text_learnmore {
    color: #1c58d9;
    font-size: 12px;
}
@media (max-width: 991.98px) {
    .site-header__col--menu .site-nav__hassubnav .sub-menu__links {
        padding-top: 20px;
    }
}
@media (min-width: 992px) {
    .site-header__col--menu .site-nav__hassubnav .sub-menu__links {
        align-items: flex-start;
        display: flex;
        padding-left: 40px;
    }
    .site-header__col--menu .site-nav__hassubnav .sub-menu__links:first-child {
        padding-left: 0;
    }
}
.site-header__col--menu .site-nav__hassubnav .sub-menu__links ul {
    padding: 0;
}
.site-header__col--menu .site-nav__hassubnav .sub-menu__links--single {
    list-style-type: none;
    margin-bottom: 25px;
}
@media (max-width: 991.98px) {
    .site-header__col--menu .site-nav__hassubnav .sub-menu__links--single {
        margin-bottom: 30px;
        padding-left: 20px;
    }
}
@media (min-width: 992px) {
    .site-header__col--menu .site-nav__hassubnav .sub-menu__links--single {
        min-height: 30px;
    }
}
.site-header__col--menu .site-nav__hassubnav .sub-menu__links--single a {
    align-items: center;
    color: #1b1d22;
    display: flex;
    font-size: 18px;
    line-height: 150%;
    text-decoration: none;
    transition: color 0.3s ease-in-out;
}
@media (min-width: 992px) {
    .site-header__col--menu .site-nav__hassubnav .sub-menu__links--single a {
        font-size: 15px;
    }
}
.site-header__col--menu .site-nav__hassubnav .sub-menu__links--single a:focus,
.site-header__col--menu .site-nav__hassubnav .sub-menu__links--single a:hover {
    color: #1c58d9;
}
.site-header__col--menu .site-nav__hassubnav .sub-menu__links--icon {
    display: inline-block;
    margin-right: 10px;
    text-align: center;
    width: 30px;
}
@media (max-width: 991.98px) {
    .site-header__col--menu .site-nav__hassubnav .sub-menu__products img {
        width: 40px;
        height: auto;
    }
}
@media (min-width: 992px) {
    .site-header__col--menu .site-nav__hassubnav .sub-menu__products {
        padding-bottom: 40px;
    }
    .site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__links {
        margin-top: 10px;
    }
}
@media (min-width: 1200px) {
    .site-header__col--menu .site-nav__hassubnav .sub-menu__products {
        padding-right: 96px;
    }
}
@media (min-width: 1200px) {
    .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions {
        width: 1100px !important;
    }
    .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__links li a {
        min-width: 220px;
    }
}
@media (max-width: 991.98px) {
    .site-header__col--menu .site-nav__hassubnav .sub-menu__community img {
        width: 40px;
        height: auto;
    }
}
@media (min-width: 992px) {
    .site-header__col--menu .site-nav__hassubnav .sub-menu__community {
        padding-top: 50px;
        padding-bottom: 40px;
    }
    .site-header__col--menu .site-nav__hassubnav .sub-menu__community .sub-menu__links {
        padding-left: 60px;
        margin-top: 10px;
    }
}
@media (min-width: 1200px) {
    .site-header__col--menu .site-nav__hassubnav .sub-menu__community {
        padding-right: 60px;
    }
    .site-header__col--menu .site-nav__hassubnav .sub-menu__community .sub-menu__links:last-child {
        padding-left: 0;
    }
    .site-header__col--menu .site-nav__hassubnav .sub-menu__community .sub-menu__links li {
        min-width: 150px;
    }
}
.site-header__col--menu .site-nav__hassubnav .sub-menu__login img {
    width: 40px;
    height: auto;
}
@media (min-width: 992px) {
    .site-header__col--menu .site-nav__hassubnav .sub-menu__login img {
        height: 50px;
        width: auto;
        margin-bottom: 10px;
    }
}
.site-header__col--menu .site-nav__hassubnav .sub-menu__col {
    display: flex;
    flex-wrap: wrap;
}
.site-header__col--menu .site-nav__hassubnav .sub-menu__col .sub-menu__links:first-of-type {
    padding-left: 0;
}
.site-header__col--menu .site-nav__hassubnav .sub-menu__col--title {
    color: #818698;
    display: block;
    font-size: 15px;
    font-weight: 700;
    line-height: 150%;
    margin-top: 0;
    flex: 0 0 100%;
}
@media (max-width: 991.98px) {
    .site-header__col--menu .site-nav__hassubnav .sub-menu__col--title {
        margin-bottom: 0;
        padding-left: 20px;
    }
}
@media (min-width: 992px) {
    .site-header__col--menu .site-nav__hassubnav .sub-menu__col--title {
        margin-bottom: 20px;
    }
}
@media (max-width: 991.98px) {
    .site-header__col--menu .site-nav__hassubnav .sub-menu__col {
        padding-bottom: 70px;
    }
    .site-header__col--menu .site-nav__hassubnav .sub-menu__col:last-child {
        padding-bottom: 20px;
    }
}
@media (max-width: 991.98px) {
    .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions {
        flex-direction: row;
        flex-wrap: wrap;
    }
    .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions.is-active {
        display: flex;
    }
    .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions--title {
        flex: 0 0 100%;
        max-width: 100%;
    }
    .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__links {
        width: 100%;
    }
    .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__links--icon {
        border: 1.5px solid #ebebef;
        border-radius: 5px;
        display: inline-block;
        flex: 0 0 30px;
        max-width: 30px;
        min-height: 30px;
    }
    .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__links--icon img {
        width: 16px;
    }
    .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__links a {
        font-size: 15px;
    }
    .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__block {
        flex: 0 0 100%;
        margin-bottom: 25px;
        max-width: 100%;
    }
}
@media (min-width: 992px) and (max-width: 1199.98px) {
    .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions {
        padding-left: 25px;
        padding-right: 0;
    }
}
@media (min-width: 992px) {
    .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions {
        padding-top: 50px;
        padding-bottom: 80px;
        width: 950px;
    }
    .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__block {
        display: none;
    }
}
@media (min-width: 1200px) {
    .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions {
        width: 1065px;
    }
    .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__links {
        padding-left: 25px;
    }
}
@media (max-width: 991.98px) {
    .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__col {
        width: 100%;
    }
}
.site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__col ul {
    display: grid;
    grid-column-gap: 0;
    grid-row-gap: 25px;
    grid-auto-flow: column;
}
.site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__col ul li {
    margin: auto 0;
}
.site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__col ul li a {
    padding-right: 20px;
}
.site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__solutions--leftcol .sub-menu__links ul {
    grid-template-rows: repeat(4, 1fr);
    grid-template-columns: repeat(2, 50%);
}
@media (min-width: 992px) {
    .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__solutions--leftcol .sub-menu__links ul {
        grid-template-columns: repeat(3, 1fr);
        grid-template-rows: repeat(3, 1fr);
    }
}
.site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__solutions--rightcol .sub-menu__links ul {
    grid-template-rows: repeat(3, 1fr);
    grid-template-columns: repeat(2, 50%);
}
@media (min-width: 992px) {
    .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__solutions--rightcol .sub-menu__links ul {
        grid-template-columns: repeat(2, 1fr);
        grid-template-rows: repeat(3, 1fr);
    }
}
.site-header__col--menu .site-nav__hassubnav .sub-menu__bar {
    display: none;
}
@media (min-width: 992px) {
    .site-header__col--menu .site-nav__hassubnav .sub-menu__bar {
        bottom: 0;
        display: block;
        left: 0;
        position: absolute;
        width: 100%;
    }
    .site-header__col--menu .site-nav__hassubnav .sub-menu__bar a {
        background-color: #1c58d9;
        color: #fff;
        display: block;
        font-size: 15px;
        font-weight: 700;
        line-height: 150%;
        padding: 7px 41px;
        text-align: left;
        text-decoration: none;
    }
    .site-header__col--menu .site-nav__hassubnav .sub-menu__bar a:hover {
        background-color: #043cb5;
    }
}
.site-header__col--menu .site-nav__hassubnav:focus-within .sub-menu,
.site-header__col--menu .site-nav__hassubnav:focus .sub-menu,
.site-header__col--menu .site-nav__hassubnav:hover .sub-menu {
    opacity: 1;
    pointer-events: auto;
}
@media (max-width: 991.98px) {
    .site-header .sub-menu__links + .sub-menu__links {
        padding-top: 0;
    }
    .site-header .site-nav__toplink:first-child .sub-menu__links .sub-menu__links--single:last-child {
        margin-bottom: 0;
    }
    .site-header .site-nav__button {
        padding-top: 20px;
    }
}
.mm-button {
    display: inline-block;
    text-align: center;
    font-family: Fira Mono, monospace;
    font-weight: 700;
    border-radius: 30px;
    border: 3px solid transparent;
    cursor: pointer;
    background: transparent;
    font-size: 14px;
    line-height: 21px;
    padding: 11px 30px;
    transition: color 0.3s ease-in-out, background-color 0.3s ease-in-out, border-color 0.3s ease-in-out;
}
@media (min-width: 768px) {
    .mm-button {
        font-size: 17px;
        line-height: 25.5px;
        padding: 12px 35px;
    }
}
.mm-button.mm-button-solid.mm-button-blue {
    background-color: #1c58d9;
    border-color: #1c58d9;
    color: #fff;
}
@media (min-width: 768px) {
    .mm-button.mm-button-solid.mm-button-blue:focus,
    .mm-button.mm-button-solid.mm-button-blue:hover {
        background-color: #043cb5;
        border-color: #043cb5;
    }
}

.site-nav__button .mm-button {
    border-width: 1px !important;
    transition: none !important;
}

.mm-button-outline--thin.mm-button-outline--thin-blue {
    color: #043cb5 !important;
    border: 1px solid #043cb5;
}

@media (max-width: 767px) {
    .mm-button-outline--thin.mm-button-outline--thin-blue:hover,
    .mm-button-outline--thin.mm-button-outline--thin-blue:focus {
        color: #043cb5 !important; 
    }
}
@media (min-width: 768px) {
    .mm-button-outline--thin.mm-button-outline--thin-blue:hover,
    .mm-button-outline--thin.mm-button-outline--thin-blue:focus {
        color: white !important;
        background-color:  #043CB5;
        border: 1px solid  #043CB5;
    }
}

/* Redesign 2021 - SEARCH */
#search-results .context {
	word-break: break-word;
}

kbd {
    display: inline-block;
    border: 1px solid #ccc;
    border-radius: 4px;
    padding: 0.1em 0.5em;
    margin: 0 0.2em;
    box-shadow: 0 1px 0px rgba(0, 0, 0, 0.2), 0 0 0 2px #fff inset;
    background-color: #f7f7f7;
}

/* 2022 Badges */
.mm-badge {
    display: inline-block;
    border: 1px solid rgba(63, 67, 80, 0.2);
    border-radius: 6px;
    padding: 14px;
    margin-bottom: 30px;
}

.mm-badge p {
    font-size: 12px;
    margin: 0;
}
/* Version */
.mm-badge p:first-child {
    font-style: italic;
    margin-bottom: 5px;
}

.mm-badge p:last-child {
    margin-top: 2px;
}

.mm-badge a {
    font-weight: bold;
}

.mm-badge img {
    width: 16px;
    height: auto;
}

.mm-badge.mm-badge--note {
    border: 1px solid rgba(255, 188, 31, 1);
    background-color:rgba(255, 212, 112, 0.25);
}

.mm-badge.mm-badge--note p:first-child {
    font-style: normal;
    font-weight: bold;
}

img.mm-badge-flag {
    width: 13px;
    margin-right: 3px;
} 
source/_static/myscript.js METASEP
$(document).ready(function () {
	// Init GTM dataLayer for Analytics
	var dataLayer = window.dataLayer || [];
	var eventValue = 0;
	var rating = '';
	var thermometerHtml =
		" <div class='c-thermometer-popup'> \
			<div class='c-thermometer-popup__close'>×</div> \
			<svg width='19' height='19' viewBox='0 0 19 19' fill='none' xmlns='http://www.w3.org/2000/svg'><circle cx='9.5' cy='9.5' r='9.5' fill='#166DE0' fill-opacity='0.08'/><g clip-path='url(#clip0)'><path d='M15.0172 6.43306L7.81719 13.6331L4.51959 10.3211L5.36919 9.48586L7.81719 11.9339L14.1676 5.58346L15.0172 6.43306Z' fill='#166DE0'/></g><defs><clipPath id='clip0'><rect width='13.4118' height='11.1765' fill='white' transform='translate(2.79395 3.35303)'/></clipPath></defs></svg> \
			<h5>Thank you!</h5> \
			<p>We appreciate your feedback.</p> \
		</div> \
		<div class='c-thermometer-modal__container'> \
			<div> \
				<div class='c-thermometer-modal__content'> \
				<h3>Tell us more!</h3> \
				<p>Your feedback helps us improve the Mattermost product documentation.</br> \
				<p><b>How can we make this page more helpful? </b></br> \
				</br> \
				<textarea maxlength='186' rows='4' placeholder='Share your feedback here'></textarea> \
					<div class='c-thermometer-modal__textarea-footer'> \
						<div></div> \
						<div class='c-thermometer-modal__counter'> \
							<span>0</span>/186	\
						</div> \
					</div> \
					<p>Have a feature request? <a href='https://mattermost.uservoice.com/forums/306457-general' target='blank'> Share it here.</a></p> \
					<p>Having issues? <a href='https://community.mattermost.com' target='blank'> Join our Community server. </a></p> \
					<div class='c-thermometer-modal__footer'> \
						<button class='btn btn-link'>Cancel</button> \
						<button class='btn btn-primary'>Submit</button> \
					</div> \
				</div> \
			</div> \
		</div> \
		<div class='c-thermometer'> \
			<div class='c-thermometer__trigger'> \
				<p class='c-thermometer__paragraph'>Did you find what you were looking for?</p> \
				<div class='c-thermometer__emojis'> \
					<a href='javascript:void(0);' class='rate-this-page-action' data-rating='Yes'> \
						<span class='c-thermometer__emoji'>😀</span> \
						<p>Yes</p> \
					</a> \
					<a href='javascript:void(0);' class='rate-this-page-action' data-rating='Somewhat'> \
						<span class='c-thermometer__emoji'>😐</span> \
						<p>Mostly</p> \
					</a> \
					<a href='javascript:void(0);' class='rate-this-page-action' data-rating='No'> \
						<span class='c-thermometer__emoji'>🙁</span> \
						<p>No!</p> \
					</a> \
				</div> \
			</div> \
		</div>";

	$('body footer').append(thermometerHtml);

	$('header .links__icon').on('click', function () {
		$("header .header__searchbar").hide();
		$("header .header__links").slideToggle();
	});

	$('.search__icon').on('click', function () {
		$("header .header__links").hide();
		$("header .header__searchbar").slideToggle(400, function () {
			if ($(this).is(':visible')) {
				$(this).find("input[type=text]").focus();
			}
		});
		// document.getElementById('hamburger').classList.remove('is-active');
        // document.body.classList.remove('nav-open');
        // document.getElementById('navigation').classList.remove('active');
	});

	if ($('.wy-menu-vertical li.current>a').length) {
		var sidebarScrollPosition = $('.wy-menu-vertical li.current>a').offset().top;
		$('.wy-side-scroll').scrollTop(sidebarScrollPosition - 120);
	}

	$('body').on('click', '.c-thermometer__emojis a', function () {
		$(this).addClass('selected');
	});

	$('body').on('click', '.c-thermometer-modal__footer .btn', function () {
		if ($(this).hasClass('btn-link')) {
			$(this).parents('.c-thermometer-modal__container').fadeOut();
			$('a.rate-this-page-action').removeClass('selected');
			$('.c-thermometer-modal__container textarea').val('');
		} else {
			var currentString = $(".c-thermometer-modal__container textarea").val()

			if (eventValue > 0) {
				// Submit DataLayer Event
				dataLayer.push({
					event: 'rateThisPage',
					eventLabel: rating,
					eventValue: eventValue,
					eventFeedback: currentString
				});

				if (typeof (rudderanalytics) !== 'undefined') {
					rudderanalytics.track("feedback_submitted", { label: rating, rating: eventValue, feedback: currentString });
				}

				$(this).parents('.c-thermometer-modal__container').fadeOut(() => {
					$('.c-thermometer-modal__container').remove();
				});
				$('.c-thermometer__emojis').addClass('pointer-events-none');

				$('.c-thermometer-popup').fadeIn();

				setTimeout(() => {
					$('.c-thermometer-popup').fadeOut('fast');
				}, 3000)
			}
		}
	});

	$(".c-thermometer-modal__container textarea").on('keyup', function (event) {
		var currentString = $(this).val();
		$(".c-thermometer-modal__counter span").html(currentString.length);
	});

	$('body').on('click', function () {
		$('.c-thermometer__popup').hide();
	});

	$('body').on('click', '.c-thermometer-popup__close', function () {
		$(this).parent().fadeOut('fast');
	});

	$('body').on('click', '.c-thermometer__popup', function (e) {
		e.stopImmediatePropagation();
	});

	$('body').on('click', '.c-thermometer__trigger', function (e) {
		e.stopImmediatePropagation();
	});

	// Click Event for Ratings
	$('body').on('click', '.c-thermometer__emojis a.rate-this-page-action', function () {
		var click_elem = $(this);
		click_elem.addClass('selected');

		// UX Update

		$('.c-thermometer-modal__container').fadeIn();

		setTimeout(() => {
			// $('.c-thermometer').fadeOut(() => {
			// 	$('.c-thermometer').remove();
			// });
		}, 3000);

		// Prepare DataLayer Vars
		rating = click_elem.attr('data-rating');

		console.log(rating);

		switch (rating) {
			case 'Yes':
				eventValue = 3;
				break;
			case 'Somewhat':
				eventValue = 2;
				break;
			case 'No':
				eventValue = 1;
				break;
		}
	});
	// Notification Banner
	if (localStorage.getItem("docsFeedback") === null) {
		localStorage.setItem('docsFeedback', true);
		$('.notification-bar').addClass('flex');
		$('body').addClass('with-notification');
	} else {
		const docsFeedbackItem = localStorage.getItem('docsFeedback');

		if (docsFeedbackItem == 'false') {
			$('.notification-bar').remove();
			$('body').removeClass('with-notification');
		} else {
			$('body').addClass('with-notification');
		}
	}
	$('body').on('click', '.notification-bar__close', function(){
		$('.notification-bar').remove();
		$('body').removeClass('with-notification');
		localStorage.setItem('docsFeedback', false);
	});

});
// Redesign - Navigation
document.addEventListener("DOMContentLoaded", function(event) {     
    const hamburger = document.getElementById('hamburger');
    const subMenus = document.querySelectorAll('.site-nav__hassubnav a');

    let multiEventSingleHandler = (elem, events, handler, use_capture) => {
        events.forEach(ev => {
            elem.addEventListener(ev, handler, typeof(use_capture) === 'undefined' ? false : use_capture);
        });
    }

    let clickTouch = (elem, handler, use_capture) => {
        multiEventSingleHandler(elem, ['click', 'touch'], handler, typeof(use_capture) === 'undefined' ? false : use_capture);
    }

    subMenus.forEach(snav => {
        clickTouch(snav, () => {
            snav.parentElement.classList.toggle('is-active');
        }, false);
    });

    clickTouch(hamburger, () => {
        hamburger.classList.toggle('is-active');
        document.body.classList.toggle('nav-open');
        document.getElementById('navigation').classList.toggle('active');
    });
});

source/_static/favicon.ico METASEP

extensions/sitemap/__init__.py METASEP
#
# sitemap - The sphinx_sitemap extension with parallel read and write support enabled
#
# Parallel read/write support by Alan Lew <alan@ethereal.cc> (https://github.com/neflyte/)
#
# Copyright (c) 2013 Michael Dowling <mtdowling@gmail.com>
# Copyright (c) 2017 Jared Dillard <jared.dillard@gmail.com>
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.

import os
import sphinx.builders
from typing import Dict, List, Optional, Tuple, Any
from xml.etree import ElementTree
from sphinx.application import Sphinx, BuildEnvironment
from sphinx.errors import SphinxError
from sphinx.util import logging
from sphinx.util.console import bold, colorize  # type: ignore

# Sphinx logger
logger = logging.getLogger(__name__)


def setup(app: Sphinx) -> Dict[str, Any]:
    """
    Sphinx extension setup function.
    It adds config values and connects Sphinx events to the sitemap builder.

    :param app: The Sphinx Application instance
    :return: A dict of Sphinx extension options
    """
    app.add_config_value(
        'site_url',
        default=None,
        rebuild=''
    )
    app.add_config_value(
        'sitemap_url_scheme',
        default="{lang}{link}",
        rebuild=''
    )
    app.add_config_value(
        'sitemap_locales',
        default=None,
        rebuild=''
    )
    app.add_config_value(
        'sitemap_filename',
        default="sitemap.xml",
        rebuild=''
    )

    try:
        app.add_config_value(
            'html_baseurl',
            default=None,
            rebuild=''
        )
    except SphinxError:
        pass

    """
    Determine the type of Builder used when the `builder-inited` event fires.
    https://www.sphinx-doc.org/en/master/extdev/appapi.html#event-builder-inited
    """
    app.connect('builder-inited', record_builder_type)
    """
    Merge collected document information from parallel readers (workers) when the `env-merge-info` event fires.
    https://www.sphinx-doc.org/en/master/extdev/appapi.html#event-env-merge-info
    """
    app.connect('env-merge-info', env_merge_info)
    """
    Remove references to documents that no longer exist when the `env-purge-doc` event fires.
    https://www.sphinx-doc.org/en/master/extdev/appapi.html#event-env-purge-doc
    """
    app.connect('env-purge-doc', env_purge_doc)
    """
    Write the sitemap when the `html-collect-pages` event fires.
    https://www.sphinx-doc.org/en/master/extdev/appapi.html#event-html-collect-pages
    """
    app.connect('html-collect-pages', create_sitemap)

    return {
        # Enable parallel reading and writing
        'parallel_read_safe': True,
        'parallel_write_safe': True
    }


def env_purge_doc(app: Sphinx, env: BuildEnvironment, docname: str):
    """
    Purge an existing document from the pickled document list.
    This function is called when the Sphinx `env-purge-doc` event is fired.

    :param app: The Sphinx instance; unused
    :param env: The Sphinx BuildEnvironment
    :param docname: The name of the document to purge
    """
    logger.debug('env_purge_doc: docname=%s' % docname)
    if hasattr(env, 'sitemap_links'):
        sitemap_links: Dict[str, str] = env.sitemap_links
        if sitemap_links.get(docname) is not None:
            logger.debug('env_purge_doc: sitemap_links contains %s; removing it' % docname)
            env.sitemap_links.pop(docname)


def env_merge_info(app: Sphinx, env: BuildEnvironment, docnames: List[str], other: BuildEnvironment):
    """
    Merge collected document names from parallel readers (workers) into the master Sphinx environment.
    This function is called when the Sphinx `env-merge-info` event is fired.

    :param app: The Sphinx Application instance
    :param env: The master Sphinx BuildEnvironment
    :param docnames: A list of the document names to merge
    :param other: The Sphinx BuildEnvironment from the reader worker
    """
    # Create a `sitemap_links` attribute in the environment if it doesn't already exist
    if not hasattr(env, 'sitemap_links'):
        env.sitemap_links = dict()
    # Add any links that were present in the reader worker's environment
    if hasattr(other, 'sitemap_links'):
        other_links: Dict[str, str] = other.sitemap_links
        for linkKey in other_links.keys():
            env.sitemap_links[linkKey] = other_links[linkKey]
    # Determine if we're using a DirectoryHTMLBuilder or not
    is_dictionary_builder: bool = False
    if app.env is not None and hasattr(app.env, 'is_dictionary_builder'):
        is_dictionary_builder = app.env.is_dictionary_builder
    # Calculate the document link for each docname and add it to the `sitemap_links` attribute in the environment
    for docname in docnames:
        link = calculate_link(is_dictionary_builder, docname)
        logger.debug('env_merge_info: docname=%s, link=%s' % (docname, link))
        env.sitemap_links[docname] = link


def calculate_link(is_dictionary_builder: bool, docname: str) -> str:
    """
    Calculate the resulting file name or directory page name from the supplied document name.
    Both StandaloneHTMLBuilder and DirectoryHTMLBuilder builders are handled.

    :param is_dictionary_builder: Whether or not this builder is an instance of DirectoryHTMLBuilder
    :param docname: The name of the document to calculate the file name of
    :return: The calculated file name or directory page name
    """
    if is_dictionary_builder:
        if docname == "index":
            # root of the entire website, a special case
            directory_pagename = ""
        elif docname.endswith("/index"):
            # checking until / to avoid false positives like /funds-index
            directory_pagename = docname[:-6] + "/"
        else:
            directory_pagename = docname + "/"
        return directory_pagename
    return docname + ".html"


def get_locales(app: Sphinx) -> List[str]:
    """
    Get a list of locales from the extension config or automatically detect based on Sphinx Application config.

    :param app: The Sphinx Application instance
    :return: A list of locales
    """
    # Manually configured list of locales
    builder: sphinx.builders.Builder = app.builder
    sitemap_locales: Optional[List[str]] = builder.config.sitemap_locales
    if sitemap_locales is not None:
        # special value to add nothing -> use primary language only
        if sitemap_locales == [None]:
            return []

        return [
            locale for locale in sitemap_locales
            # skip primary language
            if locale != app.builder.config.language
        ]

    # Or autodetect
    locales: List = list()
    for locale_dir in app.builder.config.locale_dirs:
        locale_dir = os.path.join(app.confdir, locale_dir)
        if os.path.isdir(locale_dir):
            for locale in os.listdir(locale_dir):
                if os.path.isdir(os.path.join(locale_dir, locale)):
                    locales.append(locale)
    return locales


def record_builder_type(app: Sphinx):
    """
    Determine if the Sphinx Builder is an instance of DirectoryHTMLBuilder and store that in the
    application environment.

    :param app: The Sphinx Application instance
    """
    # builder isn't initialized in the setup so we do it here
    # we rely on the class name, not the actual class, as it was moved 2.0.0
    builder = getattr(app, 'builder', None)
    if builder is None:
        return
    app.env.is_dictionary_builder = \
        type(builder).__name__ == 'DirectoryHTMLBuilder'


def hreflang_formatter(lang: str) -> str:
    """
    Format the supplied locale code into a string that is compatible with `hreflang`.

    See also:

    https://en.wikipedia.org/wiki/Hreflang#Common_Mistakes

    https://github.com/readthedocs/readthedocs.org/pull/5638

    :param lang: The locale string to format
    :return: The formatted locale string
    """
    if '_' in lang:
        return lang.replace("_", "-")
    return lang


def create_sitemap(app: Sphinx) -> List[Tuple[str, Dict[str, Any], str]]:
    """
    Generates the sitemap.xml from the collected HTML page links.
    This function is called when the Sphinx `html-collect-pages` event is fired.

    :param app: The Sphinx Application instance
    :return: An empty list
    """
    # Initialize the empty return list
    return_list = list()
    # Retrieve the `site_url` config property
    site_url = app.builder.config.site_url or app.builder.config.html_baseurl
    if not site_url:
        logger.error("sphinx-sitemap: Neither html_baseurl nor site_url "
                     "are set in conf.py. Sitemap not built.")
        return return_list
    site_url = site_url.rstrip('/') + '/'
    # Retrieve the collected document links
    if app.env is None:
        logger.error("sphinx-sitemap: environment is None; this is unexpected")
        return return_list
    sitemap_links: Dict[str, str] = dict()
    if hasattr(app.env, 'sitemap_links'):
        sitemap_links = app.env.sitemap_links
    if len(sitemap_links) == 0:
        logger.warning("sphinx-sitemap: No pages generated for %s" % app.config.sitemap_filename)
        return return_list
    # Create a new XML root element
    ElementTree.register_namespace('xhtml', "http://www.w3.org/1999/xhtml")
    root = ElementTree.Element("urlset", xmlns="http://www.sitemaps.org/schemas/sitemap/0.9")
    # Get the list of locales to include
    locales = get_locales(app)
    # Retrieve the `version` config property
    if app.builder.config.version:
        version = app.builder.config.version + '/'
    else:
        version = ""
    # Retrieve the `sitemap_url_scheme` config property
    scheme = app.config.sitemap_url_scheme
    # Retrieve the `language` config property
    if app.builder.config.language:
        lang = app.builder.config.language + '/'
    else:
        lang = ""
    # Add each document link as a child of the root XML element
    for linkKey in sitemap_links.keys():
        # Retrieve the linked document filename including extension
        link = sitemap_links[linkKey]
        # Create a new XML child element of the root element for this link
        url = ElementTree.SubElement(root, "url")
        ElementTree.SubElement(url, "loc").text = site_url + scheme.format(
            lang=lang, version=version, link=link
        )
        # Add a sub-element for each locale
        for lang in locales:
            lang = lang + '/'
            ElementTree.SubElement(
                url, "{http://www.w3.org/1999/xhtml}link",
                rel="alternate",
                hreflang=hreflang_formatter(lang.rstrip('/')),
                href=site_url + scheme.format(
                    lang=lang, version=version, link=link
                )
            )
    # Determine the output filename of the sitemap and write the XML document to it
    filename = app.outdir + "/" + app.config.sitemap_filename
    logger.info(bold('writing sitemap... '), nonl=True)
    ElementTree.ElementTree(root).write(filename,
                                        xml_declaration=True,
                                        encoding='utf-8',
                                        method="xml")
    logger.info("done; generated sitemap in %s" % filename)
    # Return the empty list
    return return_list

extensions/reredirects/__init__.py METASEP
#
# reredirects - The sphinx_reredirects extension with parallel read and write support enabled
#
# Parallel read/write support by Alan Lew <alan@ethereal.cc> (https://github.com/neflyte/)
#
import re
from fnmatch import fnmatch
from pathlib import Path
from string import Template
from typing import Dict, Mapping, Tuple, Any, List
from sphinx.application import Sphinx
from sphinx.environment import BuildEnvironment
from sphinx.util import logging
from sphinx.util.console import bold, colorize, term_width_line  # type: ignore

OPTION_REDIRECTS = "redirects"
OPTION_REDIRECTS_DEFAULT: Dict[str, str] = dict()
OPTION_TEMPLATE_FILE = "redirect_html_template_file"
OPTION_TEMPLATE_FILE_DEFAULT = None
REDIRECT_FILE_DEFAULT_TEMPLATE = '<html><head><meta http-equiv="refresh" content="0; url=${to_uri}"></head></html>'  # noqa: E501

# Sphinx logger
logger = logging.getLogger(__name__)

wildcard_pattern = re.compile(r"[*?\[\]]")


def setup(app: Sphinx) -> Dict[str, Any]:
    """
    Sphinx extension setup function.
    It adds config values and connects Sphinx events to the sitemap builder.

    :param app: The Sphinx Application instance
    :return: A dict of Sphinx extension options
    """
    app.add_config_value(OPTION_REDIRECTS, OPTION_REDIRECTS_DEFAULT, "env")
    app.add_config_value(OPTION_TEMPLATE_FILE, OPTION_TEMPLATE_FILE_DEFAULT, "env")
    """
    Write the redirect pages when the `html-collect-pages` event fires.
    https://www.sphinx-doc.org/en/master/extdev/appapi.html#event-html-collect-pages
    """
    app.connect("html-collect-pages", write_redirect_pages)
    # Extra events to conform to Sphinx parallel read requirements. Both event functions do nothing.
    app.connect("env-purge-doc", env_purge_doc)
    app.connect("env-merge-info", env_merge_info)
    return {
        # Enable parallel reading and writing
        'parallel_read_safe': True,
        'parallel_write_safe': True,
    }


def write_redirect_pages(app: Sphinx) -> List[Tuple[str, Dict[str, Any], str]]:
    """
    Write the redirect page files.

    :param app: The Sphinx Application instance
    :return: An empty list
    """
    if not app.config[OPTION_REDIRECTS]:
        logger.debug('No redirects configured')
        return list()

    rr = Reredirects(app)
    to_be_redirected = rr.grab_redirects()
    rr.create_redirects(to_be_redirected)

    # html-collect-pages requires to return iterable of pages to write,
    # we have no additional pages to write
    return list()


def env_purge_doc(app: Sphinx, env: BuildEnvironment, docname: str):
    """
    Stub function for the `env-purge-doc` event; does nothing
    """
    return


def env_merge_info(app: Sphinx, env: BuildEnvironment, docnames: List[str], other: BuildEnvironment):
    """
    Stub function for the `env-merge-info` event; does nothing
    """
    return


def old_status_iterator(mapping: Mapping[str, str], summary: str, color: str = "darkgreen") -> Tuple[str, str]:
    """
    Displays the status of iterating through a Dict/Mapping of strings. Taken from the Sphinx sources.

    :param mapping: The iterable to iterate through
    :param summary: A description of the action or operation
    :param color: The color of the status text; defaults to `darkgreen`
    :return: A tuple containing the next key-value pair from the iterable
    """
    line_count = 0
    for item in mapping.items():
        if line_count == 0:
            logger.info(bold(summary), nonl=True)
            line_count = 1
        logger.info(item[0], color=color, nonl=True)
        logger.info(" ", nonl=True)
        yield item
    if line_count == 1:
        logger.info('')


def status_iterator(mapping: Mapping[str, str], summary: str, color: str = "darkgreen",
                    length: int = 0, verbosity: int = 0) -> Tuple[str, str]:
    """
    Displays the status of iterating through a Dict/Mapping of strings. Taken from the Sphinx sources.
    Status includes percent of records in the iterable that have been iterated through.

    :param mapping: The iterable to iterate through
    :param summary: A description of the action or operation
    :param color:  The color of the status text; defaults to `darkgreen`
    :param length: The number of records in the iterable
    :param verbosity: Flag which writes a newline after each status message
    :return: A tuple containing the next key-value pair from the iterable
    """
    if length == 0:
        yield from old_status_iterator(mapping, summary, color)
        return
    line_count = 0
    summary = bold(summary)
    for item in mapping.items():
        line_count += 1
        s = '%s[%3d%%] %s' % (summary, 100 * line_count / length, colorize(color, item[0]))
        if verbosity:
            s += '\n'
        else:
            s = term_width_line(s)
        logger.info(s, nonl=True)
        yield item
    if line_count > 0:
        logger.info('')


class Reredirects:
    def __init__(self, app: Sphinx):
        """
        Class constructor.
        Retrieves configuration values from the supplied Sphinx Application instance.

        :param app: The Sphinx Application instance
        """
        self.app = app
        self.redirects_option: Dict[str,
                                    str] = getattr(app.config,
                                                   OPTION_REDIRECTS)
        self.template_file_option: str = getattr(app.config,
                                                 OPTION_TEMPLATE_FILE)

    def grab_redirects(self) -> Mapping[str, str]:
        """
        Inspect redirects option in conf.py and returns dict mapping docname
        to target (with expanded placeholder).

        :return: A mapping of docname to target
        """
        # docname-target dict
        to_be_redirected = {}

        # For each source-target redirect pair in conf.py
        for source, target in self.redirects_option.items():
            # no wildcard, append source as-is
            if not self._contains_wildcard(source):
                to_be_redirected[source] = target
                continue

            # wildcarded source, expand to docnames
            expanded_docs = [doc for doc in self.app.env.found_docs
                             if fnmatch(doc, source)]

            if not expanded_docs:
                logger.warning(f"No documents match to '{source}' redirect.")
                continue

            for doc in expanded_docs:
                new_target = self._apply_placeholders(doc, target)
                to_be_redirected[doc] = new_target

        return to_be_redirected

    def create_redirects(self, to_be_redirected: Mapping[str, str]):
        """
        Create a redirect file for each pair in passed mapping of docnames to targets.

        :param to_be_redirected: A mapping of docnames to targets to create redirect files for
        """
        for doc, target in status_iterator(to_be_redirected, 'writing redirects...', 'darkgreen',
                                           len(to_be_redirected.items())):
            if not str(doc).endswith(".html"):
                doc += ".html"
            redirect_file_abs = Path(self.app.outdir).joinpath(doc)
            self._create_redirect_file(redirect_file_abs, target)

    @staticmethod
    def _contains_wildcard(text: str) -> bool:
        """
        Tells whether passed argument contains wildcard characters.

        :param text: The string to search for wildcard characters
        :return: True if wildcard characters were found; False otherwise
        """
        return bool(wildcard_pattern.search(text))

    @staticmethod
    def _apply_placeholders(source: str, target: str) -> str:
        """
        Expand `source` placeholder in target and return it

        :param source: The string value of the `source` parameter to render
        :param target: The template to render
        :return: The rendered template
        """
        return Template(target).substitute({"source": source})

    def _create_redirect_file(self, at_path: Path, to_uri: str):
        """
        Create a redirect file according to the redirect template

        :param at_path: The Path in which to write the redirect file
        :param to_uri: The value of the `to_uri` parameter to render in the redirect template
        """
        content = self._render_redirect_template(to_uri)
        # create any missing parent folders
        at_path.parent.mkdir(parents=True, exist_ok=True)
        at_path.write_text(content)

    def _render_redirect_template(self, to_uri: Any) -> str:
        """
        Render the redirect template by substituting the `to_uri` parameter

        :param to_uri: The value of the `to_uri` parameter to render
        :return: The rendered redirect template
        """
        # HTML used as redirect file content
        redirect_template = REDIRECT_FILE_DEFAULT_TEMPLATE
        if self.template_file_option:
            redirect_file_abs = Path(self.app.srcdir,
                                     self.template_file_option)
            redirect_template = redirect_file_abs.read_text()

        content = Template(redirect_template).substitute({"to_uri": to_uri})

        return content

source/index.rst METASEP
.. Top-Level documentation file is used to start the toctree;
   however, this file is overridden in the rendering process
   by an alternative index.html that provides a visually-pleasing
   landing page.  Updates to this top-level item must also
   be transposed in the 'templates/index.html' file.

Mattermost product documentation
--------------------------------

.. _`mattermost.org/download`: https://mattermost.com/download/
.. _contacting Mattermost, Inc.: https://mattermost.com/contact-us/
.. _download and try it today.: https://docs.mattermost.com/install/enterprise-install-upgrade.html

.. toctree::
   :maxdepth: 1
   :glob:

   About Mattermost <overview/index>
   Deploy Mattermost <guides/deployment>
   Mattermost administration <guides/administration>
   Welcome to Mattermost <guides/welcome-to-mattermost>
   Mattermost Channels <guides/channels>
   Mattermost Playbooks <guides/playbooks>
   Mattermost Boards <guides/boards>
   Mattermost for developers <https://developers.mattermost.com/>
   Get help with Mattermost <guides/get-help>
   Community chat <guides/community-chat>
   Mattermost Handbook <https://handbook.mattermost.com/>

extensions/README.md METASEP
# Mattermost Documentation Sphinx Extensions

This directory holds Sphinx extensions that are specific to the Mattermost Documentation build process.

source/conf.py METASEP
# Mattermost documentation configuration file for the Sphinx documentation builder.
#
# This file only contains a selection of the most common options. For a full
# list see the documentation:
# https://www.sphinx-doc.org/en/master/usage/configuration.html

import sys
import os
from sphinx.application import Sphinx


def setup(_: Sphinx):
    return


# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
sys.path.insert(0, os.path.abspath("../extensions"))

# -- General configuration ------------------------------------------------

# If your documentation needs a minimal Sphinx version, state it here.
needs_sphinx = "4.4"

# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = [
    "sphinx.ext.autosectionlabel",
    "myst_parser",
    # `reredirects` is a local clone of sphinx_reredirects with parallel
    # read and write support enabled.
    # The original sphinx_reredirects extension can be found at:
    # https://documatt.gitlab.io/sphinx-reredirects/
    "reredirects",
    # `sitemap` is a local clone of sphinx_sitemap with parallel read
    # and write support enabled.
    # The original sphinx_sitemap extension can be found at:
    # https://pypi.org/project/sphinx-sitemap/
    "sitemap",
    "sphinx_tabs.tabs",
    "sphinx_copybutton"
]

sphinx_tabs_disable_tab_closing = True
sphinx_tabs_disable_css_loading = False

# Prefix document path to section labels, otherwise autogenerated labels would look like 'heading'
# rather than 'path/to/file:heading'
autosectionlabel_prefix_document = True

# Add any paths that contain templates here, relative to this directory.
templates_path = ["templates"]

# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
source_suffix = [".rst", ".md"]

# The encoding of source files.
# source_encoding = 'utf-8-sig'

# Redirects using: https://pypi.org/project/sphinx-reredirects/
redirects = {

# How to add redirects for docs.mattermost.com:
# A redirect is required when an existing product documentation page is moved to a new sub-directory, to another information site altogether, OR when the file # is archived because it's no longer needed. Redirects defined here ensure that existing links to these changed pages take the user to the correct destination # page. Many of the links below are the result of the information architecture overhaul completed in FY22 Q2.
# All redirects in the following are organized alphabetically for easy scanning and management based on the origin URL (the URL to the left of the colon). 
# Please take care to ensure that alphabetical order is maintained as new redirects are added. See a mistake? Please feel free to fix it!
# Before adding a new redirect, please search to confirm that the redirect you want isn't already specified below. 
# Add the new redirect in the appropriate section, based on its path. 
# For page heading redirects, use the format "directory/filename.html": "full-URL-path-to-new-destination.html",
# For mid-page redirects (also known as section title redirects), use the format "directory/filename.html#section-title": "full-URL-path-to-new-destination.html",
# Ensure that all redirects end in a comma, except for the very last redirect.

# About redirects
"about/license-and-subscription.html#do-you-have-a-program-for-official-non-profits-open-source-projects-and-charities": 
        "https://docs.mattermost.com/about/subscription.html#do-you-have-a-program-for-official-non-profits-open-source-projects-and-charities",
"about/deployments-and-editions.html":
        "https://docs.mattermost.com/about/editions-and-offerings.html",
"about/faq-business.html#copyright-and-licensing-of-mattermost-server-open-source-code":
	"https://docs.mattermost.com/about/faq-license.html#open-source-derivative-work-of-mattermost",
"about/faq-enterprise.html#what-are-mattermost-s-policies-around-licensing-terms-of-use-and-privacy":
	"https://docs.mattermost.com/about/faq-license.html#what-are-mattermost-s-policies-around-licensing-terms-of-use-and-privacy",
"about/faq-mattermost-source-available-license.html":
	"https://docs.mattermost.com/about/faq-license.html#source-available-licensing",

# Administration redirects
"administration/announcement-banner.html":
        "https://docs.mattermost.com/manage/announcement-banner.html",
"administration/audit-log.html": 
        "https://docs.mattermost.com/comply/audit-log.html",
"administration/backup.html": 
        "https://docs.mattermost.com/deploy/backup-disaster-recovery.html",
"administration/branding.html": 
        "https://docs.mattermost.com/configure/custom-branding-tools.html",
"administration/bulk-export.html": 
        "https://docs.mattermost.com/manage/bulk-export-tool.html",
"administration/changelog.html": 
        "https://docs.mattermost.com/install/self-managed-changelog.html",
"administration/changelog.html": 
	"https://docs.mattermost.com/install/self-managed-changelog.html",
"administration/changelog.html#database-changes-from-v3-4-to-v3-5":
        "https://docs.mattermost.com/install/self-managed-changelog.html#id41",
"administration/command-line-tools.html": 
        "https://docs.mattermost.com/manage/command-line-tools.html",
"administration/command-line-tools.html#mattermost-channel-restore": 
        "https://docs.mattermost.com/manage/command-line-tools.html#mattermost-channel-restore",
"administration/command-line-tools.html#mattermost-permissions-reset": 
        "https://docs.mattermost.com/manage/command-line-tools.html#mattermost-permissions-reset",
"administration/command-line-tools.html#mattermost-permissions-export": 
        "https://docs.mattermost.com/manage/command-line-tools.html#mattermost-permissions-export",
"administration/command-line-tools.html#mattermost-permissions-import": 
        "https://docs.mattermost.com/manage/command-line-tools.html#mattermost-permissions-import",
"administration/command-line-tools.html#mattermost-group-team-list": 
        "https://docs.mattermost.com/manage/command-line-tools.html#mattermost-group-team-list",
"administration/command-line-tools.html#mattermost-group-team-enable": 
        "https://docs.mattermost.com/manage/command-line-tools.html#mattermost-group-team-enable",
"administration/command-line-tools.html#mattermost-group-channel-enable": 
        "https://docs.mattermost.com/manage/command-line-tools.html#mattermost-group-channel-enable",
"administration/command-line-tools.html#mattermost-group-team-disable": 
        "https://docs.mattermost.com/manage/command-line-tools.html#mattermost-group-team-disable",
"administration/command-line-tools.html#mattermost-group-channel-disable": 
        "https://docs.mattermost.com/manage/command-line-tools.html#mattermost-group-channel-disable",
"administration/command-line-tools.html#mattermost-ldap-idmigrate": 
        "https://docs.mattermost.com/manage/command-line-tools.html#mattermost-ldap-idmigrate",
"administration/compliance.html": 
        "https://docs.mattermost.com/comply/compliance-monitoring.html",
"administration/compliance-export.html": 
        "https://docs.mattermost.com/comply/compliance-export.html",
"administration/config-in-database.html":
        "https://docs.mattermost.com/configure/configuation-in-mattermost-database.html",
"administration/data-retention.html": 
        "https://docs.mattermost.com/comply/data-retention-policy.html",
"administration/devops-command-center.html": 
        "https://docs.mattermost.com/guides/playbooks.html",
"administration/downgrade.html": 
        "https://docs.mattermost.com/upgrade/downgrading-mattermost-server.html",
"administration/ediscovery.html#mattermost-restful-api": 
        "https://docs.mattermost.com/comply/electronic-discovery.html#mattermost-restful-api",
"administration/ediscovery.html#mattermost-database": 
        "https://docs.mattermost.com/comply/electronic-discovery.html#mattermost-database",
"administration/ediscovery.html": 
        "https://docs.mattermost.com/comply/electronic-discovery.html",
"administration/encryption.html": 
        "https://docs.mattermost.com/deploy/encryption-options.html",
"administration/extended-support-release.html": 
        "https://docs.mattermost.com/upgrade/extended-support-release.html",
"administration/extended-support-release.html": 
        "https://docs.mattermost.com/upgrade/extended-support-release.html",
"administration/generating-support-packet.html": 
        "https://docs.mattermost.com/manage/generating-support-packet.html",
"administration/health-check.html": 
        "https://docs.mattermost.com/manage/health-checks.html",
"administration/hipchat-migration-guidelines.html":
        "https://docs.mattermost.com/onboard/migrating-from-hipchat-to-mattermost.html",
"administration/image-proxy.html": 
        "https://docs.mattermost.com/deploy/image-proxy.html",
"administration/important-upgrade-notes.html": 
        "https://docs.mattermost.com/upgrade/important-upgrade-notes.html",
"administration/legacy-upgrade.html":
        "https://docs.mattermost.com/guides/deployment.html#upgrade-mattermost",
"administration/light-install-hindi.html":
        "https://docs.mattermost.com/guides/deployment.html",
"administration/migrating.html#migrating-from-slack-using-the-mattermost-mmetl-tool-and-bulk-import":
        "https://docs.mattermost.com/onboard/migrating.html#migrating-from-slack-using-the-mattermost-mmetl-tool-and-bulk-import",
"administration/migrating.html#migrating-from-slack-using-the-mattermost-web-app":
        "https://docs.mattermost.com/onboard/migrating.html#migrating-from-slack-using-the-mattermost-web-app",
"administration/migrating.html#migrating-from-slack-using-the-mattermost-mmetl-tool-and-bulk-import": 
        "https://docs.mattermost.com/onboard/migrating-to-mattermost.html#migrating-from-slack-using-the-mattermost-mmetl-tool-and-bulk-import",
"administration/migrating.html": 
        "https://docs.mattermost.com/onboard/migrating-to-mattermost.html",
"administration/migration-announcement-email-template.html":
        "https://docs.mattermost.com/onboard/migration-announcement-email.html",
"administration/mmctl-cli-tool.html": 
        "https://docs.mattermost.com/manage/mmctl-cli-tool.html",
"administration/mmctl-cli-tool.html#mmctl-channel-modify": 
        "https://docs.mattermost.com/manage/command-line-tools.html#mattermost-channel-modify",
"administration/mmctl-cli-tool.html": 
        "https://docs.mattermost.com/manage/mmctl-command-line-tool.html",
"administration/mobile-changelog.html": 
        "https://docs.mattermost.com/deploy/mobile-app-changelog.html",
"administration/notices.html": 
        "https://docs.mattermost.com/manage/in-product-notices.html",
"administration/open-source-components.html": 
        "https://docs.mattermost.com/upgrade/open-source-components.html",
"administration/performance-alerting-guide.html": 
        "https://docs.mattermost.com/scale/peformance-alerting.html",
"administration/performance-alerting-guide": 
        "https://docs.mattermost.com/scale/performance-monitoring.html",
"administration/plugins.html": 
        "https://developers.mattermost.com/integrate/admin-guide/admin-plugins-beta/",
"administration/prev-config-settings.html":
        "https://docs.mattermost.com/configure/configuration-settings.html",
"administration/release-definitions.html": 
        "https://docs.mattermost.com/upgrade/release-definitions.html",
"administration/release-lifecycle.html": 
        "https://docs.mattermost.com/upgrade/release-lifecycle.html",
"administration/scripts.html": 
        "https://docs.mattermost.com/manage/scripts.html",
"administration/statistics.html": 
        "https://docs.mattermost.com/manage/statistics.html",
"administration/telemetry.html": 
        "https://docs.mattermost.com/manage/telemetry.html",
"administration/telemetry.html": 
	"https://docs.mattermost.com/manage/telemetry.html",     
"administration/upgrade.html": 
        "https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html",
"administration/upgrade.html#upgrade-team-edition-to-enterprise-edition": 
        "https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html#upgrading-team-edition-to-enterprise-edition",
"administration/upgrade-guide.html":
        "https://docs.mattermost.com/guides/deployment.html#upgrade-mattermost",
"administration/upgrading-to-2.0.html":
        "https://docs.mattermost.com/guides/deployment.html#upgrade-mattermost",
"administration/upgrading-to-3.0.html":
        "https://docs.mattermost.com/guides/deployment.html#upgrade-mattermost",
"administration/user-provisioning.html":
        "https://docs.mattermost.com/onboard/user-provisioning-workflows.html",
"administration/config-in-database.html#create-an-environment-file": 
       "https://docs.mattermost.com/configure/deprecated-configuration-settings.html#enable-public-channel-creation-for",
"administration/config-settings.html": 
        "https://docs.mattermost.com/configure/configuration-settings.html",  
"administration/config-settings.html#aggregate-search-indexes":
        "https://docs.mattermost.com/configure/configuration-settings.html#aggregate-search-indexes",
"administration/config-settings.html#allow-users-to-view-archived-channels-beta":
        "https://docs.mattermost.com/configure/configuration-settings.html#allow-users-to-view-archived-channels",
"administration/config-settings.html#autoclose-direct-messages-in-sidebar-experimental":
        "https://docs.mattermost.com/configure/deprecated-configuration-settings.html#autoclose-direct-messages-in-sidebar",
"administration/config-settings.html#ad-ldap": 
        "https://docs.mattermost.com/configure/configuration-settings.html#ad-ldap",
"administration/config-in-database.html":   
	"https://docs.mattermost.com/configure/configuation-in-mattermost-database.html#create-an-environment-file",
"administration/config-settings.html#customization": 
        "https://docs.mattermost.com/configure/configuration-settings.html#customization",
"administration/config-settings.html#default-channels-experimental": 
        "https://docs.mattermost.com/configure/configuration-settings.html#default-channels-experimental",
"administration/config-settings.html#deprecated-configuration-settings":
        "https://docs.mattermost.com/configure/configuration-settings.html#deprecated-configuration-settings",
"administration/config-settings.html#data-retention-policy": 
 	"https://docs.mattermost.com/configure/configuration-settings.html#data-retention-policy",  
"administration/config-settings.html#enable-automatic-replies-experimental": 
        "https://docs.mattermost.com/configure/configuration-settings.html#enable-automatic-replies-experimental",
"administration/config-settings.html#enable-document-search-by-content":
        "https://docs.mattermost.com/configure/configuration-settings.html#enable-document-search-by-content",
"administration/config-settings.html#enable-high-availability-mode":
        "https://docs.mattermost.com/configure/configuration-settings.html#enable-high-availability-mode",
"administration/config-settings.html#enable-legacy-sidebar":
        "https://docs.mattermost.com/configure/deprecated-configuration-settings.html#enable-legacy-sidebar",
"administration/config-settings.html#enable-link-previews":
        "https://docs.mattermost.com/configure/configuration-settings.html#enable-link-previews",
"administration/config-settings.html#enable-local-mode": 
        "https://docs.mattermost.com/configure/configuration-settings.html#enable-local-mode",
"administration/config-settings.html#enable-local-mode-socket-location": 
        "https://docs.mattermost.com/configure/configuration-settings.html#enable-local-mode-socket-location",   
"administration/config-settings.html#enable-public-channel-renaming-for": 
        "https://docs.mattermost.com/configure/deprecated-configuration-settings.html#enable-public-channel-renaming-for",
"administration/config-settings.html#enable-public-channel-creation-for": 
        "https://docs.mattermost.com/configure/configuration-settings.html#enable-public-channel-creation-for",
"administration/config-settings.html#enable-x-to-leave-channels-from-left-hand-sidebar-experimental":
        "https://docs.mattermost.com/configure/deprecated-configuration-settings.html#enable-x-to-leave-channels-from-left-hand-sidebar",
"administration/config-settings.html#environment":
        "https://docs.mattermost.com/configure/configuration-settings.html#environment-variables",
"administration/config-settings.html#experimental-sidebar-features":
        "https://docs.mattermost.com/configure/deprecated-configuration-settings.html#experimental-sidebar-features",
"administration/config-settings.html#files": 
        "https://docs.mattermost.com/configure/configuration-settings.html#file-storage", 
"administration/config-settings.html#forward-port-80-to-443":
        "https://docs.mattermost.com/configure/configuration-settings.html#forward-port-80-to-443",
"administration/config-settings.html#gitlab-settings": 
	"https://docs.mattermost.com/configure/configuration-settings.html#gitlab-settings",
"administration/config-settings.html#google-settings":
        "https://docs.mattermost.com/configure/configuration-settings.html#google-settings",
"administration/config-settings.html#group-unread-channels-experimental": 
        "https://docs.mattermost.com/configure/configuration-settings.html#group-unread-channels-experimental",
"administration/config-settings.html#id-attribute": 
        "https://docs.mattermost.com/configure/configuration-settings.html#id-attribute",               
"administration/config-settings.html#link-previews": 
        "https://docs.mattermost.com/configure/configuration-settings.html#enable-link-previews",
"administration/config-settings.html#logging": 
        "https://docs.mattermost.com/configure/configuration-settings.html#standard-logging",
"administration/config-settings.html#login-id-attribute": 
        "https://docs.mattermost.com/configure/configuration-settings.html#login-id-attribute",
"administration/config-settings.html#maximum-file-size":
        "https://docs.mattermost.com/configure/configuration-settings.html#maximum-file-size",       
"administration/config-settings.html#maximum-page-size": 
        "https://docs.mattermost.com/configure/configuration-settings.html#maximum-page-size",
"administration/config-settings.html#office-365-settings":
        "https://docs.mattermost.com/configure/configuration-settings.html#office-365-settings",
"administration/config-settings.html#openid-connect-other-settings":
        "https://docs.mattermost.com/configure/configuration-settings.html#openid-connect-other-settings",
"administration/config-settings.html#policy": 
        "https://docs.mattermost.com/configure/deprecated-configuration-settings.html#policy",
"administration/config-settings#post-edit-time-limit.html": 
    "https://docs.mattermost.com/configure/deprecated-configuration-settings.html#post-edit-time-limit",
"administration/config-settings.html#push-notification-contents": 
        "https://docs.mattermost.com/configure/configuration-settings.html#push-notification-contents",  
"administration/config-settings.html#rate-limiting": 
        "https://docs.mattermost.com/configure/configuration-settings.html#rate-limiting",
"administration/config-settings.html#session-lengths": 
	"https://docs.mattermost.com/configure/configuration-settings.html#session-lengths",
"administration/config-settings.html#sidebar-organization":
        "https://docs.mattermost.com/configure/deprecated-configuration-settings.html#sidebar-organization",
"administration/config-settings#site-configuration.html":
        "https://docs.mattermost.com/configure/configuration-settings.html#site-configuration",
"administration/config-settings.html#site-url":
        "https://docs.mattermost.com/configure/configuration-settings.html#site-url",
"administration/config-settings.html#smtp-email-server": 
        "https://docs.mattermost.com/configure/configuration-settings.html#smtp-email-server",
"administration/config-settings#storage.html":
        "https://docs.mattermost.com/configure/configuration-settings.html#local-storage-directory",
"administration/config-settings.html#teammate-name-display": 
        "https://docs.mattermost.com/configure/configuration-settings.html#teammate-name-display",
"administration/config-settings.html#timezone": 
        "https://docs.mattermost.com/configure/deprecated-configuration-settings.html#timezone",
"administration/config-settings.html#town-square-is-hidden-in-left-hand-sidebar-experimental":
        "https://docs.mattermost.com/configure/deprecated-configuration-settings.html#town-square-is-hidden-in-left-hand-sidebar",
"administration/config-settings.html#town-square-is-read-only-experimental":
        "https://docs.mattermost.com/configure/deprecated-configuration-settings.html#town-square-is-read-only",
"administration/config-settings.html#user-filter": 
        "https://docs.mattermost.com/configure/configuration-settings.html#user-filter",

# Boards redirects
"boards/navigating-mattermost-boards.html":
        "https://docs.mattermost.com/welcome/what-changed-in-v60.html",

# Channels redirects
"channels/sign-in.html":
        "https://docs.mattermost.com/welcome/log-in.html",
"channels/organize-conversations.html#enable-collapsed-reply-threads-beta":
        "https://docs.mattermost.com/channels/organize-conversations.html#enable-collapsed-reply-threads",

# Cloud redirects
"cloud/cloud-administration/cloud-changelog.html": 
	"https://docs.mattermost.com/install/cloud-changelog.html",
"cloud/cloud-administration/cloud-compliance.html":
        "https://docs.mattermost.com/comply/cloud-compliance-and-oversight.html",
"cloud/cloud-integrations/cloud-slash-commands.html": 
	"https://docs.mattermost.com/channels/run-slash-commands.html",
"cloud/cloud-administration/compliance-export.html": 
	"https://docs.mattermost.com/comply/compliance-export.html",
"cloud/cloud-administration/custom-terms-of-service.html":
        "https://docs.mattermost.com/comply/custom-terms-of-service.html",
"cloud/cloud-reporting.html": 
	"https://docs.mattermost.com/manage/statistics.html",
"cloud/cloud-administration/data-retention-policy.html":
        "https://docs.mattermost.com/comply/cloud-data-retention-policy.html",
"cloud/cloud-administration/saml-technical.html": 
	"https://docs.mattermost.com/onboard/cloud-sso-saml-technical.html",
"cloud/cloud-administration/sso-saml.html": 
	"https://docs.mattermost.com/onboard/cloud-sso-saml.html",
"cloud/cloud-billing/cloud-billing.html": 
	"https://docs.mattermost.com/manage/cloud-billing.html",
"cloud/cloud-guest-accounts.html":
        "https://docs.mattermost.com/onboard/guest-accounts.html",
"cloud/cloud-integrations.html": 
        "https://developers.mattermost.com/integrate/admin-guide/admin-webhooks-incoming/",
"cloud/cloud-mobile/cloud-app-config.html": 
	"https://docs.mattermost.com/deploy/mobile-appconfig.html",
"cloud/cloud-mobile/troubleshooting-mobile.html":
        "https://docs.mattermost.com/deploy/mobile-faq.html",
"cloud/cloud-reporting.html": 
	"https://docs.mattermost.com/manage/cloud-reporting.html",
"cloud/mobile-apps-faq.html": 
        "https://docs.mattermost.com/deploy/mobile-faq.html",
"cloud/cloud-user-management.html":
        "https://docs.mattermost.com/channels/manage-channel-members.html",

# Compliance redirects
"comply/compliance-reporting-oversight":
        "https://docs.mattermost.com/comply/compliance-monitoring.html",
        
# Configure redirects
"configure/config-ssl-http2-apache2.html": 
	"https://forum.mattermost.org/t/configuring-apache2-with-ssl-and-http-2/11939",
"configure/configuring-apache2.html": 
        "https://forum.mattermost.com/t/configuring-apache2-as-a-proxy-for-mattermost-server/11938",


# Configuration settings redirects
"configure/configuration-settings.html#channels":
        "https://docs.mattermost.com/configure/user-management-configuration-settings.html#channels",
"configure/configuration-settings.html#allow-use-of-api-v3-endpoints":
        "https://docs.mattermost.com/configure/deprecated-configuration-settings.html#allow-use-of-api-v3-endpoints",
"configure/configuration-settings.html#applied-schema-migrations":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#applied-schema-migrations",
"configure/configuration-settings.html#compliance-export-beta": 
        "https://docs.mattermost.com/configure/configuration-settings.html#compliance-export",
"configure/configuration-settings.html#connection-security":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#connection-security",
"configure/configuration-settings.html#custom-terms-of-service-beta": 
        "https://docs.mattermost.com/configure/configuration-settings.html#custom-terms-of-service",
"configure/configuration-settings.html#database":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#database",
"configure/configuration-settings.html#data-source":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#data-source",
"configure/configuration-settings.html#disable-database-search":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#disable-database-search",
"configure/configuration-settings.html#driver-name":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#driver-name",
"configure/configuration-settings.html#enable-insecure-outgoing-connections":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#enable-insecure-outgoing-connections",
"configure/configuration-settings.html#enable-latex-rendering": 
        "https://docs.mattermost.com/configure/configuration-settings.html#enable-latex-code-block-rendering",
"configure/configuration-settings.html#environment":
        "https://docs.mattermost.com/configure/web-server-configuration-settings.html",
"configure/configuration-settings.html#forward-port-80-to-443":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#forward-port-80-to-443",
"configure/configuration-settings.html#groups":
        "https://docs.mattermost.com/configure/user-management-configuration-settings.html#groups",
"configure/configuration-settings.html#guest-access-beta": 
        "https://docs.mattermost.com/configure/configuration-settings.html#guest-access",
"configure/configuration-settings.html#idle-timeout":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#idle-timeout",
"configure/configuration-settings.html#let-s-encrypt-certificate-cache-file":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#let-s-encrypt-certificate-cache-file",
"configure/configuration-settings.html#listen-address":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#web-server-listen-address",
"configure/configuration-settings.html#managed-resource-paths":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#managed-resource-paths",
"configure/configuration-settings.html#maximum-connection-idle-timeout":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#maximum-connection-idle-timeout",
"configure/configuration-settings.html#maximum-connection-lifetime":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#maximum-connection-lifetime",
"configure/configuration-settings.html#maximum-idle-connections":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#maximum-idle-database-connections",
"configure/configuration-settings.html#maximum-open-connections":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#maximum-open-connections",
"configure/configuration-settings.html#minimum-hashtag-length":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#minimum-hashtag-length",
"configure/configuration-settings.html#purge-all-caches":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#purge-all-caches",
"configure/configuration-settings.html#permissions":
        "https://docs.mattermost.com/configure/user-management-configuration-settings.html#permissions",
"configure/configuration-settings.html#plugins-beta": 
        "https://docs.mattermost.com/configure/configuration-settings.html#plugins",
"configure/configuration-settings.html#query-timeout":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#query-timeout",
"configure/configuration-settings.html#read-timeout":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#read-timeout",
"configure/configuration-settings.html#recycle-database-connections":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#recycle-database-connections",
"configure/configuration-settings.html#reload-configuration-from-disk":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#reload-configuration-from-disk",
"configuration-settings.html#reporting":
        "https://docs.mattermost.com/configure/reporting-configuration-settings.html",
"configure/configuration-settings.html#site-statistics":
        "https://docs.mattermost.com/configure/reporting-configuration-settings.html#site-statistics",
"configure/configuration-settings.html#server-logs":
        "https://docs.mattermost.com/configure/reporting-configuration-settings.html#server-logs",
"configure/configuration-settings.html#site-url":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#site-url",
"configure/configuration-settings.html#sql-statement-logging-trace":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#sql-statement-logging",
"configure/configuration-settings.html#teams":
        "https://docs.mattermost.com/configure/user-management-configuration-settings.html#teams",
"configure/configuration-settings.html#team-statistics":
        "https://docs.mattermost.com/configure/reporting-configuration-settings.html#team-statistics",
"configure/configuration-settings.html#terms-of-service-link": 
        "https://docs.mattermost.com/configure/configuration-settings.html#terms-of-use-link",
"configure/configuration-settings.html#test-live":
        "https://docs.mattermost.com/configure/web-server-configuration-settings.html",
"configure/configuration-settings.html#tls-certificate-file":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#tls-certificate-file",
"configure/configuration-settings.html#tls-key-file":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#tls-key-file",
"configure/configuration-settings.html#use-let-s-encrypt":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#use-let-s-encrypt",
"configure/configuration-settings.html#websocket-url":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#websocket-url",
"configure/configuration-settings.html#license-file-location":
        "https://docs.mattermost.com/configure/web-server-configuration-settings.html#license-file-location",
"configure/configuration-settings.html#tls-minimum-version":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#tls-minimum-version",
"configure/configuration-settings.html#enable-strict-transport-security-hsts":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#enable-strict-transport-security-hsts",
"configure/configuration-settings.html#secure-tls-transport-expiry":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#secure-tls-transport-expiry",
"configure/configuration-settings.html#tls-cipher-overwrites":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#tls-cipher-overwrites",
"configure/configuration-settings.html#trusted-proxy-ip-header":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#trusted-proxy-ip-header",
"configure/configuration-settings.html#go-routine-health-threshold":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#goroutine-health-threshold",
"configure/configuration-settings.html#allow-cookies-for-subdomains":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#allow-cookies-for-subdomains",
"configure/configuration-settings.html#cluster-log-timeout":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#cluster-log-timeout",
"configure/configuration-settings.html#user-management":
        "https://docs.mattermost.com/configure/user-management-configuration-settings.html",
"configure/configuration-settings.html#users":
        "https://docs.mattermost.com/configure/user-management-configuration-settings.html#users",
"configure/configuration-settings.html#web-server":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#web-server",
"configure/configuration-settings.html#webserver-mode":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#webserver-mode",
"configure/configuration-settings.html#write-timeout":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#write-timeout",
"configure/configuration-settings.html#collapsed-reply-threads-beta":
        "https://docs.mattermost.com/configure/configuration-settings.html#collapsed-reply-threads",
"configure/configuration-settings.html#elasticsearch":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#elasticsearch",
"configure/configuration-settings.html#elasticsearch-settings":
	"https://docs.mattermost.com/configure/environment-configuration-settings.html#elasticsearch",
"configure/configuration-settings.html#enable-elasticsearch-indexing":
	"https://docs.mattermost.com/configure/environment-configuration-settings.html#enable-elasticsearch-indexing.html",
"configure/configuration-settings.html#server-connection-address":
	"https://docs.mattermost.com/configure/environment-configuration-settings.html#server-connection-address.html",
"configure/configuration-settings.html#skip-tls-verification":
	"https://docs.mattermost.com/configure/environment-configuration-settings.html#skip-tls-verification.html",
"configure/configuration-settings.html#server-username":
	"https://docs.mattermost.com/configure/environment-configuration-settings.html#server-username.html",
"configure/configuration-settings.html#server-password":
	"https://docs.mattermost.com/configure/environment-configuration-settings.html#server-password.html",
"configure/configuration-settings.html#enable-cluster-sniffing":
	"https://docs.mattermost.com/configure/environment-configuration-settings.html#enable-cluster-sniffing.html",
"configure/configuration-settings.html#bulk-indexing":
	"https://docs.mattermost.com/configure/environment-configuration-settings.html#bulk-indexing.html",
"configure/configuration-settings.html#purge-indexes":
	"https://docs.mattermost.com/configure/environment-configuration-settings.html#purge-indexes.html",
"configure/configuration-settings.html#enable-elasticsearch-for-search-queries":
	"https://docs.mattermost.com/configure/environment-configuration-settings.html#enable-elasticsearch-for-search-queries.html",
"configure/configuration-settings.html#enable-elasticsearch-for-autocomplete-queries":
	"https://docs.mattermost.com/configure/environment-configuration-settings.html#enable-elasticsearch-for-autocomplete-queries.html",
"configure/configuration-settings.html#post-index-replicas":
	"https://docs.mattermost.com/configure/environment-configuration-settings.html#post-index-replicas.html",
"configure/configuration-settings.html#post-index-shards":
	"https://docs.mattermost.com/configure/environment-configuration-settings.html#post-index-shards.html",
"configure/elasticsearch-configuration-settings.html#elasticsearch-configuration-settings":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#channel-index-replicas",
"configure/elasticsearch-configuration-settings.html#channel-index-shards":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#channel-index-shards",
"configure/elasticsearch-configuration-settings.html#user-index-replicas":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#user-index-replicas",
"configure/elasticsearch-configuration-settings.html#user-index-shards":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#user-index-shards",
"configure/configuration-settings.html#aggregate-search-indexes":
	"https://docs.mattermost.com/configure/environment-configuration-settings.html#aggregate-search-indexes.html",
"configure/configuration-settings.html#post-aggregator-start-time":
	"https://docs.mattermost.com/configure/environment-configuration-settings.html#post-aggregator-start-time.html",
"configure/configuration-settings.html#index-prefix":
	"https://docs.mattermost.com/configure/environment-configuration-settings.html#index-prefix.html",
"configure/configuration-settings.html#live-indexing-batch-size":
	"https://docs.mattermost.com/configure/environment-configuration-settings.html#live-indexing-batch-size.html",
"configure/configuration-settings.html#request-timeout":
	"https://docs.mattermost.com/configure/environment-configuration-settings.html#request-timeout.html",
"configure/configuration-settings.html#bulk-indexing-time-window":
	"https://docs.mattermost.com/configure/environment-configuration-settings.html#bulk-indexing-time-window.html",
"configure/configuration-settings.html#trace":
	"https://docs.mattermost.com/configure/environment-configuration-settings.html#trace.html",
"configure/configuration-settings.html#initial-font":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#initial-font",
"configure/configuration-settings.html#amazon-s3-bucket-endpoint":
        "https://docs.mattermost.com/configure/deprecated-configuration-settings.html#amazon-s3-bucket-endpoint",
"configure/configuration-settings.html#amazon-s3-location-constraint":
        "https://docs.mattermost.com/configure/deprecated-configuration-settings.html#amazon-s3-location-constraint",
"configure/configuration-settings.html#amazon-s3-lowercase-bucket":
        "https://docs.mattermost.com/configure/deprecated-configuration-settings.html#amazon-s3-lowercase-bucket",
"configure/configuration-settings.html#amazon-s3-signature-v2":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#amazon-s3-signature-v2",
"configure/configuration-settings.html#amazon-s3-path":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#amazon-s3-path-prefix",
"configure/configuration-settings.html#file-storage":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#file-storage",
"configure/configuration-settings.html#file-storage-system":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#file-storage-system",
"configure/configuration-settings.html#local-storage-directory":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#local-storage-directory",
"configure/configuration-settings.html#maximum-file-size":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#maximum-file-size",
"configure/configuration-settings.html#enable-document-search-by-content":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#enable-document-search-by-content",
"configure/configuration-settings.html#enable-searching-content-of-documents-within-zip-files":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#enable-searching-content-of-documents-within-zip-files",
"configure/configuration-settings.html#amazon-s3-bucket":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#amazon-s3-bucket",
"configure/configuration-settings.html#amazon-s3-region":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#amazon-s3-region",
"configure/configuration-settings.html#amazon-s3-access-key-id":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#amazon-s3-access-key-id",
"configure/configuration-settings.html#amazon-s3-endpoint":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#amazon-s3-endpoint",
"configure/configuration-settings.html#amazon-s3-secret-access-key":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#amazon-s3-secret-access-key",
"configure/configuration-settings.html#enable-secure-amazon-s3-connections":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#enable-secure-amazon-s3-connections",
"configure/configuration-settings.html#enable-server-side-encryption-for-amazon-s3":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#enable-server-side-encryption-for-amazon-s3",
"configure/configuration-settings.html#enable-amazon-s3-debugging":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#enable-amazon-s3-debugging",
"configure/configuration-settings.html#test-connection":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#enable-amazon-s3-debugging",
"configure/configuration-settings.html#image-proxy":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#image-proxy",
"configure/configuration-settings.html#enable-image-proxy":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#enable-image-proxy",
"configure/configuration-settings.html#image-proxy-type":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#image-proxy-type",
"configure/configuration-settings.html#remote-image-proxy-url":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#remote-image-proxy-url",
"configure/configuration-settings.html#remote-image-proxy-options":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#remote-image-proxy-options",
"configure/configuration-settings.html#smtp":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#smtp",
"configure/configuration-settings.html#smtp-email-server":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#smtp-server",
"configure/configuration-settings.html#smtp-server-port":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#smtp-server-port",
"configure/configuration-settings.html#smtp-server-timeout":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#smtp-server-timeout",
"configure/configuration-settings.html#enable-smtp-authentication":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#enable-smtp-authentication",
"configure/configuration-settings.html#smtp-server-username":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#smtp-server-username",
"configure/configuration-settings.html#smtp-server-password":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#smtp-server-password",
"configure/configuration-settings.html#connection-security":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#connection-security",
"configure/configuration-settings.html#skip-server-certificate-verification":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#skip-server-certificate-verification",
"configure/configuration-settings.html#enable-security-alerts":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#enable-security-alerts",
"configure/configuration-settings.html#push-notification-server":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#push-notification-server",
"configure/configuration-settings.html#enable-push-notifications":
        "https://docs.mattermost.com/configure/environment-server.html#enable-push-notifications",
"configure/configuration-settings.html#max-notifications-per-channel":
        "https://docs.mattermost.com/configure/environment-server.html#maximum-notifications-per-channel",
"configure/configuration-settings.html#high-availability":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#high-availability",
"configure/configuration-settings.html#enable-high-availability-mode":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#enable-high-availability-mode",
"configure/configuration-settings.html#cluster-name":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#cluster-name",
"configure/configuration-settings.html#override-hostname":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#override-hostname",
"configure/configuration-settings.html#use-ip-address":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#use-ip-address",
"configure/configuration-settings.html#use-gossip":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#use-gossip",
"configure/configuration-settings.html#enable-experimental-gossip-encryption":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#enable-experimental-gossip-encryption",
"configure/configuration-settings.html#enable-gossip-compression":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#enable-gossip-compression",
"configure/configuration-settings.html#gossip-port":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#gossip-port",
"configure/configuration-settings.html#streaming-port":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#streaming-port",
"configure/configuration-settings.html#read-only-config":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#read-only-config",
"configure/configuration-settings.html#network-interface":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#network-interface",
"configure/configuration-settings.html#bind-address":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#bind-address",
"configure/configuration-settings.html#advertise-address":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#advertise-address",
"configure/configuration-settings.html#maximum-idle-connections":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#maximum-idle-connections",
"configure/configuration-settings.html#maximum-idle-connections-per-host":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#maximum-idle-connections-per-host",
"configure/configuration-settings.html#idle-connection-timeout-in-milliseconds":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#idle-connection-timeout",
"configure/configuration-settings.html#read-replicas":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#read-replicas",
"configure/configuration-settings.html#search-replicas":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#search-replicas",
"configure/configuration-settings.html#replica-lag-settings":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#replica-lag-settings",
"configure/configuration-settings.html#rate-limiting":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html",
"configure/configuration-settings.html#enable-rate-limiting":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#enable-rate-limiting",
"configure/configuration-settings.html#maximum-queries-per-second":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#maximum-queries-per-second",
"configure/configuration-settings.html#memory-store-size":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#memory-store-size",
"configure/configuration-settings.html#vary-rate-limit-by-remote-address":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#vary-rate-limit-by-remote-address",
"configure/configuration-settings.html#vary-rate-limit-by-user":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#vary-rate-limit-by-user",
"configure/configuration-settings.html#vary-rate-limit-by-http-header":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#vary-rate-limit-by-http-header",
"configure/configuration-settings.html#maximum-burst-size":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#maximum-burst-size",
"configure/configuration-settings.html#session-lengths":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#session-lengths",
"configure/configuration-settings.html#extend-session-length-with-activity":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#extend-session-length-with-activity",
"configure/configuration-settings.html#session-length-for-email-and-ad-ldap-authentication-days":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#session-length-for-ad-ldap-and-email",
"configure/configuration-settings.html#session-length-for-mobile-apps-days":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#session-length-for-mobile",
"configure/configuration-settings.html#session-length-for-sso-authentication-days":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#session-length-for-sso",
"configure/configuration-settings.html#session-cache-minutes":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#session-cache",
"configure/configuration-settings.html#session-idle-timeout-minutes":
        "https://docs.mattermost.com/configure/session-lengths-configuration-settings.html#session-idle-timeout",
"configure/configuration-settings.html#performance-monitoring":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#performance-monitoring",
"configure/configuration-settings.html#enable-performance-monitoring":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#enable-performance-monitoring",
"configure/configuration-settings.html#id6":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#listen-address",
"configure/configuration-settings.html#developer":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#developer",
"configure/configuration-settings.html#enable-testing-commands":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#enable-testing-commands",
"configure/configuration-settings.html#enable-developer-mode":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#enable-developer-mode",
"configure/configuration-settings.html#allow-untrusted-internal-connections-to":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#allow-untrusted-internal-connections",
"configure/configuration-settings.html#enable-client-performance-debugging":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#enable-client-performance-debugging",
"configure/configuration-settings.html#standard-logging":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#logging",
"configure/configuration-settings.html#output-logs-to-console":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#output-logs-to-console",
"configure/configuration-settings.html#console-log-level":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#console-log-level",
"configure/configuration-settings.html#output-console-logs-as-json":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#output-console-logs-as-json",
"configure/configuration-settings.html#output-logs-to-file":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#output-logs-to-file",
"configure/configuration-settings.html#file-log-level":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#file-log-level",
"configure/configuration-settings.html#output-file-logs-as-json":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#output-file-logs-as-json",
"configure/configuration-settings.html#file-log-directory":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#file-log-directory",
"configure/configuration-settings.html#enable-webhook-debugging":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#enable-webhook-debugging",
"configure/configuration-settings.html#enable-diagnostics-and-error-reporting":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#enable-diagnostics-and-error-reporting",
"configure/configuration-settings.html#advanced-logging":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#output-logs-to-multiple-targets",
"configure/configuration-settings.html#output-logs-to-multiple-targets":
        "https://docs.mattermost.com/configure/environment-configuration-settings.html#output-logs-to-multiple-targets",
"configure/configuration-settings.html#environment-variables":
        "https://docs.mattermost.com/configure/environment-variables.html",
"configure/configuration-settings.html#override-mattermost-license-file":
        "https://docs.mattermost.com/configure/environment-variables.html#override-mattermost-license-file",
"configure/configuration-settings.html#load-custom-configuration-defaults":
        "https://docs.mattermost.com/configure/environment-variables.html#load-custom-configuration-defaults",

# Deploy redirects
"deploy/mobile-apps-faq.html":
        "https://docs.mattermost.com/deploy/mobile-faq.html",

# Deployment redirects
"deployment/advanced-permissions.html": 
	"https://docs.mattermost.com/onboard/advanced-permissions.html",
"deployment/auth.html": 
	"https://docs.mattermost.com/onboard/multi-factor-authentication.html",
"deployment/admin-roles.html": 
	"https://docs.mattermost.com/onboard/system-admin-roles.html",
"deployment/atlassian-integrations.html":
        "https://mattermost.com/marketplace/",
"deployment/advanced-permissions.html#read-only-channels": 
        "https://docs.mattermost.com/onboard/advanced-permissions.html#read-only-channels",
"deployment/bot-integrations.html":
        "https://mattermost.com/marketplace/",
"deployment/bots.html": 
	"https://developers.mattermost.com/integrate/admin-guide/admin-bot-accounts/",
"deployment/bulk-loading.html": 
	"https://docs.mattermost.com/onboard/bulk-loading-data.html",
"deployment/ci-cd-tools.html": 
        "https://mattermost.com/marketplace/",
"deployment/cluster.html": 
	"https://docs.mattermost.com/scale/high-availability-cluster.html",
"deployment/cluster-310.html": 
        "https://docs.mattermost.com/scale/high-availability-cluster.html",
"deployment/cluster#upgrade-guide.html": 
	"https://docs.mattermost.com/scale/high-availability-cluster.html#upgrade-guide",
"deployment/customize-mattermost.html": 
	"https://docs.mattermost.com/configure/customizing-mattermost.html",
"deployment/customize-email.html": 
	"https://docs.mattermost.com/configure/email-templates.html.html",
"deployment/converting-oauth20-service-providers-to-openidconnect.html":
        "https://docs.mattermost.com/onboard/convert-oauth20-service-providers-to-openidconnect.html",
"deployment/certificate-based-authentication.html":
        "https://docs.mattermost.com/onboard/certificate-based-authentication.html",
"deployment/cluster#proxy-server-configuration.html": 
        "https://docs.mattermost.com/scale/high-availability-cluster.html#proxy-server-configuration",
"deployment/team-channel-management.html": 
	"https://docs.mattermost.com/manage/team-channel-members.html",
"deployment/deployment.html": 
        "https://docs.mattermost.com/deploy/deployment-overview.html",
"deployment/deployment#file-store.html": 
	"https://docs.mattermost.com/deploy/deployment-overview.html#file-store",
"deployment/desktop-app-deployment.html": 
	"https://docs.mattermost.com/deploy/desktop-app.html",
"deployment/elasticsearch.html": 
	"https://docs.mattermost.com/scale/elasticsearch.html",
"deployment/enterprise-deployment-guide.html":
        "https://docs.mattermost.com/scale/scaling-for-enterprise.html",
"deployment/guest-accounts.html":
	"https://docs.mattermost.com/onboard/guest-accounts.html",
"deployment/incident-response-and-monitoring.html":
        "https://docs.mattermost.com/guides/playbooks.html",
"deployment/ha.html": 
	"https://docs.mattermost.com/deployment/cluster.html",
"deployment/ldap-group-sync.html": 
	"https://docs.mattermost.com/onboard/ad-ldap-groups-synchronization.html",
"deployment/ldap-group-constrained-team-channel.html": 
	"https://docs.mattermost.com/onboard/cloud-groups.html",
"deployment/ldap-group-sync.html#add-default-teams-or-channels-for-the-group": 
        "https://docs.mattermost.com/onboard/ad-ldap-groups-synchronization.html#adding-default-teams-or-channels-for-the-group",
"deployment/microsoft-integrations.html":
        "https://mattermost.com/marketplace/",
"deployment/team-channel-management.html#profile": 
	"https://docs.mattermost.com/manage/team-channel-members.html#profile",
"deployment/metrics.html": 
	"https://docs.mattermost.com/scale/performance-monitoring.html",
"deployment/mobile-app-deployment.html": 
	"https://docs.mattermost.com/deploy/mobile-overview.html",
"deployment/on-boarding.html": 
	"https://docs.mattermost.com/getting-started/admin-onboarding-tasks.html",
"deployment/on-boarding.html#common-tasks": 
        "https://docs.mattermost.com/getting-started/admin-onboarding-tasks.html",
"deployment/permissions-backend.html":
        "https://docs.mattermost.com/onboard/advanced-permissions-backend-infrastructure.html",
"deployment/pre-sales.html":
        "https://handbook.mattermost.com/operations/sales",
"deployment/productivity-tools.html":
        "https://mattermost.com/marketplace/",
"deployment/push.html": 
	"https://docs.mattermost.com/deploy/mobile-hpns.html",
"deployment/scaling.html": 
	"https://docs.mattermost.com/scale/scaling-for-enterprise.html",
"deployment/sso-ldap.html": 
	"https://docs.mattermost.com/onboard/ad-ldap.html",
"deployment/sso-openidconnect.html": 
	"https://docs.mattermost.com/onboard/sso-openidconnect.html",
"deployment/sso-gitlab.html": 
	"https://docs.mattermost.com/onboard/sso-gitlab.html",
"deployment/sso-google.html": 
	"https://docs.mattermost.com/onboard/sso-google.html",
"deployment/sso-office.html": 
	"https://docs.mattermost.com/onboard/sso-office.html",
"deployment/sso-saml.html": 
	"https://docs.mattermost.com/onboard/sso-saml.html",
"deployment/sso-saml-technical.html": 
	"https://docs.mattermost.com/onboard/sso-saml-technical.html",
"deployment/sso-saml-troubleshooting.html": 
        "https://docs.mattermost.com/onboard/sso-saml.html",
"deployment/ssl-client-certificate.html": 
	"https://docs.mattermost.com/onboard/ssl-client-certificate.html",
"deployment/sso-saml-okta.html": 
	"https://docs.mattermost.com/onboard/sso-saml-okta.html",
"deployment/sso-saml-okta.html#configure-saml-synchronization-with-ad-ldap": 
        "https://docs.mattermost.com/onboard/sso-saml-okta.html#configure-saml-synchronization-with-ad-ldap",
"deployment/sso-saml-adfs-msws2016.html": 
	"https://docs.mattermost.com/onboard/sso-saml-adfs-msws2016.html",
"deployment/team-channel-management.html": 
	"https://docs.mattermost.com/manage/team-channel-members.html",
"deployment/video-and-audio-calling.html": 
        "https://mattermost.com/marketplace/",
"deployment/webrtc.html": 
	"https://docs.mattermost.com/deployment/video-and-audio-calling.html",

# Developer redirects. 
# The developer directory and its contents have been archived in FY23 Q2 and all applicable content has been moved from docs.mm.com to developers.mm.com.
"developer/api.html":
        "https://api.mattermost.com",
"developer/api4.html":
        "https://developers.mattermost.com/contribute/server/rest-api/",
"developer/api-development-version4.html":
        "https://developers.mattermost.com/contribute/server/rest-api/",
"developer/before-you-get-started.html":
        "https://developers.mattermost.com/integrate/getting-started/",
"developer/bot-accounts.html": 
        "https://developers.mattermost.com/integrate/admin-guide/admin-bot-accounts/",
"developer/contribution-guide.html": 
        "https://developers.mattermost.com/contribute/getting-started/",
"developer/core-developer-handbook.html":
        "https://developers.mattermost.com/internal/",
"developer/developer-flow.html":
        "https://developers.mattermost.com/contribute/getting-started/",
"developer/developer-setup.html":
        "https://developers.mattermost.com/contribute/server/developer-setup/",
"developer/dev-setup.html":
        "https://developers.mattermost.com/contribute/server/developer-setup/",
"developer/dev-setup-archlinux.html":
        "https://developers.mattermost.com/contribute/server/developer-setup/",
"developer/dev-setup-centos-7.html":
        "https://developers.mattermost.com/contribute/server/developer-setup/",
"developer/dev-setup-compiling.html":
        "https://developers.mattermost.com/contribute/getting-started/",
"developer/dev-setup-osx.html":
        "https://developers.mattermost.com/contribute/server/developer-setup/",
"developer/dev-setup-troubleshooting.html":
        "https://developers.mattermost.com/contribute/server/developer-setup/",
"developer/dev-setup-ubuntu-1604.html":
        "https://developers.mattermost.com/contribute/server/developer-setup/",
"developer/dev-setup-windows.html":
        "https://developers.mattermost.com/contribute/server/developer-setup/",
"developer/fx-guidelines.html":
        "https://handbook.mattermost.com/operations/research-and-development/product/technical-writing-team-handbook/user-interface-text-guidelines##in-product-copy",
"developer/interactive-dialogs.html": 
        "https://developers.mattermost.com/integrate/admin-guide/admin-interactive-dialogs/",
"developer/interactive-messages.html":
        "https://developers.mattermost.com/integrate/admin-guide/admin-interactive-messages/",
"developer/interactive-message-buttons.html": 
        "https://developers.mattermost.com/integrate/admin-guide/admin-interactive-messages/",
"developer/localization.html":
        "https://handbook.mattermost.com/contributors/contributors/localization",
"developer/localization-process.html":
        "https://handbook.mattermost.com/contributors/join-us/localization",
"developer/manifesto.html":
        "https://handbook.mattermost.com/company/about-mattermost",
"developer/message-attachments.html": 
        "https://developers.mattermost.com/integrate/admin-guide/admin-message-attachments/",
"developer/mobile-developer-setup.html":
        "https://developers.mattermost.com/contribute/mobile/developer-setup/",
"developer/oauth-2-0-applications.html": 
        "https://developers.mattermost.com/integrate/admin-guide/admin-oauth2/",
"developer/personal-access-token.html": 
        "https://developers.mattermost.com/integrate/admin-guide/admin-personal-access-token/",
"developer/redux.html":
        "https://developers.mattermost.com/contribute/redux/",
"developer/redux-to-flow.html":
        "https://developers.mattermost.com/contribute/redux/redux-to-flow/",
"developer/running-mattermost.html":
        "https://developers.mattermost.com/contribute/server/developer-workflow/",
"developer/slash-commands.html": 
        "https://developers.mattermost.com/integrate/admin-guide/admin-slash-commands/",
"developer/toolkit.html":
        "https://developers.mattermost.com/integrate/apps/",
"developer/web-service.html":
        "https://api.mattermost.com/",
"developer/webapp-component.html": 
        "https://developers.mattermost.com/contribute/webapp/build-component/",
"developer/webapp-end-to-end-testing.html":
        "https://developers.mattermost.com/contribute/webapp/end-to-end-tests/",
"developer/webapp-to-redux.html":
        "https://developers.mattermost.com/contribute/webapp/webapp-to-redux/",
"developer/webhooks-outgoing.html": 
        "https://developers.mattermost.com/integrate/admin-guide/admin-webhooks-outgoing/",
"developer/webhooks-incoming.html":
        "https://developers.mattermost.com/integrate/admin-guide/admin-webhooks-incoming/",

# Focalboard redirects
"focalboard/installing-boards": 
	"https://docs.mattermost.com/guides/boards.html",

# Getting Started redirects
"getting-started/implementation_plan.html": 
        "https://docs.mattermost.com/getting-started/implementation-plan.html",
"getting-started/light-install.html":
        "https://docs.mattermost.com/guides/deployment.html",
"getting-started/welcome_email.html": 
        "https://docs.mattermost.com/getting-started/welcome-email-to-end-users.html",

# Guides redirects
"guides/administrator.html": 
        "https://docs.mattermost.com/guides/deployment.html",
"guides/administrator.html#mattermost-integrations": 
	"https://developers.mattermost.com/integrate/getting-started/",
"guides/administrator.html#installing-mattermost": 
	"https://docs.mattermost.com/guides/deployment.html#install-guides",
"guides/channels.html#access-your-workspace":
        "https://docs.mattermost.com/guides/welcome-to-mattermost.html#access-your-mattermost-workspace",
"guides/channels.html#work-with-messages":
        "https://docs.mattermost.com/guides/channels.html#work-with-messages",
"guides/channels.html#manage-teams-channels-and-members":
        "https://docs.mattermost.com/guides/channels.html#channels-messages-and-conversations",
"guides/channels.html#customize-channels":
        "https://docs.mattermost.com/guides/channels.html#customize-your-channels-experience",
"guides/channels.html#navigate-channels":
        "https://docs.mattermost.com/guides/channels.html#keyboard-accessibility",
"guides/channels.html#extend-mattermost-channels":
        "https://docs.mattermost.com/guides/channels.html#extend-channels-functionality",
"guides/messaging.html": 
	"https://docs.mattermost.com/guides/channels.html",
"guides/orchestration.html": 
        "https://docs.mattermost.com/about/orchestration.html",

# Important Note: The following guide files were archived in FY23 Q2.
"guides/cloud-admin-guide.html": 
	"https://docs.mattermost.com/guides/deployment.html",
"guides/developer.html": 
        "https://developers.mattermost.com/integrate/admin-guide/",
"guides/install-deploy-upgrade-scale.html":
	 "https://docs.mattermost.com/guides/deployment.html",
"guides/install-deploy-upgrade-scale.html#install-mattermost":
        "https://docs.mattermost.com/guides/deployment.html#install-guides",
"guides/integration.html": 
        "https://developers.mattermost.com/integrate/getting-started/",
"guides/setup-onboard-manage-comply.html": 
	"https://docs.mattermost.com/guides/administration.html",
"guides/user.html": 
        "https://docs.mattermost.com/guides/channels.html",

# Help redirects resulting from the June 2021 docs reorganization project.
"help/apps/desktop-changelog.html": 
	"https://docs.mattermost.com/install/desktop-app-changelog.html",
"help/apps/desktop-guide.html": 
	"https://docs.mattermost.com/welcome/manage-desktop-app-server-connections.html",
"help/apps/desktop-mvp.html":
        "https://developers.mattermost.com/contribute/mvp/",
"help/getting-started/about-teams-channels-messages.html":
        "https://docs.mattermost.com/channels/about-teams-channels-messages.html",
"help/getting-started/access-your-workspace.html": 
	"https://docs.mattermost.com/guides/welcome-to-mattermost.html#access-your-mattermost-workspace",
"help/getting-started/accessibility.html": 
        "https://docs.mattermost.com/channels/keyboard-accessibility.html",
"help/messaging/attaching-files.html": 
        "https://docs.mattermost.com/channels/share-files-in-messages.html",
"help/getting-started/configuring-notifications.html":
        "https://docs.mattermost.com/channels/channels-settings.html#notifications",
"help/getting-started/creating-teams.html": 
	"https://docs.mattermost.com/welcome/about-teams.html#create-a-team",
"help/getting-started/install-desktop-app.html":
        "https://docs.mattermost.com/install/desktop-app-install.html",
"help/messaging/emoji.html": 
        "https://docs.mattermost.com/channels/react-to-messages.html",
"help/messaging/executing-commands.html": 
        "https://docs.mattermost.com/channels/run-slash-commands.html",
"help/messaging/flagging-messages.html": 
        "https://docs.mattermost.com/channels/save-pin-messages.html",
"help/messaging/formatting-text.html": 
	"https://docs.mattermost.com/channels/format-messages.html",
"help/messaging/formatting-text.html#in-line-images": 
	"https://docs.mattermost.com/channels/format-messages.html#in-line-images",
"help/getting-started/light-install.html": 
        "https://docs.mattermost.com/getting-started/light-install.html",
"help/getting-started/log-out.html": 
	"https://docs.mattermost.com/welcome/log-out.html",
"help/messaging/keyboard-shortcuts.html": 
        "https://docs.mattermost.com/channels/keyboard-shortcuts-for-channels.html",
"help/getting-started/managing-members.html": 
	"https://docs.mattermost.com/channels/manage-channel-members.html",
"help/messaging/mentioning-teammates.html": 
        "https://docs.mattermost.com/channels/mention-people.html",
"help/getting-started/messaging-basics.html#messaging-basics": 
	"https://docs.mattermost.com/guides/channels.html#work-with-messages",
"help/getting-started/organizing.html": 
	"https://docs.mattermost.com/channels/channel-naming-conventions.html",
"help/getting-started/organizing-conversations.html": 
	"https://docs.mattermost.com/guides/channels.html#work-with-channels",
"help/messaging/organizing-conversations.html": 
	"https://docs.mattermost.com/channels/organize-conversations.html",
"help/messaging/organizing-conversations.html#known-issues":
        "https://docs.mattermost.com/channels/organize-conversations.html#known-issues",
"help/getting-started/organizing-your-sidebar.html": 
	"https://docs.mattermost.com/channels/customize-your-channel-sidebar.html",
"help/messaging/pinning-messages.html": 
        "https://docs.mattermost.com/channels/save-pin-messages.html",
"help/getting-started/signing-in.html": 
	"https://docs.mattermost.com/welcome/sign-in.html",
"help/getting-started/searching.html": 
	"https://docs.mattermost.com/channels/search-for-messages.html",
"help/messaging/sending-messages.html": 
	"https://docs.mattermost.com/channels/send-messages.html",
"help/getting-started/setting-your-status-availability.html":
        "https://docs.mattermost.com/welcome/set-your-status-availability.html",
"help/getting-started/switch-between-teams.html": 
	"https://docs.mattermost.com/welcome/about-teams.html#team-sidebar",
"help/getting-started/welcome-to-mattermost.html": 
	"https://docs.mattermost.com/guides/channels.html",
"help/settings/account-settings.html": 
        "https://docs.mattermost.com/channels/channels-settings.html",
"help/settings/account-settings.html#link-preview": 
        "https://docs.mattermost.com/channels/channels-settings.html#website-link-previews",
"help/settings/channel-settings.html": 
	"https://docs.mattermost.com/channels/channels-settings.html",
"help/settings/custom-emoji.html": 
        "https://docs.mattermost.com/channels/react-to-messages.html#upload-custom-emojis",
"help/settings/desktop-app-options.html": 
        "https://docs.mattermost.com/welcome/customize-desktop-app-experience.html",
"help/settings/integration-settings.html":
        "https://mattermost.com/marketplace/",
"help/settings/manage-servers.html": 
        "https://docs.mattermost.com/welcome/manage-desktop-app-server-connections.html",
"help/settings/team-settings.html": 
	"https://docs.mattermost.com/welcome/team-settings.html",
"help/settings/theme-colors.html": 
        "https://docs.mattermost.com/welcome/customize-your-theme.html",

# Incident Collaboration redirects resulting from organization's branding shift from Incident Collaboration to Playbooks.
"incident-collaboration/getting-started.html": 
        "https://docs.mattermost.com/playbooks/getting-started.html",
"incident-collaboration/launching-playbooks.html": 
        "https://docs.mattermost.com/incident-collaboration/running-playbooks.html",
"incident-collaboration/overview.html": 
        "https://docs.mattermost.com/playbooks/refining-and-improving.html",
"incident-collaboration/playbook-planning.html": 
        "https://docs.mattermost.com/incident-collaboration/setting-up-playbooks.html",
"incident-collaboration/review-and-refine.html":
        "https://docs.mattermost.com/incident-collaboration/refining-and-improving.html",
"incident-collaboration/running-playbooks.html": 
        "https://docs.mattermost.com/playbooks/running-playbooks.html",
"incident-collaboration/refining-and-improving.html": 
         "https://docs.mattermost.com/playbooks/refining-and-improving.html",
"incident-collaboration/setting-up-playbooks.html": 
        "https://docs.mattermost.com/playbooks/setting-up-playbooks.html",

# Install redirects
"install/config-cloudfront.html":
        "https://docs.mattermost.com/configure/configuring-cloudfront-to-host-mattermost-static-assets.html",
"install/config-apache2.html": 
        "https://forum.mattermost.com/t/configuring-apache2-as-a-proxy-for-mattermost-server/11938",
"install/deploy-bitnami.html": 
        "https://docs.mattermost.com/install/deploying-team-edition-on-bitnami.html",
"install/desktop.html": 
        "https://docs.mattermost.com/install/desktop-app-install.html",
"install/desktop-managed-resources.html": 
        "https://docs.mattermost.com/install/desktop-app-managed-resources.html",
"install/desktop-msi-gpo.html":
        "https://docs.mattermost.com/install/desktop-msi-installer-and-group-policy-install.html",
"install/docker-ebs.html": 
        "https://docs.mattermost.com/install/setting-up-aws-elastic-beanstalk-docker.html",
"install/docker-local-machine.html": 
        "https://docs.mattermost.com/install/setting-up-local-machine-using-docker.html",
"install/ee-install.html": 
        "https://docs.mattermost.com/install/enterprise-install-upgrade.html",
"install/enterprise-install-upgrade.html#changing-a-license-key": 
	"https://docs.mattermost.com/upgrade/installing-license-key.html",
"install/i18n.html": 
	"https://docs.mattermost.com/configure/enabling-chinese-japanese-korean-search.html",
"install/installing-mattermost-desktop-app.html":
        "https://docs.mattermost.com/install/desktop-app-install.html",
"install/install-kubernetes-cluster.html":
        "https://docs.mattermost.com/install/install-kubernetes.html",
"install/install-kubernetes-mattermost":
        "https://docs.mattermost.com/install/mattermost-kubernetes-operator",
"install/install-kubernetes-operator.html":
        "https://docs.mattermost.com/install/install-kubernetes.html",
"install/install-ubuntu-1804.html": 
        "https://docs.mattermost.com/install/installing-ubuntu-1804-LTS.html",
"install/install-ubuntu-2004.html": 
        "https://docs.mattermost.com/install/installing-ubuntu-2004-LTS.html",
"install/install-mmte-helm-gitlab-helm.html":
        "https://docs.mattermost.com/install/installing-team-edition-helm-chart.html",
"install/mattermost-omnibus.html": 
        "https://docs.mattermost.com/install/installing-mattermost-omnibus.html",
"install/outbound-proxy.html": 
        "https://docs.mattermost.com/configure/using-outbound-proxy.html",
"install/prod-docker.html": 
	"https://forum.mattermost.org/t/deploy-mattermost-on-docker/12231",
"install/prod-windows-2012.html": 
	"https://forum.mattermost.org/t/production-install-on-windows-server/12232",
"install/requirements.html": 
        "https://docs.mattermost.com/install/software-hardware-requirements.html",
"install/setting-up-local-machine-using-docker.html":
        "https://docs.mattermost.com/guides/deployment.html",
"install/sockets-db.html": 
        "https://docs.mattermost.com/install/setting-up-socket-based-mattermost-database.html",
"install/smtp-email-setup.html": 
        "https://docs.mattermost.com/configure/smtp-email.html",
"install/transport-encryption/config.html": 
        "https://docs.mattermost.com/install/transport-encryption.html",
"install/transport-encryption/config-cluster.html":
        "https://docs.mattermost.com/install/cluster-transport-encryption.html",
"install/transport-encryption/config-database.html":
        "https://docs.mattermost.com/install/database-transport-encryption.html",
"install/transport-encryption/config-mattermost.html":
        "https://docs.mattermost.com/install/proxy-to-mattermost-transport-encryption.html",
"install/use-kubernetes-mattermost.html":
        "https://docs.mattermost.com/install/install-kubernetes.html",
"install/deploy-cloudron.html":
        "https://forum.mattermost.com/t/deploy-mattermost-on-cloudron/13526",
"install/desktop-custom-dictionaries.html#setting-up-the-dictionaries":
        "https://docs.mattermost.com/install/desktop-custom-dictionaries.html#prepare-custom-dictionaries",
"install/desktop-custom-dictionaries.html#configuring-the-desktop-app":
        "https://docs.mattermost.com/install/desktop-custom-dictionaries.html#configure-the-desktop-app",
"install/desktop-custom-dictionaries.html#removing-customized-dictionaries":
        "https://docs.mattermost.com/install/desktop-custom-dictionaries.html#remove-custom-dictionaries",

# Integrations redirects.
# The integrations directory and its contents have been archived in FY23 Q2 and all applicable content has been moved from docs.mm.com to developers.mm.com.
"integrations/cloud-incoming-webhooks.html":
        "https://developers.mattermost.com/integrate/admin-guide/",
"integrations/cloud-outgoing-webhooks.html":
        "https://developers.mattermost.com/integrate/admin-guide/",
"integrations/embedding.html":
        "https://developers.mattermost.com/integrate/admin-guide/admin-embedding/",
"integrations/cloud-embedding.html":
	"https://developers.mattermost.com/integrate/admin-guide/admin-embedding/",
"integrations/integration-faq.html":
        "https://docs.mattermost.com/about/faq-integrations.html",
"integrations/jira.html": 
        "https://mattermost.gitbook.io/plugin-jira/",
"integrations/net-promoter-score.html": 
        "https://docs.mattermost.com/manage/user-satisfaction-surveys.html",
"integrations/webhook.html":
        "https://developers.mattermost.com/integrate/admin-guide/",
"integrations/zapier.html":
        "https://developers.mattermost.com/integrate/admin-guide/admin-zapier-integration/",
"integrations/zoom.html": 
        "https://mattermost.gitbook.io/plugin-zoom/",

# Manage redirects
"manage/scripts.html":
        "https://forum.mattermost.com/t/scripts-for-performing-discreet-tasks/13527",        

# Messaging redirects
"messaging/about-teams-channels-messages.html#teams":
        "https://docs.mattermost.com/welcome/about-teams.html",
"messaging/about-teams-channels-messages.html#channels":
        "https://docs.mattermost.com/guides/channels.html#work-with-channels",
"messaging/about-teams-channels-messages.html#messages":
        "https://docs.mattermost.com/guides/channels.html#work-with-messages",
"messaging/accessing-your-workspace.html": 
	"https://docs.mattermost.com/welcome/sign-in.html",
"messaging/channels-basics.html":
        "https://docs.mattermost.com/guides/channels.html#work-with-channels",
"messaging/channels-basics.html#write-messages":
        "https://docs.mattermost.com/channels/send-messages.html",
"messaging/channels-basics.html#reply-to-messages":
        "https://docs.mattermost.com/channels/reply-to-messages.html",
"messaging/channels-basics.html#notify-teammates":
        "https://docs.mattermost.com/channels/mention-people.html",
"messaging/channels-basics.html#link-to-channels":
        "https://docs.mattermost.com/channels/format-messages.html#channel-links",
"messaging/channels-basics.html#format-your-messages":
        "https://docs.mattermost.com/channels/format-messages.html",
"messaging/channels-basics.html#react-to-messages":
        "https://docs.mattermost.com/channels/react-to-messages.html",
"messaging/channels-basics.html#share-files":
        "https://docs.mattermost.com/channels/share-files-in-messages.html",
"messaging/channels-basics.html#save-messages-for-follow-up":
        "https://docs.mattermost.com/channels/save-pin-messages.html",
"messaging/channel-preferences.html":
        "https://docs.mattermost.com/channels/set-channel-preferences.html",
"messaging/channel-preferences.html#channel-notification-preferences":
        "https://docs.mattermost.com/channels/set-channel-preferences.html#channel-notification-preferences",
"messaging/channel-preferences.html#channel-header":
        "https://docs.mattermost.com/channels/set-channel-preferences.html#channel-header",
"messaging/channel-preferences.html#channel-purpose":
        "https://docs.mattermost.com/channels/set-channel-preferences.html#channel-purpose",
"messaging/channel-preferences.html#channel-name":
        "https://docs.mattermost.com/channels/set-channel-preferences.html#channel-name",
"messaging/channel-settings.html": 
	"https://docs.mattermost.com/channels/set-channel-preferences.html",
"messaging/common-navigating-mattermost-products.html":
        "https://docs.mattermost.com/welcome/what-changed-in-v60.html",
"messaging/configuring-notifications.html":
        "https://docs.mattermost.com/channels/channels-settings.html#notifications",
"messaging/configuring-notifications.html#desktop-notifications":
        "https://docs.mattermost.com/channels/channels-settings.html#desktop-notifications",
"messaging/configuring-notifications.html#email-notifications":
        "https://docs.mattermost.com/channels/channels-settings.html#email-notifications",
"messaging/configuring-notifications.html#mobile-push-notifications":
        "https://docs.mattermost.com/channels/channels-settings.html#mobile-push-notifications",
"messaging/configuring-notifications.html#browser-tab-notifications":
        "https://docs.mattermost.com/channels/channels-settings.html#browser-tab-notifications",
"messaging/configuring-notifications.html#muting-a-channel":
        "https://docs.mattermost.com/channels/set-channel-preferences.html#mute-channel",
"messaging/configuring-notifications.html#ignoring-mentions":
        "https://docs.mattermost.com/channels/set-channel-preferences.html#ignore-mentions-for-channel-here-and-all",
"messaging/creating-teams.html":
        "https://docs.mattermost.com/welcome/about-teams.html#create-a-team",
"messaging/creating-teams.html#methods-to-create-a-team":
        "https://docs.mattermost.com/welcome/about-teams.html#create-a-team",
"messaging/creating-teams.html#team-name-and-url-selection":
        "https://docs.mattermost.com/welcome/about-teams.html#team-name-and-url-selection",
"messaging/creating-teams.html#best-practices-for-using-a-single-team-vs-multiple-teams":
        "https://docs.mattermost.com/welcome/about-teams.html#single-team-versus-multiple-teams",
"messaging/customizing-theme-colors.html":
        "https://docs.mattermost.com/welcome/customize-your-theme.html",
"messaging/customizing-theme-colors.html#import-theme-from-slack":
        "https://docs.mattermost.com/welcome/customize-your-theme.html#import-theme-from-slack",
"messaging/customizing-theme-colors.html#custom-themes":
        "https://docs.mattermost.com/welcome/customize-your-theme.html#custom-themes",
"messaging/customizing-theme-colors.html#standard-themes":
        "https://docs.mattermost.com/welcome/customize-your-theme.html#standard-themes",
"messaging/executing-slash-commands.html":
        "https://docs.mattermost.com/channels/run-slash-commands.html",
"messaging/executing-slash-commands.html#built-in-commands":
        "https://docs.mattermost.com/channels/run-slash-commands.html",
"messaging/executing-slash-commands.html#custom-commands":
        "https://docs.mattermost.com/channels/run-slash-commands.html",
"messaging/extending-messaging-with-integrations.html": 
        "https://mattermost.com/marketplace/",
"messaging/formatting-text.html":
        "https://docs.mattermost.com/channels/format-messages.html",
"messaging/formatting-text.html#text-style":
        "https://docs.mattermost.com/channels/format-messages.html#text-style",
"messaging/formatting-text.html#links":
        "https://docs.mattermost.com/channels/format-messages.html#links",
"messaging/formatting-text.html#headings":
        "https://docs.mattermost.com/channels/format-messages.html#headings",
"messaging/formatting-text.html#lists":
        "https://docs.mattermost.com/channels/format-messages.html#lists",
"messaging/formatting-text.html#code-block":
        "https://docs.mattermost.com/channels/format-messages.html#code-blocks",
"messaging/formatting-text.html#in-line-code":
        "https://docs.mattermost.com/channels/format-messages.html#in-line-code",
"messaging/formatting-text.html#in-line-images":
        "https://docs.mattermost.com/channels/format-messages.html#in-line-images",
"messaging/formatting-text.html#in-line-image-with-hover-text":
        "https://docs.mattermost.com/channels/format-messages.html#in-line-image-with-hover-text",
"messaging/formatting-text.html#in-line-image-displayed-with-fixed-width-and-height":
        "https://docs.mattermost.com/channels/format-messages.html#in-line-image-displayed-with-fixed-width-and-height",
"messaging/formatting-text.html#lines":
        "https://docs.mattermost.com/channels/format-messages.html#horizontal-lines",
"messaging/formatting-text.html#block-quotes":
        "https://docs.mattermost.com/channels/format-messages.html#block-quotes",
"messaging/formatting-text.html#tables":
        "https://docs.mattermost.com/channels/format-messages.html#tables",
"messaging/formatting-text.html#math-formulas":
        "https://docs.mattermost.com/channels/format-messages.html#math-formulas",
"messaging/keyboard-accessibility.html":
        "https://docs.mattermost.com/channels/keyboard-accessibility.html",
"messaging/keyboard-accessibility.html#region-navigation":
        "https://docs.mattermost.com/channels/keyboard-accessibility.html#region-navigation",
"messaging/keyboard-accessibility.html#message-navigation":
        "https://docs.mattermost.com/channels/keyboard-accessibility.html#message-navigation",
"messaging/keyboard-accessibility.html#channel-sidebar-navigation":
        "https://docs.mattermost.com/channels/keyboard-accessibility.html#channel-sidebar-navigation",
"messaging/keyboard-shortcuts.html":
        "https://docs.mattermost.com/channels/keyboard-shortcuts-for-channels.html",
"messaging/keyboard-shortcuts.html#mattermost-server-and-product-navigation":
        "https://docs.mattermost.com/welcome/keyboard-shortcuts.html#navigation-shortcuts-in-the-desktop-app",
"messaging/keyboard-shortcuts.html#general-mattermost-navigation":
        "https://docs.mattermost.com/channels/keyboard-shortcuts-for-channels.html#navigation-shortcuts-for-mattermost-channels",
"messaging/keyboard-shortcuts.html#files":
        "https://docs.mattermost.com/channels/keyboard-shortcuts-for-channels.html#file-upload-shortcuts",
"messaging/keyboard-shortcuts.html#messages":
        "https://docs.mattermost.com/channels/keyboard-shortcuts-for-channels.html#message-shortcuts",
"messaging/keyboard-shortcuts.html#formatting":
        "https://docs.mattermost.com/channels/keyboard-shortcuts-for-channels.html#formatting-shortcuts",
"messaging/keyboard-shortcuts.html#browser-built-in":
        "https://docs.mattermost.com/welcome/keyboard-shortcuts.html#zoom-shortcuts-for-web-and-desktop-app",
"messaging/logging-out.html":
        "https://docs.mattermost.com/welcome/log-out.html",
"messaging/manage-channels-settings.html":
        "https://docs.mattermost.com/channels/channels-settings.html",
"messaging/manage-channels-settings.html#notifications":
        "https://docs.mattermost.com/channels/channels-settings.html#notifications",
"messaging/manage-channels-settings.html#display":
        "https://docs.mattermost.com/channels/channels-settings.html#display",
"messaging/manage-channels-settings.html#sidebar":
        "https://docs.mattermost.com/channels/channels-settings.html#sidebar",
"messaging/manage-channels-settings.html#advanced":
        "https://docs.mattermost.com/channels/channels-settings.html#advanced",
"messaging/manage-profile-settings.html":
        "https://docs.mattermost.com/welcome/manage-your-profile.html",
"messaging/manage-profile-settings.html#profile":
        "https://docs.mattermost.com/welcome/manage-your-profile.html#profile",
"messaging/manage-profile-settings.html#security":
        "https://docs.mattermost.com/welcome/manage-your-profile.html#security",
"messaging/managing-account-settings.html": 
	"https://docs.mattermost.com/channels/channels-settings.html",
"messaging/managing-channels.html":
        "https://docs.mattermost.com/guides/channels.html#work-with-channels",
"messaging/managing-channels.html#creating-a-channel":
        "https://docs.mattermost.com/channels/create-channels.html",
"messaging/managing-channels.html#creating-a-direct-or-group-message":
        "https://docs.mattermost.com/channels/create-channels.html#create-a-direct-or-group-message",
"messaging/managing-channels.html#joining-a-channel":
        "https://docs.mattermost.com/channels/join-leave-channels.html",
"messaging/managing-channels.html#adding-members-to-a-channel":
        "https://docs.mattermost.com/channels/manage-channel-members.html",
"messaging/managing-channels.html#removing-members-from-a-channel":
        "https://docs.mattermost.com/channels/manage-channel-members.html#remove-members-from-a-channel",
"messaging/managing-channels.html#naming-a-channel":
        "https://docs.mattermost.com/channels/rename-channels.html",
"messaging/managing-channels.html#leaving-a-channel":
        "https://docs.mattermost.com/channels/join-leave-channels.html#leave-a-channel",
"messaging/managing-channels.html#archiving-a-channel":
        "https://docs.mattermost.com/channels/archive-unarchive-channels.html",
"messaging/managing-channels.html#unarchiving-a-channel":
        "https://docs.mattermost.com/channels/archive-unarchive-channels.html#unarchive-a-channel",
"messaging/managing-channels.html#converting-public-channels-to-private-channels-and-vice-versa":
        "https://docs.mattermost.com/channels/convert-public-channels.html",
"messaging/managing-channels.html#favoriting-a-channel":
        "https://docs.mattermost.com/channels/favorite-channels.html",
"messaging/managing-channels.html#navigating-between-channels":
        "https://docs.mattermost.com/channels/find-channels.html",
"messaging/managing-channels.html#navigating-recently-viewed-channels":
        "https://docs.mattermost.com/channels/find-channels.html#revisit-recent-channels",
"messaging/managing-desktop-app-options.html":
        "https://docs.mattermost.com/welcome/customize-desktop-app-experience.html",
"messaging/managing-desktop-app-options.html#dark-theme":
        "https://docs.mattermost.com/welcome/customize-your-theme.html#dark-theme-desktop-app-only",
"messaging/managing-desktop-app-servers.html":
        "https://docs.mattermost.com/welcome/manage-desktop-app-server-connections.html",
"messaging/managing-members.html":
        "https://docs.mattermost.com/channels/manage-channel-members.html",
"messaging/managing-members.html#inviting-team-members":
        "https://docs.mattermost.com/welcome/about-teams.html#invite-people-to-teams",
"messaging/managing-members.html#user-roles":
        "https://docs.mattermost.com/welcome/about-user-roles.html",
"messaging/managing-members.html#removing-a-user-from-a-team-or-leaving-a-team":
        "https://docs.mattermost.com/welcome/about-teams.html#remove-people-from-teams",
"messaging/mentioning-teammates.html":
        "https://docs.mattermost.com/channels/mention-people.html",
"messaging/mentioning-teammates.html#mentions":
        "https://docs.mattermost.com/channels/mention-people.html",
"messaging/mentioning-teammates.html#username":
        "https://docs.mattermost.com/channels/mention-people.html#username",
"messaging/mentioning-teammates.html#channel-and-all":
        "https://docs.mattermost.com/channels/mention-people.html#channel-and-all",
"messaging/mentioning-teammates.html#here":
        "https://docs.mattermost.com/channels/mention-people.html#here",
"messaging/mentioning-teammates.html#groupname-beta":
        "https://docs.mattermost.com/channels/mention-people.html#groupname",
"messaging/mentioning-teammates.html#words-that-trigger-mentions":
        "https://docs.mattermost.com/channels/mention-people.html#words-that-trigger-mentions",
"messaging/mentioning-teammates.html#recent-mentions":
        "https://docs.mattermost.com/channels/mention-people.html#see-all-recent-mentions",
"messaging/mentioning-teammates.html#confirmation-dialog-warnings":
        "https://docs.mattermost.com/channels/mention-people.html#confirmation-dialog-warnings",
"messaging/mentioning-teammates.html#highlighting":
        "https://docs.mattermost.com/channels/mention-people.html#mention-highlights",
"messaging/messaging-basics.html": 
        "https://docs.mattermost.com/guides/channels.html#work-with-channels",
"messaging/navigating-between-teams.html":
        "https://docs.mattermost.com/welcome/about-teams.html#team-sidebar",
"messaging/navigating-mattermost.html":
        "https://docs.mattermost.com/guides/channels.html#keyboard-accessibility",
"messaging/organizing-channels.html":
        "https://docs.mattermost.com/channels/channel-naming-conventions.html",
"messaging/organizing-channels.html#the-importance-of-channel-names":
        "https://docs.mattermost.com/channels/channel-naming-conventions.html",
"messaging/organizing-channels.html#how-to-navigate-and-organize-channels":
        "https://docs.mattermost.com/channels/channel-naming-conventions.html#channel-naming-examples",
"messaging/organizing-channels.html#channel-naming-examples":
        "https://docs.mattermost.com/channels/channel-naming-conventions.html#channel-naming-examples",
"messaging/organizing-your-sidebar.html":
        "https://docs.mattermost.com/channels/customize-your-channel-sidebar.html",
"messaging/organizing-your-sidebar.html#channel-types":
        "https://docs.mattermost.com/channels/channel-types.html",
"messaging/organizing-your-sidebar.html#customizing-your-sidebar":
        "https://docs.mattermost.com/channels/customize-your-channel-sidebar.html#what-can-you-customize",
"messaging/organizing-your-sidebar.html#creating-custom-categories":
        "https://docs.mattermost.com/channels/customize-your-channel-sidebar.html##create-custom-categories",
"messaging/organizing-your-sidebar.html#organizing-channels-in-categories":
        "https://docs.mattermost.com/channels/customize-your-channel-sidebar.html#organize-channels-in-categories",
"messaging/organizing-your-sidebar.html#muting-and-unmuting-categories":
        "https://docs.mattermost.com/channels/customize-your-channel-sidebar.html#mute-and-unmute-categories",
"messaging/organizing-your-sidebar.html#sorting-channels-in-categories":
        "https://docs.mattermost.com/channels/customize-your-channel-sidebar.html#sort-channels-in-categories",
"messaging/organizing-your-sidebar.html#group-unread-channels-separately":      
        "https://docs.mattermost.com/channels/customize-your-channel-sidebar.html#group-unread-channels-separately",
"messaging/organizing-your-sidebar.html#managing-direct-messages":
        "https://docs.mattermost.com/channels/customize-your-channel-sidebar.html#manage-direct-messages",
"messaging/organizing-conversations.html":
        "https://docs.mattermost.com/channels/organize-conversations.html",
"messaging/organizing-conversations.html#enable-collapsed-reply-threads-beta":
        "https://docs.mattermost.com/channels/organize-conversations.html#enable-collapsed-reply-threads",
"messaging/organizing-conversations.html#known-issues":
        "https://docs.mattermost.com/channels/organize-conversations.html#known-issues",
"messaging/organizing-conversations.html#start-or-reply-to-threads":
        "https://docs.mattermost.com/channels/organize-conversations.html#start-or-reply-to-threads",
"messaging/organizing-conversations.html#follow-threads-and-messages":
        "https://docs.mattermost.com/channels/organize-conversations.html#follow-threads-and-messages",
"messaging/organizing-conversations.html#view-all-threads":
        "https://docs.mattermost.com/channels/organize-conversations.html#view-all-threads",
"messaging/organizing-conversations.html#tutorial-video":
        "https://docs.mattermost.com/channels/organize-conversations.html#tutorial-video",
"messaging/organizing-mattermost.html": 
        "https://docs.mattermost.com/channels/channel-naming-conventions.html",
"messaging/pinning-messages.html":
        "https://docs.mattermost.com/channels/save-pin-messages.html",
"messaging/pinning-messages.html#pin-a-message":
        "https://docs.mattermost.com/channels/save-pin-messages.html#pin-messages",
"messaging/pinning-messages.html#unpin-a-message":
        "https://docs.mattermost.com/channels/save-pin-messages.html#unpin-messages",
"messaging/saving-messages.html":
        "https://docs.mattermost.com/channels/save-pin-messages.html",
"messaging/saving-messages.html#saving-a-message":
        "https://docs.mattermost.com/save-pin-messages.html#save-messages",
"messaging/saving-messages.html#viewing-saved-messages":
        "https://docs.mattermost.com/channels/save-pin-messages.html#see-your-saved-messages",
"messaging/saving-messages.html#unsaving-messages":
        "https://docs.mattermost.com/channels/save-pin-messages.html#unsave-messages",
"messaging/searching-in-mattermost.html":
        "https://docs.mattermost.com/channels/search-for-messages.html",
"messaging/searching-in-mattermost.html#searching-for-message-contents":
        "https://docs.mattermost.com/channels/search-for-messages.html#search-for-message-contents",
"messaging/searching-in-mattermost.html#searching-for-file-contents":
        "https://docs.mattermost.com/channels/search-for-messages.html#search-for-file-contents",
"messaging/searching-in-mattermost.html#search-modifiers":
        "https://docs.mattermost.com/channels/search-for-messages.html#search-modifiers",
"messaging/searching-in-mattermost.html#hashtags":
        "https://docs.mattermost.com/channels/search-for-messages.html#hashtags",
"messaging/searching-in-mattermost.html#notes-about-all-searches":
        "https://docs.mattermost.com/channels/search-for-messages.html#notes-about-all-searches",
"messaging/searching-in-mattermost.html#technical-notes":
        "https://docs.mattermost.com/channels/search-for-messages.html#technical-notes-about-searching",
"messaging/sending-messages.html":
        "https://docs.mattermost.com/channels/send-messages.html",
"messaging/sending-receiving-messages.html":
        "https://docs.mattermost.com/channels/send-messages.html",
"messaging/sending-receiving-messages.html#send-a-message":
        "https://docs.mattermost.com/channels/send-messages.html",
"messaging/sending-receiving-messages.html#reply-to-messages":
        "https://docs.mattermost.com/channels/reply-to-messages.html",
"messaging/sending-receiving-messages.html#edit-or-delete-messages":
        "https://docs.mattermost.com/channels/send-messages.html#edit-or-delete-messages",
"messaging/sending-receiving-messages.html#mark-messages-as-unread":
        "https://docs.mattermost.com/channels/mark-messages-unread.html",
"messaging/setting-your-status-availability.html":
        "https://docs.mattermost.com/welcome/set-your-status-availability.html",
"messaging/setting-your-status-availability.html#setting-a-custom-status":
        "https://docs.mattermost.com/welcome/set-your-status-availability.html#set-a-custom-status",
"messaging/setting-your-status-availability.html#clearing-a-custom-status":
        "https://docs.mattermost.com/welcome/set-your-status-availability.html#clear-a-custom-status",
"messaging/setting-your-status-availability.html#setting-your-availability":
        "https://docs.mattermost.com/welcome/set-your-status-availability.html#setting-your-availability",
"messaging/setting-your-status-availability.html#setting-do-not-disturb":
        "https://docs.mattermost.com/welcome/set-your-status-availability.html#set-your-status-as-do-not-disturb",
"messaging/sharing-messages.html":
        "https://docs.mattermost.com/channels/share-links.html",
"messaging/sharing-files.html":
        "https://docs.mattermost.com/channels/share-files-in-messages.html",
"messaging/sharing-files.html#attach-files-to-messages":
        "https://docs.mattermost.com/channels/share-files-in-messages.html",
"messaging/sharing-files.html#preview-file-attachments":
        "https://docs.mattermost.com/channels/share-files-in-messages.html#preview-file-attachments",
"messaging/sharing-files.html#attachment-limits-and-sizes":
        "https://docs.mattermost.com/channels/share-files-in-messages.html#attachment-limits-and-sizes",
"messaging/signing-in.html":
        "https://docs.mattermost.com/welcome/sign-in.html",
"messaging/signing-in.html#email-address-or-username-sign-in":
        "https://docs.mattermost.com/welcome/sign-in.html#email-address-or-username",
"messaging/signing-in.html#single-sign-on":
        "https://docs.mattermost.com/welcome/sign-in.html#single-sign-on-sso",
"messaging/switching-between-teams.html": 
	"https://docs.mattermost.com/welcome/about-teams.html#team-sidebar",
"messaging/team-settings.html":
        "https://docs.mattermost.com/welcome/team-settings.html",
"messaging/team-settings.html#general":
        "https://docs.mattermost.com/welcome/team-settings.html#general",
"messaging/team-settings.html#import":
        "https://docs.mattermost.com/welcome/team-settings.html#import",
"messaging/using-emoji.html":
        "https://docs.mattermost.com/channels/react-to-messages.html",
"messaging/using-emojis.html":
        "https://docs.mattermost.com/channels/react-to-messages.html#",
"messaging/using-emoji.html#adding-emojis-to-messages":
        "https://docs.mattermost.com/channels/react-to-messages.html",
"messaging/using-emoji.html#selecting-recent-emojis":
        "https://docs.mattermost.com/channels/react-to-messages.html#select-recent-emojis",
"messaging/using-emoji.html#typing-an-emoji":
        "https://docs.mattermost.com/channels/react-to-messages.html#",
"messaging/using-emoji.html#creating-custom-emojis":
        "https://docs.mattermost.com/channels/react-to-messages.html#upload-custom-emojis",
"messaging/welcome-to-mattermost-channels.html":
        "https://docs.mattermost.com/guides/channels.html",
"messaging/welcome-to-mattermost-messaging.html": 
	"https://docs.mattermost.com/guides/channels.html",

# Mobile redirects
"mobile/deploy-mobile-apps-using-emm-provider.html": 
	"https://docs.mattermost.com/deploy/deploy-mobile-apps-using-emm-provider.html",
"mobile/mobile-appstore-install.html":
        "https://docs.mattermost.com/deploy/use-prebuilt-mobile-apps.html",
"mobile/mobile-blackberry.html":
        "https://docs.mattermost.com/deploy/deploy-mobile-apps-using-emm-provider.html",
"mobile/mobile-compile yourself.html":
        "https://docs.mattermost.com/deploy/build-custom-mobile-apps.html",
"mobile/mobile-faq#how-do-push-notifications-work.html":
        "https://docs.mattermost.com/deploy/mobile-faq.html#how-do-push-notifications-work",
"mobile/mobile-hpns.html": 
	"https://docs.mattermost.com/deploy/mobile-hpns.html",
"mobile/mobile-mobileiron.html":
        "https://docs.mattermost.com/deploy/build-custom-mobile-apps.html",
"mobile/mobile-overview.html": 
	"https://docs.mattermost.com/deploy/mobile-overview.html",
"mobile/mobile-overview.html#use-an-emm-provider-with-managed-app-configuration":
        "https://docs.mattermost.com/deploy/deploy-mobile-apps-using-emm-provider.html",
"mobile/mobile-testing-notifications.html": 
	"https://docs.mattermost.com/deploy/mobile-testing-notifications.html",

# Onboard redirects
"onboard/ad-ldap.html#active-directory-ldap-setup-e10-e20": 
        "https://docs.mattermost.com/onboard/ad-ldap.html#active-directory-ldap-setup",
"onboard/migrating-from-hipchat-to-mattermost.html":
        "https://docs.mattermost.com/onboard/migrating-to-mattermost.html#migrating-from-slack",

# Overview redirects
"overview/architecture.html": 
        "https://docs.mattermost.com/getting-started/architecture-overview.html",
"overview/architecture#database-with-vips.html":
        "https://docs.mattermost.com/getting-started/architecture-overview.html#database-with-vips",
"overview/architecture#reference-architectures.html":
        "https://docs.mattermost.com/getting-started/architecture-overview.html#reference-architectures",
"overview/auth.html": 
        "https://docs.mattermost.com/about/corporate-directory-integration.html",
"overview/authentication.html":
        "https://docs.mattermost.com/onboard/multi-factor-authentication.html",
"overview/compliance.html": 
        "https://docs.mattermost.com/about/certifications-and-compliance.html",
"overview/faq.html": 
        "https://docs.mattermost.com/about/frequently-asked-questions.html",
"overview/integrations.html": 
        "https://docs.mattermost.com/about/integrations.html",
"overview/license-and-subscription.html": 
        "https://docs.mattermost.com/about/subscription.html",
"overview/license-and-subscription.html#frequently-asked-questions": 
        "https://docs.mattermost.com/about/subscription.html#frequently-asked-questions",
"overview/product.html": 
	"https://docs.mattermost.com/about/product.html",
"overview/product#mattermost-enterprise-edition-e10.html": 
        "https://docs.mattermost.com/about/product.html#mattermost-enterprise-edition",
"overview/security.html": 
        "https://docs.mattermost.com/about/security.html",

# Playbooks redirects
"playbooks/getting-started.html":
	"https://docs.mattermost.com/playbooks/overview.html",
"playbooks/navigating-mattermost-playbooks.html":
        "https://docs.mattermost.com/welcome/what-changed-in-v60.html",
"playbooks/setting-up-playbooks.html":
	"https://docs.mattermost.com/playbooks/customize-a-playbook.html",
"playbooks/running-playbooks.html":
	"https://docs.mattermost.com/playbooks/customize-a-playbook.html",
"playbooks/refining-and-improving.html":
	"https://docs.mattermost.com/playbooks/metrics-and-goals.html",
	
# Process redirects
# The process directory and its contents have been archived in FY23 Q2 and all applicable content has been moved from docs.mm.com to handbook.mm.com.
"process/accepting-pull-request.html":
        "https://handbook.mattermost.com/contributors/contributors/help-wanted",
"process/accepting-pull-requests.html":
        "https://handbook.mattermost.com/contributors/contributors/help-wanted",
"process/asset-guidelines.html":
        "https://handbook.mattermost.com/operations/messaging-and-math",
"process/BEFORE-YOU-GET-STARTED.html":
        "https://github.com/mattermost/mattermost-handbook",
"process/benefits-canada.html":
        "https://handbook.mattermost.com/operations/workplace/people#key-channels-and-resources",
"process/benefits-us.html":
        "https://handbook.mattermost.com/operations/workplace/people#key-channels-and-resources",
"process/bug-fix-release.html":
        "https://handbook.mattermost.com/operations/research-and-development/product/release-process/bug-fix-release",
"process/bug-severity-guidelines.html":
        "https://handbook.mattermost.com/operations/research-and-development/product/development-process/new-bug-tickets/bug-severity-guidelines",
"process/casestudy.html":
        "https://handbook.mattermost.com/operations/messaging-and-math/how-to-guides-for-m-and-m/how-to-write-mattermost-case-studies",
"process/community-guidelines.html":
        "https://handbook.mattermost.com/contributors/contributors/community-playbook/",
"process/community-overview.html": 
	"https://handbook.mattermost.com/contributors/contributors/community",
"process/community-process.html":
        "https://handbook.mattermost.com/contributors/contributors/community",
"process/community-systems.html":
        "https://handbook.mattermost.com/contributors/contributors",
"process/deprecated-features.html":
        "https://handbook.mattermost.com/operations/research-and-development/product/development-process/deprecated-features",
"process/developer.html":
	"https://handbook.mattermost.com",
"process/design-process.html":
        "https://handbook.mattermost.com/operations/research-and-development/product/product-design-team-handbook#overview",
"process/documentation-guidelines.html":
        "https://handbook.mattermost.com/operations/operations/publishing/publishing-guidelines/voice-tone-and-writing-style-guidelines/documentation-style-guide",
"process/documentation-UItext-guidelines.html":
        "https://handbook.mattermost.com/operations/research-and-development/product/development-process/user-interface-text-guidelines",
"process/dot-release.html":
        "https://handbook.mattermost.com/operations/research-and-development/product/release-process/dot-release",
"process/end-user-documentation.html":
        "https://handbook.mattermost.com/operations/operations/company-processes/publishing/publishing-guidelines/voice-tone-and-writing-style-guidelines/documentation-style-guide#document-structure",
"process/engineer-expectations.html":
        "https://handbook.mattermost.com/operations/workplace/people/working-at-mattermost/onboarding/engineer-onboarding",
"process/feature-release.html":
        "https://handbook.mattermost.com/operations/research-and-development/product/release-process/feature-release",
"process/guest-article.html":
        "https://handbook.mattermost.com/operations/messaging-and-math/how-to-guides-for-m-and-m/how-to-write-guest-blog-posts-for-mattermost-apps-and-services",
"process/handbook.html": 
	"https://handbook.mattermost.com/company/about-mattermost",
"process/help-wanted.html": 
	"https://handbook.mattermost.com/contributors/contributors/ways-to-contribute/help-wanted",
"process/how-to-run-a-hackaton.html":
        "https://handbook.mattermost.com/contributors/contributors/how-to-run-a-hackathon",
"process/integrations-directory.html":
        "https://handbook.mattermost.com/operations/research-and-development/product/how-to-guides-for-product/integrations-directory",
"process/marketing-guidelines.html":
        "https://handbook.mattermost.com/operations/messaging-and-math",
"process/mobile-release-process.html":
        "https://handbook.mattermost.com/operations/research-and-development/product/release-process/mobile-release",
"process/new-bug-tickets.html":
        "https://handbook.mattermost.com/operations/research-and-development/product/development-process/new-bug-tickets",
"process/overview.html":
        "https://handbook.mattermost.com/operations/research-and-development/product/development-process",
"process/partner-programs.html":
        "https://handbook.mattermost.com/operations/sales/partner-programs",
"process/people-ops.html":
        "https://handbook.mattermost.com/operations/workplace/people",
"process/pm-faq.html":
        "https://handbook.mattermost.com/operations/research-and-development/product/product-management-team-handbook#frequently-asked-questions-faq",
"process/product-manager.html":
        "https://handbook.mattermost.com/contributors/join-us/staff-recruiting/product-manager-hiring",
"process/product-manager-hiring.html":
        "https://handbook.mattermost.com/contributors/join-us/recruiting-cadences/product-manager-hiring",
"process/release-faq.html":
        "https://handbook.mattermost.com/operations/research-and-development/product/release-process/release-overview",
"process/release-process.html":
        "https://handbook.mattermost.com/operations/research-and-development/product/release-process/feature-release",
"process/release-scorecard-definitions.html":
        "https://handbook.mattermost.com/operations/research-and-development/product/release-process/release-scorecard-definitions",
"process/release-tips.html":
        "https://handbook.mattermost.com/operations/research-and-development/product/release-process/release-tips",
"process/security.html": 
	"https://handbook.mattermost.com/operations/operations/company-policies/security-policies",
"process/security-release.html":
        "https://handbook.mattermost.com/operations/research-and-development/product/release-process/security-release",
"process/sg_document-structure.html":
        "https://handbook.mattermost.com/operations/operations/company-processes/publishing/publishing-guidelines/voice-tone-and-writing-style-guidelines/documentation-style-guide#document-structure",
"process/sg_general-guidelines.html":
        "https://handbook.mattermost.com/operations/operations/company-processes/publishing/publishing-guidelines/voice-tone-and-writing-style-guidelines/documentation-style-guide#document-structure",
"process/sg_grammar-spelling-mechanics.html":
        "https://handbook.mattermost.com/operations/operations/company-processes/publishing/publishing-guidelines/voice-tone-and-writing-style-guidelines/documentation-style-guide#document-structure",
"process/sg_rest_markup.html":
        "https://handbook.mattermost.com/operations/operations/company-processes/publishing/publishing-guidelines/voice-tone-and-writing-style-guidelines/documentation-style-guide#document-structure",
"process/software-requirements.html":
        "https://handbook.mattermost.com/operations/research-and-development/product/development-process/software-requirements",
"process/training.html":
        "https://handbook.mattermost.com",
"process/working-at-mattermost.html":
	"https://handbook.mattermost.com/operations/workplace/people/working-at-mattermost/onboarding/engineer-onboarding",

# Upgrade redirects
"upgrade/upgrading-mattermost-server.html#prepare-to-upgrade-to-the-latest-version":
        "https://docs.mattermost.com/upgrade/prepare-to-upgrade-mattermost.html",
"upgrade/upgrading-mattermost-server.html#upgrade-to-mattermost-v7-0":
        "https://docs.mattermost.com/upgrade/prepare-to-upgrade-mattermost.html#upgrade-to-mattermost-v7-0",
"upgrade/upgrading-mattermost-server.html#upgrade-to-mattermost-v6-7":
        "https://docs.mattermost.com/upgrade/prepare-to-upgrade-mattermost.html#upgrade-to-mattermost-v6-7",
"upgrade/upgrading-mattermost-server.html#upgrade-to-mattermost-v6-0":
        "https://docs.mattermost.com/upgrade/prepare-to-upgrade-mattermost.html#upgrade-to-mattermost-v6-0",
"upgrade/upgrading-mattermost-server.html#v6-0-database-schema-migrations":
        "https://docs.mattermost.com/upgrade/prepare-to-upgrade-mattermost.html#v6-0-database-schema-migrations",
"upgrade/upgrading-mattermost-server.html#upgrade-from-releases-older-than-v5-35":
        "https://docs.mattermost.com/upgrade/prepare-to-upgrade-mattermost.html#upgrade-from-releases-older-than-v5-35",
"upgrade/upgrading-mattermost-server.html#upgrade-high-availability-deployments":
        "https://docs.mattermost.com/upgrade/prepare-to-upgrade-mattermost.html#upgrade-high-availability-deployments"

# End of redirects. The last redirect above should NOT end in a comma.

}

# The master toctree document.
master_doc = "index"

# General information about the project.
project = "Mattermost"
copyright = "2015-2022 Mattermost"
author = "Mattermost"

# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
# version = '7.2'
# The full version, including alpha/beta/rc tags.
# release = '7.2'

# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = None

# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
# today = ''
# Else, today_fmt is used as the format for a strftime call.
# today_fmt = '%B %d, %Y'

# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
exclude_patterns = ["archive/*", "process/*"]

# The reST default role (used for this markup: `text`) to use for all
# documents.
# default_role = None

# If true, '()' will be appended to :func: etc. cross-reference text.
# add_function_parentheses = True

# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
# add_module_names = True

# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
# show_authors = False

# The name of the Pygments (syntax highlighting) style to use.
pygments_style = "sphinx"

# A list of ignored prefixes for module index sorting.
# modindex_common_prefix = []

# If true, keep warnings as "system message" paragraphs in the built documents.
# keep_warnings = False

# If true, `todo` and `todoList` produce output, else they produce nothing.
todo_include_todos = False

# -- Options for HTML output ----------------------------------------------

html_baseurl = "https://docs.mattermost.com/"

# Global variables available to all templates
html_context = {
    # Enable google analytics
    "googleanalytics_id": "UA-67846571-2",
    "googleanalytics_enabled": True,
    # Enable the "Edit in GitHub link within the header of each page.
    "display_github": True,
    # Set the following variables to generate the resulting github URL for each page. Format Template:
    # https://{{github_host|default("github.com") }}/{{ github_user }}/{{ github_repo }}/blob/{{ github_version }}{{conf_py_path }}{{ pagename }}{{ suffix }}
    "github_user": "mattermost",
    "github_repo": "docs",
    "github_version": "master/source/",
}

# The theme to use for HTML and HTML Help pages.  See the documentation for
# a list of builtin themes.
html_theme = "sphinx_rtd_theme"

# Theme options are theme-specific and customize the look and feel of a theme
# further.  For a list of options available for each theme, see the
# documentation.
html_theme_options = {
    "collapse_navigation": False,
    "sticky_navigation": True,
    "navigation_depth": 3,
    "includehidden": True,
    "titles_only": False,
}

html_permalinks_icon = " "

# Add any paths that contain custom themes here, relative to this directory.
# html_theme_path = []

# The name for this set of Sphinx documents.  If None, it defaults to
# "<project> v<release> documentation".
# html_title = None

# A shorter title for the navigation bar.  Default is the same as html_title.
# html_short_title = None

# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
# html_logo = None

# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ["_static"]

# A list of CSS files. The entry must be a filename string or a tuple containing the filename string and the attributes
# dictionary. The filename must be relative to the html_static_path, or a full URI with scheme like
# https://example.org/style.css. The attributes is used for attributes of <link> tag. It defaults to an empty list.
html_css_files = ["mytheme.css"]

# A list of JavaScript filenames. The entry must be a filename string or a tuple containing the filename string and the
# attributes dictionary. The filename must be relative to the html_static_path, or a full URI with scheme like
# https://example.org/script.js. The attributes is used for attributes of <script> tag. It defaults to an empty list.
html_js_files = ["myscript.js"]

# The name of an image file, relative to the configuration directory, to use as favicon of the docs.  This file should
# be a Windows icon file (.ico) being 16x16 or 32x32 pixels in size.
html_favicon = "_static/favicon.ico"

# Add any extra paths that contain custom files (such as robots.txt or
# .htaccess) here, relative to this directory. These files are copied
# directly to the root of the documentation.
html_extra_path = ["_static/robots.txt"]

# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
# html_last_updated_fmt = '%b %d, %Y'

# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
# html_use_smartypants = True

# Custom sidebar templates, maps document names to template names.
# html_sidebars = {}

# Additional templates that should be rendered to pages, maps page names to
# template names.
html_additional_pages = {
    'index': 'index.html',
    '404': '404.html'
}

# If false, no module index is generated.
# html_domain_indices = True

# If false, no index is generated.
html_use_index = False

# If true, the index is split into individual pages for each letter.
# html_split_index = False

# If true, links to the reST sources are added to the pages.
# html_show_sourcelink = True

# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
# html_show_sphinx = True

# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
# html_show_copyright = True

# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it.  The value of this option must be the
# base URL from which the finished HTML is served.
# html_use_opensearch = ''

# This is the file name suffix for HTML files (e.g. ".xhtml").
# html_file_suffix = None

# Language to be used for generating the HTML full-text search index.
# Sphinx supports the following languages:
#   'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja'
#   'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr'
# html_search_language = 'en'

# A dictionary with options for the search language support, empty by default.
# Now only 'ja' uses this config value
# html_search_options = {'type': 'default'}

# The name of a javascript file (relative to the configuration directory) that
# implements a search results scorer. If empty, the default will be used.
# html_search_scorer = 'scorer.js'

# Output file base name for HTML help builder.

htmlhelp_basename = 'Mattermostdoc'

# linkcheck settings
linkcheck_ignore = [
    # Ignore localhost
    'http://localhost',
    'http://127.0.0.1',
    # Ignore anchors on github.com because linkcheck fails on them
    'https://github.com',
    # Ignore azuremarketplace because of no server response
    'https://azuremarketplace.microsoft.com/.*',
]
linkcheck_timeout = 5
linkcheck_rate_limit_timeout = 1.0
linkcheck_anchors = False

# Variables 
# rst_epilog = """
# .. |mm_badge_version| replace:: 7.2
# .. _mm_badge_version: https://mattermost.com/blog/mattermost-v7-2-is-now-available/
# """

make.bat METASEP
@ECHO OFF

pushd %~dp0

REM Command file for Sphinx documentation

if "%SPHINXBUILD%" == "" (
	set SPHINXBUILD=pipenv run sphinx-build
)
if "%SPHINXAUTOBUILD%" == "" (
	set SPHINXAUTOBUILD=pipenv run sphinx-autobuild
)
set SOURCEDIR=source
set BUILDDIR=build
set WARNINGSFILE=%BUILDDIR%/warnings.log
set ERRORSFILE=%BUILDDIR%/errors.log
if not "%SPHINXOPTS%" == "" (
    set SPHINXOPTS=-j auto -w %WARNINGSFILE%
)

if "%1" == "" goto help

%SPHINXBUILD% >NUL 2>NUL
if errorlevel 9009 (
	echo.
	echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
	echo.installed, then set the SPHINXBUILD environment variable to point
	echo.to the full path of the 'sphinx-build' executable. Alternatively you
	echo.may add the Sphinx directory to PATH.
	echo.
	echo.If you don't have Sphinx installed, grab it from
	echo.http://sphinx-doc.org/
	exit /b 1
)

md %BUILDDIR%
%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% 2>%ERRORSFILE%
goto end

:livehtml
md %BUILDDIR%
%SPHINXAUTOBUILD% %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
goto end

:help
%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%

:end
popd

README.md METASEP
# Mattermost Documentation

This repository generates the documentation available at https://docs.mattermost.com/. All documentation is available under the terms of a [Creative Commons License](https://creativecommons.org/licenses/by-nc-sa/3.0/).

If you have any questions, create an account on the [Mattermost Community server](https://community.mattermost.com/signup_user_complete/?id=f1924a8db44ff3bb41c96424cdc20676), then join the writing team in the [Documentation Working Group](https://community.mattermost.com/core/channels/dwg-documentation-working-group) channel. We look forward to working with you!

# Table of Contents

 * [Contributing](#contributing)
     * [Get started](#get-started)
     * [Edit content directly on GitHub](#edit-content-directly-on-github)
     * [Create documentation PRs](#create-documentation-pull-requests)
     * [Use GitHub PR Labels](#use-github-pr-labels)
     * [Comment on Pull Requests](#comment-on-pull-requests)
     * [Review Pull Requests](#review-pull-requests)
 * [Build Mattermost product documentation locally](#build-locally)

## Contribute to Mattermost product documentation

### Get started

You can edit or create Mattermost documentation directly in GitHub, or by downloading the `mattermost/docs` repository onto your machine and using an IDE such as VS Code. Consult the Mattermost [Documentation Style Guide](https://handbook.mattermost.com/operations/operations/company-processes/publishing/publishing-guidelines/voice-tone-and-writing-style-guidelines/documentation-style-guide) and [reStructuredText Markup](https://handbook.mattermost.com/operations/operations/company-processes/publishing/publishing-guidelines/voice-tone-and-writing-style-guidelines/documentation-style-guide#using-restructuredtext-markup-rst) section for stylistic and technical guidance.

If this is your first time contributing to Mattermost, first read and sign the [Mattermost Contributor Agreement](https://mattermost.com/mattermost-contributor-agreement/), so you can be added to the Mattermost [Approved Contributor List](https://docs.google.com/spreadsheets/d/1NTCeG-iL_VS9bFqtmHSfwETo5f-8MQ7oMDE5IUYJi_Y/pubhtml?gid=0&single=true).

### Edit content directly on GitHub

The quickest way to begin is editing directly on GitHub on your fork of the Mattermost docs repo. Select the **Edit** icon on the top right corner of the page you want to edit in the Mattermost documentation.

If this is the first time you're contributing, follow these steps: 
1. Select **Fork** in the top-right corner of the GitHub repository page to fork the current repository.
2. Navigate to file you want to edit, then select the Pencil icon (**Edit the file**) to open the editing interface.

### Create Documentation pull requests

1. When you're ready to submit your changes, add a descriptive title and comments to summarize the changes made.
2. Select **Create a new branch for this commit and start a pull request**.
3. Check the **Propose file change** button.
4. Scroll down to compare changes with the original document.
5. Select **Create pull request**. 

### Use GitHub PR labels

GitHub PR labels are used to track the lifecycle and status of a pull request. Using the correct labels helps with managing workflows and ensuring that content is edited, merged and released at the correct time. For example, PRs that include an **Editor Review** label will be processed by an editor on the writing team to ensure the documentation is correctly formatted at https://docs.mattermost.com/ based on guidelines outlined in the style guide.

Take a look at the [Labels](https://developers.mattermost.com/contribute/getting-started/labels/) page for information about how and when to use which labels.

### Comment on pull requests

Once a pull request is submitted, multiple committers may comment on it and provide edits or suggestions which you can commit directly. You can also add line comments. Take a look at [Commenting on pull requests](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/commenting-on-a-pull-request) for more details.

### Review pull requests

Once a pull request has been submitted and the correct label assigned, the review process begins. This includes aligning the content with the Style Guide, validating processes, and tagging any other relevant committers. Read more about the review process and expectations [in the Mattermost Developer documentation](https://developers.mattermost.com/contribute/getting-started/code-review/). 

Once the review process is complete, and depending on the type of issue it is (e.g., a typo fix vs. a new feature), the change is either merged into master and pushed immediately or merged into the release branch and pushed in alignment with a future release. The branch is then deleted. 

## Build locally

If you've downloaded the `mattermost/docs` repository and are editing Mattermost documentation on your local machine, you can generate the HTML files from markdown in the `/source` directory. You can review your changes before you commit them or create pull requests.

**Note:** Terminal commands can be executed on Linux, Mac, and Windows (using Powershell).

1. Open a terminal window, then clone a forked copy of the documentation repository:
    ```sh
    git clone https://github.com/mattermost/docs.git
    ```

2. In the terminal window, navigate into the cloned repository:
    ```sh
    cd docs
    ```

3. Install [pipenv](https://docs.pipenv.org/) by using one of the following commands based on your operating system:

    For Mac users where Homebrew is installed:
    ```sh
    brew install pipenv  
    ```

    For other operating systems:
    ```python
    pip install pipenv 
    ```

4. Install required Python packages:
    ```python
    pipenv install
    ```

5. Build the documentation set. You have three build commands available at the terminal:

    - Use `make html` to generate HTML files in the `/build` directory. Only file you've modified are re-built.
    - Use `make clean html` to delete all static HTML output in the `/build` directory and re-build all files. This command is particularly useful when you're making changes to the LHS navigation pane and want to ensure you're not reviewing cached results.
    - Use `make livehtml` to review a live preview published to `http://127.0.0.1:8000` that automatically updates as new changes are saved in your local IDE.

8. When working with static build results, navigate to the `/build` directory:
    ```sh
    cd /build
    ```
9. Then, preview your changes by opening the `/source/html/index.html` file.

Build errors are written to the `/build/warning.log`. 

Pipfile.lock METASEP
{
    "_meta": {
        "hash": {
            "sha256": "580f4999343cc418edecac5b9c8f8cf0b25d86159a93f74ca53b5d65f1eb74cc"
        },
        "pipfile-spec": 6,
        "requires": {},
        "sources": [
            {
                "name": "pypi",
                "url": "https://pypi.python.org/simple",
                "verify_ssl": true
            }
        ]
    },
    "default": {
        "alabaster": {
            "hashes": [
                "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359",
                "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"
            ],
            "version": "==0.7.12"
        },
        "attrs": {
            "hashes": [
                "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4",
                "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"
            ],
            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
            "version": "==21.4.0"
        },
        "babel": {
            "hashes": [
                "sha256:3f349e85ad3154559ac4930c3918247d319f21910d5ce4b25d439ed8693b98d2",
                "sha256:98aeaca086133efb3e1e2aad0396987490c8425929ddbcfe0550184fdc54cd13"
            ],
            "markers": "python_version >= '3.6'",
            "version": "==2.10.1"
        },
        "certifi": {
            "hashes": [
                "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872",
                "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"
            ],
            "version": "==2021.10.8"
        },
        "charset-normalizer": {
            "hashes": [
                "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597",
                "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"
            ],
            "markers": "python_version >= '3'",
            "version": "==2.0.12"
        },
        "colorama": {
            "hashes": [
                "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b",
                "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"
            ],
            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
            "version": "==0.4.4"
        },
        "docutils": {
            "hashes": [
                "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af",
                "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"
            ],
            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
            "version": "==0.16"
        },
        "idna": {
            "hashes": [
                "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff",
                "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"
            ],
            "markers": "python_version >= '3'",
            "version": "==3.3"
        },
        "imagesize": {
            "hashes": [
                "sha256:1db2f82529e53c3e929e8926a1fa9235aa82d0bd0c580359c67ec31b2fddaa8c",
                "sha256:cd1750d452385ca327479d45b64d9c7729ecf0b3969a58148298c77092261f9d"
            ],
            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
            "version": "==1.3.0"
        },
        "importlib-metadata": {
            "hashes": [
                "sha256:1208431ca90a8cca1a6b8af391bb53c1a2db74e5d1cef6ddced95d4b2062edc6",
                "sha256:ea4c597ebf37142f827b8f39299579e31685c31d3a438b59f469406afd0f2539"
            ],
            "markers": "python_version < '3.10'",
            "version": "==4.11.3"
        },
        "jinja2": {
            "hashes": [
                "sha256:539835f51a74a69f41b848a9645dbdc35b4f20a3b601e2d9a7e22947b15ff119",
                "sha256:640bed4bb501cbd17194b3cace1dc2126f5b619cf068a726b98192a0fde74ae9"
            ],
            "markers": "python_version >= '3.7'",
            "version": "==3.1.1"
        },
        "livereload": {
            "hashes": [
                "sha256:776f2f865e59fde56490a56bcc6773b6917366bce0c267c60ee8aaf1a0959869"
            ],
            "version": "==2.6.3"
        },
        "markdown-it-py": {
            "hashes": [
                "sha256:36be6bb3ad987bfdb839f5ba78ddf094552ca38ccbd784ae4f74a4e1419fc6e3",
                "sha256:98080fc0bc34c4f2bcf0846a096a9429acbd9d5d8e67ed34026c03c61c464389"
            ],
            "markers": "python_version ~= '3.6'",
            "version": "==1.1.0"
        },
        "markupsafe": {
            "hashes": [
                "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003",
                "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88",
                "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5",
                "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7",
                "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a",
                "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603",
                "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1",
                "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135",
                "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247",
                "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6",
                "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601",
                "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77",
                "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02",
                "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e",
                "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63",
                "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f",
                "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980",
                "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b",
                "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812",
                "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff",
                "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96",
                "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1",
                "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925",
                "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a",
                "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6",
                "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e",
                "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f",
                "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4",
                "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f",
                "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3",
                "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c",
                "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a",
                "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417",
                "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a",
                "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a",
                "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37",
                "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452",
                "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933",
                "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a",
                "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"
            ],
            "markers": "python_version >= '3.7'",
            "version": "==2.1.1"
        },
        "mdit-py-plugins": {
            "hashes": [
                "sha256:1833bf738e038e35d89cb3a07eb0d227ed647ce7dd357579b65343740c6d249c",
                "sha256:5991cef645502e80a5388ec4fc20885d2313d4871e8b8e320ca2de14ac0c015f"
            ],
            "markers": "python_version ~= '3.6'",
            "version": "==0.2.8"
        },
        "myst-parser": {
            "hashes": [
                "sha256:7c3c78a36c4bc30ce6a67933ebd800a880c8d81f1688fad5c2ebd82cddbc1603",
                "sha256:e8baa9959dac0bcf0f3ea5fc32a1a28792959471d8a8094e3ed5ee0de9733ade"
            ],
            "index": "pypi",
            "version": "==0.15.1"
        },
        "packaging": {
            "hashes": [
                "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb",
                "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"
            ],
            "markers": "python_version >= '3.6'",
            "version": "==21.3"
        },
        "pygments": {
            "hashes": [
                "sha256:44238f1b60a76d78fc8ca0528ee429702aae011c265fe6a8dd8b63049ae41c65",
                "sha256:4e426f72023d88d03b2fa258de560726ce890ff3b630f88c21cbb8b2503b8c6a"
            ],
            "markers": "python_version >= '3.5'",
            "version": "==2.11.2"
        },
        "pyparsing": {
            "hashes": [
                "sha256:7bf433498c016c4314268d95df76c81b842a4cb2b276fa3312cfb1e1d85f6954",
                "sha256:ef7b523f6356f763771559412c0d7134753f037822dad1b16945b7b846f7ad06"
            ],
            "markers": "python_full_version >= '3.6.8'",
            "version": "==3.0.8"
        },
        "pytz": {
            "hashes": [
                "sha256:1e760e2fe6a8163bc0b3d9a19c4f84342afa0a2affebfaa84b01b978a02ecaa7",
                "sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c"
            ],
            "version": "==2022.1"
        },
        "pyyaml": {
            "hashes": [
                "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293",
                "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b",
                "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57",
                "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b",
                "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4",
                "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07",
                "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba",
                "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9",
                "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287",
                "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513",
                "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0",
                "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0",
                "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92",
                "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f",
                "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2",
                "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc",
                "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c",
                "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86",
                "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4",
                "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c",
                "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34",
                "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b",
                "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c",
                "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb",
                "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737",
                "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3",
                "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d",
                "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53",
                "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78",
                "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803",
                "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a",
                "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174",
                "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"
            ],
            "markers": "python_version >= '3.6'",
            "version": "==6.0"
        },
        "requests": {
            "hashes": [
                "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61",
                "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"
            ],
            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'",
            "version": "==2.27.1"
        },
        "six": {
            "hashes": [
                "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926",
                "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"
            ],
            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
            "version": "==1.16.0"
        },
        "snowballstemmer": {
            "hashes": [
                "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1",
                "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"
            ],
            "version": "==2.2.0"
        },
        "sphinx": {
            "hashes": [
                "sha256:5da895959511473857b6d0200f56865ed62c31e8f82dd338063b84ec022701fe",
                "sha256:6caad9786055cb1fa22b4a365c1775816b876f91966481765d7d50e9f0dd35cc"
            ],
            "index": "pypi",
            "version": "==4.4.0"
        },
        "sphinx-autobuild": {
            "hashes": [
                "sha256:8fe8cbfdb75db04475232f05187c776f46f6e9e04cacf1e49ce81bdac649ccac",
                "sha256:de1ca3b66e271d2b5b5140c35034c89e47f263f2cd5db302c9217065f7443f05"
            ],
            "index": "pypi",
            "version": "==2021.3.14"
        },
        "sphinx-copybutton": {
            "hashes": [
                "sha256:9684dec7434bd73f0eea58dda93f9bb879d24bff2d8b187b1f2ec08dfe7b5f48",
                "sha256:a0c059daadd03c27ba750da534a92a63e7a36a7736dcf684f26ee346199787f6"
            ],
            "index": "pypi",
            "version": "==0.5.0"
        },
        "sphinx-rtd-theme": {
            "hashes": [
                "sha256:32bd3b5d13dc8186d7a42fc816a23d32e83a4827d7d9882948e7b837c232da5a",
                "sha256:4a05bdbe8b1446d77a01e20a23ebc6777c74f43237035e76be89699308987d6f"
            ],
            "index": "pypi",
            "version": "==0.5.2"
        },
        "sphinx-tabs": {
            "hashes": [
                "sha256:1e1b1846c80137bd81a78e4a69b02664b98b1e1da361beb30600b939dfc75065",
                "sha256:33137914ed9b276e6a686d7a337310ee77b1dae316fdcbce60476913a152e0a4"
            ],
            "index": "pypi",
            "version": "==3.2.0"
        },
        "sphinxcontrib-applehelp": {
            "hashes": [
                "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a",
                "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"
            ],
            "markers": "python_version >= '3.5'",
            "version": "==1.0.2"
        },
        "sphinxcontrib-devhelp": {
            "hashes": [
                "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e",
                "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"
            ],
            "markers": "python_version >= '3.5'",
            "version": "==1.0.2"
        },
        "sphinxcontrib-htmlhelp": {
            "hashes": [
                "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07",
                "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"
            ],
            "markers": "python_version >= '3.6'",
            "version": "==2.0.0"
        },
        "sphinxcontrib-jsmath": {
            "hashes": [
                "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178",
                "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"
            ],
            "markers": "python_version >= '3.5'",
            "version": "==1.0.1"
        },
        "sphinxcontrib-qthelp": {
            "hashes": [
                "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72",
                "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"
            ],
            "markers": "python_version >= '3.5'",
            "version": "==1.0.3"
        },
        "sphinxcontrib-serializinghtml": {
            "hashes": [
                "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd",
                "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"
            ],
            "markers": "python_version >= '3.5'",
            "version": "==1.1.5"
        },
        "tornado": {
            "hashes": [
                "sha256:0a00ff4561e2929a2c37ce706cb8233b7907e0cdc22eab98888aca5dd3775feb",
                "sha256:0d321a39c36e5f2c4ff12b4ed58d41390460f798422c4504e09eb5678e09998c",
                "sha256:1e8225a1070cd8eec59a996c43229fe8f95689cb16e552d130b9793cb570a288",
                "sha256:20241b3cb4f425e971cb0a8e4ffc9b0a861530ae3c52f2b0434e6c1b57e9fd95",
                "sha256:25ad220258349a12ae87ede08a7b04aca51237721f63b1808d39bdb4b2164558",
                "sha256:33892118b165401f291070100d6d09359ca74addda679b60390b09f8ef325ffe",
                "sha256:33c6e81d7bd55b468d2e793517c909b139960b6c790a60b7991b9b6b76fb9791",
                "sha256:3447475585bae2e77ecb832fc0300c3695516a47d46cefa0528181a34c5b9d3d",
                "sha256:34ca2dac9e4d7afb0bed4677512e36a52f09caa6fded70b4e3e1c89dbd92c326",
                "sha256:3e63498f680547ed24d2c71e6497f24bca791aca2fe116dbc2bd0ac7f191691b",
                "sha256:548430be2740e327b3fe0201abe471f314741efcb0067ec4f2d7dcfb4825f3e4",
                "sha256:6196a5c39286cc37c024cd78834fb9345e464525d8991c21e908cc046d1cc02c",
                "sha256:61b32d06ae8a036a6607805e6720ef00a3c98207038444ba7fd3d169cd998910",
                "sha256:6286efab1ed6e74b7028327365cf7346b1d777d63ab30e21a0f4d5b275fc17d5",
                "sha256:65d98939f1a2e74b58839f8c4dab3b6b3c1ce84972ae712be02845e65391ac7c",
                "sha256:66324e4e1beede9ac79e60f88de548da58b1f8ab4b2f1354d8375774f997e6c0",
                "sha256:6c77c9937962577a6a76917845d06af6ab9197702a42e1346d8ae2e76b5e3675",
                "sha256:70dec29e8ac485dbf57481baee40781c63e381bebea080991893cd297742b8fd",
                "sha256:7250a3fa399f08ec9cb3f7b1b987955d17e044f1ade821b32e5f435130250d7f",
                "sha256:748290bf9112b581c525e6e6d3820621ff020ed95af6f17fedef416b27ed564c",
                "sha256:7da13da6f985aab7f6f28debab00c67ff9cbacd588e8477034c0652ac141feea",
                "sha256:8f959b26f2634a091bb42241c3ed8d3cedb506e7c27b8dd5c7b9f745318ddbb6",
                "sha256:9de9e5188a782be6b1ce866e8a51bc76a0fbaa0e16613823fc38e4fc2556ad05",
                "sha256:a48900ecea1cbb71b8c71c620dee15b62f85f7c14189bdeee54966fbd9a0c5bd",
                "sha256:b87936fd2c317b6ee08a5741ea06b9d11a6074ef4cc42e031bc6403f82a32575",
                "sha256:c77da1263aa361938476f04c4b6c8916001b90b2c2fdd92d8d535e1af48fba5a",
                "sha256:cb5ec8eead331e3bb4ce8066cf06d2dfef1bfb1b2a73082dfe8a161301b76e37",
                "sha256:cc0ee35043162abbf717b7df924597ade8e5395e7b66d18270116f8745ceb795",
                "sha256:d14d30e7f46a0476efb0deb5b61343b1526f73ebb5ed84f23dc794bdb88f9d9f",
                "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32",
                "sha256:d3d20ea5782ba63ed13bc2b8c291a053c8d807a8fa927d941bd718468f7b950c",
                "sha256:d3f7594930c423fd9f5d1a76bee85a2c36fd8b4b16921cae7e965f22575e9c01",
                "sha256:dcef026f608f678c118779cd6591c8af6e9b4155c44e0d1bc0c87c036fb8c8c4",
                "sha256:e0791ac58d91ac58f694d8d2957884df8e4e2f6687cdf367ef7eb7497f79eaa2",
                "sha256:e385b637ac3acaae8022e7e47dfa7b83d3620e432e3ecb9a3f7f58f150e50921",
                "sha256:e519d64089b0876c7b467274468709dadf11e41d65f63bba207e04217f47c085",
                "sha256:e7229e60ac41a1202444497ddde70a48d33909e484f96eb0da9baf8dc68541df",
                "sha256:ed3ad863b1b40cd1d4bd21e7498329ccaece75db5a5bf58cd3c9f130843e7102",
                "sha256:f0ba29bafd8e7e22920567ce0d232c26d4d47c8b5cf4ed7b562b5db39fa199c5",
                "sha256:fa2ba70284fa42c2a5ecb35e322e68823288a4251f9ba9cc77be04ae15eada68",
                "sha256:fba85b6cd9c39be262fcd23865652920832b61583de2a2ca907dbd8e8a8c81e5"
            ],
            "markers": "python_version >= '3.5'",
            "version": "==6.1"
        },
        "typing-extensions": {
            "hashes": [
                "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497",
                "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342",
                "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84"
            ],
            "index": "pypi",
            "version": "==3.10.0.0"
        },
        "urllib3": {
            "hashes": [
                "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14",
                "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"
            ],
            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'",
            "version": "==1.26.9"
        },
        "zipp": {
            "hashes": [
                "sha256:56bf8aadb83c24db6c4b577e13de374ccfb67da2078beba1d037c17980bf43ad",
                "sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099"
            ],
            "markers": "python_version >= '3.7'",
            "version": "==3.8.0"
        }
    },
    "develop": {
        "awscli": {
            "hashes": [
                "sha256:314514e78518ba540afb20ee7d29a3751600b71ad4f205ac16808fa17234e2ff",
                "sha256:754b99717904801745115ea1a5cc4c2d0210c7b4c9326b0671271aa5eb228356"
            ],
            "index": "pypi",
            "version": "==1.20.11"
        },
        "botocore": {
            "hashes": [
                "sha256:601f820ed340a85ed62d91b4eaeb768b9ff0529add75a074592fb7c51db7bd00",
                "sha256:b5e9128a259fc0fe5a8c2b717f5d7e8a1321321981b5d5679939e12d4142c0f3"
            ],
            "markers": "python_version >= '3.6'",
            "version": "==1.21.11"
        },
        "colorama": {
            "hashes": [
                "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b",
                "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"
            ],
            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
            "version": "==0.4.4"
        },
        "docutils": {
            "hashes": [
                "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af",
                "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"
            ],
            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
            "version": "==0.16"
        },
        "jmespath": {
            "hashes": [
                "sha256:b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9",
                "sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f"
            ],
            "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'",
            "version": "==0.10.0"
        },
        "pyasn1": {
            "hashes": [
                "sha256:014c0e9976956a08139dc0712ae195324a75e142284d5f87f1a87ee1b068a359",
                "sha256:03840c999ba71680a131cfaee6fab142e1ed9bbd9c693e285cc6aca0d555e576",
                "sha256:0458773cfe65b153891ac249bcf1b5f8f320b7c2ce462151f8fa74de8934becf",
                "sha256:08c3c53b75eaa48d71cf8c710312316392ed40899cb34710d092e96745a358b7",
                "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d",
                "sha256:5c9414dcfede6e441f7e8f81b43b34e834731003427e5b09e4e00e3172a10f00",
                "sha256:6e7545f1a61025a4e58bb336952c5061697da694db1cae97b116e9c46abcf7c8",
                "sha256:78fa6da68ed2727915c4767bb386ab32cdba863caa7dbe473eaae45f9959da86",
                "sha256:7ab8a544af125fb704feadb008c99a88805126fb525280b2270bb25cc1d78a12",
                "sha256:99fcc3c8d804d1bc6d9a099921e39d827026409a58f2a720dcdb89374ea0c776",
                "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba",
                "sha256:e89bf84b5437b532b0803ba5c9a5e054d21fec423a89952a74f87fa2c9b7bce2",
                "sha256:fec3e9d8e36808a28efb59b489e4528c10ad0f480e57dcc32b4de5c9d8c9fdf3"
            ],
            "version": "==0.4.8"
        },
        "python-dateutil": {
            "hashes": [
                "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86",
                "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"
            ],
            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
            "version": "==2.8.2"
        },
        "pyyaml": {
            "hashes": [
                "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293",
                "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b",
                "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57",
                "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b",
                "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4",
                "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07",
                "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba",
                "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9",
                "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287",
                "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513",
                "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0",
                "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0",
                "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92",
                "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f",
                "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2",
                "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc",
                "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c",
                "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86",
                "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4",
                "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c",
                "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34",
                "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b",
                "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c",
                "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb",
                "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737",
                "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3",
                "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d",
                "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53",
                "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78",
                "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803",
                "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a",
                "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174",
                "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"
            ],
            "markers": "python_version >= '3.6'",
            "version": "==6.0"
        },
        "rsa": {
            "hashes": [
                "sha256:78f9a9bf4e7be0c5ded4583326e7461e3a3c5aae24073648b4bdfa797d78c9d2",
                "sha256:9d689e6ca1b3038bc82bf8d23e944b6b6037bc02301a574935b2dd946e0353b9"
            ],
            "markers": "python_version >= '3.5' and python_version < '4'",
            "version": "==4.7.2"
        },
        "s3transfer": {
            "hashes": [
                "sha256:7a6f4c4d1fdb9a2b640244008e142cbc2cd3ae34b386584ef044dd0f27101971",
                "sha256:95c58c194ce657a5f4fb0b9e60a84968c808888aed628cd98ab8771fe1db98ed"
            ],
            "markers": "python_version >= '3.6'",
            "version": "==0.5.2"
        },
        "six": {
            "hashes": [
                "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926",
                "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"
            ],
            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
            "version": "==1.16.0"
        },
        "urllib3": {
            "hashes": [
                "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14",
                "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"
            ],
            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'",
            "version": "==1.26.9"
        }
    }
}

Pipfile METASEP
[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"

[dev-packages]
#
# Amazon AWS Universal CLI environment (https://aws.amazon.com/cli/)
# Release notes: https://github.com/aws/aws-cli/blob/develop/CHANGELOG.rst
# Repo: https://github.com/aws/aws-cli
awscli = "==1.20.11"

[packages]
#
# Sphinx (https://www.sphinx-doc.org)
# Release notes: https://www.sphinx-doc.org/en/master/changes.html
# Repo: https://github.com/sphinx-doc/sphinx
sphinx = "==4.4.0"
#
# ReadTheDocs Theme (https://sphinx-rtd-theme.readthedocs.io/)
# Release notes: https://github.com/readthedocs/sphinx_rtd_theme/blob/master/docs/changelog.rst
# Repo: https://github.com/readthedocs/sphinx_rtd_theme
sphinx-rtd-theme = "==0.5.2"
#
# MyST Parser (https://myst-parser.readthedocs.io/en/latest/)
# Release notes: https://myst-parser.readthedocs.io/en/latest/develop/_changelog.html
# Repo: https://github.com/executablebooks/myst-parser
myst-parser = "==0.15.1"
#
# Python `typing` package extensions (https://github.com/python/typing/blob/master/typing_extensions/README.rst)
# Supports MyST Parser on macOS with Python 3.7
# Repo: https://github.com/python/typing
typing-extensions = "==3.10.0.0"
#
# Sphinx Autobuild (https://github.com/executablebooks/sphinx-autobuild)
# Repo: https://github.com/executablebooks/sphinx-autobuild
sphinx-autobuild = "==2021.3.14"
#
# Tabbed views for Sphinx (https://sphinx-tabs.readthedocs.io/)
# Repo: https://github.com/executablebooks/sphinx-tabs
sphinx-tabs = "3.2.0"
#
# Add a "copy" button to code blocks in Sphinx (https://sphinx-copybutton.readthedocs.io/en/latest/)
# Repo: https://github.com/executablebooks/sphinx-copybutton
sphinx-copybutton = "0.5.0"

NOTICE.txt METASEP
Mattermost Documentation Sphinx Extensions

©2022 Mattermost, Inc.  All Rights Reserved.  See LICENSE.txt for license information.

NOTICES:
--------

This document includes a list of open source components used in Mattermost Documentation Sphinx Extensions, including those that have been modified.

--------

## aws-cli

This product contains 'aws-cli' by Amazon Web Services.

Universal Command Line Interface for Amazon Web Services

* HOMEPAGE:
  * https://github.com/aws/aws-cli

* LICENSE: Other

Copyright 2012-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.

Licensed under the Apache License, Version 2.0 (the "License"). You
may not use this file except in compliance with the License. A copy of
the License is located at

    http://aws.amazon.com/apache2.0/

or in the "license" file accompanying this file. This file is
distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
ANY KIND, either express or implied. See the License for the specific
language governing permissions and limitations under the License.


---

## myst-parser

This product contains 'myst-parser' by Executable Books.

An extended commonmark compliant parser, with bridges to docutils/sphinx

* HOMEPAGE:
  * https://myst-parser.readthedocs.io

* LICENSE: MIT License

MIT License

Copyright (c) 2020 ExecutableBookProject

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


---

## sphinx

This product contains 'sphinx' by sphinx-doc.

Main repository for the Sphinx documentation builder

* HOMEPAGE:
  * https://www.sphinx-doc.org

* LICENSE: Other

License for Sphinx
==================

Unless otherwise indicated, all code in the Sphinx project is licenced under the
two clause BSD licence below.

Copyright (c) 2007-2022 by the Sphinx team (see AUTHORS file).
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

* Redistributions of source code must retain the above copyright
  notice, this list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright
  notice, this list of conditions and the following disclaimer in the
  documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


Licenses for incorporated software
==================================

The included smartypants module, included as sphinx.util.smartypants,
is available under the following license:

----------------------------------------------------------------------
SmartyPants_ license::

    Copyright (c) 2003 John Gruber
    (https://daringfireball.net/projects/smartypants/)
    All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    *   Redistributions of source code must retain the above copyright
        notice, this list of conditions and the following disclaimer.

    *   Redistributions in binary form must reproduce the above
        copyright notice, this list of conditions and the following
        disclaimer in the documentation and/or other materials
        provided with the distribution.

    *   Neither the name "SmartyPants" nor the names of its
        contributors may be used to endorse or promote products
        derived from this software without specific prior written
        permission.

    This software is provided by the copyright holders and
    contributors "as is" and any express or implied warranties,
    including, but not limited to, the implied warranties of
    merchantability and fitness for a particular purpose are
    disclaimed. In no event shall the copyright owner or contributors
    be liable for any direct, indirect, incidental, special,
    exemplary, or consequential damages (including, but not limited
    to, procurement of substitute goods or services; loss of use,
    data, or profits; or business interruption) however caused and on
    any theory of liability, whether in contract, strict liability, or
    tort (including negligence or otherwise) arising in any way out of
    the use of this software, even if advised of the possibility of
    such damage.


smartypants.py license::

    smartypants.py is a derivative work of SmartyPants.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    *   Redistributions of source code must retain the above copyright
        notice, this list of conditions and the following disclaimer.

    *   Redistributions in binary form must reproduce the above
        copyright notice, this list of conditions and the following
        disclaimer in the documentation and/or other materials
        provided with the distribution.

    This software is provided by the copyright holders and
    contributors "as is" and any express or implied warranties,
    including, but not limited to, the implied warranties of
    merchantability and fitness for a particular purpose are
    disclaimed. In no event shall the copyright owner or contributors
    be liable for any direct, indirect, incidental, special,
    exemplary, or consequential damages (including, but not limited
    to, procurement of substitute goods or services; loss of use,
    data, or profits; or business interruption) however caused and on
    any theory of liability, whether in contract, strict liability, or
    tort (including negligence or otherwise) arising in any way out of
    the use of this software, even if advised of the possibility of
    such damage.
----------------------------------------------------------------------

The included JQuery JavaScript library is available under the MIT
license:

----------------------------------------------------------------------
Copyright (c) 2008 John Resig, https://jquery.com/

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
----------------------------------------------------------------------

The included Underscore JavaScript library is available under the MIT
license:

----------------------------------------------------------------------
Copyright (c) 2009 Jeremy Ashkenas, DocumentCloud

Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.

-------------------------------------------------------------------------------

The included implementation of NumpyDocstring._parse_numpydoc_see_also_section
was derived from code under the following license:

-------------------------------------------------------------------------------

Copyright (C) 2008 Stefan van der Walt <stefan@mentat.za.net>, Pauli Virtanen <pav@iki.fi>

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

 1. Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer.
 2. Redistributions in binary form must reproduce the above copyright
    notice, this list of conditions and the following disclaimer in
    the documentation and/or other materials provided with the
    distribution.

THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.

-------------------------------------------------------------------------------


---

## sphinx-autobuild

This product contains 'sphinx-autobuild' by Executable Books.

Watch a Sphinx directory and rebuild the documentation when a change is detected. Also includes a livereload enabled web server.

* HOMEPAGE:
  * https://github.com/executablebooks/sphinx-autobuild

* LICENSE: MIT License

Copyright (c) 2020, Pradyun Gedam
Copyright (c) 2013, Jonathan Stoppani

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.


---

## sphinx-copybutton

This product contains 'sphinx-copybutton' by Executable Books.

Add a "copy" button to code blocks in Sphinx

* HOMEPAGE:
  * https://sphinx-copybutton.readthedocs.io/en/latest/

* LICENSE: MIT License

MIT License

Copyright (c) 2018 Chris Holdgraf

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


---

## sphinx-tabs

This product contains 'sphinx-tabs' by Executable Books.

Tabbed views for Sphinx

* HOMEPAGE:
  * https://sphinx-tabs.readthedocs.io

* LICENSE: MIT License

The MIT License (MIT)

Copyright (c) 2017 djungelorm

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


---

## sphinx_rtd_theme

This product contains 'sphinx_rtd_theme' by Read the Docs.

Sphinx theme for readthedocs.org

* HOMEPAGE:
  * https://sphinx-rtd-theme.readthedocs.io/

* LICENSE: MIT License

The MIT License (MIT)

Copyright (c) 2013-2018 Dave Snider, Read the Docs, Inc. & contributors

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


---

## typing

This product contains 'typing' by Python.

Python static typing home. Hosts the documentation and a user help forum.

* HOMEPAGE:
  * https://typing.readthedocs.io/

* LICENSE: Other

A. HISTORY OF THE SOFTWARE
==========================

Python was created in the early 1990s by Guido van Rossum at Stichting
Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands
as a successor of a language called ABC.  Guido remains Python's
principal author, although it includes many contributions from others.

In 1995, Guido continued his work on Python at the Corporation for
National Research Initiatives (CNRI, see http://www.cnri.reston.va.us)
in Reston, Virginia where he released several versions of the
software.

In May 2000, Guido and the Python core development team moved to
BeOpen.com to form the BeOpen PythonLabs team.  In October of the same
year, the PythonLabs team moved to Digital Creations (now Zope
Corporation, see http://www.zope.com).  In 2001, the Python Software
Foundation (PSF, see http://www.python.org/psf/) was formed, a
non-profit organization created specifically to own Python-related
Intellectual Property.  Zope Corporation is a sponsoring member of
the PSF.

All Python releases are Open Source (see http://www.opensource.org for
the Open Source Definition).  Historically, most, but not all, Python
releases have also been GPL-compatible; the table below summarizes
the various releases.

    Release         Derived     Year        Owner       GPL-
                    from                                compatible? (1)

    0.9.0 thru 1.2              1991-1995   CWI         yes
    1.3 thru 1.5.2  1.2         1995-1999   CNRI        yes
    1.6             1.5.2       2000        CNRI        no
    2.0             1.6         2000        BeOpen.com  no
    1.6.1           1.6         2001        CNRI        yes (2)
    2.1             2.0+1.6.1   2001        PSF         no
    2.0.1           2.0+1.6.1   2001        PSF         yes
    2.1.1           2.1+2.0.1   2001        PSF         yes
    2.1.2           2.1.1       2002        PSF         yes
    2.1.3           2.1.2       2002        PSF         yes
    2.2 and above   2.1.1       2001-now    PSF         yes

Footnotes:

(1) GPL-compatible doesn't mean that we're distributing Python under
    the GPL.  All Python licenses, unlike the GPL, let you distribute
    a modified version without making your changes open source.  The
    GPL-compatible licenses make it possible to combine Python with
    other software that is released under the GPL; the others don't.

(2) According to Richard Stallman, 1.6.1 is not GPL-compatible,
    because its license has a choice of law clause.  According to
    CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1
    is "not incompatible" with the GPL.

Thanks to the many outside volunteers who have worked under Guido's
direction to make these releases possible.


B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON
===============================================================

PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
--------------------------------------------

1. This LICENSE AGREEMENT is between the Python Software Foundation
("PSF"), and the Individual or Organization ("Licensee") accessing and
otherwise using this software ("Python") in source or binary form and
its associated documentation.

2. Subject to the terms and conditions of this License Agreement, PSF hereby
grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
analyze, test, perform and/or display publicly, prepare derivative works,
distribute, and otherwise use Python alone or in any derivative version,
provided, however, that PSF's License Agreement and PSF's notice of copyright,
i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
2011, 2012, 2013, 2014 Python Software Foundation; All Rights Reserved" are
retained in Python alone or in any derivative version prepared by Licensee.

3. In the event Licensee prepares a derivative work that is based on
or incorporates Python or any part thereof, and wants to make
the derivative work available to others as provided herein, then
Licensee hereby agrees to include in any such work a brief summary of
the changes made to Python.

4. PSF is making Python available to Licensee on an "AS IS"
basis.  PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

6. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

7. Nothing in this License Agreement shall be deemed to create any
relationship of agency, partnership, or joint venture between PSF and
Licensee.  This License Agreement does not grant permission to use PSF
trademarks or trade name in a trademark sense to endorse or promote
products or services of Licensee, or any third party.

8. By copying, installing or otherwise using Python, Licensee
agrees to be bound by the terms and conditions of this License
Agreement.


BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
-------------------------------------------

BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1

1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
Individual or Organization ("Licensee") accessing and otherwise using
this software in source or binary form and its associated
documentation ("the Software").

2. Subject to the terms and conditions of this BeOpen Python License
Agreement, BeOpen hereby grants Licensee a non-exclusive,
royalty-free, world-wide license to reproduce, analyze, test, perform
and/or display publicly, prepare derivative works, distribute, and
otherwise use the Software alone or in any derivative version,
provided, however, that the BeOpen Python License is retained in the
Software, alone or in any derivative version prepared by Licensee.

3. BeOpen is making the Software available to Licensee on an "AS IS"
basis.  BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

5. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

6. This License Agreement shall be governed by and interpreted in all
respects by the law of the State of California, excluding conflict of
law provisions.  Nothing in this License Agreement shall be deemed to
create any relationship of agency, partnership, or joint venture
between BeOpen and Licensee.  This License Agreement does not grant
permission to use BeOpen trademarks or trade names in a trademark
sense to endorse or promote products or services of Licensee, or any
third party.  As an exception, the "BeOpen Python" logos available at
http://www.pythonlabs.com/logos.html may be used according to the
permissions granted on that web page.

7. By copying, installing or otherwise using the software, Licensee
agrees to be bound by the terms and conditions of this License
Agreement.


CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1
---------------------------------------

1. This LICENSE AGREEMENT is between the Corporation for National
Research Initiatives, having an office at 1895 Preston White Drive,
Reston, VA 20191 ("CNRI"), and the Individual or Organization
("Licensee") accessing and otherwise using Python 1.6.1 software in
source or binary form and its associated documentation.

2. Subject to the terms and conditions of this License Agreement, CNRI
hereby grants Licensee a nonexclusive, royalty-free, world-wide
license to reproduce, analyze, test, perform and/or display publicly,
prepare derivative works, distribute, and otherwise use Python 1.6.1
alone or in any derivative version, provided, however, that CNRI's
License Agreement and CNRI's notice of copyright, i.e., "Copyright (c)
1995-2001 Corporation for National Research Initiatives; All Rights
Reserved" are retained in Python 1.6.1 alone or in any derivative
version prepared by Licensee.  Alternately, in lieu of CNRI's License
Agreement, Licensee may substitute the following text (omitting the
quotes): "Python 1.6.1 is made available subject to the terms and
conditions in CNRI's License Agreement.  This Agreement together with
Python 1.6.1 may be located on the Internet using the following
unique, persistent identifier (known as a handle): 1895.22/1013.  This
Agreement may also be obtained from a proxy server on the Internet
using the following URL: http://hdl.handle.net/1895.22/1013".

3. In the event Licensee prepares a derivative work that is based on
or incorporates Python 1.6.1 or any part thereof, and wants to make
the derivative work available to others as provided herein, then
Licensee hereby agrees to include in any such work a brief summary of
the changes made to Python 1.6.1.

4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS"
basis.  CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1,
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

6. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

7. This License Agreement shall be governed by the federal
intellectual property law of the United States, including without
limitation the federal copyright law, and, to the extent such
U.S. federal law does not apply, by the law of the Commonwealth of
Virginia, excluding Virginia's conflict of law provisions.
Notwithstanding the foregoing, with regard to derivative works based
on Python 1.6.1 that incorporate non-separable material that was
previously distributed under the GNU General Public License (GPL), the
law of the Commonwealth of Virginia shall govern this License
Agreement only as to issues arising under or with respect to
Paragraphs 4, 5, and 7 of this License Agreement.  Nothing in this
License Agreement shall be deemed to create any relationship of
agency, partnership, or joint venture between CNRI and Licensee.  This
License Agreement does not grant permission to use CNRI trademarks or
trade name in a trademark sense to endorse or promote products or
services of Licensee, or any third party.

8. By clicking on the "ACCEPT" button where indicated, or by copying,
installing or otherwise using Python 1.6.1, Licensee agrees to be
bound by the terms and conditions of this License Agreement.

        ACCEPT


CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
--------------------------------------------------

Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
The Netherlands.  All rights reserved.

Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Stichting Mathematisch
Centrum or CWI not be used in advertising or publicity pertaining to
distribution of the software without specific, written prior
permission.

STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.



Makefile METASEP
# Minimal makefile for Sphinx documentation
#

# You can set these variables from the command line, and also
# from the environment for the last three.
SOURCEDIR       = source
BUILDDIR        = build
WARNINGSFILE    = $(BUILDDIR)/warnings.log
SPHINXOPTS      ?= -j auto
SPHINXBUILD     ?= pipenv run sphinx-build
SPHINXAUTOBUILD ?= pipenv run sphinx-autobuild

# Put it first so that "make" without argument is like "make help".
help:
	@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

.PHONY: help Makefile livehtml python-deps

python-deps:
	pip install pipenv
	pipenv install --dev

# Run `make livehtml` to start sphinx-autobuild
livehtml:
	@mkdir -p "$(BUILDDIR)"
	@$(SPHINXAUTOBUILD) "$(SOURCEDIR)" "$(BUILDDIR)/html" -d "$(BUILDDIR)/doctrees" $(SPHINXOPTS) $(O)

# Run `make linkcheck` to check external links
# Overriding `exclude_patterns` configuration to exclude
# directories or files not included in the documentation
linkcheck:
	@mkdir -p "$(BUILDDIR)"
	@$(SPHINXBUILD) -M $@ -D exclude_patterns=archive/*,process/* "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 2>>"$(WARNINGSFILE)"

# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
	@mkdir -p "$(BUILDDIR)"
	@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 2>>"$(WARNINGSFILE)"

CONTRIBUTING.md METASEP

## [Contribute to Mattermost](https://mattermost.com/contribute/)

Before getting started please see our [Contribution Guidelines](https://developers.mattermost.com/contribute/getting-started/).

tests/redirects_test.py METASEP

"""
Redirect tests
"""
from extensions.reredirects import (
    setup as ext_setup,
    builder_inited as ext_builder_inited,
    env_updated as ext_env_updated,
    html_page_context as ext_html_page_context,
    html_collect_pages as ext_html_collect_pages,
    compute_redirects as ext_compute_redirects,
    build_js_object as ext_build_js_object,
    CONFIG_OPTION_REDIRECTS,
    CONFIG_OPTION_TEMPLATE_FILE,
    CONFIG_MM_URL_PATH_PREFIX,
    CONFIG_WRITE_EXTENSIONLESS_PAGES,
    CTX_HAS_FRAGMENT_REDIRECTS,
    CTX_FRAGMENT_REDIRECTS,
    DEFAULT_PAGE,
    ENV_COMPUTED_REDIRECTS,
    ENV_REDIRECTS_ENABLED,
    ENV_INTRA_PAGE_FRAGMENT_PAGES
)
from typing import Dict, List


class TestSetup:
    def test_nominal(self, app):
        result = ext_setup(app)
        assert "parallel_read_safe" in result
        assert result["parallel_read_safe"]
        assert "parallel_write_safe" in result
        assert result["parallel_write_safe"]
        assert hasattr(app.config, CONFIG_OPTION_REDIRECTS)
        assert hasattr(app.config, CONFIG_OPTION_TEMPLATE_FILE)
        assert hasattr(app.config, CONFIG_MM_URL_PATH_PREFIX)
        assert hasattr(app.config, CONFIG_WRITE_EXTENSIONLESS_PAGES)


class TestBuilderInited:
    def test_nominal(self, app):
        ext_setup(app)
        app.config[CONFIG_OPTION_REDIRECTS] = dict({"foo": "bar"})
        ext_builder_inited(app)
        assert(hasattr(app.env, ENV_COMPUTED_REDIRECTS))
        computed_redirects: Dict[str, str] = getattr(app.env, ENV_COMPUTED_REDIRECTS)
        assert(len(computed_redirects) == 1)

    def test_no_config_value(self, app):
        ext_setup(app)
        app.config[CONFIG_OPTION_REDIRECTS] = None
        ext_builder_inited(app)
        assert(not getattr(app.env, ENV_REDIRECTS_ENABLED))
        assert(not hasattr(app.env, ENV_COMPUTED_REDIRECTS))

    def test_empty_config_value(self, app):
        ext_setup(app)
        app.config[CONFIG_OPTION_REDIRECTS] = dict()
        ext_builder_inited(app)
        assert(not getattr(app.env, ENV_REDIRECTS_ENABLED))
        assert(not hasattr(app.env, ENV_COMPUTED_REDIRECTS))


class TestEnvUpdated:
    def test_nominal(self, app):
        ext_setup(app)
        app.env.all_docs["foo"] = 0
        app.config[CONFIG_OPTION_REDIRECTS] = dict({"foo": "bar"})
        ext_builder_inited(app)
        ext_env_updated(app, app.env)
        assert(hasattr(app.env, ENV_INTRA_PAGE_FRAGMENT_PAGES))
        intra_page_fragments: List[str] = getattr(app.env, ENV_INTRA_PAGE_FRAGMENT_PAGES)
        assert(len(intra_page_fragments) == 1)
        assert(intra_page_fragments[0] == "foo")

    def test_redirects_disabled(self, app):
        ext_setup(app)
        app.config[CONFIG_OPTION_REDIRECTS] = None
        ext_builder_inited(app)
        ext_env_updated(app, app.env)
        assert(not hasattr(app.env, ENV_INTRA_PAGE_FRAGMENT_PAGES))

    def test_fragment_not_in_alldocs(self, app):
        ext_setup(app)
        app.env.all_docs["foo"] = 0
        app.config[CONFIG_OPTION_REDIRECTS] = dict({"narf": "fnord"})
        ext_builder_inited(app)
        ext_env_updated(app, app.env)
        assert(hasattr(app.env, ENV_INTRA_PAGE_FRAGMENT_PAGES))
        intra_page_fragments: List[str] = getattr(app.env, ENV_INTRA_PAGE_FRAGMENT_PAGES)
        assert(len(intra_page_fragments) == 0)

    def test_no_computed_redirects(self, app):
        ext_setup(app)
        app.env.all_docs["foo"] = 0
        app.config[CONFIG_OPTION_REDIRECTS] = dict({"": "fnord"})
        ext_builder_inited(app)
        assert(hasattr(app.env, ENV_COMPUTED_REDIRECTS))
        computed_redirects: Dict[str, str] = getattr(app.env, ENV_COMPUTED_REDIRECTS)
        assert(len(computed_redirects) == 0)
        ext_env_updated(app, app.env)
        assert(hasattr(app.env, ENV_INTRA_PAGE_FRAGMENT_PAGES))
        intra_page_fragments: List[str] = getattr(app.env, ENV_INTRA_PAGE_FRAGMENT_PAGES)
        assert(len(intra_page_fragments) == 0)


class TestHtmlPageContext:
    def test_nominal(self, app):
        expected_templatename = "template.html"
        expected_fragment_redirects = 'const ' + CTX_FRAGMENT_REDIRECTS + ' = Object.freeze({"-":"bar"});'
        ext_setup(app)
        app.env.all_docs["foo"] = 0
        app.config[CONFIG_OPTION_REDIRECTS] = dict({"foo": "bar"})
        ext_builder_inited(app)
        ext_env_updated(app, app.env)
        ctx = dict()
        templatename = ext_html_page_context(app, "foo", "template.html", ctx, dict())
        assert(templatename == expected_templatename)
        assert(len(ctx) == 2)
        assert(ctx[CTX_HAS_FRAGMENT_REDIRECTS])
        assert(ctx[CTX_FRAGMENT_REDIRECTS] == expected_fragment_redirects)

non_informative
"""
Redirect tests
"""
from extensions.reredirects import (
    setup as ext_setup,
    builder_inited as ext_builder_inited,
    env_updated as ext_env_updated,
    html_page_context as ext_html_page_context,
    html_collect_pages as ext_html_collect_pages,
    compute_redirects as ext_compute_redirects,
    build_js_object as ext_build_js_object,
    CONFIG_OPTION_REDIRECTS,
    CONFIG_OPTION_TEMPLATE_FILE,
    CONFIG_MM_URL_PATH_PREFIX,
    CONFIG_WRITE_EXTENSIONLESS_PAGES,
    CTX_HAS_FRAGMENT_REDIRECTS,
    CTX_FRAGMENT_REDIRECTS,
    DEFAULT_PAGE,
    ENV_COMPUTED_REDIRECTS,
    ENV_REDIRECTS_ENABLED,
    ENV_INTRA_PAGE_FRAGMENT_PAGES
)
from typing import Dict, List


class TestSetup:
    def test_nominal(self, app):
        result = ext_setup(app)
        assert "parallel_read_safe" in result
        assert result["parallel_read_safe"]
        assert "parallel_write_safe" in result
        assert result["parallel_write_safe"]
        assert hasattr(app.config, CONFIG_OPTION_REDIRECTS)
        assert hasattr(app.config, CONFIG_OPTION_TEMPLATE_FILE)
        assert hasattr(app.config, CONFIG_MM_URL_PATH_PREFIX)
        assert hasattr(app.config, CONFIG_WRITE_EXTENSIONLESS_PAGES)


class TestBuilderInited:
    def test_nominal(self, app):
        ext_setup(app)
        app.config[CONFIG_OPTION_REDIRECTS] = dict({"foo": "bar"})
        ext_builder_inited(app)
        assert(hasattr(app.env, ENV_COMPUTED_REDIRECTS))
        computed_redirects: Dict[str, str] = getattr(app.env, ENV_COMPUTED_REDIRECTS)
        assert(len(computed_redirects) == 1)

    def test_no_config_value(self, app):
        ext_setup(app)
        app.config[CONFIG_OPTION_REDIRECTS] = None
        ext_builder_inited(app)
        assert(not getattr(app.env, ENV_REDIRECTS_ENABLED))
        assert(not hasattr(app.env, ENV_COMPUTED_REDIRECTS))

    def test_empty_config_value(self, app):
        ext_setup(app)
        app.config[CONFIG_OPTION_REDIRECTS] = dict()
        ext_builder_inited(app)
        assert(not getattr(app.env, ENV_REDIRECTS_ENABLED))
        assert(not hasattr(app.env, ENV_COMPUTED_REDIRECTS))


class TestEnvUpdated:
    def test_nominal(self, app):
        ext_setup(app)
        app.env.all_docs["foo"] = 0
        app.config[CONFIG_OPTION_REDIRECTS] = dict({"foo": "bar"})
        ext_builder_inited(app)
        ext_env_updated(app, app.env)
        assert(hasattr(app.env, ENV_INTRA_PAGE_FRAGMENT_PAGES))
        intra_page_fragments: List[str] = getattr(app.env, ENV_INTRA_PAGE_FRAGMENT_PAGES)
        assert(len(intra_page_fragments) == 1)
        assert(intra_page_fragments[0] == "foo")

    def test_redirects_disabled(self, app):
        ext_setup(app)
        app.config[CONFIG_OPTION_REDIRECTS] = None
        ext_builder_inited(app)
        ext_env_updated(app, app.env)
        assert(not hasattr(app.env, ENV_INTRA_PAGE_FRAGMENT_PAGES))

    def test_fragment_not_in_alldocs(self, app):
        ext_setup(app)
        app.env.all_docs["foo"] = 0
        app.config[CONFIG_OPTION_REDIRECTS] = dict({"narf": "fnord"})
        ext_builder_inited(app)
        ext_env_updated(app, app.env)
        assert(hasattr(app.env, ENV_INTRA_PAGE_FRAGMENT_PAGES))
        intra_page_fragments: List[str] = getattr(app.env, ENV_INTRA_PAGE_FRAGMENT_PAGES)
        assert(len(intra_page_fragments) == 0)

    def test_no_computed_redirects(self, app):
        ext_setup(app)
        app.env.all_docs["foo"] = 0
        app.config[CONFIG_OPTION_REDIRECTS] = dict({"": "fnord"})
        ext_builder_inited(app)
        assert(hasattr(app.env, ENV_COMPUTED_REDIRECTS))
        computed_redirects: Dict[str, str] = getattr(app.env, ENV_COMPUTED_REDIRECTS)
        assert(len(computed_redirects) == 0)
        ext_env_updated(app, app.env)
        assert(hasattr(app.env, ENV_INTRA_PAGE_FRAGMENT_PAGES))
        intra_page_fragments: List[str] = getattr(app.env, ENV_INTRA_PAGE_FRAGMENT_PAGES)
        assert(len(intra_page_fragments) == 0)


class TestHtmlPageContext:
    def test_nominal(self, app):
        expected_templatename = "template.html"
        expected_fragment_redirects = 'const ' + CTX_FRAGMENT_REDIRECTS + ' = Object.freeze({"-":"bar"});'
        ext_setup(app)
        app.env.all_docs["foo"] = 0
        app.config[CONFIG_OPTION_REDIRECTS] = dict({"foo": "bar"})
        ext_builder_inited(app)
        ext_env_updated(app, app.env)
        ctx = dict()
        templatename = ext_html_page_context(app, "foo", "template.html", ctx, dict())
        assert(templatename == expected_templatename)
        assert(len(ctx) == 2)
        assert(ctx[CTX_HAS_FRAGMENT_REDIRECTS])
        assert(ctx[CTX_FRAGMENT_REDIRECTS] == expected_fragment_redirects)

    def test_redirects_disabled(self, app):
        expected_templatename = "template.html"
        ext_setup(app)
        app.config[CONFIG_OPTION_REDIRECTS] = None
        ext_builder_inited(app)
        ext_env_updated(app, app.env)
        ctx = dict()
        templatename = ext_html_page_context(app, "foo", "template.html", ctx, dict())
        assert(templatename == expected_templatename)
        assert(len(ctx) == 0)

    def test_page_not_in_fragments(self, app):
        expected_templatename = "template.html"
        ext_setup(app)
        app.env.all_docs["foo"] = 0
        app.config[CONFIG_OPTION_REDIRECTS] = dict({"narf": "fnord"})
        ext_builder_inited(app)
        ext_env_updated(app, app.env)
        ctx = dict()
        templatename = ext_html_page_context(app, "foo", "template.html", ctx, dict())
        assert(templatename == expected_templatename)
        assert(len(ctx) == 1)
        assert(not ctx[CTX_HAS_FRAGMENT_REDIRECTS])


non_informative
"""
Redirect tests
"""
from extensions.reredirects import (
    setup as ext_setup,
    builder_inited as ext_builder_inited,
    env_updated as ext_env_updated,
    html_page_context as ext_html_page_context,
    html_collect_pages as ext_html_collect_pages,
    compute_redirects as ext_compute_redirects,
    build_js_object as ext_build_js_object,
    CONFIG_OPTION_REDIRECTS,
    CONFIG_OPTION_TEMPLATE_FILE,
    CONFIG_MM_URL_PATH_PREFIX,
    CONFIG_WRITE_EXTENSIONLESS_PAGES,
    CTX_HAS_FRAGMENT_REDIRECTS,
    CTX_FRAGMENT_REDIRECTS,
    DEFAULT_PAGE,
    ENV_COMPUTED_REDIRECTS,
    ENV_REDIRECTS_ENABLED,
    ENV_INTRA_PAGE_FRAGMENT_PAGES
)
from typing import Dict, List


class TestSetup:
    def test_nominal(self, app):
        result = ext_setup(app)
        assert "parallel_read_safe" in result
        assert result["parallel_read_safe"]
        assert "parallel_write_safe" in result
        assert result["parallel_write_safe"]
        assert hasattr(app.config, CONFIG_OPTION_REDIRECTS)
        assert hasattr(app.config, CONFIG_OPTION_TEMPLATE_FILE)
        assert hasattr(app.config, CONFIG_MM_URL_PATH_PREFIX)
        assert hasattr(app.config, CONFIG_WRITE_EXTENSIONLESS_PAGES)
non_informative
"""
Redirect tests
"""
from extensions.reredirects import (
non_informative
"""
Redirect tests
"""
from extensions.reredirects import (
    setup as ext_setup,
    builder_inited as ext_builder_inited,
    env_updated as ext_env_updated,
    html_page_context as ext_html_page_context,
    html_collect_pages as ext_html_collect_pages,
    compute_redirects as ext_compute_redirects,
    build_js_object as ext_build_js_object,
    CONFIG_OPTION_REDIRECTS,
    CONFIG_OPTION_TEMPLATE_FILE,
    CONFIG_MM_URL_PATH_PREFIX,
    CONFIG_WRITE_EXTENSIONLESS_PAGES,
    CTX_HAS_FRAGMENT_REDIRECTS,
    CTX_FRAGMENT_REDIRECTS,
    DEFAULT_PAGE,
    ENV_COMPUTED_REDIRECTS,
    ENV_REDIRECTS_ENABLED,
    ENV_INTRA_PAGE_FRAGMENT_PAGES
)
non_informative
"""
Redirect tests
"""
from extensions.reredirects import (
    setup as ext_setup,
    builder_inited as ext_builder_inited,
    env_updated as ext_env_updated,
    html_page_context as ext_html_page_context,
    html_collect_pages as ext_html_collect_pages,
    compute_redirects as ext_compute_redirects,
    build_js_object as ext_build_js_object,
    CONFIG_OPTION_REDIRECTS,
    CONFIG_OPTION_TEMPLATE_FILE,
    CONFIG_MM_URL_PATH_PREFIX,
    CONFIG_WRITE_EXTENSIONLESS_PAGES,
    CTX_HAS_FRAGMENT_REDIRECTS,
    CTX_FRAGMENT_REDIRECTS,
    DEFAULT_PAGE,
    ENV_COMPUTED_REDIRECTS,
    ENV_REDIRECTS_ENABLED,
    ENV_INTRA_PAGE_FRAGMENT_PAGES
)
from typing import Dict, List


class TestSetup:
    def test_nominal(self, app):
        result = ext_setup(app)
        assert "parallel_read_safe" in result
        assert result["parallel_read_safe"]
        assert "parallel_write_safe" in result
        assert result["parallel_write_safe"]
        assert hasattr(app.config, CONFIG_OPTION_REDIRECTS)
        assert hasattr(app.config, CONFIG_OPTION_TEMPLATE_FILE)
        assert hasattr(app.config, CONFIG_MM_URL_PATH_PREFIX)
        assert hasattr(app.config, CONFIG_WRITE_EXTENSIONLESS_PAGES)


class TestBuilderInited:
    def test_nominal(self, app):
        ext_setup(app)
        app.config[CONFIG_OPTION_REDIRECTS] = dict({"foo": "bar"})
        ext_builder_inited(app)
        assert(hasattr(app.env, ENV_COMPUTED_REDIRECTS))
        computed_redirects: Dict[str, str] = getattr(app.env, ENV_COMPUTED_REDIRECTS)
        assert(len(computed_redirects) == 1)

    def test_no_config_value(self, app):
        ext_setup(app)
        app.config[CONFIG_OPTION_REDIRECTS] = None
        ext_builder_inited(app)
        assert(not getattr(app.env, ENV_REDIRECTS_ENABLED))
        assert(not hasattr(app.env, ENV_COMPUTED_REDIRECTS))

    def test_empty_config_value(self, app):
        ext_setup(app)
        app.config[CONFIG_OPTION_REDIRECTS] = dict()
        ext_builder_inited(app)
        assert(not getattr(app.env, ENV_REDIRECTS_ENABLED))
        assert(not hasattr(app.env, ENV_COMPUTED_REDIRECTS))


class TestEnvUpdated:
    def test_nominal(self, app):
        ext_setup(app)
        app.env.all_docs["foo"] = 0
        app.config[CONFIG_OPTION_REDIRECTS] = dict({"foo": "bar"})
        ext_builder_inited(app)
        ext_env_updated(app, app.env)
        assert(hasattr(app.env, ENV_INTRA_PAGE_FRAGMENT_PAGES))
        intra_page_fragments: List[str] = getattr(app.env, ENV_INTRA_PAGE_FRAGMENT_PAGES)
        assert(len(intra_page_fragments) == 1)
        assert(intra_page_fragments[0] == "foo")

    def test_redirects_disabled(self, app):
        ext_setup(app)
        app.config[CONFIG_OPTION_REDIRECTS] = None
        ext_builder_inited(app)
        ext_env_updated(app, app.env)
        assert(not hasattr(app.env, ENV_INTRA_PAGE_FRAGMENT_PAGES))

    def test_fragment_not_in_alldocs(self, app):
        ext_setup(app)
        app.env.all_docs["foo"] = 0
        app.config[CONFIG_OPTION_REDIRECTS] = dict({"narf": "fnord"})
        ext_builder_inited(app)
        ext_env_updated(app, app.env)
        assert(hasattr(app.env, ENV_INTRA_PAGE_FRAGMENT_PAGES))
        intra_page_fragments: List[str] = getattr(app.env, ENV_INTRA_PAGE_FRAGMENT_PAGES)
        assert(len(intra_page_fragments) == 0)

    def test_no_computed_redirects(self, app):
        ext_setup(app)
        app.env.all_docs["foo"] = 0
        app.config[CONFIG_OPTION_REDIRECTS] = dict({"": "fnord"})
        ext_builder_inited(app)
        assert(hasattr(app.env, ENV_COMPUTED_REDIRECTS))
        computed_redirects: Dict[str, str] = getattr(app.env, ENV_COMPUTED_REDIRECTS)
        assert(len(computed_redirects) == 0)
random
"""
Redirect tests
"""
from extensions.reredirects import (
    setup as ext_setup,
    builder_inited as ext_builder_inited,
    env_updated as ext_env_updated,
    html_page_context as ext_html_page_context,
    html_collect_pages as ext_html_collect_pages,
    compute_redirects as ext_compute_redirects,
    build_js_object as ext_build_js_object,
    CONFIG_OPTION_REDIRECTS,
    CONFIG_OPTION_TEMPLATE_FILE,
    CONFIG_MM_URL_PATH_PREFIX,
    CONFIG_WRITE_EXTENSIONLESS_PAGES,
    CTX_HAS_FRAGMENT_REDIRECTS,
    CTX_FRAGMENT_REDIRECTS,
    DEFAULT_PAGE,
    ENV_COMPUTED_REDIRECTS,
    ENV_REDIRECTS_ENABLED,
    ENV_INTRA_PAGE_FRAGMENT_PAGES
)
from typing import Dict, List


class TestSetup:
    def test_nominal(self, app):
        result = ext_setup(app)
        assert "parallel_read_safe" in result
        assert result["parallel_read_safe"]
        assert "parallel_write_safe" in result
        assert result["parallel_write_safe"]
        assert hasattr(app.config, CONFIG_OPTION_REDIRECTS)
        assert hasattr(app.config, CONFIG_OPTION_TEMPLATE_FILE)
        assert hasattr(app.config, CONFIG_MM_URL_PATH_PREFIX)
        assert hasattr(app.config, CONFIG_WRITE_EXTENSIONLESS_PAGES)


class TestBuilderInited:
    def test_nominal(self, app):
        ext_setup(app)
        app.config[CONFIG_OPTION_REDIRECTS] = dict({"foo": "bar"})
        ext_builder_inited(app)
        assert(hasattr(app.env, ENV_COMPUTED_REDIRECTS))
        computed_redirects: Dict[str, str] = getattr(app.env, ENV_COMPUTED_REDIRECTS)
        assert(len(computed_redirects) == 1)

    def test_no_config_value(self, app):
        ext_setup(app)
        app.config[CONFIG_OPTION_REDIRECTS] = None
        ext_builder_inited(app)
        assert(not getattr(app.env, ENV_REDIRECTS_ENABLED))
        assert(not hasattr(app.env, ENV_COMPUTED_REDIRECTS))

    def test_empty_config_value(self, app):
        ext_setup(app)
        app.config[CONFIG_OPTION_REDIRECTS] = dict()
        ext_builder_inited(app)
        assert(not getattr(app.env, ENV_REDIRECTS_ENABLED))
        assert(not hasattr(app.env, ENV_COMPUTED_REDIRECTS))


class TestEnvUpdated:
    def test_nominal(self, app):
        ext_setup(app)
        app.env.all_docs["foo"] = 0
        app.config[CONFIG_OPTION_REDIRECTS] = dict({"foo": "bar"})
        ext_builder_inited(app)
        ext_env_updated(app, app.env)
        assert(hasattr(app.env, ENV_INTRA_PAGE_FRAGMENT_PAGES))
        intra_page_fragments: List[str] = getattr(app.env, ENV_INTRA_PAGE_FRAGMENT_PAGES)
        assert(len(intra_page_fragments) == 1)
        assert(intra_page_fragments[0] == "foo")

    def test_redirects_disabled(self, app):
        ext_setup(app)
        app.config[CONFIG_OPTION_REDIRECTS] = None
        ext_builder_inited(app)
        ext_env_updated(app, app.env)
        assert(not hasattr(app.env, ENV_INTRA_PAGE_FRAGMENT_PAGES))

    def test_fragment_not_in_alldocs(self, app):
        ext_setup(app)
        app.env.all_docs["foo"] = 0
        app.config[CONFIG_OPTION_REDIRECTS] = dict({"narf": "fnord"})
        ext_builder_inited(app)
        ext_env_updated(app, app.env)
        assert(hasattr(app.env, ENV_INTRA_PAGE_FRAGMENT_PAGES))
        intra_page_fragments: List[str] = getattr(app.env, ENV_INTRA_PAGE_FRAGMENT_PAGES)
        assert(len(intra_page_fragments) == 0)

    def test_no_computed_redirects(self, app):
        ext_setup(app)
        app.env.all_docs["foo"] = 0
        app.config[CONFIG_OPTION_REDIRECTS] = dict({"": "fnord"})
        ext_builder_inited(app)
        assert(hasattr(app.env, ENV_COMPUTED_REDIRECTS))
        computed_redirects: Dict[str, str] = getattr(app.env, ENV_COMPUTED_REDIRECTS)
        assert(len(computed_redirects) == 0)
        ext_env_updated(app, app.env)
        assert(hasattr(app.env, ENV_INTRA_PAGE_FRAGMENT_PAGES))
        intra_page_fragments: List[str] = getattr(app.env, ENV_INTRA_PAGE_FRAGMENT_PAGES)
        assert(len(intra_page_fragments) == 0)


class TestHtmlPageContext:
    def test_nominal(self, app):
        expected_templatename = "template.html"
        expected_fragment_redirects = 'const ' + CTX_FRAGMENT_REDIRECTS + ' = Object.freeze({"-":"bar"});'
        ext_setup(app)
        app.env.all_docs["foo"] = 0
        app.config[CONFIG_OPTION_REDIRECTS] = dict({"foo": "bar"})
        ext_builder_inited(app)
        ext_env_updated(app, app.env)
        ctx = dict()
        templatename = ext_html_page_context(app, "foo", "template.html", ctx, dict())
        assert(templatename == expected_templatename)
random
"""
Redirect tests
"""
from extensions.reredirects import (
    setup as ext_setup,
    builder_inited as ext_builder_inited,
    env_updated as ext_env_updated,
    html_page_context as ext_html_page_context,
    html_collect_pages as ext_html_collect_pages,
    compute_redirects as ext_compute_redirects,
    build_js_object as ext_build_js_object,
    CONFIG_OPTION_REDIRECTS,
    CONFIG_OPTION_TEMPLATE_FILE,
    CONFIG_MM_URL_PATH_PREFIX,
    CONFIG_WRITE_EXTENSIONLESS_PAGES,
    CTX_HAS_FRAGMENT_REDIRECTS,
    CTX_FRAGMENT_REDIRECTS,
    DEFAULT_PAGE,
    ENV_COMPUTED_REDIRECTS,
    ENV_REDIRECTS_ENABLED,
    ENV_INTRA_PAGE_FRAGMENT_PAGES
)
from typing import Dict, List


class TestSetup:
    def test_nominal(self, app):
        result = ext_setup(app)
        assert "parallel_read_safe" in result
        assert result["parallel_read_safe"]
        assert "parallel_write_safe" in result
        assert result["parallel_write_safe"]
        assert hasattr(app.config, CONFIG_OPTION_REDIRECTS)
        assert hasattr(app.config, CONFIG_OPTION_TEMPLATE_FILE)
        assert hasattr(app.config, CONFIG_MM_URL_PATH_PREFIX)
        assert hasattr(app.config, CONFIG_WRITE_EXTENSIONLESS_PAGES)


class TestBuilderInited:
    def test_nominal(self, app):
        ext_setup(app)
        app.config[CONFIG_OPTION_REDIRECTS] = dict({"foo": "bar"})
        ext_builder_inited(app)
        assert(hasattr(app.env, ENV_COMPUTED_REDIRECTS))
        computed_redirects: Dict[str, str] = getattr(app.env, ENV_COMPUTED_REDIRECTS)
        assert(len(computed_redirects) == 1)

    def test_no_config_value(self, app):
        ext_setup(app)
        app.config[CONFIG_OPTION_REDIRECTS] = None
        ext_builder_inited(app)
        assert(not getattr(app.env, ENV_REDIRECTS_ENABLED))
        assert(not hasattr(app.env, ENV_COMPUTED_REDIRECTS))

    def test_empty_config_value(self, app):
        ext_setup(app)
        app.config[CONFIG_OPTION_REDIRECTS] = dict()
        ext_builder_inited(app)
        assert(not getattr(app.env, ENV_REDIRECTS_ENABLED))
        assert(not hasattr(app.env, ENV_COMPUTED_REDIRECTS))


class TestEnvUpdated:
    def test_nominal(self, app):
        ext_setup(app)
        app.env.all_docs["foo"] = 0
        app.config[CONFIG_OPTION_REDIRECTS] = dict({"foo": "bar"})
        ext_builder_inited(app)
        ext_env_updated(app, app.env)
        assert(hasattr(app.env, ENV_INTRA_PAGE_FRAGMENT_PAGES))
        intra_page_fragments: List[str] = getattr(app.env, ENV_INTRA_PAGE_FRAGMENT_PAGES)
        assert(len(intra_page_fragments) == 1)
        assert(intra_page_fragments[0] == "foo")

    def test_redirects_disabled(self, app):
        ext_setup(app)
        app.config[CONFIG_OPTION_REDIRECTS] = None
        ext_builder_inited(app)
        ext_env_updated(app, app.env)
        assert(not hasattr(app.env, ENV_INTRA_PAGE_FRAGMENT_PAGES))

    def test_fragment_not_in_alldocs(self, app):
        ext_setup(app)
        app.env.all_docs["foo"] = 0
        app.config[CONFIG_OPTION_REDIRECTS] = dict({"narf": "fnord"})
        ext_builder_inited(app)
        ext_env_updated(app, app.env)
        assert(hasattr(app.env, ENV_INTRA_PAGE_FRAGMENT_PAGES))
        intra_page_fragments: List[str] = getattr(app.env, ENV_INTRA_PAGE_FRAGMENT_PAGES)
        assert(len(intra_page_fragments) == 0)

    def test_no_computed_redirects(self, app):
        ext_setup(app)
        app.env.all_docs["foo"] = 0
        app.config[CONFIG_OPTION_REDIRECTS] = dict({"": "fnord"})
        ext_builder_inited(app)
        assert(hasattr(app.env, ENV_COMPUTED_REDIRECTS))
        computed_redirects: Dict[str, str] = getattr(app.env, ENV_COMPUTED_REDIRECTS)
        assert(len(computed_redirects) == 0)
        ext_env_updated(app, app.env)
        assert(hasattr(app.env, ENV_INTRA_PAGE_FRAGMENT_PAGES))
        intra_page_fragments: List[str] = getattr(app.env, ENV_INTRA_PAGE_FRAGMENT_PAGES)
        assert(len(intra_page_fragments) == 0)


class TestHtmlPageContext:
    def test_nominal(self, app):
        expected_templatename = "template.html"
        expected_fragment_redirects = 'const ' + CTX_FRAGMENT_REDIRECTS + ' = Object.freeze({"-":"bar"});'
        ext_setup(app)
        app.env.all_docs["foo"] = 0
        app.config[CONFIG_OPTION_REDIRECTS] = dict({"foo": "bar"})
        ext_builder_inited(app)
        ext_env_updated(app, app.env)
        ctx = dict()
        templatename = ext_html_page_context(app, "foo", "template.html", ctx, dict())
        assert(templatename == expected_templatename)
        assert(len(ctx) == 2)
        assert(ctx[CTX_HAS_FRAGMENT_REDIRECTS])
        assert(ctx[CTX_FRAGMENT_REDIRECTS] == expected_fragment_redirects)

    def test_redirects_disabled(self, app):
        expected_templatename = "template.html"
        ext_setup(app)
        app.config[CONFIG_OPTION_REDIRECTS] = None
        ext_builder_inited(app)
        ext_env_updated(app, app.env)
        ctx = dict()
        templatename = ext_html_page_context(app, "foo", "template.html", ctx, dict())
        assert(templatename == expected_templatename)
        assert(len(ctx) == 0)

    def test_page_not_in_fragments(self, app):
        expected_templatename = "template.html"
        ext_setup(app)
        app.env.all_docs["foo"] = 0
        app.config[CONFIG_OPTION_REDIRECTS] = dict({"narf": "fnord"})
        ext_builder_inited(app)
        ext_env_updated(app, app.env)
        ctx = dict()
        templatename = ext_html_page_context(app, "foo", "template.html", ctx, dict())
        assert(templatename == expected_templatename)
        assert(len(ctx) == 1)
        assert(not ctx[CTX_HAS_FRAGMENT_REDIRECTS])


class TestHtmlCollectPages:
    def test_nominal_simple_redirect(self, app):
        expected_collected_page = ("foo", {"to_uri": "bar"}, "simpleredirect.html")
        ext_setup(app)
        app.env.all_docs["narf"] = 0
        app.config[CONFIG_OPTION_REDIRECTS] = dict({"foo": "bar"})
        ext_builder_inited(app)
        ext_env_updated(app, app.env)
        ctx = dict()
        ext_html_page_context(app, "foo", "template.html", ctx, dict())
        collected_pages = ext_html_collect_pages(app)
        assert(len(collected_pages) == 1)
        assert(collected_pages[0] == expected_collected_page)

    def test_nominal_redirect(self, app):
        expected_jsobject = 'const ' + CTX_FRAGMENT_REDIRECTS + ' = Object.freeze({"-":"bar","frag1":"bar#frag2"});'
        expected_collected_page = ("foo", {CTX_FRAGMENT_REDIRECTS: expected_jsobject}, "redirect.html")
        ext_setup(app)
        app.env.all_docs["bar"] = 0
        app.config[CONFIG_OPTION_REDIRECTS] = dict({
            "foo": "bar",
            "foo#frag1": "bar#frag2"
        })
        ext_builder_inited(app)
        ext_env_updated(app, app.env)
        ctx = dict()
        ext_html_page_context(app, "foo", "template.html", ctx, dict())
        collected_pages = ext_html_collect_pages(app)
        assert(len(collected_pages) == 1)
        assert(collected_pages[0] == expected_collected_page)


class TestComputeRedirects:
    def test_nominal(self, app):
        ext_setup(app)
        app.env.all_docs = {
            "foo": 0,
            "baz": 1,
            "fnord": 2,
            "qux": 3
        }
        redirects: Dict[str, str] = {
            "foo": "bar",
            "baz#frag1": "bar#frag1",
            "fnord#frag2": "fnord#frag3",
            "narf#frag4": "zot",
            "": "emptyredirect",
            "emptyredirect": "",
            "qux": "quux#frag5",
            "invalid#redirect#page": "should#not-work"
        }
        app.config[CONFIG_OPTION_REDIRECTS] = redirects
        expected_computed_redirects: Dict[str, Dict[str, str]] = {
            "foo": {
                DEFAULT_PAGE: "bar"
            },
            "baz": {
                "frag1": "bar#frag1"
            },
            "fnord": {
                "frag2": "fnord#frag3"
            },
            "narf": {
                "frag4": "zot"
            },
            "qux": {
                DEFAULT_PAGE: "quux#frag5"
            }
        }
        actual_computed_redirects = ext_compute_redirects(app, redirects)
        assert(actual_computed_redirects == expected_computed_redirects)


class TestBuildJSObject:
    def test_nominal(self, app):
        pagemap: Dict[str, str] = {
            DEFAULT_PAGE: "foo.html",
            "frag1": "foo2.html#frag2",
            "frag3": "#frag4"
        }
random
"""
Redirect tests
"""
from extensions.reredirects import (
    setup as ext_setup,
    builder_inited as ext_builder_inited,
    env_updated as ext_env_updated,
    html_page_context as ext_html_page_context,
    html_collect_pages as ext_html_collect_pages,
    compute_redirects as ext_compute_redirects,
    build_js_object as ext_build_js_object,
    CONFIG_OPTION_REDIRECTS,
    CONFIG_OPTION_TEMPLATE_FILE,
    CONFIG_MM_URL_PATH_PREFIX,
    CONFIG_WRITE_EXTENSIONLESS_PAGES,
    CTX_HAS_FRAGMENT_REDIRECTS,
    CTX_FRAGMENT_REDIRECTS,
    DEFAULT_PAGE,
    ENV_COMPUTED_REDIRECTS,
    ENV_REDIRECTS_ENABLED,
    ENV_INTRA_PAGE_FRAGMENT_PAGES
)
from typing import Dict, List


class TestSetup:
    def test_nominal(self, app):
        result = ext_setup(app)
        assert "parallel_read_safe" in result
        assert result["parallel_read_safe"]
        assert "parallel_write_safe" in result
        assert result["parallel_write_safe"]
        assert hasattr(app.config, CONFIG_OPTION_REDIRECTS)
        assert hasattr(app.config, CONFIG_OPTION_TEMPLATE_FILE)
random
    def test_redirects_disabled(self, app): class TestHtmlCollectPages:     setup as ext_setup, from typing import Dict, List         ext_env_updated(app, app.env)         assert(len(ctx) == 2)         expected_js_object = \         assert hasattr(app.config, CONFIG_MM_URL_PATH_PREFIX)